本文へ移動
cccskills
無料GitHub で公開

shoot-outing-review-card

当使用者说"做一张这次外拍的回顾卡"、"把这次扫街做成回顾卡"、"看看我这次拍摄的参数习惯"时使用。

Turn one photography outing into a shareable review card with a cover image, EXIF habit summaries, and a capture timeline. Use when the user wants to review a shoot, visualize focal-length/aperture/shutter habits, or make an outing recap from a folder of photos.

インストール方法を見る

含まれるファイル(3)

  • SKILL.md8.1 KB
  • scripts/image_io.py32.9 KB
  • scripts/make_review_card.py32.4 KB

SKILL.md(原文)

インストールする前に、エージェントに与えられる指示の中身を確認できます。

Shoot Outing Review Card

Create an evidence-based visual recap of one photography outing. The card helps a photographer notice capture habits; it does not judge whether those habits are good or infer artistic intent.

Inputs

Ask for only what is missing:

  • image files from one outing (JPEG or TIFF; PNG and WebP also work; RAW files need JPEG previews; HEIC/HEIF needs the pillow-heif package or a JPEG copy first: sips -s format jpeg IMG.HEIC --out IMG.jpg, which keeps the EXIF on macOS),
  • output path,
  • optional title, subtitle (Chinese is fine), cover image, accent color, and font file.

If the files may be shared outside the user's device, confirm whether filenames or dates are sensitive. Never display GPS coordinates, camera serial numbers, owner names, or free-text EXIF comments.

Workflow

  1. Confirm the set. Treat the supplied files as one outing unless the capture times span more than 24 hours. If they do, report the span and ask whether to split it; do not silently combine separate outings.
  2. Read facts. Run scripts/make_review_card.py to read capture time, focal length, 35 mm equivalent focal length when present, f-number, exposure time, ISO, and camera model. The capture time is DateTimeOriginal only: a file that carries only IFD0 DateTime (an edit or export time) counts as missing a capture time, stays off the timeline, and is named in a warning.
  3. Audit coverage. Report how many files were readable and the coverage of each EXIF field. A statistic based on fewer than 3 observations or less than 30% coverage is labelled insufficient data, not interpreted.
  4. Choose the cover. Prefer the user-selected file. Otherwise the script deterministically chooses the earliest landscape-oriented image (EXIF orientation applied, so a phone portrait stored sideways counts as portrait), falling back to the earliest readable image. Do not claim that the automatic choice is the “best” photo.
  5. Summarize habits. Describe only visible distributions, for example “18–35 mm accounts for 62% of images.” Do not turn correlation into a story about intention or skill.
  6. Render and inspect. Generate the PNG, then check that the title, sample counts, missing-data notes, labels, and timeline are legible. Preserve the JSON sidecar as the auditable source for every number shown.

Deterministic tool

Requires Python 3.9+ and Pillow; fontTools is optional and lets the script check that a font has every glyph. scripts/image_io.py is a shared copy of the photo skills' image module; identical copies live in photo-caption-writer, photo-exif-frame, photo-series-layout, and photo-spread-composer, and scripts/validate.sh requires them to stay byte-identical, so never edit one copy alone. python3 scripts/make_review_card.py --selftest runs the regression checks.

python3 scripts/make_review_card.py \
  IMG_001.jpg IMG_002.jpg IMG_003.jpg \
  --output outing-review.png \
  --title "Sunday walk" \
  --subtitle "Riverside · 7 September 2026" \
  --accent "#E98A4B"

Useful options:

--cover PATH          select the cover explicitly
--width PX            output width (default 1600; minimum 900)
--json PATH           JSON sidecar path (default: output name + .json)
--font PATH           font file for all text (default: an installed font that has
                      every glyph, e.g. Hiragino Sans GB or STHeiti for a Chinese title)
--no-camera-model     omit camera model from the card

