CtrlK
BlogDocsLog inGet started
Tessl Logo

gamussa/reels-producer-skill

Write talking-head scripts and produce Instagram reels and YouTube shorts

94

2.36x
Quality

97%

Does it follow best practices?

Impact

85%

2.36x

Average score across 3 eval scenarios

SecuritybySnyk

Low

Low-risk findings worth noting

Overview
Quality
Evals
Security
Files

fetch_ai_tells.shskills/yap-writer/scripts/

#!/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

.mcp.json

tile.json