akari-video 0.1.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 (492) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +81 -0
  3. package/bin/akari.mjs +14 -0
  4. package/package.json +42 -0
  5. package/src/cli.mjs +140 -0
  6. package/src/messages.mjs +100 -0
  7. package/src/path-lookup.mjs +47 -0
  8. package/src/project-state.mjs +25 -0
  9. package/src/repo-assets.mjs +59 -0
  10. package/src/task-labels.mjs +30 -0
  11. package/src/update-check.mjs +189 -0
  12. package/vendor/packages/project-scaffold/package.json +11 -0
  13. package/vendor/packages/project-scaffold/src/index.mjs +523 -0
  14. package/vendor/packages/project-scaffold/test/create-project.test.mjs +81 -0
  15. package/vendor/packages/project-scaffold/test/skill-adapter-link.test.mjs +204 -0
  16. package/vendor/packages/schemas/analysis.schema.json +475 -0
  17. package/vendor/packages/schemas/asset-meta.schema.json +225 -0
  18. package/vendor/packages/schemas/avatar-rendition.schema.json +65 -0
  19. package/vendor/packages/schemas/avatar.schema.json +178 -0
  20. package/vendor/packages/schemas/bin/validate-asset.mjs +597 -0
  21. package/vendor/packages/schemas/bin/validate-avatar.mjs +486 -0
  22. package/vendor/packages/schemas/bin/validate-captions.mjs +316 -0
  23. package/vendor/packages/schemas/bin/validate-connections.mjs +295 -0
  24. package/vendor/packages/schemas/bin/validate-edit.mjs +766 -0
  25. package/vendor/packages/schemas/bin/validate-intake.mjs +185 -0
  26. package/vendor/packages/schemas/bin/validate-interpretation.mjs +515 -0
  27. package/vendor/packages/schemas/bin/validate-plan-comments.mjs +170 -0
  28. package/vendor/packages/schemas/bin/validate-plan.mjs +365 -0
  29. package/vendor/packages/schemas/bin/validate-recipe.mjs +267 -0
  30. package/vendor/packages/schemas/bin/validate-research-plan.mjs +510 -0
  31. package/vendor/packages/schemas/bin/validate-review.mjs +427 -0
  32. package/vendor/packages/schemas/captions.schema.json +141 -0
  33. package/vendor/packages/schemas/connections.schema.json +153 -0
  34. package/vendor/packages/schemas/edit.schema.json +437 -0
  35. package/vendor/packages/schemas/examples/analysis-person-matte-valid/analysis.json +18 -0
  36. package/vendor/packages/schemas/examples/captions-text-style-background-mode-invalid/captions.json +18 -0
  37. package/vendor/packages/schemas/examples/captions-text-style-color-non-hex-invalid/captions.json +14 -0
  38. package/vendor/packages/schemas/examples/captions-text-style-default-only-valid/captions.json +27 -0
  39. package/vendor/packages/schemas/examples/captions-text-style-omitted-valid/captions.json +11 -0
  40. package/vendor/packages/schemas/examples/captions-text-style-opacity-out-of-range-invalid/captions.json +8 -0
  41. package/vendor/packages/schemas/examples/captions-text-style-record-override-valid/captions.json +27 -0
  42. package/vendor/packages/schemas/examples/captions-text-style-size-non-positive-invalid/captions.json +14 -0
  43. package/vendor/packages/schemas/examples/captions-text-style-zone-invalid/captions.json +16 -0
  44. package/vendor/packages/schemas/examples/connections-v0-invalid-auth/connections.json +32 -0
  45. package/vendor/packages/schemas/examples/connections-v0-memory-valid/connections.json +42 -0
  46. package/vendor/packages/schemas/examples/edit-beats-duplicate-id/edit.json +11 -0
  47. package/vendor/packages/schemas/examples/edit-beats-invalid-id/edit.json +10 -0
  48. package/vendor/packages/schemas/examples/edit-beats-missing-kind/edit.json +10 -0
  49. package/vendor/packages/schemas/examples/edit-beats-strength-out-of-range/edit.json +11 -0
  50. package/vendor/packages/schemas/examples/edit-beats-v0-src-present/edit.json +10 -0
  51. package/vendor/packages/schemas/examples/edit-beats-v0-valid/edit.json +29 -0
  52. package/vendor/packages/schemas/examples/edit-beats-v1-src-missing-reference/edit.json +14 -0
  53. package/vendor/packages/schemas/examples/edit-beats-v1-valid/edit.json +37 -0
  54. package/vendor/packages/schemas/examples/edit-bgm-ducking-invalid/edit.json +10 -0
  55. package/vendor/packages/schemas/examples/edit-bgm-fade-invalid/edit.json +10 -0
  56. package/vendor/packages/schemas/examples/edit-bgm-fade-valid/edit.json +10 -0
  57. package/vendor/packages/schemas/examples/edit-bgm-in-invalid/edit.json +10 -0
  58. package/vendor/packages/schemas/examples/edit-bgm-in-valid/edit.json +10 -0
  59. package/vendor/packages/schemas/examples/edit-bgm-missing-path/edit.json +10 -0
  60. package/vendor/packages/schemas/examples/edit-bgm-null-valid/edit.json +11 -0
  61. package/vendor/packages/schemas/examples/edit-bgm-sfx-gain-out-of-range/edit.json +11 -0
  62. package/vendor/packages/schemas/examples/edit-bgm-sfx-valid/edit.json +23 -0
  63. package/vendor/packages/schemas/examples/edit-chroma-key-invalid/edit.json +7 -0
  64. package/vendor/packages/schemas/examples/edit-cuts-at-negative-invalid/edit.json +7 -0
  65. package/vendor/packages/schemas/examples/edit-cuts-at-track-valid/edit.json +20 -0
  66. package/vendor/packages/schemas/examples/edit-cuts-opacity-out-of-range-invalid/edit.json +16 -0
  67. package/vendor/packages/schemas/examples/edit-cuts-track-invalid/edit.json +7 -0
  68. package/vendor/packages/schemas/examples/edit-cuts-transform-full-valid/edit.json +17 -0
  69. package/vendor/packages/schemas/examples/edit-cuts-transform-omitted-valid/edit.json +9 -0
  70. package/vendor/packages/schemas/examples/edit-cuts-transform-partial-valid/edit.json +16 -0
  71. package/vendor/packages/schemas/examples/edit-cuts-transform-rotate-invalid/edit.json +16 -0
  72. package/vendor/packages/schemas/examples/edit-cuts-transform-scale-invalid/edit.json +16 -0
  73. package/vendor/packages/schemas/examples/edit-cuts-transform-unknown-key-invalid/edit.json +16 -0
  74. package/vendor/packages/schemas/examples/edit-direction-intensity-negative/edit.json +8 -0
  75. package/vendor/packages/schemas/examples/edit-direction-intensity-not-integer/edit.json +8 -0
  76. package/vendor/packages/schemas/examples/edit-direction-intensity-out-of-range/edit.json +8 -0
  77. package/vendor/packages/schemas/examples/edit-direction-missing-preset/edit.json +8 -0
  78. package/vendor/packages/schemas/examples/edit-direction-overrides-array/edit.json +8 -0
  79. package/vendor/packages/schemas/examples/edit-direction-preset-only/edit.json +8 -0
  80. package/vendor/packages/schemas/examples/edit-direction-valid/edit.json +8 -0
  81. package/vendor/packages/schemas/examples/edit-emphasis-words-empty-word/edit.json +10 -0
  82. package/vendor/packages/schemas/examples/edit-emphasis-words-invalid-id/edit.json +10 -0
  83. package/vendor/packages/schemas/examples/edit-emphasis-words-missing-emotion/edit.json +10 -0
  84. package/vendor/packages/schemas/examples/edit-emphasis-words-range-invalid/edit.json +11 -0
  85. package/vendor/packages/schemas/examples/edit-emphasis-words-v0-src-present/edit.json +10 -0
  86. package/vendor/packages/schemas/examples/edit-emphasis-words-v0-valid/edit.json +32 -0
  87. package/vendor/packages/schemas/examples/edit-emphasis-words-v1-valid/edit.json +39 -0
  88. package/vendor/packages/schemas/examples/edit-layers-invalid-bad-blend/edit.json +17 -0
  89. package/vendor/packages/schemas/examples/edit-layers-invalid-chroma-key-on-baked/edit.json +17 -0
  90. package/vendor/packages/schemas/examples/edit-layers-invalid-duplicate-id/edit.json +11 -0
  91. package/vendor/packages/schemas/examples/edit-layers-track-invalid/edit.json +8 -0
  92. package/vendor/packages/schemas/examples/edit-layers-valid/edit.json +31 -0
  93. package/vendor/packages/schemas/examples/edit-look-invalid/edit.json +7 -0
  94. package/vendor/packages/schemas/examples/edit-master-invalid/edit.json +8 -0
  95. package/vendor/packages/schemas/examples/edit-narration-gain-out-of-range/edit.json +18 -0
  96. package/vendor/packages/schemas/examples/edit-narration-invalid-id/edit.json +17 -0
  97. package/vendor/packages/schemas/examples/edit-narration-missing-provenance/edit.json +16 -0
  98. package/vendor/packages/schemas/examples/edit-narration-valid/edit.json +36 -0
  99. package/vendor/packages/schemas/examples/edit-narration-voicevox-missing-credit/edit.json +20 -0
  100. package/vendor/packages/schemas/examples/edit-render-basics-valid/edit.json +22 -0
  101. package/vendor/packages/schemas/examples/edit-sfx-in-invalid/edit.json +10 -0
  102. package/vendor/packages/schemas/examples/edit-sfx-in-out-valid/edit.json +10 -0
  103. package/vendor/packages/schemas/examples/edit-sfx-out-invalid/edit.json +10 -0
  104. package/vendor/packages/schemas/examples/edit-sfx-out-type-invalid/edit.json +10 -0
  105. package/vendor/packages/schemas/examples/edit-sfx-t-invalid/edit.json +10 -0
  106. package/vendor/packages/schemas/examples/edit-sfx-track-invalid/edit.json +8 -0
  107. package/vendor/packages/schemas/examples/edit-speed-invalid/edit.json +7 -0
  108. package/vendor/packages/schemas/examples/edit-timeline-declared-valid/edit.json +14 -0
  109. package/vendor/packages/schemas/examples/edit-timeline-duplicate-id-invalid/edit.json +13 -0
  110. package/vendor/packages/schemas/examples/edit-timeline-interleaved-valid/edit.json +22 -0
  111. package/vendor/packages/schemas/examples/edit-timeline-omitted-valid/edit.json +7 -0
  112. package/vendor/packages/schemas/examples/edit-timeline-ref-invalid/edit.json +13 -0
  113. package/vendor/packages/schemas/examples/edit-tracks-section-invalid/edit.json +8 -0
  114. package/vendor/packages/schemas/examples/edit-tracks-section-valid/edit.json +13 -0
  115. package/vendor/packages/schemas/examples/edit-transition-invalid/edit.json +10 -0
  116. package/vendor/packages/schemas/examples/edit-v0-sample/edit.json +27 -0
  117. package/vendor/packages/schemas/examples/edit-v0-sample/overlays/cap-a.html +17 -0
  118. package/vendor/packages/schemas/examples/edit-v0-sample/overlays/cap-b.html +17 -0
  119. package/vendor/packages/schemas/examples/edit-v1-bgm-sfx-valid/edit.json +13 -0
  120. package/vendor/packages/schemas/examples/edit-v1-sample/edit.json +14 -0
  121. package/vendor/packages/schemas/examples/plan-comments-v0-sample/plan-comments.json +19 -0
  122. package/vendor/packages/schemas/examples/plan-v0-sample/plan.json +39 -0
  123. package/vendor/packages/schemas/examples/recipe-v0-sample/product-demo-quick-cuts.json +23 -0
  124. package/vendor/packages/schemas/examples/review-v1-sample/review.json +11 -0
  125. package/vendor/packages/schemas/fixtures/avatar/invalid-avatar-md-136-lines/AVATAR.md +159 -0
  126. package/vendor/packages/schemas/fixtures/avatar/invalid-avatar-md-136-lines/avatar.json +22 -0
  127. package/vendor/packages/schemas/fixtures/avatar/invalid-avatar-md-136-lines/renditions/2d-bustup/happy.png +0 -0
  128. package/vendor/packages/schemas/fixtures/avatar/invalid-avatar-md-136-lines/renditions/2d-bustup/neutral-half.png +0 -0
  129. package/vendor/packages/schemas/fixtures/avatar/invalid-avatar-md-136-lines/renditions/2d-bustup/neutral-open.png +0 -0
  130. package/vendor/packages/schemas/fixtures/avatar/invalid-avatar-md-136-lines/renditions/2d-bustup/neutral.png +0 -0
  131. package/vendor/packages/schemas/fixtures/avatar/invalid-avatar-md-136-lines/renditions/2d-bustup/rendition.json +18 -0
  132. package/vendor/packages/schemas/fixtures/avatar/invalid-avatar-md-136-lines/renditions/2d-fullbody/happy.png +0 -0
  133. package/vendor/packages/schemas/fixtures/avatar/invalid-avatar-md-136-lines/renditions/2d-fullbody/neutral-half.png +0 -0
  134. package/vendor/packages/schemas/fixtures/avatar/invalid-avatar-md-136-lines/renditions/2d-fullbody/neutral-open.png +0 -0
  135. package/vendor/packages/schemas/fixtures/avatar/invalid-avatar-md-136-lines/renditions/2d-fullbody/neutral.png +0 -0
  136. package/vendor/packages/schemas/fixtures/avatar/invalid-avatar-md-136-lines/renditions/2d-fullbody/rendition.json +18 -0
  137. package/vendor/packages/schemas/fixtures/avatar/invalid-default-role/AVATAR.md +30 -0
  138. package/vendor/packages/schemas/fixtures/avatar/invalid-default-role/avatar.json +22 -0
  139. package/vendor/packages/schemas/fixtures/avatar/invalid-default-role/renditions/2d-bustup/happy.png +0 -0
  140. package/vendor/packages/schemas/fixtures/avatar/invalid-default-role/renditions/2d-bustup/neutral-half.png +0 -0
  141. package/vendor/packages/schemas/fixtures/avatar/invalid-default-role/renditions/2d-bustup/neutral-open.png +0 -0
  142. package/vendor/packages/schemas/fixtures/avatar/invalid-default-role/renditions/2d-bustup/neutral.png +0 -0
  143. package/vendor/packages/schemas/fixtures/avatar/invalid-default-role/renditions/2d-bustup/rendition.json +18 -0
  144. package/vendor/packages/schemas/fixtures/avatar/invalid-default-role/renditions/2d-fullbody/happy.png +0 -0
  145. package/vendor/packages/schemas/fixtures/avatar/invalid-default-role/renditions/2d-fullbody/neutral-half.png +0 -0
  146. package/vendor/packages/schemas/fixtures/avatar/invalid-default-role/renditions/2d-fullbody/neutral-open.png +0 -0
  147. package/vendor/packages/schemas/fixtures/avatar/invalid-default-role/renditions/2d-fullbody/neutral.png +0 -0
  148. package/vendor/packages/schemas/fixtures/avatar/invalid-default-role/renditions/2d-fullbody/rendition.json +18 -0
  149. package/vendor/packages/schemas/fixtures/avatar/invalid-energy-out-of-range/AVATAR.md +30 -0
  150. package/vendor/packages/schemas/fixtures/avatar/invalid-energy-out-of-range/avatar.json +22 -0
  151. package/vendor/packages/schemas/fixtures/avatar/invalid-energy-out-of-range/renditions/2d-bustup/happy.png +0 -0
  152. package/vendor/packages/schemas/fixtures/avatar/invalid-energy-out-of-range/renditions/2d-bustup/neutral-half.png +0 -0
  153. package/vendor/packages/schemas/fixtures/avatar/invalid-energy-out-of-range/renditions/2d-bustup/neutral-open.png +0 -0
  154. package/vendor/packages/schemas/fixtures/avatar/invalid-energy-out-of-range/renditions/2d-bustup/neutral.png +0 -0
  155. package/vendor/packages/schemas/fixtures/avatar/invalid-energy-out-of-range/renditions/2d-bustup/rendition.json +18 -0
  156. package/vendor/packages/schemas/fixtures/avatar/invalid-energy-out-of-range/renditions/2d-fullbody/happy.png +0 -0
  157. package/vendor/packages/schemas/fixtures/avatar/invalid-energy-out-of-range/renditions/2d-fullbody/neutral-half.png +0 -0
  158. package/vendor/packages/schemas/fixtures/avatar/invalid-energy-out-of-range/renditions/2d-fullbody/neutral-open.png +0 -0
  159. package/vendor/packages/schemas/fixtures/avatar/invalid-energy-out-of-range/renditions/2d-fullbody/neutral.png +0 -0
  160. package/vendor/packages/schemas/fixtures/avatar/invalid-energy-out-of-range/renditions/2d-fullbody/rendition.json +18 -0
  161. package/vendor/packages/schemas/fixtures/avatar/invalid-missing-asset/AVATAR.md +30 -0
  162. package/vendor/packages/schemas/fixtures/avatar/invalid-missing-asset/avatar.json +22 -0
  163. package/vendor/packages/schemas/fixtures/avatar/invalid-missing-asset/renditions/2d-bustup/neutral-half.png +0 -0
  164. package/vendor/packages/schemas/fixtures/avatar/invalid-missing-asset/renditions/2d-bustup/neutral-open.png +0 -0
  165. package/vendor/packages/schemas/fixtures/avatar/invalid-missing-asset/renditions/2d-bustup/neutral.png +0 -0
  166. package/vendor/packages/schemas/fixtures/avatar/invalid-missing-asset/renditions/2d-bustup/rendition.json +18 -0
  167. package/vendor/packages/schemas/fixtures/avatar/invalid-missing-asset/renditions/2d-fullbody/happy.png +0 -0
  168. package/vendor/packages/schemas/fixtures/avatar/invalid-missing-asset/renditions/2d-fullbody/neutral-half.png +0 -0
  169. package/vendor/packages/schemas/fixtures/avatar/invalid-missing-asset/renditions/2d-fullbody/neutral-open.png +0 -0
  170. package/vendor/packages/schemas/fixtures/avatar/invalid-missing-asset/renditions/2d-fullbody/neutral.png +0 -0
  171. package/vendor/packages/schemas/fixtures/avatar/invalid-missing-asset/renditions/2d-fullbody/rendition.json +18 -0
  172. package/vendor/packages/schemas/fixtures/avatar/invalid-missing-rights/AVATAR.md +30 -0
  173. package/vendor/packages/schemas/fixtures/avatar/invalid-missing-rights/avatar.json +21 -0
  174. package/vendor/packages/schemas/fixtures/avatar/invalid-missing-rights/renditions/2d-bustup/happy.png +0 -0
  175. package/vendor/packages/schemas/fixtures/avatar/invalid-missing-rights/renditions/2d-bustup/neutral-half.png +0 -0
  176. package/vendor/packages/schemas/fixtures/avatar/invalid-missing-rights/renditions/2d-bustup/neutral-open.png +0 -0
  177. package/vendor/packages/schemas/fixtures/avatar/invalid-missing-rights/renditions/2d-bustup/neutral.png +0 -0
  178. package/vendor/packages/schemas/fixtures/avatar/invalid-missing-rights/renditions/2d-bustup/rendition.json +18 -0
  179. package/vendor/packages/schemas/fixtures/avatar/invalid-missing-rights/renditions/2d-fullbody/happy.png +0 -0
  180. package/vendor/packages/schemas/fixtures/avatar/invalid-missing-rights/renditions/2d-fullbody/neutral-half.png +0 -0
  181. package/vendor/packages/schemas/fixtures/avatar/invalid-missing-rights/renditions/2d-fullbody/neutral-open.png +0 -0
  182. package/vendor/packages/schemas/fixtures/avatar/invalid-missing-rights/renditions/2d-fullbody/neutral.png +0 -0
  183. package/vendor/packages/schemas/fixtures/avatar/invalid-missing-rights/renditions/2d-fullbody/rendition.json +18 -0
  184. package/vendor/packages/schemas/fixtures/avatar/invalid-no-avatar-json/AVATAR.md +30 -0
  185. package/vendor/packages/schemas/fixtures/avatar/invalid-person-in-catalog/catalog/avatars/impostor/AVATAR.md +30 -0
  186. package/vendor/packages/schemas/fixtures/avatar/invalid-person-in-catalog/catalog/avatars/impostor/avatar.json +22 -0
  187. package/vendor/packages/schemas/fixtures/avatar/invalid-person-in-catalog/catalog/avatars/impostor/renditions/2d-bustup/happy.png +0 -0
  188. package/vendor/packages/schemas/fixtures/avatar/invalid-person-in-catalog/catalog/avatars/impostor/renditions/2d-bustup/neutral-half.png +0 -0
  189. package/vendor/packages/schemas/fixtures/avatar/invalid-person-in-catalog/catalog/avatars/impostor/renditions/2d-bustup/neutral-open.png +0 -0
  190. package/vendor/packages/schemas/fixtures/avatar/invalid-person-in-catalog/catalog/avatars/impostor/renditions/2d-bustup/neutral.png +0 -0
  191. package/vendor/packages/schemas/fixtures/avatar/invalid-person-in-catalog/catalog/avatars/impostor/renditions/2d-bustup/rendition.json +18 -0
  192. package/vendor/packages/schemas/fixtures/avatar/invalid-person-in-catalog/catalog/avatars/impostor/renditions/2d-fullbody/happy.png +0 -0
  193. package/vendor/packages/schemas/fixtures/avatar/invalid-person-in-catalog/catalog/avatars/impostor/renditions/2d-fullbody/neutral-half.png +0 -0
  194. package/vendor/packages/schemas/fixtures/avatar/invalid-person-in-catalog/catalog/avatars/impostor/renditions/2d-fullbody/neutral-open.png +0 -0
  195. package/vendor/packages/schemas/fixtures/avatar/invalid-person-in-catalog/catalog/avatars/impostor/renditions/2d-fullbody/neutral.png +0 -0
  196. package/vendor/packages/schemas/fixtures/avatar/invalid-person-in-catalog/catalog/avatars/impostor/renditions/2d-fullbody/rendition.json +18 -0
  197. package/vendor/packages/schemas/fixtures/avatar/invalid-person-sellable/AVATAR.md +30 -0
  198. package/vendor/packages/schemas/fixtures/avatar/invalid-person-sellable/avatar.json +22 -0
  199. package/vendor/packages/schemas/fixtures/avatar/invalid-person-sellable/renditions/2d-bustup/happy.png +0 -0
  200. package/vendor/packages/schemas/fixtures/avatar/invalid-person-sellable/renditions/2d-bustup/neutral-half.png +0 -0
  201. package/vendor/packages/schemas/fixtures/avatar/invalid-person-sellable/renditions/2d-bustup/neutral-open.png +0 -0
  202. package/vendor/packages/schemas/fixtures/avatar/invalid-person-sellable/renditions/2d-bustup/neutral.png +0 -0
  203. package/vendor/packages/schemas/fixtures/avatar/invalid-person-sellable/renditions/2d-bustup/rendition.json +18 -0
  204. package/vendor/packages/schemas/fixtures/avatar/invalid-person-sellable/renditions/2d-fullbody/happy.png +0 -0
  205. package/vendor/packages/schemas/fixtures/avatar/invalid-person-sellable/renditions/2d-fullbody/neutral-half.png +0 -0
  206. package/vendor/packages/schemas/fixtures/avatar/invalid-person-sellable/renditions/2d-fullbody/neutral-open.png +0 -0
  207. package/vendor/packages/schemas/fixtures/avatar/invalid-person-sellable/renditions/2d-fullbody/neutral.png +0 -0
  208. package/vendor/packages/schemas/fixtures/avatar/invalid-person-sellable/renditions/2d-fullbody/rendition.json +18 -0
  209. package/vendor/packages/schemas/fixtures/avatar/unsupported-version/AVATAR.md +30 -0
  210. package/vendor/packages/schemas/fixtures/avatar/unsupported-version/avatar.json +22 -0
  211. package/vendor/packages/schemas/fixtures/avatar/unsupported-version/renditions/2d-bustup/happy.png +0 -0
  212. package/vendor/packages/schemas/fixtures/avatar/unsupported-version/renditions/2d-bustup/neutral-half.png +0 -0
  213. package/vendor/packages/schemas/fixtures/avatar/unsupported-version/renditions/2d-bustup/neutral-open.png +0 -0
  214. package/vendor/packages/schemas/fixtures/avatar/unsupported-version/renditions/2d-bustup/neutral.png +0 -0
  215. package/vendor/packages/schemas/fixtures/avatar/unsupported-version/renditions/2d-bustup/rendition.json +18 -0
  216. package/vendor/packages/schemas/fixtures/avatar/unsupported-version/renditions/2d-fullbody/happy.png +0 -0
  217. package/vendor/packages/schemas/fixtures/avatar/unsupported-version/renditions/2d-fullbody/neutral-half.png +0 -0
  218. package/vendor/packages/schemas/fixtures/avatar/unsupported-version/renditions/2d-fullbody/neutral-open.png +0 -0
  219. package/vendor/packages/schemas/fixtures/avatar/unsupported-version/renditions/2d-fullbody/neutral.png +0 -0
  220. package/vendor/packages/schemas/fixtures/avatar/unsupported-version/renditions/2d-fullbody/rendition.json +18 -0
  221. package/vendor/packages/schemas/fixtures/avatar/valid/AVATAR.md +30 -0
  222. package/vendor/packages/schemas/fixtures/avatar/valid/avatar.json +22 -0
  223. package/vendor/packages/schemas/fixtures/avatar/valid/renditions/2d-bustup/happy.png +0 -0
  224. package/vendor/packages/schemas/fixtures/avatar/valid/renditions/2d-bustup/neutral-half.png +0 -0
  225. package/vendor/packages/schemas/fixtures/avatar/valid/renditions/2d-bustup/neutral-open.png +0 -0
  226. package/vendor/packages/schemas/fixtures/avatar/valid/renditions/2d-bustup/neutral.png +0 -0
  227. package/vendor/packages/schemas/fixtures/avatar/valid/renditions/2d-bustup/rendition.json +18 -0
  228. package/vendor/packages/schemas/fixtures/avatar/valid/renditions/2d-fullbody/happy.png +0 -0
  229. package/vendor/packages/schemas/fixtures/avatar/valid/renditions/2d-fullbody/neutral-half.png +0 -0
  230. package/vendor/packages/schemas/fixtures/avatar/valid/renditions/2d-fullbody/neutral-open.png +0 -0
  231. package/vendor/packages/schemas/fixtures/avatar/valid/renditions/2d-fullbody/neutral.png +0 -0
  232. package/vendor/packages/schemas/fixtures/avatar/valid/renditions/2d-fullbody/rendition.json +18 -0
  233. package/vendor/packages/schemas/fixtures/avatar/valid-unknown-fields/AVATAR.md +30 -0
  234. package/vendor/packages/schemas/fixtures/avatar/valid-unknown-fields/avatar.json +23 -0
  235. package/vendor/packages/schemas/fixtures/avatar/valid-unknown-fields/renditions/2d-bustup/happy.png +0 -0
  236. package/vendor/packages/schemas/fixtures/avatar/valid-unknown-fields/renditions/2d-bustup/neutral-half.png +0 -0
  237. package/vendor/packages/schemas/fixtures/avatar/valid-unknown-fields/renditions/2d-bustup/neutral-open.png +0 -0
  238. package/vendor/packages/schemas/fixtures/avatar/valid-unknown-fields/renditions/2d-bustup/neutral.png +0 -0
  239. package/vendor/packages/schemas/fixtures/avatar/valid-unknown-fields/renditions/2d-bustup/rendition.json +18 -0
  240. package/vendor/packages/schemas/fixtures/avatar/valid-unknown-fields/renditions/2d-fullbody/happy.png +0 -0
  241. package/vendor/packages/schemas/fixtures/avatar/valid-unknown-fields/renditions/2d-fullbody/neutral-half.png +0 -0
  242. package/vendor/packages/schemas/fixtures/avatar/valid-unknown-fields/renditions/2d-fullbody/neutral-open.png +0 -0
  243. package/vendor/packages/schemas/fixtures/avatar/valid-unknown-fields/renditions/2d-fullbody/neutral.png +0 -0
  244. package/vendor/packages/schemas/fixtures/avatar/valid-unknown-fields/renditions/2d-fullbody/rendition.json +18 -0
  245. package/vendor/packages/schemas/fixtures/avatar/valid-voice-only/AVATAR.md +28 -0
  246. package/vendor/packages/schemas/fixtures/avatar/valid-voice-only/avatar.json +19 -0
  247. package/vendor/packages/schemas/fixtures/intake/invalid-duplicate-task/intake.json +8 -0
  248. package/vendor/packages/schemas/fixtures/intake/invalid-missing-submitted-at/intake.json +8 -0
  249. package/vendor/packages/schemas/fixtures/intake/invalid-target-exclusive/intake.json +8 -0
  250. package/vendor/packages/schemas/fixtures/intake/invalid-unknown-task/intake.json +8 -0
  251. package/vendor/packages/schemas/fixtures/intake/valid-draft/intake.json +8 -0
  252. package/vendor/packages/schemas/fixtures/intake/valid-submitted/intake.json +8 -0
  253. package/vendor/packages/schemas/fixtures/plan/invalid-bad-confidence-enum/plan.json +15 -0
  254. package/vendor/packages/schemas/fixtures/plan/invalid-constraint-bad-applies-to/plan.json +18 -0
  255. package/vendor/packages/schemas/fixtures/plan/invalid-dangling-media-path/plan.json +15 -0
  256. package/vendor/packages/schemas/fixtures/plan/invalid-duplicate-slot-id/plan.json +25 -0
  257. package/vendor/packages/schemas/fixtures/plan/invalid-missing-required-field/plan.json +14 -0
  258. package/vendor/packages/schemas/fixtures/plan/unsupported-version/plan.json +4 -0
  259. package/vendor/packages/schemas/fixtures/plan/valid/plan.json +40 -0
  260. package/vendor/packages/schemas/fixtures/plan/valid/scaffold/beat-01.png +1 -0
  261. package/vendor/packages/schemas/fixtures/plan/valid/scaffold/beat-01.wav +1 -0
  262. package/vendor/packages/schemas/fixtures/plan/valid/scaffold/broll.mp4 +1 -0
  263. package/vendor/packages/schemas/fixtures/plan/warns-confidence-gap/plan.json +28 -0
  264. package/vendor/packages/schemas/fixtures/plan-comments/invalid-bad-pass/plan-comments.json +6 -0
  265. package/vendor/packages/schemas/fixtures/plan-comments/invalid-bad-target-id-for-index-kind/plan-comments.json +13 -0
  266. package/vendor/packages/schemas/fixtures/plan-comments/invalid-bad-target-kind/plan-comments.json +13 -0
  267. package/vendor/packages/schemas/fixtures/plan-comments/invalid-comments-not-array/plan-comments.json +6 -0
  268. package/vendor/packages/schemas/fixtures/plan-comments/invalid-missing-comment-field/plan-comments.json +12 -0
  269. package/vendor/packages/schemas/fixtures/plan-comments/invalid-missing-version/plan-comments.json +5 -0
  270. package/vendor/packages/schemas/fixtures/plan-comments/unsupported-version/plan-comments.json +6 -0
  271. package/vendor/packages/schemas/fixtures/plan-comments/valid/plan-comments.json +19 -0
  272. package/vendor/packages/schemas/fixtures/plan-comments/valid-unknown-fields/plan-comments.json +15 -0
  273. package/vendor/packages/schemas/fixtures/recipe/invalid-bad-aspect/recipe.json +13 -0
  274. package/vendor/packages/schemas/fixtures/recipe/invalid-bad-confirmed-by/recipe.json +13 -0
  275. package/vendor/packages/schemas/fixtures/recipe/invalid-bad-name-casing/recipe.json +13 -0
  276. package/vendor/packages/schemas/fixtures/recipe/invalid-bad-workflow/recipe.json +13 -0
  277. package/vendor/packages/schemas/fixtures/recipe/invalid-duplicate-overlay-kind/recipe.json +13 -0
  278. package/vendor/packages/schemas/fixtures/recipe/invalid-empty-confirmed/recipe.json +9 -0
  279. package/vendor/packages/schemas/fixtures/recipe/invalid-empty-narration/recipe.json +13 -0
  280. package/vendor/packages/schemas/fixtures/recipe/invalid-missing-version/recipe.json +12 -0
  281. package/vendor/packages/schemas/fixtures/recipe/invalid-provenance-mismatch/recipe.json +15 -0
  282. package/vendor/packages/schemas/fixtures/recipe/invalid-source-project-path/recipe.json +13 -0
  283. package/vendor/packages/schemas/fixtures/recipe/unsupported-version/recipe.json +13 -0
  284. package/vendor/packages/schemas/fixtures/recipe/valid/recipe.json +15 -0
  285. package/vendor/packages/schemas/fixtures/recipe/valid-unknown-fields/recipe.json +16 -0
  286. package/vendor/packages/schemas/fixtures/review/invalid-malformed-canvas-target/review.json +6 -0
  287. package/vendor/packages/schemas/fixtures/review/invalid-malformed-doc-target/review.json +6 -0
  288. package/vendor/packages/schemas/fixtures/review/invalid-malformed-image-target/review.json +6 -0
  289. package/vendor/packages/schemas/fixtures/review/invalid-strokes-bad-space/review.json +6 -0
  290. package/vendor/packages/schemas/fixtures/review/invalid-strokes-canvas-rect-with-frame/review.json +6 -0
  291. package/vendor/packages/schemas/fixtures/review/invalid-strokes-image-rect-with-frame/review.json +6 -0
  292. package/vendor/packages/schemas/fixtures/review/invalid-video-null-sourcet/review.json +6 -0
  293. package/vendor/packages/schemas/fixtures/review/valid/review.json +8 -0
  294. package/vendor/packages/schemas/fixtures/review/valid-canvas-target/review.json +7 -0
  295. package/vendor/packages/schemas/fixtures/review/valid-input-session/review.json +6 -0
  296. package/vendor/packages/schemas/fixtures/review/valid-strokes/review.json +8 -0
  297. package/vendor/packages/schemas/intake.schema.json +117 -0
  298. package/vendor/packages/schemas/interpretation.schema.json +419 -0
  299. package/vendor/packages/schemas/package.json +18 -0
  300. package/vendor/packages/schemas/plan-comments.schema.json +52 -0
  301. package/vendor/packages/schemas/plan.schema.json +129 -0
  302. package/vendor/packages/schemas/recipe.schema.json +106 -0
  303. package/vendor/packages/schemas/research-plan.schema.json +230 -0
  304. package/vendor/packages/schemas/review.schema.json +227 -0
  305. package/vendor/packages/schemas/test/fixtures/asset/invalid-matched-by/audio/whoosh-transition/meta.json +31 -0
  306. package/vendor/packages/schemas/test/fixtures/asset/valid-catalog/audio/whoosh-transition/meta.json +31 -0
  307. package/vendor/packages/schemas/test/fixtures/asset/valid-library/telop/lower-third-clean/fragment.html +139 -0
  308. package/vendor/packages/schemas/test/fixtures/asset/valid-library/telop/lower-third-clean/meta.json +32 -0
  309. package/vendor/packages/schemas/test/fixtures/asset/valid-library/telop/lower-third-clean/preview.png +0 -0
  310. package/vendor/packages/schemas/test/fixtures/interpretation/invalid-analyses-missing-ref/interpretation.json +131 -0
  311. package/vendor/packages/schemas/test/fixtures/interpretation/invalid-analyses-ref-mismatch/interpretation.json +132 -0
  312. package/vendor/packages/schemas/test/fixtures/interpretation/invalid-arc-empty-refs/interpretation.json +126 -0
  313. package/vendor/packages/schemas/test/fixtures/interpretation/invalid-context-missing-interview/interpretation.json +126 -0
  314. package/vendor/packages/schemas/test/fixtures/interpretation/invalid-context-null-intake/interpretation.json +133 -0
  315. package/vendor/packages/schemas/test/fixtures/interpretation/invalid-dangling-arc-ref/interpretation.json +132 -0
  316. package/vendor/packages/schemas/test/fixtures/interpretation/invalid-duplicate-asset-ref/interpretation.json +132 -0
  317. package/vendor/packages/schemas/test/fixtures/interpretation/invalid-flag-bad-type/interpretation.json +132 -0
  318. package/vendor/packages/schemas/test/fixtures/interpretation/invalid-flag-missing-evidence/interpretation.json +131 -0
  319. package/vendor/packages/schemas/test/fixtures/interpretation/invalid-missing-required-field/interpretation.json +131 -0
  320. package/vendor/packages/schemas/test/fixtures/interpretation/invalid-open-question-answer-present-when-open/interpretation.json +133 -0
  321. package/vendor/packages/schemas/test/fixtures/interpretation/invalid-open-question-answered-without-answer/interpretation.json +131 -0
  322. package/vendor/packages/schemas/test/fixtures/interpretation/invalid-relations-dangling-target/interpretation.json +132 -0
  323. package/vendor/packages/schemas/test/fixtures/interpretation/invalid-relations-self-reference/interpretation.json +132 -0
  324. package/vendor/packages/schemas/test/fixtures/interpretation/invalid-section-end-before-start/interpretation.json +132 -0
  325. package/vendor/packages/schemas/test/fixtures/interpretation/invalid-section-mismatched-start-end/interpretation.json +131 -0
  326. package/vendor/packages/schemas/test/fixtures/interpretation/invalid-unknown-root-field/interpretation.json +133 -0
  327. package/vendor/packages/schemas/test/fixtures/interpretation/unsupported-version/interpretation.json +132 -0
  328. package/vendor/packages/schemas/test/fixtures/interpretation/valid/interpretation.json +132 -0
  329. package/vendor/packages/schemas/test/fixtures/research-plan/invalid-bad-category-enum/research-plan.json +128 -0
  330. package/vendor/packages/schemas/test/fixtures/research-plan/invalid-dangling-chapter-ref/research-plan.json +128 -0
  331. package/vendor/packages/schemas/test/fixtures/research-plan/invalid-dangling-shot-list-ref/research-plan.json +128 -0
  332. package/vendor/packages/schemas/test/fixtures/research-plan/invalid-decided-at-mismatch/research-plan.json +128 -0
  333. package/vendor/packages/schemas/test/fixtures/research-plan/invalid-duplicate-candidate-id/research-plan.json +128 -0
  334. package/vendor/packages/schemas/test/fixtures/research-plan/invalid-japan-sns-notes-empty/research-plan.json +128 -0
  335. package/vendor/packages/schemas/test/fixtures/research-plan/invalid-missing-required-field/research-plan.json +127 -0
  336. package/vendor/packages/schemas/test/fixtures/research-plan/invalid-selected-missing-candidate/research-plan.json +128 -0
  337. package/vendor/packages/schemas/test/fixtures/research-plan/invalid-structure-confirmed-mismatch/research-plan.json +128 -0
  338. package/vendor/packages/schemas/test/fixtures/research-plan/unsupported-version/research-plan.json +128 -0
  339. package/vendor/packages/schemas/test/fixtures/research-plan/valid/research-plan.json +79 -0
  340. package/vendor/packages/schemas/test/fixtures/research-plan/warns-empty-sources/research-plan.json +120 -0
  341. package/vendor/packages/schemas/test/validate-asset.test.mjs +38 -0
  342. package/vendor/packages/schemas/test/validate-avatar.test.mjs +109 -0
  343. package/vendor/packages/schemas/test/validate-captions.test.mjs +59 -0
  344. package/vendor/packages/schemas/test/validate-connections.test.mjs +31 -0
  345. package/vendor/packages/schemas/test/validate-edit.test.mjs +490 -0
  346. package/vendor/packages/schemas/test/validate-intake.test.mjs +66 -0
  347. package/vendor/packages/schemas/test/validate-interpretation.test.mjs +167 -0
  348. package/vendor/packages/schemas/test/validate-plan-comments.test.mjs +70 -0
  349. package/vendor/packages/schemas/test/validate-plan.test.mjs +67 -0
  350. package/vendor/packages/schemas/test/validate-recipe.test.mjs +107 -0
  351. package/vendor/packages/schemas/test/validate-research-plan.test.mjs +98 -0
  352. package/vendor/packages/schemas/test/validate-review.test.mjs +102 -0
  353. package/vendor/skills/.gitkeep +0 -0
  354. package/vendor/skills/address-review/SKILL.md +84 -0
  355. package/vendor/skills/address-review/bin/core/review-store.mjs +210 -0
  356. package/vendor/skills/address-review/bin/list.mjs +198 -0
  357. package/vendor/skills/address-review/bin/respond.mjs +89 -0
  358. package/vendor/skills/address-review/dev-fixtures/fixture-project/captions.json +22 -0
  359. package/vendor/skills/address-review/dev-fixtures/fixture-project/edit.json +12 -0
  360. package/vendor/skills/address-review/dev-fixtures/fixture-project/review.json +100 -0
  361. package/vendor/skills/address-review/test/review-store.test.mjs +201 -0
  362. package/vendor/skills/analyze-footage/SKILL.md +35 -0
  363. package/vendor/skills/analyze-footage/analysis-json.md +185 -0
  364. package/vendor/skills/analyze-footage/bin/person-matte/person-matte-helper.swift +343 -0
  365. package/vendor/skills/analyze-footage/bin/person-matte/person-matte.mjs +415 -0
  366. package/vendor/skills/analyze-footage/bin/speechanalyzer-helper.swift +138 -0
  367. package/vendor/skills/analyze-footage/bin/transcribe-cloud.mjs +486 -0
  368. package/vendor/skills/analyze-footage/bin/transcribe-sa.mjs +189 -0
  369. package/vendor/skills/analyze-footage/events-and-hooks.md +93 -0
  370. package/vendor/skills/analyze-footage/keyframes-and-review.md +130 -0
  371. package/vendor/skills/analyze-footage/media-and-transcript.md +219 -0
  372. package/vendor/skills/analyze-footage/person-matte.md +121 -0
  373. package/vendor/skills/analyze-footage/references/akari-data-contract.md +18 -0
  374. package/vendor/skills/analyze-footage/references/asset.meta.example.json +23 -0
  375. package/vendor/skills/analyze-footage/test/fixtures/scribe-punctuation-inflation.json +17 -0
  376. package/vendor/skills/analyze-footage/test/normalize-scribe.test.mjs +76 -0
  377. package/vendor/skills/analyze-footage/workflow.md +95 -0
  378. package/vendor/skills/analyze-project/SKILL.md +58 -0
  379. package/vendor/skills/analyze-project/collect.md +51 -0
  380. package/vendor/skills/analyze-project/decision-record.md +55 -0
  381. package/vendor/skills/analyze-project/interpretation.md +128 -0
  382. package/vendor/skills/analyze-project/interview.md +66 -0
  383. package/vendor/skills/analyze-project/references/interpretation-shape.md +42 -0
  384. package/vendor/skills/analyze-project/references/open-questions-examples.md +35 -0
  385. package/vendor/skills/analyze-project/validate-and-render.md +66 -0
  386. package/vendor/skills/bake-3d/SKILL.md +78 -0
  387. package/vendor/skills/compile-review-session/SKILL.md +78 -0
  388. package/vendor/skills/compile-review-session/bin/compile-review-session.mjs +799 -0
  389. package/vendor/skills/compile-review-session/bin/core/canvas-compiler.mjs +105 -0
  390. package/vendor/skills/compile-review-session/bin/core/compiler.mjs +221 -0
  391. package/vendor/skills/compile-review-session/bin/core/review-store.mjs +74 -0
  392. package/vendor/skills/compile-review-session/bin/core/time-mapping.mjs +370 -0
  393. package/vendor/skills/compile-review-session/bin/core/transcription.mjs +721 -0
  394. package/vendor/skills/compile-review-session/compilation-rules.md +98 -0
  395. package/vendor/skills/compile-review-session/dev-fixtures/README.md +24 -0
  396. package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review/sessions/s-0001/audio.wav +0 -0
  397. package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review/sessions/s-0001/edit.snapshot.json +12 -0
  398. package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review/sessions/s-0001/events.jsonl +2 -0
  399. package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review/sessions/s-0001/session.json +11 -0
  400. package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review/sessions/s-0002/audio.wav +0 -0
  401. package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review/sessions/s-0002/edit.snapshot.json +12 -0
  402. package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review/sessions/s-0002/events.jsonl +5 -0
  403. package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review/sessions/s-0002/session.json +11 -0
  404. package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review/sessions/s-0003/audio.wav +0 -0
  405. package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review/sessions/s-0003/edit.snapshot.json +12 -0
  406. package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review/sessions/s-0003/events.jsonl +19 -0
  407. package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review/sessions/s-0003/session.json +11 -0
  408. package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review/sessions/s-0004/audio.wav +0 -0
  409. package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review/sessions/s-0004/edit.snapshot.json +12 -0
  410. package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review/sessions/s-0004/events.jsonl +2 -0
  411. package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review/sessions/s-0004/session.json +11 -0
  412. package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review/sessions/s-0005/session.json +1 -0
  413. package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review/sessions/s-0006/audio.wav +0 -0
  414. package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review/sessions/s-0006/events.jsonl +2 -0
  415. package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review/sessions/s-0006/session.json +11 -0
  416. package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review/sessions/s-0007/audio.wav +0 -0
  417. package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review/sessions/s-0007/edit.snapshot.json +13 -0
  418. package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review/sessions/s-0007/events.jsonl +9 -0
  419. package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review/sessions/s-0007/session.json +11 -0
  420. package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review/sessions/s-0008/audio.wav +0 -0
  421. package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review/sessions/s-0008/edit.snapshot.json +12 -0
  422. package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review/sessions/s-0008/events.jsonl +2 -0
  423. package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review/sessions/s-0008/session.json +11 -0
  424. package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review/sessions/s-0008/transcript.json +9 -0
  425. package/vendor/skills/compile-review-session/dev-fixtures/fixture-project/review.json +7 -0
  426. package/vendor/skills/compile-review-session/test/canvas-compiler.test.mjs +283 -0
  427. package/vendor/skills/compile-review-session/test/compiler.test.mjs +458 -0
  428. package/vendor/skills/create-project/SKILL.md +46 -0
  429. package/vendor/skills/create-project/bin/create-project.mjs +88 -0
  430. package/vendor/skills/edit-lint/SKILL.md +73 -0
  431. package/vendor/skills/edit-plan/SKILL.md +64 -0
  432. package/vendor/skills/edit-plan/approvals-and-generation.md +106 -0
  433. package/vendor/skills/edit-plan/avatar-resolution.md +241 -0
  434. package/vendor/skills/edit-plan/beat-sync.md +545 -0
  435. package/vendor/skills/edit-plan/beats.md +197 -0
  436. package/vendor/skills/edit-plan/emphasis-detection.md +366 -0
  437. package/vendor/skills/edit-plan/execution.md +157 -0
  438. package/vendor/skills/edit-plan/expression-selection.md +290 -0
  439. package/vendor/skills/edit-plan/plan-json.md +52 -0
  440. package/vendor/skills/edit-plan/recipe.md +74 -0
  441. package/vendor/skills/edit-plan/references/asset.decisions.example.json +12 -0
  442. package/vendor/skills/edit-plan/references/event.example.json +7 -0
  443. package/vendor/skills/edit-plan/report-guide.md +192 -0
  444. package/vendor/skills/edit-plan/workflow.md +108 -0
  445. package/vendor/skills/generate-narration/SKILL.md +40 -0
  446. package/vendor/skills/generate-narration/assets/reading-script-v1.md +18 -0
  447. package/vendor/skills/generate-narration/avatar-voice.md +54 -0
  448. package/vendor/skills/generate-narration/bin/generate-narration.mjs +572 -0
  449. package/vendor/skills/generate-narration/engines.md +78 -0
  450. package/vendor/skills/generate-narration/reading-text.md +36 -0
  451. package/vendor/skills/generate-narration/voice-profile-setup.md +77 -0
  452. package/vendor/skills/harvest-asset/SKILL.md +132 -0
  453. package/vendor/skills/manage-connections/SKILL.md +75 -0
  454. package/vendor/skills/manage-connections/bin/doctor.mjs +341 -0
  455. package/vendor/skills/overlay-authoring/3d.md +143 -0
  456. package/vendor/skills/overlay-authoring/SKILL.md +30 -0
  457. package/vendor/skills/overlay-authoring/motion.md +58 -0
  458. package/vendor/skills/overlay-authoring/table.md +41 -0
  459. package/vendor/skills/overlay-authoring/telop.md +69 -0
  460. package/vendor/skills/overlay-authoring/text-behind-person.md +224 -0
  461. package/vendor/skills/overlay-authoring/thumbnail.md +126 -0
  462. package/vendor/skills/render-cut/SKILL.md +66 -0
  463. package/vendor/skills/research-plan/SKILL.md +75 -0
  464. package/vendor/skills/research-plan/competitor.md +50 -0
  465. package/vendor/skills/research-plan/ideate.md +56 -0
  466. package/vendor/skills/research-plan/shotlist.md +46 -0
  467. package/vendor/skills/research-plan/storyboard.md +48 -0
  468. package/vendor/skills/research-plan/trends.md +33 -0
  469. package/vendor/skills/setup-audio-library/SKILL.md +93 -0
  470. package/vendor/skills/setup-audio-library/candidate-list.md +72 -0
  471. package/vendor/skills/setup-audio-library/drop-folder.md +72 -0
  472. package/vendor/skills/setup-audio-library/gallery.md +43 -0
  473. package/vendor/skills/setup-library/SKILL.md +33 -0
  474. package/vendor/skills/setup-library/fetch-and-validate.md +102 -0
  475. package/vendor/skills/setup-library/starter-pack.md +55 -0
  476. package/vendor/skills/setup-library/tools-check.md +83 -0
  477. package/vendor/skills/verify/SKILL.md +137 -0
  478. package/vendor/templates/project-default/.akari/cache/.gitkeep +0 -0
  479. package/vendor/templates/project-default/.akari/connections.json +233 -0
  480. package/vendor/templates/project-default/.akari/diffs/.gitkeep +1 -0
  481. package/vendor/templates/project-default/.akari/events/.gitkeep +1 -0
  482. package/vendor/templates/project-default/.akari/reports/.gitkeep +0 -0
  483. package/vendor/templates/project-default/.akari/sidecars/.gitkeep +1 -0
  484. package/vendor/templates/project-default/.akari/work/.gitkeep +0 -0
  485. package/vendor/templates/project-default/.akari/workflow.json +48 -0
  486. package/vendor/templates/project-default/.claude/settings.json +15 -0
  487. package/vendor/templates/project-default/.claude/skills/README.md +26 -0
  488. package/vendor/templates/project-default/AGENTS.md +49 -0
  489. package/vendor/templates/project-default/CLAUDE.md +35 -0
  490. package/vendor/templates/project-default/assets/.gitkeep +1 -0
  491. package/vendor/templates/project-default/exports/.gitkeep +1 -0
  492. package/vendor/templates/project-default/planning/.gitkeep +1 -0