The script exits 2 and writes nothing when no readable image is supplied, the selected cover is not among the readable inputs, the color is invalid, --output or --json is one of the input photos, --output does not end in .png, .jpg, .tif, or .webp, the title needs glyphs that no available font has (Chinese with no Chinese font installed, or a --font without them), the title or subtitle is too long to fit the card even at the smallest size, or the output cannot be written. It warns on stderr—but still produces a card—when EXIF is sparse, when a file has only an export time, or when files are skipped. A skipped file (HEIC/HEIF without pillow-heif, or a file Pillow cannot read) is printed with the reason, and for HEIC with the sips command; convert the HEIC files and re-run before delivering unless the user accepts a card without them, and report the skipped files either way.

Output contract

Return:

  1. the PNG review card (the format follows the --output extension; JPEG is written at quality 95). The card embeds the cover's RGB ICC profile, so a Display P3 cover keeps its colours;
  2. a UTF-8 JSON sidecar containing input counts, time span, EXIF coverage, histogram bins/counts, cover-selection method, the cover and output colour profiles (color), the fonts used, and warnings;
  3. a short factual note containing:
    • files included / files skipped,
    • capture-time span,
    • strongest distribution only when its field passes the coverage threshold,
    • any sparse or absent fields.

Do not fabricate missing EXIF. Use unknown, omit the affected chart, or label it insufficient data.

Interpretation rules

  • Use 35 mm-equivalent focal length when available for all included observations; otherwise use actual focal length and label it clearly. Do not mix the two scales in one histogram.
  • Aperture buckets are based on recorded f-numbers, not inferred depth of field.
  • Shutter buckets describe exposure duration, not subject motion.
  • A timeline shows capture density, not importance or effort.
  • Duplicate timestamps remain separate captures; this is a habit card, not a unique-scene count.
  • Edited exports can carry rewritten or stripped metadata. State this limitation whenever coverage is incomplete.

Boundaries

  • This skill summarizes an outing. For framing one photo with its EXIF, use photo-exif-frame; for arranging several selected works, use photo-series-layout.
  • It does not rank photographs, identify the photographer's style, diagnose technique, or infer emotion.
  • It does not upload files or query external services.
  • It does not alter source images; an --output or --json path that is one of the input photos is refused.

Minimum verification

Before delivery, verify:

  • output PNG opens and has the requested dimensions;
  • the output path is none of the input photos, and every input photo is unchanged;
  • JSON parses and its included + skipped equals the input count; skipped files are reported with their reason;
  • every chart states both n and coverage;
  • the title and subtitle show real characters, not boxes (a Chinese title needs a font with Chinese glyphs; the script picks one or stops);
  • no private EXIF fields appear;
  • an EXIF-free image produces a card with explicit missing-data labels rather than invented values.

Cases: tests/cases/shoot-outing-review-card.md (fixtures in tests/fixtures/shoot-outing-review-card/).

变更记录 / Changelog

版本日期变更类型
0.2.02026-09-26新增 --font,默认按文字挑有字形的已装字体,中文标题不再是方块;--output/--json 指向输入照片时拒绝,不再把原 JPEG 覆盖成 PNG;自动封面按 EXIF 转正后的尺寸挑横图;拍摄时间只取 DateTimeOriginal,只有导出时间的图不进时间线;机身名不再重复厂商;HEIC 跳过时在 stderr 给出 sips 命令;封面 ICC 原样嵌入(P3 不再发灰);加 --selftest;删掉与库级 UNLICENSED 矛盾的 license 行;description 前加中文触发语;示例命令改用 python3minor
0.1.02026-09-09初始版本minor

レビュー

まだレビューはありません。使ってみた感想をお寄せください。

同じリポジトリのスキル

概要と使いどころ

当学生说"Common App 活动栏写不下"、"这段活动描述超字数了"、"帮我把这几条压到限制内"时使用。先按官方申请表核对当季字符限额,再逐条检查;一次把所有条目量完并直接给出压缩版,只在需要砍掉实质内容时才用选择题问该保哪部分。每改一版都用工具重新数一遍字符,绝不凭感觉说"这样应该够了"。只压缩,不代写空白。

