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,77 @@
1
+ # 声プロファイル作成手順(fal-qwen3 自声クローン用)
2
+
3
+ fal-qwen3 アダプタ([engines.md](engines.md))で自声クローンを使うには、事前に
4
+ `~/.config/akari-video/voice-profiles/<name>/` へ声プロファイルを 1 度作っておく必要がある。
5
+ 本リーフはその作成手順を正文として記載する。**クローンするのはプロジェクトオーナー本人の声のみ**
6
+ (SKILL.md ハードルール 1)。
7
+
8
+ ## 1. 原稿提示
9
+
10
+ 同梱の [assets/reading-script-v1.md](assets/reading-script-v1.md) を人間にそのまま提示する。
11
+ 本文は正文であり、人間が読みやすいよう言い換えたり要約したりしない
12
+ (`reference_text` と完全一致させる必要があるため)。約 330 字・45〜60 秒を目安と伝える。
13
+
14
+ ## 2. 録音(2 経路)
15
+
16
+ どちらでもよい。
17
+
18
+ - **経路 A(既定)**: iPhone / Mac のボイスメモで原稿を読んでもらい、共有・書き出しで
19
+ `~/Downloads` へ保存してもらう(AirDrop 含む)。追加権限が要らず、既存の録音習慣と一致する。
20
+ - **経路 B(全自動)**: `ffmpeg -f avfoundation -i ":<device>"` でマイクから直接録音する。
21
+ 利用可能なデバイスは `ffmpeg -f avfoundation -list_devices true -i ""` で確認する
22
+ (初回のみマイク許可プロンプトが出る)。
23
+
24
+ ## 3. 拾いルール
25
+
26
+ セットアップ開始時刻の mtime を記録しておき、`~/Downloads` の中で**その時刻以降に更新された**
27
+ 最新の音声ファイル(m4a / wav / mp3)を対象にする。ボイスメモの自動命名は録音場所に由来し
28
+ ファイル名からは内容を推定できないため、**ファイル名ではなく mtime で拾う**。
29
+
30
+ ## 4. 送信前ガード(省略不可、ハードルール 2)
31
+
32
+ 外部(fal)へ送信する前に、ローカル whisper で拾った音声を逆文字起こしし、所定原稿(§1)との
33
+ 一致度と、長さが 30〜300 秒の範囲かを確認する。目的は文字起こしの精度検証ではなく、
34
+ **誤ファイル(別録音・他人の声・私的な音声)を外部サービスへ誤送信しないための照合**である。
35
+
36
+ - whisper.cpp の実行ファイル・モデル探索は
37
+ [../analyze-footage/media-and-transcript.md](../analyze-footage/media-and-transcript.md) の
38
+ 「層 2: whisper.cpp」節と同じ探索順・同じ呼び出し規約を流用する(新しい探索ロジックを作らない)
39
+ - 一致度が低い、または長さが範囲外なら**送信せず停止**し、録音のやり直しを人間に案内する
40
+ - 照合をスキップしてよいのはオーナーが明示的に指示した場合のみで、その場合も `meta.json` の
41
+ `reference.verification` に `"skipped by owner instruction (<日付>)"` のように理由と日付を記録する
42
+ (既定は照合ありのまま変えない)
43
+
44
+ ## 5. クローン(fal `clone-voice/1.7b`)
45
+
46
+ `FAL_KEY` は `~/.config/akari-video/credentials.env` から読む(manage-connections 経由のみ。
47
+ ハードルール 5)。参照音声を data URI にエンコードし、`reference_text` に §1 の原稿本文をそのまま
48
+ 渡して `fal-ai/qwen-3-tts/clone-voice/1.7b` を呼ぶ。応答の `speaker_embedding.url` が
49
+ 声プロファイル資産(`embedding_source_url`)になる。**有償操作**なので、実行前に対象・使う手・理由・
50
+ 代替案・費用・待ち時間・外部送信・provenance を宣言し、明示承認を得てから送信する
51
+ ([../manage-connections/SKILL.md](../manage-connections/SKILL.md) の Decision Communication Contract
52
+ と同型。クローンは声につき通常 1 回のみで費用は僅少だが、宣言自体は省略しない)。
53
+
54
+ ## 6. 保存
55
+
56
+ `~/.config/akari-video/voice-profiles/<name>/` に以下を保存する(`credentials.env` と同じ
57
+ ユーザーレベル・git 管理外)。
58
+
59
+ - `embedding.safetensors`(または `embedding_source_url` を meta.json に記録し、資産は fal 側 URL
60
+ 参照のままでもよい。実装は [bin/generate-narration.mjs](bin/generate-narration.mjs) の
61
+ fal-qwen3 アダプタが `meta.json` の `embedding_source_url` を読む前提に合わせる)
62
+ - `ref-recording.<ext>`(送信した参照音声そのもの)
63
+ - `meta.json`:
64
+ - `profile`: プロファイル名
65
+ - `created_at`: ISO8601
66
+ - `reference.sha256`: 参照音声のハッシュ
67
+ - `reference.script_version`: 使用した原稿バージョン(例 `v1`)
68
+ - `reference.verification`: whisper 照合の結果、またはスキップの記録(§4)
69
+ - `consent`: 本人が本人の声のプロファイル作成を明示指示したことの記録(**必須**。ハードルール 1)
70
+ - `reference_text`: fal に渡した参照テキスト(§1 の原稿本文と同一)
71
+ - `embedding_source_url`: fal から得た speaker embedding の URL
72
+
73
+ ## 7. 検収
74
+
75
+ 短文 1 本(数十文字程度、$0.01 未満)を fal-qwen3 アダプタで試し生成し、`afplay` 等で人間に耳確認して
76
+ もらう。OK であればプロファイルは有効化完了。似度が不足する場合は、静かな環境で 30〜60 秒のナレ調
77
+ 録音を撮り直してプロファイルを作り直す(NG 判定はその後で行う)。
@@ -0,0 +1,132 @@
1
+ ---
2
+ name: harvest-asset
3
+ description: 案件で作った高コスト・再利用価値の高いオーバーレイ、3D、モーション、テロップ、サムネ構図、音源、B ロールを AKARI Video の assets ライブラリへ素材化するときに発動する。入庫判定、meta.json 下書き、preview、INDEX 更新、検証を行う。
4
+ ---
5
+
6
+ # 素材化ワークフロー
7
+
8
+ > **Language**: Respond in the user's language — 対話・質問・承認確認・レポートはユーザーの使用言語に合わせる(例: 英語で話しかけられたら英語で応答する)。
9
+
10
+ 順序を変えず、導出できる情報を人へ質問しない。
11
+
12
+ ## 1. 入庫基準を判定する
13
+
14
+ **「生成コストが高い、または生成不能なものだけ」を入れる。** 次のどちらも満たさなければ収穫を中止し、理由を報告する。
15
+
16
+ - 自然言語から毎回すぐ再生成できない。例: license 済み 3D model、多要素の複雑 motion、完成度の高い telop / thumbnail 構図、音源、B-roll。
17
+ - 再利用時に、保存・検索・license 管理の価値が生成コストを上回る。
18
+
19
+ 単純字幕、色違いだけ、素朴な fade / slide、案件固有文言を差し替えただけの断片は入れない。既存 asset と本質的に同じ場合も variant を増やさず、既存 asset の knob で表せるかを先に確認する。
20
+
21
+ ## 2. 作業用 package と `meta.json` 下書きを作る
22
+
23
+ source fragment と同階層の依存 asset を読み、作業用一時ディレクトリへ自己完結した package を組む。最終配置前に次を自動抽出する。
24
+
25
+ ### CSS 変数 → `knobs`
26
+
27
+ 1. fragment 内の `--name: value` と `var(--name, fallback)` を列挙する。
28
+ 2. 重複を除き、runtime 所有の `--x`、`--y`、`--scale`、`--rotate` と素材固有 knob を区別する。
29
+ 3. default は宣言値または fallback から取り、fragment と preview の確認に使う。schema v0 にない `default` field は `meta.json` へ追加せず、値を発明しない。
30
+ 4. 型を次の語彙へ機械的に寄せる。
31
+ - 色値 → `color`
32
+ - 数値 + 単位 → `slider`。`min` / `max` は根拠が抽出できる場合だけ付ける
33
+ - media URL / `src` → `media`
34
+ - boolean の表示切替 → `checkbox`
35
+ - 有限の選択肢がコードから読める → `dropdown`
36
+ - それ以外の置換可能文字列 → `text`
37
+ 5. `group` と `label` は variable 名と利用箇所から生成する。曖昧な推論は下書きに注記し、人へ新しい質問を増やさない。
38
+
39
+ ### 依存 → `requires` と同梱対象
40
+
41
+ - `<script src>`、module import、`@import`、`url()`、`src` / `href`、Three.js addon / decoder、font、model、texture、audio、video を走査する。
42
+ - package / runtime 名は `requires` へ、相対 file は copy 対象へ分ける。
43
+ - CDN / remote URL はそのまま採用せず、license を確認して local 化するか入庫を止める。
44
+ - file が存在しない参照、fragment 外へ抜ける相対 path、未使用依存を残さない。
45
+
46
+ ### その他の自動導出
47
+
48
+ - `id`: source 名と内容から kebab-case で生成する。
49
+ - `category`: `3d` / `motion` / `telop` / `audio` / `broll` / `font` / `thumbnail` から単一カテゴリを内容から選ぶ。横断軸は `tags` にする。サムネイルの HTML 文字組テンプレは `thumbnail`(背景差し替え前提で、文字組レイヤーだけを素材化する)。
50
+ - `title` / `description` / `tags`: 見た目、役割、aspect、scene を source と利用文脈から要約する。
51
+ - `provenance`: origin project、元 path、生成手、prompt、日時を既存情報から埋める。分からない値を捏造しない。
52
+ - media の寸法、duration、codec、model 情報は `sips`、`ffprobe`、利用可能な GLB inspector などで読める場合だけ確認し、description / tags / preview 判断へ使う。schema にないトップレベル field は追加しない。
53
+ - `author` は既知の project / git 情報から、`price` は現行契約どおり `null` とする。
54
+
55
+ `meta.json` は `docs/contract-2026-07-13-asset-library.md` の schema v0 に合わせ、正式 key `when_to_use` を使う。依頼文中の `when_use` はこの key の意味と扱う。
56
+
57
+ ## 3. 人間判断が必要な 4 項目だけを聞く
58
+
59
+ 自動抽出結果を短く見せ、次の 4 項目を一度に質問する。それ以外は質問しない。
60
+
61
+ 1. **when_use** → `when_to_use`: どの scene / 目的で使うか。
62
+ 2. **ai_usage**: AI が変えてよい部分、守る部分、禁止する改変。
63
+ 3. **license**: SPDX、commercial scope、attribution 要否、AI training 可否。license 不明を既定許可にしない。
64
+ 4. **登録先スコープ**: `local`(そのプロジェクトのみ)/ `shared`(上位ディレクトリの `.akari/assets/`、事業・組織単位)/ `user`(`~/.akari/assets/`、全プロジェクト共通の定番)/ `builtin`(製品リポ。昇格は PR 経路)。目安を添えて聞く: プロジェクト固有の文言・素材が残るなら `local`、汎用化できたなら `user`。黙って `builtin` に入れない。
65
+
66
+ 回答を `meta.json` に反映する。license が確定しない asset はどの層にも入れない。
67
+
68
+ ## 4. `preview.png` を生成する
69
+
70
+ - HTML / CSS: 単一の preview harness へ fragment を置き、local font / image の load を待って headless Chrome で撮る。動画 timing は代表時刻へ seek する。
71
+ - 3D: model、material、texture が読める代表 pose を使う。現行 Three.js live runtime が未整備でも、実物ではない代替画像を model preview と偽らない。
72
+ - B-roll / video: `ffmpeg` で内容を代表する frame を選ぶ。
73
+ - audio: waveform と title / duration を読める preview を作る。
74
+ - thumbnail / still: 元 asset を aspect を壊さず preview canvas へ収める。
75
+
76
+ preview は中身を識別するためのものとし、source と違う架空の完成図を生成しない。schema または category INDEX に寸法規約が追加されていたら、それを優先する。
77
+
78
+ ## 5. 選ばれたスコープの `assets/<category>/` へ配置する
79
+
80
+ 配置先は**登録先スコープ(手順 3 で確定)の** `assets/<category>/<id>/` とし、階層を増やさない。スコープの実ディレクトリ(`local` = プロジェクト内 / `shared` = 上位の `.akari/assets/` / `user` = `~/.akari/assets/`)が無ければ category と INDEX.md ごと新設する。層が違っても構造・meta.json v0・validator は同一。最低限、次をそろえる。
81
+
82
+ - `meta.json`
83
+ - `preview.png`
84
+ - 実体。HTML 表現は `fragment.html`、ほかは model / media 本体
85
+ - fragment が参照する local dependency
86
+
87
+ 同名 directory が既にあれば上書きしない。内容を比較し、更新か新 ID かの明示判断を得る。採用時は library 外への symlink を残さず、package を自己完結させる。
88
+
89
+ ## 6. category `INDEX.md` を更新する
90
+
91
+ `assets/<category>/INDEX.md` に、ID 順または既存の並び規則を守って 1 行追加する。
92
+
93
+ ```text
94
+ <id> — <何で、どんな場面向けかを一文で>
95
+ ```
96
+
97
+ 重複行を作らない。新 category のときだけ `assets/INDEX.md` にもカテゴリ説明を追加する。
98
+
99
+ ## 7. validator で検証する
100
+
101
+ まず `packages/schemas/bin/validate-asset.mjs` と `packages/schemas/asset-meta.schema.json` の存在、script 内の usage を確認する。現行 usage では、次のように対象 package を渡す。
102
+
103
+ ```sh
104
+ node packages/schemas/bin/validate-asset.mjs "assets/<category>/<id>"
105
+ ```
106
+
107
+ 将来 usage が変わっていれば script を正とし、引数を推測しない。失敗時は `meta.json`、最小 3 点、category 一致、relative dependency、INDEX を直し、成功するまで再実行する。
108
+
109
+ script または schema がまだない場合、成功扱いにせず成果報告へ次をそのまま残す。
110
+
111
+ ```text
112
+ 後で実行: node packages/schemas/bin/validate-asset.mjs(validator / schema 作成後)
113
+ ```
114
+
115
+ ## よくある間違い
116
+
117
+ - 「きれいにできた」だけで、毎回生成できる単純表現を入庫する。
118
+ - CSS 変数や依存を人へ転記させる。
119
+ - `when_to_use` を `when_use` という非 schema key で保存する。
120
+ - slider の min / max、license、provenance を推測で埋める。
121
+ - CDN や案件 directory への相対参照を残す。
122
+ - 1 asset を複数 category へ複製する。
123
+ - 登録先スコープを聞かず、黙って `builtin`(製品リポ)へ入庫する。
124
+ - プロジェクト固有の文言・画像が残ったまま `user` / `builtin` へ入れて、他プロジェクトで使えない資産を作る。
125
+ - preview を作らず、または実体と違う mock を preview にする。
126
+ - INDEX を更新せず、grep で発見不能にする。
127
+ - validator がない状態を validation pass と報告する。
128
+
129
+ ## 根拠
130
+
131
+ - 入庫基準、schema、構造、収穫: `docs/contract-2026-07-13-asset-library.md`
132
+ - authoring hard rules: [../overlay-authoring/SKILL.md](../overlay-authoring/SKILL.md)
@@ -0,0 +1,75 @@
1
+ ---
2
+ name: manage-connections
3
+ description: AKARI Video の生成プロバイダ・SNS 接続・API キー参照・モデル選択・コスト承認ポリシーを一元管理する。初回セットアップ、接続状態の確認、provider やモデルの追加、有償生成・外部公開の実行前ゲートで発動し、`.akari/connections.json` と無償・読み取り専用の doctor を扱う。
4
+ ---
5
+
6
+ # FORBIDDEN 級ハードルール
7
+
8
+ > **Language**: Respond in the user's language — 対話・質問・承認確認・レポートはユーザーの使用言語に合わせる(例: 英語で話しかけられたら英語で応答する)。
9
+
10
+ 次の規則は詳細手順より常に優先する。
11
+
12
+ 1. **キーの値を git 管理下ファイル・HTML・ログ・会話に出さない。** 表示は常にマスク
13
+ 2. **credentials.env 以外からキーを探索しない。チャットでキーの提示を求めない。**
14
+ 置き場と KEY 名を案内し、人間が置く
15
+ 3. **keychain / 外部 vault を必須依存にしない**(オプションバックエンドとしてのみ将来検討)
16
+ 4. **doctor は無償・読み取り専用のみ。実生成テストはしない**(保留裁定 2026-07-17)
17
+ 5. **有償操作は見積 → 明示承認まで実行しない**(edit-plan の Decision Communication
18
+ Contract と同型)。予算上限の超過見込みで実行前に停止する
19
+ 6. **リアルタイムフック監視(PreToolUse 等)を採用しない。** 状態は JSON、伝達は git 正味差分
20
+ 7. **connections.json に無い接続を消費側スキルが使わない**(本スキルが唯一の入口。
21
+ 42・70 系の契約はこのルールを継承する)
22
+
23
+ # 実行順リーフ
24
+
25
+ 1. プロジェクトの `.akari/connections.json` を読み、使う provider と
26
+ `models.default / allowed`、`policy` を確認する。レジストリに無い接続や allowed 外のモデルを
27
+ 使わない。
28
+ 2. 前回の `doctor` 結果を提示する。再確認を明示された場合だけ、プロジェクトルートで
29
+ `node <このスキルのディレクトリ>/bin/doctor.mjs` を実行する。別プロジェクトを確認する場合は
30
+ そのプロジェクトルート、または connections.json のパスを第 1 引数に渡す。
31
+ 3. `~/.config/akari-video/credentials.env` が無ければ、doctor が示す置き場・KEY 名・取得先 URL を
32
+ 人間へ案内して停止する。代理取得・代理書き込みをしない。テストで差し替える場合だけ
33
+ `AKARI_CREDENTIALS_FILE` にファイルパスを指定する。
34
+ 4. provider を追加する場合は、人間が credentials.env に `KEY=VALUE` を 1 行追加し、
35
+ `.akari/connections.json` の `providers` に値を含まない entry を 1 件追加する。
36
+ `auth: env-key` の `env` は `${KEY_NAME}` 形式にする。doctor に安全な adapter が無い provider は
37
+ `unchecked` と正直に残す。
38
+ 5. モデルを変更する場合は `models.allowed` を先に確定し、`models.default` はその中から選ぶ。
39
+ タスク単位の上書きは次の承認ゲートで宣言する。
40
+ 6. 有償操作の前に [承認ゲート](../edit-plan/approvals-and-generation.md) と同じ形式で対象、使う手、
41
+ 理由、代替案、見積費用、待ち時間、外部送信、provenance を提示する。明示承認が得られるまで
42
+ 実行せず、未設定の予算上限や超過見込みがあれば停止する。
43
+
44
+ doctor は connections.json の `doctor` ブロックを書き戻し、プロジェクトルートへ読み取り専用の
45
+ `connections-report.html` を生成する。レポートに表示する資格情報は「設定済み(マスク)」または
46
+ 「未設定」の存在有無だけとし、HTTP 応答本文やキー値を表示しない。
47
+
48
+ ## memory 接続の管理
49
+
50
+ `.akari/connections.json` の `memory` 配列は、生成プロバイダとは別種の接続(外部参照記憶。
51
+ [contract-2026-07-25-memory-connection-v0.md](../../docs/contract-2026-07-25-memory-connection-v0.md)
52
+ が正本)を宣言する。資格情報・課金は発生しない読み取り専用の接続であり、本スキルが
53
+ `providers` と同じレジストリファイルの中で一元管理する。
54
+
55
+ - **追加**: `memory` 配列へ `{ "name": "<kebab-case>", "root": "<ローカルパス>" }` を最小構成として
56
+ 1 件追加する。`entry`(省略時 `INDEX.md`)・`include`/`exclude`・`read_policy`(省略時
57
+ `read-only`)は任意。`root` に秘密情報(API キー等)を書かない — 経路情報のみを持つ
58
+ - **削除**: `memory` 配列から該当エントリを取り除くだけ。対になる credentials.env の行は無い
59
+ (`memory` は `auth`/`env` を持たない)
60
+ - **doctor での表示**: `memory` エントリは `providers` の疎通確認(HTTP 認証チェック等)とは
61
+ 別の軽い確認に限る。`root`(および `root`+`entry`)のパス実在チェックのみを行う、無償・
62
+ 読み取り専用の確認である。有償生成の doctor と同じ「無償・読み取り専用のみ」原則
63
+ (FORBIDDEN 級ハードルール 4)を継承するが、**`memory` は `doctor` フィールドを持たない
64
+ スキーマ設計**(永続化する認証状態が無いため)であり、v0 時点の `doctor.mjs` はこの
65
+ パスチェックを実装しない(データ契約 + スキル規約の確立が v0 の範囲。実装は次段)
66
+ - `root` へ実際にアクセスできない場合も、読む瞬間(research-plan / edit-plan の冒頭・
67
+ analyze-project の文脈読み合わせ)のスキル実行そのものは止めない(劣化規約は
68
+ memory-connection-v0 契約 §5 を参照)
69
+
70
+ ## 根拠
71
+
72
+ - 正本契約: 接続・設定管理契約(2026-07-17)— 非公開の内部記録(`akari-video-internal`)にある
73
+ - first-run・代理取得しない規律: [../setup-library/SKILL.md](../setup-library/SKILL.md)
74
+ - 有償操作の承認ゲート: [../edit-plan/approvals-and-generation.md](../edit-plan/approvals-and-generation.md)
75
+ - レジストリ検証: `node packages/schemas/bin/validate-connections.mjs .akari/connections.json`
@@ -0,0 +1,341 @@
1
+ #!/usr/bin/env node
2
+
3
+ // 接続レジストリを、無償・読み取り専用の確認だけで更新する。
4
+
5
+ import fs from "node:fs";
6
+ import os from "node:os";
7
+ import path from "node:path";
8
+
9
+ const usage = "使い方: node skills/manage-connections/bin/doctor.mjs [プロジェクトルート|connections.json]";
10
+ const argument = process.argv[2];
11
+
12
+ if (process.argv.length > 3) {
13
+ console.error(usage);
14
+ process.exit(2);
15
+ }
16
+
17
+ if (argument === "--help" || argument === "-h") {
18
+ console.log(usage);
19
+ process.exit(0);
20
+ }
21
+
22
+ const inputPath = path.resolve(argument ?? process.cwd());
23
+ const connectionsPath = inputPath.endsWith(".json")
24
+ ? inputPath
25
+ : path.join(inputPath, ".akari", "connections.json");
26
+ const projectRoot = inputPath.endsWith(".json")
27
+ ? path.dirname(path.dirname(connectionsPath))
28
+ : inputPath;
29
+ const reportPath = path.join(projectRoot, "connections-report.html");
30
+ const credentialsPath = path.resolve(
31
+ process.env.AKARI_CREDENTIALS_FILE ?? path.join(os.homedir(), ".config", "akari-video", "credentials.env"),
32
+ );
33
+ const timeoutMs = 5_000;
34
+
35
+ async function main() {
36
+ const registry = readRegistry();
37
+ const credentialState = readCredentials();
38
+ const checkedAt = new Date().toISOString();
39
+
40
+ if (!credentialState.exists) {
41
+ printCredentialGuide(registry);
42
+ } else if (!credentialState.securePermissions) {
43
+ console.warn(`警告: credentials.env の権限は 600 ではありません(現在 ${credentialState.mode})。chmod 600 ${credentialsPath} を実行してください。`);
44
+ }
45
+
46
+ const results = await Promise.all(
47
+ registry.providers.map((provider) => inspectProvider(provider, credentialState, checkedAt)),
48
+ );
49
+ for (const [index, result] of results.entries()) registry.providers[index].doctor = result.doctor;
50
+
51
+ const jsonOutput = `${JSON.stringify(registry, null, 2)}\n`;
52
+ refuseSecretLeak(jsonOutput, credentialState.values);
53
+ const htmlOutput = renderReport(registry, results, credentialState, checkedAt);
54
+ refuseSecretLeak(htmlOutput, credentialState.values);
55
+
56
+ fs.writeFileSync(connectionsPath, jsonOutput, "utf8");
57
+ fs.writeFileSync(reportPath, htmlOutput, "utf8");
58
+
59
+ for (const result of results) {
60
+ console.log(`${result.id}: ${result.doctor.status} — ${result.doctor.detail}`);
61
+ }
62
+ console.log(`接続レポート: ${reportPath}`);
63
+ }
64
+
65
+ function readRegistry() {
66
+ let value;
67
+ try {
68
+ value = JSON.parse(fs.readFileSync(connectionsPath, "utf8"));
69
+ } catch {
70
+ throw new Error("connections.json を読めません");
71
+ }
72
+ if (!isPlainObject(value) || !Array.isArray(value.providers) || !isPlainObject(value.policy)) {
73
+ throw new Error("connections.json の構造が不正です");
74
+ }
75
+ return value;
76
+ }
77
+
78
+ function readCredentials() {
79
+ let stat;
80
+ try {
81
+ stat = fs.statSync(credentialsPath);
82
+ } catch (error) {
83
+ if (error && error.code === "ENOENT") {
84
+ return { exists: false, securePermissions: false, mode: null, values: new Map(), parseWarnings: [] };
85
+ }
86
+ throw error;
87
+ }
88
+ if (!stat.isFile()) throw new Error("credentials.env が通常ファイルではありません");
89
+
90
+ const mode = (stat.mode & 0o777).toString(8).padStart(3, "0");
91
+ const values = new Map();
92
+ const parseWarnings = [];
93
+ const source = fs.readFileSync(credentialsPath, "utf8");
94
+ for (const [index, originalLine] of source.split(/\r?\n/).entries()) {
95
+ const line = originalLine.trim();
96
+ if (!line || line.startsWith("#")) continue;
97
+ const separator = line.indexOf("=");
98
+ if (separator < 1) {
99
+ parseWarnings.push(index + 1);
100
+ continue;
101
+ }
102
+ const name = line.slice(0, separator).trim();
103
+ if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(name)) {
104
+ parseWarnings.push(index + 1);
105
+ continue;
106
+ }
107
+ let value = line.slice(separator + 1).trim();
108
+ if (
109
+ value.length >= 2 &&
110
+ ((value.startsWith('"') && value.endsWith('"')) ||
111
+ (value.startsWith("'") && value.endsWith("'")))
112
+ ) {
113
+ value = value.slice(1, -1);
114
+ }
115
+ values.set(name, value);
116
+ }
117
+ if (parseWarnings.length > 0) {
118
+ console.warn(`警告: credentials.env の ${parseWarnings.map((line) => `${line} 行目`).join("、")}を KEY=VALUE として読めませんでした。`);
119
+ }
120
+ return { exists: true, securePermissions: mode === "600", mode, values, parseWarnings };
121
+ }
122
+
123
+ async function inspectProvider(provider, credentialState, checkedAt) {
124
+ const id = typeof provider.id === "string" ? provider.id : "unknown-provider";
125
+ if (provider.auth === "login" || provider.auth === "oauth-mcp") {
126
+ return result(id, checkedAt, "unchecked", `${provider.auth} 認証は doctor から疎通確認しません。人間がログイン状態を確認してください。`, false);
127
+ }
128
+ if (provider.auth === "none") {
129
+ const localAdapter = localAdapters[id];
130
+ if (!localAdapter) {
131
+ return result(id, checkedAt, "unchecked", "無償・読み取り専用と確認済みの doctor adapter がありません。", true);
132
+ }
133
+ const doctor = await localAdapter(checkedAt);
134
+ return { id, configured: true, doctor };
135
+ }
136
+ if (provider.auth !== "env-key") {
137
+ return result(id, checkedAt, "unchecked", "未対応の認証方式のため確認していません。", false);
138
+ }
139
+
140
+ const envName = extractEnvName(provider.env);
141
+ if (!envName) {
142
+ return result(id, checkedAt, "unconfigured", "env は ${KEY_NAME} 形式で登録してください。", false);
143
+ }
144
+ const secret = credentialState.values.get(envName);
145
+ if (!credentialState.exists || typeof secret !== "string" || secret.length === 0) {
146
+ return result(id, checkedAt, "unconfigured", `${envName} は credentials.env に未設定です。`, false);
147
+ }
148
+
149
+ const adapter = adapters[id];
150
+ if (!adapter) {
151
+ return result(id, checkedAt, "unchecked", "無償・読み取り専用と確認済みの doctor adapter がありません。", true);
152
+ }
153
+ const doctor = await adapter(secret, checkedAt);
154
+ return { id, configured: true, doctor };
155
+ }
156
+
157
+ const adapters = {
158
+ fal: (secret, checkedAt) =>
159
+ checkGet("https://rest.alpha.fal.ai/billing/user_balance", { Authorization: `Key ${secret}` }, checkedAt),
160
+ replicate: (secret, checkedAt) =>
161
+ checkGet("https://api.replicate.com/v1/account", { Authorization: `Bearer ${secret}` }, checkedAt),
162
+ groq: (secret, checkedAt) =>
163
+ checkGet("https://api.groq.com/openai/v1/models", { Authorization: `Bearer ${secret}` }, checkedAt),
164
+ elevenlabs: (secret, checkedAt) =>
165
+ checkGet("https://api.elevenlabs.io/v1/models", { "xi-api-key": secret }, checkedAt),
166
+ openrouter: (secret, checkedAt) =>
167
+ checkGet("https://openrouter.ai/api/v1/key", { Authorization: `Bearer ${secret}` }, checkedAt),
168
+ };
169
+
170
+ const localAdapters = {
171
+ voicevox: (checkedAt) => checkVoicevox(checkedAt),
172
+ };
173
+
174
+ async function checkVoicevox(checkedAt) {
175
+ const controller = new AbortController();
176
+ const timeout = setTimeout(() => controller.abort(), timeoutMs);
177
+ try {
178
+ const response = await fetch("http://127.0.0.1:50021/version", {
179
+ method: "GET",
180
+ headers: { Accept: "application/json" },
181
+ redirect: "error",
182
+ signal: controller.signal,
183
+ });
184
+ if (response.ok) {
185
+ let version = "";
186
+ try {
187
+ version = String(await response.json()).trim();
188
+ } catch {
189
+ version = "";
190
+ }
191
+ return {
192
+ last_checked: checkedAt,
193
+ status: "ok",
194
+ detail: version
195
+ ? `VOICEVOX エンジンが起動中です(version ${version})。`
196
+ : "VOICEVOX エンジンが起動中です。",
197
+ };
198
+ }
199
+ return {
200
+ last_checked: checkedAt,
201
+ status: "setup_required",
202
+ detail: "VOICEVOX アプリを起動するか、generate-narration が自動起動します。",
203
+ };
204
+ } catch {
205
+ return {
206
+ last_checked: checkedAt,
207
+ status: "setup_required",
208
+ detail: "VOICEVOX アプリを起動するか、generate-narration が自動起動します。",
209
+ };
210
+ } finally {
211
+ clearTimeout(timeout);
212
+ }
213
+ }
214
+
215
+ async function checkGet(url, headers, checkedAt) {
216
+ const controller = new AbortController();
217
+ const timeout = setTimeout(() => controller.abort(), timeoutMs);
218
+ try {
219
+ const response = await fetch(url, {
220
+ method: "GET",
221
+ headers: { ...headers, Accept: "application/json" },
222
+ redirect: "error",
223
+ signal: controller.signal,
224
+ });
225
+ if (response.body) await response.body.cancel();
226
+ if (response.ok) {
227
+ return { last_checked: checkedAt, status: "ok", detail: "認証済み(無償・読み取り専用 GET で確認)。" };
228
+ }
229
+ if (response.status === 401 || response.status === 403) {
230
+ return { last_checked: checkedAt, status: "unauthorized", detail: `認証されませんでした(HTTP ${response.status})。` };
231
+ }
232
+ return { last_checked: checkedAt, status: "unchecked", detail: `認証を判定できませんでした(HTTP ${response.status})。` };
233
+ } catch (error) {
234
+ const timedOut = error instanceof Error && error.name === "AbortError";
235
+ return {
236
+ last_checked: checkedAt,
237
+ status: "unchecked",
238
+ detail: timedOut ? `接続確認が ${timeoutMs / 1000} 秒でタイムアウトしました。` : "ネットワーク不通のため確認できませんでした。",
239
+ };
240
+ } finally {
241
+ clearTimeout(timeout);
242
+ }
243
+ }
244
+
245
+ function result(id, checkedAt, status, detail, configured) {
246
+ return { id, configured, doctor: { last_checked: checkedAt, status, detail } };
247
+ }
248
+
249
+ function extractEnvName(value) {
250
+ if (typeof value !== "string") return null;
251
+ const match = /^\$\{([A-Za-z_][A-Za-z0-9_]*)\}$/.exec(value);
252
+ return match ? match[1] : null;
253
+ }
254
+
255
+ function printCredentialGuide(registry) {
256
+ console.log(`credentials.env がありません: ${credentialsPath}`);
257
+ console.log(`作成後に chmod 600 ${credentialsPath} を実行してください。キーは人間が取得して配置してください。`);
258
+ for (const provider of registry.providers) {
259
+ if (provider.auth !== "env-key") continue;
260
+ const name = extractEnvName(provider.env) ?? "KEY_NAME";
261
+ const setupUrl = isPlainObject(provider.notes) ? provider.notes.setup_url : null;
262
+ console.log(`- ${provider.id}: ${name}${typeof setupUrl === "string" ? ` / ${setupUrl}` : ""}`);
263
+ }
264
+ }
265
+
266
+ function refuseSecretLeak(output, values) {
267
+ for (const secret of values.values()) {
268
+ if (secret && output.includes(secret)) {
269
+ throw new Error("資格情報の値と一致する文字列が出力に含まれています");
270
+ }
271
+ }
272
+ }
273
+
274
+ function renderReport(registry, results, credentialState, checkedAt) {
275
+ const resultById = new Map(results.map((item) => [item.id, item]));
276
+ const cards = registry.providers.map((provider) => {
277
+ const result = resultById.get(provider.id);
278
+ const notes = isPlainObject(provider.notes) ? provider.notes : {};
279
+ const credentialLabel = provider.auth === "env-key"
280
+ ? result?.configured
281
+ ? "設定済み(マスク)"
282
+ : "未設定"
283
+ : provider.auth === "none"
284
+ ? "不要(ローカル接続)"
285
+ : `${provider.auth}(値なし)`;
286
+ const allowed = Array.isArray(provider.models?.allowed) && provider.models.allowed.length > 0
287
+ ? provider.models.allowed.join(", ")
288
+ : "未設定";
289
+ return `<article class="card status-${escapeHtml(provider.doctor.status)}">
290
+ <div class="card-head"><h2>${escapeHtml(provider.id)}</h2><span>${escapeHtml(provider.doctor.status)}</span></div>
291
+ <dl>
292
+ <dt>用途</dt><dd>${escapeHtml(notes.description ?? "未記入")}</dd>
293
+ <dt>工程</dt><dd>${escapeHtml(arrayText(notes.workflows))}</dd>
294
+ <dt>課金モデル</dt><dd>${escapeHtml(notes.billing ?? "未記入")}</dd>
295
+ <dt>quota</dt><dd>${escapeHtml(notes.quota ?? "未記入")}</dd>
296
+ <dt>必要スコープ</dt><dd>${escapeHtml(arrayText(notes.scopes))}</dd>
297
+ <dt>資格情報</dt><dd>${escapeHtml(credentialLabel)}</dd>
298
+ <dt>既定モデル</dt><dd>${escapeHtml(provider.models?.default ?? "未設定")}</dd>
299
+ <dt>許可モデル</dt><dd>${escapeHtml(allowed)}</dd>
300
+ <dt>最終確認</dt><dd>${escapeHtml(provider.doctor.last_checked ?? "未確認")}</dd>
301
+ <dt>結果</dt><dd>${escapeHtml(provider.doctor.detail ?? "未確認")}</dd>
302
+ </dl>
303
+ ${typeof notes.setup_url === "string" ? `<p><a href="${escapeHtml(notes.setup_url)}">設定ページ</a></p>` : ""}
304
+ </article>`;
305
+ }).join("\n");
306
+ const missingGuide = credentialState.exists ? "" : `<section class="guide"><h2>credentials.env の準備</h2><p><code>${escapeHtml(credentialsPath)}</code> を作成し、権限を 600 にしてください。次の KEY 名だけを登録し、値はレポートや会話へ貼らないでください。</p><ul>${registry.providers.filter((provider) => provider.auth === "env-key").map((provider) => {
307
+ const notes = isPlainObject(provider.notes) ? provider.notes : {};
308
+ return `<li>${escapeHtml(provider.id)}: <code>${escapeHtml(extractEnvName(provider.env) ?? "KEY_NAME")}</code>${typeof notes.setup_url === "string" ? ` — <a href="${escapeHtml(notes.setup_url)}">取得先</a>` : ""}</li>`;
309
+ }).join("")}</ul></section>`;
310
+ const policy = registry.policy;
311
+ return `<!doctype html>
312
+ <html lang="ja"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><meta http-equiv="Content-Security-Policy" content="default-src 'none'; style-src 'unsafe-inline'; img-src data:; base-uri 'none'; form-action 'none'"><title>AKARI 接続レポート</title><style>
313
+ :root{color-scheme:light dark;font-family:system-ui,sans-serif}body{max-width:1100px;margin:0 auto;padding:32px 20px;background:#10131a;color:#eef2f8}header,.guide,.policy,.card{background:#191f2b;border:1px solid #303a4d;border-radius:14px;padding:20px}.summary{color:#aeb8ca}.grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:16px;margin-top:18px}.card-head{display:flex;align-items:center;justify-content:space-between;gap:12px}.card h2{margin:0}.card-head span{border-radius:999px;padding:4px 10px;background:#384359}.status-ok{border-color:#2d9d78}.status-unauthorized{border-color:#d76a6a}.status-unconfigured{border-color:#d5a941}dl{display:grid;grid-template-columns:8em 1fr;gap:8px;margin-bottom:0}dt{color:#aeb8ca}dd{margin:0;overflow-wrap:anywhere}a{color:#81b7ff}.guide,.policy{margin-top:18px}code{overflow-wrap:anywhere}</style></head>
314
+ <body><header><h1>AKARI 接続レポート</h1><p class="summary">生成日時: ${escapeHtml(checkedAt)}。資格情報は存在有無だけを表示し、値は保存していません。</p></header>
315
+ ${missingGuide}
316
+ <section class="policy"><h2>コスト承認ポリシー</h2><dl><dt>通貨</dt><dd>${escapeHtml(policy.currency)}</dd><dt>月間予算上限</dt><dd>${escapeHtml(money(policy.monthly_budget, policy.currency))}</dd><dt>個別承認閾値</dt><dd>${escapeHtml(money(policy.approval_threshold, policy.currency))}</dd><dt>予算消化状況</dt><dd>実績データ未連携</dd></dl></section>
317
+ <main class="grid">${cards}</main></body></html>\n`;
318
+ }
319
+
320
+ function money(value, currency) {
321
+ return typeof value === "number" ? `${value} ${currency}` : "未設定(有償操作を停止)";
322
+ }
323
+
324
+ function arrayText(value) {
325
+ return Array.isArray(value) && value.length > 0 ? value.join(" / ") : "未記入";
326
+ }
327
+
328
+ function escapeHtml(value) {
329
+ return String(value ?? "").replace(/[&<>"']/g, (character) => ({
330
+ "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;", "'": "&#39;",
331
+ })[character]);
332
+ }
333
+
334
+ function isPlainObject(value) {
335
+ return value !== null && typeof value === "object" && !Array.isArray(value);
336
+ }
337
+
338
+ main().catch(() => {
339
+ console.error("接続確認を完了できませんでした。connections.json の形式と書き込み権限を確認してください。");
340
+ process.exitCode = 1;
341
+ });