@@ -0,0 +1,799 @@
1
+ #!/usr/bin/env node
2
+
3
+ import fs from "node:fs/promises";
4
+ import path from "node:path";
5
+ import { fileURLToPath } from "node:url";
6
+
7
+ import {
8
+ buildProposals,
9
+ chooseProposalDecision,
10
+ proposalToAnnotation,
11
+ segmentUtterances,
12
+ } from "./core/compiler.mjs";
13
+ import {
14
+ buildMemoOnlyCanvasAnnotation,
15
+ isValidCanvasId,
16
+ validateCanvasManifest,
17
+ validateCanvasStroke,
18
+ } from "./core/canvas-compiler.mjs";
19
+ import {
20
+ appendAnnotationsAtomic,
21
+ writeAtomic,
22
+ writeJsonAtomic,
23
+ } from "./core/review-store.mjs";
24
+ import {
25
+ buildCutMap,
26
+ buildTimelineTrace,
27
+ parseEventsJsonl,
28
+ } from "./core/time-mapping.mjs";
29
+ import { transcribeAudio } from "./core/transcription.mjs";
30
+
31
+ const USAGE = [
32
+ "使い方:",
33
+ " node skills/compile-review-session/bin/compile-review-session.mjs <project-root>",
34
+ " [--session <s-XXXX> | --canvas <c-XXXX>] [--force] [--allow-cloud-stt] [--json]",
35
+ " [--prepare-only | --apply-proposals]",
36
+ " [--cloud-provider <scribe|groq> --cloud-approved]",
37
+ "",
38
+ " --session / --prepare-only / --apply-proposals / --cloud-provider / --cloud-approved は",
39
+ " review セッション(s-NNNN)専用。--canvas はキャンバス面(contract-2026-07-26-canvas-surface)",
40
+ " 専用で、指定しない場合は review/sessions と review/canvas の両方を対象にする。",
41
+ ].join("\n");
42
+
43
+ class CliError extends Error {}
44
+
45
+ function parseArguments(argv) {
46
+ const options = {
47
+ projectRoot: null,
48
+ session: null,
49
+ canvas: null,
50
+ force: false,
51
+ allowCloudStt: false,
52
+ json: false,
53
+ prepareOnly: false,
54
+ applyProposals: false,
55
+ cloudProvider: null,
56
+ cloudApproved: false,
57
+ };
58
+ for (let index = 0; index < argv.length; index += 1) {
59
+ const argument = argv[index];
60
+ if (argument === "--force") options.force = true;
61
+ else if (argument === "--help" || argument === "-h") {
62
+ process.stdout.write(`${USAGE}\n`);
63
+ process.exit(0);
64
+ }
65
+ else if (argument === "--allow-cloud-stt") options.allowCloudStt = true;
66
+ else if (argument === "--json") options.json = true;
67
+ else if (argument === "--prepare-only") options.prepareOnly = true;
68
+ else if (argument === "--apply-proposals") options.applyProposals = true;
69
+ else if (argument === "--cloud-approved") options.cloudApproved = true;
70
+ else if (argument === "--session" || argument === "--canvas" || argument === "--cloud-provider") {
71
+ const value = argv[index + 1];
72
+ if (!value || value.startsWith("--")) throw new CliError(`${argument} の値がありません`);
73
+ if (argument === "--session") options.session = value;
74
+ else if (argument === "--canvas") options.canvas = value;
75
+ else options.cloudProvider = value;
76
+ index += 1;
77
+ } else if (argument.startsWith("-")) {
78
+ throw new CliError(`不明なオプションです: ${argument}`);
79
+ } else if (options.projectRoot === null) {
80
+ options.projectRoot = path.resolve(argument);
81
+ } else {
82
+ throw new CliError("project-root は 1 つだけ指定してください");
83
+ }
84
+ }
85
+ if (!options.projectRoot) throw new CliError(USAGE);
86
+ if (options.session && options.canvas) {
87
+ throw new CliError("--session と --canvas は同時に指定できません");
88
+ }
89
+ if (options.prepareOnly && options.applyProposals) {
90
+ throw new CliError("--prepare-only と --apply-proposals は同時に指定できません");
91
+ }
92
+ if (options.canvas && (options.prepareOnly || options.applyProposals)) {
93
+ throw new CliError("--canvas は --prepare-only / --apply-proposals と併用できません(キャンバスに提案フェーズはありません)");
94
+ }
95
+ if (options.session && !/^s-\d{4,}$/.test(options.session)) {
96
+ throw new CliError("--session は s- + 4 桁以上の数字で指定してください");
97
+ }
98
+ if (options.canvas && !isValidCanvasId(options.canvas)) {
99
+ throw new CliError("--canvas は c- + 4 桁以上の数字で指定してください");
100
+ }
101
+ if (options.cloudProvider && !["scribe", "groq"].includes(options.cloudProvider)) {
102
+ throw new CliError("--cloud-provider は scribe または groq です");
103
+ }
104
+ if ((options.cloudProvider || options.cloudApproved) && !options.allowCloudStt) {
105
+ throw new CliError("クラウド指定には --allow-cloud-stt が必要です");
106
+ }
107
+ if (options.cloudApproved && !options.cloudProvider) {
108
+ throw new CliError("--cloud-approved には --cloud-provider が必要です");
109
+ }
110
+ return options;
111
+ }
112
+
113
+ function errorText(error) {
114
+ return error instanceof Error ? error.message : String(error);
115
+ }
116
+
117
+ function relativeAudioPath(sessionId, audio) {
118
+ return path.posix.join("review", "sessions", sessionId, String(audio).replaceAll("\\", "/"));
119
+ }
120
+
121
+ function ensureInside(parent, candidate, label) {
122
+ const relative = path.relative(parent, candidate);
123
+ if (relative.startsWith("..") || path.isAbsolute(relative)) {
124
+ throw new Error(`${label} がセッションディレクトリ外を指しています`);
125
+ }
126
+ }
127
+
128
+ async function readJson(file, label) {
129
+ let source;
130
+ try {
131
+ source = await fs.readFile(file, "utf8");
132
+ } catch (error) {
133
+ if (error?.code === "ENOENT") {
134
+ const notFound = new Error(`${label} がありません`);
135
+ notFound.code = "ENOENT";
136
+ throw notFound;
137
+ }
138
+ throw error;
139
+ }
140
+ try {
141
+ return JSON.parse(source);
142
+ } catch {
143
+ throw new Error(`${label} が有効な JSON ではありません`);
144
+ }
145
+ }
146
+
147
+ function validateTranscript(value) {
148
+ if (!value || typeof value.backend !== "string" || !Array.isArray(value.segments)) {
149
+ throw new Error("transcript.json の backend または segments が不正です");
150
+ }
151
+ for (const [index, segment] of value.segments.entries()) {
152
+ if (
153
+ !Number.isFinite(segment?.start)
154
+ || !Number.isFinite(segment?.end)
155
+ || segment.end <= segment.start
156
+ || typeof segment?.text !== "string"
157
+ || !Array.isArray(segment.words)
158
+ ) {
159
+ throw new Error(`transcript.json segments[${index}] が不正です`);
160
+ }
161
+ if (segment.words.length === 0 && segment.text.trim()) {
162
+ throw new Error(`transcript.json segments[${index}] に word 時刻がありません`);
163
+ }
164
+ }
165
+ return value;
166
+ }
167
+
168
+ function validStroke(stroke) {
169
+ return stroke
170
+ && /^st-\d{4,}$/.test(stroke.id)
171
+ && stroke.tool === "pen"
172
+ && stroke.space === "content-rect"
173
+ && Number.isFinite(stroke.recTStart)
174
+ && stroke.recTStart >= 0
175
+ && Number.isFinite(stroke.recTEnd)
176
+ && stroke.recTEnd >= stroke.recTStart
177
+ && Number.isFinite(stroke.frame?.timelineT)
178
+ && Number.isFinite(stroke.frame?.sourceT)
179
+ && (
180
+ stroke.frame?.cutIndex === null
181
+ || (Number.isInteger(stroke.frame?.cutIndex) && stroke.frame.cutIndex >= 0)
182
+ )
183
+ && Array.isArray(stroke.points)
184
+ && stroke.points.length >= 2
185
+ && stroke.points.every((point) => (
186
+ Array.isArray(point)
187
+ && point.length === 2
188
+ && point.every((value) => Number.isFinite(value) && value >= 0 && value <= 1)
189
+ ));
190
+ }
191
+
192
+ async function loadStrokes(sessionDirectory) {
193
+ const strokesPath = path.join(sessionDirectory, "strokes.json");
194
+ let document;
195
+ try {
196
+ document = await readJson(strokesPath, "strokes.json");
197
+ } catch (error) {
198
+ if (error?.code === "ENOENT") return { strokes: [], warnings: [] };
199
+ return {
200
+ strokes: [],
201
+ warnings: [`strokes.json を無視します: ${errorText(error)}`],
202
+ };
203
+ }
204
+ if (document?.version !== 1 || !Array.isArray(document.strokes)) {
205
+ return {
206
+ strokes: [],
207
+ warnings: ["strokes.json を無視します: version または strokes が不正です"],
208
+ };
209
+ }
210
+ const strokes = [];
211
+ const warnings = [];
212
+ for (const [index, stroke] of document.strokes.entries()) {
213
+ if (!validStroke(stroke)) {
214
+ warnings.push(`strokes.json strokes[${index}] をスキップ: stroke の形式が不正です`);
215
+ continue;
216
+ }
217
+ strokes.push(stroke);
218
+ }
219
+ return { strokes, warnings };
220
+ }
221
+
222
+ function markdown(value) {
223
+ return String(value ?? "").replaceAll("|", "\\|").replace(/\r?\n/g, " ");
224
+ }
225
+
226
+ function number(value) {
227
+ return Number.isFinite(value) ? value.toFixed(3) : "—";
228
+ }
229
+
230
+ function reportSource({
231
+ sessionId,
232
+ backend,
233
+ proposals = [],
234
+ landed = [],
235
+ discarded = [],
236
+ warnings = [],
237
+ unavailableReasons = [],
238
+ mode,
239
+ recompile,
240
+ error = null,
241
+ }) {
242
+ const needsConfirmation = landed.filter((entry) => entry.annotation.session.confidence === "low");
243
+ const lines = [
244
+ `# ${sessionId} コンパイルレポート`,
245
+ "",
246
+ `- 結果: ${error ? "拒否 / スキップ" : mode === "prepare" ? "判断待ち" : "コンパイル済み"}`,
247
+ `- 実行: ${recompile ? "再コンパイル(既存 annotation は保持)" : "初回コンパイル"}`,
248
+ `- 文字起こし backend: \`${backend ?? "未取得"}\``,
249
+ `- 集計: 発話 ${proposals.length} 件 → annotation ${landed.length} 件(要確認 ${needsConfirmation.length} 件)・破棄 ${discarded.length} 件`,
250
+ "",
251
+ "## 役割分担",
252
+ "",
253
+ "- bin: STT、無音 + 文境界の発話区切り、recT→timelineT→sourceT、cut hit、暫定採否、原子的追記を決定的に処理する。",
254
+ mode === "agent-reviewed"
255
+ ? "- エージェント: compile-proposals.json の発話原文・参照候補・暫定判定を確認し、decision を確定して着地した。"
256
+ : mode === "prepare"
257
+ ? "- エージェント: compile-proposals.json の decision を確定してから --apply-proposals を実行する(この段階では未着地)。"
258
+ : "- エージェント: 自動一括モードの暫定判定が着地しているため、本レポートと原文をレビューし、曖昧なものを黙殺しない。",
259
+ ];
260
+ if (error) {
261
+ lines.push("", "## 拒否 / スキップ理由", "", `- ${markdown(error)}`);
262
+ }
263
+ if (landed.length > 0) {
264
+ lines.push(
265
+ "",
266
+ "## 着地した annotation",
267
+ "",
268
+ "| id | recT | sourceT | target | 解決法 | confidence | text |",
269
+ "|---|---:|---:|---|---|---|---|",
270
+ );
271
+ for (const entry of landed) {
272
+ const { annotation, proposal } = entry;
273
+ lines.push(
274
+ `| ${annotation.id} | ${number(annotation.session.recRange[0])}–${number(annotation.session.recRange[1])}`
275
+ + ` | ${number(annotation.sourceT)} | ${markdown(annotation.target)}`
276
+ + ` | ${markdown(proposal.reference.resolutionMethod)} | ${annotation.session.confidence}`
277
+ + ` | ${markdown(annotation.text)} |`,
278
+ );
279
+ }
280
+ }
281
+ if (needsConfirmation.length > 0) {
282
+ lines.push("", "## 要確認", "");
283
+ for (const { annotation } of needsConfirmation) {
284
+ lines.push(`- ${annotation.id}: ${markdown(annotation.text)}`);
285
+ }
286
+ }
287
+ lines.push("", "## 破棄した発話", "");
288
+ if (discarded.length === 0) {
289
+ lines.push("- なし");
290
+ } else {
291
+ for (const item of discarded) {
292
+ lines.push(
293
+ `- recT ${number(item.proposal.recRange[0])}–${number(item.proposal.recRange[1])}`
294
+ + `「${markdown(item.proposal.transcript)}」— ${markdown(item.decision.reason)}`,
295
+ );
296
+ }
297
+ }
298
+ if (unavailableReasons.length > 0) {
299
+ lines.push("", "## 文字起こしの劣化", "");
300
+ for (const reason of unavailableReasons) lines.push(`- ${markdown(reason)}`);
301
+ if (backend === "unavailable") {
302
+ lines.push("- 発話ゼロは「発話なし」の断定ではなく、文字起こし未取得として扱う。");
303
+ }
304
+ }
305
+ if (warnings.length > 0) {
306
+ lines.push("", "## warning", "");
307
+ for (const warning of warnings) lines.push(`- ${markdown(warning)}`);
308
+ }
309
+ return `${lines.join("\n")}\n`;
310
+ }
311
+
312
+ async function writeFailureReport(sessionDirectory, sessionId, message, recompile = false) {
313
+ await writeAtomic(path.join(sessionDirectory, "compile-report.md"), reportSource({
314
+ sessionId,
315
+ backend: null,
316
+ warnings: [],
317
+ unavailableReasons: [],
318
+ mode: "automatic",
319
+ recompile,
320
+ error: message,
321
+ }));
322
+ }
323
+
324
+ async function loadOrCreateTranscript({
325
+ transcriptPath,
326
+ session,
327
+ sessionPath,
328
+ sessionDirectory,
329
+ options,
330
+ repoRoot,
331
+ }) {
332
+ const warnings = [];
333
+ try {
334
+ const transcript = validateTranscript(await readJson(transcriptPath, "transcript.json"));
335
+ return { transcript, created: false, warnings };
336
+ } catch (error) {
337
+ if (error?.code !== "ENOENT") {
338
+ warnings.push(`transcript.json のスキーマが不正なため再文字起こしします: ${errorText(error)}`);
339
+ }
340
+ }
341
+
342
+ const audioPath = path.resolve(sessionDirectory, session.audio ?? "audio.wav");
343
+ ensureInside(sessionDirectory, audioPath, "session.audio");
344
+ const stat = await fs.stat(audioPath).catch(() => null);
345
+ if (!stat?.isFile()) throw new Error("session.audio の音声ファイルがありません");
346
+ const transcript = await transcribeAudio({
347
+ audioPath,
348
+ projectRoot: options.projectRoot,
349
+ repoRoot,
350
+ allowCloudStt: options.allowCloudStt,
351
+ cloudProvider: options.cloudProvider,
352
+ cloudApproved: options.cloudApproved,
353
+ });
354
+ const stored = {
355
+ version: 1,
356
+ backend: transcript.backend,
357
+ provenance: transcript.provenance ?? { backend: transcript.backend },
358
+ segments: transcript.segments,
359
+ ...(transcript.reasons?.length ? { unavailableReasons: transcript.reasons } : {}),
360
+ ...(transcript.decisionCard ? { decisionCard: transcript.decisionCard } : {}),
361
+ };
362
+ await writeJsonAtomic(transcriptPath, stored);
363
+ if (session.status === "recorded") {
364
+ session.status = "transcribed";
365
+ await writeJsonAtomic(sessionPath, session);
366
+ }
367
+ return { transcript: validateTranscript(stored), created: true, warnings };
368
+ }
369
+
370
+ async function compileSession({ sessionId, sessionDirectory, options, repoRoot }) {
371
+ const sessionPath = path.join(sessionDirectory, "session.json");
372
+ let session;
373
+ try {
374
+ session = await readJson(sessionPath, "session.json");
375
+ } catch (error) {
376
+ const message = errorText(error);
377
+ await writeFailureReport(sessionDirectory, sessionId, message);
378
+ return { sessionId, status: "skipped", reason: message };
379
+ }
380
+ if (!session || session.id !== sessionId) {
381
+ const message = `session.json の id (${session?.id ?? "なし"}) がディレクトリ名と一致しません`;
382
+ await writeFailureReport(sessionDirectory, sessionId, message);
383
+ return { sessionId, status: "skipped", reason: message };
384
+ }
385
+ const recompile = session.status === "compiled";
386
+ if (recompile && !options.force) {
387
+ return { sessionId, status: "skipped", reason: "既に compiled のためスキップ" };
388
+ }
389
+
390
+ const snapshotPath = path.resolve(sessionDirectory, session.editSnapshot ?? "edit.snapshot.json");
391
+ ensureInside(sessionDirectory, snapshotPath, "session.editSnapshot");
392
+ let snapshot;
393
+ try {
394
+ snapshot = await readJson(snapshotPath, "edit.snapshot.json");
395
+ } catch (error) {
396
+ const message = `コンパイル拒否: ${errorText(error)}。sourceT への写像を推測しません`;
397
+ await writeFailureReport(sessionDirectory, sessionId, message, recompile);
398
+ return { sessionId, status: "rejected", reason: message };
399
+ }
400
+
401
+ try {
402
+ const eventsPath = path.join(sessionDirectory, "events.jsonl");
403
+ const eventsSource = await fs.readFile(eventsPath, "utf8");
404
+ const parsedEvents = parseEventsJsonl(eventsSource);
405
+ const parsedStrokes = await loadStrokes(sessionDirectory);
406
+ const trace = buildTimelineTrace(parsedEvents.events);
407
+ const cutMap = buildCutMap(snapshot);
408
+ const transcriptPath = path.join(sessionDirectory, "transcript.json");
409
+ const { transcript, warnings: transcriptWarnings } = await loadOrCreateTranscript({
410
+ transcriptPath,
411
+ session,
412
+ sessionPath,
413
+ sessionDirectory,
414
+ options,
415
+ repoRoot,
416
+ });
417
+ const utterances = segmentUtterances(transcript.segments);
418
+ let proposals;
419
+ const proposalPath = path.join(sessionDirectory, "compile-proposals.json");
420
+ if (options.applyProposals) {
421
+ const prepared = await readJson(proposalPath, "compile-proposals.json");
422
+ if (prepared?.sessionId !== sessionId || !Array.isArray(prepared.proposals)) {
423
+ throw new Error("compile-proposals.json がこのセッションの提案ではありません");
424
+ }
425
+ proposals = prepared.proposals;
426
+ for (const proposal of proposals) {
427
+ if (
428
+ !proposal?.decision
429
+ || !["annotate", "discard"].includes(proposal.decision.action)
430
+ || !["high", "low"].includes(proposal.decision.confidence)
431
+ || typeof proposal.decision.reason !== "string"
432
+ || !proposal.decision.reason.trim()
433
+ || (
434
+ proposal.decision.action === "annotate"
435
+ && (typeof proposal.decision.text !== "string" || !proposal.decision.text.trim())
436
+ )
437
+ ) {
438
+ throw new Error(
439
+ `compile-proposals.json proposals[${proposal?.index ?? "?"}].decision を確定してください`,
440
+ );
441
+ }
442
+ }
443
+ } else {
444
+ proposals = buildProposals({ utterances, trace, cutMap, strokes: parsedStrokes.strokes });
445
+ }
446
+
447
+ const warnings = [
448
+ ...parsedEvents.warnings,
449
+ ...parsedStrokes.warnings,
450
+ ...transcriptWarnings,
451
+ ];
452
+ const unavailableReasons = Array.isArray(transcript.unavailableReasons)
453
+ ? transcript.unavailableReasons
454
+ : [];
455
+ if (options.prepareOnly) {
456
+ await writeJsonAtomic(proposalPath, {
457
+ version: 1,
458
+ sessionId,
459
+ backend: transcript.backend,
460
+ proposals,
461
+ });
462
+ await writeAtomic(path.join(sessionDirectory, "compile-report.md"), reportSource({
463
+ sessionId,
464
+ backend: transcript.backend,
465
+ proposals,
466
+ warnings,
467
+ unavailableReasons,
468
+ mode: "prepare",
469
+ recompile,
470
+ }));
471
+ return {
472
+ sessionId,
473
+ status: "prepared",
474
+ utterances: proposals.length,
475
+ proposalPath,
476
+ };
477
+ }
478
+
479
+ const discarded = [];
480
+ const pending = [];
481
+ for (const proposal of proposals) {
482
+ const decision = chooseProposalDecision(proposal);
483
+ if (decision.action === "discard") {
484
+ discarded.push({ proposal, decision });
485
+ } else {
486
+ pending.push({
487
+ proposal,
488
+ decision,
489
+ annotation: proposalToAnnotation({
490
+ proposal,
491
+ decision,
492
+ sessionId,
493
+ audioPath: relativeAudioPath(sessionId, session.audio ?? "audio.wav"),
494
+ createdAt: new Date().toISOString(),
495
+ }),
496
+ });
497
+ }
498
+ }
499
+ const assigned = await appendAnnotationsAtomic(
500
+ path.join(options.projectRoot, "review.json"),
501
+ pending.map((entry) => entry.annotation),
502
+ );
503
+ const landed = pending.map((entry, index) => ({
504
+ ...entry,
505
+ annotation: assigned[index],
506
+ }));
507
+ const previousIds = Array.isArray(session.compiledAnnotations) ? session.compiledAnnotations : [];
508
+ session.status = "compiled";
509
+ session.compiledAnnotations = [...previousIds, ...assigned.map((annotation) => annotation.id)];
510
+ await writeJsonAtomic(sessionPath, session);
511
+ await writeAtomic(path.join(sessionDirectory, "compile-report.md"), reportSource({
512
+ sessionId,
513
+ backend: transcript.backend,
514
+ proposals,
515
+ landed,
516
+ discarded,
517
+ warnings,
518
+ unavailableReasons,
519
+ mode: options.applyProposals ? "agent-reviewed" : "automatic",
520
+ recompile,
521
+ }));
522
+ return {
523
+ sessionId,
524
+ status: "compiled",
525
+ recompiled: recompile,
526
+ backend: transcript.backend,
527
+ utterances: proposals.length,
528
+ annotations: assigned.map((annotation) => ({
529
+ id: annotation.id,
530
+ sourceT: annotation.sourceT,
531
+ target: annotation.target,
532
+ confidence: annotation.session.confidence,
533
+ })),
534
+ discarded: discarded.length,
535
+ needsConfirmation: assigned.filter((annotation) => annotation.session.confidence === "low").length,
536
+ };
537
+ } catch (error) {
538
+ const message = errorText(error);
539
+ await writeFailureReport(sessionDirectory, sessionId, message, recompile);
540
+ return { sessionId, status: "failed", reason: message };
541
+ }
542
+ }
543
+
544
+ async function sessionIds(options) {
545
+ if (options.canvas) return [];
546
+ const sessionsRoot = path.join(options.projectRoot, "review", "sessions");
547
+ if (options.session) return [options.session];
548
+ let entries;
549
+ try {
550
+ entries = await fs.readdir(sessionsRoot, { withFileTypes: true });
551
+ } catch (error) {
552
+ if (error?.code === "ENOENT") return [];
553
+ throw error;
554
+ }
555
+ return entries
556
+ .filter((entry) => entry.isDirectory() && /^s-\d{4,}$/.test(entry.name))
557
+ .map((entry) => entry.name)
558
+ .sort();
559
+ }
560
+
561
+ function canvasReportSource({ canvasId, landedAnnotation, warnings = [], recompile, error = null }) {
562
+ const lines = [
563
+ `# ${canvasId} コンパイルレポート`,
564
+ "",
565
+ `- 結果: ${error ? "拒否 / スキップ" : "コンパイル済み"}`,
566
+ `- 実行: ${recompile ? "再コンパイル(既存 annotation は保持)" : "初回コンパイル"}`,
567
+ "- モード: no-audio-memo(v0 は録音なし・strokes + メモを 1 annotation に集約)",
568
+ ];
569
+ if (error) {
570
+ lines.push("", "## 拒否 / スキップ理由", "", `- ${markdown(error)}`);
571
+ }
572
+ if (landedAnnotation) {
573
+ lines.push(
574
+ "",
575
+ "## 着地した annotation",
576
+ "",
577
+ `- ${landedAnnotation.id}: target=${markdown(landedAnnotation.target)}`
578
+ + ` strokes=${landedAnnotation.strokes?.length ?? 0} 本`,
579
+ ` text: ${markdown(landedAnnotation.text)}`,
580
+ );
581
+ }
582
+ if (warnings.length > 0) {
583
+ lines.push("", "## warning", "");
584
+ for (const warning of warnings) lines.push(`- ${markdown(warning)}`);
585
+ }
586
+ return `${lines.join("\n")}\n`;
587
+ }
588
+
589
+ async function writeCanvasFailureReport(canvasDirectory, canvasId, message, recompile = false) {
590
+ await writeAtomic(path.join(canvasDirectory, "compile-report.md"), canvasReportSource({
591
+ canvasId,
592
+ warnings: [],
593
+ recompile,
594
+ error: message,
595
+ }));
596
+ }
597
+
598
+ async function loadCanvasStrokes(canvasDirectory) {
599
+ const strokesPath = path.join(canvasDirectory, "strokes.json");
600
+ let document;
601
+ try {
602
+ document = await readJson(strokesPath, "strokes.json");
603
+ } catch (error) {
604
+ if (error?.code === "ENOENT") return { strokes: [], warnings: [] };
605
+ throw new Error(`strokes.json を読めません: ${errorText(error)}`);
606
+ }
607
+ if (document?.version !== 1 || !Array.isArray(document.strokes)) {
608
+ throw new Error("strokes.json の version または strokes が不正です");
609
+ }
610
+ const strokes = [];
611
+ const warnings = [];
612
+ for (const [index, stroke] of document.strokes.entries()) {
613
+ if (!validateCanvasStroke(stroke)) {
614
+ warnings.push(`strokes.json strokes[${index}] をスキップ: stroke の形式が不正です`);
615
+ continue;
616
+ }
617
+ strokes.push(stroke);
618
+ }
619
+ return { strokes, warnings };
620
+ }
621
+
622
+ /**
623
+ * キャンバス面(contract-2026-07-26-canvas-surface)のコンパイル。session と異なり timeline/cuts が
624
+ * 無いため参照解決は不要 — target は常に `canvas:<id>` に固定される。v0 は録音なし(audio は常に
625
+ * null)のため strokes + メモを 1 annotation に集約する経路のみを実装する(report.md §調査「録音
626
+ * 流用」参照。audio 付きキャンバスに遭遇した場合は黙って処理せず明示的に拒否として報告する)。
627
+ */
628
+ async function compileCanvas({ canvasId, canvasDirectory, options }) {
629
+ const canvasPath = path.join(canvasDirectory, "canvas.json");
630
+ let rawManifest;
631
+ try {
632
+ rawManifest = await readJson(canvasPath, "canvas.json");
633
+ } catch (error) {
634
+ const message = errorText(error);
635
+ await writeCanvasFailureReport(canvasDirectory, canvasId, message);
636
+ return { canvasId, status: "skipped", reason: message };
637
+ }
638
+ const manifest = validateCanvasManifest(rawManifest);
639
+ if (!manifest || manifest.id !== canvasId) {
640
+ const message = "canvas.json の形式、または id がディレクトリ名と一致しません";
641
+ await writeCanvasFailureReport(canvasDirectory, canvasId, message);
642
+ return { canvasId, status: "skipped", reason: message };
643
+ }
644
+ const recompile = manifest.status === "compiled";
645
+ if (recompile && !options.force) {
646
+ return { canvasId, status: "skipped", reason: "既に compiled のためスキップ" };
647
+ }
648
+ if (manifest.audio) {
649
+ const message = "audio 付きキャンバスのコンパイルは本バージョンで未実装です(v0 は録音なしのみ)";
650
+ await writeCanvasFailureReport(canvasDirectory, canvasId, message, recompile);
651
+ return { canvasId, status: "rejected", reason: message };
652
+ }
653
+
654
+ let strokes;
655
+ let warnings;
656
+ try {
657
+ const loaded = await loadCanvasStrokes(canvasDirectory);
658
+ strokes = loaded.strokes;
659
+ warnings = loaded.warnings;
660
+ } catch (error) {
661
+ // 契約 §6: strokes.json が壊れている → コンパイル拒否(推測着地はしない)。
662
+ const message = `コンパイル拒否: ${errorText(error)}`;
663
+ await writeCanvasFailureReport(canvasDirectory, canvasId, message, recompile);
664
+ return { canvasId, status: "rejected", reason: message };
665
+ }
666
+
667
+ const memo = typeof manifest.memo === "string" ? manifest.memo : null;
668
+ if (strokes.length === 0 && !(memo && memo.trim())) {
669
+ const message = "strokes も memo も無いため着地する内容がありません";
670
+ await writeCanvasFailureReport(canvasDirectory, canvasId, message, recompile);
671
+ return { canvasId, status: "rejected", reason: message };
672
+ }
673
+
674
+ const annotation = buildMemoOnlyCanvasAnnotation({
675
+ canvasId,
676
+ strokes,
677
+ memo,
678
+ createdAt: new Date().toISOString(),
679
+ });
680
+ const assigned = await appendAnnotationsAtomic(
681
+ path.join(options.projectRoot, "review.json"),
682
+ [annotation],
683
+ );
684
+ const landedAnnotation = assigned[0];
685
+
686
+ const previousIds = Array.isArray(manifest.compiledAnnotations) ? manifest.compiledAnnotations : [];
687
+ const updatedManifest = {
688
+ ...manifest,
689
+ status: "compiled",
690
+ compiledAnnotations: [...previousIds, landedAnnotation.id],
691
+ };
692
+ await writeJsonAtomic(canvasPath, updatedManifest);
693
+ await writeAtomic(path.join(canvasDirectory, "compile-report.md"), canvasReportSource({
694
+ canvasId,
695
+ landedAnnotation,
696
+ warnings,
697
+ recompile,
698
+ }));
699
+
700
+ return {
701
+ canvasId,
702
+ status: "compiled",
703
+ recompiled: recompile,
704
+ annotations: [{ id: landedAnnotation.id, target: landedAnnotation.target }],
705
+ };
706
+ }
707
+
708
+ async function canvasIds(options) {
709
+ if (options.session) return [];
710
+ if (options.canvas) return [options.canvas];
711
+ const canvasRoot = path.join(options.projectRoot, "review", "canvas");
712
+ let entries;
713
+ try {
714
+ entries = await fs.readdir(canvasRoot, { withFileTypes: true });
715
+ } catch (error) {
716
+ if (error?.code === "ENOENT") return [];
717
+ throw error;
718
+ }
719
+ return entries
720
+ .filter((entry) => entry.isDirectory() && /^c-\d{4,}$/.test(entry.name))
721
+ .map((entry) => entry.name)
722
+ .sort();
723
+ }
724
+
725
+ async function main() {
726
+ let options;
727
+ try {
728
+ options = parseArguments(process.argv.slice(2));
729
+ } catch (error) {
730
+ process.stderr.write(`${errorText(error)}\n${USAGE}\n`);
731
+ process.exitCode = 2;
732
+ return;
733
+ }
734
+ const scriptDirectory = path.dirname(fileURLToPath(import.meta.url));
735
+ const repoRoot = path.resolve(scriptDirectory, "../../..");
736
+ const ids = await sessionIds(options);
737
+ const results = [];
738
+ for (const sessionId of ids) {
739
+ const directory = path.join(options.projectRoot, "review", "sessions", sessionId);
740
+ results.push({
741
+ kind: "session",
742
+ ...(await compileSession({
743
+ sessionId,
744
+ sessionDirectory: directory,
745
+ options,
746
+ repoRoot,
747
+ })),
748
+ });
749
+ }
750
+ const canvasIdList = await canvasIds(options);
751
+ for (const canvasId of canvasIdList) {
752
+ const directory = path.join(options.projectRoot, "review", "canvas", canvasId);
753
+ results.push({
754
+ kind: "canvas",
755
+ ...(await compileCanvas({ canvasId, canvasDirectory: directory, options })),
756
+ });
757
+ }
758
+ const summary = {
759
+ projectRoot: options.projectRoot,
760
+ force: options.force,
761
+ mode: options.prepareOnly ? "prepare" : options.applyProposals ? "apply-proposals" : "automatic",
762
+ results,
763
+ totals: {
764
+ sessions: results.filter((result) => result.kind === "session").length,
765
+ canvases: results.filter((result) => result.kind === "canvas").length,
766
+ compiled: results.filter((result) => result.status === "compiled").length,
767
+ prepared: results.filter((result) => result.status === "prepared").length,
768
+ skipped: results.filter((result) => result.status === "skipped").length,
769
+ rejected: results.filter((result) => result.status === "rejected").length,
770
+ failed: results.filter((result) => result.status === "failed").length,
771
+ annotations: results.reduce((sum, result) => sum + (result.annotations?.length ?? 0), 0),
772
+ discarded: results.reduce((sum, result) => sum + (result.discarded ?? 0), 0),
773
+ },
774
+ };
775
+ if (options.json) {
776
+ process.stdout.write(`${JSON.stringify(summary)}\n`);
777
+ } else {
778
+ for (const result of results) {
779
+ const label = result.sessionId ?? result.canvasId;
780
+ const detail = result.reason
781
+ ?? (result.annotations
782
+ ? `annotation ${result.annotations.length} 件${result.discarded !== undefined ? ` / 破棄 ${result.discarded} 件` : ""}`
783
+ : "");
784
+ process.stdout.write(`${label}: ${result.status}${detail ? ` — ${detail}` : ""}\n`);
785
+ }
786
+ process.stdout.write(
787
+ `集計: sessions=${summary.totals.sessions}, canvases=${summary.totals.canvases}, compiled=${summary.totals.compiled},`
788
+ + ` annotations=${summary.totals.annotations}, discarded=${summary.totals.discarded},`
789
+ + ` skipped=${summary.totals.skipped}, rejected=${summary.totals.rejected}, failed=${summary.totals.failed}\n`,
790
+ );
791
+ }
792
+ const successCount = summary.totals.compiled + summary.totals.prepared + summary.totals.skipped;
793
+ if (successCount === 0 && summary.totals.rejected + summary.totals.failed > 0) process.exitCode = 1;
794
+ }
795
+
796
+ main().catch((error) => {
797
+ process.stderr.write(`${errorText(error)}\n`);
798
+ process.exitCode = 2;
799
+ });