Compare commits

...

13 Commits

Author SHA1 Message Date
mohitagw15856 616811e0e8 release: v20.2.0 — community PRs, new skill & catalog reconciliation (#58)
- Bump to 20.2.0 (20.1.0 is already published; these merged after it).
- Split changelog: 20.1.0 keeps its as-released scope (star nudges + eval
  hardening); new 20.2.0 covers the community PRs (#47/#48/#50), the new
  YouTube skill, and the check hardening.
- Reconcile the README to the true 174-skill count everywhere (title, badge,
  TOC, intro, 'All Skills' header, sponsor line) — was a stale 167.
- Add catalog entries for the 3 skills that were missing from the table:
  Skill Security Auditor (#168), Launch Readiness (#169), YouTube Script Writer (#170).
- package.json description 167 -> 174.


Claude-Session: https://claude.ai/code/session_016JWn5jRD5tcEFKrubjQ6Px

Co-authored-by: Claude <noreply@anthropic.com>
2026-06-18 21:04:02 +01:00
mohitagw15856 337314b4e7 release: finalize v20.1.0 (community PRs + new skill) and harden check (#57)
- Roll the merged community PRs (#47 install safety, #48 prioritisation
  helper, #50 YouTube skill) and the now-174 skill count into the v20.1.0
  changelog and README 'What's New' / latest-release line.
- Harden 'npm run check' to rebuild web/skills.json and fail on drift, so a
  stale playground index can't pass locally and break CI (root cause of the
  check-generated failure after #48).


Claude-Session: https://claude.ai/code/session_016JWn5jRD5tcEFKrubjQ6Px

Co-authored-by: Claude <noreply@anthropic.com>
2026-06-18 20:55:01 +01:00
mohitagw15856 fc58eb7c67 feat: add YouTube Script Writer skill (experimental) (#50) (#56)
Reapplies @prajwal-28's PR #50 onto current main WITHOUT the LF->CRLF
line-ending conversion the original PR introduced across skill-tiers.json
and the export indexes:
- adds skills/youtube-script-writer/SKILL.md (retention-optimized video scripts)
- registers it in the experimental tier
- regenerates the 5 platform exports with LF endings (no whole-file churn)



Claude-Session: https://claude.ai/code/session_016JWn5jRD5tcEFKrubjQ6Px

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: prajwal-28 <prajwal-28@users.noreply.github.com>
2026-06-18 20:50:50 +01:00
mohitagw15856 077215381d feat: add stdlib feature-prioritisation helper script (#48, closes #39) (#55)
Reapplies @zeotrix's PR #48 onto current main:
- adds a dependency-free Python script computing RICE/ICE rankings so
  scoring is consistent across sessions (skills/ + plugins/ copies, kept identical)
- documents it in a 'Programmatic Helper' section in both SKILL.md files
- regenerates the platform exports so the check-generated CI stays green



Claude-Session: https://claude.ai/code/session_016JWn5jRD5tcEFKrubjQ6Px

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: zeotrix <zeotrix@users.noreply.github.com>
2026-06-18 20:47:38 +01:00
mohitagw15856 66249df30b fix: guard install path + robust frontmatter parsing (#47) (#54)
Reapplies @MatrixNeoKozak's PR #47 onto current main (resolves the
bin/cli.mjs conflict with the star-nudge changes):
- resolve() the install target and refuse system-critical dirs
  (/, /usr, /etc, /root, ...) so a typo'd --target can't clobber the system
- skillcheck frontmatter parser tolerates leading whitespace and CRLF/LF



Claude-Session: https://claude.ai/code/session_016JWn5jRD5tcEFKrubjQ6Px

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: MatrixNeoKozak <MatrixNeoKozak@users.noreply.github.com>
2026-06-18 20:43:45 +01:00
mohitagw15856 83bfff4f2f docs: surface v20.1.0 in README changelog and latest-release line (#53)
The structured CHANGELOG.md already had 20.1.0; this updates the README's
embedded 'What's New' changelog and the top 'Latest release' line to match.


Claude-Session: https://claude.ai/code/session_016JWn5jRD5tcEFKrubjQ6Px

Co-authored-by: Claude <noreply@anthropic.com>
2026-06-18 20:35:03 +01:00
mohitagw15856 0c33330211 release: v20.1.0 — star nudges & eval hardening (#52)
Bump to 20.1.0. Folds the prior Unreleased items (CI leaderboard, PR-based
results flow, faster/hang-proof evals) plus the new star CTAs into a
[20.1.0] changelog section. Updates the README version badge.


Claude-Session: https://claude.ai/code/session_016JWn5jRD5tcEFKrubjQ6Px

Co-authored-by: Claude <noreply@anthropic.com>
2026-06-18 20:29:01 +01:00
mohitagw15856 82beaed5c6 feat: add star CTA to CLI list output and MCP server banner (#51)
More touchpoints to convert users into stargazers: the `list` command
footer and the MCP server's stderr startup banner (stderr is safe — it
never corrupts the JSON-RPC stream on stdout).


Claude-Session: https://claude.ai/code/session_016JWn5jRD5tcEFKrubjQ6Px

Co-authored-by: Claude <noreply@anthropic.com>
2026-06-18 20:25:13 +01:00
mohitagw15856 511bad19b0 feat: nudge npm users to star the repo (CLI + README + funding) (#49)
- CLI prints a star CTA after a successful install and in --help
- README adds a prominent star line below the badges (npm renders this)
- package.json gains a funding field so npm shows a Fund/Star link


Claude-Session: https://claude.ai/code/session_016JWn5jRD5tcEFKrubjQ6Px

Co-authored-by: Claude <noreply@anthropic.com>
2026-06-18 19:03:41 +01:00
mohitagw15856 63cef03324 Merge pull request #46 from mohitagw15856/eval-results
chore(evals): refresh leaderboard results
2026-06-18 13:41:58 +01:00
mohitagw15856 c28825dd38 chore(evals): refresh leaderboard results 2026-06-18 12:40:15 +00:00
mohitagw15856 4209963cff Leaderboard workflow: open a PR instead of pushing to protected main (#45)
The eval run worked (12 scored runs) but the final step failed: it pushed
evals/results.json directly to main, which the branch ruleset blocks
("Changes must be made through a pull request").

- eval-leaderboard.yml: replace the direct commit/push with
  peter-evans/create-pull-request@v7 (branch eval-results), add
  pull-requests: write. Merging that PR triggers the Pages deploy (which
  watches evals/results.json) to publish real numbers.
- evals/README documents the PR flow + the required "Allow GitHub Actions to
  create and approve pull requests" setting.


Claude-Session: https://claude.ai/code/session_016JWn5jRD5tcEFKrubjQ6Px

Co-authored-by: Claude <noreply@anthropic.com>
2026-06-18 13:33:15 +01:00
mohitagw15856 827d7f62ec Make evals fast and hang-proof (timeout, retry, concurrency) (#44)
The "Run evals" step ran 24 API calls sequentially with no request timeout, so
it was slow and could stall indefinitely if one call hung.

- bin/lib/anthropic.mjs: per-request timeout (120s) via AbortController + retry
  (2x, backoff) on 429/5xx/timeout. Fails fast on 4xx (bad key/model).
- evals/run-evals.mjs: run (case × model) tasks through a concurrency pool
  (default 4, --concurrency to tune); preserves result order.
- eval-leaderboard.yml: job timeout-minutes: 20 as a safety net.

Applies to the next run. The hardening also benefits the Action runner and
`generate`, which share the client.


Claude-Session: https://claude.ai/code/session_016JWn5jRD5tcEFKrubjQ6Px

Co-authored-by: Claude <noreply@anthropic.com>
2026-06-18 13:30:06 +01:00
34 changed files with 1591 additions and 74 deletions
+15 -12
View File
@@ -21,6 +21,7 @@ on:
permissions:
contents: write
pull-requests: write
concurrency:
group: eval-leaderboard
@@ -29,6 +30,7 @@ concurrency:
jobs:
evaluate:
runs-on: ubuntu-latest
timeout-minutes: 20
steps:
- name: Checkout
uses: actions/checkout@v4
@@ -53,15 +55,16 @@ jobs:
- name: Build the leaderboard page (sanity check)
run: node scripts/build-leaderboard.mjs
- name: Commit results
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git add evals/results.json
if git diff --cached --quiet; then
echo "No change in results."
else
git commit -m "chore(evals): refresh leaderboard results"
git push
echo "Committed evals/results.json — the Pages deploy will render real numbers."
fi
- name: Open a PR with the refreshed results
uses: peter-evans/create-pull-request@v7
with:
add-paths: evals/results.json
branch: eval-results
delete-branch: true
commit-message: "chore(evals): refresh leaderboard results"
title: "chore(evals): refresh leaderboard results"
body: |
Auto-generated by the **Update Skill Leaderboard** workflow.
Merging this publishes the **real** numbers on the live leaderboard — the
Pages deploy is triggered by changes to `evals/results.json`.
+39
View File
@@ -9,13 +9,52 @@ each new wave of skills bumps the **major** version, extensions and fixes bump
## [Unreleased]
## [20.2.0] — Community PRs & New Skill — 2026-06-18
### Added
- **New skill: YouTube Script Writer** (experimental) — retention-optimized video scripts with
3 title/thumbnail concepts, 3 hook variations, a video/audio cue script table, and SEO
metadata. Thanks @prajwal-28 (#50). Library is now **174 skills**.
- **Feature-prioritisation helper script** — a dependency-free (stdlib-only) Python helper that
computes RICE/ICE rankings from JSON/CSV/stdin, so scoring is consistent across sessions.
Thanks @zeotrix (#48, closes #39).
### Changed
- **Safer installs** — the CLI now resolves the install target and refuses system-critical
directories (`/`, `/usr`, `/etc`, `/root`, …) so a mistyped `--target` can't clobber the
system. Thanks @MatrixNeoKozak (#47).
- **README catalog reconciled to the real count** — the headline, badge, table of contents, and
"All Skills" catalog now say **174** (was a stale 167); added catalog entries for Skill
Security Auditor (#168), Launch Readiness (#169), and YouTube Script Writer (#170).
### Fixed
- **`skillcheck` frontmatter parser** tolerates leading whitespace and CRLF/LF line endings, so
skills authored on Windows no longer produce false negatives. Thanks @MatrixNeoKozak (#47).
- **`npm run check` now guards `web/skills.json`** — it rebuilds the file and fails on any drift,
so a stale playground index can't pass locally and then break CI.
## [20.1.0] — Star Nudges & Eval Hardening — 2026-06-18
### Added
- **Star the repo, from anywhere you use it.** Tasteful, non-spammy calls-to-action that turn
npm/CLI users into stargazers — no `postinstall` hook: a prompt after a successful
`npx pm-claude-skills add`, in `--help`, in `list`, in the MCP server's startup banner, a
CTA below the README badges (npm renders it on the package page), and a `funding` field in
`package.json` so npm shows a Fund/Sponsor link.
- **One-click leaderboard updates in CI** — `.github/workflows/eval-leaderboard.yml`
("Update Skill Leaderboard") runs the evals with the `ANTHROPIC_API_KEY` secret, commits
`evals/results.json`, and the Pages deploy re-renders the public leaderboard with real
numbers — no local key needed. The deploy workflow now also triggers on
`evals/results.json`.
### Changed
- **Leaderboard workflow opens a PR** instead of pushing to `main` (which the branch
ruleset blocks). After it runs, merge the auto-created results PR to publish real numbers.
- **Faster, hang-proof evals.** The Anthropic client now has a per-request timeout (120s)
and limited retries (429/5xx/timeout); the eval harness runs cases concurrently
(default 4). The leaderboard workflow has a 20-minute job timeout. A 24-call run that
was sequential now finishes in a few minutes and can't stall a job indefinitely.
## [20.0.0] — Agentic Tooling — 2026-06-18
### Added
+38 -14
View File
@@ -1,28 +1,30 @@
# 🧠 PM Skills — 167 Professional Agent Skills for Claude, ChatGPT, Gemini, Cursor, Codex & Hermes
# 🧠 PM Skills — 174 Professional Agent Skills for Claude, ChatGPT, Gemini, Cursor, Codex & Hermes
> Open-source **Agent Skills** (`SKILL.md`) + subagents + slash commands for every profession — one source, every AI coding tool.
[![Stars](https://img.shields.io/github/stars/mohitagw15856/pm-claude-skills?style=social)](https://github.com/mohitagw15856/pm-claude-skills/stargazers)
[![npm](https://img.shields.io/npm/v/pm-claude-skills?logo=npm&color=cb3837)](https://www.npmjs.com/package/pm-claude-skills)
[![npm downloads](https://img.shields.io/npm/dm/pm-claude-skills?logo=npm&color=cb3837&label=installs)](https://www.npmjs.com/package/pm-claude-skills)
[![Skills](https://img.shields.io/badge/skills-167-blue)](https://github.com/mohitagw15856/pm-claude-skills)
[![Skills](https://img.shields.io/badge/skills-174-blue)](https://github.com/mohitagw15856/pm-claude-skills)
[![Subagents](https://img.shields.io/badge/subagents-4-blueviolet)](agents/)
[![Commands](https://img.shields.io/badge/slash%20commands-6-blueviolet)](commands/)
[![Personas](https://img.shields.io/badge/personas-4-blueviolet)](output-styles/)
[![Platforms](https://img.shields.io/badge/works%20with-Claude%20%7C%20ChatGPT%20%7C%20Gemini%20%7C%20Cursor%20%7C%20Codex%20%7C%20Hermes-8A2BE2)](#-works-with--cross-tool-compatibility)
[![SkillCheck](https://img.shields.io/github/actions/workflow/status/mohitagw15856/pm-claude-skills/skillcheck.yml?branch=main&label=SkillCheck)](.github/workflows/skillcheck.yml)
[![Security Audit](https://img.shields.io/github/actions/workflow/status/mohitagw15856/pm-claude-skills/skill-audit.yml?branch=main&label=security%20audit)](.github/workflows/skill-audit.yml)
[![Version](https://img.shields.io/badge/version-20.0.0-brightgreen)](https://github.com/mohitagw15856/pm-claude-skills/releases)
[![Version](https://img.shields.io/badge/version-20.2.0-brightgreen)](https://github.com/mohitagw15856/pm-claude-skills/releases)
[![Install](https://img.shields.io/badge/Install%20in%20Claude%20Code-2%20minutes-orange)](https://github.com/mohitagw15856/pm-claude-skills#-quick-install-2-minutes)
[![License](https://img.shields.io/badge/license-MIT-lightgrey)](LICENSE)
[![Sponsor](https://img.shields.io/badge/sponsor-❤️-ff69b4)](https://github.com/sponsors/mohitagw15856)
### ⭐ If this saves you time, [star the repo](https://github.com/mohitagw15856/pm-claude-skills) — it's the #1 way to help others find it.
> **PM stands for Professional, not just Product Management.**
> 167 professional skills + 4 agent templates across 26 bundles covering 18 professions. Built for Claude Code — and now portable to ChatGPT, Gemini, and Hermes Agent. Built by a PM, used by everyone.
> 174 professional skills + 4 agent templates across 26 bundles covering 18 professions. Built for Claude Code — and now portable to ChatGPT, Gemini, and Hermes Agent. Built by a PM, used by everyone.
A community-built library of professional skills for every field — product management, engineering, customer success, marketing, social media, writers, design, legal, finance, HR, sales, operations, research, and more. Each skill is a structured `SKILL.md` file that teaches an AI assistant how to produce professional-grade outputs for your workflows. Skills run natively in **Claude Code** and **Hermes Agent** (same open `SKILL.md` standard), and ship as ready-to-paste exports for **ChatGPT** and **Gemini** — see [Works With](#-works-with--cross-tool-compatibility).
**🆕 Latest release (v20.0.0 — Agentic Tooling):** run any skill in CI with the new **[GitHub Action](action/)**, turn your docs into a skill with **`npx pm-claude-skills generate`**, and compare skills across models on the **[Skill Leaderboard](https://mohitagw15856.github.io/pm-claude-skills/leaderboard.html)** (LLM-judge evals). See the [changelog](#-changelog).
**🆕 Latest release (v20.2.0 — Community PRs & New Skill):** a new **YouTube Script Writer** skill (**174 total**), a stdlib **feature-prioritisation** helper, safer installs, and robust frontmatter parsing — all from community contributors. See the [changelog](#-changelog).
<!-- DEMO: replace web/docs-assets/playground.png below with web/docs-assets/playground-demo.gif
once recorded (see web/docs-assets/README.md for how). The link goes to the live app. -->
@@ -41,7 +43,7 @@ A community-built library of professional skills for every field — product man
- [📦 Plugin Directory](#-plugin-directory)
- [🤖 Building Blocks for Agent Templates](#-building-blocks-for-agent-templates)
- [🏷️ Skill Tiers — start with the strongest](#-skill-tiers--start-with-the-strongest)
- [🗂️ All 167 Skills](#-all-167-skills)
- [🗂️ All 174 Skills](#-all-174-skills)
- [📋 Changelog](#-changelog)
- [🤝 Contributing](#-contributing--add-your-skill)
- [🔗 Related Projects](#-related-projects)
@@ -322,7 +324,7 @@ Not sure which plugin to install? Here's what each one covers:
On May 5, 2026, Anthropic [released their first agent templates](https://www.anthropic.com/news/finance-agents) — pre-packaged Claude agents that combine **skills, connectors, and subagents** into ready-to-run workflows for financial services.
This library is the largest open-source collection of professional skills available — covering 17 professions beyond financial services. **The 167 skills here are the building blocks for agent templates outside of finance.**
This library is the largest open-source collection of professional skills available — covering 17 professions beyond financial services. **The 174 skills here are the building blocks for agent templates outside of finance.**
### What is an agent template?
@@ -403,7 +405,24 @@ More templates will follow. If you want to contribute one, see the [template con
The highlights are below. For the structured, [Keep a Changelog](https://keepachangelog.com/)-format history, see **[CHANGELOG.md](CHANGELOG.md)**.
### 🆕 What's New in v20.0.0 — Agentic Tooling
### 🆕 What's New in v20.2.0 — Community PRs & New Skill
- **New skill: YouTube Script Writer** (experimental) — retention-optimized video scripts with hook variations, a video/audio cue table, and SEO metadata. Thanks @prajwal-28 (#50). **Now 174 skills.**
- **Feature-prioritisation helper** — a dependency-free Python script that computes RICE/ICE rankings consistently across sessions. Thanks @zeotrix (#48).
- **Safer installs + robust parsing** — the CLI refuses system-critical install targets, and `skillcheck` tolerates CRLF/whitespace in frontmatter. Thanks @MatrixNeoKozak (#47).
- **Catalog reconciled to 174** — the headline, badge, and skill catalog now reflect the true count, with entries added for Skill Security Auditor, Launch Readiness, and YouTube Script Writer.
<details>
<summary><strong>v20.1.0 — Star Nudges & Eval Hardening</strong> (click to expand)</summary>
- **Star the repo, from anywhere you use it** — tasteful, non-spammy CTAs (no `postinstall`): after a successful `npx pm-claude-skills add`, in `--help`, in `list`, in the MCP server banner, below the README badges, and a `funding` link on npm.
- **One-click leaderboard in CI** — the "Update Skill Leaderboard" workflow runs the evals with your `ANTHROPIC_API_KEY` secret and opens a results PR; merge it to publish real numbers.
- **Faster, hang-proof evals** — per-request timeout + retries in the API client and concurrent eval runs, so a CI run finishes in minutes and can't stall.
</details>
<details>
<summary><strong>v20.0.0 — Agentic Tooling</strong> (click to expand)</summary>
The library starts *doing* the work, not just describing it:
@@ -411,6 +430,8 @@ The library starts *doing* the work, not just describing it:
- **`generate` command** — `npx pm-claude-skills generate --from <url|file>` turns your docs into a standard-compliant `SKILL.md`.
- **Skill evals + Leaderboard** — LLM-as-judge scoring of skills across models, rendered as a public [leaderboard](https://mohitagw15856.github.io/pm-claude-skills/leaderboard.html).
</details>
<details>
<summary><strong>v19.0.0 — Security Auditor, Personas & Catalog</strong> (click to expand)</summary>
@@ -645,12 +666,12 @@ If you're new, install `pm-essentials` and try a couple of Production-Ready skil
---
## 🗂️ All 167 Skills
## 🗂️ All 174 Skills
The [Plugin Directory](#-plugin-directory) above summarises every bundle. Expand below for the full per-skill breakdown with folder paths.
<details>
<summary><strong>Browse all 167 skills by profession</strong> (click to expand)</summary>
<summary><strong>Browse all 174 skills by profession</strong> (click to expand)</summary>
### 🛠️ Product Management (Skills 137)
**Bundles:** `pm-essentials` · `pm-discovery` · `pm-planning` · `pm-delivery` · `pm-analytics` · `pm-strategy` · `pm-advanced` · `pm-rituals`
@@ -687,7 +708,7 @@ The [Plugin Directory](#-plugin-directory) above summarises every bundle. Expand
---
### 👩‍💻 Engineering & Tech (Skills 4680, 166167)
### 👩‍💻 Engineering & Tech (Skills 4680, 166168)
**Bundle:** `pm-engineering`
| # | Skill | Folder | What It Does |
@@ -729,6 +750,7 @@ The [Plugin Directory](#-plugin-directory) above summarises every bundle. Expand
| 80 | **Engineering Hiring Rubric** 🆕 | `skills/engineering-hiring-rubric/` | Technical interview rubric with level expectations, coding scorecard, system design guide, behavioural question bank, and debrief template |
| 166 | **Context Mode** 🆕 | `skills/context-mode/` | Filters command output noise and maintains a session log so Claude resumes exactly where it left off after a context reset |
| 167 | **Claude Superpowers** 🆕 | `skills/claude-superpowers/` | Forces Claude Code to plan first, work in isolation, write tests before code, and double-review its own output — consistently better first passes |
| 168 | **Skill Security Auditor** 🆕 | `skills/skill-security-auditor/` | Audits any SKILL.md / system prompt for prompt injection, data exfiltration, code execution, secrets, and hidden text; returns a risk-rated report with an install / don't-install recommendation |
---
@@ -855,7 +877,7 @@ claude plugin install pm-cs@pm-claude-skills
---
### ⚙️ Operations (Skills 120126, 164165)
### ⚙️ Operations (Skills 120126, 164165, 169)
**Bundle:** `pm-operations`
| # | Skill | Folder | What It Does |
@@ -869,6 +891,7 @@ claude plugin install pm-cs@pm-claude-skills
| 126 | **RACI Matrix** 🆕 | `skills/raci-matrix/` | RACI with role definitions, decision map, anti-pattern guide, and a communication template for all teams |
| 164 | **Email Triage** 🆕 | `skills/email-triage/` | Reads Gmail for a configurable window and surfaces only what needs action — priority-ranked with urgency ratings and reply starters |
| 165 | **Morning Intelligence** 🆕 | `skills/morning-intelligence/` | 15-question interview that writes a personalised master prompt for your daily news brief, ready for Cowork Scheduled Tasks or Claude Code Routines |
| 169 | **Launch Readiness** 🆕 | `skills/launch-readiness/` | Cross-functional pre-launch assessment with a function-by-function readiness status, ranked blockers (owners + deadlines), a risk register, and an explicit Go / Conditional Go / No-Go recommendation |
---
@@ -950,7 +973,7 @@ claude plugin install pm-social@pm-claude-skills
---
### ✍️ Writers & Content Creators (Skills 156160)
### ✍️ Writers & Content Creators (Skills 156160, 170)
**Bundle:** `pm-writers`
> Install:
@@ -966,6 +989,7 @@ claude plugin install pm-writers@pm-claude-skills
| 158 | **Thumbnail Creator** 🆕 | `skills/thumbnail-creator/` | Generates brand-aligned thumbnail candidates via Gemini API; Claude evaluates results via computer vision and returns ranked candidates with rationale |
| 159 | **Substack Notes Scraper** 🆕 | `skills/substack-notes-scraper/` | Scrapes Substack Notes and exports likes, comments, and restacks to a formatted .xlsx with frozen headers, filters, and top-performer highlighting |
| 160 | **Notes Humanizer** 🆕 | `skills/notes-humanizer/` | Strips AI writing patterns (em dashes, filler phrases, uniform rhythm) across 3 phases: audit, strip, inject — returns side-by-side comparison and clean final text |
| 170 | **YouTube Script Writer** 🆕 | `skills/youtube-script-writer/` | Retention-optimized video scripts with 3 title/thumbnail concepts, 3 hook variations, a video/audio cue script table, and SEO metadata |
</details>
@@ -973,7 +997,7 @@ claude plugin install pm-writers@pm-claude-skills
## ❤️ Sponsor This Work
Building and maintaining 167 skills across 26 bundles takes real time — testing skills against new model releases, building new ones from community requests, writing the article series, and keeping documentation current.
Building and maintaining 174 skills across 26 bundles takes real time — testing skills against new model releases, building new ones from community requests, writing the article series, and keeping documentation current.
If these skills save you time at work, consider sponsoring:
+15 -2
View File
@@ -13,12 +13,13 @@
// --link symlink instead of copy (native agents; falls back to copy)
// --dry-run print what would happen without writing
import { readdirSync, existsSync, mkdirSync, rmSync, cpSync, symlinkSync, copyFileSync, statSync } from 'node:fs';
import { join, dirname, basename } from 'node:path';
import { join, dirname, basename, resolve } from 'node:path';
import { fileURLToPath } from 'node:url';
import { homedir } from 'node:os';
import { createRequire } from 'node:module';
const PKG_ROOT = dirname(dirname(fileURLToPath(import.meta.url)));
const STAR = '⭐ Find this useful? Star the repo: https://github.com/mohitagw15856/pm-claude-skills';
const VERSION = (() => {
try { return createRequire(import.meta.url)('../package.json').version; } catch { return '0.0.0'; }
})();
@@ -78,7 +79,15 @@ function add(opts) {
}
const skillsDir = join(PKG_ROOT, 'skills');
if (!existsSync(skillsDir)) { console.error(`Error: bundled skills/ not found at ${skillsDir}.`); process.exit(1); }
const target = opts.target || defaultTarget(agent);
const target = resolve(opts.target || defaultTarget(agent));
// Guard against installing into system-critical directories (e.g. a typo'd --target).
const criticalPaths = ['/', '/usr', '/bin', '/etc', '/var', '/root', '/boot', '/proc', '/sys', '/dev'];
if (criticalPaths.includes(target)) {
console.error(`Error: Cannot install into a system-critical directory: ${target}`);
process.exit(1);
}
let count = 0;
console.log(`${opts.dryRun ? '[dry-run] ' : ''}Installing for '${agent}' into ${target}`);
@@ -128,6 +137,7 @@ function add(opts) {
aider: `Load any of them with: aider --read ${join(target, '<skill>.md')}`,
}[agent] || `Restart ${agent} — it auto-discovers SKILL.md skills in ${target} by their description.`;
console.log(note);
console.log(`\n${STAR}`);
}
}
@@ -139,6 +149,7 @@ function list() {
console.log('\nNative SKILL.md agents: claude, hermes, codex, openclaw (install skill folders).');
console.log('Claude also gets subagents + slash commands. Cursor/Windsurf install rule files;');
console.log('Aider installs conventions you load with "aider --read".');
console.log(`\n${STAR}`);
}
const HELP = `pm-claude-skills — install professional Agent Skills into any AI coding tool.
@@ -155,6 +166,8 @@ Examples:
npx pm-claude-skills add --agent codex --link
npx pm-claude-skills generate --from <url|file> # turn your docs into a SKILL.md (needs ANTHROPIC_API_KEY)
${STAR}
`;
const opts = parse(process.argv.slice(2));
+41 -15
View File
@@ -6,31 +6,57 @@ const API_URL = 'https://api.anthropic.com/v1/messages';
/**
* Call the Anthropic Messages API and return the concatenated text output.
* Adds a per-request timeout and limited retries so a slow/transient failure
* can't hang a CI job forever.
* @param {object} o
* @param {string} o.apiKey - Anthropic API key.
* @param {string} [o.model] - Model id (default claude-sonnet-4-6).
* @param {string} [o.system]- System prompt.
* @param {Array} o.messages- [{role, content}] messages.
* @param {number} [o.maxTokens]
* @param {number} [o.timeoutMs] - Per-request timeout (default 120s).
* @param {number} [o.retries] - Retries on timeout / 429 / 5xx (default 2).
* @returns {Promise<string>}
*/
export async function complete({ apiKey, model = 'claude-sonnet-4-6', system, messages, maxTokens = 4096 }) {
export async function complete({ apiKey, model = 'claude-sonnet-4-6', system, messages, maxTokens = 4096, timeoutMs = 120000, retries = 2 }) {
if (!apiKey) throw new Error('Missing Anthropic API key (set ANTHROPIC_API_KEY).');
const res = await fetch(API_URL, {
method: 'POST',
headers: {
'content-type': 'application/json',
'x-api-key': apiKey,
'anthropic-version': '2023-06-01',
},
body: JSON.stringify({ model, max_tokens: maxTokens, ...(system ? { system } : {}), messages }),
});
if (!res.ok) {
const body = await res.text().catch(() => '');
throw new Error(`Anthropic API ${res.status}: ${body.slice(0, 500)}`);
let lastErr;
for (let attempt = 0; attempt <= retries; attempt++) {
const ctrl = new AbortController();
const timer = setTimeout(() => ctrl.abort(), timeoutMs);
try {
const res = await fetch(API_URL, {
method: 'POST',
headers: {
'content-type': 'application/json',
'x-api-key': apiKey,
'anthropic-version': '2023-06-01',
},
body: JSON.stringify({ model, max_tokens: maxTokens, ...(system ? { system } : {}), messages }),
signal: ctrl.signal,
});
if (res.ok) {
const data = await res.json();
return (data.content || []).map((c) => c.text || '').join('').trim();
}
const body = await res.text().catch(() => '');
// Retry transient server / rate-limit errors; fail fast on 4xx (bad key/model).
if ((res.status === 429 || res.status >= 500) && attempt < retries) {
lastErr = new Error(`Anthropic API ${res.status}`);
} else {
throw new Error(`Anthropic API ${res.status}: ${body.slice(0, 500)}`);
}
} catch (e) {
if (e.name === 'AbortError') e = new Error(`Anthropic API request timed out after ${timeoutMs}ms`);
const retryable = /timed out/.test(e.message) || e.name === 'TypeError' || /Anthropic API (429|5\d\d)/.test(e.message);
if (!retryable || attempt >= retries) throw e;
lastErr = e;
} finally {
clearTimeout(timer);
}
await new Promise((r) => setTimeout(r, 1000 * 2 ** attempt)); // backoff: 1s, 2s, 4s
}
const data = await res.json();
return (data.content || []).map((c) => c.text || '').join('').trim();
throw lastErr || new Error('Anthropic API request failed.');
}
/** Parse "name: value" YAML-ish frontmatter + body from a SKILL.md string. */
+7 -3
View File
@@ -30,9 +30,13 @@ back to `results.example.json` (clearly labelled) so the page renders before you
### No local key? Run it in CI
Add an `ANTHROPIC_API_KEY` repo secret, then go to **Actions → "Update Skill Leaderboard"
→ Run workflow**. It runs the evals, commits `evals/results.json`, and the Pages deploy
re-renders the public leaderboard with real numbers — no laptop required.
1. Add an `ANTHROPIC_API_KEY` repo secret.
2. Enable **Settings → Actions → General → Workflow permissions → "Allow GitHub Actions to
create and approve pull requests"** (so the workflow can open its results PR — `main`
requires PRs).
3. **Actions → "Update Skill Leaderboard" → Run workflow.** It runs the evals and opens a
PR with `evals/results.json`. **Merge that PR** and the Pages deploy re-renders the
public leaderboard with real numbers — no laptop required.
## Add a case
+148
View File
@@ -0,0 +1,148 @@
{
"generatedAt": "2026-06-18T12:40:14.995Z",
"judge": "claude-opus-4-8",
"models": [
"claude-sonnet-4-6",
"claude-haiku-4-5-20251001"
],
"dimensions": [
"structure",
"completeness",
"usefulness",
"grounding"
],
"results": [
{
"skill": "rice-prioritisation",
"model": "claude-sonnet-4-6",
"scores": {
"structure": 5,
"completeness": 5,
"usefulness": 5,
"grounding": 5
},
"overall": 5
},
{
"skill": "rice-prioritisation",
"model": "claude-haiku-4-5-20251001",
"scores": {
"structure": 5,
"completeness": 5,
"usefulness": 5,
"grounding": 4
},
"overall": 4.75
},
{
"skill": "prd-template",
"model": "claude-sonnet-4-6",
"scores": {
"structure": 5,
"completeness": 5,
"usefulness": 5,
"grounding": 4
},
"overall": 4.75
},
{
"skill": "prd-template",
"model": "claude-haiku-4-5-20251001",
"scores": {
"structure": 5,
"completeness": 4,
"usefulness": 5,
"grounding": 3
},
"overall": 4.25
},
{
"skill": "cs-health-scorecard",
"model": "claude-sonnet-4-6",
"scores": {
"structure": 5,
"completeness": 5,
"usefulness": 5,
"grounding": 5
},
"overall": 5
},
{
"skill": "cs-health-scorecard",
"model": "claude-haiku-4-5-20251001",
"scores": {
"structure": 5,
"completeness": 5,
"usefulness": 5,
"grounding": 4
},
"overall": 4.75
},
{
"skill": "executive-summary",
"model": "claude-sonnet-4-6",
"scores": {
"structure": 5,
"completeness": 5,
"usefulness": 5,
"grounding": 5
},
"overall": 5
},
{
"skill": "executive-summary",
"model": "claude-haiku-4-5-20251001",
"scores": {
"structure": 5,
"completeness": 5,
"usefulness": 5,
"grounding": 4
},
"overall": 4.75
},
{
"skill": "competitive-analysis",
"model": "claude-sonnet-4-6",
"scores": {
"structure": 5,
"completeness": 4,
"usefulness": 5,
"grounding": 5
},
"overall": 4.75
},
{
"skill": "competitive-analysis",
"model": "claude-haiku-4-5-20251001",
"scores": {
"structure": 5,
"completeness": 4,
"usefulness": 5,
"grounding": 4
},
"overall": 4.5
},
{
"skill": "sprint-planning",
"model": "claude-sonnet-4-6",
"scores": {
"structure": 5,
"completeness": 5,
"usefulness": 5,
"grounding": 4
},
"overall": 4.75
},
{
"skill": "sprint-planning",
"model": "claude-haiku-4-5-20251001",
"scores": {
"structure": 5,
"completeness": 4,
"usefulness": 4,
"grounding": 3
},
"overall": 4
}
]
}
+35 -15
View File
@@ -61,33 +61,53 @@ function parseScores(text) {
return s;
}
// Run an async worker over `items` with at most `limit` in flight.
async function pool(items, limit, worker) {
const out = [];
let i = 0;
await Promise.all(Array.from({ length: Math.min(limit, items.length) }, async () => {
while (i < items.length) {
const idx = i++;
out[idx] = await worker(items[idx]);
}
}));
return out;
}
async function scoreTask({ c, body, description, model }) {
try {
const output = await complete({ apiKey, model, system: runPrompt(body), messages: [{ role: 'user', content: c.input }], maxTokens: 3000 });
const judged = await complete({ apiKey, model: judge, messages: [{ role: 'user', content: judgePrompt(description, output) }], maxTokens: 200 });
const scores = parseScores(judged);
const overall = DIMENSIONS.reduce((a, d) => a + scores[d], 0) / DIMENSIONS.length;
process.stderr.write(`${c.skill} on ${model}${overall.toFixed(2)}/5\n`);
return { skill: c.skill, model, scores, overall: Math.round(overall * 100) / 100 };
} catch (e) {
process.stderr.write(`${c.skill} on ${model} — FAILED (${e.message})\n`);
return null;
}
}
async function main() {
if (!apiKey) { console.error('Set ANTHROPIC_API_KEY to run evals.'); process.exit(1); }
const concurrency = parseInt(arg('concurrency', '4'), 10) || 4;
const { cases } = JSON.parse(readFileSync(casesPath, 'utf8'));
const results = [];
// Build the full (case × model) task list.
const tasks = [];
for (const c of cases) {
const skillFile = join(root, 'skills', c.skill, 'SKILL.md');
if (!existsSync(skillFile)) { console.error(`skip ${c.skill}: no SKILL.md`); continue; }
const { meta, body } = parseSkill(readFileSync(skillFile, 'utf8'));
for (const model of models) {
process.stderr.write(`Running ${c.skill} on ${model}`);
try {
const output = await complete({ apiKey, model, system: runPrompt(body), messages: [{ role: 'user', content: c.input }], maxTokens: 3000 });
const judged = await complete({ apiKey, model: judge, messages: [{ role: 'user', content: judgePrompt(meta.description || c.skill, output) }], maxTokens: 200 });
const scores = parseScores(judged);
const overall = DIMENSIONS.reduce((a, d) => a + scores[d], 0) / DIMENSIONS.length;
results.push({ skill: c.skill, model, scores, overall: Math.round(overall * 100) / 100 });
process.stderr.write(`${overall.toFixed(2)}/5\n`);
} catch (e) {
process.stderr.write(`FAILED (${e.message})\n`);
}
}
for (const model of models) tasks.push({ c, body, description: meta.description || c.skill, model });
}
process.stderr.write(`Scoring ${tasks.length} runs (concurrency ${concurrency})…\n`);
const results = (await pool(tasks, concurrency, scoreTask)).filter(Boolean);
const out = { generatedAt: new Date().toISOString(), judge, models, dimensions: DIMENSIONS, results };
writeFileSync(outPath, JSON.stringify(out, null, 2));
console.log(`\nWrote ${outPath}${results.length} scored runs. Build the page: node scripts/build-leaderboard.mjs`);
console.log(`\nWrote ${outPath}${results.length}/${tasks.length} scored runs. Build the page: node scripts/build-leaderboard.mjs`);
}
main();
+1 -1
View File
@@ -8,7 +8,7 @@ by hand; edit the source skill and run:
node scripts/build-exports.mjs
```
Currently exporting **173 skills** to:
Currently exporting **174 skills** to:
- **ChatGPT — Custom GPT instructions** → `exports/chatgpt/`
- **Google Gemini — Gem instructions** → `exports/gemini/`
+2 -1
View File
@@ -3,7 +3,7 @@
> Auto-generated from `skills/*/SKILL.md` by `scripts/build-exports.mjs`.
> **Do not edit these files by hand** — edit the source skill and regenerate.
173 skills exported. Copy a `.mdc rule` into the tool to use it.
174 skills exported. Copy a `.mdc rule` into the tool to use it.
| Skill | Bundle | Path |
|---|---|---|
@@ -180,3 +180,4 @@
| Vendor Evaluation | `pm-operations` | `pm-operations/vendor-evaluation/vendor-evaluation.md` |
| Viral Content Framework | `pm-social` | `pm-social/viral-content-framework/viral-content-framework.md` |
| Workshop Facilitation Guide | `pm-operations` | `pm-operations/workshop-facilitation-guide/workshop-facilitation-guide.md` |
| YouTube Script Writer | `other` | `other/youtube-script-writer/youtube-script-writer.md` |
@@ -0,0 +1,110 @@
# YouTube Script Writer Skill
This skill helps creators write highly engaging, structured, and visually-dynamic scripts optimized for YouTube's retention algorithm. It converts raw ideas, articles, or transcripts into a ready-to-shoot script with clear visual cues, pacing indicators, and audio directions.
## What This Skill Produces
- **3 Title & Thumbnail Concepts:** CTR-optimized titles matching distinct psychological triggers (curiosity, result-driven, contrarian) paired with clear visual thumbnail layout suggestions.
- **3 Hook Variations (0:00 - 0:30):** Different hook formats (contrarian statement, story setup, pattern interrupt) that deliver immediately on the title's promise.
- **Retention-Optimized Script Table:** A side-by-side or block-formatted script separating video cues (B-roll, camera angles, text overlays, zooms) and audio cues (dialogue, voiceover, sound effects, music changes).
- **Outro & Video Metadata:** A seamless video outro designed to prevent viewer exit, along with search-optimized description templates and relevant tags.
## Required Inputs
Ask the user for these if not provided:
- **Topic/Concept** — What is the video about? (e.g., "How I built a SaaS in 30 days")
- **Target Audience** — Who is watching? (e.g., beginner developers, student designers)
- **Target Duration** — Approximate length in minutes (e.g., 5-7 minutes, 10-15 minutes)
- **Script Tone/Voice** — E.g., energetic, educational, storytelling, conversational, comedic
- **Primary Goal** — (e.g., get newsletter signups, sell a course, increase viewer retention)
## Pacing & Retention Model
Every YouTube script must follow this structure to prevent early drop-off:
1. **The Hook (0:00 - 0:30):** Promise immediate value. No intros, no logo animation, and no generic greeting ("Hey guys, welcome back...").
2. **The Stakes / Re-Hook (0:30 - 1:00):** Establish why this topic is difficult, urgent, or valuable. Introduce the "villain" (the problem) and the "hero" (the solution).
3. **Chapters / Milestones (1:00 - 90% mark):** Divide the core content into 3-5 distinct chapters. Every chapter must have a clear micro-payoff.
4. **Pattern Interrupts:** Suggest visual or audio changes every 4-8 seconds. Use zoomed frames, pop-up text, B-roll transitions, or sound effects (whoosh, ding, pop) to keep attention.
5. **The Payoff / Climax (90% - 95% mark):** Deliver the ultimate piece of advice or final revelation promised in the hook.
6. **Seamless Transition CTA (95% - end):** Never signal the end with "in conclusion" or "that is all." Bridge the final value point directly to recommending the next video or a quick call to action before the viewer leaves.
---
## Output Format
### [Working Title]
**Target Duration:** [Duration] | **Audience:** [Target Audience] | **Tone:** [Tone]
---
### 1. Title & Thumbnail Optimization
#### Title Options
1. **The Curiosity Gap:** [e.g., "The Real Reason Your Code is Slow (It's Not Python)"]
2. **The Result-Oriented:** [e.g., "How I Optimized My App to Handle 100k Users in 1 Hour"]
3. **The Contrarian:** [e.g., "Stop Using React for Simple Projects"]
#### Thumbnail Concepts
- **Concept 1:** [Visual details, e.g., Close-up of host with a worried face, split-screen showing a massive red 'Error' banner on one side and a clean green checkmark on the other. Large, bold 3-word text overlay: "STOP DOING THIS."]
- **Concept 2:** [Visual details, e.g., Clean graphic representation of a server load graph spiking to the moon, contrasted with a flat green line. Text overlay: "100K USERS."]
---
### 2. Hook Variations (Choose One)
#### Variation 1: The Contrarian Hook
* **Visuals:** [Host leans close to the camera, looking directly into the lens. Fast zoom-in on the word 'Slow' appearing in bold red letters on screen.]
* **Audio:** "Almost every developer I talk to blames Python for their slow apps. But 90% of the time, the language isn't the problem. The bottleneck is actually inside a single line of config you probably wrote yesterday."
#### Variation 2: The Story Hook
* **Visuals:** [Show B-roll of an editor showing 500 error logs flashing. Cut to host rubbing their forehead in frustration.]
* **Audio:** "Last Tuesday at 3 AM, our database completely crashed under load. We were losing $200 every minute the site was down. After searching through stack traces for hours, we found a fix so simple I couldn't believe we missed it."
#### Variation 3: The Pattern Interrupt Hook
* **Visuals:** [A stopwatch counts down from 5 seconds in the center of the screen. Sudden loud 'Ding' sound effect as the timer hits zero.]
* **Audio (Voiceover):** "In the next 5 minutes, I am going to show you the exact performance tweak that saved our team $4,000 in monthly server costs. And no, you don't need to rewrite a single database query."
---
### 3. The Main Script
| Time / Chapter | Video Cues (B-Roll, Overlays, Camera Angles) | Audio Cues (Spoken Script, Sound Effects, Music) |
| :--- | :--- | :--- |
| **0:30 - 1:00**<br>The Re-Hook | Show on-screen graphics displaying server costs. Zoom in slightly on the host. | "Here is the reality: database optimization sounds incredibly complex. But most tutorials make you learn SQL queries you will never use. Today, we are keeping it purely practical." |
| **1:00 - 3:30**<br>Chapter 1: [Chapter Name] | [Visual Cue: Transition to screencast. Highlight lines 12-15 in the config file. Add cursor highlight.] | "[Spoken Dialogue]: First, let's open up the default configuration file. Notice this specific pool size limit... *[Sound Effect: soft click]*" |
| **3:30 - 6:00**<br>Chapter 2: [Chapter Name] | [Visual Cue: Cut back to host. Push-in zoom on host's face to emphasize the point.] | "[Spoken Dialogue]: This brings us to the next step. If you set this value too high, your server will freeze. If it's too low, users will wait forever. Here is how to find the sweet spot..." |
| **6:00 - 8:30**<br>Chapter 3: [Chapter Name] | [Visual Cue: B-roll of server monitoring dashboard showing a flatline turning into a healthy wave.] | "[Spoken Dialogue]: Once we applied this setting, look at what happened to the response times. They dropped from 800 milliseconds down to 45." |
| **8:30 - 9:00**<br>The Payoff | Show split screen: Before config vs After config load times. | "So, by changing just that one variable, we solved the crash problem completely without spending a single dollar on hardware upgrades." |
| **9:00 - 9:30**<br>Seamless CTA | [Visual Cue: On-screen card pops up pointing to a related video. Text overlay: 'Watch next: Scaling PostgreSQL Databases.'] | "[Spoken Dialogue]: Now that your server is configured correctly, your next bottleneck is going to be database indexing. Click on this video right here where I break down indexing in under 5 minutes..." |
---
### 4. Search-Optimized Metadata
- **Video Description:** [First 3 sentences containing key terms for search ranking. E.g., 'Learn how to optimize server performance and prevent database crashes. This step-by-step tutorial walks you through server configuration tweaks to save hosting costs.']
- **Suggested Tags:** server optimization, database configuration, web development, hosting costs, system architecture
- **Call-to-Action Link:** [Insert link to newsletter or product page]
---
## Quality Checks
- [ ] Every title option is under 60 characters to prevent truncation on mobile devices.
- [ ] No generic intro fillers (e.g., "Welcome back to my channel," "Don't forget to like and subscribe") in the first 60 seconds of any hook or script section.
- [ ] Visual direction (B-roll, text overlays, zoom adjustments) is specified at least once every 10 seconds in the main script.
- [ ] Script transitions to the Call to Action immediately after the payoff without declaring "in conclusion" or "thank you for watching."
- [ ] Spoken audio lines are written in conversational language (short sentences, natural pauses, no overly academic jargon).
## Anti-Patterns
- [ ] Do not write paragraphs of dialogue without accompanying visual cues. YouTube is a visual-first medium; every paragraph of speech needs visual transitions.
- [ ] Do not pitch sponsors, channel subscriptions, or external links during the hook (first 60 seconds).
- [ ] Do not create a single generic hook; always provide 3 distinct hook variations (Contrarian, Story, Pattern Interrupt) to give the creator flexibility.
- [ ] Do not use a generic outro that triggers the "viewer exit ramp" (e.g., "That's all for today's video, hope you enjoyed, see you next time!"). Suggest another video to keep viewers on the platform.
## Example Trigger Phrases
- "Write a YouTube script about my personal productivity system."
- "Help me script a 10-minute video explaining inflation to college students."
- "I need a YouTube outline and script for a tutorial on clean code in Python."
- "Draft a retention-optimized YouTube script on how to build a SaaS in 2026."
@@ -75,6 +75,29 @@ Recommend building: all Basic features first → Performance features for key us
---
## Programmatic Helper
This skill ships with a stdlib-only Python script that computes ranking for the math-based frameworks (RICE, ICE) so feature scoring is consistent across sessions.
```bash
# RICE from JSON
python3 scripts/feature_prioritisation.py initiatives.json --framework rice
# RICE from CSV
python3 scripts/feature_prioritisation.py initiatives.csv --framework rice --format csv
# ICE from JSON
python3 scripts/feature_prioritisation.py features.json --framework ice
# Pipe into it
printf '%s\n' '[{"name":"API refactor","impact":8,"confidence":80,"ease":5}]' \
| python3 scripts/feature_prioritisation.py --framework ice -
```
Use `--json` to produce machine-readable output for downstream tooling.
---
## Output Format
### Feature Prioritisation — [Product/Team] — [Date]
+2 -1
View File
@@ -3,7 +3,7 @@
> Auto-generated from `skills/*/SKILL.md` by `scripts/build-exports.mjs`.
> **Do not edit these files by hand** — edit the source skill and regenerate.
173 skills exported. Copy a `SYSTEM_PROMPT.md` into the tool to use it.
174 skills exported. Copy a `SYSTEM_PROMPT.md` into the tool to use it.
| Skill | Bundle | Path |
|---|---|---|
@@ -180,3 +180,4 @@
| Vendor Evaluation | `pm-operations` | `pm-operations/vendor-evaluation/SYSTEM_PROMPT.md` |
| Viral Content Framework | `pm-social` | `pm-social/viral-content-framework/SYSTEM_PROMPT.md` |
| Workshop Facilitation Guide | `pm-operations` | `pm-operations/workshop-facilitation-guide/SYSTEM_PROMPT.md` |
| YouTube Script Writer | `other` | `other/youtube-script-writer/SYSTEM_PROMPT.md` |
@@ -0,0 +1,110 @@
# YouTube Script Writer Skill
This skill helps creators write highly engaging, structured, and visually-dynamic scripts optimized for YouTube's retention algorithm. It converts raw ideas, articles, or transcripts into a ready-to-shoot script with clear visual cues, pacing indicators, and audio directions.
## What This Skill Produces
- **3 Title & Thumbnail Concepts:** CTR-optimized titles matching distinct psychological triggers (curiosity, result-driven, contrarian) paired with clear visual thumbnail layout suggestions.
- **3 Hook Variations (0:00 - 0:30):** Different hook formats (contrarian statement, story setup, pattern interrupt) that deliver immediately on the title's promise.
- **Retention-Optimized Script Table:** A side-by-side or block-formatted script separating video cues (B-roll, camera angles, text overlays, zooms) and audio cues (dialogue, voiceover, sound effects, music changes).
- **Outro & Video Metadata:** A seamless video outro designed to prevent viewer exit, along with search-optimized description templates and relevant tags.
## Required Inputs
Ask the user for these if not provided:
- **Topic/Concept** — What is the video about? (e.g., "How I built a SaaS in 30 days")
- **Target Audience** — Who is watching? (e.g., beginner developers, student designers)
- **Target Duration** — Approximate length in minutes (e.g., 5-7 minutes, 10-15 minutes)
- **Script Tone/Voice** — E.g., energetic, educational, storytelling, conversational, comedic
- **Primary Goal** — (e.g., get newsletter signups, sell a course, increase viewer retention)
## Pacing & Retention Model
Every YouTube script must follow this structure to prevent early drop-off:
1. **The Hook (0:00 - 0:30):** Promise immediate value. No intros, no logo animation, and no generic greeting ("Hey guys, welcome back...").
2. **The Stakes / Re-Hook (0:30 - 1:00):** Establish why this topic is difficult, urgent, or valuable. Introduce the "villain" (the problem) and the "hero" (the solution).
3. **Chapters / Milestones (1:00 - 90% mark):** Divide the core content into 3-5 distinct chapters. Every chapter must have a clear micro-payoff.
4. **Pattern Interrupts:** Suggest visual or audio changes every 4-8 seconds. Use zoomed frames, pop-up text, B-roll transitions, or sound effects (whoosh, ding, pop) to keep attention.
5. **The Payoff / Climax (90% - 95% mark):** Deliver the ultimate piece of advice or final revelation promised in the hook.
6. **Seamless Transition CTA (95% - end):** Never signal the end with "in conclusion" or "that is all." Bridge the final value point directly to recommending the next video or a quick call to action before the viewer leaves.
---
## Output Format
### [Working Title]
**Target Duration:** [Duration] | **Audience:** [Target Audience] | **Tone:** [Tone]
---
### 1. Title & Thumbnail Optimization
#### Title Options
1. **The Curiosity Gap:** [e.g., "The Real Reason Your Code is Slow (It's Not Python)"]
2. **The Result-Oriented:** [e.g., "How I Optimized My App to Handle 100k Users in 1 Hour"]
3. **The Contrarian:** [e.g., "Stop Using React for Simple Projects"]
#### Thumbnail Concepts
- **Concept 1:** [Visual details, e.g., Close-up of host with a worried face, split-screen showing a massive red 'Error' banner on one side and a clean green checkmark on the other. Large, bold 3-word text overlay: "STOP DOING THIS."]
- **Concept 2:** [Visual details, e.g., Clean graphic representation of a server load graph spiking to the moon, contrasted with a flat green line. Text overlay: "100K USERS."]
---
### 2. Hook Variations (Choose One)
#### Variation 1: The Contrarian Hook
* **Visuals:** [Host leans close to the camera, looking directly into the lens. Fast zoom-in on the word 'Slow' appearing in bold red letters on screen.]
* **Audio:** "Almost every developer I talk to blames Python for their slow apps. But 90% of the time, the language isn't the problem. The bottleneck is actually inside a single line of config you probably wrote yesterday."
#### Variation 2: The Story Hook
* **Visuals:** [Show B-roll of an editor showing 500 error logs flashing. Cut to host rubbing their forehead in frustration.]
* **Audio:** "Last Tuesday at 3 AM, our database completely crashed under load. We were losing $200 every minute the site was down. After searching through stack traces for hours, we found a fix so simple I couldn't believe we missed it."
#### Variation 3: The Pattern Interrupt Hook
* **Visuals:** [A stopwatch counts down from 5 seconds in the center of the screen. Sudden loud 'Ding' sound effect as the timer hits zero.]
* **Audio (Voiceover):** "In the next 5 minutes, I am going to show you the exact performance tweak that saved our team $4,000 in monthly server costs. And no, you don't need to rewrite a single database query."
---
### 3. The Main Script
| Time / Chapter | Video Cues (B-Roll, Overlays, Camera Angles) | Audio Cues (Spoken Script, Sound Effects, Music) |
| :--- | :--- | :--- |
| **0:30 - 1:00**<br>The Re-Hook | Show on-screen graphics displaying server costs. Zoom in slightly on the host. | "Here is the reality: database optimization sounds incredibly complex. But most tutorials make you learn SQL queries you will never use. Today, we are keeping it purely practical." |
| **1:00 - 3:30**<br>Chapter 1: [Chapter Name] | [Visual Cue: Transition to screencast. Highlight lines 12-15 in the config file. Add cursor highlight.] | "[Spoken Dialogue]: First, let's open up the default configuration file. Notice this specific pool size limit... *[Sound Effect: soft click]*" |
| **3:30 - 6:00**<br>Chapter 2: [Chapter Name] | [Visual Cue: Cut back to host. Push-in zoom on host's face to emphasize the point.] | "[Spoken Dialogue]: This brings us to the next step. If you set this value too high, your server will freeze. If it's too low, users will wait forever. Here is how to find the sweet spot..." |
| **6:00 - 8:30**<br>Chapter 3: [Chapter Name] | [Visual Cue: B-roll of server monitoring dashboard showing a flatline turning into a healthy wave.] | "[Spoken Dialogue]: Once we applied this setting, look at what happened to the response times. They dropped from 800 milliseconds down to 45." |
| **8:30 - 9:00**<br>The Payoff | Show split screen: Before config vs After config load times. | "So, by changing just that one variable, we solved the crash problem completely without spending a single dollar on hardware upgrades." |
| **9:00 - 9:30**<br>Seamless CTA | [Visual Cue: On-screen card pops up pointing to a related video. Text overlay: 'Watch next: Scaling PostgreSQL Databases.'] | "[Spoken Dialogue]: Now that your server is configured correctly, your next bottleneck is going to be database indexing. Click on this video right here where I break down indexing in under 5 minutes..." |
---
### 4. Search-Optimized Metadata
- **Video Description:** [First 3 sentences containing key terms for search ranking. E.g., 'Learn how to optimize server performance and prevent database crashes. This step-by-step tutorial walks you through server configuration tweaks to save hosting costs.']
- **Suggested Tags:** server optimization, database configuration, web development, hosting costs, system architecture
- **Call-to-Action Link:** [Insert link to newsletter or product page]
---
## Quality Checks
- [ ] Every title option is under 60 characters to prevent truncation on mobile devices.
- [ ] No generic intro fillers (e.g., "Welcome back to my channel," "Don't forget to like and subscribe") in the first 60 seconds of any hook or script section.
- [ ] Visual direction (B-roll, text overlays, zoom adjustments) is specified at least once every 10 seconds in the main script.
- [ ] Script transitions to the Call to Action immediately after the payoff without declaring "in conclusion" or "thank you for watching."
- [ ] Spoken audio lines are written in conversational language (short sentences, natural pauses, no overly academic jargon).
## Anti-Patterns
- [ ] Do not write paragraphs of dialogue without accompanying visual cues. YouTube is a visual-first medium; every paragraph of speech needs visual transitions.
- [ ] Do not pitch sponsors, channel subscriptions, or external links during the hook (first 60 seconds).
- [ ] Do not create a single generic hook; always provide 3 distinct hook variations (Contrarian, Story, Pattern Interrupt) to give the creator flexibility.
- [ ] Do not use a generic outro that triggers the "viewer exit ramp" (e.g., "That's all for today's video, hope you enjoyed, see you next time!"). Suggest another video to keep viewers on the platform.
## Example Trigger Phrases
- "Write a YouTube script about my personal productivity system."
- "Help me script a 10-minute video explaining inflation to college students."
- "I need a YouTube outline and script for a tutorial on clean code in Python."
- "Draft a retention-optimized YouTube script on how to build a SaaS in 2026."
@@ -75,6 +75,29 @@ Recommend building: all Basic features first → Performance features for key us
---
## Programmatic Helper
This skill ships with a stdlib-only Python script that computes ranking for the math-based frameworks (RICE, ICE) so feature scoring is consistent across sessions.
```bash
# RICE from JSON
python3 scripts/feature_prioritisation.py initiatives.json --framework rice
# RICE from CSV
python3 scripts/feature_prioritisation.py initiatives.csv --framework rice --format csv
# ICE from JSON
python3 scripts/feature_prioritisation.py features.json --framework ice
# Pipe into it
printf '%s\n' '[{"name":"API refactor","impact":8,"confidence":80,"ease":5}]' \
| python3 scripts/feature_prioritisation.py --framework ice -
```
Use `--json` to produce machine-readable output for downstream tooling.
---
## Output Format
### Feature Prioritisation — [Product/Team] — [Date]
+2 -1
View File
@@ -3,7 +3,7 @@
> Auto-generated from `skills/*/SKILL.md` by `scripts/build-exports.mjs`.
> **Do not edit these files by hand** — edit the source skill and regenerate.
173 skills exported. Copy a `.mdc rule` into the tool to use it.
174 skills exported. Copy a `.mdc rule` into the tool to use it.
| Skill | Bundle | Path |
|---|---|---|
@@ -180,3 +180,4 @@
| Vendor Evaluation | `pm-operations` | `pm-operations/vendor-evaluation/vendor-evaluation.mdc` |
| Viral Content Framework | `pm-social` | `pm-social/viral-content-framework/viral-content-framework.mdc` |
| Workshop Facilitation Guide | `pm-operations` | `pm-operations/workshop-facilitation-guide/workshop-facilitation-guide.mdc` |
| YouTube Script Writer | `other` | `other/youtube-script-writer/youtube-script-writer.mdc` |
@@ -0,0 +1,116 @@
---
description: "Write engaging, high-retention YouTube video scripts with visual and audio cues. Use when asked to write a YouTube script, design a video outline, draft a video hook, or structure a video narrative. Produces a polished script with multiple hook options, step-by-step video body, and clear visual/audio directions."
globs:
alwaysApply: false
---
# YouTube Script Writer Skill
This skill helps creators write highly engaging, structured, and visually-dynamic scripts optimized for YouTube's retention algorithm. It converts raw ideas, articles, or transcripts into a ready-to-shoot script with clear visual cues, pacing indicators, and audio directions.
## What This Skill Produces
- **3 Title & Thumbnail Concepts:** CTR-optimized titles matching distinct psychological triggers (curiosity, result-driven, contrarian) paired with clear visual thumbnail layout suggestions.
- **3 Hook Variations (0:00 - 0:30):** Different hook formats (contrarian statement, story setup, pattern interrupt) that deliver immediately on the title's promise.
- **Retention-Optimized Script Table:** A side-by-side or block-formatted script separating video cues (B-roll, camera angles, text overlays, zooms) and audio cues (dialogue, voiceover, sound effects, music changes).
- **Outro & Video Metadata:** A seamless video outro designed to prevent viewer exit, along with search-optimized description templates and relevant tags.
## Required Inputs
Ask the user for these if not provided:
- **Topic/Concept** — What is the video about? (e.g., "How I built a SaaS in 30 days")
- **Target Audience** — Who is watching? (e.g., beginner developers, student designers)
- **Target Duration** — Approximate length in minutes (e.g., 5-7 minutes, 10-15 minutes)
- **Script Tone/Voice** — E.g., energetic, educational, storytelling, conversational, comedic
- **Primary Goal** — (e.g., get newsletter signups, sell a course, increase viewer retention)
## Pacing & Retention Model
Every YouTube script must follow this structure to prevent early drop-off:
1. **The Hook (0:00 - 0:30):** Promise immediate value. No intros, no logo animation, and no generic greeting ("Hey guys, welcome back...").
2. **The Stakes / Re-Hook (0:30 - 1:00):** Establish why this topic is difficult, urgent, or valuable. Introduce the "villain" (the problem) and the "hero" (the solution).
3. **Chapters / Milestones (1:00 - 90% mark):** Divide the core content into 3-5 distinct chapters. Every chapter must have a clear micro-payoff.
4. **Pattern Interrupts:** Suggest visual or audio changes every 4-8 seconds. Use zoomed frames, pop-up text, B-roll transitions, or sound effects (whoosh, ding, pop) to keep attention.
5. **The Payoff / Climax (90% - 95% mark):** Deliver the ultimate piece of advice or final revelation promised in the hook.
6. **Seamless Transition CTA (95% - end):** Never signal the end with "in conclusion" or "that is all." Bridge the final value point directly to recommending the next video or a quick call to action before the viewer leaves.
---
## Output Format
### [Working Title]
**Target Duration:** [Duration] | **Audience:** [Target Audience] | **Tone:** [Tone]
---
### 1. Title & Thumbnail Optimization
#### Title Options
1. **The Curiosity Gap:** [e.g., "The Real Reason Your Code is Slow (It's Not Python)"]
2. **The Result-Oriented:** [e.g., "How I Optimized My App to Handle 100k Users in 1 Hour"]
3. **The Contrarian:** [e.g., "Stop Using React for Simple Projects"]
#### Thumbnail Concepts
- **Concept 1:** [Visual details, e.g., Close-up of host with a worried face, split-screen showing a massive red 'Error' banner on one side and a clean green checkmark on the other. Large, bold 3-word text overlay: "STOP DOING THIS."]
- **Concept 2:** [Visual details, e.g., Clean graphic representation of a server load graph spiking to the moon, contrasted with a flat green line. Text overlay: "100K USERS."]
---
### 2. Hook Variations (Choose One)
#### Variation 1: The Contrarian Hook
* **Visuals:** [Host leans close to the camera, looking directly into the lens. Fast zoom-in on the word 'Slow' appearing in bold red letters on screen.]
* **Audio:** "Almost every developer I talk to blames Python for their slow apps. But 90% of the time, the language isn't the problem. The bottleneck is actually inside a single line of config you probably wrote yesterday."
#### Variation 2: The Story Hook
* **Visuals:** [Show B-roll of an editor showing 500 error logs flashing. Cut to host rubbing their forehead in frustration.]
* **Audio:** "Last Tuesday at 3 AM, our database completely crashed under load. We were losing $200 every minute the site was down. After searching through stack traces for hours, we found a fix so simple I couldn't believe we missed it."
#### Variation 3: The Pattern Interrupt Hook
* **Visuals:** [A stopwatch counts down from 5 seconds in the center of the screen. Sudden loud 'Ding' sound effect as the timer hits zero.]
* **Audio (Voiceover):** "In the next 5 minutes, I am going to show you the exact performance tweak that saved our team $4,000 in monthly server costs. And no, you don't need to rewrite a single database query."
---
### 3. The Main Script
| Time / Chapter | Video Cues (B-Roll, Overlays, Camera Angles) | Audio Cues (Spoken Script, Sound Effects, Music) |
| :--- | :--- | :--- |
| **0:30 - 1:00**<br>The Re-Hook | Show on-screen graphics displaying server costs. Zoom in slightly on the host. | "Here is the reality: database optimization sounds incredibly complex. But most tutorials make you learn SQL queries you will never use. Today, we are keeping it purely practical." |
| **1:00 - 3:30**<br>Chapter 1: [Chapter Name] | [Visual Cue: Transition to screencast. Highlight lines 12-15 in the config file. Add cursor highlight.] | "[Spoken Dialogue]: First, let's open up the default configuration file. Notice this specific pool size limit... *[Sound Effect: soft click]*" |
| **3:30 - 6:00**<br>Chapter 2: [Chapter Name] | [Visual Cue: Cut back to host. Push-in zoom on host's face to emphasize the point.] | "[Spoken Dialogue]: This brings us to the next step. If you set this value too high, your server will freeze. If it's too low, users will wait forever. Here is how to find the sweet spot..." |
| **6:00 - 8:30**<br>Chapter 3: [Chapter Name] | [Visual Cue: B-roll of server monitoring dashboard showing a flatline turning into a healthy wave.] | "[Spoken Dialogue]: Once we applied this setting, look at what happened to the response times. They dropped from 800 milliseconds down to 45." |
| **8:30 - 9:00**<br>The Payoff | Show split screen: Before config vs After config load times. | "So, by changing just that one variable, we solved the crash problem completely without spending a single dollar on hardware upgrades." |
| **9:00 - 9:30**<br>Seamless CTA | [Visual Cue: On-screen card pops up pointing to a related video. Text overlay: 'Watch next: Scaling PostgreSQL Databases.'] | "[Spoken Dialogue]: Now that your server is configured correctly, your next bottleneck is going to be database indexing. Click on this video right here where I break down indexing in under 5 minutes..." |
---
### 4. Search-Optimized Metadata
- **Video Description:** [First 3 sentences containing key terms for search ranking. E.g., 'Learn how to optimize server performance and prevent database crashes. This step-by-step tutorial walks you through server configuration tweaks to save hosting costs.']
- **Suggested Tags:** server optimization, database configuration, web development, hosting costs, system architecture
- **Call-to-Action Link:** [Insert link to newsletter or product page]
---
## Quality Checks
- [ ] Every title option is under 60 characters to prevent truncation on mobile devices.
- [ ] No generic intro fillers (e.g., "Welcome back to my channel," "Don't forget to like and subscribe") in the first 60 seconds of any hook or script section.
- [ ] Visual direction (B-roll, text overlays, zoom adjustments) is specified at least once every 10 seconds in the main script.
- [ ] Script transitions to the Call to Action immediately after the payoff without declaring "in conclusion" or "thank you for watching."
- [ ] Spoken audio lines are written in conversational language (short sentences, natural pauses, no overly academic jargon).
## Anti-Patterns
- [ ] Do not write paragraphs of dialogue without accompanying visual cues. YouTube is a visual-first medium; every paragraph of speech needs visual transitions.
- [ ] Do not pitch sponsors, channel subscriptions, or external links during the hook (first 60 seconds).
- [ ] Do not create a single generic hook; always provide 3 distinct hook variations (Contrarian, Story, Pattern Interrupt) to give the creator flexibility.
- [ ] Do not use a generic outro that triggers the "viewer exit ramp" (e.g., "That's all for today's video, hope you enjoyed, see you next time!"). Suggest another video to keep viewers on the platform.
## Example Trigger Phrases
- "Write a YouTube script about my personal productivity system."
- "Help me script a 10-minute video explaining inflation to college students."
- "I need a YouTube outline and script for a tutorial on clean code in Python."
- "Draft a retention-optimized YouTube script on how to build a SaaS in 2026."
@@ -81,6 +81,29 @@ Recommend building: all Basic features first → Performance features for key us
---
## Programmatic Helper
This skill ships with a stdlib-only Python script that computes ranking for the math-based frameworks (RICE, ICE) so feature scoring is consistent across sessions.
```bash
# RICE from JSON
python3 scripts/feature_prioritisation.py initiatives.json --framework rice
# RICE from CSV
python3 scripts/feature_prioritisation.py initiatives.csv --framework rice --format csv
# ICE from JSON
python3 scripts/feature_prioritisation.py features.json --framework ice
# Pipe into it
printf '%s\n' '[{"name":"API refactor","impact":8,"confidence":80,"ease":5}]' \
| python3 scripts/feature_prioritisation.py --framework ice -
```
Use `--json` to produce machine-readable output for downstream tooling.
---
## Output Format
### Feature Prioritisation — [Product/Team] — [Date]
+2 -1
View File
@@ -3,7 +3,7 @@
> Auto-generated from `skills/*/SKILL.md` by `scripts/build-exports.mjs`.
> **Do not edit these files by hand** — edit the source skill and regenerate.
173 skills exported. Copy a `GEM_INSTRUCTIONS.md` into the tool to use it.
174 skills exported. Copy a `GEM_INSTRUCTIONS.md` into the tool to use it.
| Skill | Bundle | Path |
|---|---|---|
@@ -180,3 +180,4 @@
| Vendor Evaluation | `pm-operations` | `pm-operations/vendor-evaluation/GEM_INSTRUCTIONS.md` |
| Viral Content Framework | `pm-social` | `pm-social/viral-content-framework/GEM_INSTRUCTIONS.md` |
| Workshop Facilitation Guide | `pm-operations` | `pm-operations/workshop-facilitation-guide/GEM_INSTRUCTIONS.md` |
| YouTube Script Writer | `other` | `other/youtube-script-writer/GEM_INSTRUCTIONS.md` |
@@ -0,0 +1,114 @@
You are a specialised assistant. Write engaging, high-retention YouTube video scripts with visual and audio cues. Use when asked to write a YouTube script, design a video outline, draft a video hook, or structure a video narrative. Produces a polished script with multiple hook options, step-by-step video body, and clear visual/audio directions.
Follow these instructions:
# YouTube Script Writer Skill
This skill helps creators write highly engaging, structured, and visually-dynamic scripts optimized for YouTube's retention algorithm. It converts raw ideas, articles, or transcripts into a ready-to-shoot script with clear visual cues, pacing indicators, and audio directions.
## What This Skill Produces
- **3 Title & Thumbnail Concepts:** CTR-optimized titles matching distinct psychological triggers (curiosity, result-driven, contrarian) paired with clear visual thumbnail layout suggestions.
- **3 Hook Variations (0:00 - 0:30):** Different hook formats (contrarian statement, story setup, pattern interrupt) that deliver immediately on the title's promise.
- **Retention-Optimized Script Table:** A side-by-side or block-formatted script separating video cues (B-roll, camera angles, text overlays, zooms) and audio cues (dialogue, voiceover, sound effects, music changes).
- **Outro & Video Metadata:** A seamless video outro designed to prevent viewer exit, along with search-optimized description templates and relevant tags.
## Required Inputs
Ask the user for these if not provided:
- **Topic/Concept** — What is the video about? (e.g., "How I built a SaaS in 30 days")
- **Target Audience** — Who is watching? (e.g., beginner developers, student designers)
- **Target Duration** — Approximate length in minutes (e.g., 5-7 minutes, 10-15 minutes)
- **Script Tone/Voice** — E.g., energetic, educational, storytelling, conversational, comedic
- **Primary Goal** — (e.g., get newsletter signups, sell a course, increase viewer retention)
## Pacing & Retention Model
Every YouTube script must follow this structure to prevent early drop-off:
1. **The Hook (0:00 - 0:30):** Promise immediate value. No intros, no logo animation, and no generic greeting ("Hey guys, welcome back...").
2. **The Stakes / Re-Hook (0:30 - 1:00):** Establish why this topic is difficult, urgent, or valuable. Introduce the "villain" (the problem) and the "hero" (the solution).
3. **Chapters / Milestones (1:00 - 90% mark):** Divide the core content into 3-5 distinct chapters. Every chapter must have a clear micro-payoff.
4. **Pattern Interrupts:** Suggest visual or audio changes every 4-8 seconds. Use zoomed frames, pop-up text, B-roll transitions, or sound effects (whoosh, ding, pop) to keep attention.
5. **The Payoff / Climax (90% - 95% mark):** Deliver the ultimate piece of advice or final revelation promised in the hook.
6. **Seamless Transition CTA (95% - end):** Never signal the end with "in conclusion" or "that is all." Bridge the final value point directly to recommending the next video or a quick call to action before the viewer leaves.
---
## Output Format
### [Working Title]
**Target Duration:** [Duration] | **Audience:** [Target Audience] | **Tone:** [Tone]
---
### 1. Title & Thumbnail Optimization
#### Title Options
1. **The Curiosity Gap:** [e.g., "The Real Reason Your Code is Slow (It's Not Python)"]
2. **The Result-Oriented:** [e.g., "How I Optimized My App to Handle 100k Users in 1 Hour"]
3. **The Contrarian:** [e.g., "Stop Using React for Simple Projects"]
#### Thumbnail Concepts
- **Concept 1:** [Visual details, e.g., Close-up of host with a worried face, split-screen showing a massive red 'Error' banner on one side and a clean green checkmark on the other. Large, bold 3-word text overlay: "STOP DOING THIS."]
- **Concept 2:** [Visual details, e.g., Clean graphic representation of a server load graph spiking to the moon, contrasted with a flat green line. Text overlay: "100K USERS."]
---
### 2. Hook Variations (Choose One)
#### Variation 1: The Contrarian Hook
* **Visuals:** [Host leans close to the camera, looking directly into the lens. Fast zoom-in on the word 'Slow' appearing in bold red letters on screen.]
* **Audio:** "Almost every developer I talk to blames Python for their slow apps. But 90% of the time, the language isn't the problem. The bottleneck is actually inside a single line of config you probably wrote yesterday."
#### Variation 2: The Story Hook
* **Visuals:** [Show B-roll of an editor showing 500 error logs flashing. Cut to host rubbing their forehead in frustration.]
* **Audio:** "Last Tuesday at 3 AM, our database completely crashed under load. We were losing $200 every minute the site was down. After searching through stack traces for hours, we found a fix so simple I couldn't believe we missed it."
#### Variation 3: The Pattern Interrupt Hook
* **Visuals:** [A stopwatch counts down from 5 seconds in the center of the screen. Sudden loud 'Ding' sound effect as the timer hits zero.]
* **Audio (Voiceover):** "In the next 5 minutes, I am going to show you the exact performance tweak that saved our team $4,000 in monthly server costs. And no, you don't need to rewrite a single database query."
---
### 3. The Main Script
| Time / Chapter | Video Cues (B-Roll, Overlays, Camera Angles) | Audio Cues (Spoken Script, Sound Effects, Music) |
| :--- | :--- | :--- |
| **0:30 - 1:00**<br>The Re-Hook | Show on-screen graphics displaying server costs. Zoom in slightly on the host. | "Here is the reality: database optimization sounds incredibly complex. But most tutorials make you learn SQL queries you will never use. Today, we are keeping it purely practical." |
| **1:00 - 3:30**<br>Chapter 1: [Chapter Name] | [Visual Cue: Transition to screencast. Highlight lines 12-15 in the config file. Add cursor highlight.] | "[Spoken Dialogue]: First, let's open up the default configuration file. Notice this specific pool size limit... *[Sound Effect: soft click]*" |
| **3:30 - 6:00**<br>Chapter 2: [Chapter Name] | [Visual Cue: Cut back to host. Push-in zoom on host's face to emphasize the point.] | "[Spoken Dialogue]: This brings us to the next step. If you set this value too high, your server will freeze. If it's too low, users will wait forever. Here is how to find the sweet spot..." |
| **6:00 - 8:30**<br>Chapter 3: [Chapter Name] | [Visual Cue: B-roll of server monitoring dashboard showing a flatline turning into a healthy wave.] | "[Spoken Dialogue]: Once we applied this setting, look at what happened to the response times. They dropped from 800 milliseconds down to 45." |
| **8:30 - 9:00**<br>The Payoff | Show split screen: Before config vs After config load times. | "So, by changing just that one variable, we solved the crash problem completely without spending a single dollar on hardware upgrades." |
| **9:00 - 9:30**<br>Seamless CTA | [Visual Cue: On-screen card pops up pointing to a related video. Text overlay: 'Watch next: Scaling PostgreSQL Databases.'] | "[Spoken Dialogue]: Now that your server is configured correctly, your next bottleneck is going to be database indexing. Click on this video right here where I break down indexing in under 5 minutes..." |
---
### 4. Search-Optimized Metadata
- **Video Description:** [First 3 sentences containing key terms for search ranking. E.g., 'Learn how to optimize server performance and prevent database crashes. This step-by-step tutorial walks you through server configuration tweaks to save hosting costs.']
- **Suggested Tags:** server optimization, database configuration, web development, hosting costs, system architecture
- **Call-to-Action Link:** [Insert link to newsletter or product page]
---
## Quality Checks
- [ ] Every title option is under 60 characters to prevent truncation on mobile devices.
- [ ] No generic intro fillers (e.g., "Welcome back to my channel," "Don't forget to like and subscribe") in the first 60 seconds of any hook or script section.
- [ ] Visual direction (B-roll, text overlays, zoom adjustments) is specified at least once every 10 seconds in the main script.
- [ ] Script transitions to the Call to Action immediately after the payoff without declaring "in conclusion" or "thank you for watching."
- [ ] Spoken audio lines are written in conversational language (short sentences, natural pauses, no overly academic jargon).
## Anti-Patterns
- [ ] Do not write paragraphs of dialogue without accompanying visual cues. YouTube is a visual-first medium; every paragraph of speech needs visual transitions.
- [ ] Do not pitch sponsors, channel subscriptions, or external links during the hook (first 60 seconds).
- [ ] Do not create a single generic hook; always provide 3 distinct hook variations (Contrarian, Story, Pattern Interrupt) to give the creator flexibility.
- [ ] Do not use a generic outro that triggers the "viewer exit ramp" (e.g., "That's all for today's video, hope you enjoyed, see you next time!"). Suggest another video to keep viewers on the platform.
## Example Trigger Phrases
- "Write a YouTube script about my personal productivity system."
- "Help me script a 10-minute video explaining inflation to college students."
- "I need a YouTube outline and script for a tutorial on clean code in Python."
- "Draft a retention-optimized YouTube script on how to build a SaaS in 2026."
@@ -79,6 +79,29 @@ Recommend building: all Basic features first → Performance features for key us
---
## Programmatic Helper
This skill ships with a stdlib-only Python script that computes ranking for the math-based frameworks (RICE, ICE) so feature scoring is consistent across sessions.
```bash
# RICE from JSON
python3 scripts/feature_prioritisation.py initiatives.json --framework rice
# RICE from CSV
python3 scripts/feature_prioritisation.py initiatives.csv --framework rice --format csv
# ICE from JSON
python3 scripts/feature_prioritisation.py features.json --framework ice
# Pipe into it
printf '%s\n' '[{"name":"API refactor","impact":8,"confidence":80,"ease":5}]' \
| python3 scripts/feature_prioritisation.py --framework ice -
```
Use `--json` to produce machine-readable output for downstream tooling.
---
## Output Format
### Feature Prioritisation — [Product/Team] — [Date]
+2 -1
View File
@@ -3,7 +3,7 @@
> Auto-generated from `skills/*/SKILL.md` by `scripts/build-exports.mjs`.
> **Do not edit these files by hand** — edit the source skill and regenerate.
173 skills exported. Copy a `.mdc rule` into the tool to use it.
174 skills exported. Copy a `.mdc rule` into the tool to use it.
| Skill | Bundle | Path |
|---|---|---|
@@ -180,3 +180,4 @@
| Vendor Evaluation | `pm-operations` | `pm-operations/vendor-evaluation/vendor-evaluation.md` |
| Viral Content Framework | `pm-social` | `pm-social/viral-content-framework/viral-content-framework.md` |
| Workshop Facilitation Guide | `pm-operations` | `pm-operations/workshop-facilitation-guide/workshop-facilitation-guide.md` |
| YouTube Script Writer | `other` | `other/youtube-script-writer/youtube-script-writer.md` |
@@ -0,0 +1,115 @@
---
trigger: model_decision
description: "Write engaging, high-retention YouTube video scripts with visual and audio cues. Use when asked to write a YouTube script, design a video outline, draft a video hook, or structure a video narrative. Produces a polished script with multiple hook options, step-by-step video body, and clear visual/audio directions."
---
# YouTube Script Writer Skill
This skill helps creators write highly engaging, structured, and visually-dynamic scripts optimized for YouTube's retention algorithm. It converts raw ideas, articles, or transcripts into a ready-to-shoot script with clear visual cues, pacing indicators, and audio directions.
## What This Skill Produces
- **3 Title & Thumbnail Concepts:** CTR-optimized titles matching distinct psychological triggers (curiosity, result-driven, contrarian) paired with clear visual thumbnail layout suggestions.
- **3 Hook Variations (0:00 - 0:30):** Different hook formats (contrarian statement, story setup, pattern interrupt) that deliver immediately on the title's promise.
- **Retention-Optimized Script Table:** A side-by-side or block-formatted script separating video cues (B-roll, camera angles, text overlays, zooms) and audio cues (dialogue, voiceover, sound effects, music changes).
- **Outro & Video Metadata:** A seamless video outro designed to prevent viewer exit, along with search-optimized description templates and relevant tags.
## Required Inputs
Ask the user for these if not provided:
- **Topic/Concept** — What is the video about? (e.g., "How I built a SaaS in 30 days")
- **Target Audience** — Who is watching? (e.g., beginner developers, student designers)
- **Target Duration** — Approximate length in minutes (e.g., 5-7 minutes, 10-15 minutes)
- **Script Tone/Voice** — E.g., energetic, educational, storytelling, conversational, comedic
- **Primary Goal** — (e.g., get newsletter signups, sell a course, increase viewer retention)
## Pacing & Retention Model
Every YouTube script must follow this structure to prevent early drop-off:
1. **The Hook (0:00 - 0:30):** Promise immediate value. No intros, no logo animation, and no generic greeting ("Hey guys, welcome back...").
2. **The Stakes / Re-Hook (0:30 - 1:00):** Establish why this topic is difficult, urgent, or valuable. Introduce the "villain" (the problem) and the "hero" (the solution).
3. **Chapters / Milestones (1:00 - 90% mark):** Divide the core content into 3-5 distinct chapters. Every chapter must have a clear micro-payoff.
4. **Pattern Interrupts:** Suggest visual or audio changes every 4-8 seconds. Use zoomed frames, pop-up text, B-roll transitions, or sound effects (whoosh, ding, pop) to keep attention.
5. **The Payoff / Climax (90% - 95% mark):** Deliver the ultimate piece of advice or final revelation promised in the hook.
6. **Seamless Transition CTA (95% - end):** Never signal the end with "in conclusion" or "that is all." Bridge the final value point directly to recommending the next video or a quick call to action before the viewer leaves.
---
## Output Format
### [Working Title]
**Target Duration:** [Duration] | **Audience:** [Target Audience] | **Tone:** [Tone]
---
### 1. Title & Thumbnail Optimization
#### Title Options
1. **The Curiosity Gap:** [e.g., "The Real Reason Your Code is Slow (It's Not Python)"]
2. **The Result-Oriented:** [e.g., "How I Optimized My App to Handle 100k Users in 1 Hour"]
3. **The Contrarian:** [e.g., "Stop Using React for Simple Projects"]
#### Thumbnail Concepts
- **Concept 1:** [Visual details, e.g., Close-up of host with a worried face, split-screen showing a massive red 'Error' banner on one side and a clean green checkmark on the other. Large, bold 3-word text overlay: "STOP DOING THIS."]
- **Concept 2:** [Visual details, e.g., Clean graphic representation of a server load graph spiking to the moon, contrasted with a flat green line. Text overlay: "100K USERS."]
---
### 2. Hook Variations (Choose One)
#### Variation 1: The Contrarian Hook
* **Visuals:** [Host leans close to the camera, looking directly into the lens. Fast zoom-in on the word 'Slow' appearing in bold red letters on screen.]
* **Audio:** "Almost every developer I talk to blames Python for their slow apps. But 90% of the time, the language isn't the problem. The bottleneck is actually inside a single line of config you probably wrote yesterday."
#### Variation 2: The Story Hook
* **Visuals:** [Show B-roll of an editor showing 500 error logs flashing. Cut to host rubbing their forehead in frustration.]
* **Audio:** "Last Tuesday at 3 AM, our database completely crashed under load. We were losing $200 every minute the site was down. After searching through stack traces for hours, we found a fix so simple I couldn't believe we missed it."
#### Variation 3: The Pattern Interrupt Hook
* **Visuals:** [A stopwatch counts down from 5 seconds in the center of the screen. Sudden loud 'Ding' sound effect as the timer hits zero.]
* **Audio (Voiceover):** "In the next 5 minutes, I am going to show you the exact performance tweak that saved our team $4,000 in monthly server costs. And no, you don't need to rewrite a single database query."
---
### 3. The Main Script
| Time / Chapter | Video Cues (B-Roll, Overlays, Camera Angles) | Audio Cues (Spoken Script, Sound Effects, Music) |
| :--- | :--- | :--- |
| **0:30 - 1:00**<br>The Re-Hook | Show on-screen graphics displaying server costs. Zoom in slightly on the host. | "Here is the reality: database optimization sounds incredibly complex. But most tutorials make you learn SQL queries you will never use. Today, we are keeping it purely practical." |
| **1:00 - 3:30**<br>Chapter 1: [Chapter Name] | [Visual Cue: Transition to screencast. Highlight lines 12-15 in the config file. Add cursor highlight.] | "[Spoken Dialogue]: First, let's open up the default configuration file. Notice this specific pool size limit... *[Sound Effect: soft click]*" |
| **3:30 - 6:00**<br>Chapter 2: [Chapter Name] | [Visual Cue: Cut back to host. Push-in zoom on host's face to emphasize the point.] | "[Spoken Dialogue]: This brings us to the next step. If you set this value too high, your server will freeze. If it's too low, users will wait forever. Here is how to find the sweet spot..." |
| **6:00 - 8:30**<br>Chapter 3: [Chapter Name] | [Visual Cue: B-roll of server monitoring dashboard showing a flatline turning into a healthy wave.] | "[Spoken Dialogue]: Once we applied this setting, look at what happened to the response times. They dropped from 800 milliseconds down to 45." |
| **8:30 - 9:00**<br>The Payoff | Show split screen: Before config vs After config load times. | "So, by changing just that one variable, we solved the crash problem completely without spending a single dollar on hardware upgrades." |
| **9:00 - 9:30**<br>Seamless CTA | [Visual Cue: On-screen card pops up pointing to a related video. Text overlay: 'Watch next: Scaling PostgreSQL Databases.'] | "[Spoken Dialogue]: Now that your server is configured correctly, your next bottleneck is going to be database indexing. Click on this video right here where I break down indexing in under 5 minutes..." |
---
### 4. Search-Optimized Metadata
- **Video Description:** [First 3 sentences containing key terms for search ranking. E.g., 'Learn how to optimize server performance and prevent database crashes. This step-by-step tutorial walks you through server configuration tweaks to save hosting costs.']
- **Suggested Tags:** server optimization, database configuration, web development, hosting costs, system architecture
- **Call-to-Action Link:** [Insert link to newsletter or product page]
---
## Quality Checks
- [ ] Every title option is under 60 characters to prevent truncation on mobile devices.
- [ ] No generic intro fillers (e.g., "Welcome back to my channel," "Don't forget to like and subscribe") in the first 60 seconds of any hook or script section.
- [ ] Visual direction (B-roll, text overlays, zoom adjustments) is specified at least once every 10 seconds in the main script.
- [ ] Script transitions to the Call to Action immediately after the payoff without declaring "in conclusion" or "thank you for watching."
- [ ] Spoken audio lines are written in conversational language (short sentences, natural pauses, no overly academic jargon).
## Anti-Patterns
- [ ] Do not write paragraphs of dialogue without accompanying visual cues. YouTube is a visual-first medium; every paragraph of speech needs visual transitions.
- [ ] Do not pitch sponsors, channel subscriptions, or external links during the hook (first 60 seconds).
- [ ] Do not create a single generic hook; always provide 3 distinct hook variations (Contrarian, Story, Pattern Interrupt) to give the creator flexibility.
- [ ] Do not use a generic outro that triggers the "viewer exit ramp" (e.g., "That's all for today's video, hope you enjoyed, see you next time!"). Suggest another video to keep viewers on the platform.
## Example Trigger Phrases
- "Write a YouTube script about my personal productivity system."
- "Help me script a 10-minute video explaining inflation to college students."
- "I need a YouTube outline and script for a tutorial on clean code in Python."
- "Draft a retention-optimized YouTube script on how to build a SaaS in 2026."
@@ -80,6 +80,29 @@ Recommend building: all Basic features first → Performance features for key us
---
## Programmatic Helper
This skill ships with a stdlib-only Python script that computes ranking for the math-based frameworks (RICE, ICE) so feature scoring is consistent across sessions.
```bash
# RICE from JSON
python3 scripts/feature_prioritisation.py initiatives.json --framework rice
# RICE from CSV
python3 scripts/feature_prioritisation.py initiatives.csv --framework rice --format csv
# ICE from JSON
python3 scripts/feature_prioritisation.py features.json --framework ice
# Pipe into it
printf '%s\n' '[{"name":"API refactor","impact":8,"confidence":80,"ease":5}]' \
| python3 scripts/feature_prioritisation.py --framework ice -
```
Use `--json` to produce machine-readable output for downstream tooling.
---
## Output Format
### Feature Prioritisation — [Product/Team] — [Date]
+1
View File
@@ -166,6 +166,7 @@ function handle(msg) {
}
process.stderr.write(`[${SERVER_NAME}] MCP server ready — ${SKILLS.length} skills, ${TOOLS.length} tools.\n`);
process.stderr.write(`[${SERVER_NAME}] ⭐ Star the repo: https://github.com/mohitagw15856/pm-claude-skills\n`);
const rl = createInterface({ input: process.stdin });
rl.on('line', (line) => {
const s = line.trim();
+7 -3
View File
@@ -1,8 +1,8 @@
{
"name": "pm-claude-skills",
"version": "20.0.0",
"version": "20.2.0",
"type": "module",
"description": "167 professional Agent Skills (SKILL.md) + subagents + slash commands for Claude, ChatGPT, Gemini, Cursor, Codex & Hermes. Install into any AI coding tool with: npx pm-claude-skills add --agent <tool>.",
"description": "174 professional Agent Skills (SKILL.md) + subagents + slash commands for Claude, ChatGPT, Gemini, Cursor, Codex & Hermes. Install into any AI coding tool with: npx pm-claude-skills add --agent <tool>.",
"keywords": [
"claude",
"claude-code",
@@ -29,6 +29,10 @@
"bugs": {
"url": "https://github.com/mohitagw15856/pm-claude-skills/issues"
},
"funding": {
"type": "github",
"url": "https://github.com/mohitagw15856/pm-claude-skills"
},
"author": "Mohit Aggarwal",
"bin": {
"pm-claude-skills": "bin/cli.mjs",
@@ -49,7 +53,7 @@
"skillcheck": "node scripts/skillcheck.mjs",
"build:exports": "node scripts/build-exports.mjs",
"build:web": "node web/build-skills.mjs",
"check": "node scripts/skillcheck.mjs && node scripts/build-exports.mjs --check"
"check": "node scripts/skillcheck.mjs && node scripts/build-exports.mjs --check && node web/build-skills.mjs && git diff --exit-code -- web/skills.json"
},
"engines": {
"node": ">=18"
@@ -80,6 +80,29 @@ Recommend building: all Basic features first → Performance features for key us
---
## Programmatic Helper
This skill ships with a stdlib-only Python script that computes ranking for the math-based frameworks (RICE, ICE) so feature scoring is consistent across sessions.
```bash
# RICE from JSON
python3 scripts/feature_prioritisation.py initiatives.json --framework rice
# RICE from CSV
python3 scripts/feature_prioritisation.py initiatives.csv --framework rice --format csv
# ICE from JSON
python3 scripts/feature_prioritisation.py features.json --framework ice
# Pipe into it
printf '%s\n' '[{"name":"API refactor","impact":8,"confidence":80,"ease":5}]' \
| python3 scripts/feature_prioritisation.py --framework ice -
```
Use `--json` to produce machine-readable output for downstream tooling.
---
## Output Format
### Feature Prioritisation — [Product/Team] — [Date]
@@ -0,0 +1,193 @@
#!/usr/bin/env python3
"""Feature prioritisation helper for the feature-prioritisation skill.
Computes ranking for common scoring frameworks so the same formulas and ordering
are applied consistently. Supports RICE and ICE with JSON input.
Input formats:
- JSON list (default): each item includes `name` and framework-specific fields.
- CSV: header-driven input when using --format csv.
RICE fields:
name,reach,impact,confidence,effort
ICE fields:
name,impact,confidence,ease
Examples:
python3 feature_prioritisation.py --framework rice initiatives.json
python3 feature_prioritisation.py initiatives.csv --framework rice --format csv
printf '%s\n' '[{"name":"API refactor","impact":8,"confidence":80,"ease":5}]' \
| python3 feature_prioritisation.py --framework ice -
"""
from __future__ import annotations
import argparse
import csv
import io
import json
import sys
from dataclasses import dataclass
@dataclass
class Feature:
name: str
scores: dict[str, float]
def rice_score(self) -> float:
return (self.scores["reach"] * self.scores["impact"] * self.scores["confidence"]) / self.scores["effort"]
def ice_score(self) -> float:
return self.scores["impact"] + self.scores["confidence"] + self.scores["ease"]
def _normalise_confidence(value: float, framework: str) -> float:
"""Normalize confidence depending on framework conventions."""
if framework == "rice":
return value / 100.0 if value > 1 else value
# ICE uses a 1-10 convention in this skill; accept 0-1 and 1-10, 80/100 as percent fallback.
if value > 1:
if value > 10:
return value / 10.0
return value
return value
def _to_feature(name: str, values: dict[str, object], framework: str) -> Feature:
try:
if framework == "rice":
reach = float(values["reach"])
effort = float(values["effort"])
if effort <= 0:
raise ValueError("effort must be greater than 0")
return Feature(
name=name,
scores={
"reach": reach,
"impact": float(values["impact"]),
"confidence": _normalise_confidence(float(values["confidence"]), "rice"),
"effort": effort,
},
)
# ICE
return Feature(
name=name,
scores={
"impact": float(values["impact"]),
"confidence": _normalise_confidence(float(values["confidence"]), "ice"),
"ease": float(values["ease"]),
},
)
except KeyError as exc:
raise ValueError(f"Missing required field {exc} in feature '{name}'.") from None
def load_rice_json(rows: list[dict[str, object]]) -> list[Feature]:
return [_to_feature(str(row["name"]).strip(), row, "rice") for row in rows]
def load_ice_json(rows: list[dict[str, object]]) -> list[Feature]:
return [_to_feature(str(row["name"]).strip(), row, "ice") for row in rows]
def _load_csv(text: str, framework: str) -> list[dict[str, str]]:
rows = list(csv.DictReader(io.StringIO(text)))
if not rows:
return []
expected = {"rice": {"name", "reach", "impact", "confidence", "effort"},
"ice": {"name", "impact", "confidence", "ease"}}
present = set(rows[0].keys())
missing = expected[framework] - present
if missing:
raise ValueError(f"CSV format missing required columns: {', '.join(sorted(missing))}")
return rows
def load(text: str, fmt: str, framework: str) -> list[Feature]:
if fmt == "csv":
rows = _load_csv(text, framework)
if framework == "rice":
return load_rice_json(rows)
return load_ice_json(rows)
rows = json.loads(text)
if not isinstance(rows, list):
raise ValueError("Input must be a list of feature objects.")
if framework == "rice":
return load_rice_json(rows)
return load_ice_json(rows)
def rank(features: list[Feature], framework: str) -> list[dict]:
scored = []
for feature in features:
score = feature.rice_score() if framework == "rice" else feature.ice_score()
row = {"name": feature.name, "score": round(float(score), 2)}
row.update({k: v for k, v in feature.scores.items() if k != "score"})
scored.append(row)
scored.sort(key=lambda d: d["score"], reverse=True)
for index, row in enumerate(scored, start=1):
row["rank"] = index
return scored
def _render(ranked: list[dict], framework: str) -> str:
if framework == "rice":
header = f"{'#':>2} {'Feature':<30} {'Reach':>10} {'Impact':>7} {'Conf':>7} {'Effort':>7} {'RICE':>8}"
lines = ["Feature Prioritisation (RICE)", "=" * len(header), header, "-" * len(header)]
for row in ranked:
lines.append(
f"{row['rank']:>2} {row['name'][:30]:<30} "
f"{row['reach']:>10g} {row['impact']:>7g} {row['confidence']:>6.2f} {row['effort']:>7g} {row['score']:>8g}"
)
return "\n".join(lines)
header = f"{'#':>2} {'Feature':<30} {'Impact':>7} {'Conf':>7} {'Ease':>7} {'ICE':>8}"
lines = ["Feature Prioritisation (ICE)", "=" * len(header), header, "-" * len(header)]
for row in ranked:
lines.append(
f"{row['rank']:>2} {row['name'][:30]:<30} "
f"{row['impact']:>7g} {row['confidence']:>6.2f} {row['ease']:>7g} {row['score']:>8g}"
)
return "\n".join(lines)
def main(argv: list[str] | None = None) -> int:
parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter)
parser.add_argument("input", help="Path to input JSON/CSV file, or '-' for stdin.")
parser.add_argument("--framework", choices=["rice", "ice"], default="rice",
help="Scoring framework to use.")
parser.add_argument("--format", choices=["json", "csv"], help="Input format (inferred from extension when omitted).")
parser.add_argument("--json", action="store_true", dest="as_json", help="Emit ranked JSON instead of a table.")
args = parser.parse_args(argv)
if args.input == "-":
text = sys.stdin.read()
fmt = args.format or "json"
else:
try:
with open(args.input, "r", encoding="utf-8") as f:
text = f.read()
except OSError as exc:
print(f"Error: {exc}", file=sys.stderr)
return 1
if args.format:
fmt = args.format
else:
fmt = "csv" if args.input.lower().endswith(".csv") else "json"
try:
ranked = rank(load(text, fmt, args.framework), args.framework)
except (ValueError, json.JSONDecodeError, KeyError) as exc:
print(f"Error: {exc}", file=sys.stderr)
return 1
print(json.dumps(ranked, indent=2) if args.as_json else _render(ranked, args.framework))
return 0
if __name__ == "__main__":
raise SystemExit(main())
+4 -2
View File
@@ -22,10 +22,12 @@ const strict = args.includes('--strict');
const asJson = args.includes('--json');
function parseFrontmatter(text) {
const m = text.match(/^---\n([\s\S]*?)\n---\n?([\s\S]*)$/);
// Tolerate optional leading whitespace and CRLF/LF line endings so authored-on-Windows
// files don't produce false negatives.
const m = text.match(/^\s*---\r?\n([\s\S]*?)\r?\n\s*---\r?\n?([\s\S]*)$/);
if (!m) return { meta: null, body: text };
const meta = {};
for (const line of m[1].split('\n')) {
for (const line of m[1].split(/\r?\n/)) {
const kv = line.match(/^(\w[\w-]*):\s*(.*)$/);
if (kv) {
let v = kv[2].trim();
+2 -1
View File
@@ -58,6 +58,7 @@
"morning-intelligence",
"last-30-days-research",
"competitor-signal-tracker",
"multi-source-signal-synthesiser"
"multi-source-signal-synthesiser",
"youtube-script-writer"
]
}
+23
View File
@@ -80,6 +80,29 @@ Recommend building: all Basic features first → Performance features for key us
---
## Programmatic Helper
This skill ships with a stdlib-only Python script that computes ranking for the math-based frameworks (RICE, ICE) so feature scoring is consistent across sessions.
```bash
# RICE from JSON
python3 scripts/feature_prioritisation.py initiatives.json --framework rice
# RICE from CSV
python3 scripts/feature_prioritisation.py initiatives.csv --framework rice --format csv
# ICE from JSON
python3 scripts/feature_prioritisation.py features.json --framework ice
# Pipe into it
printf '%s\n' '[{"name":"API refactor","impact":8,"confidence":80,"ease":5}]' \
| python3 scripts/feature_prioritisation.py --framework ice -
```
Use `--json` to produce machine-readable output for downstream tooling.
---
## Output Format
### Feature Prioritisation — [Product/Team] — [Date]
@@ -0,0 +1,193 @@
#!/usr/bin/env python3
"""Feature prioritisation helper for the feature-prioritisation skill.
Computes ranking for common scoring frameworks so the same formulas and ordering
are applied consistently. Supports RICE and ICE with JSON input.
Input formats:
- JSON list (default): each item includes `name` and framework-specific fields.
- CSV: header-driven input when using --format csv.
RICE fields:
name,reach,impact,confidence,effort
ICE fields:
name,impact,confidence,ease
Examples:
python3 feature_prioritisation.py --framework rice initiatives.json
python3 feature_prioritisation.py initiatives.csv --framework rice --format csv
printf '%s\n' '[{"name":"API refactor","impact":8,"confidence":80,"ease":5}]' \
| python3 feature_prioritisation.py --framework ice -
"""
from __future__ import annotations
import argparse
import csv
import io
import json
import sys
from dataclasses import dataclass
@dataclass
class Feature:
name: str
scores: dict[str, float]
def rice_score(self) -> float:
return (self.scores["reach"] * self.scores["impact"] * self.scores["confidence"]) / self.scores["effort"]
def ice_score(self) -> float:
return self.scores["impact"] + self.scores["confidence"] + self.scores["ease"]
def _normalise_confidence(value: float, framework: str) -> float:
"""Normalize confidence depending on framework conventions."""
if framework == "rice":
return value / 100.0 if value > 1 else value
# ICE uses a 1-10 convention in this skill; accept 0-1 and 1-10, 80/100 as percent fallback.
if value > 1:
if value > 10:
return value / 10.0
return value
return value
def _to_feature(name: str, values: dict[str, object], framework: str) -> Feature:
try:
if framework == "rice":
reach = float(values["reach"])
effort = float(values["effort"])
if effort <= 0:
raise ValueError("effort must be greater than 0")
return Feature(
name=name,
scores={
"reach": reach,
"impact": float(values["impact"]),
"confidence": _normalise_confidence(float(values["confidence"]), "rice"),
"effort": effort,
},
)
# ICE
return Feature(
name=name,
scores={
"impact": float(values["impact"]),
"confidence": _normalise_confidence(float(values["confidence"]), "ice"),
"ease": float(values["ease"]),
},
)
except KeyError as exc:
raise ValueError(f"Missing required field {exc} in feature '{name}'.") from None
def load_rice_json(rows: list[dict[str, object]]) -> list[Feature]:
return [_to_feature(str(row["name"]).strip(), row, "rice") for row in rows]
def load_ice_json(rows: list[dict[str, object]]) -> list[Feature]:
return [_to_feature(str(row["name"]).strip(), row, "ice") for row in rows]
def _load_csv(text: str, framework: str) -> list[dict[str, str]]:
rows = list(csv.DictReader(io.StringIO(text)))
if not rows:
return []
expected = {"rice": {"name", "reach", "impact", "confidence", "effort"},
"ice": {"name", "impact", "confidence", "ease"}}
present = set(rows[0].keys())
missing = expected[framework] - present
if missing:
raise ValueError(f"CSV format missing required columns: {', '.join(sorted(missing))}")
return rows
def load(text: str, fmt: str, framework: str) -> list[Feature]:
if fmt == "csv":
rows = _load_csv(text, framework)
if framework == "rice":
return load_rice_json(rows)
return load_ice_json(rows)
rows = json.loads(text)
if not isinstance(rows, list):
raise ValueError("Input must be a list of feature objects.")
if framework == "rice":
return load_rice_json(rows)
return load_ice_json(rows)
def rank(features: list[Feature], framework: str) -> list[dict]:
scored = []
for feature in features:
score = feature.rice_score() if framework == "rice" else feature.ice_score()
row = {"name": feature.name, "score": round(float(score), 2)}
row.update({k: v for k, v in feature.scores.items() if k != "score"})
scored.append(row)
scored.sort(key=lambda d: d["score"], reverse=True)
for index, row in enumerate(scored, start=1):
row["rank"] = index
return scored
def _render(ranked: list[dict], framework: str) -> str:
if framework == "rice":
header = f"{'#':>2} {'Feature':<30} {'Reach':>10} {'Impact':>7} {'Conf':>7} {'Effort':>7} {'RICE':>8}"
lines = ["Feature Prioritisation (RICE)", "=" * len(header), header, "-" * len(header)]
for row in ranked:
lines.append(
f"{row['rank']:>2} {row['name'][:30]:<30} "
f"{row['reach']:>10g} {row['impact']:>7g} {row['confidence']:>6.2f} {row['effort']:>7g} {row['score']:>8g}"
)
return "\n".join(lines)
header = f"{'#':>2} {'Feature':<30} {'Impact':>7} {'Conf':>7} {'Ease':>7} {'ICE':>8}"
lines = ["Feature Prioritisation (ICE)", "=" * len(header), header, "-" * len(header)]
for row in ranked:
lines.append(
f"{row['rank']:>2} {row['name'][:30]:<30} "
f"{row['impact']:>7g} {row['confidence']:>6.2f} {row['ease']:>7g} {row['score']:>8g}"
)
return "\n".join(lines)
def main(argv: list[str] | None = None) -> int:
parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter)
parser.add_argument("input", help="Path to input JSON/CSV file, or '-' for stdin.")
parser.add_argument("--framework", choices=["rice", "ice"], default="rice",
help="Scoring framework to use.")
parser.add_argument("--format", choices=["json", "csv"], help="Input format (inferred from extension when omitted).")
parser.add_argument("--json", action="store_true", dest="as_json", help="Emit ranked JSON instead of a table.")
args = parser.parse_args(argv)
if args.input == "-":
text = sys.stdin.read()
fmt = args.format or "json"
else:
try:
with open(args.input, "r", encoding="utf-8") as f:
text = f.read()
except OSError as exc:
print(f"Error: {exc}", file=sys.stderr)
return 1
if args.format:
fmt = args.format
else:
fmt = "csv" if args.input.lower().endswith(".csv") else "json"
try:
ranked = rank(load(text, fmt, args.framework), args.framework)
except (ValueError, json.JSONDecodeError, KeyError) as exc:
print(f"Error: {exc}", file=sys.stderr)
return 1
print(json.dumps(ranked, indent=2) if args.as_json else _render(ranked, args.framework))
return 0
if __name__ == "__main__":
raise SystemExit(main())
+115
View File
@@ -0,0 +1,115 @@
---
name: youtube-script-writer
description: "Write engaging, high-retention YouTube video scripts with visual and audio cues. Use when asked to write a YouTube script, design a video outline, draft a video hook, or structure a video narrative. Produces a polished script with multiple hook options, step-by-step video body, and clear visual/audio directions."
---
# YouTube Script Writer Skill
This skill helps creators write highly engaging, structured, and visually-dynamic scripts optimized for YouTube's retention algorithm. It converts raw ideas, articles, or transcripts into a ready-to-shoot script with clear visual cues, pacing indicators, and audio directions.
## What This Skill Produces
- **3 Title & Thumbnail Concepts:** CTR-optimized titles matching distinct psychological triggers (curiosity, result-driven, contrarian) paired with clear visual thumbnail layout suggestions.
- **3 Hook Variations (0:00 - 0:30):** Different hook formats (contrarian statement, story setup, pattern interrupt) that deliver immediately on the title's promise.
- **Retention-Optimized Script Table:** A side-by-side or block-formatted script separating video cues (B-roll, camera angles, text overlays, zooms) and audio cues (dialogue, voiceover, sound effects, music changes).
- **Outro & Video Metadata:** A seamless video outro designed to prevent viewer exit, along with search-optimized description templates and relevant tags.
## Required Inputs
Ask the user for these if not provided:
- **Topic/Concept** — What is the video about? (e.g., "How I built a SaaS in 30 days")
- **Target Audience** — Who is watching? (e.g., beginner developers, student designers)
- **Target Duration** — Approximate length in minutes (e.g., 5-7 minutes, 10-15 minutes)
- **Script Tone/Voice** — E.g., energetic, educational, storytelling, conversational, comedic
- **Primary Goal** — (e.g., get newsletter signups, sell a course, increase viewer retention)
## Pacing & Retention Model
Every YouTube script must follow this structure to prevent early drop-off:
1. **The Hook (0:00 - 0:30):** Promise immediate value. No intros, no logo animation, and no generic greeting ("Hey guys, welcome back...").
2. **The Stakes / Re-Hook (0:30 - 1:00):** Establish why this topic is difficult, urgent, or valuable. Introduce the "villain" (the problem) and the "hero" (the solution).
3. **Chapters / Milestones (1:00 - 90% mark):** Divide the core content into 3-5 distinct chapters. Every chapter must have a clear micro-payoff.
4. **Pattern Interrupts:** Suggest visual or audio changes every 4-8 seconds. Use zoomed frames, pop-up text, B-roll transitions, or sound effects (whoosh, ding, pop) to keep attention.
5. **The Payoff / Climax (90% - 95% mark):** Deliver the ultimate piece of advice or final revelation promised in the hook.
6. **Seamless Transition CTA (95% - end):** Never signal the end with "in conclusion" or "that is all." Bridge the final value point directly to recommending the next video or a quick call to action before the viewer leaves.
---
## Output Format
### [Working Title]
**Target Duration:** [Duration] | **Audience:** [Target Audience] | **Tone:** [Tone]
---
### 1. Title & Thumbnail Optimization
#### Title Options
1. **The Curiosity Gap:** [e.g., "The Real Reason Your Code is Slow (It's Not Python)"]
2. **The Result-Oriented:** [e.g., "How I Optimized My App to Handle 100k Users in 1 Hour"]
3. **The Contrarian:** [e.g., "Stop Using React for Simple Projects"]
#### Thumbnail Concepts
- **Concept 1:** [Visual details, e.g., Close-up of host with a worried face, split-screen showing a massive red 'Error' banner on one side and a clean green checkmark on the other. Large, bold 3-word text overlay: "STOP DOING THIS."]
- **Concept 2:** [Visual details, e.g., Clean graphic representation of a server load graph spiking to the moon, contrasted with a flat green line. Text overlay: "100K USERS."]
---
### 2. Hook Variations (Choose One)
#### Variation 1: The Contrarian Hook
* **Visuals:** [Host leans close to the camera, looking directly into the lens. Fast zoom-in on the word 'Slow' appearing in bold red letters on screen.]
* **Audio:** "Almost every developer I talk to blames Python for their slow apps. But 90% of the time, the language isn't the problem. The bottleneck is actually inside a single line of config you probably wrote yesterday."
#### Variation 2: The Story Hook
* **Visuals:** [Show B-roll of an editor showing 500 error logs flashing. Cut to host rubbing their forehead in frustration.]
* **Audio:** "Last Tuesday at 3 AM, our database completely crashed under load. We were losing $200 every minute the site was down. After searching through stack traces for hours, we found a fix so simple I couldn't believe we missed it."
#### Variation 3: The Pattern Interrupt Hook
* **Visuals:** [A stopwatch counts down from 5 seconds in the center of the screen. Sudden loud 'Ding' sound effect as the timer hits zero.]
* **Audio (Voiceover):** "In the next 5 minutes, I am going to show you the exact performance tweak that saved our team $4,000 in monthly server costs. And no, you don't need to rewrite a single database query."
---
### 3. The Main Script
| Time / Chapter | Video Cues (B-Roll, Overlays, Camera Angles) | Audio Cues (Spoken Script, Sound Effects, Music) |
| :--- | :--- | :--- |
| **0:30 - 1:00**<br>The Re-Hook | Show on-screen graphics displaying server costs. Zoom in slightly on the host. | "Here is the reality: database optimization sounds incredibly complex. But most tutorials make you learn SQL queries you will never use. Today, we are keeping it purely practical." |
| **1:00 - 3:30**<br>Chapter 1: [Chapter Name] | [Visual Cue: Transition to screencast. Highlight lines 12-15 in the config file. Add cursor highlight.] | "[Spoken Dialogue]: First, let's open up the default configuration file. Notice this specific pool size limit... *[Sound Effect: soft click]*" |
| **3:30 - 6:00**<br>Chapter 2: [Chapter Name] | [Visual Cue: Cut back to host. Push-in zoom on host's face to emphasize the point.] | "[Spoken Dialogue]: This brings us to the next step. If you set this value too high, your server will freeze. If it's too low, users will wait forever. Here is how to find the sweet spot..." |
| **6:00 - 8:30**<br>Chapter 3: [Chapter Name] | [Visual Cue: B-roll of server monitoring dashboard showing a flatline turning into a healthy wave.] | "[Spoken Dialogue]: Once we applied this setting, look at what happened to the response times. They dropped from 800 milliseconds down to 45." |
| **8:30 - 9:00**<br>The Payoff | Show split screen: Before config vs After config load times. | "So, by changing just that one variable, we solved the crash problem completely without spending a single dollar on hardware upgrades." |
| **9:00 - 9:30**<br>Seamless CTA | [Visual Cue: On-screen card pops up pointing to a related video. Text overlay: 'Watch next: Scaling PostgreSQL Databases.'] | "[Spoken Dialogue]: Now that your server is configured correctly, your next bottleneck is going to be database indexing. Click on this video right here where I break down indexing in under 5 minutes..." |
---
### 4. Search-Optimized Metadata
- **Video Description:** [First 3 sentences containing key terms for search ranking. E.g., 'Learn how to optimize server performance and prevent database crashes. This step-by-step tutorial walks you through server configuration tweaks to save hosting costs.']
- **Suggested Tags:** server optimization, database configuration, web development, hosting costs, system architecture
- **Call-to-Action Link:** [Insert link to newsletter or product page]
---
## Quality Checks
- [ ] Every title option is under 60 characters to prevent truncation on mobile devices.
- [ ] No generic intro fillers (e.g., "Welcome back to my channel," "Don't forget to like and subscribe") in the first 60 seconds of any hook or script section.
- [ ] Visual direction (B-roll, text overlays, zoom adjustments) is specified at least once every 10 seconds in the main script.
- [ ] Script transitions to the Call to Action immediately after the payoff without declaring "in conclusion" or "thank you for watching."
- [ ] Spoken audio lines are written in conversational language (short sentences, natural pauses, no overly academic jargon).
## Anti-Patterns
- [ ] Do not write paragraphs of dialogue without accompanying visual cues. YouTube is a visual-first medium; every paragraph of speech needs visual transitions.
- [ ] Do not pitch sponsors, channel subscriptions, or external links during the hook (first 60 seconds).
- [ ] Do not create a single generic hook; always provide 3 distinct hook variations (Contrarian, Story, Pattern Interrupt) to give the creator flexibility.
- [ ] Do not use a generic outro that triggers the "viewer exit ramp" (e.g., "That's all for today's video, hope you enjoyed, see you next time!"). Suggest another video to keep viewers on the platform.
## Example Trigger Phrases
- "Write a YouTube script about my personal productivity system."
- "Help me script a 10-minute video explaining inflation to college students."
- "I need a YouTube outline and script for a tutorial on clean code in Python."
- "Draft a retention-optimized YouTube script on how to build a SaaS in 2026."
+1 -1
View File
File diff suppressed because one or more lines are too long