opencode-skills-collection 4.0.72 → 4.0.74
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 +9 -1
- package/bundled-skills/agent-memory-discipline/SKILL.md +204 -0
- package/bundled-skills/agent-memory-discipline/references/entry-format.md +37 -0
- package/bundled-skills/antigravity-maintainer-batch-release/SKILL.md +2 -2
- package/bundled-skills/film-crew/SKILL.md +129 -0
- package/bundled-skills/film-crew/references/model-prompting.md +89 -0
- package/bundled-skills/film-crew/references/reroll-review.md +46 -0
- package/bundled-skills/film-crew/references/roles/director.md +38 -0
- package/bundled-skills/film-crew/references/roles/dp.md +28 -0
- package/bundled-skills/film-crew/references/roles/editor.md +34 -0
- package/bundled-skills/film-crew/references/roles/gaffer.md +30 -0
- package/bundled-skills/film-crew/references/roles/production-designer.md +43 -0
- package/bundled-skills/film-crew/references/roles/script-supervisor.md +35 -0
- package/bundled-skills/film-crew/references/roles/sound.md +23 -0
- package/bundled-skills/film-crew/references/templates/shot-list.md +38 -0
- package/bundled-skills/film-crew/references/unslop.md +29 -0
- package/bundled-skills/jev-social/SKILL.md +5 -5
- package/bundled-skills/noaa-radar-satellite-fetching/SKILL.md +253 -0
- package/bundled-skills/testdriver-e2e-testing/SKILL.md +121 -0
- package/bundled-skills/weather-data-lifecycle-management/SKILL.md +159 -0
- package/bundled-skills/weather-data-reproducibility/SKILL.md +292 -0
- package/bundled-skills/weather-model-run-discovery/SKILL.md +241 -0
- package/bundled-skills/weather-pipeline-performance-diagnosis/SKILL.md +184 -0
- package/package.json +1 -1
- package/skills_index.json +452 -1
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# Editor
|
|
2
|
+
|
|
3
|
+
**Job:** make the shots add up to a video: durations, order, cuts, pacing. You think about
|
|
4
|
+
the timeline, not the frame.
|
|
5
|
+
|
|
6
|
+
## Output
|
|
7
|
+
|
|
8
|
+
```
|
|
9
|
+
TOTAL: 15.0 s (sum of shots, trimmed)
|
|
10
|
+
S1 2.5 s → hard cut
|
|
11
|
+
S2 4.0 s → match cut on motion
|
|
12
|
+
S3 3.0 s → smash cut
|
|
13
|
+
…
|
|
14
|
+
GENERATE: each shot +1 s handles (so S2 is generated at 5 s, used at 4 s)
|
|
15
|
+
HOOK CHECK: frame 1 is S1 ECU, motion starts at 0.2 s ✅
|
|
16
|
+
LOOP: last frame of S5 matches S1 composition ✅/❌
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Rules
|
|
20
|
+
|
|
21
|
+
- **Fit the model.** Every shot must be ≤ the model's max clip length (see
|
|
22
|
+
`references/model-prompting.md`). If a beat needs longer, split it into two shots with a
|
|
23
|
+
change of angle.
|
|
24
|
+
- **Generate long, use short.** Plan 0.5–1 s of handles at each end. The first and last
|
|
25
|
+
frames of AI clips are often the weakest.
|
|
26
|
+
- **Fixed-length models** (only preset lengths such as 5 s / 10 s): generate at the
|
|
27
|
+
shortest preset and pick the strongest section. A 2.5 s shot uses the best 2.5 s of a
|
|
28
|
+
5 s clip; note which section in the timeline.
|
|
29
|
+
- **Short-form pacing:** 1.5–3 s per shot is normal; a 6 s static shot kills retention
|
|
30
|
+
unless something is happening in it.
|
|
31
|
+
- **Cut on action.** If S1 ends with a hand moving right, S2 should start with motion
|
|
32
|
+
continuing right.
|
|
33
|
+
- **Text goes in the edit,** not the prompt. Note captions/supers here with timings.
|
|
34
|
+
- Call out any shot that exists only for coverage. Coverage costs generations.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Gaffer
|
|
2
|
+
|
|
3
|
+
**Job:** light the scene so it looks intentional and stays consistent between shots.
|
|
4
|
+
|
|
5
|
+
## Output
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
TIME / SOURCE: late afternoon sun through west window (motivated)
|
|
9
|
+
KEY: camera-left, 45°, soft
|
|
10
|
+
FILL: low, bounce from white tabletop
|
|
11
|
+
RIM / BACK: warm sun edge on hair
|
|
12
|
+
COLOR TEMP: warm key ~3200K vs cool ambient ~5600K
|
|
13
|
+
CONTRAST: medium-high, deep shadows
|
|
14
|
+
PRACTICALS: pendant bulbs visible in background, slightly blown
|
|
15
|
+
LOOK: 35mm film, fine grain, mild halation
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Rules
|
|
19
|
+
|
|
20
|
+
- **Motivate the light.** Say where it comes from (window, neon sign, streetlight,
|
|
21
|
+
monitor glow). Unmotivated "dramatic lighting" gives you random results.
|
|
22
|
+
- **Same key direction in every shot of a scene,** or the cut breaks continuity.
|
|
23
|
+
- **Contrast beats brightness.** Flat, evenly lit prompts are what make AI video look
|
|
24
|
+
like AI video. Ask for shadows.
|
|
25
|
+
- Color: pick one warm/cool contrast and hold it. Write it in plain words plus a
|
|
26
|
+
temperature if useful.
|
|
27
|
+
- Night scenes: name the sources (sodium streetlight, phone screen, neon). "Dark" alone
|
|
28
|
+
gets you murk.
|
|
29
|
+
- Products: soft key, clean rim to separate from background, a highlight that shows the
|
|
30
|
+
material (gloss, brushed metal, glass).
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Production designer
|
|
2
|
+
|
|
3
|
+
**Job:** make the world consistent. You write the **continuity bible**: the exact words
|
|
4
|
+
every other role must paste, verbatim, whenever a character, prop or location appears.
|
|
5
|
+
|
|
6
|
+
Video models have no memory between clips. The *only* continuity you get is identical
|
|
7
|
+
wording. Paraphrasing a character ("a woman in a red coat" → "the lady in crimson")
|
|
8
|
+
gives you a different person.
|
|
9
|
+
|
|
10
|
+
## Output
|
|
11
|
+
|
|
12
|
+
```
|
|
13
|
+
CHARACTERS
|
|
14
|
+
C1 <age range> <build> <hair: length, color, style> <skin tone> <face detail>,
|
|
15
|
+
wearing <top, color, material> and <bottom>, <one distinctive accessory>
|
|
16
|
+
LOCATIONS
|
|
17
|
+
L1 <place type>, <era/style>, <3 concrete set details>, <floor/wall materials>
|
|
18
|
+
PROPS
|
|
19
|
+
P1 <object>, <material>, <color>, <size cue>, <state: new/used/half-full…>
|
|
20
|
+
PALETTE
|
|
21
|
+
3–5 colors, named plainly ("mustard yellow, teal, off-white")
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Every entry gets two versions:
|
|
25
|
+
- **FULL** — the whole description, for shots where the whole subject is in frame.
|
|
26
|
+
- **TIGHT** — only what a close-up can see (e.g. `C1-TIGHT: weathered hands, short
|
|
27
|
+
clean nails, a thin silver ring, sleeves of a faded olive sweatshirt pushed up`).
|
|
28
|
+
|
|
29
|
+
Close-ups use TIGHT verbatim; wider shots use FULL verbatim. Pasting a whole-person
|
|
30
|
+
description into an ECU of hands drags the rest of the person (and the set) into frame.
|
|
31
|
+
|
|
32
|
+
## Rules
|
|
33
|
+
|
|
34
|
+
- 20–35 words per character. Concrete nouns and colors, no adjectives like "beautiful".
|
|
35
|
+
- One **distinctive anchor** per character (a yellow beanie, a scar, round glasses).
|
|
36
|
+
Anchors survive model drift better than faces do.
|
|
37
|
+
- Avoid real people, brands and logos. Describe the *type* ("a white leather low-top
|
|
38
|
+
sneaker") not the brand.
|
|
39
|
+
- Props that matter to the story get a state ("a paper cup, lid off, full to the brim
|
|
40
|
+
with black coffee"). State is what makes the action physically possible.
|
|
41
|
+
- Keep locations simple enough to re-generate: 3 set details, not 12.
|
|
42
|
+
- If the user supplies a reference image, write the bible *from the image* so the text
|
|
43
|
+
and the image agree.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Script supervisor
|
|
2
|
+
|
|
3
|
+
**Job:** protect continuity and catch the shots that will fail *before* anyone spends a
|
|
4
|
+
generation on them. You have veto power: any shot you flag gets rewritten.
|
|
5
|
+
|
|
6
|
+
## Checklist (run on every shot)
|
|
7
|
+
|
|
8
|
+
**Continuity**
|
|
9
|
+
- [ ] Every recurring character/prop/location is pasted verbatim from the continuity bible.
|
|
10
|
+
- [ ] Key light direction and color temperature match the rest of the scene.
|
|
11
|
+
- [ ] Screen direction is consistent (subject moving left→right keeps moving left→right).
|
|
12
|
+
- [ ] Props are in the right state (the cup that spilled in S2 isn't full in S3).
|
|
13
|
+
|
|
14
|
+
**Feasibility**
|
|
15
|
+
- [ ] One subject action, one camera move.
|
|
16
|
+
- [ ] Duration ≤ model max, with handles.
|
|
17
|
+
- [ ] No readable text, logos, UI or signage in frame (unless the model handles text).
|
|
18
|
+
- [ ] Hard physics (liquids, cloth, hands with small objects, multiple people touching) is
|
|
19
|
+
framed tight, isolated, and given a simple background.
|
|
20
|
+
- [ ] Nothing depends on a specific real person's likeness or a trademark.
|
|
21
|
+
- [ ] Counts are small: "two dogs" works better than "five dogs".
|
|
22
|
+
|
|
23
|
+
**Unslop** (see `references/unslop.md`)
|
|
24
|
+
- [ ] No empty quality words ("stunning, 8k, masterpiece, hyper-realistic, cinematic").
|
|
25
|
+
- [ ] No mood-only instructions; every feeling is translated into something visible.
|
|
26
|
+
- [ ] Skin, materials and motion have texture and imperfection specified where it matters.
|
|
27
|
+
|
|
28
|
+
## Output
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
S2 ⚠️ two actions (pours AND turns to customer) → split into S2a / S2b
|
|
32
|
+
S4 ⚠️ sign text "OPEN" in frame → remove, add in edit
|
|
33
|
+
S3 ✅
|
|
34
|
+
HIGHEST RISK: S2a (liquid physics). Reroll plan: tighten to ECU, lock camera.
|
|
35
|
+
```
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Sound
|
|
2
|
+
|
|
3
|
+
**Job:** plan what the audience hears. Run this role only if the target model generates
|
|
4
|
+
audio, or the user will add music/SFX in the edit.
|
|
5
|
+
|
|
6
|
+
## Output
|
|
7
|
+
|
|
8
|
+
```
|
|
9
|
+
MUSIC: <genre, tempo in BPM, energy curve> (added in edit)
|
|
10
|
+
S1 SFX: ceramic clink, café murmur (low)
|
|
11
|
+
S2 DIALOGUE: C1: "Not again." (quiet, deadpan)
|
|
12
|
+
S3 SFX: liquid splash, sneaker squeak
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Rules
|
|
16
|
+
|
|
17
|
+
- **Audio-capable models:** put spoken lines in double quotes with the speaker named, keep
|
|
18
|
+
lines under ~8 words per shot, and name 1–2 SFX plus ambience. Too many sound cues
|
|
19
|
+
produce mush.
|
|
20
|
+
- **Silent models:** don't write sound into the prompt at all. It wastes tokens and can
|
|
21
|
+
drift the visuals. Put sound in the edit notes.
|
|
22
|
+
- Cut points should land on beats of the music (tell the editor the BPM).
|
|
23
|
+
- Short-form: design for sound-off first. If a line is essential, it also goes in a caption.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# SHOT LIST — <title>
|
|
2
|
+
|
|
3
|
+
**Format:** <aspect> · <total length> · target model: <model>
|
|
4
|
+
**Mode:** text-to-video | image-to-video (reference: <file/description>)
|
|
5
|
+
**Brand / product:** <name, or "none given — generic">
|
|
6
|
+
**Logline:** <one sentence>
|
|
7
|
+
|
|
8
|
+
## Crew notes
|
|
9
|
+
**Director** — intent, hook, beats
|
|
10
|
+
**Production designer** — continuity bible (C1…, L1…, P1…)
|
|
11
|
+
**DP / Gaffer** — look summary in two lines
|
|
12
|
+
**Editor** — timeline summary
|
|
13
|
+
**Sound** — (if applicable)
|
|
14
|
+
**Script supervisor** — flags resolved
|
|
15
|
+
|
|
16
|
+
## Shots
|
|
17
|
+
| # | Time | Size · Lens · Move | Action (one) | Gen length | Risk |
|
|
18
|
+
|---|---|---|---|---|---|
|
|
19
|
+
| S1 | 0.0–2.5 | ECU · 100mm · locked | … | 4 s | low |
|
|
20
|
+
|
|
21
|
+
## Prompts
|
|
22
|
+
|
|
23
|
+
### S1
|
|
24
|
+
```
|
|
25
|
+
<prompt>
|
|
26
|
+
```
|
|
27
|
+
Negative (if supported): `<negative prompt>`
|
|
28
|
+
|
|
29
|
+
## Edit notes
|
|
30
|
+
- Captions / supers: <text> @ <time>
|
|
31
|
+
- Music / SFX: <cue> @ <time>
|
|
32
|
+
|
|
33
|
+
## Reroll plan
|
|
34
|
+
| Shot | Likely failure | Change before reroll |
|
|
35
|
+
|---|---|---|
|
|
36
|
+
| S1 | … | … |
|
|
37
|
+
|
|
38
|
+
**Highest-risk shot:** S? — <why>
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Unslop: why AI video looks like AI video, and what to write instead
|
|
2
|
+
|
|
3
|
+
| Slop signal | Usual cause in the prompt | Write instead |
|
|
4
|
+
|---|---|---|
|
|
5
|
+
| Plastic, poreless skin | "beautiful", "flawless", "perfect skin" | "visible pores, slight shine on the forehead, faint under-eye shadows" |
|
|
6
|
+
| Everything evenly lit | no light source named | a motivated key ("hard sun through blinds, camera-left") and deep shadows |
|
|
7
|
+
| Floaty slow-motion drift | no speed given, "cinematic" | real-time speed, or a stated speed ("normal speed", "2x slow motion") |
|
|
8
|
+
| Camera wandering aimlessly | no camera instruction | one named move, or "locked-off tripod shot" |
|
|
9
|
+
| Morphing hands / objects | complex hand action, wide framing | tight framing, simple grip, one object, slow action |
|
|
10
|
+
| Faces changing between shots | paraphrased character descriptions | verbatim continuity-bible descriptors, or image-to-video from one reference |
|
|
11
|
+
| Oversaturated, HDR-ish color | "vibrant", "8k", "ultra HD" | a film look ("Kodak Portra 400, soft contrast, fine grain") and a limited palette |
|
|
12
|
+
| Symmetrical stock-footage framing | no composition choice | a lens, an angle and an off-center subject ("subject in left third") |
|
|
13
|
+
| Gibberish text | signage, labels, UI in frame | no readable text in frame; add text in the edit |
|
|
14
|
+
| Nothing actually happens | a mood instead of an action | one visible, physical action with a start and an end |
|
|
15
|
+
|
|
16
|
+
## Words that add nothing
|
|
17
|
+
|
|
18
|
+
`stunning, masterpiece, best quality, 8k, 4k, ultra-detailed, hyper-realistic, award-winning, trending, epic, cinematic (alone), breathtaking`
|
|
19
|
+
|
|
20
|
+
Delete them. They don't hurt much on their own, but they push out words that would help.
|
|
21
|
+
|
|
22
|
+
## Words that tend to help
|
|
23
|
+
|
|
24
|
+
- A **lens** (24mm, 50mm, 85mm, macro)
|
|
25
|
+
- A **camera move** (slow push-in, locked-off, handheld)
|
|
26
|
+
- A **light source** (window light, sodium streetlight, overhead fluorescent)
|
|
27
|
+
- A **film stock or look** (35mm film grain, Super 8, VHS camcorder, iPhone front camera)
|
|
28
|
+
- **Imperfection** (scuffed, fingerprints, wrinkled, condensation, frayed)
|
|
29
|
+
- **Real-time physics cues** (splashes, drips, recoils, bounces)
|
|
@@ -11,7 +11,7 @@ author: socai-io
|
|
|
11
11
|
tags: [social-media, research, instagram, tiktok, linkedin, browser-automation, jev]
|
|
12
12
|
tools: [claude, codex]
|
|
13
13
|
license: "MIT"
|
|
14
|
-
license_source: "https://github.com/socai-io/jev-social/blob/
|
|
14
|
+
license_source: "https://github.com/socai-io/jev-social/blob/782d809c68e2015536359aa7dceede9a3cdbb7f1/LICENSE"
|
|
15
15
|
---
|
|
16
16
|
# Jev Social
|
|
17
17
|
|
|
@@ -19,7 +19,7 @@ license_source: "https://github.com/socai-io/jev-social/blob/05581cac6b8c21c85e5
|
|
|
19
19
|
|
|
20
20
|
Jev Social turns a natural-language social research goal into bounded Jev routing decisions, then delegates platform-read-only browser work to the local socai CLI. Use the captured posts, profiles, comments, videos, and opened details to produce a compact, source-linked report instead of exposing raw CLI output. "Read-only" means no social-account mutation; the CLI still writes private local run records and may download requested media.
|
|
21
21
|
|
|
22
|
-
The executable examples below are pinned to the tested runtime commit included in Jev Social `v0.1.
|
|
22
|
+
The executable examples below are pinned to the tested runtime commit included in Jev Social `v0.1.5`. A pin improves reproducibility but is not a trust guarantee; keep the package, browser data, and returned content inside the safety boundaries below.
|
|
23
23
|
|
|
24
24
|
## When to Use
|
|
25
25
|
- Use when a user requests evidence-backed research on Instagram, TikTok, or LinkedIn and wants real public posts or profiles rather than a general web summary.
|
|
@@ -45,7 +45,7 @@ If the exact pinned package is not already available locally, explain that the n
|
|
|
45
45
|
Run the status command before every research task:
|
|
46
46
|
|
|
47
47
|
```bash
|
|
48
|
-
npx github:socai-io/jev-social#
|
|
48
|
+
npx github:socai-io/jev-social#782d809c68e2015536359aa7dceede9a3cdbb7f1 status
|
|
49
49
|
```
|
|
50
50
|
|
|
51
51
|
Require all of the following before continuing:
|
|
@@ -68,7 +68,7 @@ Pass the goal as one argument with an argv-capable process runner; never constru
|
|
|
68
68
|
```text
|
|
69
69
|
program: npx
|
|
70
70
|
argv:
|
|
71
|
-
- github:socai-io/jev-social#
|
|
71
|
+
- github:socai-io/jev-social#782d809c68e2015536359aa7dceede9a3cdbb7f1
|
|
72
72
|
- search
|
|
73
73
|
- <exact research goal as one argument>
|
|
74
74
|
- --platform
|
|
@@ -126,7 +126,7 @@ Use only TikTok if its capability is reported as supported. Open details before
|
|
|
126
126
|
When the user explicitly asks for the local demo UI, start it on loopback only:
|
|
127
127
|
|
|
128
128
|
```bash
|
|
129
|
-
npx github:socai-io/jev-social#
|
|
129
|
+
npx github:socai-io/jev-social#782d809c68e2015536359aa7dceede9a3cdbb7f1 serve --port 8766
|
|
130
130
|
```
|
|
131
131
|
|
|
132
132
|
Report `http://127.0.0.1:8766`. Leave the process running only when the user asked for a local demo server, and do not expose it on a public interface.
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: noaa-radar-satellite-fetching
|
|
3
|
+
description: "Retrieve NOAA NEXRAD and GOES products from public cloud archives using verified site, product, channel, sector, and scan-time selection."
|
|
4
|
+
category: data
|
|
5
|
+
risk: safe
|
|
6
|
+
source: self
|
|
7
|
+
source_type: self
|
|
8
|
+
date_added: "2026-09-24"
|
|
9
|
+
author: ShianMike
|
|
10
|
+
tags: [weather, noaa, nexrad, goes, radar, satellite, aws-s3]
|
|
11
|
+
tools: [claude, cursor, gemini, codex]
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# NOAA Radar and Satellite Fetching
|
|
15
|
+
|
|
16
|
+
## Overview
|
|
17
|
+
|
|
18
|
+
Retrieve NOAA NEXRAD radar and GOES satellite objects from public cloud
|
|
19
|
+
archives while preserving the product, platform, spatial sector, and scan-time
|
|
20
|
+
identity. Discover through narrow prefixes, choose by observation time rather
|
|
21
|
+
than upload time, and validate the downloaded scientific file before use.
|
|
22
|
+
|
|
23
|
+
This skill covers raw or provider-produced radar and satellite products. It
|
|
24
|
+
does not retrieve numerical model output or ordinary station observations.
|
|
25
|
+
|
|
26
|
+
## When to Use This Skill
|
|
27
|
+
|
|
28
|
+
- A task needs NEXRAD Level II archive volumes or real-time chunks.
|
|
29
|
+
- A task needs selected NEXRAD Level III products.
|
|
30
|
+
- GOES ABI, GLM, or another GOES-R product is needed for a time and region.
|
|
31
|
+
- A download must select the nearest completed scan within a tolerance.
|
|
32
|
+
- A public S3 key, satellite assignment, radar site, channel, or sector is
|
|
33
|
+
uncertain or has changed.
|
|
34
|
+
|
|
35
|
+
Do not activate this skill merely to display a third-party map tile or to answer
|
|
36
|
+
a general weather question.
|
|
37
|
+
|
|
38
|
+
## Define the Product Contract
|
|
39
|
+
|
|
40
|
+
For NEXRAD, specify:
|
|
41
|
+
|
|
42
|
+
- Level II archive, Level II real-time chunks, or a named Level III product;
|
|
43
|
+
- four-character radar site, such as `KTLX`;
|
|
44
|
+
- desired scan time in UTC and nearest/previous/next selection policy;
|
|
45
|
+
- maximum time tolerance;
|
|
46
|
+
- full volume or exact product code;
|
|
47
|
+
- raw file retention and decoder.
|
|
48
|
+
|
|
49
|
+
For GOES, specify:
|
|
50
|
+
|
|
51
|
+
- physical satellite number or operational role, such as East or West;
|
|
52
|
+
- instrument and product level/short name;
|
|
53
|
+
- Full Disk, CONUS, Mesoscale 1, or Mesoscale 2 sector where applicable;
|
|
54
|
+
- ABI channel or derived product;
|
|
55
|
+
- desired scan time in UTC and tolerance;
|
|
56
|
+
- calibration form needed, such as radiance or brightness temperature.
|
|
57
|
+
|
|
58
|
+
Resolve an operational role to a physical satellite using current NOAA
|
|
59
|
+
documentation at request time. East and West assignments change over a
|
|
60
|
+
satellite program's lifetime.
|
|
61
|
+
|
|
62
|
+
## Current Public AWS Routes
|
|
63
|
+
|
|
64
|
+
Consult the AWS Registry of Open Data before hard-coding a bucket. As of this
|
|
65
|
+
skill's publication:
|
|
66
|
+
|
|
67
|
+
- NEXRAD Level II archive: `s3://unidata-nexrad-level2/`
|
|
68
|
+
- NEXRAD Level II real-time chunks: `s3://unidata-nexrad-level2-chunks/`
|
|
69
|
+
- selected NEXRAD Level III real-time data: `s3://unidata-nexrad-level3/`
|
|
70
|
+
- GOES imagery and metadata: satellite-specific buckets such as
|
|
71
|
+
`s3://noaa-goes18/` and `s3://noaa-goes19/`
|
|
72
|
+
|
|
73
|
+
The former `noaa-nexrad-level2` bucket was deprecated and scheduled to become
|
|
74
|
+
unavailable on September 1, 2025. Do not copy that retired route from old
|
|
75
|
+
tutorials.
|
|
76
|
+
|
|
77
|
+
## Discover with Narrow Prefixes
|
|
78
|
+
|
|
79
|
+
NEXRAD Level II archive objects are organized by UTC date and site. GOES
|
|
80
|
+
objects are organized by product, year, day of year, and hour. List only the
|
|
81
|
+
smallest prefix that can contain the requested scan.
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
aws s3 ls --no-sign-request \
|
|
85
|
+
s3://unidata-nexrad-level2/YYYY/MM/DD/KXXX/
|
|
86
|
+
|
|
87
|
+
aws s3 ls --no-sign-request \
|
|
88
|
+
s3://noaa-goes19/ABI-L2-CMIPC/YYYY/DDD/HH/
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Replace every placeholder with a validated value. Include the adjacent hour or
|
|
92
|
+
UTC day only when the time tolerance crosses that boundary. Paginate listings
|
|
93
|
+
and bound the total keys inspected.
|
|
94
|
+
|
|
95
|
+
Use real-time chunk buckets only when the consumer is designed to assemble and
|
|
96
|
+
validate chunks. Prefer completed archive volumes for ordinary historical or
|
|
97
|
+
post-event processing.
|
|
98
|
+
|
|
99
|
+
## Select by Scan Time
|
|
100
|
+
|
|
101
|
+
Object `Last-Modified` is publication metadata, not the measurement time.
|
|
102
|
+
|
|
103
|
+
- For NEXRAD, parse the site and scan timestamp from the documented object name,
|
|
104
|
+
then confirm time and site from the decoded volume header.
|
|
105
|
+
- For GOES-R, filenames encode platform plus scan start (`s`), end (`e`), and
|
|
106
|
+
creation (`c`) timestamps. Select by scan start or interval overlap, not file
|
|
107
|
+
creation time.
|
|
108
|
+
- Default to the closest scan at or before the requested instant for a
|
|
109
|
+
retrospective view. Allow a future scan only when the caller explicitly asks
|
|
110
|
+
for nearest-in-either-direction behavior.
|
|
111
|
+
- Reject every candidate outside the stated tolerance.
|
|
112
|
+
- When sectors overlap, require the requested sector instead of choosing solely
|
|
113
|
+
by time.
|
|
114
|
+
|
|
115
|
+
This standard-library helper extracts GOES-R scan timestamps without opening
|
|
116
|
+
the NetCDF payload:
|
|
117
|
+
|
|
118
|
+
```python
|
|
119
|
+
import re
|
|
120
|
+
from datetime import datetime, timezone
|
|
121
|
+
from pathlib import PurePosixPath
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
GOES_TIMES = re.compile(
|
|
125
|
+
r"_s(?P<start>\d{14})_e(?P<end>\d{14})_c(?P<created>\d{14})"
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
def parse_goes_times(object_key):
|
|
130
|
+
match = GOES_TIMES.search(PurePosixPath(object_key).name)
|
|
131
|
+
if not match:
|
|
132
|
+
raise ValueError(f"unrecognized GOES-R filename: {object_key}")
|
|
133
|
+
|
|
134
|
+
def parse(value):
|
|
135
|
+
return datetime.strptime(value, "%Y%j%H%M%S%f").replace(
|
|
136
|
+
tzinfo=timezone.utc
|
|
137
|
+
)
|
|
138
|
+
|
|
139
|
+
return {name: parse(value) for name, value in match.groupdict().items()}
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
Treat filename parsing as discovery. After download, verify the corresponding
|
|
143
|
+
time coverage and platform attributes inside the file.
|
|
144
|
+
|
|
145
|
+
## Download and Validate
|
|
146
|
+
|
|
147
|
+
1. Record bucket, exact key, size, ETag, and `Last-Modified` before transfer.
|
|
148
|
+
2. Download to a request-owned temporary path. For public buckets, use unsigned
|
|
149
|
+
S3 access rather than supplying credentials.
|
|
150
|
+
3. If the object might still be publishing, require stable metadata or pin a
|
|
151
|
+
conditional request to the observed object identity.
|
|
152
|
+
4. Verify the received byte count and a provider checksum when one is supplied.
|
|
153
|
+
Otherwise compute and record a local SHA-256 digest.
|
|
154
|
+
5. Open the object with an existing format-aware decoder.
|
|
155
|
+
6. Verify site/platform, product, scan interval, and expected dimensions or
|
|
156
|
+
radar sweeps before renaming it into the cache.
|
|
157
|
+
|
|
158
|
+
Reuse an installed NEXRAD or NetCDF reader. Do not build a binary radar or
|
|
159
|
+
satellite decoder merely to fetch a file.
|
|
160
|
+
|
|
161
|
+
## Radar-Specific Checks
|
|
162
|
+
|
|
163
|
+
- Confirm that the radar site is the requested site and was operational at the
|
|
164
|
+
scan time.
|
|
165
|
+
- Treat Level II volumes, real-time chunks, and Level III products as different
|
|
166
|
+
contracts; they are not interchangeable encodings.
|
|
167
|
+
- Verify volume start time, end time when available, sweep count, moments, and
|
|
168
|
+
elevation angles after decoding.
|
|
169
|
+
- Keep range folding, missing gates, quality masks, and velocity ambiguity
|
|
170
|
+
explicit.
|
|
171
|
+
- A radar's nominal coverage radius does not guarantee useful low-level data at
|
|
172
|
+
a location. Consider distance, beam height, terrain blockage, and outages.
|
|
173
|
+
|
|
174
|
+
## Satellite-Specific Checks
|
|
175
|
+
|
|
176
|
+
- Confirm the physical satellite, instrument, product short name, sector, scan
|
|
177
|
+
mode, channel, and time coverage from NetCDF attributes.
|
|
178
|
+
- Do not treat ABI fixed-grid `x` and `y` coordinates as latitude and longitude.
|
|
179
|
+
Use the file's geostationary projection metadata.
|
|
180
|
+
- Apply scale/offset, fill values, data-quality flags, and product-specific
|
|
181
|
+
calibration according to NOAA documentation.
|
|
182
|
+
- A Mesoscale file is not identified only by its small dimensions; distinguish
|
|
183
|
+
Mesoscale 1 and 2 explicitly.
|
|
184
|
+
- Do not blend files from different scan modes, sectors, satellites, or product
|
|
185
|
+
levels without recording the transformation.
|
|
186
|
+
|
|
187
|
+
## Reliability, Cache, and Cleanup
|
|
188
|
+
|
|
189
|
+
- Cache by bucket, key, and object identity, not a friendly timestamp alone.
|
|
190
|
+
- Retry timeouts, `408`, `429`, and transient `5xx` responses with bounded
|
|
191
|
+
backoff and jitter.
|
|
192
|
+
- Bound time tolerance, adjacent-hour listings, pagination, concurrency, and
|
|
193
|
+
disk usage.
|
|
194
|
+
- Keep partial downloads separate from valid cache entries.
|
|
195
|
+
- Use event notifications for continuous real-time ingestion when appropriate;
|
|
196
|
+
do not repeatedly scan broad prefixes.
|
|
197
|
+
- For a one-shot image or export, delete request-owned raw objects in `finally`
|
|
198
|
+
only after the final artifact and provenance manifest are durable.
|
|
199
|
+
- Never delete a shared user cache as request cleanup.
|
|
200
|
+
|
|
201
|
+
## Verification Checklist
|
|
202
|
+
|
|
203
|
+
- The source bucket is current and documented by NOAA or its data distributor.
|
|
204
|
+
- Radar site or physical satellite and operational role are explicit.
|
|
205
|
+
- Product level, code/short name, sector, channel, and scan mode match the
|
|
206
|
+
request.
|
|
207
|
+
- The selected scan satisfies the direction policy and maximum time tolerance.
|
|
208
|
+
- Object size and identity match the downloaded bytes.
|
|
209
|
+
- The format-aware decoder opens the file and confirms internal metadata.
|
|
210
|
+
- Geolocation uses the product's real coordinate reference system.
|
|
211
|
+
- Temporary data cleanup preserves the requested artifact and manifest.
|
|
212
|
+
|
|
213
|
+
## Security & Safety Notes
|
|
214
|
+
|
|
215
|
+
- Fetch only public data or resources the user is authorized to access.
|
|
216
|
+
- Never embed AWS credentials, signed URLs, private endpoints, or notification
|
|
217
|
+
subscription tokens in code or logs.
|
|
218
|
+
- Keep TLS verification enabled; `--no-sign-request` does not disable TLS.
|
|
219
|
+
- Validate site, product, channel, sector, and time inputs against allowlists
|
|
220
|
+
before constructing object prefixes or local paths.
|
|
221
|
+
- Bound response size and available disk space before downloading high-rate
|
|
222
|
+
radar or satellite streams.
|
|
223
|
+
- Preserve NOAA attribution and do not imply NOAA endorsement.
|
|
224
|
+
|
|
225
|
+
## Common Pitfalls
|
|
226
|
+
|
|
227
|
+
- **Old NEXRAD examples return no data:** They reference the retired Level II
|
|
228
|
+
bucket. Resolve the current bucket from the registry.
|
|
229
|
+
- **The right minute shows the wrong image:** Creation time was used instead of
|
|
230
|
+
scan start/end time.
|
|
231
|
+
- **GOES East points to the wrong bucket:** An operational role was hard-coded
|
|
232
|
+
to a satellite number. Resolve the assignment for the requested date.
|
|
233
|
+
- **The map is displaced:** Fixed-grid scan angles were treated as geographic
|
|
234
|
+
coordinates. Apply the geostationary projection.
|
|
235
|
+
- **A real-time radar volume will not decode:** Individual chunks were treated
|
|
236
|
+
as a completed archive volume. Assemble and validate them or use the archive.
|
|
237
|
+
|
|
238
|
+
## Limitations
|
|
239
|
+
|
|
240
|
+
- Buckets, satellite assignments, product availability, scan modes, and naming
|
|
241
|
+
conventions can change; verify current official documentation.
|
|
242
|
+
- This skill retrieves source products but does not guarantee meteorological
|
|
243
|
+
suitability, perform mosaicking, or implement scientific calibration.
|
|
244
|
+
- Historical gaps and instrument or site outages cannot be repaired by provider
|
|
245
|
+
fallback.
|
|
246
|
+
|
|
247
|
+
## Additional Resources
|
|
248
|
+
|
|
249
|
+
- [NEXRAD on the AWS Registry of Open Data](https://registry.opendata.aws/noaa-nexrad/)
|
|
250
|
+
- [NOAA GOES on the AWS Registry of Open Data](https://registry.opendata.aws/noaa-goes/)
|
|
251
|
+
- [NOAA GOES-R documents](https://www.ospo.noaa.gov/resources/documents/goes-r.html)
|
|
252
|
+
- [NOAA STAR guide to satellite filenames](https://www.star.nesdis.noaa.gov/atmospheric-composition-training/satellite_data_decoding_data_file_names.php)
|
|
253
|
+
- [NOAA Radar Operations Center interface documents](https://www.roc.noaa.gov/wsr88d/BuildInfo/Files.aspx)
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: testdriver-e2e-testing
|
|
3
|
+
description: "Build E2E tests with TestDriver.ai, the AI code reviewer that runs every pull request in a real desktop sandbox, finds bugs, and builds regression tests"
|
|
4
|
+
category: testing
|
|
5
|
+
risk: safe
|
|
6
|
+
source: community
|
|
7
|
+
source_repo: testdriverai/testdriverai
|
|
8
|
+
source_type: official
|
|
9
|
+
date_added: "2026-09-24"
|
|
10
|
+
author: testdriverai
|
|
11
|
+
tags: [testing, e2e, qa, automation, computer-use]
|
|
12
|
+
tools: [claude, cursor, gemini]
|
|
13
|
+
license: "Apache-2.0"
|
|
14
|
+
license_source: "https://github.com/testdriverai/testdriverai/blob/main/LICENSE"
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
# TestDriver End-to-End Testing
|
|
18
|
+
|
|
19
|
+
## Overview
|
|
20
|
+
|
|
21
|
+
[TestDriver](https://testdriver.ai) is an AI code reviewer that actually runs your app. It automatically runs every pull request in a real desktop sandbox, finds bugs, and builds regression tests. Tests control browsers and native applications using natural language element descriptions and AI vision, and run as Vitest suites. This skill teaches an agent how to author, run, and debug TestDriver tests.
|
|
22
|
+
|
|
23
|
+
## When to Use This Skill
|
|
24
|
+
|
|
25
|
+
- Use when you need to write an end-to-end test for a web or desktop application
|
|
26
|
+
- Use when automating a UI workflow that has no stable selectors (canvas, Electron, native apps)
|
|
27
|
+
- Use when the user asks to verify that a page or flow works ("check if the login page works")
|
|
28
|
+
- Use when debugging a failing TestDriver test
|
|
29
|
+
|
|
30
|
+
## How It Works
|
|
31
|
+
|
|
32
|
+
### Step 1: Set up the project
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
npx testdriverai init
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
This scaffolds `package.json`, example tests, `vitest.config.mjs`, and a GitHub Actions workflow. The user must set `TD_API_KEY` in `.env` (get a key at https://console.testdriver.ai/team).
|
|
39
|
+
|
|
40
|
+
### Step 2: Write a test
|
|
41
|
+
|
|
42
|
+
Tests are Vitest suites using the TestDriver hooks:
|
|
43
|
+
|
|
44
|
+
```javascript
|
|
45
|
+
import { describe, expect, it } from "vitest";
|
|
46
|
+
import { TestDriver } from "testdriverai/vitest/hooks";
|
|
47
|
+
|
|
48
|
+
describe("Login", () => {
|
|
49
|
+
it("signs in successfully", async (context) => {
|
|
50
|
+
const testdriver = TestDriver(context);
|
|
51
|
+
await testdriver.provision.chrome({ url: "https://example.com/login" });
|
|
52
|
+
|
|
53
|
+
const email = await testdriver.find("email input field");
|
|
54
|
+
await email.click();
|
|
55
|
+
await testdriver.type("user@example.com");
|
|
56
|
+
|
|
57
|
+
const submit = await testdriver.find("Sign In button");
|
|
58
|
+
await submit.click();
|
|
59
|
+
|
|
60
|
+
const result = await testdriver.assert("the dashboard is visible");
|
|
61
|
+
expect(result).toBeTruthy();
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### Step 3: Run and iterate
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
vitest run tests/login.test.mjs
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Screenshots are captured automatically before and after every command and saved to `.testdriver/screenshots/`, named with the source line number for easy debugging.
|
|
73
|
+
|
|
74
|
+
## Examples
|
|
75
|
+
|
|
76
|
+
### Example 1: Testing a desktop (Electron) app
|
|
77
|
+
|
|
78
|
+
```javascript
|
|
79
|
+
await testdriver.provision.electron({ appPath: "./dist/my-app" });
|
|
80
|
+
const menu = await testdriver.find("File menu in the menu bar");
|
|
81
|
+
await menu.click();
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### Example 2: Waiting for slow elements
|
|
85
|
+
|
|
86
|
+
```javascript
|
|
87
|
+
const done = await testdriver.find("Loading complete indicator", { timeout: 30000 });
|
|
88
|
+
await done.click();
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## Best Practices
|
|
92
|
+
|
|
93
|
+
- ✅ Use specific element descriptions ("blue Sign In button in the header", not "button")
|
|
94
|
+
- ✅ Set both `testTimeout` and `hookTimeout` to 900000 in `vitest.config.mjs`
|
|
95
|
+
- ✅ Add `assert()` calls for verifiable pass/fail conditions
|
|
96
|
+
- ✅ Always `await` every TestDriver call
|
|
97
|
+
- ❌ Do not use `npx vitest`; run `vitest run` directly
|
|
98
|
+
- ❌ Do not rely on CSS selectors; TestDriver locates elements visually
|
|
99
|
+
|
|
100
|
+
## Limitations
|
|
101
|
+
|
|
102
|
+
- Requires a TestDriver API key (`TD_API_KEY`) and network access to provision sandboxes.
|
|
103
|
+
- Only works with Vitest as the test runner.
|
|
104
|
+
- This skill does not replace environment-specific validation, testing, or expert review.
|
|
105
|
+
|
|
106
|
+
## Security & Safety Notes
|
|
107
|
+
|
|
108
|
+
- `npx testdriverai init` writes project files to the current directory; run it only in a project you intend to modify.
|
|
109
|
+
- The `TD_API_KEY` credential belongs in `.env` (gitignored by the scaffold). Never commit it.
|
|
110
|
+
- Tests execute inside an isolated remote sandbox, not on the local machine.
|
|
111
|
+
|
|
112
|
+
## Common Pitfalls
|
|
113
|
+
|
|
114
|
+
- **Problem:** Cleanup hooks fail with a 10s timeout.
|
|
115
|
+
**Solution:** Set `hookTimeout: 900000` in `vitest.config.mjs`; sandbox teardown and recording uploads take longer than Vitest's default.
|
|
116
|
+
- **Problem:** Scrolling does nothing.
|
|
117
|
+
**Solution:** An input field has focus. Press Escape or click the page background first, then scroll.
|
|
118
|
+
|
|
119
|
+
## Related Skills
|
|
120
|
+
|
|
121
|
+
- `@webapp-testing` - Playwright-based alternative for local web apps with stable DOM selectors
|