@prestyj/cli 5.28.0 → 5.29.0

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 (398) hide show
  1. package/README.md +2 -2
  2. package/assets/motion/THIRD-PARTY.md +14 -19
  3. package/assets/motion/bin/contact-sheet.mjs +9 -3
  4. package/assets/motion/bin/cues.mjs +337 -0
  5. package/assets/motion/bin/flash-check.mjs +314 -0
  6. package/assets/motion/bin/fonts.mjs +17 -13
  7. package/assets/motion/bin/library.mjs +61 -18
  8. package/assets/motion/bin/motion-blur.mjs +943 -0
  9. package/assets/motion/bin/motion-check.mjs +366 -9
  10. package/assets/motion/bin/music-fit.mjs +436 -0
  11. package/assets/motion/bin/pdf-extract.mjs +22 -10
  12. package/assets/motion/bin/reference-study.mjs +346 -0
  13. package/assets/motion/bin/score-synth.mjs +1052 -93
  14. package/assets/motion/fonts/finger-paint/OFL.txt +93 -0
  15. package/assets/motion/fonts/finger-paint/finger-paint-normal.woff2 +0 -0
  16. package/assets/motion/fonts/fonts.json +56 -0
  17. package/assets/motion/fonts/short-stack/OFL.txt +94 -0
  18. package/assets/motion/fonts/short-stack/short-stack-normal.woff2 +0 -0
  19. package/assets/motion/fonts/sora/OFL.txt +93 -0
  20. package/assets/motion/fonts/sora/sora-normal.woff2 +0 -0
  21. package/assets/motion/fonts/specimen.jpg +0 -0
  22. package/assets/motion/fonts/unbounded/OFL.txt +93 -0
  23. package/assets/motion/fonts/unbounded/unbounded-normal.woff2 +0 -0
  24. package/assets/motion/library/README.md +52 -14
  25. package/assets/motion/library/kit/moves.js +1981 -0
  26. package/assets/motion/library/library.json +232 -0
  27. package/assets/motion/library/pieces/camera-rig/meta.json +13 -0
  28. package/assets/motion/library/pieces/camera-rig/piece.html +153 -0
  29. package/assets/motion/library/pieces/camera-rig/preview.jpg +0 -0
  30. package/assets/motion/library/pieces/chain-knock/meta.json +13 -0
  31. package/assets/motion/library/pieces/chain-knock/piece.html +195 -0
  32. package/assets/motion/library/pieces/chain-knock/preview.jpg +0 -0
  33. package/assets/motion/library/pieces/gather-to-logo/meta.json +13 -0
  34. package/assets/motion/library/pieces/gather-to-logo/piece.html +159 -0
  35. package/assets/motion/library/pieces/gather-to-logo/preview.jpg +0 -0
  36. package/assets/motion/library/pieces/morph-carry/meta.json +13 -0
  37. package/assets/motion/library/pieces/morph-carry/piece.html +173 -0
  38. package/assets/motion/library/pieces/morph-carry/preview.jpg +0 -0
  39. package/assets/motion/library/pieces/one-shape-journey/meta.json +13 -0
  40. package/assets/motion/library/pieces/one-shape-journey/piece.html +195 -0
  41. package/assets/motion/library/pieces/one-shape-journey/preview.jpg +0 -0
  42. package/assets/motion/library/pieces/open-from-subject/meta.json +13 -0
  43. package/assets/motion/library/pieces/open-from-subject/piece.html +168 -0
  44. package/assets/motion/library/pieces/open-from-subject/preview.jpg +0 -0
  45. package/assets/motion/library/pieces/request-to-result/meta.json +13 -0
  46. package/assets/motion/library/pieces/request-to-result/piece.html +212 -0
  47. package/assets/motion/library/pieces/request-to-result/preview.jpg +0 -0
  48. package/assets/motion/library/pieces/scale-dive/meta.json +13 -0
  49. package/assets/motion/library/pieces/scale-dive/piece.html +321 -0
  50. package/assets/motion/library/pieces/scale-dive/preview.jpg +0 -0
  51. package/assets/motion/library/pieces/screen-replica-steps/meta.json +13 -0
  52. package/assets/motion/library/pieces/screen-replica-steps/piece.html +366 -0
  53. package/assets/motion/library/pieces/screen-replica-steps/preview.jpg +0 -0
  54. package/assets/motion/library/pieces/zoom-into-card/meta.json +13 -0
  55. package/assets/motion/library/pieces/zoom-into-card/piece.html +179 -0
  56. package/assets/motion/library/pieces/zoom-into-card/preview.jpg +0 -0
  57. package/assets/motion/library/sheets/diagram.jpg +0 -0
  58. package/assets/motion/library/sheets/frame.jpg +0 -0
  59. package/assets/motion/library/sheets/transition.jpg +0 -0
  60. package/assets/motion/library/sheets/ui.jpg +0 -0
  61. package/assets/motion/plugin.json +1 -1
  62. package/assets/motion/references/build-sheet.md +206 -0
  63. package/assets/motion/references/runtime/determinism-rules.md +3 -3
  64. package/assets/motion/references/runtime/gsap-easing-and-stagger.md +28 -28
  65. package/assets/motion/references/runtime/gsap.md +3 -3
  66. package/assets/motion/references/runtime/inputs-and-assets.md +21 -16
  67. package/assets/motion/references/runtime/lint-validate-inspect.md +3 -3
  68. package/assets/motion/references/runtime/minimal-composition.md +6 -0
  69. package/assets/motion/references/runtime/preview-render.md +3 -3
  70. package/assets/motion/skills/app-walkthrough/SKILL.md +66 -0
  71. package/assets/motion/skills/before-after/SKILL.md +53 -0
  72. package/assets/motion/skills/brand-kit/SKILL.md +17 -16
  73. package/assets/motion/skills/dev-tool-video/SKILL.md +57 -0
  74. package/assets/motion/skills/launch-video/SKILL.md +62 -0
  75. package/assets/motion/skills/match-reference/SKILL.md +58 -0
  76. package/assets/motion/skills/motion/SKILL.md +167 -98
  77. package/assets/motion/skills/source-ingest/SKILL.md +23 -15
  78. package/assets/motion/skills/website-video/SKILL.md +59 -0
  79. package/assets/skills/bulletproof/SKILL.md +36 -11
  80. package/assets/skills/bulletproof/references/agent-surface.md +19 -9
  81. package/assets/skills/bulletproof/references/audit-protocol.md +20 -5
  82. package/assets/skills/bulletproof/references/platform-playbooks.md +5 -4
  83. package/assets/skills/bulletproof/references/provenance.md +26 -1
  84. package/assets/skills/bulletproof/references/secure-defaults.md +6 -5
  85. package/assets/skills/bulletproof/references/supply-chain.md +21 -17
  86. package/assets/skills/bulletproof/references/threat-landscape.md +28 -26
  87. package/assets/skills/bulletproof/references/verification.md +2 -0
  88. package/assets/skills/clarify/SKILL.md +25 -16
  89. package/assets/skills/code-review/SKILL.md +71 -13
  90. package/assets/skills/code-review/references/agent-diffs.md +27 -0
  91. package/assets/skills/code-review/references/tests.md +19 -0
  92. package/assets/skills/compliance-guard/SKILL.md +20 -5
  93. package/assets/skills/compliance-guard/references/artifacts.md +1 -1
  94. package/assets/skills/compliance-guard/references/eu-uk.md +16 -16
  95. package/assets/skills/compliance-guard/references/lawsuit-vectors.md +5 -5
  96. package/assets/skills/compliance-guard/references/provenance.md +41 -2
  97. package/assets/skills/compliance-guard/references/sector-gates.md +3 -3
  98. package/assets/skills/compliance-guard/references/security-baseline.md +2 -2
  99. package/assets/skills/compliance-guard/references/trigger-map.md +5 -5
  100. package/assets/skills/compliance-guard/references/us.md +27 -21
  101. package/assets/skills/durable/SKILL.md +87 -79
  102. package/assets/skills/durable/references/agent-db-safety.md +69 -0
  103. package/assets/skills/durable/references/backups-and-runtime.md +19 -12
  104. package/assets/skills/durable/references/migrations-and-schema.md +13 -6
  105. package/assets/skills/evidence-led-ui/SKILL.md +69 -127
  106. package/assets/skills/evidence-led-ui/references/anti-defaults.md +107 -208
  107. package/assets/skills/evidence-led-ui/references/direction.md +124 -0
  108. package/assets/skills/evidence-led-ui/references/production-contract.md +8 -0
  109. package/assets/skills/evidence-led-ui/references/provenance.md +24 -1
  110. package/assets/skills/lean/SKILL.md +90 -71
  111. package/assets/skills/lean/references/memory-and-processes.md +3 -2
  112. package/assets/skills/lean/references/playbooks.md +37 -12
  113. package/assets/skills/refactoring/SKILL.md +24 -3
  114. package/assets/skills/refactoring/references/agent-pitfalls.md +4 -1
  115. package/assets/skills/refactoring/references/legacy.md +21 -0
  116. package/assets/skills/root-cause/SKILL.md +20 -10
  117. package/assets/skills/shared-language/SKILL.md +16 -14
  118. package/assets/skills/tdd/SKILL.md +27 -15
  119. package/dist/app-sidecar.js +203 -47
  120. package/dist/app-sidecar.js.map +1 -1
  121. package/dist/cli.js +20 -28
  122. package/dist/cli.js.map +1 -1
  123. package/dist/core/acceptance-checks.d.ts +48 -0
  124. package/dist/core/acceptance-checks.js +144 -0
  125. package/dist/core/acceptance-checks.js.map +1 -0
  126. package/dist/core/agent-session.d.ts +119 -75
  127. package/dist/core/agent-session.js +561 -395
  128. package/dist/core/agent-session.js.map +1 -1
  129. package/dist/core/agents.d.ts +6 -5
  130. package/dist/core/agents.js +12 -3
  131. package/dist/core/agents.js.map +1 -1
  132. package/dist/core/ask-user.d.ts +90 -8
  133. package/dist/core/ask-user.js +124 -13
  134. package/dist/core/ask-user.js.map +1 -1
  135. package/dist/core/auth-providers.js +1 -1
  136. package/dist/core/auth-providers.js.map +1 -1
  137. package/dist/core/autopilot-verdict.d.ts +5 -1
  138. package/dist/core/autopilot-verdict.js +30 -13
  139. package/dist/core/autopilot-verdict.js.map +1 -1
  140. package/dist/core/bundled-agents.js +1 -3
  141. package/dist/core/bundled-agents.js.map +1 -1
  142. package/dist/core/cache-diagnostics.d.ts +68 -0
  143. package/dist/core/cache-diagnostics.js +196 -0
  144. package/dist/core/cache-diagnostics.js.map +1 -0
  145. package/dist/core/cache-expiry.d.ts +87 -0
  146. package/dist/core/cache-expiry.js +111 -0
  147. package/dist/core/cache-expiry.js.map +1 -0
  148. package/dist/core/compaction/compactor.js +78 -48
  149. package/dist/core/compaction/compactor.js.map +1 -1
  150. package/dist/core/compaction/plan-step-policy.d.ts +46 -0
  151. package/dist/core/compaction/plan-step-policy.js +57 -0
  152. package/dist/core/compaction/plan-step-policy.js.map +1 -0
  153. package/dist/core/destructive-git-guard.d.ts +90 -0
  154. package/dist/core/destructive-git-guard.js +871 -0
  155. package/dist/core/destructive-git-guard.js.map +1 -0
  156. package/dist/core/event-bus.d.ts +3 -0
  157. package/dist/core/event-bus.js +5 -0
  158. package/dist/core/event-bus.js.map +1 -1
  159. package/dist/core/fast-apply-benchmark.d.ts +1 -1
  160. package/dist/core/fast-apply-benchmark.js +2 -2
  161. package/dist/core/fast-apply-benchmark.js.map +1 -1
  162. package/dist/core/injection-detect.d.ts +38 -0
  163. package/dist/core/injection-detect.js +232 -0
  164. package/dist/core/injection-detect.js.map +1 -0
  165. package/dist/core/keep-awake.d.ts +88 -0
  166. package/dist/core/keep-awake.js +251 -0
  167. package/dist/core/keep-awake.js.map +1 -0
  168. package/dist/core/mcp/client.d.ts +72 -0
  169. package/dist/core/mcp/client.js +264 -41
  170. package/dist/core/mcp/client.js.map +1 -1
  171. package/dist/core/mcp/content.js +6 -2
  172. package/dist/core/mcp/content.js.map +1 -1
  173. package/dist/core/mcp/store.d.ts +6 -1
  174. package/dist/core/mcp/store.js +12 -1
  175. package/dist/core/mcp/store.js.map +1 -1
  176. package/dist/core/mcp/types.d.ts +18 -0
  177. package/dist/core/model-unavailable.d.ts +14 -0
  178. package/dist/core/model-unavailable.js +23 -0
  179. package/dist/core/model-unavailable.js.map +1 -0
  180. package/dist/core/node-debugger.d.ts +148 -0
  181. package/dist/core/node-debugger.js +642 -0
  182. package/dist/core/node-debugger.js.map +1 -0
  183. package/dist/core/nolan-context.d.ts +7 -5
  184. package/dist/core/nolan-context.js +106 -16
  185. package/dist/core/nolan-context.js.map +1 -1
  186. package/dist/core/nolan-prompt.js +24 -21
  187. package/dist/core/nolan-prompt.js.map +1 -1
  188. package/dist/core/package-threats.d.ts +18 -0
  189. package/dist/core/package-threats.js +168 -0
  190. package/dist/core/package-threats.js.map +1 -0
  191. package/dist/core/persistent-shell.d.ts +58 -6
  192. package/dist/core/persistent-shell.js +331 -49
  193. package/dist/core/persistent-shell.js.map +1 -1
  194. package/dist/core/process-manager.d.ts +14 -0
  195. package/dist/core/process-manager.js +61 -0
  196. package/dist/core/process-manager.js.map +1 -1
  197. package/dist/core/progress/git-xp.js +8 -14
  198. package/dist/core/progress/git-xp.js.map +1 -1
  199. package/dist/core/project-discovery.js +77 -26
  200. package/dist/core/project-discovery.js.map +1 -1
  201. package/dist/core/semantic-search-benchmark.d.ts +1 -1
  202. package/dist/core/semantic-search-benchmark.js +2 -2
  203. package/dist/core/semantic-search-benchmark.js.map +1 -1
  204. package/dist/core/session-history.d.ts +12 -0
  205. package/dist/core/session-history.js +27 -0
  206. package/dist/core/session-history.js.map +1 -1
  207. package/dist/core/session-manager.d.ts +13 -1
  208. package/dist/core/session-manager.js +38 -18
  209. package/dist/core/session-manager.js.map +1 -1
  210. package/dist/core/session-summary-index.d.ts +37 -0
  211. package/dist/core/session-summary-index.js +172 -0
  212. package/dist/core/session-summary-index.js.map +1 -0
  213. package/dist/core/settings-manager.d.ts +2 -0
  214. package/dist/core/settings-manager.js +10 -0
  215. package/dist/core/settings-manager.js.map +1 -1
  216. package/dist/core/shell-threats-popular-packages.d.ts +11 -0
  217. package/dist/core/shell-threats-popular-packages.js +675 -0
  218. package/dist/core/shell-threats-popular-packages.js.map +1 -0
  219. package/dist/core/shell-threats.d.ts +8 -0
  220. package/dist/core/shell-threats.js +186 -0
  221. package/dist/core/shell-threats.js.map +1 -0
  222. package/dist/core/skills.js +16 -4
  223. package/dist/core/skills.js.map +1 -1
  224. package/dist/core/stream-rules.d.ts +30 -0
  225. package/dist/core/stream-rules.js +151 -0
  226. package/dist/core/stream-rules.js.map +1 -0
  227. package/dist/core/subagent-manager.d.ts +23 -6
  228. package/dist/core/subagent-manager.js +25 -9
  229. package/dist/core/subagent-manager.js.map +1 -1
  230. package/dist/core/subagent-policy.js +1 -1
  231. package/dist/core/subagent-policy.js.map +1 -1
  232. package/dist/core/subagent-receipt.d.ts +54 -0
  233. package/dist/core/subagent-receipt.js +276 -0
  234. package/dist/core/subagent-receipt.js.map +1 -0
  235. package/dist/core/subagent-turn-record.d.ts +2 -0
  236. package/dist/core/subagent-turn-record.js.map +1 -1
  237. package/dist/core/test-impact.d.ts +73 -0
  238. package/dist/core/test-impact.js +467 -0
  239. package/dist/core/test-impact.js.map +1 -0
  240. package/dist/core/thinking-level.d.ts +1 -1
  241. package/dist/core/thinking-level.js +1 -1
  242. package/dist/core/thinking-level.js.map +1 -1
  243. package/dist/core/verification-gate.d.ts +2 -0
  244. package/dist/core/verification-gate.js +4 -0
  245. package/dist/core/verification-gate.js.map +1 -1
  246. package/dist/core/verification-snapshot.js +3 -5
  247. package/dist/core/verification-snapshot.js.map +1 -1
  248. package/dist/core/workspace-guard.d.ts +18 -7
  249. package/dist/core/workspace-guard.js +227 -60
  250. package/dist/core/workspace-guard.js.map +1 -1
  251. package/dist/core/worktree-setup.d.ts +23 -0
  252. package/dist/core/worktree-setup.js +128 -9
  253. package/dist/core/worktree-setup.js.map +1 -1
  254. package/dist/core/worktree.d.ts +20 -2
  255. package/dist/core/worktree.js +74 -31
  256. package/dist/core/worktree.js.map +1 -1
  257. package/dist/interactive.js +2 -1
  258. package/dist/interactive.js.map +1 -1
  259. package/dist/modes/json-mode.js +11 -2
  260. package/dist/modes/json-mode.js.map +1 -1
  261. package/dist/modes/subagent-worker-mode.d.ts +36 -1
  262. package/dist/modes/subagent-worker-mode.js +100 -42
  263. package/dist/modes/subagent-worker-mode.js.map +1 -1
  264. package/dist/motion-agent/motion-agent.d.ts +7 -3
  265. package/dist/motion-agent/motion-agent.js +6 -8
  266. package/dist/motion-agent/motion-agent.js.map +1 -1
  267. package/dist/motion-agent/motion-prompt.d.ts +1 -1
  268. package/dist/motion-agent/motion-prompt.js +16 -25
  269. package/dist/motion-agent/motion-prompt.js.map +1 -1
  270. package/dist/motion-agent/motion-review-session.js +1 -1
  271. package/dist/motion-agent/motion-review-session.js.map +1 -1
  272. package/dist/motion-agent/motion-review.d.ts +10 -3
  273. package/dist/motion-agent/motion-review.js +15 -7
  274. package/dist/motion-agent/motion-review.js.map +1 -1
  275. package/dist/motion-agent/motion-studio-context.js +1 -1
  276. package/dist/motion-agent/motion-studio-context.js.map +1 -1
  277. package/dist/system-prompt.d.ts +2 -1
  278. package/dist/system-prompt.js +15 -4
  279. package/dist/system-prompt.js.map +1 -1
  280. package/dist/test-support/keep-alive.d.ts +14 -0
  281. package/dist/test-support/keep-alive.js +17 -0
  282. package/dist/test-support/keep-alive.js.map +1 -0
  283. package/dist/tools/ask-user.js +3 -3
  284. package/dist/tools/ask-user.js.map +1 -1
  285. package/dist/tools/bash-read-evidence.d.ts +10 -0
  286. package/dist/tools/bash-read-evidence.js +133 -0
  287. package/dist/tools/bash-read-evidence.js.map +1 -0
  288. package/dist/tools/bash.d.ts +10 -1
  289. package/dist/tools/bash.js +179 -7
  290. package/dist/tools/bash.js.map +1 -1
  291. package/dist/tools/debug.d.ts +54 -0
  292. package/dist/tools/debug.js +233 -0
  293. package/dist/tools/debug.js.map +1 -0
  294. package/dist/tools/edit.js +13 -5
  295. package/dist/tools/edit.js.map +1 -1
  296. package/dist/tools/goals.d.ts +1 -1
  297. package/dist/tools/index.d.ts +25 -2
  298. package/dist/tools/index.js +48 -7
  299. package/dist/tools/index.js.map +1 -1
  300. package/dist/tools/prompt-hints.js +2 -0
  301. package/dist/tools/prompt-hints.js.map +1 -1
  302. package/dist/tools/read-tracker.d.ts +35 -2
  303. package/dist/tools/read-tracker.js +108 -11
  304. package/dist/tools/read-tracker.js.map +1 -1
  305. package/dist/tools/read.js +39 -7
  306. package/dist/tools/read.js.map +1 -1
  307. package/dist/tools/skill.js +5 -0
  308. package/dist/tools/skill.js.map +1 -1
  309. package/dist/tools/subagent-control.js +44 -8
  310. package/dist/tools/subagent-control.js.map +1 -1
  311. package/dist/tools/subagent-shared.d.ts +48 -8
  312. package/dist/tools/subagent-shared.js +75 -14
  313. package/dist/tools/subagent-shared.js.map +1 -1
  314. package/dist/tools/subagent.d.ts +8 -2
  315. package/dist/tools/subagent.js +28 -10
  316. package/dist/tools/subagent.js.map +1 -1
  317. package/dist/tools/task-output.js +3 -2
  318. package/dist/tools/task-output.js.map +1 -1
  319. package/dist/tools/task-send.d.ts +1 -1
  320. package/dist/tools/task-send.js +15 -1
  321. package/dist/tools/task-send.js.map +1 -1
  322. package/dist/tools/tool-tiers.d.ts +2 -2
  323. package/dist/tools/tool-tiers.js +3 -2
  324. package/dist/tools/tool-tiers.js.map +1 -1
  325. package/dist/tools/truncate.d.ts +21 -0
  326. package/dist/tools/truncate.js +187 -0
  327. package/dist/tools/truncate.js.map +1 -1
  328. package/dist/tools/ui-adopt.js +2 -0
  329. package/dist/tools/ui-adopt.js.map +1 -1
  330. package/dist/tools/write.js +4 -3
  331. package/dist/tools/write.js.map +1 -1
  332. package/dist/ui/App.d.ts +0 -4
  333. package/dist/ui/App.js +5 -28
  334. package/dist/ui/App.js.map +1 -1
  335. package/dist/ui/components/ActivityIndicator.js +1 -0
  336. package/dist/ui/components/ActivityIndicator.js.map +1 -1
  337. package/dist/ui/components/Footer.js +1 -1
  338. package/dist/ui/components/Footer.js.map +1 -1
  339. package/dist/ui/hooks/useAgentLoop.d.ts +1 -8
  340. package/dist/ui/hooks/useAgentLoop.js +1 -119
  341. package/dist/ui/hooks/useAgentLoop.js.map +1 -1
  342. package/dist/ui/render.d.ts +2 -4
  343. package/dist/ui/render.js +3 -2
  344. package/dist/ui/render.js.map +1 -1
  345. package/dist/utils/git.d.ts +77 -0
  346. package/dist/utils/git.js +285 -21
  347. package/dist/utils/git.js.map +1 -1
  348. package/dist/utils/github-ci.js +2 -1
  349. package/dist/utils/github-ci.js.map +1 -1
  350. package/dist/utils/github.js +11 -9
  351. package/dist/utils/github.js.map +1 -1
  352. package/dist/utils/image.d.ts +14 -0
  353. package/dist/utils/image.js +16 -0
  354. package/dist/utils/image.js.map +1 -1
  355. package/dist/utils/process.d.ts +20 -0
  356. package/dist/utils/process.js +98 -0
  357. package/dist/utils/process.js.map +1 -1
  358. package/dist/utils/text.d.ts +12 -0
  359. package/dist/utils/text.js +11 -0
  360. package/dist/utils/text.js.map +1 -1
  361. package/package.json +6 -6
  362. package/assets/motion/skills/mixkit-split-text-617/SKILL.md +0 -115
  363. package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-480.json +0 -1
  364. package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-494.json +0 -1
  365. package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-5.json +0 -1
  366. package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-508.json +0 -1
  367. package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-6525.json +0 -1
  368. package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-6539.json +0 -1
  369. package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-6647.json +0 -1
  370. package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-6663.json +0 -1
  371. package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-6677.json +0 -1
  372. package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-6691.json +0 -1
  373. package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-6706.json +0 -1
  374. package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-6722.json +0 -1
  375. package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-6736.json +0 -1
  376. package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-6750.json +0 -1
  377. package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-6764.json +0 -1
  378. package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-6780.json +0 -1
  379. package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-6794.json +0 -1
  380. package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-6810.json +0 -1
  381. package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-6823.json +0 -1
  382. package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-6872.json +0 -1
  383. package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-6936.json +0 -1
  384. package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-76.json +0 -1
  385. package/assets/motion/skills/mixkit-split-text-617/data/manifest.json +0 -495
  386. package/assets/motion/skills/mixkit-split-text-617/references/RECONSTRUCTION.md +0 -201
  387. package/assets/motion/skills/mixkit-split-text-617/references/VERIFICATION.md +0 -107
  388. package/assets/motion/skills/mixkit-split-text-617/tools/inspect_motion.py +0 -130
  389. package/assets/motion/skills/video-qa/SKILL.md +0 -66
  390. package/dist/core/ideal-review-subagent.d.ts +0 -42
  391. package/dist/core/ideal-review-subagent.js +0 -95
  392. package/dist/core/ideal-review-subagent.js.map +0 -1
  393. package/dist/core/ideal-review.d.ts +0 -82
  394. package/dist/core/ideal-review.js +0 -242
  395. package/dist/core/ideal-review.js.map +0 -1
  396. package/dist/motion-agent/motion-check-tool.d.ts +0 -21
  397. package/dist/motion-agent/motion-check-tool.js +0 -206
  398. package/dist/motion-agent/motion-check-tool.js.map +0 -1
