Write talking-head scripts and produce Instagram reels and YouTube shorts
94
97%
Does it follow best practices?
Impact
85%
2.36xAverage score across 3 eval scenarios
Low
Low-risk findings worth noting
#!/usr/bin/env bash
#
# Fetch the raw wikitext of Wikipedia's "Signs of AI writing".
#
# The list is community-maintained and moves as LLM writing moves, so it is
# re-read rather than snapshotted. references/spoken-tells.md is self-contained
# and a failed fetch is not fatal — it is a freshness check on a local file,
# not a dependency of it.
#
# Wikipedia blocks default tool user agents, hence the explicit one and the
# action=raw endpoint.
#
# Technique from jbaruch/blog-writer's fetch-signs-of-ai-writing.sh (see
# CREDITS.md). Reimplemented rather than vendored — plugins are dependencies.
#
# Usage:
# fetch_ai_tells.sh [output-path]
#
# Output (stdout, on success):
# {"ok": true, "path": "<file>", "bytes": N}
#
# Exit codes:
# 0 fetched; the file at .path holds the raw wikitext
# 1 fetch failed (unreachable, HTTP error, or too small to be the article).
# Proceed with references/spoken-tells.md as-is.
# 2 tool or usage error (curl/jq missing, destination not writable)
readonly ARTICLE_URL="https://en.wikipedia.org/w/index.php?title=Wikipedia:Signs_of_AI_writing&action=raw"
readonly USER_AGENT="Mozilla/5.0 (compatible; yap-writer-skill/1.0)"
readonly MIN_BYTES=1000
main() {
set -euo pipefail
command -v curl >/dev/null || {
echo "error: curl not found on PATH — skip the freshness check and use references/spoken-tells.md as-is" >&2
exit 2
}
command -v jq >/dev/null || {
echo '{"ok": false, "reason": "jq not found on PATH"}' >&2
exit 2
}
[ "$#" -le 1 ] || {
echo "error: expected at most one argument (output path), got $#" >&2
exit 2
}
if [ "$#" -eq 1 ]; then
out_path=$1
out_dir=$(dirname "$out_path")
[ -d "$out_dir" ] || { echo "error: no such directory: ${out_dir}" >&2; exit 2; }
[ -w "$out_dir" ] || { echo "error: not writable: ${out_dir}" >&2; exit 2; }
else
out_dir=${TMPDIR:-/tmp}
out_path=""
fi
# Download into a staging file beside the destination, never onto it: curl
# truncates its --output target as soon as it starts writing, so aiming at the
# destination would destroy a good existing file before the checks have
# decided whether the new one is worth keeping. Same directory keeps the final
# move a rename rather than a copy that can half-finish.
staging=$(mktemp "${out_dir}/.ai-tells.XXXXXX") || {
echo "error: could not create a staging file under ${out_dir}" >&2
exit 2
}
staging_owned=1
discard() { [ "$staging_owned" -eq 1 ] && [ -e "$staging" ] && rm -f "$staging"; return 0; }
trap discard EXIT
trap 'exit 130' INT
trap 'exit 143' TERM
if ! http_status=$(curl --silent --location --show-error \
--user-agent "$USER_AGENT" --max-time 30 \
--write-out '%{http_code}' --output "$staging" "$ARTICLE_URL"); then
echo "error: could not reach Wikipedia — use references/spoken-tells.md as-is" >&2
exit 1
fi
[ "$http_status" = "200" ] || {
echo "error: Wikipedia returned HTTP ${http_status} — use references/spoken-tells.md as-is" >&2
exit 1
}
bytes=$(wc -c < "$staging" | tr -d ' ')
[ "$bytes" -ge "$MIN_BYTES" ] || {
echo "error: body is ${bytes} bytes, under the ${MIN_BYTES} floor — likely an error stub, not the article" >&2
exit 1
}
if [ -n "$out_path" ]; then
mv -f "$staging" "$out_path" || {
echo "error: could not move the article into place at ${out_path}" >&2
exit 2
}
else
out_path=$staging
fi
staging_owned=0
jq -n --arg path "$out_path" --argjson bytes "$bytes" \
'{ok: true, path: $path, bytes: $bytes}'
}
# Entry-point guard: runs when executed, stays sourceable for testing.
if [ "${BASH_SOURCE[0]}" = "${0}" ]; then
main "$@"
fi.tessl-plugin
evals
skills
reel-builder
assets
references
scripts
yap-writer