@litfamily/litopencode 1.0.7 → 1.0.9
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/CHANGELOG.md +18 -0
- package/README-Ko-KR.md +314 -31
- package/README.md +312 -29
- package/dist/activation-primary-prompts.d.ts +1 -0
- package/dist/activation-primary-prompts.js +16 -0
- package/dist/activation-probe.js +4 -1
- package/dist/activation-prompt-utils.d.ts +1 -1
- package/dist/activation-routing.d.ts +6 -1
- package/dist/activation-routing.js +174 -16
- package/dist/activation-workflow-prompts.d.ts +1 -1
- package/dist/activation-workflow-prompts.js +18 -17
- package/dist/activation.d.ts +3 -2
- package/dist/activation.js +6 -6
- package/dist/agents/defaults.js +14 -6
- package/dist/cli/command-aliases.js +24 -22
- package/dist/cli/doctor.js +3 -0
- package/dist/cli/install-report.d.ts +1 -0
- package/dist/cli/install-report.js +4 -0
- package/dist/cli/install.js +7 -4
- package/dist/cli/managed-skill-assets.d.ts +1 -1
- package/dist/cli/managed-skill-assets.js +15 -5
- package/dist/cli/motion-runtime.d.ts +6 -0
- package/dist/cli/motion-runtime.js +46 -0
- package/dist/cli/native-skill-install.js +32 -9
- package/dist/cli/native-skill-integrity.js +1 -0
- package/dist/cli/native-skills.d.ts +2 -0
- package/dist/cli/native-skills.js +2 -1
- package/dist/cli/office-dependencies.d.ts +14 -0
- package/dist/cli/office-dependencies.js +24 -0
- package/dist/cli.js +13 -3
- package/dist/commands.d.ts +2 -11
- package/dist/commands.js +9 -17
- package/dist/deliverable-hedge-guard.d.ts +20 -21
- package/dist/deliverable-hedge-guard.js +234 -275
- package/dist/features.d.ts +81 -2
- package/dist/features.js +80 -13
- package/dist/hooks.d.ts +3 -2
- package/dist/hooks.js +4 -4
- package/dist/ignition.d.ts +1 -1
- package/dist/ignition.js +15 -4
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/interface-handoff.d.ts +1 -0
- package/dist/interface-handoff.js +1 -0
- package/dist/motion-image-reads.d.ts +6 -0
- package/dist/motion-image-reads.js +46 -0
- package/dist/server.js +13 -11
- package/dist/skill-renames.d.ts +4 -2
- package/dist/skill-renames.js +12 -4
- package/dist/skills.d.ts +31 -3
- package/dist/skills.js +53 -9
- package/dist/tools.js +4 -4
- package/docs/ab/S11/baseline-desktop.webp +0 -0
- package/docs/ab/S11/baseline-phone.webp +0 -0
- package/docs/ab/S11/lit-desktop.webp +0 -0
- package/docs/ab/S11/lit-phone.webp +0 -0
- package/docs/ab/S3/baseline-desktop.webp +0 -0
- package/docs/ab/S3/baseline-phone.webp +0 -0
- package/docs/ab/S3/lit-desktop.webp +0 -0
- package/docs/ab/S3/lit-phone.webp +0 -0
- package/docs/ab/S4/baseline-desktop.webp +0 -0
- package/docs/ab/S4/baseline-phone.webp +0 -0
- package/docs/ab/S4/lit-desktop.webp +0 -0
- package/docs/ab/S4/lit-phone.webp +0 -0
- package/docs/ab/S5/lit-slides.webp +0 -0
- package/docs/ab/S7/lit-diagram.webp +0 -0
- package/docs/ab/S8/baseline-slides.webp +0 -0
- package/docs/ab/S8/lit-slides.webp +0 -0
- package/docs/ab/S9/lit-pages.webp +0 -0
- package/docs/assets/cover-motion-still.webp +0 -0
- package/docs/assets/cover-motion.webp +0 -0
- package/docs/assets/readme/badge-version.svg +1 -1
- package/docs/assets/skills/autoconference.webp +0 -0
- package/docs/assets/skills/automatic-guards.webp +0 -0
- package/docs/assets/skills/autoresearch.webp +0 -0
- package/docs/assets/skills/browser-drive.webp +0 -0
- package/docs/assets/skills/debugging.webp +0 -0
- package/docs/assets/skills/deep-interview.webp +0 -0
- package/docs/assets/skills/doctor-installer.webp +0 -0
- package/docs/assets/skills/durable-litgoal.webp +0 -0
- package/docs/assets/skills/frontend-ui-ux.webp +0 -0
- package/docs/assets/skills/lit-burnoff-file.webp +0 -0
- package/docs/assets/skills/lit-burnoff.webp +0 -0
- package/docs/assets/skills/lit-code.webp +0 -0
- package/docs/assets/skills/lit-commit.webp +0 -0
- package/docs/assets/skills/lit-comprehend.webp +0 -0
- package/docs/assets/skills/lit-crucible.webp +0 -0
- package/docs/assets/skills/lit-diagram-drawer.webp +0 -0
- package/docs/assets/skills/lit-docx.webp +0 -0
- package/docs/assets/skills/lit-fetch.webp +0 -0
- package/docs/assets/skills/lit-handoff.webp +0 -0
- package/docs/assets/skills/lit-humanizer.webp +0 -0
- package/docs/assets/skills/lit-init.webp +0 -0
- package/docs/assets/skills/lit-plan.webp +0 -0
- package/docs/assets/skills/lit-pptx.webp +0 -0
- package/docs/assets/skills/lit-recap.webp +0 -0
- package/docs/assets/skills/lit-scientific-visualization.webp +0 -0
- package/docs/assets/skills/lit-typographic-motion.webp +0 -0
- package/docs/assets/skills/litresearch.webp +0 -0
- package/docs/assets/skills/litwork.webp +0 -0
- package/docs/assets/skills/lsp-setup.webp +0 -0
- package/docs/assets/skills/lsp.webp +0 -0
- package/docs/assets/skills/readme-studio.webp +0 -0
- package/docs/assets/skills/refactor.webp +0 -0
- package/docs/assets/skills/review-work.webp +0 -0
- package/docs/assets/skills/rules.webp +0 -0
- package/docs/assets/skills/start-work.webp +0 -0
- package/docs/assets/skills/structural-search.webp +0 -0
- package/docs/assets/skills/visual-qa.webp +0 -0
- package/docs/assets/skills/wikify.webp +0 -0
- package/docs/reference-Ko-KR.md +5 -1
- package/docs/reference.md +6 -2
- package/package.json +1 -1
- package/rules/bundled-rules/lit-humanizer.md +12 -0
- package/skills/autoconference/SKILL.md +1 -1
- package/skills/autoconference/assets/report_template.md +1 -1
- package/skills/autoresearch/references/type-checklists.md +1 -1
- package/skills/browser-drive/SKILL.md +19 -5
- package/skills/browser-drive/scripts/capability-probe.mjs +26 -5
- package/skills/frontend-ui-ux/SKILL.md +10 -15
- package/skills/frontend-ui-ux/data/THIRD-PARTY-NOTICE.txt +10 -0
- package/skills/frontend-ui-ux/references/adaptive-layout.md +3 -11
- package/skills/frontend-ui-ux/references/brand-and-imagery.md +6 -11
- package/skills/frontend-ui-ux/references/complete-contract.md +10 -3
- package/skills/frontend-ui-ux/references/composition.md +1 -7
- package/skills/frontend-ui-ux/references/craft-floor.md +94 -0
- package/skills/frontend-ui-ux/references/creative-directions.md +1 -7
- package/skills/frontend-ui-ux/references/evidence-review.md +2 -12
- package/skills/frontend-ui-ux/references/implementation-platforms.md +1 -4
- package/skills/frontend-ui-ux/references/inclusive-interface.md +1 -3
- package/skills/frontend-ui-ux/references/interaction-motion.md +1 -7
- package/skills/frontend-ui-ux/references/motion-guide.md +125 -0
- package/skills/frontend-ui-ux/references/operating-lanes.md +2 -8
- package/skills/frontend-ui-ux/references/product-direction.md +1 -6
- package/skills/frontend-ui-ux/references/production.md +12 -5
- package/skills/frontend-ui-ux/references/redesign-playbook.md +1 -7
- package/skills/frontend-ui-ux/references/slop-register.md +103 -0
- package/skills/frontend-ui-ux/references/system-foundations.md +1 -8
- package/skills/frontend-ui-ux/references/taste-direction.md +4 -11
- package/skills/frontend-ui-ux/references/visual-language.md +1 -6
- package/skills/frontend-ui-ux/references/visual-reconstruction.md +2 -7
- package/skills/frontend-ui-ux/scripts/probe-page.mjs +326 -0
- package/skills/frontend-ui-ux/scripts/probe-server.mjs +24 -0
- package/skills/frontend-ui-ux/scripts/probe-static.mjs +42 -0
- package/skills/frontend-ui-ux/scripts/probe-thresholds.json +86 -0
- package/skills/frontend-ui-ux/scripts/probe.mjs +183 -0
- package/skills/lit-comprehend/SKILL.md +10 -11
- package/skills/lit-comprehend/references/artifact-template.md +2 -18
- package/skills/lit-comprehend/scripts/verify-explainer.ts +0 -14
- package/skills/lit-diagram-drawer/NOTICE.md +33 -0
- package/skills/lit-diagram-drawer/SKILL.md +101 -0
- package/skills/lit-diagram-drawer/assets/examples/type-architecture-dark.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-architecture-full.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-architecture-light.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-bar-dark.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-bar-full.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-bar-light.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-beeswarm-dark.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-beeswarm-full.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-beeswarm-light.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-bubble-dark.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-bubble-full.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-bubble-light.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-bump-dark.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-bump-full.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-bump-light.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-data-flow-dark.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-data-flow-full.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-data-flow-light.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-datalake-dark.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-datalake-full.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-datalake-light.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-db-schema-dark.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-db-schema-full.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-db-schema-light.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-dependency-dark.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-dependency-full.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-dependency-light.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-deployment-dark.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-deployment-full.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-deployment-light.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-dp-integration-dark.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-dp-integration-full.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-dp-integration-light.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-dp-security-matrix-dark.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-dp-security-matrix-full.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-dp-security-matrix-light.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-er-dark.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-er-full.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-er-light.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-fishbone-dark.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-fishbone-full.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-fishbone-light.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-flowchart-dark.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-flowchart-full.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-flowchart-light.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-gantt-dark.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-gantt-full.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-gantt-light.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-heatmap-dark.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-heatmap-full.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-heatmap-light.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-high-level-dark.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-high-level-full.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-high-level-light.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-high-level-vertical-dark.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-high-level-vertical-full.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-high-level-vertical-light.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-import-drawio-dark.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-import-drawio-full.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-import-drawio-light.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-import-excalidraw-dark.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-import-excalidraw-full.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-import-excalidraw-light.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-import-mermaid-dark.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-import-mermaid-full.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-import-mermaid-light.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-it-state-dark.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-it-state-full.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-it-state-light.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-journey-dark.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-journey-full.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-journey-light.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-kanban-dark.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-kanban-full.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-kanban-light.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-layers-dark.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-layers-full.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-layers-light.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-line-dark.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-line-full.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-line-light.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-loop-dark.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-loop-full.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-loop-light.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-loop-terminal-dark.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-loop-terminal-full.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-loop-terminal-light.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-marimekko-dark.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-marimekko-full.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-marimekko-light.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-medallion-dark.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-medallion-full.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-medallion-light.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-nested-dark.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-nested-full.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-nested-light.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-org-chart-dark.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-org-chart-full.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-org-chart-light.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-paved-road-animated-dark.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-paved-road-animated-full.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-paved-road-animated-light.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-polar-dark.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-polar-full.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-polar-light.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-policy-trace-animated-dark.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-policy-trace-animated-full.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-policy-trace-animated-light.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-process-dark.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-process-full.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-process-light.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-pyramid-dark.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-pyramid-full.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-pyramid-light.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-quadrant-consultant-dark.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-quadrant-consultant-full.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-quadrant-consultant-light.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-quadrant-dark.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-quadrant-full.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-quadrant-light.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-queue-animated-dark.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-queue-animated-full.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-queue-animated-light.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-radar-dark.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-radar-full.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-radar-light.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-ridgeline-dark.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-ridgeline-full.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-ridgeline-light.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-sankey-dark.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-sankey-full.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-sankey-light.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-scatter-dark.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-scatter-full.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-scatter-light.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-sequence-dark.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-sequence-full.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-sequence-light.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-sequence-oauth-dark.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-sequence-oauth-full.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-sequence-oauth-light.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-slopegraph-dark.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-slopegraph-full.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-slopegraph-light.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-state-dark.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-state-full.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-state-lifecycle-dark.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-state-lifecycle-full.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-state-lifecycle-light.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-state-light.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-story-map-dark.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-story-map-full.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-story-map-light.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-streamgraph-dark.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-streamgraph-full.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-streamgraph-light.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-swimlane-dark.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-swimlane-full.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-swimlane-light.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-timeline-dark.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-timeline-full.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-timeline-light.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-tree-block-decomposition-dark.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-tree-block-decomposition-full.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-tree-block-decomposition-light.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-tree-dark.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-tree-full.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-tree-light.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-treemap-dark.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-treemap-full.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-treemap-light.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-uml-class-dark.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-uml-class-full.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-uml-class-light.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-venn-dark.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-venn-full.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-venn-light.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-wardley-dark.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-wardley-full.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-wardley-light.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-waterfall-dark.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-waterfall-full.html +1 -0
- package/skills/lit-diagram-drawer/assets/examples/type-waterfall-light.html +1 -0
- package/skills/lit-diagram-drawer/assets/fonts/OFL.txt +94 -0
- package/skills/lit-diagram-drawer/assets/fonts/PretendardVariable.woff2 +0 -0
- package/skills/lit-diagram-drawer/assets/fonts/provenance.json +23 -0
- package/skills/lit-diagram-drawer/assets/icons.html +231 -0
- package/skills/lit-diagram-drawer/assets/licenses/devicon-MIT.txt +20 -0
- package/skills/lit-diagram-drawer/assets/licenses/diagram-design-MIT.txt +21 -0
- package/skills/lit-diagram-drawer/assets/licenses/log-z-MIT.txt +21 -0
- package/skills/lit-diagram-drawer/assets/licenses/simple-icons-CC0.md +30 -0
- package/skills/lit-diagram-drawer/assets/licenses/tabler-MIT.txt +21 -0
- package/skills/lit-diagram-drawer/examples/01-service-architecture/after.html +1 -0
- package/skills/lit-diagram-drawer/examples/01-service-architecture/brief.md +33 -0
- package/skills/lit-diagram-drawer/examples/02-release-decision/after.html +1 -0
- package/skills/lit-diagram-drawer/examples/02-release-decision/brief.md +18 -0
- package/skills/lit-diagram-drawer/examples/03-data-retention/after.html +1 -0
- package/skills/lit-diagram-drawer/examples/03-data-retention/brief.md +19 -0
- package/skills/lit-diagram-drawer/examples/04-oauth-sequence/after.html +1 -0
- package/skills/lit-diagram-drawer/examples/04-oauth-sequence/brief.md +17 -0
- package/skills/lit-diagram-drawer/examples/05-review-lanes/after.html +1 -0
- package/skills/lit-diagram-drawer/examples/05-review-lanes/brief.md +17 -0
- package/skills/lit-diagram-drawer/examples/06-rollout-gates/after.html +1 -0
- package/skills/lit-diagram-drawer/examples/06-rollout-gates/brief.md +17 -0
- package/skills/lit-diagram-drawer/examples/07-deployment-boundary/after.html +1 -0
- package/skills/lit-diagram-drawer/examples/07-deployment-boundary/brief.md +19 -0
- package/skills/lit-diagram-drawer/examples/08-policy-traces/after.html +1 -0
- package/skills/lit-diagram-drawer/examples/08-policy-traces/brief.md +20 -0
- package/skills/lit-diagram-drawer/references/accessibility.md +37 -0
- package/skills/lit-diagram-drawer/references/export.md +17 -0
- package/skills/lit-diagram-drawer/references/import-drawio.md +13 -0
- package/skills/lit-diagram-drawer/references/import-excalidraw.md +11 -0
- package/skills/lit-diagram-drawer/references/import-mermaid.md +12 -0
- package/skills/lit-diagram-drawer/references/import-schema.md +28 -0
- package/skills/lit-diagram-drawer/references/korean-typography.md +34 -0
- package/skills/lit-diagram-drawer/references/motion.md +29 -0
- package/skills/lit-diagram-drawer/references/office-pptx-docx.md +28 -0
- package/skills/lit-diagram-drawer/references/output-spec.md +48 -0
- package/skills/lit-diagram-drawer/references/primitive-annotation.md +12 -0
- package/skills/lit-diagram-drawer/references/primitive-icons.md +21 -0
- package/skills/lit-diagram-drawer/references/primitive-sketchy.md +11 -0
- package/skills/lit-diagram-drawer/references/primitive-terminal.md +11 -0
- package/skills/lit-diagram-drawer/references/profiles.md +24 -0
- package/skills/lit-diagram-drawer/references/semantic-patterns.md +27 -0
- package/skills/lit-diagram-drawer/references/style-guide.md +67 -0
- package/skills/lit-diagram-drawer/references/type-architecture.md +51 -0
- package/skills/lit-diagram-drawer/references/type-bar.md +51 -0
- package/skills/lit-diagram-drawer/references/type-beeswarm.md +49 -0
- package/skills/lit-diagram-drawer/references/type-bubble.md +49 -0
- package/skills/lit-diagram-drawer/references/type-bump.md +49 -0
- package/skills/lit-diagram-drawer/references/type-catalog.json +1433 -0
- package/skills/lit-diagram-drawer/references/type-data-flow.md +51 -0
- package/skills/lit-diagram-drawer/references/type-datalake.md +49 -0
- package/skills/lit-diagram-drawer/references/type-db-schema.md +49 -0
- package/skills/lit-diagram-drawer/references/type-dependency.md +49 -0
- package/skills/lit-diagram-drawer/references/type-deployment.md +49 -0
- package/skills/lit-diagram-drawer/references/type-dp-integration.md +49 -0
- package/skills/lit-diagram-drawer/references/type-dp-security-matrix.md +49 -0
- package/skills/lit-diagram-drawer/references/type-er.md +49 -0
- package/skills/lit-diagram-drawer/references/type-fishbone.md +49 -0
- package/skills/lit-diagram-drawer/references/type-flowchart.md +49 -0
- package/skills/lit-diagram-drawer/references/type-gantt.md +49 -0
- package/skills/lit-diagram-drawer/references/type-heatmap.md +53 -0
- package/skills/lit-diagram-drawer/references/type-high-level-vertical.md +53 -0
- package/skills/lit-diagram-drawer/references/type-high-level.md +53 -0
- package/skills/lit-diagram-drawer/references/type-import-drawio.md +53 -0
- package/skills/lit-diagram-drawer/references/type-import-excalidraw.md +53 -0
- package/skills/lit-diagram-drawer/references/type-import-mermaid.md +53 -0
- package/skills/lit-diagram-drawer/references/type-it-state.md +54 -0
- package/skills/lit-diagram-drawer/references/type-journey.md +54 -0
- package/skills/lit-diagram-drawer/references/type-kanban.md +54 -0
- package/skills/lit-diagram-drawer/references/type-layers.md +54 -0
- package/skills/lit-diagram-drawer/references/type-line.md +54 -0
- package/skills/lit-diagram-drawer/references/type-loop-terminal.md +53 -0
- package/skills/lit-diagram-drawer/references/type-loop.md +54 -0
- package/skills/lit-diagram-drawer/references/type-marimekko.md +54 -0
- package/skills/lit-diagram-drawer/references/type-medallion.md +54 -0
- package/skills/lit-diagram-drawer/references/type-nested.md +59 -0
- package/skills/lit-diagram-drawer/references/type-org-chart.md +58 -0
- package/skills/lit-diagram-drawer/references/type-paved-road-animated.md +72 -0
- package/skills/lit-diagram-drawer/references/type-polar.md +67 -0
- package/skills/lit-diagram-drawer/references/type-policy-trace-animated.md +69 -0
- package/skills/lit-diagram-drawer/references/type-process.md +58 -0
- package/skills/lit-diagram-drawer/references/type-pyramid.md +59 -0
- package/skills/lit-diagram-drawer/references/type-quadrant-consultant.md +60 -0
- package/skills/lit-diagram-drawer/references/type-quadrant.md +57 -0
- package/skills/lit-diagram-drawer/references/type-queue-animated.md +63 -0
- package/skills/lit-diagram-drawer/references/type-radar.md +57 -0
- package/skills/lit-diagram-drawer/references/type-ridgeline.md +63 -0
- package/skills/lit-diagram-drawer/references/type-sankey.md +68 -0
- package/skills/lit-diagram-drawer/references/type-scatter.md +60 -0
- package/skills/lit-diagram-drawer/references/type-sequence-oauth.md +66 -0
- package/skills/lit-diagram-drawer/references/type-sequence.md +63 -0
- package/skills/lit-diagram-drawer/references/type-slopegraph.md +65 -0
- package/skills/lit-diagram-drawer/references/type-state-lifecycle.md +53 -0
- package/skills/lit-diagram-drawer/references/type-state.md +59 -0
- package/skills/lit-diagram-drawer/references/type-story-map.md +52 -0
- package/skills/lit-diagram-drawer/references/type-streamgraph.md +53 -0
- package/skills/lit-diagram-drawer/references/type-swimlane.md +52 -0
- package/skills/lit-diagram-drawer/references/type-timeline.md +52 -0
- package/skills/lit-diagram-drawer/references/type-tree-block-decomposition.md +57 -0
- package/skills/lit-diagram-drawer/references/type-tree.md +54 -0
- package/skills/lit-diagram-drawer/references/type-treemap.md +54 -0
- package/skills/lit-diagram-drawer/references/type-uml-class.md +52 -0
- package/skills/lit-diagram-drawer/references/type-venn.md +51 -0
- package/skills/lit-diagram-drawer/references/type-wardley.md +52 -0
- package/skills/lit-diagram-drawer/references/type-waterfall.md +54 -0
- package/skills/lit-diagram-drawer/references/verifier-guide.md +59 -0
- package/skills/lit-diagram-drawer/scripts/block-registry.mjs +43 -0
- package/skills/lit-diagram-drawer/scripts/brief-contract.mjs +94 -0
- package/skills/lit-diagram-drawer/scripts/capability-probe.mjs +132 -0
- package/skills/lit-diagram-drawer/scripts/check-visible-text.mjs +15 -0
- package/skills/lit-diagram-drawer/scripts/craft-thresholds.json +15 -0
- package/skills/lit-diagram-drawer/scripts/diagram-metrics.mjs +216 -0
- package/skills/lit-diagram-drawer/scripts/doctor.mjs +8 -0
- package/skills/lit-diagram-drawer/scripts/drawio-extract.mjs +214 -0
- package/skills/lit-diagram-drawer/scripts/excalidraw-extract.mjs +151 -0
- package/skills/lit-diagram-drawer/scripts/export.mjs +133 -0
- package/skills/lit-diagram-drawer/scripts/import-shared.mjs +130 -0
- package/skills/lit-diagram-drawer/scripts/mermaid-extract.mjs +173 -0
- package/skills/lit-diagram-drawer/scripts/office-safety.mjs +120 -0
- package/skills/lit-diagram-drawer/scripts/renderer-safety.mjs +46 -0
- package/skills/lit-diagram-drawer/scripts/test-block-registry.mjs +20 -0
- package/skills/lit-diagram-drawer/scripts/test-brief-contract.mjs +27 -0
- package/skills/lit-diagram-drawer/scripts/test-importers.mjs +119 -0
- package/skills/lit-diagram-drawer/scripts/test-office-safety.mjs +67 -0
- package/skills/lit-diagram-drawer/scripts/test-sequence-verifier.mjs +28 -0
- package/skills/lit-diagram-drawer/scripts/test-visual-quality.mjs +68 -0
- package/skills/lit-diagram-drawer/scripts/verify-all.mjs +74 -0
- package/skills/lit-diagram-drawer/scripts/verify-brief.mjs +47 -0
- package/skills/lit-diagram-drawer/scripts/verify-coverage.mjs +56 -0
- package/skills/lit-diagram-drawer/scripts/verify-diagram.mjs +26 -0
- package/skills/lit-diagram-drawer/scripts/verify-motion.mjs +12 -0
- package/skills/lit-diagram-drawer/scripts/verify-type.mjs +48 -0
- package/skills/lit-diagram-drawer/scripts/visual-quality.mjs +363 -0
- package/skills/lit-docx/LICENSE-MIT.txt +21 -0
- package/skills/lit-docx/SKILL.md +78 -0
- package/skills/lit-docx/references/frontmatter_schema.md +42 -0
- package/skills/lit-docx/references/journal_style_spec.md +17 -0
- package/skills/lit-docx/references/markdown_quality_checklist.md +37 -0
- package/skills/lit-docx/references/slop_phrase_list.yaml +58 -0
- package/skills/lit-docx/references/slop_rules.md +35 -0
- package/skills/lit-docx/requirements.in +5 -0
- package/skills/lit-docx/requirements.lock +289 -0
- package/skills/lit-docx/run.py +64 -0
- package/skills/lit-docx/scripts/clean_markdown.py +95 -0
- package/skills/lit-docx/scripts/convert_md_to_docx.py +1047 -0
- package/skills/lit-docx/scripts/convert_md_to_pdf.py +281 -0
- package/skills/lit-docx/scripts/convert_pdf.py +130 -0
- package/skills/lit-docx/scripts/craft-thresholds.json +11 -0
- package/skills/lit-docx/scripts/craft_docx.py +83 -0
- package/skills/lit-docx/scripts/edit_docx.py +297 -0
- package/skills/lit-docx/scripts/embed_images.py +78 -0
- package/skills/lit-docx/scripts/generate_docx_templates.py +491 -0
- package/skills/lit-docx/scripts/slop_lint.py +485 -0
- package/skills/lit-docx/scripts/visual_audit.py +41 -0
- package/skills/lit-docx/templates/docx/acs.docx +0 -0
- package/skills/lit-docx/templates/docx/elsevier.docx +0 -0
- package/skills/lit-docx/templates/docx/ieee.docx +0 -0
- package/skills/lit-docx/templates/docx/korean-generic.docx +0 -0
- package/skills/lit-docx/templates/docx/nature.docx +0 -0
- package/skills/lit-docx/templates/latex/acs/README.md +5 -0
- package/skills/lit-docx/templates/latex/acs/template.tex +37 -0
- package/skills/lit-docx/templates/latex/elsevier/README.md +5 -0
- package/skills/lit-docx/templates/latex/elsevier/template.tex +38 -0
- package/skills/lit-docx/templates/latex/ieee/README.md +5 -0
- package/skills/lit-docx/templates/latex/ieee/template.tex +37 -0
- package/skills/lit-docx/templates/latex/korean-generic/README.md +5 -0
- package/skills/lit-docx/templates/latex/korean-generic/template.tex +37 -0
- package/skills/lit-docx/templates/latex/nature/README.md +5 -0
- package/skills/lit-docx/templates/latex/nature/template.tex +37 -0
- package/skills/lit-docx/templates/registry.yaml +1366 -0
- package/skills/lit-humanizer/NOTICE +160 -0
- package/skills/lit-humanizer/SKILL.md +122 -0
- package/skills/lit-humanizer/assets/always-on-rule.md +9 -0
- package/skills/lit-humanizer/assets/report-skeleton.md +25 -0
- package/skills/lit-humanizer/assets/slide-text-skeleton.md +28 -0
- package/skills/lit-humanizer/examples/accessibility-note/after.md +7 -0
- package/skills/lit-humanizer/examples/accessibility-note/before.md +7 -0
- package/skills/lit-humanizer/examples/api-reference/after.md +9 -0
- package/skills/lit-humanizer/examples/api-reference/before.md +15 -0
- package/skills/lit-humanizer/examples/changelog/after.md +5 -0
- package/skills/lit-humanizer/examples/changelog/before.md +12 -0
- package/skills/lit-humanizer/examples/code-comments/after.md +10 -0
- package/skills/lit-humanizer/examples/code-comments/before.md +19 -0
- package/skills/lit-humanizer/examples/commit/after.md +5 -0
- package/skills/lit-humanizer/examples/commit/before.md +7 -0
- package/skills/lit-humanizer/examples/data-release/after.md +7 -0
- package/skills/lit-humanizer/examples/data-release/before.md +9 -0
- package/skills/lit-humanizer/examples/english-essay/after.md +5 -0
- package/skills/lit-humanizer/examples/english-essay/before.md +5 -0
- package/skills/lit-humanizer/examples/incident-update/after.md +7 -0
- package/skills/lit-humanizer/examples/incident-update/before.md +7 -0
- package/skills/lit-humanizer/examples/ko-essay/after.md +7 -0
- package/skills/lit-humanizer/examples/ko-essay/before.md +9 -0
- package/skills/lit-humanizer/examples/ko-report/after.md +9 -0
- package/skills/lit-humanizer/examples/ko-report/before.md +13 -0
- package/skills/lit-humanizer/examples/ko-slide/after.md +19 -0
- package/skills/lit-humanizer/examples/ko-slide/before.md +21 -0
- package/skills/lit-humanizer/examples/meeting-brief/after.md +9 -0
- package/skills/lit-humanizer/examples/meeting-brief/before.md +11 -0
- package/skills/lit-humanizer/examples/policy-faq/after.md +9 -0
- package/skills/lit-humanizer/examples/policy-faq/before.md +9 -0
- package/skills/lit-humanizer/examples/pr/after.md +15 -0
- package/skills/lit-humanizer/examples/pr/before.md +17 -0
- package/skills/lit-humanizer/examples/project-update/after.md +7 -0
- package/skills/lit-humanizer/examples/project-update/before.md +9 -0
- package/skills/lit-humanizer/examples/readme/after.md +12 -0
- package/skills/lit-humanizer/examples/readme/before.md +14 -0
- package/skills/lit-humanizer/examples/report/after.md +13 -0
- package/skills/lit-humanizer/examples/report/before.md +11 -0
- package/skills/lit-humanizer/examples/research-abstract/after.md +5 -0
- package/skills/lit-humanizer/examples/research-abstract/before.md +5 -0
- package/skills/lit-humanizer/examples/slides/after.md +19 -0
- package/skills/lit-humanizer/examples/slides/before.md +19 -0
- package/skills/lit-humanizer/examples/troubleshooting/after.md +11 -0
- package/skills/lit-humanizer/examples/troubleshooting/before.md +11 -0
- package/skills/lit-humanizer/fixtures/ko-metrics-golden.json +49 -0
- package/skills/lit-humanizer/fixtures/office/minimal.docx +0 -0
- package/skills/lit-humanizer/fixtures/office/minimal.pptx +0 -0
- package/skills/lit-humanizer/fixtures/pos-real.txt +26 -0
- package/skills/lit-humanizer/fixtures/rule-cases.json +306 -0
- package/skills/lit-humanizer/references/code-patterns.md +468 -0
- package/skills/lit-humanizer/references/deliverable-channels.md +111 -0
- package/skills/lit-humanizer/references/en-patterns-checklist.md +43 -0
- package/skills/lit-humanizer/references/en-patterns-content.md +243 -0
- package/skills/lit-humanizer/references/en-patterns-structure.md +375 -0
- package/skills/lit-humanizer/references/en-patterns.md +57 -0
- package/skills/lit-humanizer/references/ko-metrics.md +33 -0
- package/skills/lit-humanizer/references/ko-patterns-a-d.md +659 -0
- package/skills/lit-humanizer/references/ko-patterns-e-j.md +387 -0
- package/skills/lit-humanizer/references/ko-patterns.md +31 -0
- package/skills/lit-humanizer/references/rewrite-playbook.md +54 -0
- package/skills/lit-humanizer/references/taxonomy.md +153 -0
- package/skills/lit-humanizer/rules.json +884 -0
- package/skills/lit-humanizer/scripts/core.mjs +208 -0
- package/skills/lit-humanizer/scripts/detect.mjs +91 -0
- package/skills/lit-humanizer/scripts/extract_office_text.py +89 -0
- package/skills/lit-humanizer/scripts/guard-scan.mjs +36 -0
- package/skills/lit-humanizer/scripts/ko-metrics.mjs +124 -0
- package/skills/lit-humanizer/scripts/test-fixtures.mjs +54 -0
- package/skills/lit-humanizer/scripts/test-ko-metrics.mjs +27 -0
- package/skills/lit-pptx/FORBIDDEN_TERMS.json +55 -0
- package/skills/lit-pptx/NOTICE.md +3 -0
- package/skills/lit-pptx/SKILL.md +76 -0
- package/skills/lit-pptx/agents/analyst.md +49 -0
- package/skills/lit-pptx/agents/antithesis.md +59 -0
- package/skills/lit-pptx/agents/architect.md +44 -0
- package/skills/lit-pptx/agents/critic.md +42 -0
- package/skills/lit-pptx/agents/synthesizer.md +47 -0
- package/skills/lit-pptx/agents/thesis.md +33 -0
- package/skills/lit-pptx/assets/azure/circle-lg.png +0 -0
- package/skills/lit-pptx/assets/azure/circle-md.png +0 -0
- package/skills/lit-pptx/assets/azure/circle-sm.png +0 -0
- package/skills/lit-pptx/fonts/a2z-font/A2Z-Black.otf +0 -0
- package/skills/lit-pptx/fonts/a2z-font/A2Z-Bold.otf +0 -0
- package/skills/lit-pptx/fonts/a2z-font/A2Z-Light.otf +0 -0
- package/skills/lit-pptx/fonts/a2z-font/A2Z-Medium.otf +0 -0
- package/skills/lit-pptx/fonts/a2z-font/A2Z-Regular.otf +0 -0
- package/skills/lit-pptx/fonts/a2z-font/OFL.txt +94 -0
- package/skills/lit-pptx/fonts/a2z-font/SOURCE.md +29 -0
- package/skills/lit-pptx/package-lock.json +747 -0
- package/skills/lit-pptx/package.json +13 -0
- package/skills/lit-pptx/pretendard-font/LICENSE.txt +94 -0
- package/skills/lit-pptx/pretendard-font/public/static/LitOpenCodeSans-Bold.otf +0 -0
- package/skills/lit-pptx/pretendard-font/public/static/LitOpenCodeSans-Regular.otf +0 -0
- package/skills/lit-pptx/requirements.in +2 -0
- package/skills/lit-pptx/requirements.lock +285 -0
- package/skills/lit-pptx/run.mjs +71 -0
- package/skills/lit-pptx/scripts/check_ooxml.py +47 -0
- package/skills/lit-pptx/scripts/compile-deck.js +447 -0
- package/skills/lit-pptx/scripts/craft-thresholds.json +26 -0
- package/skills/lit-pptx/scripts/craft_extras.py +224 -0
- package/skills/lit-pptx/scripts/embed_fonts.py +204 -0
- package/skills/lit-pptx/scripts/layout_inventory.py +70 -0
- package/skills/lit-pptx/scripts/learn_template.py +433 -0
- package/skills/lit-pptx/scripts/lib/derive-palette.js +176 -0
- package/skills/lit-pptx/scripts/lib/directive-parser.js +244 -0
- package/skills/lit-pptx/scripts/lib/font-map.js +79 -0
- package/skills/lit-pptx/scripts/lib/gen-bg.js +85 -0
- package/skills/lit-pptx/scripts/lib/gen-gradient-assets.js +36 -0
- package/skills/lit-pptx/scripts/lib/layout-resolver.js +737 -0
- package/skills/lit-pptx/scripts/lib/markdown-loader.js +136 -0
- package/skills/lit-pptx/scripts/lib/render-adapter-html.js +364 -0
- package/skills/lit-pptx/scripts/lib/render-adapter-pptx.js +1848 -0
- package/skills/lit-pptx/scripts/lib/slide-ast.js +534 -0
- package/skills/lit-pptx/scripts/lib/spec-validator.js +94 -0
- package/skills/lit-pptx/scripts/lib/template-registry.js +355 -0
- package/skills/lit-pptx/scripts/qa_deck.py +773 -0
- package/skills/lit-pptx/scripts/validate_pptx.py +206 -0
- package/skills/lit-pptx/specs/markdown-slide-spec-v1.md +251 -0
- package/skills/lit-pptx/specs/markdown-slide-spec-v2.md +223 -0
- package/skills/lit-pptx/specs/slide-ast-v1.schema.json +229 -0
- package/skills/lit-pptx/specs/slide-ast-v2.schema.json +144 -0
- package/skills/lit-pptx/specs/template-enrollment-contract.md +379 -0
- package/skills/lit-pptx/templates/bauhaus_light.css +4 -0
- package/skills/lit-pptx/templates/boilerplate_professional.css +508 -0
- package/skills/lit-pptx/templates/enrolled/AZURE-A2Z/capabilities.yaml +146 -0
- package/skills/lit-pptx/templates/enrolled/AZURE-A2Z/layout-mapping.yaml +454 -0
- package/skills/lit-pptx/templates/enrolled/AZURE-A2Z/template.yaml +37 -0
- package/skills/lit-pptx/templates/enrolled/AZURE-PRO/capabilities.yaml +154 -0
- package/skills/lit-pptx/templates/enrolled/AZURE-PRO/layout-mapping.yaml +483 -0
- package/skills/lit-pptx/templates/enrolled/AZURE-PRO/template.yaml +37 -0
- package/skills/lit-pptx/templates/enrolled/BOILERPLATE-A2Z/capabilities.yaml +179 -0
- package/skills/lit-pptx/templates/enrolled/BOILERPLATE-A2Z/layout-mapping.yaml +299 -0
- package/skills/lit-pptx/templates/enrolled/BOILERPLATE-A2Z/template.yaml +45 -0
- package/skills/lit-pptx/templates/enrolled/BOILERPLATE-PRETENDARD/capabilities.yaml +181 -0
- package/skills/lit-pptx/templates/enrolled/BOILERPLATE-PRETENDARD/layout-mapping.yaml +299 -0
- package/skills/lit-pptx/templates/enrolled/BOILERPLATE-PRETENDARD/template.yaml +44 -0
- package/skills/lit-scientific-visualization/SKILL.md +2 -0
- package/skills/lit-typographic-motion/NOTICE +23 -0
- package/skills/lit-typographic-motion/SKILL.md +77 -0
- package/skills/lit-typographic-motion/THIRD_PARTY_NOTICES +25 -0
- package/skills/lit-typographic-motion/audio-analysis.py +52 -0
- package/skills/lit-typographic-motion/engine/browser.mjs +83 -0
- package/skills/lit-typographic-motion/engine/constants.mjs +177 -0
- package/skills/lit-typographic-motion/engine/contrast.mjs +101 -0
- package/skills/lit-typographic-motion/engine/encode.mjs +46 -0
- package/skills/lit-typographic-motion/engine/flash.mjs +216 -0
- package/skills/lit-typographic-motion/engine/look.mjs +166 -0
- package/skills/lit-typographic-motion/engine/page/common.js +105 -0
- package/skills/lit-typographic-motion/engine/page/engine.js +451 -0
- package/skills/lit-typographic-motion/engine/page/gl.js +213 -0
- package/skills/lit-typographic-motion/engine/page/lines.js +88 -0
- package/skills/lit-typographic-motion/engine/page/passes.js +144 -0
- package/skills/lit-typographic-motion/engine/page/post.js +119 -0
- package/skills/lit-typographic-motion/engine/page/scenes.js +187 -0
- package/skills/lit-typographic-motion/engine/page/type.js +321 -0
- package/skills/lit-typographic-motion/engine/png.mjs +139 -0
- package/skills/lit-typographic-motion/engine/sound.mjs +291 -0
- package/skills/lit-typographic-motion/engine/stage/capture.mjs +133 -0
- package/skills/lit-typographic-motion/engine/stage/clock.js +171 -0
- package/skills/lit-typographic-motion/engine/stage/frame-worker.mjs +47 -0
- package/skills/lit-typographic-motion/engine/stage/gate.mjs +119 -0
- package/skills/lit-typographic-motion/engine/stage/qa-page.js +158 -0
- package/skills/lit-typographic-motion/engine/stage/qa.mjs +208 -0
- package/skills/lit-typographic-motion/engine/stage/render.mjs +418 -0
- package/skills/lit-typographic-motion/engine/stage/scan.mjs +162 -0
- package/skills/lit-typographic-motion/engine/stage/stage-kit.js +310 -0
- package/skills/lit-typographic-motion/engine/stills.mjs +60 -0
- package/skills/lit-typographic-motion/engine/text.mjs +126 -0
- package/skills/lit-typographic-motion/engine/timing.mjs +289 -0
- package/skills/lit-typographic-motion/engine/treatment.mjs +254 -0
- package/skills/lit-typographic-motion/fonts/Archivo-100-400.ttf +0 -0
- package/skills/lit-typographic-motion/fonts/Archivo-100-700.ttf +0 -0
- package/skills/lit-typographic-motion/fonts/Archivo-100-900.ttf +0 -0
- package/skills/lit-typographic-motion/fonts/Archivo-125-400.ttf +0 -0
- package/skills/lit-typographic-motion/fonts/Archivo-125-700.ttf +0 -0
- package/skills/lit-typographic-motion/fonts/Archivo-125-900.ttf +0 -0
- package/skills/lit-typographic-motion/fonts/Archivo-75-400.ttf +0 -0
- package/skills/lit-typographic-motion/fonts/Archivo-75-700.ttf +0 -0
- package/skills/lit-typographic-motion/fonts/Archivo-75-900.ttf +0 -0
- package/skills/lit-typographic-motion/fonts/Archivo-OFL.txt +93 -0
- package/skills/lit-typographic-motion/fonts/Silkscreen-Bold.ttf +0 -0
- package/skills/lit-typographic-motion/fonts/Silkscreen-OFL.txt +93 -0
- package/skills/lit-typographic-motion/fonts/Silkscreen-Regular.ttf +0 -0
- package/skills/lit-typographic-motion/fonts/VT323-OFL.txt +93 -0
- package/skills/lit-typographic-motion/fonts/VT323-Regular.ttf +0 -0
- package/skills/lit-typographic-motion/fonts/pins.json +44 -0
- package/skills/lit-typographic-motion/fonts/stroke/CREDITS +52 -0
- package/skills/lit-typographic-motion/fonts/stroke/EMSAllure.svg +216 -0
- package/skills/lit-typographic-motion/fonts/stroke/EMSFelix.svg +216 -0
- package/skills/lit-typographic-motion/fonts/stroke/EMSOsmotron.svg +216 -0
- package/skills/lit-typographic-motion/fonts/stroke/EMSReadability.svg +216 -0
- package/skills/lit-typographic-motion/fonts/stroke/EMSTech.svg +217 -0
- package/skills/lit-typographic-motion/fonts/stroke/OFL.txt +85 -0
- package/skills/lit-typographic-motion/gate.mjs +593 -0
- package/skills/lit-typographic-motion/package-lock.json +78 -0
- package/skills/lit-typographic-motion/package.json +11 -0
- package/skills/lit-typographic-motion/probe.mjs +74 -0
- package/skills/lit-typographic-motion/references/authoring.md +110 -0
- package/skills/lit-typographic-motion/references/craft-loop.md +110 -0
- package/skills/lit-typographic-motion/references/runtime.md +88 -0
- package/skills/lit-typographic-motion/references/stage.md +164 -0
- package/skills/lit-typographic-motion/references/style-bibles.md +88 -0
- package/skills/lit-typographic-motion/references/treatment.md +143 -0
- package/skills/lit-typographic-motion/references/type-craft.md +55 -0
- package/skills/lit-typographic-motion/render.mjs +654 -0
- package/skills/lit-typographic-motion/requirements-audio.in +1 -0
- package/skills/lit-typographic-motion/requirements-audio.txt +790 -0
- package/skills/lit-typographic-motion/runtime.mjs +259 -0
- package/skills/lit-typographic-motion/word-timing-models.json +25 -0
- package/skills/litresearch/SKILL.md +41 -12
- package/skills/managed-skill-manifest.json +2367 -63
- package/skills/skill-rename-aliases.json +6 -1
- package/tools/check-pack-payload.mjs +22 -1
- package/tools/check-payload-substance.mjs +2 -2
- package/tools/payload-reference-exemptions.json +4 -0
- package/tools/payload-substance-allowlist.json +2 -3
- package/tools/payload-substance-parity.json +7 -7
- package/tools/version-manifests.json +4 -4
- package/skills/lit-korean/SKILL.md +0 -231
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "litopencode-motion-runtime",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"lockfileVersion": 3,
|
|
5
|
+
"requires": true,
|
|
6
|
+
"packages": {
|
|
7
|
+
"": {
|
|
8
|
+
"name": "litopencode-motion-runtime",
|
|
9
|
+
"version": "1.0.0",
|
|
10
|
+
"dependencies": {
|
|
11
|
+
"opentype.js": "1.3.4",
|
|
12
|
+
"playwright-core": "1.55.1",
|
|
13
|
+
"ws": "8.18.3"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"node_modules/opentype.js": {
|
|
17
|
+
"version": "1.3.4",
|
|
18
|
+
"resolved": "https://registry.npmjs.org/opentype.js/-/opentype.js-1.3.4.tgz",
|
|
19
|
+
"integrity": "sha512-d2JE9RP/6uagpQAVtJoF0pJJA/fgai89Cc50Yp0EJHk+eLp6QQ7gBoblsnubRULNY132I0J1QKMJ+JTbMqz4sw==",
|
|
20
|
+
"license": "MIT",
|
|
21
|
+
"dependencies": {
|
|
22
|
+
"string.prototype.codepointat": "^0.2.1",
|
|
23
|
+
"tiny-inflate": "^1.0.3"
|
|
24
|
+
},
|
|
25
|
+
"bin": {
|
|
26
|
+
"ot": "bin/ot"
|
|
27
|
+
},
|
|
28
|
+
"engines": {
|
|
29
|
+
"node": ">= 8.0.0"
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
"node_modules/playwright-core": {
|
|
33
|
+
"version": "1.55.1",
|
|
34
|
+
"resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.55.1.tgz",
|
|
35
|
+
"integrity": "sha512-Z6Mh9mkwX+zxSlHqdr5AOcJnfp+xUWLCt9uKV18fhzA8eyxUd8NUWzAjxUh55RZKSYwDGX0cfaySdhZJGMoJ+w==",
|
|
36
|
+
"license": "Apache-2.0",
|
|
37
|
+
"bin": {
|
|
38
|
+
"playwright-core": "cli.js"
|
|
39
|
+
},
|
|
40
|
+
"engines": {
|
|
41
|
+
"node": ">=18"
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
"node_modules/string.prototype.codepointat": {
|
|
45
|
+
"version": "0.2.1",
|
|
46
|
+
"resolved": "https://registry.npmjs.org/string.prototype.codepointat/-/string.prototype.codepointat-0.2.1.tgz",
|
|
47
|
+
"integrity": "sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg==",
|
|
48
|
+
"license": "MIT"
|
|
49
|
+
},
|
|
50
|
+
"node_modules/tiny-inflate": {
|
|
51
|
+
"version": "1.0.3",
|
|
52
|
+
"resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz",
|
|
53
|
+
"integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==",
|
|
54
|
+
"license": "MIT"
|
|
55
|
+
},
|
|
56
|
+
"node_modules/ws": {
|
|
57
|
+
"version": "8.18.3",
|
|
58
|
+
"resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz",
|
|
59
|
+
"integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==",
|
|
60
|
+
"license": "MIT",
|
|
61
|
+
"engines": {
|
|
62
|
+
"node": ">=10.0.0"
|
|
63
|
+
},
|
|
64
|
+
"peerDependencies": {
|
|
65
|
+
"bufferutil": "^4.0.1",
|
|
66
|
+
"utf-8-validate": ">=5.0.2"
|
|
67
|
+
},
|
|
68
|
+
"peerDependenciesMeta": {
|
|
69
|
+
"bufferutil": {
|
|
70
|
+
"optional": true
|
|
71
|
+
},
|
|
72
|
+
"utf-8-validate": {
|
|
73
|
+
"optional": true
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// The five MO-A-44 probes, reported on every doctor/status run: Chrome, ffmpeg (with the preview
|
|
3
|
+
// encoder rung), the WebGL2 renderer string from a real headless probe, the software-GL warning, and
|
|
4
|
+
// pre-warm state naming what is missing and the command that fixes it.
|
|
5
|
+
import { spawnSync } from "node:child_process";
|
|
6
|
+
import { existsSync, mkdtempSync, realpathSync, rmSync } from "node:fs";
|
|
7
|
+
import os from "node:os";
|
|
8
|
+
import path from "node:path";
|
|
9
|
+
import { fileURLToPath } from "node:url";
|
|
10
|
+
import { isSoftwareRenderer, unknownRenderer } from "./engine/constants.mjs";
|
|
11
|
+
import { chromeVersion, findChrome, launchLadder, loadPlaywright, which } from "./engine/browser.mjs";
|
|
12
|
+
import { inspectWarmState } from "./runtime.mjs";
|
|
13
|
+
|
|
14
|
+
export function previewEncoderRung(ffmpeg, env = process.env) {
|
|
15
|
+
if (ffmpeg) {
|
|
16
|
+
const encoders = spawnSync(ffmpeg, ["-hide_banner", "-encoders"], { encoding: "utf8", timeout: 15000 }).stdout ?? "";
|
|
17
|
+
if (/\blibwebp_anim\b/u.test(encoders)) return "libwebp_anim";
|
|
18
|
+
}
|
|
19
|
+
if (which("img2webp", env)) return "img2webp";
|
|
20
|
+
return ffmpeg ? "gif" : "none";
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export async function probe(env = process.env) {
|
|
24
|
+
const prewarm = inspectWarmState(env);
|
|
25
|
+
const chrome = findChrome(env);
|
|
26
|
+
const ffmpeg = which("ffmpeg", env);
|
|
27
|
+
const report = {
|
|
28
|
+
chrome: chrome.path ? { ok: true, path: chrome.path, version: chromeVersion(chrome.path) } : { ok: false, detail: `${chrome.missing} (not found on PATH / not installed)` },
|
|
29
|
+
ffmpeg: ffmpeg ? { ok: true, path: ffmpeg, version: (spawnSync(ffmpeg, ["-version"], { encoding: "utf8", timeout: 15000 }).stdout ?? "").split("\n")[0], previewEncoder: previewEncoderRung(ffmpeg, env) }
|
|
30
|
+
: { ok: false, detail: "ffmpeg not found on PATH", previewEncoder: previewEncoderRung(undefined, env) },
|
|
31
|
+
webgl2: { ok: false, renderer: null, flags: [], detail: "" },
|
|
32
|
+
softwareWarning: null,
|
|
33
|
+
prewarm
|
|
34
|
+
};
|
|
35
|
+
if (!chrome.path) report.webgl2.detail = "not probed: Chrome is missing";
|
|
36
|
+
else if (prewarm.deps.length) report.webgl2.detail = `not probed: the pinned driver is not pre-warmed; run ${prewarm.fix}`;
|
|
37
|
+
else {
|
|
38
|
+
const scratch = mkdtempSync(path.join(os.tmpdir(), "ltm-probe-"));
|
|
39
|
+
try {
|
|
40
|
+
const chromium = await loadPlaywright(prewarm.nodeDir);
|
|
41
|
+
const launched = await launchLadder(chromium, chrome.path, scratch, { timeout: 20000 });
|
|
42
|
+
report.webgl2 = { ok: true, renderer: launched.renderer, flags: launched.rung.flags, rung: launched.rung.name };
|
|
43
|
+
await launched.context.close();
|
|
44
|
+
} catch (error) {
|
|
45
|
+
report.webgl2.detail = `no WebGL2 context obtainable (not even software): ${error.message}`;
|
|
46
|
+
} finally {
|
|
47
|
+
rmSync(scratch, { recursive: true, force: true });
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
const renderer = report.webgl2.renderer;
|
|
51
|
+
report.softwareWarning = !renderer ? `renderer not probed (${report.webgl2.detail})`
|
|
52
|
+
: renderer === unknownRenderer ? "renderer type unknown — debug-info extension unavailable"
|
|
53
|
+
: isSoftwareRenderer(renderer) ? `software GL detected (${renderer}); renders will be slower, --samples lowered automatically`
|
|
54
|
+
: "none (hardware renderer)";
|
|
55
|
+
return report;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export function formatProbe(report) {
|
|
59
|
+
const p = report.prewarm;
|
|
60
|
+
const missing = [...p.deps, ...p.missingFonts, ...p.mismatchedFonts.map((name) => `${name} (hash mismatch)`)];
|
|
61
|
+
return [
|
|
62
|
+
`motion chrome: ${report.chrome.ok ? `${report.chrome.path} — ${report.chrome.version}` : report.chrome.detail}`,
|
|
63
|
+
`motion ffmpeg: ${report.ffmpeg.ok ? `${report.ffmpeg.path} — ${report.ffmpeg.version}` : report.ffmpeg.detail}; preview encoder rung: ${report.ffmpeg.previewEncoder}`,
|
|
64
|
+
`motion webgl2: ${report.webgl2.ok ? `${report.webgl2.renderer} (rung ${report.webgl2.rung}: ${report.webgl2.flags.join(" ")})` : report.webgl2.detail}`,
|
|
65
|
+
`motion software-gl: ${report.softwareWarning}`,
|
|
66
|
+
`motion prewarm: ${p.ready ? `ready in ${p.cache} (Hangul body: ${p.hangul})` : `missing ${missing.join(", ")}; run ${p.fix}`}; audio: ${p.audio.ready ? "ready" : p.audio.reason}; word timing: ${p.wordTiming.reason}`
|
|
67
|
+
].join("\n");
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
if (process.argv[1] && existsSync(process.argv[1]) && realpathSync(process.argv[1]) === realpathSync(fileURLToPath(import.meta.url))) {
|
|
71
|
+
const json = process.argv.includes("--json");
|
|
72
|
+
if (process.argv.includes("--help")) console.log("lit-typographic-motion probe\nUsage: node probe.mjs [--json]");
|
|
73
|
+
else probe().then((report) => console.log(json ? JSON.stringify(report, null, 2) : formatProbe(report)));
|
|
74
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# Authoring: brief schema and the scene/engine contract
|
|
2
|
+
|
|
3
|
+
## The brief (`motion-brief.json`)
|
|
4
|
+
|
|
5
|
+
On the type path the brief lays out the scenes; it comes after the treatment (`treatment.md`), which
|
|
6
|
+
fixes the copy, the length, the sound and the beats. Everything else is derived from the two files,
|
|
7
|
+
deterministically.
|
|
8
|
+
|
|
9
|
+
```json
|
|
10
|
+
{
|
|
11
|
+
"title": "<the film's own name, printed only when it is also a copy line>",
|
|
12
|
+
"description": "<one line about the film, used for the preset keyword check>",
|
|
13
|
+
"preset": "<swiss-signal, terminalcore or tidal; omit to let MO-B-00 pick>",
|
|
14
|
+
"bpm": "<40-240>",
|
|
15
|
+
"seed": "<integer>",
|
|
16
|
+
"audio": "<optional path to a supplied track>",
|
|
17
|
+
"scenes": [
|
|
18
|
+
{ "scene": "title-slam", "text": "<copy line>" },
|
|
19
|
+
{ "scene": "karaoke", "text": "<copy line>" },
|
|
20
|
+
{ "scene": "kinetic-list", "heading": "<copy line>", "items": ["<item>", "<item>"] },
|
|
21
|
+
{ "scene": "counter", "from": "<number>", "to": "<number>", "label": "<copy line>" },
|
|
22
|
+
{ "scene": "signature", "text": "<Latin copy line>", "font": "<EMS stroke font>" },
|
|
23
|
+
{ "scene": "end-card", "text": "<copy line>", "sub": "<copy line>", "paragraph": "<optional credit block>" }
|
|
24
|
+
]
|
|
25
|
+
}
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
The values are placeholders that only show each field's shape; the render refuses a brief that still
|
|
29
|
+
holds one. The copy comes from the treatment's `copy.lines`: the user's words when they gave words,
|
|
30
|
+
otherwise lines written from the treatment's subject. The treatment's `durationSec` sets the length:
|
|
31
|
+
every hold scales up by the same factor (never below its reading floor), and when the floors force a
|
|
32
|
+
longer film the report says so.
|
|
33
|
+
|
|
34
|
+
| Field | Rule |
|
|
35
|
+
| --- | --- |
|
|
36
|
+
| `scenes` | Ordered shots. Omit it to give `lines` instead (first line = title slam, middle lines = karaoke, last = end-card sub line). |
|
|
37
|
+
| `preset` / `style` | An explicit style. Leave both out to let MO-B-00 pick. The report says "user-specified" only when the request names the preset; otherwise "agent default". |
|
|
38
|
+
| `bpm` | Tier-1 grid, 40..240; default 100 (MO-A-14). Ignored when an audio file yields a beat grid. |
|
|
39
|
+
| `seed` | Run seed for every pass seed (`fnv1a32(runSeed:sceneId:shotIndex:pass)`, MO-SH-01). |
|
|
40
|
+
| `audio` | Tier 2: analysed once, offline, by the pre-warmed librosa venv; absent or failed analysis falls back to Tier 1 with a warning (MO-A-19). |
|
|
41
|
+
| `minDurationSec` | Stretches the last shot so the film is at least this long (never shorter than 3 s); the treatment's `durationSec` is the usual target. |
|
|
42
|
+
|
|
43
|
+
Scene kinds: `title-slam` (one line, display voice), `karaoke` (one line revealed one 어절 at a
|
|
44
|
+
time, wrapped at word boundaries when long), `kinetic-list` (two or more items appearing one per
|
|
45
|
+
step), `counter` (a number counting from `from` to `to`, with an optional label), `signature`
|
|
46
|
+
(Latin text written by a single-stroke EMS pen; `font` is one of EMSAllure, EMSFelix, EMSOsmotron,
|
|
47
|
+
EMSReadability, EMSTech) and `end-card` (title, optional sub line and optional paragraph).
|
|
48
|
+
Give each repeated scene its own `sceneId` only if you need to address it; repeats become shot 1,
|
|
49
|
+
shot 2 of the same scene id.
|
|
50
|
+
|
|
51
|
+
## Timeline (Phase 1)
|
|
52
|
+
|
|
53
|
+
- Tier 1 (default): each shot holds `1.25 x` its reading floor (MO-A-09/10), at least two beats
|
|
54
|
+
(MO-A-16), and every start is a grid beat, so every cut lands within one frame of a beat
|
|
55
|
+
(MO-A-15). Reveal steps are at least 0.35 s (MO-A-12) and land on beats too.
|
|
56
|
+
- Reading floor, one function (MO-C-07/08): `line`/`scene` = max(0.9 s Latin or 1.0 s with Hangul,
|
|
57
|
+
0.2 s per Hangul syllable + words / 3.3); `word` = max(0.5, same rate); `reveal` = 0.35 s. A
|
|
58
|
+
line/scene must also stay under 17 Latin characters per second. These numbers are provisional.
|
|
59
|
+
- Tier 2: the beat grid replaces the fixed BPM; the same rules apply against it.
|
|
60
|
+
- Tier 3 (`--word-timing`) is opt-in only and fails closed in this build (see runtime.md).
|
|
61
|
+
|
|
62
|
+
The render refuses to start (exit 13, pre-flight) if the generated timeline breaks any of these,
|
|
63
|
+
or if any character of the brief is missing from the font it resolves to (MO-D-04).
|
|
64
|
+
|
|
65
|
+
## What the engine does with a scene
|
|
66
|
+
|
|
67
|
+
A scene is a pure function of the frame: `f.t` (film seconds), `f.lt`/`f.p` (time and 0..1 progress
|
|
68
|
+
inside its own window), its timeline entry and its reveal units. Every beat inside a scene is a
|
|
69
|
+
function of `f.lt` or `f.p`, never a frame number (MO-A-06). The engine then:
|
|
70
|
+
|
|
71
|
+
1. renders the pinned sub-sample times `t_n + (shutter/fps)((i + 0.5)/N - 0.5)` (MO-A-28; master
|
|
72
|
+
`--samples 4 --shutter 0.5`, stills and previews one sample);
|
|
73
|
+
2. composites each sample in linear HDR: the preset's layout passes, the type layer (glyphs from
|
|
74
|
+
real font outlines), then the filter passes;
|
|
75
|
+
3. averages the samples, runs the post chain once with the centre sample's overrides, in the fixed
|
|
76
|
+
order bloom and halation, chromatic aberration, tone shoulder, grain, vignette, flash,
|
|
77
|
+
shake/zoom, invert (§A7), and applies sRGB exactly once;
|
|
78
|
+
4. reads the 8-bit frame back and sends the same bytes to the frame hash, the flash audit and ffmpeg.
|
|
79
|
+
|
|
80
|
+
Post overrides a scene may return, with their neutral values (MO-A-58): `exposure` 1, `bloom` 0,
|
|
81
|
+
`bloomThreshold` 0.85, `bloomKnee` 0, `bloomRadius` 0, `halation` 0, `ca` 0, `grain` 0, `vignette` 0,
|
|
82
|
+
`fade` 1, `flash` 0, `shake` [0,0], `zoom` 1, `invert` false. `invert` may change only on a cut and
|
|
83
|
+
must then hold two beats; every rise of `flash` above 0.1 and every `invert` change counts as an
|
|
84
|
+
event, and a shot allows at most two events in any one-second window (MO-SH-03).
|
|
85
|
+
|
|
86
|
+
A scene that carries state across frames is `stateful`: CRT phosphor persistence reads the three
|
|
87
|
+
previous frames' pre-CRT images, so on a seek the engine re-renders those frames first (preroll).
|
|
88
|
+
This keeps a seeked still byte-identical to the same frame of a sequential video (MO-A-25).
|
|
89
|
+
|
|
90
|
+
## Frame log (`render.jsonl`)
|
|
91
|
+
|
|
92
|
+
One line per pass per frame (`{"frame", "pass", "draws", "uniforms"}`) written by the single
|
|
93
|
+
uniform setter, and one frame line (`"pass": null`) with `rgbaSha256`, `sampleTimes`, `textBoxes`
|
|
94
|
+
(each drawn text's bbox, font, size, weight, voice and script runs), `graphics` (non-glyph element
|
|
95
|
+
boxes), `fills`, the effective post values, the flash transitions and the glyph-ink pixel count.
|
|
96
|
+
The gate reads these records; it never re-detects text from pixels.
|
|
97
|
+
|
|
98
|
+
## Starter scene craft notes
|
|
99
|
+
|
|
100
|
+
- Title slam: largest size that fits 1440 px, placed low-left on the grid; enters in 180 ms from a
|
|
101
|
+
scale of 1.04 (never from collapsed) with Latin width stepping from 125 to 100; tracking stays at
|
|
102
|
+
-0.035em or looser.
|
|
103
|
+
- Karaoke: glyph positions come from the whole line's layout, so revealed words never shift.
|
|
104
|
+
- Kinetic list: items step in 24 px from the left on their beat; line height 1.5 (Latin) or 1.6
|
|
105
|
+
(Hangul).
|
|
106
|
+
- Counter: the value steps at 15 updates per second and the digit block stays small so changing
|
|
107
|
+
digits never fill a quarter of a 10-degree window.
|
|
108
|
+
- Signature: pen travel is distributed over each character's own time window.
|
|
109
|
+
- End card: title, sub line and an optional 60-75 character paragraph; the one accent mark lives
|
|
110
|
+
here when the preset has an accent and the card is at most 10% of the film.
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# Look rounds, done and the reply
|
|
2
|
+
|
|
3
|
+
A film is not done when a command exits 0. It is done when a gate PASS, a valid treatment and at
|
|
4
|
+
least two recorded look rounds agree, and the last round looked at the final render's own frames.
|
|
5
|
+
|
|
6
|
+
## The stills set
|
|
7
|
+
|
|
8
|
+
Every render, `--stills-only` or full, writes the same set:
|
|
9
|
+
|
|
10
|
+
- `stills/beat-NN-mid.png`: the frame at each treatment beat's midpoint;
|
|
11
|
+
- `stills/cut-NN-strip.png`: a strip of three frames around every cut (-6, 0, +6 frames);
|
|
12
|
+
- `sheet/contact.png`: a 12-frame contact sheet across the whole film;
|
|
13
|
+
- `stills/stills.json`: the round, each file's SHA-256 and what each beat should show.
|
|
14
|
+
|
|
15
|
+
A full render adds `poster.png`. Open these files with OpenCode's read tool; only images passed to the
|
|
16
|
+
read tool count as viewed (LitOpenCode records each read of a film's stills). OCR or pixel statistics
|
|
17
|
+
may go in `aids` but never count as looking.
|
|
18
|
+
|
|
19
|
+
## The nine questions
|
|
20
|
+
|
|
21
|
+
Answer each against a frame you opened. `observed` is at least one sentence naming a concrete
|
|
22
|
+
visible detail in that frame; a bare yes or no is refused.
|
|
23
|
+
|
|
24
|
+
1. "A stranger would say this film is for: <…>". Ask a fresh subagent that gets only the contact sheet
|
|
25
|
+
and the beat stills, never the request or the treatment, and record its sentence verbatim with
|
|
26
|
+
`by: "blind"`; without a subagent, answer it yourself with `by: "self"`. `verdict: "yes"` when that
|
|
27
|
+
reading matches the treatment's subject.
|
|
28
|
+
2. Does every beat show its `onScreen` plan?
|
|
29
|
+
3. Is the craft at the level `ambition` asks for (transitions, rhythm, depth, hierarchy)?
|
|
30
|
+
4. Is any request text, meta label, placeholder, file name or internal term on screen?
|
|
31
|
+
5. Does the ending land?
|
|
32
|
+
6. Does the sound follow the cuts? Answer from `sound-cues.json`.
|
|
33
|
+
7. Name one thing a skilled motion designer, given only the request, would have shown that this film
|
|
34
|
+
does not. `verdict: "yes"` when you can name one; then revise.
|
|
35
|
+
8. Is any element on screen without a job in its beat?
|
|
36
|
+
9. Could every copy line be pasted unchanged into a film about a different subject? If yes, rewrite
|
|
37
|
+
the copy from `subject.specifics`.
|
|
38
|
+
|
|
39
|
+
Another round is required after a "no" on 1, 2, 3, 5 or 6, a "yes" on 4, 8 or 9, or a nameable Q7.
|
|
40
|
+
|
|
41
|
+
## Recording a round
|
|
42
|
+
|
|
43
|
+
```sh
|
|
44
|
+
node render.mjs look --out <d> --round N --answers <answers.json>
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
```json
|
|
48
|
+
{
|
|
49
|
+
"viewed": ["stills/beat-01-mid.png", "sheet/contact.png"],
|
|
50
|
+
"weakestBeat": "<beat index and why>",
|
|
51
|
+
"change": "<the change you will make before the next render>",
|
|
52
|
+
"answers": [
|
|
53
|
+
{ "q": 1, "verdict": "<yes or no>", "frame": "sheet/contact.png", "observed": "<a sentence>", "by": "<blind or self>" }
|
|
54
|
+
]
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
- Rounds share one counter with renders (1-3): `look --round N` belongs to the stills set rendered
|
|
59
|
+
with `--round N`, and each round is the previous one plus one.
|
|
60
|
+
- `look` refuses a frame that is not in the latest stills set, and stamps the round with the SHA-256
|
|
61
|
+
of the current manifest (`stills/stills.json` after a stills round, `manifest.json` after a full
|
|
62
|
+
render) and of each listed frame.
|
|
63
|
+
- Round 1 is always a stills round before the first full render; it must name the weakest beat and
|
|
64
|
+
the change.
|
|
65
|
+
- The last round must view the poster, the contact sheet, every beat midpoint and every transition
|
|
66
|
+
strip of the final render.
|
|
67
|
+
- If no image tool is reachable, record `"blocked": "no-vision-tool"`; the done check then ends with
|
|
68
|
+
`DONE_UNVIEWED`, and the reply says in plain words that nobody viewed the frames.
|
|
69
|
+
- At most 3 rounds. After round 3, deliver with every open item stated plainly.
|
|
70
|
+
|
|
71
|
+
## Done
|
|
72
|
+
|
|
73
|
+
`node gate.mjs --done <d>` exits:
|
|
74
|
+
|
|
75
|
+
| Exit | Status | Meaning |
|
|
76
|
+
| --- | --- | --- |
|
|
77
|
+
| 0 | `DONE` | gate PASS, a valid treatment, 2+ look rounds (round 1 on stills with a change, the last on the final render's manifest and all its frames), no round still asking for another, and, under OpenCode, every viewed frame read with the read tool |
|
|
78
|
+
| 1 | `NOT DONE` | something above is missing; the reason names it |
|
|
79
|
+
| 2 | `DONE_WITH_OPEN_ITEMS` | round 3 is spent; deliver and state each open gate rule or look item |
|
|
80
|
+
| 3 | `DONE_UNVIEWED` | everything else holds, but the frames were not viewed |
|
|
81
|
+
|
|
82
|
+
The done check also compares the final treatment with the first valid one and prints `downgraded:`
|
|
83
|
+
for a length cut of more than 20 %, fewer subject beats, sound switched to none without a user
|
|
84
|
+
request, or a stage film moved to the type path. Never downgrade to pass: fix the cause (a scrim,
|
|
85
|
+
size, placement, timing or seeded randomness) or deliver with the failure stated.
|
|
86
|
+
|
|
87
|
+
## The reply
|
|
88
|
+
|
|
89
|
+
- Keep the product's activation line where it is; below it, no second banner and no emoji.
|
|
90
|
+
- Plain words, no internal names (no rule ids, no path or preset jargon).
|
|
91
|
+
- One line on the defaults chosen.
|
|
92
|
+
- A label on every invention (subject, name, facts, copy) and on generated sound.
|
|
93
|
+
- One plain line on what was checked: flash safety, legibility, and the frames looked at.
|
|
94
|
+
- Where the copy lives (the `COPY` object in `stage/index.html`, or the brief) and the one command
|
|
95
|
+
that re-renders.
|
|
96
|
+
- Any `downgraded` item and any open look item or failed rule.
|
|
97
|
+
|
|
98
|
+
## Gate rows (both paths)
|
|
99
|
+
|
|
100
|
+
| Check | Path | Rule |
|
|
101
|
+
| --- | --- | --- |
|
|
102
|
+
| Flash (WCAG 2.3.1) | both | at most 3 general and 3 red flashes in any 1 s window, master and looping preview; the grid and window transpose for 9:16; a failure withholds every export |
|
|
103
|
+
| Size, fps, length | both | stage: exactly the format size, 60 or 30 fps, within ±10 % of `durationSec`; type: 1920x1080 at 60 fps |
|
|
104
|
+
| File sizes | both | preview at most 3 MB, poster at most 1 MB |
|
|
105
|
+
| Reduced-motion still | both | present; on the stage it is the final beat's midpoint |
|
|
106
|
+
| Near-black runs | both | no near-black stretch longer than twice the minimum hold |
|
|
107
|
+
| Sound | both, unless `none` | a stream within ±0.1 s of the video, sample peak at most -0.5 dBFS; a generated bed has no stretch below -50 dBFS RMS longer than 1.5 s in the first 3 s |
|
|
108
|
+
| Determinism | both | stage: 8-16 sample frames replayed from 0 in a fresh browser; type: the cut frames re-rendered and compared |
|
|
109
|
+
| Text | stage | copy found, contrast, title-safe, reading floor, fonts; decor limits; meta labels |
|
|
110
|
+
| Type rules | type | GLSL presence, contrast, reading time, tracking, Hangul, leading, measure, hue clusters, frame time, glyph coverage |
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# Runtime, pre-warm and BLOCKED codes
|
|
2
|
+
|
|
3
|
+
## Pre-warm once, read-only afterwards
|
|
4
|
+
|
|
5
|
+
`litopencode motion-runtime install` runs outside any sandboxed session. It installs, into
|
|
6
|
+
`${XDG_CACHE_HOME:-~/.cache}/litopencode/motion-runtime/`:
|
|
7
|
+
|
|
8
|
+
- the engine's pinned JavaScript packages (`playwright-core`, `opentype.js`, `ws`) with
|
|
9
|
+
`npm ci --omit=dev --ignore-scripts` from the lockfile inside this skill, plus a lockfile receipt;
|
|
10
|
+
- the fetched fonts and their licence files, each checked against its pinned sha256 (`fonts/pins.json`):
|
|
11
|
+
Galmuri9 with its OFL text, MesloLGS NF with the Apache-2.0 notice, the Apache-2.0 text and the
|
|
12
|
+
Vera/Arev notices; the official Pretendard Regular only if the lit-pptx Hangul pair is missing;
|
|
13
|
+
- with `--audio`, a Python venv holding the hash-pinned librosa set from `requirements-audio.txt`
|
|
14
|
+
(`pip install --require-hashes --only-binary=:all:`).
|
|
15
|
+
|
|
16
|
+
`litopencode install` attempts the same pre-warm and prints one receipt line; a failure never fails
|
|
17
|
+
the install. A render never installs, fetches or repairs anything: it checks hashes and receipts and
|
|
18
|
+
stops with a named state.
|
|
19
|
+
|
|
20
|
+
`litopencode motion-runtime status` and `litopencode doctor` report five probes on every run:
|
|
21
|
+
Chrome (path and version), ffmpeg (version and the preview encoder rung: `libwebp_anim`, `img2webp`
|
|
22
|
+
or GIF), the WebGL2 renderer string from a real headless probe, the software-GL or unknown-renderer
|
|
23
|
+
warning, and the pre-warm state naming what is missing and the command that fixes it.
|
|
24
|
+
|
|
25
|
+
## Exit codes
|
|
26
|
+
|
|
27
|
+
| Exit | Name | Meaning | Fix |
|
|
28
|
+
| --- | --- | --- | --- |
|
|
29
|
+
| 0 | OK | the requested mode finished; for `film`, the gate passed | none |
|
|
30
|
+
| 10 | BLOCKED_NO_CHROME | Chrome is missing or failed to start headless; the message carries its first error line | install Chrome or set `CHROME_PATH` |
|
|
31
|
+
| 11 | BLOCKED_NO_WEBGL2 | Chrome ran but no rung produced a WebGL2 context | check GPU drivers; the SwiftShader rung is already tried |
|
|
32
|
+
| 12 | BLOCKED_NO_FFMPEG_FOR_VIDEO | a film was requested without ffmpeg | install ffmpeg; `--stills-only`, `stills` and `sheet` still work |
|
|
33
|
+
| 13 | GATE_FAIL_QA | pre-flight or the full gate failed; the report names the rules | fix and rerun the next round |
|
|
34
|
+
| 14 | BLOCKED_DEPS_NOT_PREWARMED | the pinned packages are absent (or Tier-3 models are requested) | `litopencode motion-runtime install` outside the session |
|
|
35
|
+
| 15 | BLOCKED_FONT_FETCH | a required font is missing or its bytes do not match the pin | `litopencode motion-runtime install`; a mismatch is never accepted |
|
|
36
|
+
| 16 | BLOCKED_TREATMENT_INVALID | `treatment.json` is missing or a field breaks its rule; the message names the field | fix that field (`treatment.md`) |
|
|
37
|
+
| 17 | STAGE_CONTRACT_ERROR | the stage page broke its contract: no `LitStage.define`, a wrong size, a forbidden element or API, a flipbook or animated raster, a path outside `stage/`, or a copy line never found on screen | fix the page (`stage.md`) |
|
|
38
|
+
| 18 | STAGE_NONDETERMINISTIC | a sample frame differs between the master and a fresh replay from 0; the message names the frame and the first region | remove the clock or random source the renderer does not drive |
|
|
39
|
+
| 19 | STAGE_NETWORK_REQUEST | the page requested something outside the stage origin, or a stage file names an external URL | make the asset local |
|
|
40
|
+
| 20 | SOUND_INVALID | the planned track is missing from the film, too long or short, too loud, or a generated bed starts silent | fix the track or its plan |
|
|
41
|
+
|
|
42
|
+
## Chrome, egress and the sandbox
|
|
43
|
+
|
|
44
|
+
- Launch ladder (MO-A-51), first rung that yields a real `getContext('webgl2')` in the page wins and
|
|
45
|
+
is recorded as `chromeFlags`: the platform GPU rung (macOS `--use-angle=metal`, Linux
|
|
46
|
+
`--use-angle=gl`, Windows `--use-angle=d3d11`), then `--use-angle=swiftshader
|
|
47
|
+
--enable-unsafe-swiftshader`. The anti-throttling flags are always appended. The Chrome profile
|
|
48
|
+
lives in `<out>/.run/` and is removed on exit; Chrome is driven over a pipe, so no control port.
|
|
49
|
+
- Frame egress: a WebSocket on `127.0.0.1:0`. If the sandbox refuses to listen, each frame's
|
|
50
|
+
readback buffer is pulled over CDP instead. Either way the hash, the flash audit and ffmpeg see
|
|
51
|
+
the same bytes.
|
|
52
|
+
- A software renderer (SwiftShader, llvmpipe, softpipe, lavapipe, Apple Software Renderer,
|
|
53
|
+
Microsoft Basic Render Driver) is allowed and labelled: one sample per frame, tidal octaves
|
|
54
|
+
halved (at least 3), CRT persistence off, affected pass ranges marked `downgraded`.
|
|
55
|
+
|
|
56
|
+
## The stage renderer
|
|
57
|
+
|
|
58
|
+
- The stage path always uses the software rung (SwiftShader, CPU raster) with the compositor, image
|
|
59
|
+
and animation flags that keep capture deterministic, `--mute-audio`, `--force-color-profile=srgb`,
|
|
60
|
+
`--force-device-scale-factor=1`, the window at the format size, and the mock-keychain flags.
|
|
61
|
+
- The page is served from the synthetic origin `http://lit.stage/` through request interception, so
|
|
62
|
+
nothing listens on a port; every other request fails and is recorded (exit 19), and a host
|
|
63
|
+
resolver rule maps every other host to nothing as a backstop.
|
|
64
|
+
- Three browsers run side by side: the master capture, a fresh replay for the determinism samples and
|
|
65
|
+
a separate QA replay that hides text to measure ink. The master never changes a style.
|
|
66
|
+
- Fonts come from this skill and the pre-warmed cache; an unwarmed cache stops with exit 14.
|
|
67
|
+
|
|
68
|
+
## Sound
|
|
69
|
+
|
|
70
|
+
- Generated (the default under bare `lit`, on both paths): a deterministic bed from the treatment,
|
|
71
|
+
built in code with no network or model weights: tempo, pulse and a chord pad, plus the accents the
|
|
72
|
+
beats ask for. 48 kHz 16-bit stereo, exactly the film's length, peaks at most -2 dBFS, integrated
|
|
73
|
+
loudness about -16 LUFS (ITU-R BS.1770-4, measured in this code). `sound-cues.json` lists every cue
|
|
74
|
+
against its cut. `node render.mjs sound --out <d>` builds it on its own.
|
|
75
|
+
- Supplied or authored tracks are always muxed, whatever the audio-analysis tier's state, padded or
|
|
76
|
+
trimmed to the film with a 50 ms fade. AAC at 256 kb/s.
|
|
77
|
+
|
|
78
|
+
## Audio analysis tiers (the type path's cut grid)
|
|
79
|
+
|
|
80
|
+
- Tier 1 (default): text reading time and a BPM grid.
|
|
81
|
+
- Tier 2: a supplied audio file is analysed once by the pre-warmed venv into a beat grid for this
|
|
82
|
+
run only. An absent venv, a venv that no longer matches its pins, or a failed analysis falls back
|
|
83
|
+
to Tier 1 with a warning; the venv is never repaired in the session.
|
|
84
|
+
- Tier 3 (`--word-timing`, opt-in only): `motion-runtime install --word-timing` states the download
|
|
85
|
+
size and every model pin before downloading and fails closed unless each model has a pinned id,
|
|
86
|
+
revision and a verified licence that allows commercial use. This build pins no licence-verified
|
|
87
|
+
Korean alignment model, so the install fails closed and a render with `--word-timing` exits 14.
|
|
88
|
+
MMS_FA and madmom weights, aubio and essentia are never used at any tier.
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
# Stage path: authoring a page the renderer films
|
|
2
|
+
|
|
3
|
+
Load this after the treatment says `path: stage`. On the stage path you are the illustrator, the
|
|
4
|
+
animator and the editor: you write one page that draws the film as a function of time, and the
|
|
5
|
+
renderer captures it frame by frame, deterministically, then gates, checks and encodes it. The page
|
|
6
|
+
is yours; the kit gives motion primitives, never ready-made scenes, objects or layouts.
|
|
7
|
+
|
|
8
|
+
## Files
|
|
9
|
+
|
|
10
|
+
- `<out>/treatment.json`: the treatment (see `treatment.md`).
|
|
11
|
+
- `<out>/stage/index.html`: the page. Put its own SVG, PNG, JPG, WebP, JS, CSS and WAV files beside
|
|
12
|
+
it under `stage/`. Write everything yourself; never install, download or copy a third-party library
|
|
13
|
+
into the stage directory.
|
|
14
|
+
- Rasters are textures and stills, never a frame sequence: at most 24 raster files and 8 MB in total.
|
|
15
|
+
Ten or more rasters of one size (a flipbook), or any animated GIF, APNG or WebP, stops the render
|
|
16
|
+
with exit 17.
|
|
17
|
+
|
|
18
|
+
## The page contract
|
|
19
|
+
|
|
20
|
+
```html
|
|
21
|
+
<!doctype html>
|
|
22
|
+
<meta charset="utf-8">
|
|
23
|
+
<link rel="stylesheet" href="/lit/fonts.css">
|
|
24
|
+
<script src="/lit/stage-kit.js"></script>
|
|
25
|
+
<body>…your SVG, DOM and canvases…</body>
|
|
26
|
+
<script>
|
|
27
|
+
const COPY = { /* every on-screen line, in one place, so copy is easy to edit */ };
|
|
28
|
+
LitStage.define({ width: 1920, height: 1080, fps: 60, duration: 16, render(t) { /* draw frame t */ } });
|
|
29
|
+
</script>
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
- `LitStage.define({ width, height, fps, duration, render })` (or `window.litStage = { … }`). The size
|
|
33
|
+
must match the treatment's `format`: 1920x1080 for 16:9, 1080x1920 for 9:16. `fps` is 60, or 30 when
|
|
34
|
+
the treatment says so. `duration` in seconds must land within ±10 % of `durationSec`.
|
|
35
|
+
- `render(t)` draws the frame at time `t` in seconds. Make it a pure function of `t` where you can;
|
|
36
|
+
that keeps every frame seekable and deterministic.
|
|
37
|
+
- You may also use CSS animations and transitions, the Web Animations API, SVG SMIL, and
|
|
38
|
+
`requestAnimationFrame` with Canvas2D or WebGL. The renderer drives all of them from a virtual
|
|
39
|
+
clock: `Date`, `performance.now`, timers, `requestAnimationFrame`, `requestIdleCallback`,
|
|
40
|
+
`document.timeline` and `Math.random` (seeded from the treatment's `seed`) all read film time.
|
|
41
|
+
- The page is served from `http://lit.stage/` with no listening socket. Only files inside `stage/`,
|
|
42
|
+
the kit and the fonts are served; `..` and symlinks that leave the directory are refused.
|
|
43
|
+
- Fonts: `/lit/fonts.css` declares the product's faces with `font-display: block`: `Archivo` (widths
|
|
44
|
+
75 %, 100 %, 125 %; weights 400, 700, 900), `LitOpenCode Sans` (400, 700; Hangul), `VT323`,
|
|
45
|
+
`Silkscreen` (400, 700), `MesloLGS NF` and `Galmuri9`. Use only these; the QA checks the platform
|
|
46
|
+
font behind every copy line.
|
|
47
|
+
|
|
48
|
+
## Forbidden (the render stops)
|
|
49
|
+
|
|
50
|
+
| Stops with | What |
|
|
51
|
+
| --- | --- |
|
|
52
|
+
| 17 `STAGE_CONTRACT_ERROR` | `<video>`, `<audio>`, `<iframe>`, `<object>`, `<embed>`, `<frame>`; `new Audio()`, `AudioContext`, `OfflineAudioContext`; `Worker`, `SharedWorker`, service workers; no `LitStage.define`; a wrong size; a flipbook or animated raster; a copy line never found on screen |
|
|
53
|
+
| 18 `STAGE_NONDETERMINISTIC` | a frame that differs between two fresh replays: wall-clock reads such as `performance.timeOrigin`, `crypto.getRandomValues`, or state that depends on how fast frames arrive |
|
|
54
|
+
| 19 `STAGE_NETWORK_REQUEST` | any request outside the stage origin; an absolute `http(s)://` or `//host` URL in a stage file (W3C namespace URIs such as `http://www.w3.org/2000/svg` are fine); `preconnect`, `dns-prefetch`, `prefetch` or `prerender` links; `WebSocket`, `WebTransport`, `RTCPeerConnection` |
|
|
55
|
+
|
|
56
|
+
A page that asks for a WebGL context and gets none stops with exit 11.
|
|
57
|
+
|
|
58
|
+
## Kit reference (`/lit/stage-kit.js`, global `LitStage`)
|
|
59
|
+
|
|
60
|
+
Easing. Named curves plus `bezier()`:
|
|
61
|
+
|
|
62
|
+
```js
|
|
63
|
+
const e = LitStage.ease.snap(0.4); // also linear, in/out/inOut Quad..Quint, Sine, Expo, Circ, Back, glide, settle, exit, anticipate
|
|
64
|
+
const custom = LitStage.bezier(0.2, 0.9, 0.1, 1)(p);
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Spring (closed form, exact at any `t`):
|
|
68
|
+
|
|
69
|
+
```js
|
|
70
|
+
const y = LitStage.spring({ stiffness: 180, damping: 14, from: 80, to: 0 })(t - 1.2);
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Keyframes over numbers, arrays or colours:
|
|
74
|
+
|
|
75
|
+
```js
|
|
76
|
+
const x = LitStage.kf(t, [{ t: 0, v: -200 }, { t: 1.4, v: 0, ease: "settle" }, { t: 3, v: 40, ease: "glide" }]);
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Timing windows, staggers and sequences:
|
|
80
|
+
|
|
81
|
+
```js
|
|
82
|
+
const p = LitStage.at(t, 2.0, 0.8, "snap"); // 0..1 inside [2.0, 2.8]
|
|
83
|
+
const delay = LitStage.stagger(i, { each: 0.06, from: "center", n: items.length });
|
|
84
|
+
const s = LitStage.seq([["enter", 0.6], ["hold", 2.4], ["leave", 0.5]], 4); s.hold.progress(t);
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Seeded random (the treatment's `seed` by default):
|
|
88
|
+
|
|
89
|
+
```js
|
|
90
|
+
const r = LitStage.rand(); const jitter = r.range(-4, 4); const pick = r.pick(list);
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
Text splitting, grapheme- and 어절-aware:
|
|
94
|
+
|
|
95
|
+
```js
|
|
96
|
+
const parts = LitStage.splitText(el, { by: "grapheme" }); // or "word" (a Hangul 어절 stays whole) or "line"
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
SVG path drawing and a single-subpath morph (multi-subpath morphs are unsupported; morph each
|
|
100
|
+
subpath on its own):
|
|
101
|
+
|
|
102
|
+
```js
|
|
103
|
+
LitStage.drawPath(pathEl, LitStage.at(t, 0.5, 1.5, "glide"));
|
|
104
|
+
const shape = LitStage.morph(fromD, toD); pathEl.setAttribute("d", shape(p));
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
Masks, clips and colour:
|
|
108
|
+
|
|
109
|
+
```js
|
|
110
|
+
LitStage.clip.circle(el, p, { cx: 30, cy: 60 }); LitStage.clip.wipe(el, p, "left"); LitStage.clip.iris(el, p);
|
|
111
|
+
LitStage.mask.linear(el, p, { angle: 120, soft: 10 }); LitStage.mask.radial(el, p);
|
|
112
|
+
el.style.fill = LitStage.mix("#1b3a4b", "#e0a458", p); // mixed in linear light
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Text registration for the QA:
|
|
116
|
+
|
|
117
|
+
```js
|
|
118
|
+
LitStage.text(titleEl); // one reading run
|
|
119
|
+
LitStage.text(signEl, { decor: true }); // illustrative text inside a drawn subject
|
|
120
|
+
LitStage.text({ content: "…", x, y, w, h }); // canvas or WebGL text, every frame it is drawn
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## How the QA reads the stage
|
|
124
|
+
|
|
125
|
+
- Every `copy.lines` entry must appear on screen at some beat; a missing line stops the render with
|
|
126
|
+
exit 17 and quotes it. Keep copy in DOM or SVG text where you can; canvas copy is found through its
|
|
127
|
+
registration, but its contrast is not measured (a WARN).
|
|
128
|
+
- Copy runs FAIL on contrast (3.0 for large type, 4.5 for body; large means at least 3 % of the
|
|
129
|
+
frame's short side), on leaving the central 90 % title-safe area and on a hold shorter than the
|
|
130
|
+
reading floor. Decor runs only WARN on contrast, are exempt from title-safe and the reading floor,
|
|
131
|
+
may not carry a copy line, and may cover at most 25 % of the visible text area.
|
|
132
|
+
- A run equal to or containing the request, the idea, a file name or a word such as path, preset,
|
|
133
|
+
gate, beat or treatment is a WARN the look must answer.
|
|
134
|
+
- Canvas text drawn without registration is not measured (a WARN the look must answer).
|
|
135
|
+
- The subject must be drawn: when every word is hidden, at least half of the beat midpoints still
|
|
136
|
+
carry visible structure outside the text boxes.
|
|
137
|
+
|
|
138
|
+
## Determinism
|
|
139
|
+
|
|
140
|
+
- The renderer replays the clock from 0 in a fresh browser and compares 8-16 sample frames by the
|
|
141
|
+
SHA-256 of their pixels. A mismatch stops with exit 18, naming the frame and the first region.
|
|
142
|
+
- Filters (`blur()`, `backdrop-filter`, `mix-blend-mode`, `box-shadow`, SVG `feGaussianBlur`, Canvas2D
|
|
143
|
+
`shadowBlur`) and WebGL shaders are deterministic on the software renderer the stage uses.
|
|
144
|
+
- Seed every random choice from `LitStage.rand()` or `Math.random()` (both seeded); never read
|
|
145
|
+
`crypto.getRandomValues` or `performance.timeOrigin`.
|
|
146
|
+
|
|
147
|
+
## Rendering
|
|
148
|
+
|
|
149
|
+
- Stills round: `node render.mjs stage --out <d> --stills-only --round 1` (about 20 s): the beat
|
|
150
|
+
midpoints, a strip around every cut and a 12-frame contact sheet, no encode.
|
|
151
|
+
- Film: `node render.mjs stage --out <d> --round N`. Give the command a timeout of at least 600 s; a
|
|
152
|
+
15 s 1080x1920 film with its checks takes a few minutes. Never shorten the film to save render time.
|
|
153
|
+
Progress is written to `<d>/.run/progress.json`. When the host's command timeout is shorter, add
|
|
154
|
+
`--detach`: the render continues in the background, and `<d>/.run/render-exit.json` holds its exit
|
|
155
|
+
code when it ends (the log is `<d>/.run/render.log`).
|
|
156
|
+
- Outputs: `film.mp4` (H.264, BT.709, sound muxed), `preview.webp` or `.gif`, `poster.png`,
|
|
157
|
+
`reduced-motion.png` (the final beat's midpoint), `manifest.json`, `gate-report.txt`, `stills/`,
|
|
158
|
+
`sheet/` and `sound-cues.json`.
|
|
159
|
+
|
|
160
|
+
## Sound on the stage
|
|
161
|
+
|
|
162
|
+
The default is the generated bed (`sound.mode: generated`). To score the film yourself, write a WAV
|
|
163
|
+
into `stage/` and set `sound: { mode: "authored", file: "stage/<name>.wav", plan }`. The page itself
|
|
164
|
+
never plays audio: audio elements and audio contexts are forbidden, and the renderer muxes the track.
|