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,185 @@
1
+ #!/usr/bin/env node
2
+
3
+ // intake.json v0 の構造を、Node.js 組み込み機能だけで検証する。
4
+
5
+ import fs from "node:fs";
6
+ import path from "node:path";
7
+ import { fileURLToPath } from "node:url";
8
+
9
+ const usage = "使い方: node packages/schemas/bin/validate-intake.mjs <intake.json>";
10
+ const intakeArgument = process.argv[2];
11
+
12
+ if (!intakeArgument || process.argv.length !== 3) {
13
+ console.error(usage);
14
+ process.exit(2);
15
+ }
16
+
17
+ if (intakeArgument === "--help" || intakeArgument === "-h") {
18
+ console.log(usage);
19
+ process.exit(0);
20
+ }
21
+
22
+ const TASK_IDS = ["transcribe-captions", "silence-cut", "bgm-sfx", "narration", "3d-inserts"];
23
+ const AUTONOMY_VALUES = ["full-auto", "checkpoint", "collaborative"];
24
+ const STATUS_VALUES = ["draft", "submitted"];
25
+ const ROOT_FIELDS = ["version", "tasks", "target", "autonomy", "status", "submitted_at"];
26
+ const TARGET_REQUIRED_FIELDS = ["duration_s", "keep_length"];
27
+ const TARGET_FIELDS = ["duration_s", "keep_length", "taste"];
28
+
29
+ const intakePath = path.resolve(intakeArgument);
30
+ const schemaPath = fileURLToPath(new URL("../intake.schema.json", import.meta.url));
31
+ const errors = [];
32
+
33
+ if (!isRegularFile(intakePath)) {
34
+ fail(`intake.json が見つかりません: ${intakePath}`);
35
+ finish();
36
+ }
37
+
38
+ let schema;
39
+ try {
40
+ schema = JSON.parse(fs.readFileSync(schemaPath, "utf8"));
41
+ } catch (error) {
42
+ fail(`intake.schema.json を JSON として読めません: ${messageOf(error)}`);
43
+ finish();
44
+ }
45
+ if (schema.$id !== "urn:akari-video:schema:intake:v0") {
46
+ fail("intake.schema.json の $id が v0 契約と一致しません");
47
+ finish();
48
+ }
49
+
50
+ let intake;
51
+ try {
52
+ intake = JSON.parse(fs.readFileSync(intakePath, "utf8"));
53
+ } catch (error) {
54
+ fail(`intake.json を JSON として読めません: ${messageOf(error)}`);
55
+ finish();
56
+ }
57
+
58
+ validateIntake(intake);
59
+ finish();
60
+
61
+ function validateIntake(value) {
62
+ if (!isPlainObject(value)) {
63
+ fail("intake.json のルートは object である必要があります");
64
+ return;
65
+ }
66
+ validateFields(value, ROOT_FIELDS, ROOT_FIELDS, "ルート");
67
+
68
+ if (value.version !== 1) {
69
+ fail("version は 1 である必要があります");
70
+ }
71
+ validateTasks(value.tasks);
72
+ validateTarget(value.target);
73
+ validateEnum(value.autonomy, AUTONOMY_VALUES, "autonomy");
74
+ validateEnum(value.status, STATUS_VALUES, "status");
75
+ validateSubmittedAt(value.status, value.submitted_at);
76
+ }
77
+
78
+ function validateTasks(value) {
79
+ if (!Array.isArray(value)) {
80
+ fail("tasks は配列である必要があります");
81
+ return;
82
+ }
83
+ const seen = new Set();
84
+ for (const [index, item] of value.entries()) {
85
+ const label = `tasks[${index}]`;
86
+ if (typeof item !== "string" || !TASK_IDS.includes(item)) {
87
+ fail(`${label} は ${TASK_IDS.join(" / ")} のいずれかである必要があります`);
88
+ continue;
89
+ }
90
+ if (seen.has(item)) fail(`tasks に重複があります: ${item}`);
91
+ seen.add(item);
92
+ }
93
+ }
94
+
95
+ function validateTarget(value) {
96
+ if (!isPlainObject(value)) {
97
+ fail("target は object である必要があります");
98
+ return;
99
+ }
100
+ validateFields(value, TARGET_REQUIRED_FIELDS, TARGET_FIELDS, "target");
101
+
102
+ const hasDuration = value.duration_s !== null && value.duration_s !== undefined;
103
+ if (hasDuration && !(isFiniteNumber(value.duration_s) && value.duration_s > 0)) {
104
+ fail("target.duration_s は null または正の有限数である必要があります");
105
+ }
106
+ if (hasOwn(value, "keep_length") && typeof value.keep_length !== "boolean") {
107
+ fail("target.keep_length は真偽値である必要があります");
108
+ }
109
+ if (hasDuration && value.keep_length === true) {
110
+ fail("target.duration_s と target.keep_length: true は同時に指定できません(排他)");
111
+ }
112
+ if (hasOwn(value, "taste") && value.taste !== null && typeof value.taste !== "string") {
113
+ fail("target.taste は null または文字列である必要があります");
114
+ }
115
+ }
116
+
117
+ function validateSubmittedAt(status, value) {
118
+ if (status === "submitted") {
119
+ if (typeof value !== "string" || !isIsoDateTime(value)) {
120
+ fail("status が submitted のとき submitted_at は ISO 8601 日時である必要があります");
121
+ }
122
+ } else if (status === "draft") {
123
+ if (value !== null) {
124
+ fail("status が draft のとき submitted_at は null である必要があります");
125
+ }
126
+ }
127
+ }
128
+
129
+ function validateFields(value, required, allowed, label) {
130
+ for (const field of required) {
131
+ if (!hasOwn(value, field)) fail(`${label}.${field} は必須です`);
132
+ }
133
+ for (const field of Object.keys(value)) {
134
+ if (!allowed.includes(field)) fail(`${label}.${field} は未定義のフィールドです`);
135
+ }
136
+ }
137
+
138
+ function validateEnum(value, allowed, label) {
139
+ if (typeof value !== "string" || !allowed.includes(value)) {
140
+ fail(`${label} は ${allowed.join(" / ")} のいずれかである必要があります`);
141
+ }
142
+ }
143
+
144
+ function isIsoDateTime(value) {
145
+ const timestamp = Date.parse(value);
146
+ return Number.isFinite(timestamp) && /^\d{4}-\d{2}-\d{2}T/.test(value);
147
+ }
148
+
149
+ function isRegularFile(filePath) {
150
+ try {
151
+ return fs.statSync(filePath).isFile();
152
+ } catch {
153
+ return false;
154
+ }
155
+ }
156
+
157
+ function isPlainObject(value) {
158
+ return value !== null && typeof value === "object" && !Array.isArray(value);
159
+ }
160
+
161
+ function isFiniteNumber(value) {
162
+ return typeof value === "number" && Number.isFinite(value);
163
+ }
164
+
165
+ function hasOwn(value, key) {
166
+ return Object.prototype.hasOwnProperty.call(value, key);
167
+ }
168
+
169
+ function messageOf(error) {
170
+ return error instanceof Error ? error.message : String(error);
171
+ }
172
+
173
+ function fail(message) {
174
+ errors.push(message);
175
+ }
176
+
177
+ function finish() {
178
+ if (errors.length > 0) {
179
+ console.error(`NG: ${intakePath}`);
180
+ for (const error of errors) console.error(`- ${error}`);
181
+ process.exit(1);
182
+ }
183
+ console.log(`OK: ${intakePath}`);
184
+ process.exit(0);
185
+ }
@@ -0,0 +1,515 @@
1
+ #!/usr/bin/env node
2
+
3
+ // interpretation.json v0(複数素材を横断する解釈層)の構造と、JSON Schema 単体では表せない
4
+ // 参照・意味制約(evidence 必須・省略 vs null・start/end の対関係・ダングリング参照)を検証する。
5
+
6
+ import fs from "node:fs";
7
+ import path from "node:path";
8
+ import { fileURLToPath } from "node:url";
9
+
10
+ const usage = "使い方: node packages/schemas/bin/validate-interpretation.mjs <interpretation.json>";
11
+ const interpretationArgument = process.argv[2];
12
+
13
+ if (!interpretationArgument || process.argv.length !== 3) {
14
+ console.error(usage);
15
+ process.exit(2);
16
+ }
17
+
18
+ if (interpretationArgument === "--help" || interpretationArgument === "-h") {
19
+ console.log(usage);
20
+ process.exit(0);
21
+ }
22
+
23
+ const interpretationPath = path.resolve(interpretationArgument);
24
+ const schemaPath = fileURLToPath(new URL("../interpretation.schema.json", import.meta.url));
25
+ const errors = [];
26
+
27
+ const FLAG_TYPES = new Set(["orphan", "unclear", "trouble_overlap"]);
28
+ const OPEN_QUESTION_STATUSES = new Set(["open", "answered"]);
29
+
30
+ if (!isRegularFile(interpretationPath)) {
31
+ fail(`interpretation.json が見つかりません: ${interpretationPath}`);
32
+ finish();
33
+ }
34
+
35
+ let schema;
36
+ try {
37
+ schema = JSON.parse(fs.readFileSync(schemaPath, "utf8"));
38
+ } catch (error) {
39
+ fail(`interpretation.schema.json を JSON として読めません: ${messageOf(error)}`);
40
+ finish();
41
+ }
42
+ if (schema.$id !== "urn:akari-video:schema:interpretation:v0") {
43
+ fail("interpretation.schema.json の $id が v0 契約と一致しません");
44
+ finish();
45
+ }
46
+
47
+ let interpretation;
48
+ try {
49
+ interpretation = JSON.parse(fs.readFileSync(interpretationPath, "utf8"));
50
+ } catch (error) {
51
+ fail(`interpretation.json を JSON として読めません: ${messageOf(error)}`);
52
+ finish();
53
+ }
54
+
55
+ validateInterpretation(interpretation);
56
+ finish();
57
+
58
+ function validateInterpretation(value) {
59
+ if (!isPlainObject(value)) {
60
+ fail("interpretation.json のルートは object である必要があります");
61
+ return;
62
+ }
63
+ if (Number.isInteger(value.version) && value.version > 0) {
64
+ fail(
65
+ `version ${value.version} は新しすぎるため検証できません。このファイルは新しい形式です。スキル / アプリを更新してください`,
66
+ );
67
+ return;
68
+ }
69
+ if (value.version !== 0) {
70
+ fail("version は 0 である必要があります");
71
+ return;
72
+ }
73
+
74
+ const rootFields = ["version", "inputs", "assets", "arc", "open_questions"];
75
+ for (const field of rootFields) {
76
+ if (!hasOwn(value, field)) fail(`${field} は必須です`);
77
+ }
78
+ rejectUnknownFields(value, rootFields, "ルート");
79
+
80
+ const analysisRefs = validateInputs(value.inputs);
81
+ const assetRefs = validateAssets(value.assets);
82
+ validateAnalysesAssetCorrespondence(analysisRefs, assetRefs);
83
+ validateArc(value.arc, assetRefs);
84
+ validateOpenQuestions(value.open_questions);
85
+ }
86
+
87
+ function validateInputs(value) {
88
+ const analysisRefs = new Set();
89
+ if (!isPlainObject(value)) {
90
+ fail("inputs は object である必要があります");
91
+ return analysisRefs;
92
+ }
93
+ const fields = ["analyses", "context"];
94
+ if (!hasOwn(value, "analyses")) fail("inputs.analyses は必須です");
95
+ rejectUnknownFields(value, fields, "inputs");
96
+
97
+ if (hasOwn(value, "analyses")) {
98
+ if (!Array.isArray(value.analyses) || value.analyses.length === 0) {
99
+ fail("inputs.analyses は 1 件以上の配列である必要があります");
100
+ } else {
101
+ for (const [index, entry] of value.analyses.entries()) {
102
+ const label = `inputs.analyses[${index}]`;
103
+ if (!isPlainObject(entry)) {
104
+ fail(`${label} は object である必要があります`);
105
+ continue;
106
+ }
107
+ const entryFields = ["ref", "path", "source"];
108
+ for (const field of entryFields) {
109
+ if (!hasOwn(entry, field)) fail(`${label}.${field} は必須です`);
110
+ }
111
+ rejectUnknownFields(entry, entryFields, label);
112
+ if (hasOwn(entry, "ref")) {
113
+ if (!isNonEmptyString(entry.ref)) {
114
+ fail(`${label}.ref は空でない文字列である必要があります`);
115
+ } else if (analysisRefs.has(entry.ref)) {
116
+ fail(`inputs.analyses[].ref が重複しています: ${entry.ref}`);
117
+ } else {
118
+ analysisRefs.add(entry.ref);
119
+ }
120
+ }
121
+ if (hasOwn(entry, "path")) validateNonEmptyString(entry.path, `${label}.path`);
122
+ if (hasOwn(entry, "source")) validateNonEmptyString(entry.source, `${label}.source`);
123
+ }
124
+ }
125
+ }
126
+
127
+ if (hasOwn(value, "context")) validateContext(value.context);
128
+ return analysisRefs;
129
+ }
130
+
131
+ // inputs.analyses[].ref と assets[].ref は 1:1 対応(過不足・重複なし)でなければならない
132
+ // (2026-07-22 A3.2 の swap 実証: 位置対応づけは無警告で入れ替わるため FK 化した)。
133
+ // 重複自体は各バリデータ側で既に検出済みなので、ここでは集合として過不足のみを見る。
134
+ function validateAnalysesAssetCorrespondence(analysisRefs, assetRefs) {
135
+ for (const ref of analysisRefs) {
136
+ if (!assetRefs.has(ref)) {
137
+ fail(`inputs.analyses[].ref が assets[].ref に存在しません: ${ref}`);
138
+ }
139
+ }
140
+ for (const ref of assetRefs) {
141
+ if (!analysisRefs.has(ref)) {
142
+ fail(`assets[].ref に対応する inputs.analyses[].ref がありません: ${ref}`);
143
+ }
144
+ }
145
+ }
146
+
147
+ function validateContext(value) {
148
+ if (!isPlainObject(value)) {
149
+ fail("inputs.context は object である必要があります(省略はできても null 化はできません)");
150
+ return;
151
+ }
152
+ const fields = ["intake", "past_projects", "interview", "notes"];
153
+ for (const field of ["past_projects", "interview"]) {
154
+ if (!hasOwn(value, field)) fail(`inputs.context.${field} は必須です(値が空でもキーは省略しない)`);
155
+ }
156
+ rejectUnknownFields(value, fields, "inputs.context");
157
+
158
+ if (hasOwn(value, "intake") && !isPlainObject(value.intake)) {
159
+ fail("inputs.context.intake は object である必要があります(省略可。null にしない)");
160
+ }
161
+
162
+ if (hasOwn(value, "past_projects")) {
163
+ if (!Array.isArray(value.past_projects)) {
164
+ fail("inputs.context.past_projects は配列である必要があります");
165
+ } else {
166
+ for (const [index, entry] of value.past_projects.entries()) {
167
+ const label = `inputs.context.past_projects[${index}]`;
168
+ if (!isPlainObject(entry)) {
169
+ fail(`${label} は object である必要があります`);
170
+ continue;
171
+ }
172
+ const entryFields = ["ref", "notes"];
173
+ for (const field of entryFields) {
174
+ if (!hasOwn(entry, field)) fail(`${label}.${field} は必須です`);
175
+ }
176
+ rejectUnknownFields(entry, entryFields, label);
177
+ if (hasOwn(entry, "ref")) validateNonEmptyString(entry.ref, `${label}.ref`);
178
+ if (hasOwn(entry, "notes")) validateNonEmptyString(entry.notes, `${label}.notes`);
179
+ }
180
+ }
181
+ }
182
+
183
+ if (hasOwn(value, "interview")) {
184
+ if (!Array.isArray(value.interview)) {
185
+ fail("inputs.context.interview は配列である必要があります");
186
+ } else {
187
+ for (const [index, entry] of value.interview.entries()) {
188
+ const label = `inputs.context.interview[${index}]`;
189
+ if (!isPlainObject(entry)) {
190
+ fail(`${label} は object である必要があります`);
191
+ continue;
192
+ }
193
+ const entryFields = ["q", "a"];
194
+ for (const field of entryFields) {
195
+ if (!hasOwn(entry, field)) fail(`${label}.${field} は必須です`);
196
+ }
197
+ rejectUnknownFields(entry, entryFields, label);
198
+ if (hasOwn(entry, "q")) validateNonEmptyString(entry.q, `${label}.q`);
199
+ if (hasOwn(entry, "a")) validateNonEmptyString(entry.a, `${label}.a`);
200
+ }
201
+ }
202
+ }
203
+
204
+ if (hasOwn(value, "notes")) validateNonEmptyString(value.notes, "inputs.context.notes");
205
+ }
206
+
207
+ function validateAssets(value) {
208
+ const refs = new Set();
209
+ if (!Array.isArray(value) || value.length === 0) {
210
+ fail("assets は 1 件以上の配列である必要があります");
211
+ return refs;
212
+ }
213
+ for (const [index, asset] of value.entries()) {
214
+ const label = `assets[${index}]`;
215
+ if (!isPlainObject(asset)) {
216
+ fail(`${label} は object である必要があります`);
217
+ continue;
218
+ }
219
+ const requiredFields = ["ref", "role", "summary", "relations", "flags"];
220
+ const allFields = ["ref", "role", "summary", "sections", "relations", "flags"];
221
+ for (const field of requiredFields) {
222
+ if (!hasOwn(asset, field)) fail(`${label}.${field} は必須です`);
223
+ }
224
+ rejectUnknownFields(asset, allFields, label);
225
+
226
+ if (hasOwn(asset, "ref")) {
227
+ if (!isNonEmptyString(asset.ref)) {
228
+ fail(`${label}.ref は空でない文字列である必要があります`);
229
+ } else if (refs.has(asset.ref)) {
230
+ fail(`assets[].ref が重複しています: ${asset.ref}`);
231
+ } else {
232
+ refs.add(asset.ref);
233
+ }
234
+ }
235
+ if (hasOwn(asset, "role")) validateNonEmptyString(asset.role, `${label}.role`);
236
+ if (hasOwn(asset, "summary")) validateNonEmptyString(asset.summary, `${label}.summary`);
237
+ if (hasOwn(asset, "sections")) validateSections(asset.sections, label);
238
+ if (hasOwn(asset, "relations")) validateRelations(asset.relations, label);
239
+ if (hasOwn(asset, "flags")) validateFlags(asset.flags, label);
240
+ }
241
+ // relations[].target のダングリング参照は全 assets を読み終えてからでないと判定できないため二周目で確認する。
242
+ for (const [index, asset] of value.entries()) {
243
+ if (!isPlainObject(asset) || !Array.isArray(asset.relations)) continue;
244
+ const label = `assets[${index}]`;
245
+ for (const [relIndex, relation] of asset.relations.entries()) {
246
+ if (!isPlainObject(relation) || !isNonEmptyString(relation.target)) continue;
247
+ const relLabel = `${label}.relations[${relIndex}]`;
248
+ if (!refs.has(relation.target)) {
249
+ fail(`${relLabel}.target が assets[].ref を参照していません: ${relation.target}`);
250
+ } else if (relation.target === asset.ref) {
251
+ fail(`${relLabel}.target が自素材への自己参照になっています: ${relation.target}`);
252
+ }
253
+ }
254
+ }
255
+ return refs;
256
+ }
257
+
258
+ function validateSections(value, assetLabel) {
259
+ if (!Array.isArray(value)) {
260
+ fail(`${assetLabel}.sections は配列である必要があります`);
261
+ return;
262
+ }
263
+ const ids = new Set();
264
+ for (const [index, section] of value.entries()) {
265
+ const label = `${assetLabel}.sections[${index}]`;
266
+ if (!isPlainObject(section)) {
267
+ fail(`${label} は object である必要があります`);
268
+ continue;
269
+ }
270
+ const fields = ["id", "start", "end", "title", "role", "evidence"];
271
+ for (const field of fields) {
272
+ if (!hasOwn(section, field)) fail(`${label}.${field} は必須です`);
273
+ }
274
+ rejectUnknownFields(section, fields, label);
275
+
276
+ if (hasOwn(section, "id")) {
277
+ if (!isNonEmptyString(section.id)) {
278
+ fail(`${label}.id は空でない文字列である必要があります`);
279
+ } else if (ids.has(section.id)) {
280
+ fail(`${assetLabel}.sections[].id が重複しています: ${section.id}`);
281
+ } else {
282
+ ids.add(section.id);
283
+ }
284
+ }
285
+ validateSecondsPair(section, label);
286
+ if (hasOwn(section, "title")) validateNonEmptyString(section.title, `${label}.title`);
287
+ if (hasOwn(section, "role")) validateNonEmptyString(section.role, `${label}.role`);
288
+ if (hasOwn(section, "evidence")) validateNonEmptyString(section.evidence, `${label}.evidence`);
289
+ }
290
+ }
291
+
292
+ function validateRelations(value, assetLabel) {
293
+ if (!Array.isArray(value)) {
294
+ fail(`${assetLabel}.relations は配列である必要があります`);
295
+ return;
296
+ }
297
+ for (const [index, relation] of value.entries()) {
298
+ const label = `${assetLabel}.relations[${index}]`;
299
+ if (!isPlainObject(relation)) {
300
+ fail(`${label} は object である必要があります`);
301
+ continue;
302
+ }
303
+ const requiredFields = ["target", "kind", "evidence"];
304
+ const allFields = ["target", "kind", "evidence", "note"];
305
+ for (const field of requiredFields) {
306
+ if (!hasOwn(relation, field)) fail(`${label}.${field} は必須です`);
307
+ }
308
+ rejectUnknownFields(relation, allFields, label);
309
+ if (hasOwn(relation, "target")) validateNonEmptyString(relation.target, `${label}.target`);
310
+ if (hasOwn(relation, "kind")) validateNonEmptyString(relation.kind, `${label}.kind`);
311
+ if (hasOwn(relation, "evidence")) validateNonEmptyString(relation.evidence, `${label}.evidence`);
312
+ if (hasOwn(relation, "note")) validateNonEmptyString(relation.note, `${label}.note`);
313
+ }
314
+ }
315
+
316
+ function validateFlags(value, assetLabel) {
317
+ if (!Array.isArray(value)) {
318
+ fail(`${assetLabel}.flags は配列である必要があります`);
319
+ return;
320
+ }
321
+ for (const [index, flag] of value.entries()) {
322
+ const label = `${assetLabel}.flags[${index}]`;
323
+ if (!isPlainObject(flag)) {
324
+ fail(`${label} は object である必要があります`);
325
+ continue;
326
+ }
327
+ const requiredFields = ["type", "evidence"];
328
+ const allFields = ["type", "evidence", "start", "end", "note"];
329
+ for (const field of requiredFields) {
330
+ if (!hasOwn(flag, field)) fail(`${label}.${field} は必須です`);
331
+ }
332
+ rejectUnknownFields(flag, allFields, label);
333
+
334
+ if (hasOwn(flag, "type") && !FLAG_TYPES.has(flag.type)) {
335
+ fail(`${label}.type は orphan / unclear / trouble_overlap のいずれかである必要があります`);
336
+ }
337
+ if (hasOwn(flag, "evidence")) validateNonEmptyString(flag.evidence, `${label}.evidence`);
338
+ if (hasOwn(flag, "note")) validateNonEmptyString(flag.note, `${label}.note`);
339
+ validateSecondsPair(flag, label);
340
+ }
341
+ }
342
+
343
+ function validateArc(value, assetRefs) {
344
+ if (!Array.isArray(value) || value.length === 0) {
345
+ fail("arc は 1 件以上の配列である必要があります");
346
+ return;
347
+ }
348
+ const orders = new Set();
349
+ for (const [index, entry] of value.entries()) {
350
+ const label = `arc[${index}]`;
351
+ if (!isPlainObject(entry)) {
352
+ fail(`${label} は object である必要があります`);
353
+ continue;
354
+ }
355
+ const fields = ["order", "title", "refs", "purpose", "evidence"];
356
+ for (const field of fields) {
357
+ if (!hasOwn(entry, field)) fail(`${label}.${field} は必須です`);
358
+ }
359
+ rejectUnknownFields(entry, fields, label);
360
+
361
+ if (hasOwn(entry, "order")) {
362
+ if (!Number.isInteger(entry.order) || entry.order < 1) {
363
+ fail(`${label}.order は 1 以上の整数である必要があります`);
364
+ } else if (orders.has(entry.order)) {
365
+ fail(`arc[].order が重複しています: ${entry.order}`);
366
+ } else {
367
+ orders.add(entry.order);
368
+ }
369
+ }
370
+ if (hasOwn(entry, "title")) validateNonEmptyString(entry.title, `${label}.title`);
371
+ if (hasOwn(entry, "purpose")) validateNonEmptyString(entry.purpose, `${label}.purpose`);
372
+ if (hasOwn(entry, "evidence")) validateNonEmptyString(entry.evidence, `${label}.evidence`);
373
+
374
+ if (hasOwn(entry, "refs")) {
375
+ if (!Array.isArray(entry.refs) || entry.refs.length === 0) {
376
+ fail(`${label}.refs は 1 件以上の配列である必要があります`);
377
+ } else {
378
+ for (const [refIndex, ref] of entry.refs.entries()) {
379
+ const refLabel = `${label}.refs[${refIndex}]`;
380
+ if (!isPlainObject(ref)) {
381
+ fail(`${refLabel} は object である必要があります`);
382
+ continue;
383
+ }
384
+ const refFields = ["asset", "start", "end"];
385
+ if (!hasOwn(ref, "asset")) fail(`${refLabel}.asset は必須です`);
386
+ rejectUnknownFields(ref, refFields, refLabel);
387
+ if (hasOwn(ref, "asset")) {
388
+ if (!isNonEmptyString(ref.asset)) {
389
+ fail(`${refLabel}.asset は空でない文字列である必要があります`);
390
+ } else if (!assetRefs.has(ref.asset)) {
391
+ fail(`${refLabel}.asset が assets[].ref を参照していません: ${ref.asset}`);
392
+ }
393
+ }
394
+ validateSecondsPair(ref, refLabel);
395
+ }
396
+ }
397
+ }
398
+ }
399
+ }
400
+
401
+ function validateOpenQuestions(value) {
402
+ if (!Array.isArray(value)) {
403
+ fail("open_questions は配列である必要があります");
404
+ return;
405
+ }
406
+ const ids = new Set();
407
+ for (const [index, entry] of value.entries()) {
408
+ const label = `open_questions[${index}]`;
409
+ if (!isPlainObject(entry)) {
410
+ fail(`${label} は object である必要があります`);
411
+ continue;
412
+ }
413
+ const requiredFields = ["id", "question", "fills", "status"];
414
+ const allFields = ["id", "question", "fills", "status", "answer"];
415
+ for (const field of requiredFields) {
416
+ if (!hasOwn(entry, field)) fail(`${label}.${field} は必須です`);
417
+ }
418
+ rejectUnknownFields(entry, allFields, label);
419
+
420
+ if (hasOwn(entry, "id")) {
421
+ if (!isNonEmptyString(entry.id)) {
422
+ fail(`${label}.id は空でない文字列である必要があります`);
423
+ } else if (ids.has(entry.id)) {
424
+ fail(`open_questions[].id が重複しています: ${entry.id}`);
425
+ } else {
426
+ ids.add(entry.id);
427
+ }
428
+ }
429
+ if (hasOwn(entry, "question")) validateNonEmptyString(entry.question, `${label}.question`);
430
+ if (hasOwn(entry, "fills")) validateNonEmptyString(entry.fills, `${label}.fills`);
431
+ if (hasOwn(entry, "status") && !OPEN_QUESTION_STATUSES.has(entry.status)) {
432
+ fail(`${label}.status は open / answered のいずれかである必要があります`);
433
+ }
434
+ if (entry.status === "answered" && !isNonEmptyString(entry.answer)) {
435
+ fail(`${label}.answer は status が answered のとき必須です`);
436
+ }
437
+ if (entry.status === "open" && hasOwn(entry, "answer")) {
438
+ fail(`${label}.answer は status が open のとき省略する必要があります(null にしない)`);
439
+ }
440
+ }
441
+ }
442
+
443
+ function validateSecondsPair(value, label) {
444
+ const hasStart = hasOwn(value, "start");
445
+ const hasEnd = hasOwn(value, "end");
446
+ if (hasStart && !isFiniteNumber(value.start)) {
447
+ fail(`${label}.start は有限数(秒)である必要があります`);
448
+ }
449
+ if (hasEnd && !isFiniteNumber(value.end)) {
450
+ fail(`${label}.end は有限数(秒)である必要があります`);
451
+ }
452
+ if (hasStart !== hasEnd) {
453
+ fail(`${label} は start/end を両方指定するか、両方省略する必要があります`);
454
+ return;
455
+ }
456
+ if (hasStart && hasEnd && isFiniteNumber(value.start) && isFiniteNumber(value.end)) {
457
+ if (value.start < 0 || value.end < 0) {
458
+ fail(`${label}.start/end は 0 以上である必要があります`);
459
+ } else if (value.end <= value.start) {
460
+ fail(`${label} は end > start を満たす必要があります`);
461
+ }
462
+ }
463
+ }
464
+
465
+ function rejectUnknownFields(value, allowed, label) {
466
+ for (const field of Object.keys(value)) {
467
+ if (!allowed.includes(field)) fail(`${label}.${field} は未定義のフィールドです`);
468
+ }
469
+ }
470
+
471
+ function validateNonEmptyString(value, label) {
472
+ if (!isNonEmptyString(value)) fail(`${label} は空でない文字列である必要があります`);
473
+ }
474
+
475
+ function isRegularFile(filePath) {
476
+ try {
477
+ return fs.statSync(filePath).isFile();
478
+ } catch {
479
+ return false;
480
+ }
481
+ }
482
+
483
+ function isPlainObject(value) {
484
+ return value !== null && typeof value === "object" && !Array.isArray(value);
485
+ }
486
+
487
+ function isFiniteNumber(value) {
488
+ return typeof value === "number" && Number.isFinite(value);
489
+ }
490
+
491
+ function isNonEmptyString(value) {
492
+ return typeof value === "string" && value.trim().length > 0;
493
+ }
494
+
495
+ function hasOwn(value, key) {
496
+ return Object.prototype.hasOwnProperty.call(value, key);
497
+ }
498
+
499
+ function messageOf(error) {
500
+ return error instanceof Error ? error.message : String(error);
501
+ }
502
+
503
+ function fail(message) {
504
+ errors.push(message);
505
+ }
506
+
507
+ function finish() {
508
+ if (errors.length > 0) {
509
+ console.error(`NG: ${interpretationPath}`);
510
+ for (const error of errors) console.error(`- ${error}`);
511
+ process.exit(1);
512
+ }
513
+ console.log(`OK: ${interpretationPath}`);
514
+ process.exit(0);
515
+ }