@heyai-rules/pilo-masterkit 1.2.2 → 3.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/.agent/agents/architect.md +211 -211
- package/.agent/agents/build-error-resolver.md +114 -114
- package/.agent/agents/chief-of-staff.md +151 -151
- package/.agent/agents/code-reviewer.md +237 -237
- package/.agent/agents/cpp-build-resolver.md +90 -90
- package/.agent/agents/cpp-reviewer.md +72 -72
- package/.agent/agents/csharp-reviewer.md +101 -0
- package/.agent/agents/dart-build-resolver.md +201 -0
- package/.agent/agents/database-reviewer.md +91 -91
- package/.agent/agents/doc-updater.md +107 -107
- package/.agent/agents/docs-lookup.md +68 -68
- package/.agent/agents/e2e-runner.md +107 -107
- package/.agent/agents/flutter-reviewer.md +243 -243
- package/.agent/agents/gan-evaluator.md +209 -0
- package/.agent/agents/gan-generator.md +131 -0
- package/.agent/agents/gan-planner.md +99 -0
- package/.agent/agents/go-build-resolver.md +94 -94
- package/.agent/agents/go-reviewer.md +76 -76
- package/.agent/agents/harness-optimizer.md +35 -35
- package/.agent/agents/healthcare-reviewer.md +83 -0
- package/.agent/agents/java-build-resolver.md +153 -153
- package/.agent/agents/java-reviewer.md +92 -92
- package/.agent/agents/kotlin-build-resolver.md +118 -118
- package/.agent/agents/kotlin-reviewer.md +159 -159
- package/.agent/agents/loop-operator.md +36 -36
- package/.agent/agents/opensource-forker.md +198 -0
- package/.agent/agents/opensource-packager.md +249 -0
- package/.agent/agents/opensource-sanitizer.md +188 -0
- package/.agent/agents/performance-optimizer.md +392 -133
- package/.agent/agents/personas/athena-agent/agent.json +10 -0
- package/.agent/agents/personas/athena-agent/athena-backend-logic-architecture-profile.md +189 -0
- package/.agent/agents/personas/athena-agent/context-files/agents.md +55 -0
- package/.agent/agents/personas/athena-agent/context-files/identity.md +23 -0
- package/.agent/agents/personas/athena-agent/context-files/soul.md +51 -0
- package/.agent/agents/personas/athena-agent/context-files/user-predefined.md +15 -0
- package/.agent/agents/personas/athena-agent/user-context-files/system/bootstrap.md +37 -0
- package/.agent/agents/personas/athena-agent/user-context-files/system/user.md +45 -0
- package/.agent/agents/personas/da-vinci-agent/agent.json +10 -0
- package/.agent/agents/personas/da-vinci-agent/context-files/agents.md +55 -0
- package/.agent/agents/personas/da-vinci-agent/context-files/identity.md +23 -0
- package/.agent/agents/personas/da-vinci-agent/context-files/soul.md +51 -0
- package/.agent/agents/personas/da-vinci-agent/context-files/user-predefined.md +15 -0
- package/.agent/agents/personas/da-vinci-agent/da-vinci-frontend-ui-ux-design-profile.md +189 -0
- package/.agent/agents/personas/da-vinci-agent/user-context-files/system/bootstrap.md +37 -0
- package/.agent/agents/personas/da-vinci-agent/user-context-files/system/user.md +45 -0
- package/.agent/agents/personas/duong-tang-agent/agent.json +10 -0
- package/.agent/agents/personas/duong-tang-agent/context-files/agents.md +55 -0
- package/.agent/agents/personas/duong-tang-agent/context-files/identity.md +23 -0
- package/.agent/agents/personas/duong-tang-agent/context-files/soul.md +51 -0
- package/.agent/agents/personas/duong-tang-agent/context-files/user-predefined.md +15 -0
- package/.agent/agents/personas/duong-tang-agent/tang-monk-quality-testing-documentation-profile.md +189 -0
- package/.agent/agents/personas/duong-tang-agent/user-context-files/system/bootstrap.md +37 -0
- package/.agent/agents/personas/duong-tang-agent/user-context-files/system/user.md +45 -0
- package/.agent/agents/personas/gia-cat-luong-agent/agent.json +10 -0
- package/.agent/agents/personas/gia-cat-luong-agent/context-files/agents.md +55 -0
- package/.agent/agents/personas/gia-cat-luong-agent/context-files/identity.md +23 -0
- package/.agent/agents/personas/gia-cat-luong-agent/context-files/soul.md +51 -0
- package/.agent/agents/personas/gia-cat-luong-agent/context-files/user-predefined.md +15 -0
- package/.agent/agents/personas/gia-cat-luong-agent/kongming-research-strategy-analysis-profile.md +189 -0
- package/.agent/agents/personas/gia-cat-luong-agent/user-context-files/system/bootstrap.md +37 -0
- package/.agent/agents/personas/gia-cat-luong-agent/user-context-files/system/user.md +45 -0
- package/.agent/agents/personas/mihata-agent/agent.json +10 -0
- package/.agent/agents/personas/mihata-agent/context-files/agents.md +55 -0
- package/.agent/agents/personas/mihata-agent/context-files/identity.md +23 -0
- package/.agent/agents/personas/mihata-agent/context-files/soul.md +51 -0
- package/.agent/agents/personas/mihata-agent/context-files/user-predefined.md +15 -0
- package/.agent/agents/personas/mihata-agent/mihata-multi-agent-orchestration-profile.md +189 -0
- package/.agent/agents/personas/mihata-agent/user-context-files/system/bootstrap.md +37 -0
- package/.agent/agents/personas/mihata-agent/user-context-files/system/user.md +45 -0
- package/.agent/agents/personas/tesla-agent/agent.json +10 -0
- package/.agent/agents/personas/tesla-agent/context-files/agents.md +55 -0
- package/.agent/agents/personas/tesla-agent/context-files/identity.md +23 -0
- package/.agent/agents/personas/tesla-agent/context-files/soul.md +51 -0
- package/.agent/agents/personas/tesla-agent/context-files/user-predefined.md +15 -0
- package/.agent/agents/personas/tesla-agent/tesla-fullstack-system-optimization-profile.md +189 -0
- package/.agent/agents/personas/tesla-agent/user-context-files/system/bootstrap.md +37 -0
- package/.agent/agents/personas/tesla-agent/user-context-files/system/user.md +45 -0
- package/.agent/agents/personas/tu-ma-y-agent/agent.json +10 -0
- package/.agent/agents/personas/tu-ma-y-agent/context-files/agents.md +55 -0
- package/.agent/agents/personas/tu-ma-y-agent/context-files/identity.md +23 -0
- package/.agent/agents/personas/tu-ma-y-agent/context-files/soul.md +51 -0
- package/.agent/agents/personas/tu-ma-y-agent/context-files/user-predefined.md +15 -0
- package/.agent/agents/personas/tu-ma-y-agent/simayi-feasibility-risk-control-profile.md +189 -0
- package/.agent/agents/personas/tu-ma-y-agent/user-context-files/system/bootstrap.md +37 -0
- package/.agent/agents/personas/tu-ma-y-agent/user-context-files/system/user.md +45 -0
- package/.agent/agents/personas/venti-agent/agent.json +10 -0
- package/.agent/agents/personas/venti-agent/context-files/agents.md +55 -0
- package/.agent/agents/personas/venti-agent/context-files/identity.md +23 -0
- package/.agent/agents/personas/venti-agent/context-files/soul.md +51 -0
- package/.agent/agents/personas/venti-agent/context-files/user-predefined.md +15 -0
- package/.agent/agents/personas/venti-agent/user-context-files/system/bootstrap.md +37 -0
- package/.agent/agents/personas/venti-agent/user-context-files/system/user.md +45 -0
- package/.agent/agents/personas/venti-agent/venti-learning-communication-mentoring-profile.md +189 -0
- package/.agent/agents/planner.md +212 -212
- package/.agent/agents/python-reviewer.md +98 -98
- package/.agent/agents/pytorch-build-resolver.md +120 -120
- package/.agent/agents/refactor-cleaner.md +85 -85
- package/.agent/agents/rust-build-resolver.md +148 -148
- package/.agent/agents/rust-reviewer.md +94 -94
- package/.agent/agents/security-reviewer.md +108 -108
- package/.agent/agents/tdd-guide.md +91 -91
- package/.agent/agents/typescript-reviewer.md +112 -112
- package/.agent/contexts/dev.md +20 -0
- package/.agent/contexts/research.md +26 -0
- package/.agent/contexts/review.md +22 -0
- package/.agent/hooks/hooks.json +395 -0
- package/.agent/hooks/readme.md +222 -0
- package/.agent/mcp-configs/mcp-servers.json +181 -0
- package/.agent/rules/common/agents.md +50 -0
- package/.agent/rules/common/code-review.md +124 -0
- package/.agent/rules/common/coding-style.md +48 -0
- package/.agent/rules/common/development-workflow.md +44 -0
- package/.agent/rules/common/git-workflow.md +24 -0
- package/.agent/rules/common/hooks.md +30 -0
- package/.agent/rules/common/patterns.md +31 -0
- package/.agent/rules/common/performance.md +55 -0
- package/.agent/rules/common/security.md +29 -0
- package/.agent/rules/common/testing.md +29 -0
- package/.agent/rules/cpp/coding-style.md +44 -0
- package/.agent/rules/cpp/hooks.md +39 -0
- package/.agent/rules/cpp/patterns.md +51 -0
- package/.agent/rules/cpp/security.md +51 -0
- package/.agent/rules/cpp/testing.md +44 -0
- package/.agent/rules/csharp/coding-style.md +72 -0
- package/.agent/rules/csharp/hooks.md +25 -0
- package/.agent/rules/csharp/patterns.md +50 -0
- package/.agent/rules/csharp/security.md +58 -0
- package/.agent/rules/csharp/testing.md +46 -0
- package/.agent/rules/dart/coding-style.md +159 -0
- package/.agent/rules/dart/hooks.md +66 -0
- package/.agent/rules/dart/patterns.md +261 -0
- package/.agent/rules/dart/security.md +135 -0
- package/.agent/rules/dart/testing.md +215 -0
- package/.agent/rules/golang/coding-style.md +32 -0
- package/.agent/rules/golang/hooks.md +17 -0
- package/.agent/rules/golang/patterns.md +45 -0
- package/.agent/rules/golang/security.md +34 -0
- package/.agent/rules/golang/testing.md +31 -0
- package/.agent/rules/java/coding-style.md +114 -0
- package/.agent/rules/java/hooks.md +18 -0
- package/.agent/rules/java/patterns.md +146 -0
- package/.agent/rules/java/security.md +100 -0
- package/.agent/rules/java/testing.md +131 -0
- package/.agent/rules/kotlin/coding-style.md +86 -0
- package/.agent/rules/kotlin/hooks.md +17 -0
- package/.agent/rules/kotlin/patterns.md +146 -0
- package/.agent/rules/kotlin/security.md +82 -0
- package/.agent/rules/kotlin/testing.md +128 -0
- package/.agent/rules/perl/coding-style.md +46 -0
- package/.agent/rules/perl/hooks.md +22 -0
- package/.agent/rules/perl/patterns.md +76 -0
- package/.agent/rules/perl/security.md +69 -0
- package/.agent/rules/perl/testing.md +54 -0
- package/.agent/rules/php/coding-style.md +40 -0
- package/.agent/rules/php/hooks.md +24 -0
- package/.agent/rules/php/patterns.md +33 -0
- package/.agent/rules/php/security.md +37 -0
- package/.agent/rules/php/testing.md +39 -0
- package/.agent/rules/python/coding-style.md +42 -0
- package/.agent/rules/python/hooks.md +19 -0
- package/.agent/rules/python/patterns.md +39 -0
- package/.agent/rules/python/security.md +30 -0
- package/.agent/rules/python/testing.md +38 -0
- package/.agent/rules/readme.md +111 -0
- package/.agent/rules/rust/coding-style.md +151 -0
- package/.agent/rules/rust/hooks.md +16 -0
- package/.agent/rules/rust/patterns.md +168 -0
- package/.agent/rules/rust/security.md +141 -0
- package/.agent/rules/rust/testing.md +154 -0
- package/.agent/rules/swift/coding-style.md +47 -0
- package/.agent/rules/swift/hooks.md +20 -0
- package/.agent/rules/swift/patterns.md +66 -0
- package/.agent/rules/swift/security.md +33 -0
- package/.agent/rules/swift/testing.md +45 -0
- package/.agent/rules/typescript/coding-style.md +199 -0
- package/.agent/rules/typescript/hooks.md +22 -0
- package/.agent/rules/typescript/patterns.md +52 -0
- package/.agent/rules/typescript/security.md +28 -0
- package/.agent/rules/typescript/testing.md +18 -0
- package/.agent/rules/web/coding-style.md +96 -0
- package/.agent/rules/web/design-quality.md +63 -0
- package/.agent/rules/web/hooks.md +120 -0
- package/.agent/rules/web/patterns.md +79 -0
- package/.agent/rules/web/performance.md +64 -0
- package/.agent/rules/web/security.md +57 -0
- package/.agent/rules/web/testing.md +55 -0
- package/.agent/rules/zh/agents.md +50 -0
- package/.agent/rules/zh/code-review.md +124 -0
- package/.agent/rules/zh/coding-style.md +48 -0
- package/.agent/rules/zh/development-workflow.md +44 -0
- package/.agent/rules/zh/git-workflow.md +24 -0
- package/.agent/rules/zh/hooks.md +30 -0
- package/.agent/rules/zh/patterns.md +31 -0
- package/.agent/rules/zh/performance.md +55 -0
- package/.agent/rules/zh/readme.md +108 -0
- package/.agent/rules/zh/security.md +29 -0
- package/.agent/rules/zh/testing.md +29 -0
- package/.agent/skills/agent-eval/SKILL.md +145 -0
- package/.agent/skills/agent-harness-construction/SKILL.md +73 -0
- package/.agent/skills/agent-payment-x402/SKILL.md +178 -0
- package/.agent/skills/agentic-engineering/SKILL.md +63 -0
- package/.agent/skills/ai-first-engineering/SKILL.md +51 -0
- package/.agent/skills/ai-regression-testing/SKILL.md +385 -0
- package/.agent/skills/android-clean-architecture/SKILL.md +339 -0
- package/.agent/skills/api-design/SKILL.md +523 -0
- package/.agent/skills/architecture-decision-records/SKILL.md +179 -0
- package/.agent/skills/article-writing/SKILL.md +79 -0
- package/.agent/skills/autonomous-agent-harness/SKILL.md +267 -0
- package/.agent/skills/autonomous-loops/SKILL.md +610 -0
- package/.agent/skills/backend-patterns/SKILL.md +598 -0
- package/.agent/skills/benchmark/SKILL.md +93 -0
- package/.agent/skills/blueprint/SKILL.md +105 -0
- package/.agent/skills/brand-voice/SKILL.md +97 -0
- package/.agent/skills/brand-voice/references/voice-profile-schema.md +55 -0
- package/.agent/skills/browser-qa/SKILL.md +87 -0
- package/.agent/skills/bun-runtime/SKILL.md +84 -0
- package/.agent/skills/canary-watch/SKILL.md +99 -0
- package/.agent/skills/carrier-relationship-management/SKILL.md +212 -0
- package/.agent/skills/ck/SKILL.md +147 -0
- package/.agent/skills/ck/commands/forget.mjs +44 -0
- package/.agent/skills/ck/commands/info.mjs +24 -0
- package/.agent/skills/ck/commands/init.mjs +143 -0
- package/.agent/skills/ck/commands/list.mjs +40 -0
- package/.agent/skills/ck/commands/migrate.mjs +202 -0
- package/.agent/skills/ck/commands/resume.mjs +36 -0
- package/.agent/skills/ck/commands/save.mjs +210 -0
- package/.agent/skills/ck/commands/shared.mjs +387 -0
- package/.agent/skills/ck/hooks/session-start.mjs +224 -0
- package/.agent/skills/claude-api/SKILL.md +337 -0
- package/.agent/skills/claude-devfleet/SKILL.md +103 -0
- package/.agent/skills/click-path-audit/SKILL.md +244 -0
- package/.agent/skills/clickhouse-io/SKILL.md +439 -0
- package/.agent/skills/codebase-onboarding/SKILL.md +233 -0
- package/.agent/skills/coding-standards/SKILL.md +530 -0
- package/.agent/skills/compose-multiplatform-patterns/SKILL.md +299 -0
- package/.agent/skills/configure-ecc/SKILL.md +367 -0
- package/.agent/skills/connections-optimizer/SKILL.md +189 -0
- package/.agent/skills/content-engine/SKILL.md +131 -0
- package/.agent/skills/content-hash-cache-pattern/SKILL.md +161 -0
- package/.agent/skills/context-budget/SKILL.md +135 -0
- package/.agent/skills/continuous-agent-loop/SKILL.md +45 -0
- package/.agent/skills/continuous-learning/SKILL.md +119 -0
- package/.agent/skills/continuous-learning/config.json +18 -0
- package/.agent/skills/continuous-learning/evaluate-session.sh +69 -0
- package/.agent/skills/continuous-learning-v2/SKILL.md +365 -0
- package/.agent/skills/continuous-learning-v2/agents/observer-loop.sh +271 -0
- package/.agent/skills/continuous-learning-v2/agents/observer.md +198 -0
- package/.agent/skills/continuous-learning-v2/agents/session-guardian.sh +150 -0
- package/.agent/skills/continuous-learning-v2/agents/start-observer.sh +244 -0
- package/.agent/skills/continuous-learning-v2/config.json +8 -0
- package/.agent/skills/continuous-learning-v2/hooks/observe.sh +428 -0
- package/.agent/skills/continuous-learning-v2/scripts/detect-project.sh +228 -0
- package/.agent/skills/continuous-learning-v2/scripts/instinct-cli.py +1426 -0
- package/.agent/skills/continuous-learning-v2/scripts/test-parse-instinct.py +984 -0
- package/.agent/skills/cost-aware-llm-pipeline/SKILL.md +183 -0
- package/.agent/skills/cpp-coding-standards/SKILL.md +723 -0
- package/.agent/skills/cpp-testing/SKILL.md +324 -0
- package/.agent/skills/crosspost/SKILL.md +111 -0
- package/.agent/skills/csharp-testing/SKILL.md +321 -0
- package/.agent/skills/customer-billing-ops/SKILL.md +140 -0
- package/.agent/skills/customs-trade-compliance/SKILL.md +263 -0
- package/.agent/skills/dart-flutter-patterns/SKILL.md +563 -0
- package/.agent/skills/data-scraper-agent/SKILL.md +764 -0
- package/.agent/skills/database-migrations/SKILL.md +429 -0
- package/.agent/skills/deep-research/SKILL.md +155 -0
- package/.agent/skills/deployment-patterns/SKILL.md +427 -0
- package/.agent/skills/design-system/SKILL.md +82 -0
- package/.agent/skills/django-patterns/SKILL.md +734 -0
- package/.agent/skills/django-security/SKILL.md +593 -0
- package/.agent/skills/django-tdd/SKILL.md +729 -0
- package/.agent/skills/django-verification/SKILL.md +469 -0
- package/.agent/skills/dmux-workflows/SKILL.md +191 -0
- package/.agent/skills/docker-patterns/SKILL.md +364 -0
- package/.agent/skills/documentation-lookup/SKILL.md +90 -0
- package/.agent/skills/dotnet-patterns/SKILL.md +321 -0
- package/.agent/skills/e2e-testing/SKILL.md +326 -0
- package/.agent/skills/energy-procurement/SKILL.md +228 -0
- package/.agent/skills/enterprise-agent-ops/SKILL.md +50 -0
- package/.agent/skills/eval-harness/SKILL.md +270 -0
- package/.agent/skills/exa-search/SKILL.md +103 -0
- package/.agent/skills/fal-ai-media/SKILL.md +284 -0
- package/.agent/skills/flutter-dart-code-review/SKILL.md +435 -0
- package/.agent/skills/foundation-models-on-device/SKILL.md +243 -0
- package/.agent/skills/frontend-patterns/SKILL.md +642 -0
- package/.agent/skills/frontend-slides/SKILL.md +184 -0
- package/.agent/skills/frontend-slides/style-presets.md +330 -0
- package/.agent/skills/gan-style-harness/SKILL.md +278 -0
- package/.agent/skills/git-workflow/SKILL.md +715 -0
- package/.agent/skills/golang-patterns/SKILL.md +674 -0
- package/.agent/skills/golang-testing/SKILL.md +720 -0
- package/.agent/skills/google-workspace-ops/SKILL.md +95 -0
- package/.agent/skills/healthcare-cdss-patterns/SKILL.md +245 -0
- package/.agent/skills/healthcare-emr-patterns/SKILL.md +159 -0
- package/.agent/skills/healthcare-eval-harness/SKILL.md +207 -0
- package/.agent/skills/healthcare-phi-compliance/SKILL.md +145 -0
- package/.agent/skills/hexagonal-architecture/SKILL.md +276 -0
- package/.agent/skills/inventory-demand-planning/SKILL.md +247 -0
- package/.agent/skills/investor-materials/SKILL.md +96 -0
- package/.agent/skills/investor-outreach/SKILL.md +91 -0
- package/.agent/skills/iterative-retrieval/SKILL.md +211 -0
- package/.agent/skills/java-coding-standards/SKILL.md +147 -0
- package/.agent/skills/jira-integration/SKILL.md +293 -0
- package/.agent/skills/jpa-patterns/SKILL.md +151 -0
- package/.agent/skills/kotlin-coroutines-flows/SKILL.md +284 -0
- package/.agent/skills/kotlin-exposed-patterns/SKILL.md +719 -0
- package/.agent/skills/kotlin-ktor-patterns/SKILL.md +689 -0
- package/.agent/skills/kotlin-patterns/SKILL.md +711 -0
- package/.agent/skills/kotlin-testing/SKILL.md +824 -0
- package/.agent/skills/laravel-patterns/SKILL.md +415 -0
- package/.agent/skills/laravel-plugin-discovery/SKILL.md +229 -0
- package/.agent/skills/laravel-security/SKILL.md +285 -0
- package/.agent/skills/laravel-tdd/SKILL.md +283 -0
- package/.agent/skills/laravel-verification/SKILL.md +179 -0
- package/.agent/skills/lead-intelligence/SKILL.md +321 -0
- package/.agent/skills/lead-intelligence/agents/enrichment-agent.md +85 -0
- package/.agent/skills/lead-intelligence/agents/mutual-mapper.md +75 -0
- package/.agent/skills/lead-intelligence/agents/outreach-drafter.md +98 -0
- package/.agent/skills/lead-intelligence/agents/signal-scorer.md +60 -0
- package/.agent/skills/liquid-glass-design/SKILL.md +279 -0
- package/.agent/skills/logistics-exception-management/SKILL.md +222 -0
- package/.agent/skills/manim-video/SKILL.md +89 -0
- package/.agent/skills/manim-video/assets/network-graph-scene.py +52 -0
- package/.agent/skills/market-research/SKILL.md +75 -0
- package/.agent/skills/mcp-builder/SKILL.md +173 -113
- package/.agent/skills/mcp-builder/license.txt +202 -0
- package/.agent/skills/mcp-builder/reference/evaluation.md +602 -0
- package/.agent/skills/mcp-builder/reference/mcp-best-practices.md +249 -0
- package/.agent/skills/mcp-builder/reference/node-mcp-server.md +970 -0
- package/.agent/skills/mcp-builder/reference/python-mcp-server.md +719 -0
- package/.agent/skills/mcp-builder/scripts/connections.py +151 -0
- package/.agent/skills/mcp-builder/scripts/evaluation.py +373 -0
- package/.agent/skills/mcp-builder/scripts/example-evaluation.xml +22 -0
- package/.agent/skills/mcp-builder/scripts/requirements.txt +2 -0
- package/.agent/skills/mcp-server-patterns/SKILL.md +67 -0
- package/.agent/skills/nanoclaw-repl/SKILL.md +33 -0
- package/.agent/skills/nestjs-patterns/SKILL.md +230 -0
- package/.agent/skills/nextjs-turbopack/SKILL.md +44 -0
- package/.agent/skills/nutrient-document-processing/SKILL.md +167 -0
- package/.agent/skills/nuxt4-patterns/SKILL.md +100 -0
- package/.agent/skills/openclaw-persona-forge/SKILL.md +296 -0
- package/.agent/skills/openclaw-persona-forge/gacha.py +224 -0
- package/.agent/skills/openclaw-persona-forge/gacha.sh +5 -0
- package/.agent/skills/openclaw-persona-forge/references/avatar-style.md +124 -0
- package/.agent/skills/openclaw-persona-forge/references/boundary-rules.md +53 -0
- package/.agent/skills/openclaw-persona-forge/references/error-handling.md +53 -0
- package/.agent/skills/openclaw-persona-forge/references/identity-tension.md +48 -0
- package/.agent/skills/openclaw-persona-forge/references/naming-system.md +39 -0
- package/.agent/skills/openclaw-persona-forge/references/output-template.md +166 -0
- package/.agent/skills/opensource-pipeline/SKILL.md +255 -0
- package/.agent/skills/perl-patterns/SKILL.md +504 -0
- package/.agent/skills/perl-security/SKILL.md +503 -0
- package/.agent/skills/perl-testing/SKILL.md +475 -0
- package/.agent/skills/plankton-code-quality/SKILL.md +236 -0
- package/.agent/skills/postgres-patterns/SKILL.md +147 -0
- package/.agent/skills/product-lens/SKILL.md +85 -0
- package/.agent/skills/production-scheduling/SKILL.md +238 -0
- package/.agent/skills/project-flow-ops/SKILL.md +111 -0
- package/.agent/skills/project-guidelines-example/SKILL.md +349 -0
- package/.agent/skills/prompt-optimizer/SKILL.md +397 -0
- package/.agent/skills/python-patterns/SKILL.md +622 -313
- package/.agent/skills/python-testing/SKILL.md +816 -0
- package/.agent/skills/pytorch-patterns/SKILL.md +396 -0
- package/.agent/skills/quality-nonconformance/SKILL.md +260 -0
- package/.agent/skills/ralphinho-rfc-pipeline/SKILL.md +67 -0
- package/.agent/skills/regex-vs-llm-structured-text/SKILL.md +220 -0
- package/.agent/skills/remotion-video-creation/SKILL.md +43 -0
- package/.agent/skills/remotion-video-creation/rules/3d.md +86 -0
- package/.agent/skills/remotion-video-creation/rules/animations.md +29 -0
- package/.agent/skills/remotion-video-creation/rules/assets/charts-bar-chart.tsx +173 -0
- package/.agent/skills/remotion-video-creation/rules/assets/text-animations-typewriter.tsx +100 -0
- package/.agent/skills/remotion-video-creation/rules/assets/text-animations-word-highlight.tsx +108 -0
- package/.agent/skills/remotion-video-creation/rules/assets.md +78 -0
- package/.agent/skills/remotion-video-creation/rules/audio.md +172 -0
- package/.agent/skills/remotion-video-creation/rules/calculate-metadata.md +104 -0
- package/.agent/skills/remotion-video-creation/rules/can-decode.md +75 -0
- package/.agent/skills/remotion-video-creation/rules/charts.md +58 -0
- package/.agent/skills/remotion-video-creation/rules/compositions.md +146 -0
- package/.agent/skills/remotion-video-creation/rules/display-captions.md +126 -0
- package/.agent/skills/remotion-video-creation/rules/extract-frames.md +229 -0
- package/.agent/skills/remotion-video-creation/rules/fonts.md +152 -0
- package/.agent/skills/remotion-video-creation/rules/get-audio-duration.md +58 -0
- package/.agent/skills/remotion-video-creation/rules/get-video-dimensions.md +68 -0
- package/.agent/skills/remotion-video-creation/rules/get-video-duration.md +58 -0
- package/.agent/skills/remotion-video-creation/rules/gifs.md +138 -0
- package/.agent/skills/remotion-video-creation/rules/images.md +130 -0
- package/.agent/skills/remotion-video-creation/rules/import-srt-captions.md +67 -0
- package/.agent/skills/remotion-video-creation/rules/lottie.md +67 -0
- package/.agent/skills/remotion-video-creation/rules/measuring-dom-nodes.md +34 -0
- package/.agent/skills/remotion-video-creation/rules/measuring-text.md +143 -0
- package/.agent/skills/remotion-video-creation/rules/sequencing.md +106 -0
- package/.agent/skills/remotion-video-creation/rules/tailwind.md +11 -0
- package/.agent/skills/remotion-video-creation/rules/text-animations.md +20 -0
- package/.agent/skills/remotion-video-creation/rules/timing.md +179 -0
- package/.agent/skills/remotion-video-creation/rules/transcribe-captions.md +19 -0
- package/.agent/skills/remotion-video-creation/rules/transitions.md +122 -0
- package/.agent/skills/remotion-video-creation/rules/trimming.md +52 -0
- package/.agent/skills/remotion-video-creation/rules/videos.md +171 -0
- package/.agent/skills/repo-scan/SKILL.md +78 -0
- package/.agent/skills/returns-reverse-logistics/SKILL.md +240 -0
- package/.agent/skills/rules-distill/SKILL.md +264 -0
- package/.agent/skills/rules-distill/scripts/scan-rules.sh +58 -0
- package/.agent/skills/rules-distill/scripts/scan-skills.sh +129 -0
- package/.agent/skills/rust-patterns/SKILL.md +499 -0
- package/.agent/skills/rust-testing/SKILL.md +500 -0
- package/.agent/skills/safety-guard/SKILL.md +75 -0
- package/.agent/skills/santa-method/SKILL.md +306 -0
- package/.agent/skills/search-first/SKILL.md +161 -0
- package/.agent/skills/security-review/SKILL.md +495 -0
- package/.agent/skills/security-review/cloud-infrastructure-security.md +361 -0
- package/.agent/skills/security-scan/SKILL.md +165 -0
- package/.agent/skills/skill-comply/SKILL.md +58 -0
- package/.agent/skills/skill-comply/fixtures/compliant-trace.jsonl +5 -0
- package/.agent/skills/skill-comply/fixtures/noncompliant-trace.jsonl +3 -0
- package/.agent/skills/skill-comply/fixtures/tdd-spec.yaml +44 -0
- package/.agent/skills/skill-comply/prompts/classifier.md +24 -0
- package/.agent/skills/skill-comply/prompts/scenario-generator.md +62 -0
- package/.agent/skills/skill-comply/prompts/spec-generator.md +42 -0
- package/.agent/skills/skill-comply/pyproject.toml +15 -0
- package/.agent/skills/skill-comply/scripts/classifier.py +85 -0
- package/.agent/skills/skill-comply/scripts/grader.py +122 -0
- package/.agent/skills/skill-comply/scripts/init.py +0 -0
- package/.agent/skills/skill-comply/scripts/parser.py +107 -0
- package/.agent/skills/skill-comply/scripts/report.py +170 -0
- package/.agent/skills/skill-comply/scripts/run.py +127 -0
- package/.agent/skills/skill-comply/scripts/runner.py +161 -0
- package/.agent/skills/skill-comply/scripts/scenario-generator.py +70 -0
- package/.agent/skills/skill-comply/scripts/spec-generator.py +72 -0
- package/.agent/skills/skill-comply/scripts/utils.py +13 -0
- package/.agent/skills/skill-comply/tests/test-grader.py +137 -0
- package/.agent/skills/skill-comply/tests/test-parser.py +90 -0
- package/.agent/skills/skill-creator/SKILL.md +485 -0
- package/.agent/skills/skill-creator/agents/analyzer.md +274 -0
- package/.agent/skills/skill-creator/agents/comparator.md +202 -0
- package/.agent/skills/skill-creator/agents/grader.md +223 -0
- package/.agent/skills/skill-creator/assets/eval-review.html +146 -0
- package/.agent/skills/skill-creator/eval-viewer/generate-review.py +471 -0
- package/.agent/skills/skill-creator/eval-viewer/viewer.html +1325 -0
- package/.agent/skills/skill-creator/license.txt +202 -0
- package/.agent/skills/skill-creator/references/schemas.md +430 -0
- package/.agent/skills/skill-creator/scripts/aggregate-benchmark.py +401 -0
- package/.agent/skills/skill-creator/scripts/generate-report.py +326 -0
- package/.agent/skills/skill-creator/scripts/improve-description.py +247 -0
- package/.agent/skills/skill-creator/scripts/init.py +0 -0
- package/.agent/skills/skill-creator/scripts/package-skill.py +136 -0
- package/.agent/skills/skill-creator/scripts/quick-validate.py +103 -0
- package/.agent/skills/skill-creator/scripts/run-eval.py +310 -0
- package/.agent/skills/skill-creator/scripts/run-loop.py +328 -0
- package/.agent/skills/skill-creator/scripts/utils.py +47 -0
- package/.agent/skills/skill-stocktake/SKILL.md +193 -0
- package/.agent/skills/skill-stocktake/scripts/quick-diff.sh +87 -0
- package/.agent/skills/skill-stocktake/scripts/save-results.sh +56 -0
- package/.agent/skills/skill-stocktake/scripts/scan.sh +170 -0
- package/.agent/skills/social-graph-ranker/SKILL.md +154 -0
- package/.agent/skills/springboot-patterns/SKILL.md +314 -0
- package/.agent/skills/springboot-security/SKILL.md +272 -0
- package/.agent/skills/springboot-tdd/SKILL.md +158 -0
- package/.agent/skills/springboot-verification/SKILL.md +231 -0
- package/.agent/skills/strategic-compact/SKILL.md +131 -0
- package/.agent/skills/strategic-compact/suggest-compact.sh +54 -0
- package/.agent/skills/swift-actor-persistence/SKILL.md +143 -0
- package/.agent/skills/swift-concurrency-6-2/SKILL.md +216 -0
- package/.agent/skills/swift-protocol-di-testing/SKILL.md +190 -0
- package/.agent/skills/swiftui-patterns/SKILL.md +259 -0
- package/.agent/skills/tdd-workflow/SKILL.md +412 -98
- package/.agent/skills/team-builder/SKILL.md +168 -0
- package/.agent/skills/token-budget-advisor/SKILL.md +133 -0
- package/.agent/skills/ui-demo/SKILL.md +465 -0
- package/.agent/skills/ui-ux-pro-max/data/charts.csv +26 -26
- package/.agent/skills/ui-ux-pro-max/data/colors.csv +97 -97
- package/.agent/skills/ui-ux-pro-max/data/landing.csv +28 -28
- package/.agent/skills/ui-ux-pro-max/data/products.csv +96 -96
- package/.agent/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -53
- package/.agent/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -56
- package/.agent/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -53
- package/.agent/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -52
- package/.agent/skills/ui-ux-pro-max/data/stacks/react.csv +54 -54
- package/.agent/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -54
- package/.agent/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -51
- package/.agent/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -50
- package/.agent/skills/ui-ux-pro-max/data/styles.csv +68 -68
- package/.agent/skills/ui-ux-pro-max/data/ux-guidelines.csv +99 -99
- package/.agent/skills/ui-ux-pro-max/scripts/search.py +114 -114
- package/.agent/skills/verification-loop/SKILL.md +126 -0
- package/.agent/skills/video-editing/SKILL.md +310 -0
- package/.agent/skills/videodb/SKILL.md +374 -0
- package/.agent/skills/videodb/reference/api-reference.md +550 -0
- package/.agent/skills/videodb/reference/capture-reference.md +407 -0
- package/.agent/skills/videodb/reference/capture.md +101 -0
- package/.agent/skills/videodb/reference/editor.md +443 -0
- package/.agent/skills/videodb/reference/generative.md +331 -0
- package/.agent/skills/videodb/reference/rtstream-reference.md +564 -0
- package/.agent/skills/videodb/reference/rtstream.md +65 -0
- package/.agent/skills/videodb/reference/search.md +230 -0
- package/.agent/skills/videodb/reference/streaming.md +406 -0
- package/.agent/skills/videodb/reference/use-cases.md +118 -0
- package/.agent/skills/videodb/scripts/ws-listener.py +282 -0
- package/.agent/skills/visa-doc-translate/SKILL.md +117 -0
- package/.agent/skills/visa-doc-translate/readme.md +86 -0
- package/.agent/skills/workspace-surface-audit/SKILL.md +125 -0
- package/.agent/skills/x-api/SKILL.md +230 -0
- package/.agent/tasks/two-track-merge-contract.md +29 -0
- package/.agent/workflows/aside.md +164 -164
- package/.agent/workflows/build-fix.md +62 -62
- package/.agent/workflows/checkpoint.md +74 -74
- package/.agent/workflows/claw.md +23 -51
- package/.agent/workflows/clean-memory.md +34 -0
- package/.agent/workflows/code-review.md +289 -40
- package/.agent/workflows/context-budget.md +23 -29
- package/.agent/workflows/cpp-build.md +173 -173
- package/.agent/workflows/cpp-review.md +132 -132
- package/.agent/workflows/cpp-test.md +251 -251
- package/.agent/workflows/devfleet.md +23 -92
- package/.agent/workflows/docs.md +23 -31
- package/.agent/workflows/e2e.md +268 -365
- package/.agent/workflows/eval.md +23 -120
- package/.agent/workflows/evolve.md +178 -178
- package/.agent/workflows/flutter-build.md +164 -0
- package/.agent/workflows/flutter-review.md +116 -0
- package/.agent/workflows/flutter-test.md +144 -0
- package/.agent/workflows/gan-build.md +99 -0
- package/.agent/workflows/gan-design.md +35 -0
- package/.agent/workflows/go-build.md +183 -183
- package/.agent/workflows/go-review.md +148 -148
- package/.agent/workflows/go-test.md +268 -268
- package/.agent/workflows/gradle-build.md +70 -70
- package/.agent/workflows/harness-audit.md +73 -71
- package/.agent/workflows/instinct-export.md +66 -66
- package/.agent/workflows/instinct-import.md +114 -114
- package/.agent/workflows/instinct-status.md +59 -59
- package/.agent/workflows/jira.md +106 -0
- package/.agent/workflows/kotlin-build.md +174 -174
- package/.agent/workflows/kotlin-review.md +140 -140
- package/.agent/workflows/kotlin-test.md +312 -312
- package/.agent/workflows/learn-eval.md +116 -116
- package/.agent/workflows/learn.md +70 -70
- package/.agent/workflows/loop-start.md +32 -32
- package/.agent/workflows/loop-status.md +24 -24
- package/.agent/workflows/model-route.md +26 -26
- package/.agent/workflows/multi-backend.md +158 -158
- package/.agent/workflows/multi-execute.md +315 -315
- package/.agent/workflows/multi-frontend.md +158 -158
- package/.agent/workflows/multi-plan.md +268 -268
- package/.agent/workflows/multi-workflow.md +191 -191
- package/.agent/workflows/orchestrate.md +135 -231
- package/.agent/workflows/plan.md +117 -115
- package/.agent/workflows/pm2.md +272 -272
- package/.agent/workflows/projects.md +39 -39
- package/.agent/workflows/promote.md +41 -41
- package/.agent/workflows/prompt-optimize.md +23 -38
- package/.agent/workflows/prp-commit.md +112 -0
- package/.agent/workflows/prp-implement.md +385 -0
- package/.agent/workflows/prp-plan.md +502 -0
- package/.agent/workflows/prp-pr.md +184 -0
- package/.agent/workflows/prp-prd.md +447 -0
- package/.agent/workflows/prune.md +31 -31
- package/.agent/workflows/python-review.md +297 -297
- package/.agent/workflows/quality-gate.md +29 -29
- package/.agent/workflows/refactor-clean.md +80 -80
- package/.agent/workflows/resume-session.md +156 -156
- package/.agent/workflows/rules-distill.md +20 -11
- package/.agent/workflows/rust-build.md +187 -187
- package/.agent/workflows/rust-review.md +142 -142
- package/.agent/workflows/rust-test.md +308 -308
- package/.agent/workflows/santa-loop.md +175 -0
- package/.agent/workflows/save-session.md +275 -275
- package/.agent/workflows/sessions.md +333 -333
- package/.agent/workflows/setup-pm.md +80 -80
- package/.agent/workflows/skill-create.md +174 -174
- package/.agent/workflows/skill-health.md +54 -54
- package/.agent/workflows/tdd.md +231 -328
- package/.agent/workflows/test-coverage.md +69 -69
- package/.agent/workflows/update-codemaps.md +72 -72
- package/.agent/workflows/update-docs.md +84 -84
- package/.agent/workflows/verify.md +23 -59
- package/LICENSE +176 -176
- package/README.md +28 -20
- package/RELEASE.md +32 -36
- package/package.json +87 -79
- package/scripts/release-check.js +55 -55
- package/src/bin/cli.js +399 -53
- package/src/lib/installer.js +360 -114
- package/src/lib/manifests/stacks.js +122 -0
- package/src/lib/slash-commands.js +28 -0
- package/src/templates/claude/CLAUDE.en.md +42 -0
- package/src/templates/claude/CLAUDE.md +42 -0
- package/src/templates/claude/CLAUDE.vi.md +42 -0
- package/src/templates/codex/AGENTS.en.md +40 -0
- package/src/templates/codex/AGENTS.md +40 -0
- package/src/templates/codex/AGENTS.vi.md +40 -0
- package/src/templates/cursor/pilo-masterkit.mdc +20 -0
- package/src/templates/gemini/GEMINI.en.md +56 -0
- package/src/templates/gemini/GEMINI.md +56 -0
- package/src/templates/gemini/GEMINI.vi.md +56 -0
- package/src/templates/github/copilot-instructions.md +16 -0
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
# Search & Indexing Guide
|
|
2
|
+
|
|
3
|
+
Search allows you to find specific moments inside videos using natural language queries, exact keywords, or visual scene descriptions.
|
|
4
|
+
|
|
5
|
+
## Prerequisites
|
|
6
|
+
|
|
7
|
+
Videos **must be indexed** before they can be searched. Indexing is a one-time operation per video per index type.
|
|
8
|
+
|
|
9
|
+
## Indexing
|
|
10
|
+
|
|
11
|
+
### Spoken Word Index
|
|
12
|
+
|
|
13
|
+
Index the transcribed speech content of a video for semantic and keyword search:
|
|
14
|
+
|
|
15
|
+
```python
|
|
16
|
+
video = coll.get_video(video_id)
|
|
17
|
+
|
|
18
|
+
# force=True makes indexing idempotent — skips if already indexed
|
|
19
|
+
video.index_spoken_words(force=True)
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
This transcribes the audio track and builds a searchable index over the spoken content. Required for semantic search and keyword search.
|
|
23
|
+
|
|
24
|
+
**Parameters:**
|
|
25
|
+
|
|
26
|
+
| Parameter | Type | Default | Description |
|
|
27
|
+
|-----------|------|---------|-------------|
|
|
28
|
+
| `language_code` | `str\|None` | `None` | Language code of the video |
|
|
29
|
+
| `segmentation_type` | `SegmentationType` | `SegmentationType.sentence` | Segmentation type (`sentence` or `llm`) |
|
|
30
|
+
| `force` | `bool` | `False` | Set to `True` to skip if already indexed (avoids "already exists" error) |
|
|
31
|
+
| `callback_url` | `str\|None` | `None` | Webhook URL for async notification |
|
|
32
|
+
|
|
33
|
+
### Scene Index
|
|
34
|
+
|
|
35
|
+
Index visual content by generating AI descriptions of scenes. Like spoken word indexing, this raises an error if a scene index already exists. Extract the existing `scene_index_id` from the error message.
|
|
36
|
+
|
|
37
|
+
```python
|
|
38
|
+
import re
|
|
39
|
+
from videodb import SceneExtractionType
|
|
40
|
+
|
|
41
|
+
try:
|
|
42
|
+
scene_index_id = video.index_scenes(
|
|
43
|
+
extraction_type=SceneExtractionType.shot_based,
|
|
44
|
+
prompt="Describe the visual content, objects, actions, and setting in this scene.",
|
|
45
|
+
)
|
|
46
|
+
except Exception as e:
|
|
47
|
+
match = re.search(r"id\s+([a-f0-9]+)", str(e))
|
|
48
|
+
if match:
|
|
49
|
+
scene_index_id = match.group(1)
|
|
50
|
+
else:
|
|
51
|
+
raise
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
**Extraction types:**
|
|
55
|
+
|
|
56
|
+
| Type | Description | Best For |
|
|
57
|
+
|------|-------------|----------|
|
|
58
|
+
| `SceneExtractionType.shot_based` | Splits on visual shot boundaries | General purpose, action content |
|
|
59
|
+
| `SceneExtractionType.time_based` | Splits at fixed intervals | Uniform sampling, long static content |
|
|
60
|
+
| `SceneExtractionType.transcript` | Splits based on transcript segments | Speech-driven scene boundaries |
|
|
61
|
+
|
|
62
|
+
**Parameters for `time_based`:**
|
|
63
|
+
|
|
64
|
+
```python
|
|
65
|
+
video.index_scenes(
|
|
66
|
+
extraction_type=SceneExtractionType.time_based,
|
|
67
|
+
extraction_config={"time": 5, "select_frames": ["first", "last"]},
|
|
68
|
+
prompt="Describe what is happening in this scene.",
|
|
69
|
+
)
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Search Types
|
|
73
|
+
|
|
74
|
+
### Semantic Search
|
|
75
|
+
|
|
76
|
+
Natural language queries matched against spoken content:
|
|
77
|
+
|
|
78
|
+
```python
|
|
79
|
+
from videodb import SearchType
|
|
80
|
+
|
|
81
|
+
results = video.search(
|
|
82
|
+
query="explaining the benefits of machine learning",
|
|
83
|
+
search_type=SearchType.semantic,
|
|
84
|
+
)
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Returns ranked segments where the spoken content semantically matches the query.
|
|
88
|
+
|
|
89
|
+
### Keyword Search
|
|
90
|
+
|
|
91
|
+
Exact term matching in transcribed speech:
|
|
92
|
+
|
|
93
|
+
```python
|
|
94
|
+
results = video.search(
|
|
95
|
+
query="artificial intelligence",
|
|
96
|
+
search_type=SearchType.keyword,
|
|
97
|
+
)
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
Returns segments containing the exact keyword or phrase.
|
|
101
|
+
|
|
102
|
+
### Scene Search
|
|
103
|
+
|
|
104
|
+
Visual content queries matched against indexed scene descriptions. Requires a prior `index_scenes()` call.
|
|
105
|
+
|
|
106
|
+
`index_scenes()` returns a `scene_index_id`. Pass it to `video.search()` to target a specific scene index (especially important when a video has multiple scene indexes):
|
|
107
|
+
|
|
108
|
+
```python
|
|
109
|
+
from videodb import SearchType, IndexType
|
|
110
|
+
from videodb.exceptions import InvalidRequestError
|
|
111
|
+
|
|
112
|
+
# Search using semantic search against the scene index.
|
|
113
|
+
# Use score_threshold to filter low-relevance noise (recommended: 0.3+).
|
|
114
|
+
try:
|
|
115
|
+
results = video.search(
|
|
116
|
+
query="person writing on a whiteboard",
|
|
117
|
+
search_type=SearchType.semantic,
|
|
118
|
+
index_type=IndexType.scene,
|
|
119
|
+
scene_index_id=scene_index_id,
|
|
120
|
+
score_threshold=0.3,
|
|
121
|
+
)
|
|
122
|
+
shots = results.get_shots()
|
|
123
|
+
except InvalidRequestError as e:
|
|
124
|
+
if "No results found" in str(e):
|
|
125
|
+
shots = []
|
|
126
|
+
else:
|
|
127
|
+
raise
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
**Important notes:**
|
|
131
|
+
|
|
132
|
+
- Use `SearchType.semantic` with `index_type=IndexType.scene` — this is the most reliable combination and works on all plans.
|
|
133
|
+
- `SearchType.scene` exists but may not be available on all plans (e.g. Free tier). Prefer `SearchType.semantic` with `IndexType.scene`.
|
|
134
|
+
- The `scene_index_id` parameter is optional. If omitted, the search runs against all scene indexes on the video. Pass it to target a specific index.
|
|
135
|
+
- You can create multiple scene indexes per video (with different prompts or extraction types) and search them independently using `scene_index_id`.
|
|
136
|
+
|
|
137
|
+
### Scene Search with Metadata Filtering
|
|
138
|
+
|
|
139
|
+
When indexing scenes with custom metadata, you can combine semantic search with metadata filters:
|
|
140
|
+
|
|
141
|
+
```python
|
|
142
|
+
from videodb import SearchType, IndexType
|
|
143
|
+
|
|
144
|
+
results = video.search(
|
|
145
|
+
query="a skillful chasing scene",
|
|
146
|
+
search_type=SearchType.semantic,
|
|
147
|
+
index_type=IndexType.scene,
|
|
148
|
+
scene_index_id=scene_index_id,
|
|
149
|
+
filter=[{"camera_view": "road_ahead"}, {"action_type": "chasing"}],
|
|
150
|
+
)
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
See the [scene_level_metadata_indexing cookbook](https://github.com/video-db/videodb-cookbook/blob/main/quickstart/scene_level_metadata_indexing.ipynb) for a full example of custom metadata indexing and filtered search.
|
|
154
|
+
|
|
155
|
+
## Working with Results
|
|
156
|
+
|
|
157
|
+
### Get Shots
|
|
158
|
+
|
|
159
|
+
Access individual result segments:
|
|
160
|
+
|
|
161
|
+
```python
|
|
162
|
+
results = video.search("your query")
|
|
163
|
+
|
|
164
|
+
for shot in results.get_shots():
|
|
165
|
+
print(f"Video: {shot.video_id}")
|
|
166
|
+
print(f"Start: {shot.start:.2f}s")
|
|
167
|
+
print(f"End: {shot.end:.2f}s")
|
|
168
|
+
print(f"Text: {shot.text}")
|
|
169
|
+
print("---")
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### Play Compiled Results
|
|
173
|
+
|
|
174
|
+
Stream all matching segments as a single compiled video:
|
|
175
|
+
|
|
176
|
+
```python
|
|
177
|
+
results = video.search("your query")
|
|
178
|
+
stream_url = results.compile()
|
|
179
|
+
results.play() # opens compiled stream in browser
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
### Extract Clips
|
|
183
|
+
|
|
184
|
+
Download or stream specific result segments:
|
|
185
|
+
|
|
186
|
+
```python
|
|
187
|
+
for shot in results.get_shots():
|
|
188
|
+
stream_url = shot.generate_stream()
|
|
189
|
+
print(f"Clip: {stream_url}")
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
## Cross-Collection Search
|
|
193
|
+
|
|
194
|
+
Search across all videos in a collection:
|
|
195
|
+
|
|
196
|
+
```python
|
|
197
|
+
coll = conn.get_collection()
|
|
198
|
+
|
|
199
|
+
# Search across all videos in the collection
|
|
200
|
+
results = coll.search(
|
|
201
|
+
query="product demo",
|
|
202
|
+
search_type=SearchType.semantic,
|
|
203
|
+
)
|
|
204
|
+
|
|
205
|
+
for shot in results.get_shots():
|
|
206
|
+
print(f"Video: {shot.video_id} [{shot.start:.1f}s - {shot.end:.1f}s]")
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
> **Note:** Collection-level search only supports `SearchType.semantic`. Using `SearchType.keyword` or `SearchType.scene` with `coll.search()` will raise `NotImplementedError`. For keyword or scene search, use `video.search()` on individual videos instead.
|
|
210
|
+
|
|
211
|
+
## Search + Compile
|
|
212
|
+
|
|
213
|
+
Index, search, and compile matching segments into a single playable stream:
|
|
214
|
+
|
|
215
|
+
```python
|
|
216
|
+
video.index_spoken_words(force=True)
|
|
217
|
+
results = video.search(query="your query", search_type=SearchType.semantic)
|
|
218
|
+
stream_url = results.compile()
|
|
219
|
+
print(stream_url)
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
## Tips
|
|
223
|
+
|
|
224
|
+
- **Index once, search many times**: Indexing is the expensive operation. Once indexed, searches are fast.
|
|
225
|
+
- **Combine index types**: Index both spoken words and scenes to enable all search types on the same video.
|
|
226
|
+
- **Refine queries**: Semantic search works best with descriptive, natural language phrases rather than single keywords.
|
|
227
|
+
- **Use keyword search for precision**: When you need exact term matches, keyword search avoids semantic drift.
|
|
228
|
+
- **Handle "No results found"**: `video.search()` raises `InvalidRequestError` when no results match. Always wrap search calls in try/except and treat `"No results found"` as an empty result set.
|
|
229
|
+
- **Filter scene search noise**: Semantic scene search can return low-relevance results for vague queries. Use `score_threshold=0.3` (or higher) to filter noise.
|
|
230
|
+
- **Idempotent indexing**: Use `index_spoken_words(force=True)` to safely re-index. `index_scenes()` has no `force` parameter — wrap it in try/except and extract the existing `scene_index_id` from the error message with `re.search(r"id\s+([a-f0-9]+)", str(e))`.
|
|
@@ -0,0 +1,406 @@
|
|
|
1
|
+
# Streaming & Playback
|
|
2
|
+
|
|
3
|
+
VideoDB generates streams on-demand, returning HLS-compatible URLs that play instantly in any standard video player. No render times or export waits - edits, searches, and compositions stream immediately.
|
|
4
|
+
|
|
5
|
+
## Prerequisites
|
|
6
|
+
|
|
7
|
+
Videos **must be uploaded** to a collection before streams can be generated. For search-based streams, the video must also be **indexed** (spoken words and/or scenes). See [search.md](search.md) for indexing details.
|
|
8
|
+
|
|
9
|
+
## Core Concepts
|
|
10
|
+
|
|
11
|
+
### Stream Generation
|
|
12
|
+
|
|
13
|
+
Every video, search result, and timeline in VideoDB can produce a **stream URL**. This URL points to an HLS (HTTP Live Streaming) manifest that is compiled on demand.
|
|
14
|
+
|
|
15
|
+
```python
|
|
16
|
+
# From a video
|
|
17
|
+
stream_url = video.generate_stream()
|
|
18
|
+
|
|
19
|
+
# From a timeline
|
|
20
|
+
stream_url = timeline.generate_stream()
|
|
21
|
+
|
|
22
|
+
# From search results
|
|
23
|
+
stream_url = results.compile()
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Streaming a Single Video
|
|
27
|
+
|
|
28
|
+
### Basic Playback
|
|
29
|
+
|
|
30
|
+
```python
|
|
31
|
+
import videodb
|
|
32
|
+
|
|
33
|
+
conn = videodb.connect()
|
|
34
|
+
coll = conn.get_collection()
|
|
35
|
+
video = coll.get_video("your-video-id")
|
|
36
|
+
|
|
37
|
+
# Generate stream URL
|
|
38
|
+
stream_url = video.generate_stream()
|
|
39
|
+
print(f"Stream: {stream_url}")
|
|
40
|
+
|
|
41
|
+
# Open in default browser
|
|
42
|
+
video.play()
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### With Subtitles
|
|
46
|
+
|
|
47
|
+
```python
|
|
48
|
+
# Index and add subtitles first
|
|
49
|
+
video.index_spoken_words(force=True)
|
|
50
|
+
stream_url = video.add_subtitle()
|
|
51
|
+
|
|
52
|
+
# Returned URL already includes subtitles
|
|
53
|
+
print(f"Subtitled stream: {stream_url}")
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### Specific Segments
|
|
57
|
+
|
|
58
|
+
Stream only a portion of a video by passing a timeline of timestamp ranges:
|
|
59
|
+
|
|
60
|
+
```python
|
|
61
|
+
# Stream seconds 10-30 and 60-90
|
|
62
|
+
stream_url = video.generate_stream(timeline=[(10, 30), (60, 90)])
|
|
63
|
+
print(f"Segment stream: {stream_url}")
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Streaming Timeline Compositions
|
|
67
|
+
|
|
68
|
+
Build a multi-asset composition and stream it in real time:
|
|
69
|
+
|
|
70
|
+
```python
|
|
71
|
+
import videodb
|
|
72
|
+
from videodb.timeline import Timeline
|
|
73
|
+
from videodb.asset import VideoAsset, AudioAsset, ImageAsset, TextAsset, TextStyle
|
|
74
|
+
|
|
75
|
+
conn = videodb.connect()
|
|
76
|
+
coll = conn.get_collection()
|
|
77
|
+
|
|
78
|
+
video = coll.get_video(video_id)
|
|
79
|
+
music = coll.get_audio(music_id)
|
|
80
|
+
|
|
81
|
+
timeline = Timeline(conn)
|
|
82
|
+
|
|
83
|
+
# Main video content
|
|
84
|
+
timeline.add_inline(VideoAsset(asset_id=video.id))
|
|
85
|
+
|
|
86
|
+
# Background music overlay (starts at second 0)
|
|
87
|
+
timeline.add_overlay(0, AudioAsset(asset_id=music.id))
|
|
88
|
+
|
|
89
|
+
# Text overlay at the beginning
|
|
90
|
+
timeline.add_overlay(0, TextAsset(
|
|
91
|
+
text="Live Demo",
|
|
92
|
+
duration=3,
|
|
93
|
+
style=TextStyle(fontsize=48, fontcolor="white", boxcolor="#000000"),
|
|
94
|
+
))
|
|
95
|
+
|
|
96
|
+
# Generate the composed stream
|
|
97
|
+
stream_url = timeline.generate_stream()
|
|
98
|
+
print(f"Composed stream: {stream_url}")
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
**Important:** `add_inline()` only accepts `VideoAsset`. Use `add_overlay()` for `AudioAsset`, `ImageAsset`, and `TextAsset`.
|
|
102
|
+
|
|
103
|
+
For detailed timeline editing, see [editor.md](editor.md).
|
|
104
|
+
|
|
105
|
+
## Streaming Search Results
|
|
106
|
+
|
|
107
|
+
Compile search results into a single stream of all matching segments:
|
|
108
|
+
|
|
109
|
+
```python
|
|
110
|
+
from videodb import SearchType
|
|
111
|
+
from videodb.exceptions import InvalidRequestError
|
|
112
|
+
|
|
113
|
+
video.index_spoken_words(force=True)
|
|
114
|
+
try:
|
|
115
|
+
results = video.search("key announcement", search_type=SearchType.semantic)
|
|
116
|
+
|
|
117
|
+
# Compile all matching shots into one stream
|
|
118
|
+
stream_url = results.compile()
|
|
119
|
+
print(f"Search results stream: {stream_url}")
|
|
120
|
+
|
|
121
|
+
# Or play directly
|
|
122
|
+
results.play()
|
|
123
|
+
except InvalidRequestError as exc:
|
|
124
|
+
if "No results found" in str(exc):
|
|
125
|
+
print("No matching announcement segments were found.")
|
|
126
|
+
else:
|
|
127
|
+
raise
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### Stream Individual Search Hits
|
|
131
|
+
|
|
132
|
+
```python
|
|
133
|
+
from videodb.exceptions import InvalidRequestError
|
|
134
|
+
|
|
135
|
+
try:
|
|
136
|
+
results = video.search("product demo", search_type=SearchType.semantic)
|
|
137
|
+
for i, shot in enumerate(results.get_shots()):
|
|
138
|
+
stream_url = shot.generate_stream()
|
|
139
|
+
print(f"Hit {i+1} [{shot.start:.1f}s-{shot.end:.1f}s]: {stream_url}")
|
|
140
|
+
except InvalidRequestError as exc:
|
|
141
|
+
if "No results found" in str(exc):
|
|
142
|
+
print("No product demo segments matched the query.")
|
|
143
|
+
else:
|
|
144
|
+
raise
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
## Audio Playback
|
|
148
|
+
|
|
149
|
+
Get a signed playback URL for audio content:
|
|
150
|
+
|
|
151
|
+
```python
|
|
152
|
+
audio = coll.get_audio(audio_id)
|
|
153
|
+
playback_url = audio.generate_url()
|
|
154
|
+
print(f"Audio URL: {playback_url}")
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
## Complete Workflow Examples
|
|
158
|
+
|
|
159
|
+
### Search-to-Stream Pipeline
|
|
160
|
+
|
|
161
|
+
Combine search, timeline composition, and streaming in one workflow:
|
|
162
|
+
|
|
163
|
+
```python
|
|
164
|
+
import videodb
|
|
165
|
+
from videodb import SearchType
|
|
166
|
+
from videodb.exceptions import InvalidRequestError
|
|
167
|
+
from videodb.timeline import Timeline
|
|
168
|
+
from videodb.asset import VideoAsset, TextAsset, TextStyle
|
|
169
|
+
|
|
170
|
+
conn = videodb.connect()
|
|
171
|
+
coll = conn.get_collection()
|
|
172
|
+
video = coll.get_video("your-video-id")
|
|
173
|
+
|
|
174
|
+
video.index_spoken_words(force=True)
|
|
175
|
+
|
|
176
|
+
# Search for key moments
|
|
177
|
+
queries = ["introduction", "main demo", "Q&A"]
|
|
178
|
+
timeline = Timeline(conn)
|
|
179
|
+
timeline_offset = 0.0
|
|
180
|
+
|
|
181
|
+
for query in queries:
|
|
182
|
+
try:
|
|
183
|
+
results = video.search(query, search_type=SearchType.semantic)
|
|
184
|
+
shots = results.get_shots()
|
|
185
|
+
except InvalidRequestError as exc:
|
|
186
|
+
if "No results found" in str(exc):
|
|
187
|
+
shots = []
|
|
188
|
+
else:
|
|
189
|
+
raise
|
|
190
|
+
|
|
191
|
+
if not shots:
|
|
192
|
+
continue
|
|
193
|
+
|
|
194
|
+
# Add the section label where this batch starts in the compiled timeline
|
|
195
|
+
timeline.add_overlay(timeline_offset, TextAsset(
|
|
196
|
+
text=query.title(),
|
|
197
|
+
duration=2,
|
|
198
|
+
style=TextStyle(fontsize=36, fontcolor="white", boxcolor="#222222"),
|
|
199
|
+
))
|
|
200
|
+
|
|
201
|
+
for shot in shots:
|
|
202
|
+
timeline.add_inline(
|
|
203
|
+
VideoAsset(asset_id=shot.video_id, start=shot.start, end=shot.end)
|
|
204
|
+
)
|
|
205
|
+
timeline_offset += shot.end - shot.start
|
|
206
|
+
|
|
207
|
+
stream_url = timeline.generate_stream()
|
|
208
|
+
print(f"Dynamic compilation: {stream_url}")
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
### Multi-Video Stream
|
|
212
|
+
|
|
213
|
+
Combine clips from different videos into a single stream:
|
|
214
|
+
|
|
215
|
+
```python
|
|
216
|
+
import videodb
|
|
217
|
+
from videodb.timeline import Timeline
|
|
218
|
+
from videodb.asset import VideoAsset
|
|
219
|
+
|
|
220
|
+
conn = videodb.connect()
|
|
221
|
+
coll = conn.get_collection()
|
|
222
|
+
|
|
223
|
+
video_clips = [
|
|
224
|
+
{"id": "vid_001", "start": 0, "end": 15},
|
|
225
|
+
{"id": "vid_002", "start": 10, "end": 30},
|
|
226
|
+
{"id": "vid_003", "start": 5, "end": 25},
|
|
227
|
+
]
|
|
228
|
+
|
|
229
|
+
timeline = Timeline(conn)
|
|
230
|
+
for clip in video_clips:
|
|
231
|
+
timeline.add_inline(
|
|
232
|
+
VideoAsset(asset_id=clip["id"], start=clip["start"], end=clip["end"])
|
|
233
|
+
)
|
|
234
|
+
|
|
235
|
+
stream_url = timeline.generate_stream()
|
|
236
|
+
print(f"Multi-video stream: {stream_url}")
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
### Conditional Stream Assembly
|
|
240
|
+
|
|
241
|
+
Build a stream dynamically based on search availability:
|
|
242
|
+
|
|
243
|
+
```python
|
|
244
|
+
import videodb
|
|
245
|
+
from videodb import SearchType
|
|
246
|
+
from videodb.exceptions import InvalidRequestError
|
|
247
|
+
from videodb.timeline import Timeline
|
|
248
|
+
from videodb.asset import VideoAsset, TextAsset, TextStyle
|
|
249
|
+
|
|
250
|
+
conn = videodb.connect()
|
|
251
|
+
coll = conn.get_collection()
|
|
252
|
+
video = coll.get_video("your-video-id")
|
|
253
|
+
|
|
254
|
+
video.index_spoken_words(force=True)
|
|
255
|
+
|
|
256
|
+
timeline = Timeline(conn)
|
|
257
|
+
|
|
258
|
+
# Try to find specific content; fall back to full video
|
|
259
|
+
topics = ["opening remarks", "technical deep dive", "closing"]
|
|
260
|
+
|
|
261
|
+
found_any = False
|
|
262
|
+
timeline_offset = 0.0
|
|
263
|
+
for topic in topics:
|
|
264
|
+
try:
|
|
265
|
+
results = video.search(topic, search_type=SearchType.semantic)
|
|
266
|
+
shots = results.get_shots()
|
|
267
|
+
except InvalidRequestError as exc:
|
|
268
|
+
if "No results found" in str(exc):
|
|
269
|
+
shots = []
|
|
270
|
+
else:
|
|
271
|
+
raise
|
|
272
|
+
|
|
273
|
+
if shots:
|
|
274
|
+
found_any = True
|
|
275
|
+
timeline.add_overlay(timeline_offset, TextAsset(
|
|
276
|
+
text=topic.title(),
|
|
277
|
+
duration=2,
|
|
278
|
+
style=TextStyle(fontsize=32, fontcolor="white", boxcolor="#1a1a2e"),
|
|
279
|
+
))
|
|
280
|
+
for shot in shots:
|
|
281
|
+
timeline.add_inline(
|
|
282
|
+
VideoAsset(asset_id=shot.video_id, start=shot.start, end=shot.end)
|
|
283
|
+
)
|
|
284
|
+
timeline_offset += shot.end - shot.start
|
|
285
|
+
|
|
286
|
+
if found_any:
|
|
287
|
+
stream_url = timeline.generate_stream()
|
|
288
|
+
print(f"Curated stream: {stream_url}")
|
|
289
|
+
else:
|
|
290
|
+
# Fall back to full video stream
|
|
291
|
+
stream_url = video.generate_stream()
|
|
292
|
+
print(f"Full video stream: {stream_url}")
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
### Live Event Recap
|
|
296
|
+
|
|
297
|
+
Process an event recording into a streamable recap with multiple sections:
|
|
298
|
+
|
|
299
|
+
```python
|
|
300
|
+
import videodb
|
|
301
|
+
from videodb import SearchType
|
|
302
|
+
from videodb.exceptions import InvalidRequestError
|
|
303
|
+
from videodb.timeline import Timeline
|
|
304
|
+
from videodb.asset import VideoAsset, AudioAsset, ImageAsset, TextAsset, TextStyle
|
|
305
|
+
|
|
306
|
+
conn = videodb.connect()
|
|
307
|
+
coll = conn.get_collection()
|
|
308
|
+
|
|
309
|
+
# Upload event recording
|
|
310
|
+
event = coll.upload(url="https://example.com/event-recording.mp4")
|
|
311
|
+
event.index_spoken_words(force=True)
|
|
312
|
+
|
|
313
|
+
# Generate background music
|
|
314
|
+
music = coll.generate_music(
|
|
315
|
+
prompt="upbeat corporate background music",
|
|
316
|
+
duration=120,
|
|
317
|
+
)
|
|
318
|
+
|
|
319
|
+
# Generate title image
|
|
320
|
+
title_img = coll.generate_image(
|
|
321
|
+
prompt="modern event recap title card, dark background, professional",
|
|
322
|
+
aspect_ratio="16:9",
|
|
323
|
+
)
|
|
324
|
+
|
|
325
|
+
# Build the recap timeline
|
|
326
|
+
timeline = Timeline(conn)
|
|
327
|
+
timeline_offset = 0.0
|
|
328
|
+
|
|
329
|
+
# Main video segments from search
|
|
330
|
+
try:
|
|
331
|
+
keynote = event.search("keynote announcement", search_type=SearchType.semantic)
|
|
332
|
+
keynote_shots = keynote.get_shots()[:5]
|
|
333
|
+
except InvalidRequestError as exc:
|
|
334
|
+
if "No results found" in str(exc):
|
|
335
|
+
keynote_shots = []
|
|
336
|
+
else:
|
|
337
|
+
raise
|
|
338
|
+
if keynote_shots:
|
|
339
|
+
keynote_start = timeline_offset
|
|
340
|
+
for shot in keynote_shots:
|
|
341
|
+
timeline.add_inline(
|
|
342
|
+
VideoAsset(asset_id=shot.video_id, start=shot.start, end=shot.end)
|
|
343
|
+
)
|
|
344
|
+
timeline_offset += shot.end - shot.start
|
|
345
|
+
else:
|
|
346
|
+
keynote_start = None
|
|
347
|
+
|
|
348
|
+
try:
|
|
349
|
+
demo = event.search("product demo", search_type=SearchType.semantic)
|
|
350
|
+
demo_shots = demo.get_shots()[:5]
|
|
351
|
+
except InvalidRequestError as exc:
|
|
352
|
+
if "No results found" in str(exc):
|
|
353
|
+
demo_shots = []
|
|
354
|
+
else:
|
|
355
|
+
raise
|
|
356
|
+
if demo_shots:
|
|
357
|
+
demo_start = timeline_offset
|
|
358
|
+
for shot in demo_shots:
|
|
359
|
+
timeline.add_inline(
|
|
360
|
+
VideoAsset(asset_id=shot.video_id, start=shot.start, end=shot.end)
|
|
361
|
+
)
|
|
362
|
+
timeline_offset += shot.end - shot.start
|
|
363
|
+
else:
|
|
364
|
+
demo_start = None
|
|
365
|
+
|
|
366
|
+
# Overlay title card image
|
|
367
|
+
timeline.add_overlay(0, ImageAsset(
|
|
368
|
+
asset_id=title_img.id, width=100, height=100, x=80, y=20, duration=5
|
|
369
|
+
))
|
|
370
|
+
|
|
371
|
+
# Overlay section labels at the correct timeline offsets
|
|
372
|
+
if keynote_start is not None:
|
|
373
|
+
timeline.add_overlay(max(5, keynote_start), TextAsset(
|
|
374
|
+
text="Keynote Highlights",
|
|
375
|
+
duration=3,
|
|
376
|
+
style=TextStyle(fontsize=40, fontcolor="white", boxcolor="#0d1117"),
|
|
377
|
+
))
|
|
378
|
+
if demo_start is not None:
|
|
379
|
+
timeline.add_overlay(max(5, demo_start), TextAsset(
|
|
380
|
+
text="Demo Highlights",
|
|
381
|
+
duration=3,
|
|
382
|
+
style=TextStyle(fontsize=36, fontcolor="white", boxcolor="#0d1117"),
|
|
383
|
+
))
|
|
384
|
+
|
|
385
|
+
# Overlay background music
|
|
386
|
+
timeline.add_overlay(0, AudioAsset(
|
|
387
|
+
asset_id=music.id, fade_in_duration=3
|
|
388
|
+
))
|
|
389
|
+
|
|
390
|
+
# Stream the final recap
|
|
391
|
+
stream_url = timeline.generate_stream()
|
|
392
|
+
print(f"Event recap: {stream_url}")
|
|
393
|
+
```
|
|
394
|
+
|
|
395
|
+
---
|
|
396
|
+
|
|
397
|
+
## Tips
|
|
398
|
+
|
|
399
|
+
- **HLS compatibility**: Stream URLs return HLS manifests (`.m3u8`). They work in Safari natively, and in other browsers via hls.js or similar libraries.
|
|
400
|
+
- **On-demand compilation**: Streams are compiled server-side when requested. The first play may have a brief compilation delay; subsequent plays of the same composition are cached.
|
|
401
|
+
- **Caching**: Calling `video.generate_stream()` a second time without arguments returns the cached stream URL rather than recompiling.
|
|
402
|
+
- **Segment streams**: `video.generate_stream(timeline=[(start, end)])` is the fastest way to stream a specific clip without building a full `Timeline` object.
|
|
403
|
+
- **Inline vs overlay**: `add_inline()` only accepts `VideoAsset` and places assets sequentially on the main track. `add_overlay()` accepts `AudioAsset`, `ImageAsset`, and `TextAsset` and layers them on top at a given start time.
|
|
404
|
+
- **TextStyle defaults**: `TextStyle` defaults to `font='Sans'`, `fontcolor='black'`. Use `boxcolor` (not `bgcolor`) for background color on text.
|
|
405
|
+
- **Combine with generation**: Use `coll.generate_music(prompt, duration)` and `coll.generate_image(prompt, aspect_ratio)` to create assets for timeline compositions.
|
|
406
|
+
- **Playback**: `.play()` opens the stream URL in the default system browser. For programmatic use, work with the URL string directly.
|