opencode-skills-collection 3.0.39 → 3.0.40
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/bundled-skills/.antigravity-install-manifest.json +6 -1
- package/bundled-skills/2slides-ppt-generator/SKILL.md +12 -2
- package/bundled-skills/2slides-ppt-generator/requirements.txt +1 -0
- package/bundled-skills/2slides-ppt-generator/scripts/create_pdf_slides.py +1 -1
- package/bundled-skills/accesslint-diff/SKILL.md +4 -1
- package/bundled-skills/article-illustrations/SKILL.md +159 -0
- package/bundled-skills/cv-generator/SKILL.md +874 -0
- package/bundled-skills/docs/integrations/jetski-cortex.md +3 -3
- package/bundled-skills/docs/integrations/jetski-gemini-loader/README.md +1 -1
- package/bundled-skills/docs/maintainers/repo-growth-seo.md +3 -3
- package/bundled-skills/docs/maintainers/skills-update-guide.md +1 -1
- package/bundled-skills/docs/sources/sources.md +1 -0
- package/bundled-skills/docs/users/bundles.md +1 -1
- package/bundled-skills/docs/users/claude-code-skills.md +1 -1
- package/bundled-skills/docs/users/gemini-cli-skills.md +1 -1
- package/bundled-skills/docs/users/getting-started.md +1 -1
- package/bundled-skills/docs/users/kiro-integration.md +1 -1
- package/bundled-skills/docs/users/usage.md +4 -4
- package/bundled-skills/docs/users/visual-guide.md +4 -4
- package/bundled-skills/examprep-ai/SKILL.md +8 -0
- package/bundled-skills/hugging-face-cli/SKILL.md +2 -2
- package/bundled-skills/open-dynamic-workflows/SKILL.md +101 -0
- package/bundled-skills/permission-manager/README.md +1 -1
- package/bundled-skills/permission-manager/SKILL.md +2 -1
- package/bundled-skills/polis-protocol/SKILL.md +13 -4
- package/bundled-skills/runapi-cli/SKILL.md +140 -0
- package/bundled-skills/schema-markup-generator/SKILL.md +2 -1
- package/bundled-skills/smart-git-automation/SKILL.md +4 -2
- package/bundled-skills/user-thoughts/scripts/common.py +93 -6
- package/bundled-skills/user-thoughts/scripts/ignore_ops.py +20 -20
- package/bundled-skills/user-thoughts/scripts/init.py +3 -1
- package/bundled-skills/user-thoughts/scripts/show_mdbase.py +5 -5
- package/bundled-skills/user-thoughts/scripts/show_raw.py +3 -3
- package/bundled-skills/user-thoughts/scripts/sortin.py +37 -26
- package/bundled-skills/user-thoughts/scripts/status.py +8 -8
- package/bundled-skills/user-thoughts/scripts/write_raw.py +20 -11
- package/bundled-skills/vercel-cli-with-tokens/SKILL.md +15 -12
- package/bundled-skills/video-content-extractor/SKILL.md +103 -0
- package/package.json +1 -1
- package/skills_index.json +119 -7
|
@@ -20,21 +20,22 @@ Before running any Vercel CLI commands, identify where the token is coming from.
|
|
|
20
20
|
### A) `VERCEL_TOKEN` is already set in the environment
|
|
21
21
|
|
|
22
22
|
```bash
|
|
23
|
-
|
|
23
|
+
[ -n "${VERCEL_TOKEN:-}" ] && printf 'VERCEL_TOKEN is set\n'
|
|
24
24
|
```
|
|
25
25
|
|
|
26
|
-
If this
|
|
26
|
+
If this reports a configured token, you're ready. Skip to Step 2.
|
|
27
27
|
|
|
28
28
|
### B) Token is in a `.env` file under `VERCEL_TOKEN`
|
|
29
29
|
|
|
30
30
|
```bash
|
|
31
|
-
grep '^VERCEL_TOKEN=' .env 2>/dev/null
|
|
31
|
+
grep -q '^VERCEL_TOKEN=' .env 2>/dev/null && printf 'VERCEL_TOKEN is present in .env\n'
|
|
32
32
|
```
|
|
33
33
|
|
|
34
34
|
If found, export it:
|
|
35
35
|
|
|
36
36
|
```bash
|
|
37
|
-
|
|
37
|
+
VERCEL_TOKEN="$(sed -n 's/^VERCEL_TOKEN=//p' .env | tail -n 1)"
|
|
38
|
+
export VERCEL_TOKEN
|
|
38
39
|
```
|
|
39
40
|
|
|
40
41
|
### C) Token is in a `.env` file under a different name
|
|
@@ -42,13 +43,15 @@ export VERCEL_TOKEN=$(grep '^VERCEL_TOKEN=' .env | cut -d= -f2-)
|
|
|
42
43
|
Look for any variable that looks like a Vercel token (Vercel tokens typically start with `vca_`):
|
|
43
44
|
|
|
44
45
|
```bash
|
|
45
|
-
grep -
|
|
46
|
+
grep -Eio '^[A-Z0-9_]*VERCEL[A-Z0-9_]*(?==)' .env 2>/dev/null
|
|
46
47
|
```
|
|
47
48
|
|
|
48
49
|
Inspect the output to identify which variable holds the token, then export it as `VERCEL_TOKEN`:
|
|
49
50
|
|
|
50
51
|
```bash
|
|
51
|
-
|
|
52
|
+
vercel_var="<VARIABLE_NAME>"
|
|
53
|
+
VERCEL_TOKEN="$(sed -n "s/^${vercel_var}=//p" .env | tail -n 1)"
|
|
54
|
+
export VERCEL_TOKEN
|
|
52
55
|
```
|
|
53
56
|
|
|
54
57
|
### D) No token found — ask the user
|
|
@@ -64,7 +67,7 @@ If none of the above yield a token, ask the user to provide one. They can create
|
|
|
64
67
|
vercel deploy --token "vca_abc123"
|
|
65
68
|
|
|
66
69
|
# Good — CLI reads VERCEL_TOKEN from the environment
|
|
67
|
-
|
|
70
|
+
[ -n "${VERCEL_TOKEN:-}" ] || { echo "Set VERCEL_TOKEN first" >&2; exit 1; }
|
|
68
71
|
vercel deploy
|
|
69
72
|
```
|
|
70
73
|
|
|
@@ -74,11 +77,11 @@ Similarly, check for the project ID and team scope. These let the CLI target the
|
|
|
74
77
|
|
|
75
78
|
```bash
|
|
76
79
|
# Check environment
|
|
77
|
-
|
|
78
|
-
|
|
80
|
+
[ -n "${VERCEL_PROJECT_ID:-}" ] && printf 'VERCEL_PROJECT_ID is set\n'
|
|
81
|
+
[ -n "${VERCEL_ORG_ID:-}" ] && printf 'VERCEL_ORG_ID is set\n'
|
|
79
82
|
|
|
80
83
|
# Or check .env
|
|
81
|
-
grep -
|
|
84
|
+
grep -Eio '^[A-Z0-9_]*VERCEL[A-Z0-9_]*(?==)' .env 2>/dev/null
|
|
82
85
|
```
|
|
83
86
|
|
|
84
87
|
**If you have a project URL** (e.g. `https://vercel.com/my-team/my-project`), extract the team slug:
|
|
@@ -317,8 +320,8 @@ Full details: https://vercel.com/docs/plans/pro-plan
|
|
|
317
320
|
Check the environment and any `.env` files present:
|
|
318
321
|
|
|
319
322
|
```bash
|
|
320
|
-
|
|
321
|
-
grep -
|
|
323
|
+
env | grep -Eio '^[A-Z0-9_]*VERCEL[A-Z0-9_]*(?==)'
|
|
324
|
+
grep -Eio '^[A-Z0-9_]*VERCEL[A-Z0-9_]*(?==)' .env 2>/dev/null
|
|
322
325
|
```
|
|
323
326
|
|
|
324
327
|
### Authentication error
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: video-content-extractor
|
|
3
|
+
description: "Extract key frames from MP4 videos at configurable intervals, run Tesseract OCR, and generate structured Markdown reports with video metadata and timestamped text transcripts."
|
|
4
|
+
category: media-processing
|
|
5
|
+
risk: safe
|
|
6
|
+
source: community
|
|
7
|
+
source_repo: 274326424/video-content-extractor
|
|
8
|
+
source_type: community
|
|
9
|
+
date_added: "2026-06-06"
|
|
10
|
+
author: 274326424
|
|
11
|
+
tags: [video, ocr, ffmpeg, tesseract, frame-extraction, media]
|
|
12
|
+
tools: [codex]
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# Video Content Extractor
|
|
16
|
+
|
|
17
|
+
## Overview
|
|
18
|
+
|
|
19
|
+
Automatically extracts key frames from MP4 video files at configurable time intervals, performs OCR text recognition on each frame, and generates a structured Markdown report. The report includes video metadata (duration, resolution, codecs) and frame-by-frame OCR transcripts with timestamp references.
|
|
20
|
+
|
|
21
|
+
This skill is designed for Codex CLI and requires FFmpeg and Tesseract OCR installed on the local machine.
|
|
22
|
+
|
|
23
|
+
## When to Use This Skill
|
|
24
|
+
|
|
25
|
+
- Use when you need to extract text content from video presentations, lectures, or screencasts.
|
|
26
|
+
- Use when you want to create searchable transcripts from video files without embedded subtitles.
|
|
27
|
+
- Use when you need to analyze video content programmatically and generate structured summaries.
|
|
28
|
+
- Use when the user asks to "read what is on screen" or "extract the content from this video."
|
|
29
|
+
|
|
30
|
+
## How It Works
|
|
31
|
+
|
|
32
|
+
### Step 1: Analyze Video Metadata
|
|
33
|
+
|
|
34
|
+
The skill uses ffprobe to extract video metadata: duration, resolution, frame rate, codec information, and file size.
|
|
35
|
+
|
|
36
|
+
### Step 2: Extract Key Frames
|
|
37
|
+
|
|
38
|
+
Using FFmpeg, the skill captures frames at the configured interval (default: every 30 seconds). Each frame is saved as a timestamped JPEG image.
|
|
39
|
+
|
|
40
|
+
### Step 3: OCR Text Recognition
|
|
41
|
+
|
|
42
|
+
Each extracted frame is processed by Tesseract OCR. If the default PSM mode returns no meaningful text, it falls back to fully automatic page segmentation.
|
|
43
|
+
|
|
44
|
+
### Step 4: Generate Markdown Report
|
|
45
|
+
|
|
46
|
+
All extracted data is assembled into a structured Markdown document.
|
|
47
|
+
|
|
48
|
+
## Examples
|
|
49
|
+
|
|
50
|
+
### Example 1: Basic Extraction
|
|
51
|
+
|
|
52
|
+
Agent prompt:
|
|
53
|
+
Use the video-content-extractor skill to extract content from lecture.mp4
|
|
54
|
+
|
|
55
|
+
Output generates lecture.md and lecture_frames/ directory.
|
|
56
|
+
|
|
57
|
+
### Example 2: Custom Interval
|
|
58
|
+
|
|
59
|
+
Parameters: video_path, output_dir, interval(seconds), lang
|
|
60
|
+
Extract every 60 seconds with English-only OCR:
|
|
61
|
+
python scripts/extract_video.py recording.mp4 ./output 60 eng
|
|
62
|
+
|
|
63
|
+
### Example 3: Bilingual Content
|
|
64
|
+
|
|
65
|
+
Extract with default Chinese + English OCR:
|
|
66
|
+
python scripts/extract_video.py lecture.mp4 . 15 chi_sim+eng
|
|
67
|
+
|
|
68
|
+
## Best Practices
|
|
69
|
+
|
|
70
|
+
- Use shorter intervals (10-15s) for fast-paced content with frequent text changes.
|
|
71
|
+
- Use longer intervals (30-60s) for presentation slides or slow lectures to reduce duplicate frames.
|
|
72
|
+
- For Chinese content, ensure Tesseract Chinese language pack is installed (chi_sim).
|
|
73
|
+
|
|
74
|
+
## Limitations
|
|
75
|
+
|
|
76
|
+
- Requires FFmpeg and Tesseract OCR to be installed and accessible via PATH.
|
|
77
|
+
- Tesseract OCR accuracy depends on video quality, text size, and font clarity.
|
|
78
|
+
- Does not extract audio or perform speech-to-text transcription.
|
|
79
|
+
- Frame extraction is time-based (not scene-change-based), which may produce near-duplicate frames.
|
|
80
|
+
- Large videos with short intervals can generate many frames - ensure sufficient disk space.
|
|
81
|
+
|
|
82
|
+
## Security and Safety Notes
|
|
83
|
+
|
|
84
|
+
- This skill only reads video files and writes extracted frames and Markdown reports.
|
|
85
|
+
- It does NOT send any data over the network - all processing is local.
|
|
86
|
+
- FFmpeg and Tesseract are invoked with fixed, pre-vetted arguments.
|
|
87
|
+
- The skill does not modify or delete the original video file.
|
|
88
|
+
|
|
89
|
+
## Common Pitfalls
|
|
90
|
+
|
|
91
|
+
- Problem: Tesseract returns garbled text
|
|
92
|
+
Solution: Ensure the correct language pack is installed. Run tesseract --list-langs to verify.
|
|
93
|
+
|
|
94
|
+
- Problem: FFmpeg fails with "not found"
|
|
95
|
+
Solution: Make sure FFmpeg is on PATH. Run ffmpeg -version to verify.
|
|
96
|
+
|
|
97
|
+
- Problem: OCR is slow on large videos
|
|
98
|
+
Solution: Increase the interval parameter to reduce frames processed.
|
|
99
|
+
|
|
100
|
+
## Related Skills
|
|
101
|
+
|
|
102
|
+
- @media-summarizer - For summarizing video content using visual and audio cues.
|
|
103
|
+
- @document-ocr - For OCR on static images or scanned documents without video processing.
|
package/package.json
CHANGED
package/skills_index.json
CHANGED
|
@@ -124,9 +124,9 @@
|
|
|
124
124
|
"claude": "supported"
|
|
125
125
|
},
|
|
126
126
|
"setup": {
|
|
127
|
-
"type": "
|
|
128
|
-
"summary": "",
|
|
129
|
-
"docs":
|
|
127
|
+
"type": "manual",
|
|
128
|
+
"summary": "Install Python requirements and configure a 2slides API key before running generation scripts.",
|
|
129
|
+
"docs": "SKILL.md"
|
|
130
130
|
},
|
|
131
131
|
"reasons": []
|
|
132
132
|
}
|
|
@@ -2477,6 +2477,28 @@
|
|
|
2477
2477
|
"reasons": []
|
|
2478
2478
|
}
|
|
2479
2479
|
},
|
|
2480
|
+
{
|
|
2481
|
+
"id": "article-illustrations",
|
|
2482
|
+
"path": "skills/article-illustrations",
|
|
2483
|
+
"category": "creative",
|
|
2484
|
+
"name": "article-illustrations",
|
|
2485
|
+
"description": "Generate hand-drawn 16:9 article illustrations with the Grav character IP, sparse annotations, and absurd but clear visual metaphors.",
|
|
2486
|
+
"risk": "safe",
|
|
2487
|
+
"source": "community",
|
|
2488
|
+
"date_added": "2026-06-06",
|
|
2489
|
+
"plugin": {
|
|
2490
|
+
"targets": {
|
|
2491
|
+
"codex": "supported",
|
|
2492
|
+
"claude": "supported"
|
|
2493
|
+
},
|
|
2494
|
+
"setup": {
|
|
2495
|
+
"type": "none",
|
|
2496
|
+
"summary": "",
|
|
2497
|
+
"docs": null
|
|
2498
|
+
},
|
|
2499
|
+
"reasons": []
|
|
2500
|
+
}
|
|
2501
|
+
},
|
|
2480
2502
|
{
|
|
2481
2503
|
"id": "asana-automation",
|
|
2482
2504
|
"path": "skills/asana-automation",
|
|
@@ -9711,6 +9733,28 @@
|
|
|
9711
9733
|
"reasons": []
|
|
9712
9734
|
}
|
|
9713
9735
|
},
|
|
9736
|
+
{
|
|
9737
|
+
"id": "cv-generator",
|
|
9738
|
+
"path": "skills/cv-generator",
|
|
9739
|
+
"category": "content",
|
|
9740
|
+
"name": "cv-generator",
|
|
9741
|
+
"description": "Generate professional, ATS-optimized CVs for FlowCV, Canva, Google Docs, or Word. Handles multi-source merging, JD targeting, seniority adaptation, and humanized rewriting. Outputs paste-ready text with an ATS flaw report and improvement suggestions.",
|
|
9742
|
+
"risk": "safe",
|
|
9743
|
+
"source": "community",
|
|
9744
|
+
"date_added": "2026-06-06",
|
|
9745
|
+
"plugin": {
|
|
9746
|
+
"targets": {
|
|
9747
|
+
"codex": "supported",
|
|
9748
|
+
"claude": "supported"
|
|
9749
|
+
},
|
|
9750
|
+
"setup": {
|
|
9751
|
+
"type": "none",
|
|
9752
|
+
"summary": "",
|
|
9753
|
+
"docs": null
|
|
9754
|
+
},
|
|
9755
|
+
"reasons": []
|
|
9756
|
+
}
|
|
9757
|
+
},
|
|
9714
9758
|
{
|
|
9715
9759
|
"id": "daily",
|
|
9716
9760
|
"path": "skills/daily",
|
|
@@ -21998,6 +22042,28 @@
|
|
|
21998
22042
|
"reasons": []
|
|
21999
22043
|
}
|
|
22000
22044
|
},
|
|
22045
|
+
{
|
|
22046
|
+
"id": "open-dynamic-workflows",
|
|
22047
|
+
"path": "skills/open-dynamic-workflows",
|
|
22048
|
+
"category": "ai-agents",
|
|
22049
|
+
"name": "open-dynamic-workflows",
|
|
22050
|
+
"description": "Plan, orchestrate, and adversarially verify parallel AI coding agents with a dynamic multi-agent workflow engine.",
|
|
22051
|
+
"risk": "critical",
|
|
22052
|
+
"source": "community",
|
|
22053
|
+
"date_added": "2026-06-06",
|
|
22054
|
+
"plugin": {
|
|
22055
|
+
"targets": {
|
|
22056
|
+
"codex": "supported",
|
|
22057
|
+
"claude": "supported"
|
|
22058
|
+
},
|
|
22059
|
+
"setup": {
|
|
22060
|
+
"type": "none",
|
|
22061
|
+
"summary": "",
|
|
22062
|
+
"docs": null
|
|
22063
|
+
},
|
|
22064
|
+
"reasons": []
|
|
22065
|
+
}
|
|
22066
|
+
},
|
|
22001
22067
|
{
|
|
22002
22068
|
"id": "openapi-spec-generation",
|
|
22003
22069
|
"path": "skills/openapi-spec-generation",
|
|
@@ -22994,20 +23060,22 @@
|
|
|
22994
23060
|
"category": "orchestration",
|
|
22995
23061
|
"name": "polis-protocol",
|
|
22996
23062
|
"description": "Coordinate multi-vendor AI agents as a self-improving team \u2014 a learning router assigns work by track record and citizens can amend the protocol's own rules.",
|
|
22997
|
-
"risk": "
|
|
23063
|
+
"risk": "critical",
|
|
22998
23064
|
"source": "community",
|
|
22999
23065
|
"date_added": "2026-06-02",
|
|
23000
23066
|
"plugin": {
|
|
23001
23067
|
"targets": {
|
|
23002
|
-
"codex": "
|
|
23003
|
-
"claude": "
|
|
23068
|
+
"codex": "blocked",
|
|
23069
|
+
"claude": "blocked"
|
|
23004
23070
|
},
|
|
23005
23071
|
"setup": {
|
|
23006
23072
|
"type": "none",
|
|
23007
23073
|
"summary": "",
|
|
23008
23074
|
"docs": null
|
|
23009
23075
|
},
|
|
23010
|
-
"reasons": [
|
|
23076
|
+
"reasons": [
|
|
23077
|
+
"explicit_target_restriction"
|
|
23078
|
+
]
|
|
23011
23079
|
}
|
|
23012
23080
|
},
|
|
23013
23081
|
{
|
|
@@ -25212,6 +25280,28 @@
|
|
|
25212
25280
|
"reasons": []
|
|
25213
25281
|
}
|
|
25214
25282
|
},
|
|
25283
|
+
{
|
|
25284
|
+
"id": "runapi-cli",
|
|
25285
|
+
"path": "skills/runapi-cli",
|
|
25286
|
+
"category": "development",
|
|
25287
|
+
"name": "runapi-cli",
|
|
25288
|
+
"description": "Generate AI images, videos, and music/audio from agents using the RunAPI CLI.",
|
|
25289
|
+
"risk": "critical",
|
|
25290
|
+
"source": "official",
|
|
25291
|
+
"date_added": "2026-06-07",
|
|
25292
|
+
"plugin": {
|
|
25293
|
+
"targets": {
|
|
25294
|
+
"codex": "supported",
|
|
25295
|
+
"claude": "supported"
|
|
25296
|
+
},
|
|
25297
|
+
"setup": {
|
|
25298
|
+
"type": "none",
|
|
25299
|
+
"summary": "",
|
|
25300
|
+
"docs": null
|
|
25301
|
+
},
|
|
25302
|
+
"reasons": []
|
|
25303
|
+
}
|
|
25304
|
+
},
|
|
25215
25305
|
{
|
|
25216
25306
|
"id": "runaway-guard",
|
|
25217
25307
|
"path": "skills/runaway-guard",
|
|
@@ -31910,6 +32000,28 @@
|
|
|
31910
32000
|
"reasons": []
|
|
31911
32001
|
}
|
|
31912
32002
|
},
|
|
32003
|
+
{
|
|
32004
|
+
"id": "video-content-extractor",
|
|
32005
|
+
"path": "skills/video-content-extractor",
|
|
32006
|
+
"category": "media-processing",
|
|
32007
|
+
"name": "video-content-extractor",
|
|
32008
|
+
"description": "Extract key frames from MP4 videos at configurable intervals, run Tesseract OCR, and generate structured Markdown reports with video metadata and timestamped text transcripts.",
|
|
32009
|
+
"risk": "safe",
|
|
32010
|
+
"source": "community",
|
|
32011
|
+
"date_added": "2026-06-06",
|
|
32012
|
+
"plugin": {
|
|
32013
|
+
"targets": {
|
|
32014
|
+
"codex": "supported",
|
|
32015
|
+
"claude": "supported"
|
|
32016
|
+
},
|
|
32017
|
+
"setup": {
|
|
32018
|
+
"type": "none",
|
|
32019
|
+
"summary": "",
|
|
32020
|
+
"docs": null
|
|
32021
|
+
},
|
|
32022
|
+
"reasons": []
|
|
32023
|
+
}
|
|
32024
|
+
},
|
|
31913
32025
|
{
|
|
31914
32026
|
"id": "videodb",
|
|
31915
32027
|
"path": "skills/videodb",
|