日本語の概要は準備中です。原文の説明を表示しています。

ChromiteCr/Skills42026年10月16日 更新

当学生说"我参加过一些活动但没整理过"、"帮我把经历录进去"、"我的活动档案是空的"时使用。让学生一口气把记得的活动说出来,直接把这段话拆成结构化的长期事项(角色、组织、起止时间、做了什么、结果、级别),说不清的字段留空标"待补"而不是编,再用一张选择题卡把级别判定与是否重复这类关键项一次问完,然后提案入库。只记录学生真正说出口的内容,级别按事实判定,绝不往高了写。

日本語の概要は準備中です。原文の説明を表示しています。

ChromiteCr/Skills42026年10月16日 更新

当学生问"招生官会怎么看我的档案"、"我的背景还差什么"、"帮我评估一下现在的申请竞争力"时使用。以顶尖大学招生官的视角通读学生的档案、长期活动与已写下的反思,不问任何前置问题直接产出一份指名道姓的坦诚点评:这份材料的亮点、招生官真实的解读方式、明显的短板与空白、以及接下来最值得做的一到两件事。只读不写,不修改学生的任何数据,也不代写任何申请材料。

日本語の概要は準備中です。原文の説明を表示しています。

ChromiteCr/Skills42026年10月16日 更新

当使用者说"帮我填词"、"按这个字数模板写歌词"、"用多Agent对抗式写词"、"这首副歌帮我想几句"时使用,前提是字数骨架和这首歌写什么都已经有了;只有主题、还没定写什么时先用 lyric-concept-builder。拿一份字数骨架和意象系统,派三个 sonnet 子代理按不同路子并行独立起草(场景派 / 口语派 / 意象派),再派一个红队子代理逐句挑毛病,主 Agent 按句裁决拼稿,最后统一辙口与意象。收敛判据卡死:字数用 lyric-doctor 的脚本对模板数、每段同辙、hook 不含陈词、主歌二对主歌一有推进。不抄现有歌词,不替使用者决定这首歌要说什么。

日本語の概要は準備中です。原文の説明を表示しています。

ChromiteCr/Skills42026年10月16日 更新

当想知道一段 AI 回答"哪些能直接用、哪些必须先验证、哪些只能当建议"时使用。按声明类型分四级——低风险草稿材料、观点与策略建议、可查证的事实声明、会改变状态的可执行指令——每级配一句默认处置动作;再按影响半径排序,给出最小的下一步检查。可执行类一律标"不能直接执行;先做代码审阅/沙箱测试/回滚准备",其中破坏性或提权的命令排在最前。教的是一套可复用的复查习惯,不是替使用者把所有内容都核实一遍:本 skill 只分级、排序、定处置,要逐条核实走 ai-output-fact-checker,整段代码要做入库体检走 ai-code-onboarding-checklist。

日本語の概要は準備中です。原文の説明を表示しています。

ChromiteCr/Skills42026年10月16日 更新

当拿到一段 AI 生成的代码,还没决定要不要信、要不要跑、要不要往上继续加东西时使用。先做一遍客观体检:行数与嵌套深度、有没有测试、有没有硬编码密钥或遗留 TODO、依赖是不是真实存在、有没有危险调用(eval/exec、shell=True、递归删除、反序列化、提权、外发网络,按正文给的 grep 模式逐类查);再给风险评级和下一步动作。老实写明它查不了算法正确性——体检通过不等于代码是对的。回答里文字、事实和代码混在一起时先用 ai-answer-triage 分级;只审相对已有代码的一份改动用 ai-diff-review-protocol。

日本語の概要は準備中です。原文の説明を表示しています。

ChromiteCr/Skills42026年10月16日 更新

ChromiteCr のスキルをすべて見る

このスキルの問題を報告する