@@ -1,107 +0,0 @@
1
- # Evidence, uncertainty and acceptance
2
-
3
- ## What is verified already
4
-
5
- The user's AEP was parsed using `forticheprod/py-aep` at commit
6
- `e12a451c35bacd3f34a080090265f9370e66162b`. All 194 fetched parser source files
7
- were checked against that commit's Git blob hashes. The exporter reported
8
- zero field/serialization errors. Repeating extraction returned the same
9
- content except elapsed time. No expressions were evaluated.
10
-
11
- The skill's JSON composition files preserve the full exported records,
12
- including numeric values and flags marking parser-synthesized defaults.
13
- They are not a handwritten approximation or a newly designed timeline.
14
- `data/manifest.json` records their SHA-256 hashes and source AEP fingerprint.
15
-
16
- Source counts:
17
- - 22 compositions, 99 layers.
18
- - 1,875 leaf properties backed by non-synthetic binary chunks.
19
- - 17,795 parser-synthesized leaf properties. Do not call those authored values.
20
- - Exported animation-key counts can duplicate separated Position data; do not
21
- describe every exported key entry as a distinct authored keyframe.
22
-
23
- ### Opening-reveal spot-check
24
-
25
- The first scene's matte-height Bezier was independently evaluated from its
26
- exported times, values, speeds and influences, without the parser's interpolator.
27
- At ten timestamps the height was compared with a brightness-based edge
28
- measurement of the real 640×360 Mixkit preview. Maximum absolute difference:
29
- **1.728 pixels**. Actual preview frame timestamps were checked with ffprobe.
30
- All samples are preserved in the manifest.
31
-
32
- This is a **limited numeric spot-check**, not a full render comparison.
33
- It is affected by compression and thresholded edge measurement. It does not
34
- validate text animators, all scenes, all effects or the complete choreography.
35
-
36
- ## What is not verified
37
-
38
- - No whole-video reconstruction has been generated or compared.
39
- - No export/render inside After Effects has independently checked the full
40
- parser output. The parser is a reverse-engineered implementation, not AE.
41
- - Per-letter selector weighting, randomized order, font layout and combination
42
- of text animators have not been reproduced and checked in another renderer.
43
- - Fast Blur, stroke/outline rendering and other compositing semantics may differ
44
- from apparently similar browser/Canvas/SVG effects.
45
- - Original footage is absent and intentionally replaceable. Font substitution
46
- is allowed. Neither asset substitution validates the surrounding motion.
47
- - No reference audio was supplied. No sound timing was extracted.
48
-
49
- A future agent must not turn "all data files passed integrity checks" into
50
- "the video is visually verified."
51
-
52
- ## Acceptance procedure after a reconstruction exists
53
-
54
- 1. **Validate the data package.**
55
- Run `python3 "<skill-root>/tools/inspect_motion.py" verify`. This only validates
56
- bundled hashes, counts and links; it does not render anything.
57
- 2. **Record the implementation mapping.**
58
- For every used source composition/layer, record the target object and where
59
- its keyed properties, selectors, effects, matte, stack and clock are handled.
60
- Mark every unsupported or approximate semantic explicitly. Do not invent a
61
- coverage percentage from raw property counts (most exposed defaults are unused).
62
- 3. **Check actual technical output.**
63
- Confirm 1920×1080, 30 fps, 361 frames, complete layer/media/font loading,
64
- deterministic seeking, no render errors and no substituted silent fallbacks.
65
- In EZ Motion, retain the existing HyperFrames validation and completion review.
66
- 4. **Check source timing, not only screenshots.**
67
- Sample exact keys and intermediate times, including steep Bezier sections,
68
- HOLD boundaries, negative-start echoes, overlapping scenes and stretched
69
- decorative instances. The source video's ~59.94 fps and the project's 30 fps
70
- are different: compare by seconds, not matching frame indices.
71
- 5. **Compare the entire sequence in motion.**
72
- Cover at least 0–2.2 s, 2.1–4.8 s, 4.7–7.2 s, 7.0–9.7 s and 9.4 s through
73
- the end. These overlapping review windows are for inspection, not new cuts.
74
- Compare reveal dimensions, zoom timing, directions, silhouettes, overlaps,
75
- outline echo spacing and final settling/hold. A contact sheet alone is not
76
- playback evidence. Report if the available tooling only inspected frames.
77
- 6. **Separate content differences from motion differences.**
78
- A different person/image or changed glyph silhouette is expected. A different
79
- reveal axis, easing shape, stagger rule, outline-copy count, scene overlap or
80
- duration is a reconstruction defect unless the user explicitly requested it.
81
- A raw pixel-diff score with different content is not a useful fidelity verdict.
82
- 7. **Resolve or disclose failures.**
83
- Fix concrete mismatches from the source data and recheck the affected interval.
84
- When semantics cannot be reproduced/validated, deliver an honestly labelled
85
- draft with the exact unresolved layer/interval. Do not replace it with a
86
- stylistically similar effect and claim fidelity.
87
-
88
- Reference page:
89
- https://mixkit.co/free-after-effects-templates/split-text-intro-617/
90
-
91
- Known public preview URL (availability may change):
92
- https://assets.mixkit.co/video-templates/617/mixkit-617-360.mp4
93
-
94
- No reference video is bundled. Use the user's supplied/cached reference or an
95
- otherwise authorized source through the host's normal media workflow. Access
96
- failure does not authorize bypassing a site's restrictions.
97
-
98
- ## Reporting language
99
-
100
- - **Source-grounded:** implemented from the recorded values and mechanisms.
101
- - **Integrity checked:** data/hash/link checks passed, not visual verification.
102
- - **Partially verified:** identify the actual tested intervals/mechanisms.
103
- - **Visually compared:** state what was watched or which frames were inspected;
104
- list remaining deviations. Do not imply human approval or pixel identity.
105
-
106
- This skill currently has source data and limited extraction evidence. It is
107
- not a certificate of rendering correctness and should not claim otherwise.
@@ -1,130 +0,0 @@
1
- """Read the bundled animation evidence without loading it all into an agent's context.
2
- Python standard library only. No writes, network, dependency loading, or rendering.
3
- """
4
- import argparse
5
- import hashlib
6
- import json
7
- from pathlib import Path
8
- import sys
9
-
10
-
11
- def load_manifest(root: Path) -> dict:
12
- path = root / 'data' / 'manifest.json'
13
- if path.stat().st_size > 65536:
14
- raise ValueError('Manifest exceeds 64 KiB')
15
- data = json.loads(path.read_text(encoding='utf-8'))
16
- if data.get('schema_version') != 1 or not isinstance(data.get('compositions'), list):
17
- raise ValueError('Unsupported manifest')
18
- return data
19
-
20
-
21
- def load_comp(root: Path, manifest: dict, comp_id: int) -> dict:
22
- entry = next((c for c in manifest['compositions'] if c['id'] == comp_id), None)
23
- if entry is None:
24
- raise ValueError(f'Unknown composition ID: {comp_id}')
25
- path = (root / 'data' / 'compositions' / f'comp-{comp_id}.json').resolve()
26
- if not path.is_relative_to(root) or path.stat().st_size > 8 * 1024 * 1024:
27
- raise ValueError('Composition path or size is not allowed')
28
- raw = path.read_bytes()
29
- if hashlib.sha256(raw).hexdigest() != entry['sha256']:
30
- raise ValueError(f'Composition {comp_id} failed its integrity check')
31
- comp = json.loads(raw)
32
- if comp['id'] != comp_id or len(comp['layers']) != entry['layer_count']:
33
- raise ValueError('Composition identity/count mismatch')
34
- return comp
35
-
36
-
37
- def walk(nodes: list, ancestors: tuple = (), depth: int = 0):
38
- if depth > 32:
39
- raise ValueError('Property nesting exceeds the inspection limit')
40
- for ordinal, node in enumerate(nodes):
41
- path = ancestors + (f"{ordinal}:{node['match_name']} ({node['name']})",)
42
- yield path, node
43
- yield from walk(node.get('children', []), path, depth + 1)
44
-
45
-
46
- def layer_summary(layer: dict) -> dict:
47
- return {k: v for k, v in layer.items() if k != 'properties'}
48
-
49
-
50
- def verify(root: Path, manifest: dict) -> dict:
51
- comps = [load_comp(root, manifest, c['id']) for c in manifest['compositions']]
52
- ids = {c['id'] for c in comps}
53
- if len(ids) != len(comps):
54
- raise ValueError('Duplicate composition IDs')
55
- totals = {'compositions': len(comps), 'layers': 0, 'stored_properties': 0, 'synthetic_properties': 0}
56
- for comp in comps:
57
- layer_ids = {l['id'] for l in comp['layers']}
58
- if len(layer_ids) != len(comp['layers']):
59
- raise ValueError('Duplicate layer IDs')
60
- totals['layers'] += len(comp['layers'])
61
- for layer in comp['layers']:
62
- source = layer.get('source')
63
- if source and source['type'] == 'CompItem' and source['id'] not in ids:
64
- raise ValueError('Missing source composition')
65
- for link in ('parent', 'track_matte_layer'):
66
- ref = layer.get(link)
67
- if ref and ref['id'] not in layer_ids:
68
- raise ValueError(f'Missing linked layer: {link}')
69
- for _, prop in walk(layer['properties']):
70
- if 'binary_chunk_synthetic' in prop:
71
- key = 'synthetic_properties' if prop['binary_chunk_synthetic'] else 'stored_properties'
72
- totals[key] += 1
73
- for key, actual in totals.items():
74
- if actual != manifest['expected_counts'][key]:
75
- raise ValueError(f'Evidence count mismatch: {key}')
76
- return {'integrity': 'PASS', 'counts': totals, 'full_video_reconstruction_verified': False}
77
-
78
-
79
- def main() -> int:
80
- parser = argparse.ArgumentParser(description=__doc__)
81
- sub = parser.add_subparsers(dest='command', required=True)
82
- sub.add_parser('list', help='List compositions, dynamic slots and evidence scope')
83
- sub.add_parser('verify', help='Check data integrity and links; does not render or validate motion')
84
- for name in ('layers', 'keys'):
85
- p = sub.add_parser(name)
86
- p.add_argument('composition', type=int)
87
- prop_parser = sub.add_parser('property')
88
- prop_parser.add_argument('composition', type=int)
89
- prop_parser.add_argument('layer', type=int)
90
- prop_parser.add_argument('match_name')
91
- prop_parser.add_argument('--include-defaults', action='store_true', help='Also show explicitly labelled parser-synthesized defaults')
92
- args = parser.parse_args()
93
- root = Path(__file__).resolve().parents[1]
94
- try:
95
- manifest = load_manifest(root)
96
- if args.command == 'list':
97
- result = manifest
98
- elif args.command == 'verify':
99
- result = verify(root, manifest)
100
- else:
101
- comp = load_comp(root, manifest, args.composition)
102
- if args.command == 'layers':
103
- result = {k: v for k, v in comp.items() if k != 'layers'}
104
- result['layers'] = [layer_summary(l) for l in comp['layers']]
105
- else:
106
- matches = []
107
- if args.command == 'property' and not any(l['id'] == args.layer for l in comp['layers']):
108
- raise ValueError(f'Unknown layer ID: {args.layer}')
109
- for layer in comp['layers']:
110
- if args.command == 'property' and layer['id'] != args.layer:
111
- continue
112
- for path, prop in walk(layer['properties']):
113
- if args.command == 'property':
114
- selected = prop['match_name'] == args.match_name and (args.include_defaults or not prop.get('binary_chunk_synthetic', False))
115
- else:
116
- selected = bool(prop.get('keyframes')) and prop['match_name'] != 'ADBE Marker'
117
- if selected:
118
- matches.append({'layer_id': layer['id'], 'layer_name': layer['name'], 'indexed_path': list(path), 'property': prop})
119
- if args.command == 'property' and not matches:
120
- raise ValueError('No stored property matched that exact name; use --include-defaults to inspect labelled parser defaults')
121
- result = matches
122
- print(json.dumps(result, indent=2, ensure_ascii=False, allow_nan=False))
123
- return 0
124
- except (OSError, ValueError, KeyError, TypeError) as exc:
125
- print(f'Inspection failed: {exc}', file=sys.stderr)
126
- return 1
127
-
128
-
129
- if __name__ == '__main__':
130
- raise SystemExit(main())
@@ -1,66 +0,0 @@
1
- ---
2
- name: video-qa
3
- description: One output-checking pass for a rendered template or motion component. Use motion_check for technical checks and rendered images, inspect them in this session, fix concrete defects and deliver. No independent AI reviewer or creative approval ceremony.
4
- ---
5
-
6
- # Check the actual output once
7
-
8
- Judge adherence to the selected recipe and approved input changes, not an alternative creative direction. A template owns its full sequence; a component owns its local motion. Neither is an invitation to add effects, retime choreography or redesign locked layouts.
9
-
10
- ## 1. Check the current export
11
-
12
- Call `motion_check` with:
13
-
14
- - `project`: the current HyperFrames project folder.
15
- - `output`: the actual rendered MP4, inside the workspace.
16
- - `windows`: representative motion/transition windows, each with `label`, `start` and `end` in seconds. Use the recipe's timings; each window spans at least two frames and at most ten seconds, up to twelve windows.
17
- - `holds`: only when the recipe includes intentional static holds, the path to its render-bound hold plan (format below).
18
- - `slideshowRequested`: true only when the user actually requested a slideshow; never use it to hide broken motion.
19
- - `range`: only for an export longer than 180 seconds or a targeted diagnostic, a start/end range of at most 180 seconds. Report the inspected range honestly; do not claim full-video visual coverage.
20
-
21
- The tool runs HyperFrames `check` (which already includes lint), decoded-pixel analysis with `motion-check.mjs` including canvas/WebGL, and audio analysis only when audio exists. It returns technical results and actual rendered overview, phone-size and consecutive-frame images **to you**, the working agent.
22
-
23
- Do not precede or follow it with another lint/check/audio/frame-extraction checklist. Do not call the legacy `motion_review` prepare/submit workflow. No subagent, separate model critique, approval score or chapter registration is needed.
24
-
25
- ## 2. Inspect what was returned
26
-
27
- Check the attached images for:
28
-
29
- - Correct user text, images, branding and permitted substitutions.
30
- - Missing media, overflow, clipping and unreadable text.
31
- - The selected animation's mechanism and timing, including intended holds.
32
- - Representative entrance, active and exit frames for the selected component.
33
-
34
- Still images do not prove pacing at normal speed or that audio was heard. Use actual playback/listening only when needed and available; state the limit otherwise. Technical success is not proof of source-exact visual fidelity. Missing evidence is unverified, not PASS.
35
-
36
- If the tool fails, use its findings to diagnose the concrete problem. Runtime command details live in [technical diagnostics](../../references/runtime/lint-validate-inspect.md); they are troubleshooting references, not an extra mandatory pass. Never introduce generic drift, extra effects or layout changes just to satisfy a heuristic. If a real accessibility requirement conflicts with locked source styling, resolve that conflict rather than silently replacing the design.
37
-
38
- ## 3. Fix only a concrete defect
39
-
40
- A failed check or visibly wrong output warrants a targeted fix, a new versioned render and a check of that changed output. An unchanged export does not need checking again. Do not iterate toward subjective perfection or route the result to another reviewer. Report an unresolved blocker as draft/unverified rather than looping indefinitely or declaring success.
41
-
42
- The tool measures audio and rejects non-finite levels or clipping; it does not normalize the file. Follow the selected recipe or user's delivery loudness target. Do not add audio to silent work or force every supplied animation through a generic -14 LUFS mix.
43
-
44
- ### Intentional holds
45
-
46
- Declare only actual recipe-defined static intervals. The hold plan binds to the current video, so an old plan cannot excuse freezes in a changed export:
47
-
48
- ```json
49
- {
50
- "version": 1,
51
- "videoSha256": "<SHA-256 of this exact export>",
52
- "holds": [{ "start": 2, "end": 4, "reason": "Source recipe's reading hold" }]
53
- }
54
- ```
55
-
56
- Do not mark the whole video as a hold to suppress broken animation. Retain any existing meaningful motion assertions; do not invent a new assertion sidecar for every use of a template.
57
-
58
- ## 4. Deliver
59
-
60
- Deliver the actual versioned MP4, then reveal it:
61
-
62
- ```bash
63
- <node> "<motion bin>/reveal.mjs" renders/<file>.mp4
64
- ```
65
-
66
- State concrete remaining limits. Do not claim full playback, audio listening or source-exact fidelity from sampled images. No automatic posters, share copy, extra formats or launch packages.
@@ -1,42 +0,0 @@
1
- import type { Message } from "@prestyj/ai";
2
- import type { IdealReviewStats } from "./ideal-review.js";
3
- /**
4
- * Independent pre-final review — the Codex Guardian pattern. The in-thread
5
- * Ideal review asks the acting model to audit its own work, armed with its own
6
- * justifications for why it is done; a fresh-context reviewer sees only the
7
- * request, the changed files and the outcome evidence, so it catches what
8
- * self-review rationalizes away.
9
- *
10
- * The reviewer is spawned as a read-only child agent on the session's ACTIVE
11
- * model (`model` is forced at spawn time, never a "fast" or review model).
12
- * Findings are injected as a follow-up the acting agent must address; a CLEAN
13
- * verdict injects nothing, so a passing review costs one bounded wait and no
14
- * extra turn. On spawn failure or timeout the in-thread review remains the
15
- * fallback — the feature degrades, never blocks.
16
- */
17
- /** Read-only toolset — the reviewer examines, it never repairs. */
18
- export declare const REVIEWER_TOOLS: readonly ["read", "grep", "find", "ls", "code_search", "source_path"];
19
- /** Bounded wait for the reviewer child. Matches the subagent default wait. */
20
- export declare const REVIEWER_WAIT_MS = 120000;
21
- /**
22
- * Ideal review score at which the independent reviewer is worth its latency.
23
- * Below this the in-thread review alone is proportionate.
24
- */
25
- export declare const INDEPENDENT_REVIEW_SCORE_THRESHOLD = 6;
26
- export interface ReviewerTaskInput {
27
- originalRequest: string;
28
- changedFiles: readonly string[];
29
- stats: IdealReviewStats;
30
- triggerReasons: readonly string[];
31
- }
32
- export declare function buildReviewerTask(input: ReviewerTaskInput): string;
33
- export interface ReviewerFindings {
34
- clean: boolean;
35
- findings: string[];
36
- }
37
- /**
38
- * Parse the reviewer's terminal output. Returns null when the reply carries no
39
- * usable verdict marker — treated as a failed review, never as a pass.
40
- */
41
- export declare function parseReviewerFindings(output: string): ReviewerFindings | null;
42
- export declare function buildIndependentReviewMessage(findings: readonly string[]): Message;
@@ -1,95 +0,0 @@
1
- /**
2
- * Independent pre-final review — the Codex Guardian pattern. The in-thread
3
- * Ideal review asks the acting model to audit its own work, armed with its own
4
- * justifications for why it is done; a fresh-context reviewer sees only the
5
- * request, the changed files and the outcome evidence, so it catches what
6
- * self-review rationalizes away.
7
- *
8
- * The reviewer is spawned as a read-only child agent on the session's ACTIVE
9
- * model (`model` is forced at spawn time, never a "fast" or review model).
10
- * Findings are injected as a follow-up the acting agent must address; a CLEAN
11
- * verdict injects nothing, so a passing review costs one bounded wait and no
12
- * extra turn. On spawn failure or timeout the in-thread review remains the
13
- * fallback — the feature degrades, never blocks.
14
- */
15
- /** Read-only toolset — the reviewer examines, it never repairs. */
16
- export const REVIEWER_TOOLS = ["read", "grep", "find", "ls", "code_search", "source_path"];
17
- /** Bounded wait for the reviewer child. Matches the subagent default wait. */
18
- export const REVIEWER_WAIT_MS = 120_000;
19
- /**
20
- * Ideal review score at which the independent reviewer is worth its latency.
21
- * Below this the in-thread review alone is proportionate.
22
- */
23
- export const INDEPENDENT_REVIEW_SCORE_THRESHOLD = 6;
24
- export function buildReviewerTask(input) {
25
- const files = input.changedFiles
26
- .slice(0, 20)
27
- .map((f) => `- ${f}`)
28
- .join("\n");
29
- const reasons = input.triggerReasons.join(", ");
30
- return [
31
- "You are an independent code reviewer with fresh context. Another coding agent claims to have " +
32
- "completed the task below. Examine its work and report whether the claim holds.",
33
- "",
34
- `Task given to that agent: ${input.originalRequest.slice(0, 2000)}`,
35
- "",
36
- "Files it changed:",
37
- files,
38
- "",
39
- `Harness-observed activity: ${input.stats.changedLines} changed lines, ` +
40
- `${input.stats.toolCalls} tool calls (${input.stats.toolFailures} failed), ` +
41
- `${input.stats.turns} turns. Review triggered because: ${reasons}.`,
42
- "",
43
- "Read the changed files (and any sibling files needed to judge them). Check the work against " +
44
- "the task: correctness, completeness, obvious edge cases, over-editing beyond what the task " +
45
- "asked for, leftover TODOs or dead code, and changes that contradict each other.",
46
- "Judge the CONTENT of the changed files against the request. Do NOT report the surrounding " +
47
- "environment (missing package.json, tooling not installed, unrelated files) unless the request " +
48
- "itself demanded those.",
49
- "You are READ-ONLY: do not edit, write, or run commands. Judge only what is on disk.",
50
- "",
51
- "BEGIN your reply with EXACTLY this format (elaborate only after it):",
52
- "VERDICT: CLEAN",
53
- "or",
54
- "VERDICT: ISSUES",
55
- "FINDINGS:",
56
- "- <one line per concrete finding, each naming the file>",
57
- ].join("\n");
58
- }
59
- /**
60
- * Parse the reviewer's terminal output. Returns null when the reply carries no
61
- * usable verdict marker — treated as a failed review, never as a pass.
62
- */
63
- export function parseReviewerFindings(output) {
64
- const verdict = /VERDICT:\s*(CLEAN|ISSUES)\b/im.exec(output)?.[1]?.toUpperCase();
65
- if (!verdict)
66
- return null;
67
- const findingsBlock = /FINDINGS:\s*\n([\s\S]*)$/i.exec(output)?.[1] ?? "";
68
- const findings = findingsBlock
69
- .split("\n")
70
- .map((line) => line.replace(/^\s*[-*]\s*/, "").trim())
71
- .filter((line) => line.length > 0 && line.toUpperCase() !== "NONE")
72
- .slice(0, 10);
73
- if (verdict === "CLEAN")
74
- return { clean: true, findings: [] };
75
- if (findings.length === 0)
76
- return {
77
- clean: false,
78
- findings: [
79
- "The reviewer flagged issues but did not list them — re-examine the changed files yourself.",
80
- ],
81
- };
82
- return { clean: false, findings };
83
- }
84
- export function buildIndependentReviewMessage(findings) {
85
- return {
86
- role: "user",
87
- provenance: { source: "runtime", kind: "review_follow_up", visibility: "hidden" },
88
- content: "An independent reviewer (fresh context, no knowledge of your reasoning) examined the changed " +
89
- "files against the original request and disagrees that the work is complete:\n" +
90
- findings.map((finding) => `- ${finding}`).join("\n") +
91
- "\nAddress each finding now — fix what is real, and if a finding is wrong, verify why before " +
92
- "dismissing it. Then give your final response.",
93
- };
94
- }
95
- //# sourceMappingURL=ideal-review-subagent.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ideal-review-subagent.js","sourceRoot":"","sources":["../../src/core/ideal-review-subagent.ts"],"names":[],"mappings":"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"}
@@ -1,82 +0,0 @@
1
- import type { Message } from "@prestyj/ai";
2
- export interface IdealReviewStats {
3
- changedLines: number;
4
- toolCalls: number;
5
- toolFailures: number;
6
- turns: number;
7
- writeCalls: number;
8
- editCalls: number;
9
- bashCalls: number;
10
- }
11
- export interface IdealReviewDecision {
12
- shouldReview: boolean;
13
- score: number;
14
- reasons: string[];
15
- }
16
- export interface ReviewCoverageEvidence {
17
- expected: string[];
18
- covered: string[];
19
- missing: string[];
20
- }
21
- /**
22
- * Harness-owned proof that every successfully changed file was opened with the
23
- * read tool after Ideal review began. Model-authored claims never enter it.
24
- */
25
- export declare class ReviewCoverageTracker {
26
- private readonly cwd;
27
- private readonly fileExists;
28
- private readonly expected;
29
- private readonly covered;
30
- private active;
31
- /**
32
- * `fileExists` is injectable for tests and defaults to the real filesystem.
33
- * A file the run created and then deleted can never be re-read, so without
34
- * this check it stayed in `missing` forever and the coverage gate re-injected
35
- * the same follow-up on every turn.
36
- */
37
- constructor(cwd: string, fileExists?: (p: string) => boolean);
38
- reset(): void;
39
- /** Successful mutations are retained before and during review. */
40
- recordChanged(filePath: string): void;
41
- /** Start the evidence window; reads observed before this call never count. */
42
- start(changedFiles?: Iterable<string>): void;
43
- /** Called only by the successful read-tool callback. */
44
- recordRead(filePath: string): void;
45
- evidence(): ReviewCoverageEvidence;
46
- private normalize;
47
- private display;
48
- }
49
- export declare function buildReviewCoverageMessage(missingFiles: readonly string[]): Message;
50
- /**
51
- * Coverage follow-ups spent before the gate gives up. The gate is fail-closed,
52
- * but a file the agent genuinely cannot read (permissions, a path outside the
53
- * workspace, a race with an external delete) must not cost an unbounded number
54
- * of identical turns — it escalates once and lets the run finish.
55
- */
56
- export declare const MAX_REVIEW_COVERAGE_INJECTIONS = 2;
57
- /**
58
- * Terminal coverage message: stop demanding reads, require an honest statement
59
- * of what went unverified in the final answer.
60
- */
61
- export declare function buildReviewCoverageEscalationMessage(missingFiles: readonly string[]): Message;
62
- /**
63
- * Put the harness-owned read checklist on the first Ideal review turn. The
64
- * fail-closed follow-up remains as a fallback, but compliant reviews can now
65
- * gather all evidence before emitting their single user-facing final answer.
66
- */
67
- export declare function withReviewCoverageRequirements(message: Message, missingFiles: readonly string[]): Message;
68
- export declare const IDEAL_REVIEW_PROMPT: string;
69
- export declare function evaluateIdealReview(stats: IdealReviewStats): IdealReviewDecision;
70
- export declare function buildIdealReviewMessage(reasons: readonly string[], driftedFiles?: readonly string[]): Message;
71
- /**
72
- * Test-drift detector \u2014 the one stranding signal a typechecker is blind to.
73
- * Given the set of files the run mutated, return the source files whose sibling
74
- * test exists on disk but was NOT touched this run (a green-but-stale test).
75
- *
76
- * Pure structural check: no sibling test on disk \u2192 no signal, so it stays
77
- * silent on projects (or files) without co-located tests. `fileExists` is
78
- * injectable for tests; paths are resolved against `cwd` so relative tool paths
79
- * and absolute ones compare consistently.
80
- */
81
- export declare function detectTestDrift(touchedFiles: Iterable<string>, cwd: string, fileExists?: (p: string) => boolean): string[];
82
- export declare function shouldCountAsRiskyTool(toolName: string): boolean;