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