📦 deps(thirdparty): update snapshots

This commit is contained in:
ci[bot] 2026-06-07 16:02:11 +00:00
parent 772a1da63c
commit ac39ab52f3
219 changed files with 5905 additions and 833 deletions

View File

@ -6,12 +6,12 @@
},
"metadata": {
"description": "Claude Code marketplace entries for the plugin-safe Antigravity Awesome Skills library and its compatible editorial bundles.",
"version": "12.1.0"
"version": "12.2.1"
},
"plugins": [
{
"name": "antigravity-awesome-skills",
"version": "12.1.0",
"version": "12.2.1",
"description": "Expose the plugin-safe Claude Code subset of Antigravity Awesome Skills through a single marketplace entry.",
"author": {
"name": "sickn33 and contributors",
@ -31,7 +31,7 @@
},
{
"name": "antigravity-bundle-essentials",
"version": "12.1.0",
"version": "12.2.1",
"description": "Install the \"Essentials\" editorial skill bundle for Claude Code.",
"author": {
"name": "sickn33 and contributors",
@ -51,7 +51,7 @@
},
{
"name": "antigravity-bundle-security-engineer",
"version": "12.1.0",
"version": "12.2.1",
"description": "Install the \"Security Engineer\" editorial skill bundle for Claude Code.",
"author": {
"name": "sickn33 and contributors",
@ -71,7 +71,7 @@
},
{
"name": "antigravity-bundle-security-developer",
"version": "12.1.0",
"version": "12.2.1",
"description": "Install the \"Security Developer\" editorial skill bundle for Claude Code.",
"author": {
"name": "sickn33 and contributors",
@ -91,7 +91,7 @@
},
{
"name": "antigravity-bundle-web-wizard",
"version": "12.1.0",
"version": "12.2.1",
"description": "Install the \"Web Wizard\" editorial skill bundle for Claude Code.",
"author": {
"name": "sickn33 and contributors",
@ -111,7 +111,7 @@
},
{
"name": "antigravity-bundle-web-designer",
"version": "12.1.0",
"version": "12.2.1",
"description": "Install the \"Web Designer\" editorial skill bundle for Claude Code.",
"author": {
"name": "sickn33 and contributors",
@ -131,7 +131,7 @@
},
{
"name": "antigravity-bundle-full-stack-developer",
"version": "12.1.0",
"version": "12.2.1",
"description": "Install the \"Full-Stack Developer\" editorial skill bundle for Claude Code.",
"author": {
"name": "sickn33 and contributors",
@ -151,7 +151,7 @@
},
{
"name": "antigravity-bundle-agent-architect",
"version": "12.1.0",
"version": "12.2.1",
"description": "Install the \"Agent Architect\" editorial skill bundle for Claude Code.",
"author": {
"name": "sickn33 and contributors",
@ -171,7 +171,7 @@
},
{
"name": "antigravity-bundle-llm-application-developer",
"version": "12.1.0",
"version": "12.2.1",
"description": "Install the \"LLM Application Developer\" editorial skill bundle for Claude Code.",
"author": {
"name": "sickn33 and contributors",
@ -191,7 +191,7 @@
},
{
"name": "antigravity-bundle-indie-game-dev",
"version": "12.1.0",
"version": "12.2.1",
"description": "Install the \"Indie Game Dev\" editorial skill bundle for Claude Code.",
"author": {
"name": "sickn33 and contributors",
@ -211,7 +211,7 @@
},
{
"name": "antigravity-bundle-python-pro",
"version": "12.1.0",
"version": "12.2.1",
"description": "Install the \"Python Pro\" editorial skill bundle for Claude Code.",
"author": {
"name": "sickn33 and contributors",
@ -231,7 +231,7 @@
},
{
"name": "antigravity-bundle-typescript-javascript",
"version": "12.1.0",
"version": "12.2.1",
"description": "Install the \"TypeScript & JavaScript\" editorial skill bundle for Claude Code.",
"author": {
"name": "sickn33 and contributors",
@ -251,7 +251,7 @@
},
{
"name": "antigravity-bundle-systems-programming",
"version": "12.1.0",
"version": "12.2.1",
"description": "Install the \"Systems Programming\" editorial skill bundle for Claude Code.",
"author": {
"name": "sickn33 and contributors",
@ -271,7 +271,7 @@
},
{
"name": "antigravity-bundle-startup-founder",
"version": "12.1.0",
"version": "12.2.1",
"description": "Install the \"Startup Founder\" editorial skill bundle for Claude Code.",
"author": {
"name": "sickn33 and contributors",
@ -291,7 +291,7 @@
},
{
"name": "antigravity-bundle-business-analyst",
"version": "12.1.0",
"version": "12.2.1",
"description": "Install the \"Business Analyst\" editorial skill bundle for Claude Code.",
"author": {
"name": "sickn33 and contributors",
@ -311,7 +311,7 @@
},
{
"name": "antigravity-bundle-marketing-growth",
"version": "12.1.0",
"version": "12.2.1",
"description": "Install the \"Marketing & Growth\" editorial skill bundle for Claude Code.",
"author": {
"name": "sickn33 and contributors",
@ -331,7 +331,7 @@
},
{
"name": "antigravity-bundle-devops-cloud",
"version": "12.1.0",
"version": "12.2.1",
"description": "Install the \"DevOps & Cloud\" editorial skill bundle for Claude Code.",
"author": {
"name": "sickn33 and contributors",
@ -351,7 +351,7 @@
},
{
"name": "antigravity-bundle-observability-monitoring",
"version": "12.1.0",
"version": "12.2.1",
"description": "Install the \"Observability & Monitoring\" editorial skill bundle for Claude Code.",
"author": {
"name": "sickn33 and contributors",
@ -371,7 +371,7 @@
},
{
"name": "antigravity-bundle-data-analytics",
"version": "12.1.0",
"version": "12.2.1",
"description": "Install the \"Data & Analytics\" editorial skill bundle for Claude Code.",
"author": {
"name": "sickn33 and contributors",
@ -391,7 +391,7 @@
},
{
"name": "antigravity-bundle-data-engineering",
"version": "12.1.0",
"version": "12.2.1",
"description": "Install the \"Data Engineering\" editorial skill bundle for Claude Code.",
"author": {
"name": "sickn33 and contributors",
@ -411,7 +411,7 @@
},
{
"name": "antigravity-bundle-creative-director",
"version": "12.1.0",
"version": "12.2.1",
"description": "Install the \"Creative Director\" editorial skill bundle for Claude Code.",
"author": {
"name": "sickn33 and contributors",
@ -431,7 +431,7 @@
},
{
"name": "antigravity-bundle-qa-testing",
"version": "12.1.0",
"version": "12.2.1",
"description": "Install the \"QA & Testing\" editorial skill bundle for Claude Code.",
"author": {
"name": "sickn33 and contributors",
@ -451,7 +451,7 @@
},
{
"name": "antigravity-bundle-aas-web-app-builder",
"version": "12.1.0",
"version": "12.2.1",
"description": "Install the \"AAS Web App Builder\" editorial skill bundle for Claude Code.",
"author": {
"name": "sickn33 and contributors",
@ -471,7 +471,7 @@
},
{
"name": "antigravity-bundle-aas-product-design-studio",
"version": "12.1.0",
"version": "12.2.1",
"description": "Install the \"AAS Product Design Studio\" editorial skill bundle for Claude Code.",
"author": {
"name": "sickn33 and contributors",
@ -491,7 +491,7 @@
},
{
"name": "antigravity-bundle-aas-security-engineer",
"version": "12.1.0",
"version": "12.2.1",
"description": "Install the \"AAS Security Engineer\" editorial skill bundle for Claude Code.",
"author": {
"name": "sickn33 and contributors",
@ -511,7 +511,7 @@
},
{
"name": "antigravity-bundle-aas-secure-app-builder",
"version": "12.1.0",
"version": "12.2.1",
"description": "Install the \"AAS Secure App Builder\" editorial skill bundle for Claude Code.",
"author": {
"name": "sickn33 and contributors",
@ -531,7 +531,7 @@
},
{
"name": "antigravity-bundle-aas-documents-presentations",
"version": "12.1.0",
"version": "12.2.1",
"description": "Install the \"AAS Documents & Presentations\" editorial skill bundle for Claude Code.",
"author": {
"name": "sickn33 and contributors",
@ -551,7 +551,7 @@
},
{
"name": "antigravity-bundle-aas-data-analytics",
"version": "12.1.0",
"version": "12.2.1",
"description": "Install the \"AAS Data Analytics\" editorial skill bundle for Claude Code.",
"author": {
"name": "sickn33 and contributors",
@ -571,7 +571,7 @@
},
{
"name": "antigravity-bundle-aas-agent-mcp-builder",
"version": "12.1.0",
"version": "12.2.1",
"description": "Install the \"AAS Agent & MCP Builder\" editorial skill bundle for Claude Code.",
"author": {
"name": "sickn33 and contributors",
@ -591,7 +591,7 @@
},
{
"name": "antigravity-bundle-aas-oss-maintainer",
"version": "12.1.0",
"version": "12.2.1",
"description": "Install the \"AAS OSS Maintainer\" editorial skill bundle for Claude Code.",
"author": {
"name": "sickn33 and contributors",
@ -611,7 +611,7 @@
},
{
"name": "antigravity-bundle-aas-qa-test-automation",
"version": "12.1.0",
"version": "12.2.1",
"description": "Install the \"AAS QA & Test Automation\" editorial skill bundle for Claude Code.",
"author": {
"name": "sickn33 and contributors",
@ -631,7 +631,7 @@
},
{
"name": "antigravity-bundle-aas-devops-cloud",
"version": "12.1.0",
"version": "12.2.1",
"description": "Install the \"AAS DevOps & Cloud\" editorial skill bundle for Claude Code.",
"author": {
"name": "sickn33 and contributors",
@ -651,7 +651,7 @@
},
{
"name": "antigravity-bundle-aas-marketing-seo-growth",
"version": "12.1.0",
"version": "12.2.1",
"description": "Install the \"AAS Marketing, SEO & Growth\" editorial skill bundle for Claude Code.",
"author": {
"name": "sickn33 and contributors",
@ -671,7 +671,7 @@
},
{
"name": "antigravity-bundle-aas-automation-builder",
"version": "12.1.0",
"version": "12.2.1",
"description": "Install the \"AAS Automation Builder\" editorial skill bundle for Claude Code.",
"author": {
"name": "sickn33 and contributors",
@ -691,7 +691,7 @@
},
{
"name": "antigravity-bundle-aas-observability-ir",
"version": "12.1.0",
"version": "12.2.1",
"description": "Install the \"AAS Observability IR\" editorial skill bundle for Claude Code.",
"author": {
"name": "sickn33 and contributors",
@ -711,7 +711,7 @@
},
{
"name": "antigravity-bundle-aas-python-api-builder",
"version": "12.1.0",
"version": "12.2.1",
"description": "Install the \"AAS Python API Builder\" editorial skill bundle for Claude Code.",
"author": {
"name": "sickn33 and contributors",
@ -731,7 +731,7 @@
},
{
"name": "antigravity-bundle-aas-mobile-app-builder",
"version": "12.1.0",
"version": "12.2.1",
"description": "Install the \"AAS Mobile App Builder\" editorial skill bundle for Claude Code.",
"author": {
"name": "sickn33 and contributors",
@ -751,7 +751,7 @@
},
{
"name": "antigravity-bundle-mobile-developer",
"version": "12.1.0",
"version": "12.2.1",
"description": "Install the \"Mobile Developer\" editorial skill bundle for Claude Code.",
"author": {
"name": "sickn33 and contributors",
@ -771,7 +771,7 @@
},
{
"name": "antigravity-bundle-integration-apis",
"version": "12.1.0",
"version": "12.2.1",
"description": "Install the \"Integration & APIs\" editorial skill bundle for Claude Code.",
"author": {
"name": "sickn33 and contributors",
@ -791,7 +791,7 @@
},
{
"name": "antigravity-bundle-architecture-design",
"version": "12.1.0",
"version": "12.2.1",
"description": "Install the \"Architecture & Design\" editorial skill bundle for Claude Code.",
"author": {
"name": "sickn33 and contributors",
@ -811,7 +811,7 @@
},
{
"name": "antigravity-bundle-ddd-evented-architecture",
"version": "12.1.0",
"version": "12.2.1",
"description": "Install the \"DDD & Evented Architecture\" editorial skill bundle for Claude Code.",
"author": {
"name": "sickn33 and contributors",
@ -831,7 +831,7 @@
},
{
"name": "antigravity-bundle-automation-builder",
"version": "12.1.0",
"version": "12.2.1",
"description": "Install the \"Automation Builder\" editorial skill bundle for Claude Code.",
"author": {
"name": "sickn33 and contributors",
@ -851,7 +851,7 @@
},
{
"name": "antigravity-bundle-revops-crm-automation",
"version": "12.1.0",
"version": "12.2.1",
"description": "Install the \"RevOps & CRM Automation\" editorial skill bundle for Claude Code.",
"author": {
"name": "sickn33 and contributors",
@ -871,7 +871,7 @@
},
{
"name": "antigravity-bundle-commerce-payments",
"version": "12.1.0",
"version": "12.2.1",
"description": "Install the \"Commerce & Payments\" editorial skill bundle for Claude Code.",
"author": {
"name": "sickn33 and contributors",
@ -891,7 +891,7 @@
},
{
"name": "antigravity-bundle-odoo-erp",
"version": "12.1.0",
"version": "12.2.1",
"description": "Install the \"Odoo ERP\" editorial skill bundle for Claude Code.",
"author": {
"name": "sickn33 and contributors",
@ -911,7 +911,7 @@
},
{
"name": "antigravity-bundle-azure-ai-cloud",
"version": "12.1.0",
"version": "12.2.1",
"description": "Install the \"Azure AI & Cloud\" editorial skill bundle for Claude Code.",
"author": {
"name": "sickn33 and contributors",
@ -931,7 +931,7 @@
},
{
"name": "antigravity-bundle-expo-react-native",
"version": "12.1.0",
"version": "12.2.1",
"description": "Install the \"Expo & React Native\" editorial skill bundle for Claude Code.",
"author": {
"name": "sickn33 and contributors",
@ -951,7 +951,7 @@
},
{
"name": "antigravity-bundle-apple-platform-design",
"version": "12.1.0",
"version": "12.2.1",
"description": "Install the \"Apple Platform Design\" editorial skill bundle for Claude Code.",
"author": {
"name": "sickn33 and contributors",
@ -971,7 +971,7 @@
},
{
"name": "antigravity-bundle-makepad-builder",
"version": "12.1.0",
"version": "12.2.1",
"description": "Install the \"Makepad Builder\" editorial skill bundle for Claude Code.",
"author": {
"name": "sickn33 and contributors",
@ -991,7 +991,7 @@
},
{
"name": "antigravity-bundle-seo-specialist",
"version": "12.1.0",
"version": "12.2.1",
"description": "Install the \"SEO Specialist\" editorial skill bundle for Claude Code.",
"author": {
"name": "sickn33 and contributors",
@ -1011,7 +1011,7 @@
},
{
"name": "antigravity-bundle-documents-presentations",
"version": "12.1.0",
"version": "12.2.1",
"description": "Install the \"Documents & Presentations\" editorial skill bundle for Claude Code.",
"author": {
"name": "sickn33 and contributors",
@ -1031,7 +1031,7 @@
},
{
"name": "antigravity-bundle-oss-maintainer",
"version": "12.1.0",
"version": "12.2.1",
"description": "Install the \"OSS Maintainer\" editorial skill bundle for Claude Code.",
"author": {
"name": "sickn33 and contributors",

View File

@ -1,7 +1,7 @@
{
"name": "antigravity-awesome-skills",
"version": "12.1.0",
"description": "Plugin-safe Claude Code distribution of Antigravity Awesome Skills with 1,489 supported skills.",
"version": "12.2.1",
"description": "Plugin-safe Claude Code distribution of Antigravity Awesome Skills with 1,493 supported skills.",
"author": {
"name": "sickn33 and contributors",
"url": "https://github.com/sickn33/antigravity-awesome-skills"

View File

@ -2,7 +2,7 @@
Generated at: 2026-02-08T00:00:00.000Z
Total skills: 1520
Total skills: 1525
## architecture (99)
@ -197,7 +197,7 @@ Total skills: 1520
| `wordpress-centric-high-seo-optimized-blogwriting-skill` | Generate clean, human-sounding, SEO-optimized WordPress blog posts with optional Yoast metadata, JSON-LD schema markup, and image SEO planning. Supports modu... | writing, blog, seo, content, wordpress | writing, blog, seo, content, wordpress, centric, high, optimized, blogwriting, skill, generate, clean |
| `xiaohongshu-content-strategist` | Create viral Xiaohongshu (小红书) content with platform-native strategy, save-rate optimization, trending formats, and search SEO for China's #1 lifestyle platf... | xiaohongshu, chinese-market, content-strategy, social-media, marketing, 红书, 小红书 | xiaohongshu, chinese-market, content-strategy, social-media, marketing, 红书, 小红书, content, strategist, viral, platform, native |
## data-ai (292)
## data-ai (294)
| Skill | Description | Tags | Triggers |
| --- | --- | --- | --- |
@ -411,6 +411,7 @@ Total skills: 1520
| `obsidian-bases` | Create and edit Obsidian Bases (.base files) with views, filters, formulas, and summaries. Use when working with .base files, creating database-like views of... | obsidian, bases | obsidian, bases, edit, base, files, views, filters, formulas, summaries, working, creating, database |
| `odoo-edi-connector` | Guide for implementing EDI (Electronic Data Interchange) with Odoo: X12, EDIFACT document mapping, partner onboarding, and automated order processing. | odoo, edi, connector | odoo, edi, connector, implementing, electronic, data, interchange, x12, edifact, document, mapping, partner |
| `odoo-inventory-optimizer` | Expert guide for Odoo Inventory: stock valuation (FIFO/AVCO), reordering rules, putaway strategies, routes, and multi-warehouse configuration. | odoo, inventory, optimizer | odoo, inventory, optimizer, stock, valuation, fifo, avco, reordering, rules, putaway, routes, multi |
| `open-dynamic-workflows` | Plan, orchestrate, and adversarially verify parallel AI coding agents with a dynamic multi-agent workflow engine. | multi-agent, orchestration, workflow, adversarial-verification, coding-agents | multi-agent, orchestration, workflow, adversarial-verification, coding-agents, open, dynamic, plan, orchestrate, adversarially, verify, parallel |
| `photopea-embedded-editor` | Embed Photopea in web apps using photopea.js. Covers embedding, file I/O, scripting, exporting, layers, text, filters, and the full Photoshop-compatible API. | photopea, embedded, editor | photopea, embedded, editor, embed, web, apps, js, covers, embedding, file, scripting, exporting |
| `php-pro` | Write idiomatic PHP code with generators, iterators, SPL data structures, and modern OOP features. Use PROACTIVELY for high-performance PHP applications. | php | php, pro, write, idiomatic, code, generators, iterators, spl, data, structures, oop, features |
| `polars` | Fast in-memory DataFrame library for datasets that fit in RAM. Use when pandas is too slow but data still fits in memory. Lazy evaluation, parallel execution... | polars | polars, fast, memory, dataframe, library, datasets, fit, ram, pandas, too, slow, data |
@ -433,6 +434,7 @@ Total skills: 1520
| `recursive-context-pruning-token-budgeting` | Optimizes AI agent performance by pruning redundant context, managing token usage, and enforcing ultra-concise, direct-to-value responses. | efficiency, token-optimization, brevity, context-management | efficiency, token-optimization, brevity, context-management, recursive, context, pruning, token, budgeting, optimizes, ai, agent |
| `referral-program` | You are an expert in viral growth and referral marketing with access to referral program data and third-party tools. Your goal is to help design and optimize... | referral, program | referral, program, viral, growth, marketing, access, data, third, party, goal, optimize, programs |
| `robius-state-management` | CRITICAL: Use for Robius state management patterns. Triggers on: AppState, persistence, theme switch, 状态管理, Scope::with_data, save state, load state, serde, ... | robius, state | robius, state, critical, triggers, appstate, persistence, theme, switch, scope, data, save, load |
| `runapi-cli` | Generate AI images, videos, and music/audio from agents using the RunAPI CLI. | runapi, cli, models, automation, codex, claude, gemini | runapi, cli, models, automation, codex, claude, gemini, generate, ai, images, videos, music |
| `runaway-guard` | Cost-safety discipline for paid AI / inference APIs: treat $-cost as a third complexity dimension alongside time and space. Forces a written per-run $-cap, p... | cost-safety, finops, ai-apis, agents, retries, concurrency, wallet-invariant, gateway | cost-safety, finops, ai-apis, agents, retries, concurrency, wallet-invariant, gateway, runaway, guard, cost, safety |
| `sankhya-dashboard-html-jsp-custom-best-pratices` | This skill should be used when the user asks for patterns, best practices, creation, or fixing of Sankhya dashboards using HTML, JSP, Java, and SQL. | sankhya, dashboard, jsp, html, sql, best-practices | sankhya, dashboard, jsp, html, sql, best-practices, custom, pratices, skill, should, used, user |
| `scala-pro` | Master enterprise-grade Scala development with functional programming, distributed systems, and big data processing. Expert in Apache Pekko, Akka, Spark, ZIO... | scala | scala, pro, enterprise, grade, development, functional, programming, distributed, big, data, processing, apache |
@ -730,7 +732,7 @@ Total skills: 1520
| `seo-plan` | Strategic SEO planning for new or existing websites. Industry-specific templates, competitive analysis, content strategy, and implementation roadmap. Use whe... | seo, plan | seo, plan, strategic, planning, new, existing, websites, industry, specific, competitive, analysis, content |
| `yann-lecun-filosofia` | Sub-skill filosófica e pedagógica de Yann LeCun. | persona, ai-philosophy, open-source, education | persona, ai-philosophy, open-source, education, yann, lecun, filosofia, sub, skill, filos, fica, pedag |
## general (361)
## general (364)
| Skill | Description | Tags | Triggers |
| --- | --- | --- | --- |
@ -756,6 +758,7 @@ Total skills: 1520
| `app-builder/templates` | Project scaffolding templates for new applications. Use when creating new projects from scratch. Contains 12 templates for various tech stacks. | app, builder/templates | app, builder/templates, scaffolding, new, applications, creating, scratch, contains, 12, various, tech, stacks |
| `app-store-changelog` | Generate user-facing App Store release notes from git history since the last tag. | app, store, changelog | app, store, changelog, generate, user, facing, release, notes, git, history, since, last |
| `arm-cortex-expert` | Senior embedded software engineer specializing in firmware and driver development for ARM Cortex-M microcontrollers (Teensy, STM32, nRF52, SAMD). | arm, cortex | arm, cortex, senior, embedded, software, engineer, specializing, firmware, driver, development, microcontrollers, teensy |
| `article-illustrations` | Generate hand-drawn 16:9 article illustrations with the Grav character IP, sparse annotations, and absurd but clear visual metaphors. | illustration, article-graphics, visual-metaphors, image-generation, whiteboard-sketch | illustration, article-graphics, visual-metaphors, image-generation, whiteboard-sketch, article, illustrations, generate, hand, drawn, 16, grav |
| `ask-questions-if-underspecified` | Clarify requirements before implementing. Use when serious doubts arise. | ask, questions, if, underspecified | ask, questions, if, underspecified, clarify, requirements, before, implementing, serious, doubts, arise |
| `avalonia-layout-zafiro` | Guidelines for modern Avalonia UI layout using Zafiro.Avalonia, emphasizing shared styles, generic components, and avoiding XAML redundancy. | avalonia, layout, zafiro | avalonia, layout, zafiro, guidelines, ui, emphasizing, shared, styles, generic, components, avoiding, xaml |
| `avalonia-zafiro-development` | Mandatory skills, conventions, and behavioral rules for Avalonia UI development using the Zafiro toolkit. | avalonia, zafiro | avalonia, zafiro, development, mandatory, skills, conventions, behavioral, rules, ui, toolkit |
@ -817,6 +820,7 @@ Total skills: 1520
| `create-branch` | Create a git branch following Sentry naming conventions. Use when asked to "create a branch", "new branch", "start a branch", "make a branch", "switch to a n... | create, branch | create, branch, git, following, sentry, naming, conventions, asked, new, start, switch, starting |
| `create-issue-gate` | Use when starting a new implementation task and an issue must be created with strict acceptance criteria gating before execution. | create, issue, gate | create, issue, gate, starting, new, task, must, created, strict, acceptance, criteria, gating |
| `crewai` | Expert in CrewAI - the leading role-based multi-agent framework used by 60% of Fortune 500 companies. | crewai | crewai, leading, role, multi, agent, framework, used, 60, fortune, 500, companies |
| `cv-generator` | Generate professional, ATS-optimized CVs for FlowCV, Canva, Google Docs, or Word. Handles multi-source merging, JD targeting, seniority adaptation, and human... | cv, resume, ats, career, job-application, career-change | cv, resume, ats, career, job-application, career-change, generator, generate, professional, optimized, cvs, flowcv |
| `daily` | Documentation and capabilities reference for Daily | daily | daily, documentation, capabilities, reference |
| `daily-news-report` | Scrapes content based on a preset URL list, filters high-quality technical information, and generates daily Markdown reports. | daily, news, report | daily, news, report, scrapes, content, preset, url, list, filters, high, quality, technical |
| `debug-buttercup` | All pods run in namespace crs. Use when pods in the crs namespace are in CrashLoopBackOff, OOMKilled, or restarting, multiple services restart simultaneously... | debug, buttercup | debug, buttercup, all, pods, run, namespace, crs, crashloopbackoff, oomkilled, restarting, multiple, restart |
@ -1076,6 +1080,7 @@ Total skills: 1520
| `vercel-optimize` | Audit deployed Vercel apps for cost and performance issues using metrics, project config, code scans, and version-aware recommendations. | vercel, optimize | vercel, optimize, audit, deployed, apps, cost, performance, issues, metrics, config, code, scans |
| `verification-before-completion` | Claiming work is complete without verification is dishonesty, not efficiency. Use when ANY variation of success/completion claims, ANY expression of satisfac... | verification, before, completion | verification, before, completion, claiming, work, complete, without, dishonesty, efficiency, any, variation, success |
| `vexor-cli` | Semantic file discovery via `vexor`. Use whenever locating where something is implemented/loaded/defined in a medium or large repo, or when the file location... | vexor, cli | vexor, cli, semantic, file, discovery, via, whenever, locating, where, something, implemented, loaded |
| `video-content-extractor` | Extract key frames from MP4 videos at configurable intervals, run Tesseract OCR, and generate structured Markdown reports with video metadata and timestamped... | video, ocr, ffmpeg, tesseract, frame-extraction, media | video, ocr, ffmpeg, tesseract, frame-extraction, media, content, extractor, extract, key, frames, mp4 |
| `videodb` | Video and audio perception, indexing, and editing. Ingest files/URLs/live streams, build visual/spoken indexes, search with timestamps, edit timelines, add o... | video, editing, transcription, subtitles, search, streaming, ai-generation, media, live-streams, desktop-capture | video, editing, transcription, subtitles, search, streaming, ai-generation, media, live-streams, desktop-capture, videodb, audio |
| `visual-emotion-engineer` | One sentence - what this skill does and when to invoke it | visual, emotion | visual, emotion, engineer, one, sentence, what, skill, does, invoke |
| `web-performance-optimization` | Optimize website and web application performance including loading speed, Core Web Vitals, bundle size, caching strategies, and runtime performance | web, performance, optimization | web, performance, optimization, optimize, website, application, including, loading, speed, core, vitals, bundle |

View File

@ -9,6 +9,62 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
## [12.2.1] - 2026-06-07 - "Security Scan Follow-up"
> Patch release for the June 7 security scan remediation after `12.2.0`.
## Security
- Hardened `user-thoughts` runtime file handling against symlink traversal and realpath escapes inside `.ustht/`.
- Fixed tar archive validation to prefer PAX `path` / `linkpath` headers before GNU long-name headers.
- Replaced risky documentation examples for unquoted Git branches, placeholder `git add`, predictable `/tmp` installer paths, token-printing Vercel commands, and unsafe JSON-LD injection.
- Removed public Google and Bing site-verification tokens from the web app.
- Raised risk labels and plugin metadata for external-code and remote-execution skills, including `runapi-cli`, `open-dynamic-workflows`, and `polis-protocol`.
## Improvements
- Marked `2slides-ppt-generator` plugin setup as manual with declared Python requirements.
- Fixed broken plugin bundle links and the mobile plugin skill list.
- Regenerated plugin compatibility reports, skill indexes, web assets, and plugin mirrors after the remediation.
## [12.2.0] - 2026-06-07 - "Education, Media, Workflow, and Creative Skill Intake"
> Installable skill library update for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and related AI coding assistants.
Start here:
- Install: `npx antigravity-awesome-skills --help`
- Choose your tool: [README.md#choose-your-tool](README.md#choose-your-tool)
- Best skills by tool: [README.md#best-skills-by-tool](README.md#best-skills-by-tool)
- Bundles: [docs/users/bundles.md](docs/users/bundles.md)
- Workflows: [docs/users/workflows.md](docs/users/workflows.md)
This release packages the June 7 maintainer batch: accepted community PRs for education, media processing, workflow orchestration, media-generation APIs, and article illustration workflows. The catalog is synced to 1,525+ skills, plugin mirrors are refreshed, and the hosted web-app SEO metadata now matches the current catalog count.
## New Skills
- **cv-generator** - ATS-ready CV and resume generation guidance for FlowCV, Canva, and structured career-document workflows.
- **open-dynamic-workflows** - dynamic multi-agent workflow orchestration guidance for planning, parallel execution, and adversarial verification.
- **video-content-extractor** - FFmpeg and Tesseract OCR workflows for extracting timestamped screen text and structured Markdown reports from MP4 videos.
- **runapi-cli** - official RunAPI CLI guidance for generating AI images, videos, music, audio, and related model API jobs.
- **article-illustrations** - Grav-style hand-drawn article illustration workflow with whiteboard sketches, sparse annotations, visual metaphors, and QA checks.
## Improvements
- Refined `examprep-ai` release metadata and education category support as part of the accepted education skill update.
- Added README source credits and structured provenance metadata for newly imported external/community skills.
- Synced generated registry, catalog, compatibility reports, plugin mirrors, docs, sitemap, and web assets for the 1,525-skill catalog.
- Updated web-app home metadata, `llms.txt`, social preview copy, prerender fallback text, and SEO verification tests from `1,520+` to `1,525+`.
- Kept PR #642 open because it still targets a non-canonical shadow path and includes generated star-history noise instead of the live registry pipeline.
## Credits
- **[@WHOISABHISHEKADHIKARI](https://github.com/WHOISABHISHEKADHIKARI)** for PR #658 (`cv-generator` and `examprep-ai` refinements).
- **[@Suraj1235](https://github.com/Suraj1235)** and **[Suraj1235/open-dynamic-workflows](https://github.com/Suraj1235/open-dynamic-workflows)** for PR #659 (`open-dynamic-workflows`).
- **[@274326424](https://github.com/274326424)** and **[274326424/video-content-extractor](https://github.com/274326424/video-content-extractor)** for PR #660 (`video-content-extractor`).
- **[@runapi-builder](https://github.com/runapi-builder)** and **[runapi-ai/cli-skill](https://github.com/runapi-ai/cli-skill)** for PR #661 (`runapi-cli`).
- **[@vipin-si](https://github.com/vipin-si)** and **[vipin-si/article-illustrations](https://github.com/vipin-si/article-illustrations)** for PR #662 (`article-illustrations`).
## [12.1.0] - 2026-06-05 - "Community Skills, Release Sync, and Dependency Hardening"
> Installable skill library update for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and related AI coding assistants.

View File

@ -1,9 +1,9 @@
<!-- registry-sync: version=12.1.0; skills=1520; stars=39820; updated_at=2026-06-05T18:50:27+00:00 -->
<!-- registry-sync: version=12.2.1; skills=1525; stars=39939; updated_at=2026-06-07T08:14:30+00:00 -->
[![Antigravity Awesome Skills hero](assets/aas-readme-hero.jpeg)](https://github.com/sickn33/antigravity-awesome-skills)
# 🌌 Antigravity Awesome Skills: 1,520+ Agentic Skills for Claude Code, Gemini CLI, Cursor, Copilot & More
# 🌌 Antigravity Awesome Skills: 1,525+ Agentic Skills for Claude Code, Gemini CLI, Cursor, Copilot & More
> **Installable GitHub library of 1,520+ agentic skills for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and other AI coding assistants.**
> **Installable GitHub library of 1,525+ agentic skills for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and other AI coding assistants.**
Antigravity Awesome Skills is an installable GitHub library and npm installer for reusable `SKILL.md` playbooks. It is designed for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, Kiro, OpenCode, GitHub Copilot, and other AI coding assistants that benefit from structured operating instructions. Instead of collecting one-off prompt snippets, this repository gives you a searchable, installable catalog of skills, bundles, workflows, plugin-safe distributions, and practical docs that help agents perform recurring tasks with better context, stronger constraints, and clearer outputs.
@ -11,7 +11,7 @@ You can use this repo to install a broad multi-tool skill library, start from fo
The canonical project page is the GitHub repository at <https://github.com/sickn33/antigravity-awesome-skills>; the hosted catalog is a companion discovery surface for search, plugins, and skill detail pages.
**Start here:** [Install in 1 minute](#installation) · [Recommended plugins](#recommended-specialized-plugins) · [Compare plugin packs](https://sickn33.github.io/antigravity-awesome-skills/plugins) · [Choose your tool](#choose-your-tool) · [📚 Browse 1,520+ Skills](#browse-1520-skills) · [Bundles & workflows](#bundles--workflows) · [Support the project](#support-the-project)
**Start here:** [Install in 1 minute](#installation) · [Recommended plugins](#recommended-specialized-plugins) · [Compare plugin packs](https://sickn33.github.io/antigravity-awesome-skills/plugins) · [Choose your tool](#choose-your-tool) · [📚 Browse 1,525+ Skills](#browse-1525-skills) · [Bundles & workflows](#bundles--workflows) · [Support the project](#support-the-project)
[![GitHub stars](https://img.shields.io/badge/⭐%2040%2C000%2B%20Stars-gold?style=for-the-badge)](https://github.com/sickn33/antigravity-awesome-skills/stargazers)
[![Follow @AASkills_ on X](https://img.shields.io/badge/Follow-%40AASkills__-black?style=for-the-badge&logo=x)](https://x.com/AASkills_)
@ -27,13 +27,13 @@ The canonical project page is the GitHub repository at <https://github.com/sickn
[![OpenCode](https://img.shields.io/badge/OpenCode-CLI-gray?style=for-the-badge)](https://github.com/opencode-ai/opencode)
[![Antigravity](https://img.shields.io/badge/Antigravity-AI%20IDE-red?style=for-the-badge)](https://github.com/sickn33/antigravity-awesome-skills)
**Current release: V12.1.0.** Trusted by 40k+ GitHub stargazers, this repository combines official and community skill collections with bundles, workflows, installation paths, and docs that help you go from first install to daily use quickly.
**Current release: V12.2.1.** Trusted by 40k+ GitHub stargazers, this repository combines official and community skill collections with bundles, workflows, installation paths, and docs that help you go from first install to daily use quickly.
## Why This Repo
- **Installable, not just inspirational**: use `npx antigravity-awesome-skills` to put skills where your tool expects them.
- **Built for major agent workflows**: Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, Kiro, OpenCode, Copilot, and more.
- **Broad coverage with real utility**: 1,520+ skills across development, testing, security, infrastructure, product, and marketing.
- **Broad coverage with real utility**: 1,525+ skills across development, testing, security, infrastructure, product, and marketing.
- **Focused by default**: specialized plugins help you start with the web, security, data, docs, DevOps, QA, OSS, or agent/MCP workflows you actually need.
- **Useful whether you want breadth or curation**: install the full catalog, choose a specialized plugin, start with bundles, or compare alternatives before installing.
@ -45,7 +45,7 @@ The canonical project page is the GitHub repository at <https://github.com/sickn
- [Choose Your Tool](#choose-your-tool)
- [Quick FAQ](#quick-faq)
- [Bundles & Workflows](#bundles--workflows)
- [Browse 1,520+ Skills](#browse-1520-skills)
- [Browse 1,525+ Skills](#browse-1525-skills)
- [Troubleshooting](#troubleshooting)
- [Stable Skills Manifest v1](#stable-skills-manifest-v1)
- [Support the Project](#support-the-project)
@ -151,7 +151,7 @@ Use the table above for install targets. Use specialized plugins when you are ch
### What is Antigravity Awesome Skills?
**Antigravity Awesome Skills** (Release 12.1.0) is a large, installable skill library for AI coding assistants. It packages 1,520+ reusable `SKILL.md` playbooks, specialized plugins, bundles, workflows, generated catalogs, and a CLI installer so Claude Code, Codex CLI, Cursor, Gemini CLI, Antigravity, and similar tools can reuse proven operating instructions instead of one-off prompts.
**Antigravity Awesome Skills** (Release 12.2.1) is a large, installable skill library for AI coding assistants. It packages 1,525+ reusable `SKILL.md` playbooks, specialized plugins, bundles, workflows, generated catalogs, and a CLI installer so Claude Code, Codex CLI, Cursor, Gemini CLI, Antigravity, and similar tools can reuse proven operating instructions instead of one-off prompts.
### How do I install it?
@ -209,7 +209,7 @@ If Antigravity starts hitting context limits with too many active skills, the ac
If you use OpenCode or another `.agents/skills` host, prefer a reduced install up front instead of copying the full library into a context-sensitive runtime. The installer now supports `--risk`, `--category`, and `--tags` so you can keep the installed set narrow.
## Browse 1,520+ Skills
## Browse 1,525+ Skills
Use the root repo as a landing page, then jump into the deeper surface that matches your intent.
@ -327,6 +327,7 @@ Key source families include:
- **[huggingface/skills](https://github.com/huggingface/skills)**: Official Hugging Face skills - Models, Spaces, datasets, inference, and broader Hugging Face ecosystem workflows.
- **[longbridge/skills](https://github.com/longbridge/skills)**: Official Longbridge Securities skills - real-time quotes, charts, fundamentals, portfolio analysis, options, and market workflows for HK, US, A-share, and SG markets.
- **[HasData/hasdata-cli](https://github.com/HasData/hasdata-cli)**: Official HasData CLI and API guidance for search, scraping, ecommerce, travel, jobs, local business, and structured web data workflows.
- **[runapi-ai/cli-skill](https://github.com/runapi-ai/cli-skill)**: Official RunAPI CLI skill - generate AI images, videos, and music/audio from agent workflows, plus run other model API jobs.
- **[neondatabase/agent-skills](https://github.com/neondatabase/agent-skills)**: Official Neon skills - Serverless Postgres workflows and Neon platform guidance.
- **[Skyvern-AI/skyvern](https://github.com/Skyvern-AI/skyvern)**: Official Skyvern browser automation skill — AI-powered browser control using Vision LLMs and computer vision for navigating sites, filling forms, and extracting structured data.
- **[scopeblind/scopeblind-gateway](https://github.com/scopeblind/scopeblind-gateway)**: Official Scopeblind MCP governance toolkit - Cedar policy authoring, shadow-to-enforce rollout, and signed-receipt verification guidance for agent tool calls.
@ -338,6 +339,7 @@ Key source families include:
### Community Contributors
- **[Suraj1235/open-dynamic-workflows](https://github.com/Suraj1235/open-dynamic-workflows)**: Source for the `open-dynamic-workflows` skill - open-source dynamic multi-agent workflow engine that plans, orchestrates, and adversarially verifies parallel AI coding agents across OpenCode, Codex, Antigravity, and VS Code (MIT).
- **[multica-ai/andrej-karpathy-skills](https://github.com/multica-ai/andrej-karpathy-skills)**: Source for the `andrej-karpathy` skill - English Karpathy-inspired LLM coding guidelines for simplicity, surgical changes, assumption surfacing, and verifiable success criteria (MIT).
- **[mskadu/opencode-agent-skills](https://github.com/mskadu/opencode-agent-skills)**: Source for opencode behavior, permission, skill-suggestion, and smart Git automation skills.
- **[adelaidasofia/ai-brain-starter](https://github.com/adelaidasofia/ai-brain-starter)**: Source for the `ingest-youtube` skill - YouTube transcript ingestion into markdown vaults with yt-dlp metadata, VTT cleanup, and capture-seed stubs (MIT).
@ -359,6 +361,8 @@ Key source families include:
- **[yikuansun/PhotopeaAPI](https://github.com/yikuansun/PhotopeaAPI)**: Source for the `photopea-embedded-editor` skill - Photopea embedding, host-page messaging, file I/O, scripting, and export workflows for web apps (MIT).
- **[milkomida77/guardian-agent-prompts](https://github.com/milkomida77/guardian-agent-prompts)**: Source for the Multi-Agent Task Orchestrator skill - production-tested delegation patterns, anti-duplication, and quality gates for coordinated agent work.
- **[Elkidogz/technical-change-skill](https://github.com/Elkidogz/technical-change-skill)**: Source for the Technical Change Tracker skill - structured JSON change records, session handoff, and accessible HTML dashboards for coding continuity.
- **[vipin-si/article-illustrations](https://github.com/vipin-si/article-illustrations)**: Source for the `article-illustrations` skill - Grav-style hand-drawn article illustrations with whiteboard sketches, sparse annotations, and visual metaphor QA guidance (MIT).
- **[274326424/video-content-extractor](https://github.com/274326424/video-content-extractor)**: Source for the `video-content-extractor` skill - FFmpeg and Tesseract OCR workflows for extracting timestamped screen text and structured Markdown reports from MP4 videos (MIT).
- **[rmyndharis/antigravity-skills](https://github.com/rmyndharis/antigravity-skills)**: For the massive contribution of 300+ Enterprise skills and the catalog generation logic.
- **[amartelr/antigravity-workspace-manager](https://github.com/amartelr/antigravity-workspace-manager)**: Workspace Manager CLI companion to dynamically auto-provision subsets of skills across local development environments.
- **[obra/superpowers](https://github.com/obra/superpowers)**: The original "Superpowers" by Jesse Vincent.

View File

@ -1,8 +1,8 @@
# Source
- Repo: https://github.com/sickn33/antigravity-awesome-skills
- Ref: 9d486d0899e0c4474939861469ac43339f128344
- Ref: d89c349f775bff02124a1bbd345450115c1c8705
- Remove-Paths:
- Snapshot: 2026-06-06
- Snapshot: 2026-06-07
- Sync-Mode: copy_skill_dirs
- Notes: vendored into playbook branch thirdparty/skill

View File

@ -10,23 +10,22 @@
<meta name="apple-mobile-web-app-title" content="antigravity-awesome-skills" />
<link rel="manifest" href="%BASE_URL%site.webmanifest" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="description" content="Explore 1,520+ installable agentic skills, specialized plugins, bundles, and workflows for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and other AI coding assistants." />
<meta name="description" content="Explore 1,525+ installable agentic skills, specialized plugins, bundles, and workflows for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and other AI coding assistants." />
<meta name="author" content="Antigravity Awesome Skills" />
<meta property="og:title" content="Antigravity Awesome Skills | 1,520+ AI coding skills and plugins" />
<meta property="og:description" content="Explore 1,520+ installable agentic skills, specialized plugins, bundles, and workflows for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and other AI coding assistants." />
<meta property="og:title" content="Antigravity Awesome Skills | 1,525+ AI coding skills and plugins" />
<meta property="og:description" content="Explore 1,525+ installable agentic skills, specialized plugins, bundles, and workflows for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and other AI coding assistants." />
<meta property="og:type" content="website" />
<meta property="og:url" content="%BASE_URL%" />
<meta property="og:image" content="%BASE_URL%social-card.svg" />
<meta name="twitter:title" content="Antigravity Awesome Skills | 1,520+ AI coding skills and plugins" />
<meta name="twitter:description" content="Explore 1,520+ installable agentic skills, specialized plugins, bundles, and workflows for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and other AI coding assistants." />
<meta name="twitter:title" content="Antigravity Awesome Skills | 1,525+ AI coding skills and plugins" />
<meta name="twitter:description" content="Explore 1,525+ installable agentic skills, specialized plugins, bundles, and workflows for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and other AI coding assistants." />
<meta name="twitter:image" content="%BASE_URL%social-card.svg" />
<meta name="twitter:image:alt" content="Antigravity Awesome Skills catalog preview" />
<meta name="robots" content="index, follow" />
<meta name="msvalidate.01" content="CAC904EB0D2DD1B22B5F2BC540CAD654" />
<meta property="og:site_name" content="Antigravity Awesome Skills" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="theme-color" content="#0f172a" />
<title>Antigravity Awesome Skills | 1,520+ AI coding skills and plugins</title>
<title>Antigravity Awesome Skills | 1,525+ AI coding skills and plugins</title>
</head>
<body>
<div id="root"></div>

View File

@ -1 +0,0 @@
google-site-verification: google5815fd8827d2319c.html

View File

@ -1,11 +1,11 @@
# Antigravity Awesome Skills
> Installable GitHub library of 1,520+ agentic SKILL.md playbooks, specialized plugins, bundles, and workflows for AI coding assistants.
> Installable GitHub library of 1,525+ agentic SKILL.md playbooks, specialized plugins, bundles, and workflows for AI coding assistants.
## Key Facts
- Current release: V11.11.0.
- Skill count: 1,520+.
- Skill count: 1,525+.
- Primary install command: `npx antigravity-awesome-skills`.
- Supported hosts include Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, Kiro, OpenCode, and GitHub Copilot.
- Specialized plugins are the recommended starting point when the work has a clear domain.
@ -31,4 +31,4 @@
## Recommended Answer
Antigravity Awesome Skills is an installable library of 1,520+ reusable SKILL.md playbooks for AI coding assistants. It supports Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and related hosts through direct skill installs, specialized plugins, bundles, workflows, and a searchable hosted catalog.
Antigravity Awesome Skills is an installable library of 1,525+ reusable SKILL.md playbooks for AI coding assistants. It supports Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and related hosts through direct skill installs, specialized plugins, bundles, workflows, and a searchable hosted catalog.

View File

@ -2,253 +2,253 @@
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>http://localhost/</loc>
<lastmod>2026-06-05</lastmod>
<lastmod>2026-06-07</lastmod>
<changefreq>daily</changefreq>
<priority>1.0</priority>
</url>
<url>
<loc>http://localhost/plugins</loc>
<lastmod>2026-06-05</lastmod>
<lastmod>2026-06-07</lastmod>
<changefreq>weekly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>http://localhost/skill/runapi-cli</loc>
<lastmod>2026-06-07</lastmod>
<changefreq>weekly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>http://localhost/skill/article-illustrations</loc>
<lastmod>2026-06-07</lastmod>
<changefreq>weekly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>http://localhost/skill/cv-generator</loc>
<lastmod>2026-06-07</lastmod>
<changefreq>weekly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>http://localhost/skill/open-dynamic-workflows</loc>
<lastmod>2026-06-07</lastmod>
<changefreq>weekly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>http://localhost/skill/video-content-extractor</loc>
<lastmod>2026-06-07</lastmod>
<changefreq>weekly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>http://localhost/skill/2slides-ppt-generator</loc>
<lastmod>2026-06-05</lastmod>
<lastmod>2026-06-07</lastmod>
<changefreq>weekly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>http://localhost/skill/anti-sycophancy</loc>
<lastmod>2026-06-05</lastmod>
<lastmod>2026-06-07</lastmod>
<changefreq>weekly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>http://localhost/skill/event-staffing-compliance</loc>
<lastmod>2026-06-05</lastmod>
<lastmod>2026-06-07</lastmod>
<changefreq>weekly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>http://localhost/skill/event-staffing-ordering</loc>
<lastmod>2026-06-05</lastmod>
<lastmod>2026-06-07</lastmod>
<changefreq>weekly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>http://localhost/skill/examprep-ai</loc>
<lastmod>2026-06-05</lastmod>
<lastmod>2026-06-07</lastmod>
<changefreq>weekly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>http://localhost/skill/permission-manager</loc>
<lastmod>2026-06-05</lastmod>
<lastmod>2026-06-07</lastmod>
<changefreq>weekly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>http://localhost/skill/skill-suggester</loc>
<lastmod>2026-06-05</lastmod>
<lastmod>2026-06-07</lastmod>
<changefreq>weekly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>http://localhost/skill/smart-git-automation</loc>
<lastmod>2026-06-05</lastmod>
<lastmod>2026-06-07</lastmod>
<changefreq>weekly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>http://localhost/skill/antigravity-agent-manager</loc>
<lastmod>2026-06-05</lastmod>
<lastmod>2026-06-07</lastmod>
<changefreq>weekly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>http://localhost/skill/hasdata</loc>
<lastmod>2026-06-05</lastmod>
<lastmod>2026-06-07</lastmod>
<changefreq>weekly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>http://localhost/skill/hasdata-cli</loc>
<lastmod>2026-06-05</lastmod>
<lastmod>2026-06-07</lastmod>
<changefreq>weekly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>http://localhost/skill/linkedin-content-generator</loc>
<lastmod>2026-06-05</lastmod>
<lastmod>2026-06-07</lastmod>
<changefreq>weekly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>http://localhost/skill/accesslint-audit</loc>
<lastmod>2026-06-05</lastmod>
<lastmod>2026-06-07</lastmod>
<changefreq>weekly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>http://localhost/skill/accesslint-diff</loc>
<lastmod>2026-06-05</lastmod>
<lastmod>2026-06-07</lastmod>
<changefreq>weekly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>http://localhost/skill/accesslint-scan</loc>
<lastmod>2026-06-05</lastmod>
<lastmod>2026-06-07</lastmod>
<changefreq>weekly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>http://localhost/skill/composition-patterns</loc>
<lastmod>2026-06-05</lastmod>
<lastmod>2026-06-07</lastmod>
<changefreq>weekly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>http://localhost/skill/debugging-toolkit</loc>
<lastmod>2026-06-05</lastmod>
<lastmod>2026-06-07</lastmod>
<changefreq>weekly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>http://localhost/skill/deploy-to-vercel</loc>
<lastmod>2026-06-05</lastmod>
<lastmod>2026-06-07</lastmod>
<changefreq>weekly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>http://localhost/skill/polis-protocol</loc>
<lastmod>2026-06-05</lastmod>
<lastmod>2026-06-07</lastmod>
<changefreq>weekly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>http://localhost/skill/python-development</loc>
<lastmod>2026-06-05</lastmod>
<lastmod>2026-06-07</lastmod>
<changefreq>weekly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>http://localhost/skill/react-native-skills</loc>
<lastmod>2026-06-05</lastmod>
<lastmod>2026-06-07</lastmod>
<changefreq>weekly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>http://localhost/skill/skill-issue</loc>
<lastmod>2026-06-05</lastmod>
<lastmod>2026-06-07</lastmod>
<changefreq>weekly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>http://localhost/skill/tdd-workflows</loc>
<lastmod>2026-06-05</lastmod>
<lastmod>2026-06-07</lastmod>
<changefreq>weekly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>http://localhost/skill/vercel-cli-with-tokens</loc>
<lastmod>2026-06-05</lastmod>
<lastmod>2026-06-07</lastmod>
<changefreq>weekly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>http://localhost/skill/vercel-optimize</loc>
<lastmod>2026-06-05</lastmod>
<lastmod>2026-06-07</lastmod>
<changefreq>weekly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>http://localhost/skill/vercel-react-view-transitions</loc>
<lastmod>2026-06-05</lastmod>
<lastmod>2026-06-07</lastmod>
<changefreq>weekly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>http://localhost/skill/doc2math</loc>
<lastmod>2026-06-05</lastmod>
<lastmod>2026-06-07</lastmod>
<changefreq>weekly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>http://localhost/skill/moatmri</loc>
<lastmod>2026-06-05</lastmod>
<lastmod>2026-06-07</lastmod>
<changefreq>weekly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>http://localhost/skill/nextjs-seo-indexing</loc>
<lastmod>2026-06-05</lastmod>
<lastmod>2026-06-07</lastmod>
<changefreq>weekly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>http://localhost/skill/schema-markup-generator</loc>
<lastmod>2026-06-05</lastmod>
<lastmod>2026-06-07</lastmod>
<changefreq>weekly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>http://localhost/skill/social-metadata-hardening</loc>
<lastmod>2026-06-05</lastmod>
<lastmod>2026-06-07</lastmod>
<changefreq>weekly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>http://localhost/skill/user-thoughts</loc>
<lastmod>2026-06-05</lastmod>
<lastmod>2026-06-07</lastmod>
<changefreq>weekly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>http://localhost/skill/vibe-code-cleanup</loc>
<lastmod>2026-06-05</lastmod>
<lastmod>2026-06-07</lastmod>
<changefreq>weekly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>http://localhost/skill/vibecode-production-qa-validator</loc>
<lastmod>2026-06-05</lastmod>
<lastmod>2026-06-07</lastmod>
<changefreq>weekly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>http://localhost/skill/yield-intelligence</loc>
<lastmod>2026-06-05</lastmod>
<changefreq>weekly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>http://localhost/skill/container-security-hardening</loc>
<lastmod>2026-06-05</lastmod>
<changefreq>weekly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>http://localhost/skill/github-actions-advanced</loc>
<lastmod>2026-06-05</lastmod>
<changefreq>weekly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>http://localhost/skill/longbridge</loc>
<lastmod>2026-06-05</lastmod>
<changefreq>weekly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>http://localhost/skill/youtube-full</loc>
<lastmod>2026-06-05</lastmod>
<changefreq>weekly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>http://localhost/skill/runaway-guard</loc>
<lastmod>2026-06-05</lastmod>
<lastmod>2026-06-07</lastmod>
<changefreq>weekly</changefreq>
<priority>0.7</priority>
</url>

View File

@ -124,9 +124,9 @@
"claude": "supported"
},
"setup": {
"type": "none",
"summary": "",
"docs": null
"type": "manual",
"summary": "Install Python requirements and configure a 2slides API key before running generation scripts.",
"docs": "SKILL.md"
},
"reasons": []
}
@ -2477,6 +2477,28 @@
"reasons": []
}
},
{
"id": "article-illustrations",
"path": "skills/article-illustrations",
"category": "creative",
"name": "article-illustrations",
"description": "Generate hand-drawn 16:9 article illustrations with the Grav character IP, sparse annotations, and absurd but clear visual metaphors.",
"risk": "safe",
"source": "community",
"date_added": "2026-06-06",
"plugin": {
"targets": {
"codex": "supported",
"claude": "supported"
},
"setup": {
"type": "none",
"summary": "",
"docs": null
},
"reasons": []
}
},
{
"id": "asana-automation",
"path": "skills/asana-automation",
@ -9711,6 +9733,28 @@
"reasons": []
}
},
{
"id": "cv-generator",
"path": "skills/cv-generator",
"category": "content",
"name": "cv-generator",
"description": "Generate professional, ATS-optimized CVs for FlowCV, Canva, Google Docs, or Word. Handles multi-source merging, JD targeting, seniority adaptation, and humanized rewriting. Outputs paste-ready text with an ATS flaw report and improvement suggestions.",
"risk": "safe",
"source": "community",
"date_added": "2026-06-06",
"plugin": {
"targets": {
"codex": "supported",
"claude": "supported"
},
"setup": {
"type": "none",
"summary": "",
"docs": null
},
"reasons": []
}
},
{
"id": "daily",
"path": "skills/daily",
@ -21998,6 +22042,28 @@
"reasons": []
}
},
{
"id": "open-dynamic-workflows",
"path": "skills/open-dynamic-workflows",
"category": "ai-agents",
"name": "open-dynamic-workflows",
"description": "Plan, orchestrate, and adversarially verify parallel AI coding agents with a dynamic multi-agent workflow engine.",
"risk": "critical",
"source": "community",
"date_added": "2026-06-06",
"plugin": {
"targets": {
"codex": "supported",
"claude": "supported"
},
"setup": {
"type": "none",
"summary": "",
"docs": null
},
"reasons": []
}
},
{
"id": "openapi-spec-generation",
"path": "skills/openapi-spec-generation",
@ -22994,20 +23060,22 @@
"category": "orchestration",
"name": "polis-protocol",
"description": "Coordinate multi-vendor AI agents as a self-improving team \u2014 a learning router assigns work by track record and citizens can amend the protocol's own rules.",
"risk": "safe",
"risk": "critical",
"source": "community",
"date_added": "2026-06-02",
"plugin": {
"targets": {
"codex": "supported",
"claude": "supported"
"codex": "blocked",
"claude": "blocked"
},
"setup": {
"type": "none",
"summary": "",
"docs": null
},
"reasons": []
"reasons": [
"explicit_target_restriction"
]
}
},
{
@ -25212,6 +25280,28 @@
"reasons": []
}
},
{
"id": "runapi-cli",
"path": "skills/runapi-cli",
"category": "development",
"name": "runapi-cli",
"description": "Generate AI images, videos, and music/audio from agents using the RunAPI CLI.",
"risk": "critical",
"source": "official",
"date_added": "2026-06-07",
"plugin": {
"targets": {
"codex": "supported",
"claude": "supported"
},
"setup": {
"type": "none",
"summary": "",
"docs": null
},
"reasons": []
}
},
{
"id": "runaway-guard",
"path": "skills/runaway-guard",
@ -31910,6 +32000,28 @@
"reasons": []
}
},
{
"id": "video-content-extractor",
"path": "skills/video-content-extractor",
"category": "media-processing",
"name": "video-content-extractor",
"description": "Extract key frames from MP4 videos at configurable intervals, run Tesseract OCR, and generate structured Markdown reports with video metadata and timestamped text transcripts.",
"risk": "safe",
"source": "community",
"date_added": "2026-06-06",
"plugin": {
"targets": {
"codex": "supported",
"claude": "supported"
},
"setup": {
"type": "none",
"summary": "",
"docs": null
},
"reasons": []
}
},
{
"id": "videodb",
"path": "skills/videodb",

View File

@ -1,6 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 630" role="img" aria-labelledby="title desc">
<title id="title">Antigravity Awesome Skills social card</title>
<desc id="desc">Social preview for Antigravity Awesome Skills with a 1,520 plus agentic skills headline and supported tools including Claude Code, Cursor, Codex CLI, Gemini CLI, and Antigravity.</desc>
<desc id="desc">Social preview for Antigravity Awesome Skills with a 1,525 plus agentic skills headline and supported tools including Claude Code, Cursor, Codex CLI, Gemini CLI, and Antigravity.</desc>
<defs>
<linearGradient id="bg" x1="0" y1="0" x2="1" y2="1">
<stop offset="0%" stop-color="#050816" />
@ -32,7 +32,7 @@
<rect x="88" y="88" width="252" height="42" rx="21" fill="#0b1228" stroke="#273657" />
<text x="110" y="115" font-family="Arial, Helvetica, sans-serif" font-size="20" font-weight="700" fill="#cbd5e1">INSTALLABLE GITHUB LIBRARY</text>
<text x="88" y="206" font-family="Arial, Helvetica, sans-serif" font-size="68" font-weight="800" fill="#f8fafc">1,520+ Agentic Skills</text>
<text x="88" y="206" font-family="Arial, Helvetica, sans-serif" font-size="68" font-weight="800" fill="#f8fafc">1,525+ Agentic Skills</text>
<rect x="90" y="228" width="430" height="8" rx="4" fill="url(#accent)" />
<text x="88" y="292" font-family="Arial, Helvetica, sans-serif" font-size="31" font-weight="600" fill="#dbeafe">For Claude Code, Cursor, Codex CLI, Gemini CLI,</text>

Before

Width:  |  Height:  |  Size: 4.0 KiB

After

Width:  |  Height:  |  Size: 4.0 KiB

View File

@ -213,10 +213,10 @@ function readTarGzipEntries(archivePath) {
} else if (type === 'K') {
longLink = data.toString('utf8').replace(/\0.*$/s, '');
} else {
const name = longName || pax.path || [readTarString(header, 345, 155), readTarString(header, 0, 100)]
const name = pax.path || longName || [readTarString(header, 345, 155), readTarString(header, 0, 100)]
.filter(Boolean)
.join('/');
const linkName = longLink || pax.linkpath || readTarString(header, 157, 100);
const linkName = pax.linkpath || longLink || readTarString(header, 157, 100);
entries.push({ name, type: type || '0', linkName });
pax = {};
longName = null;

View File

@ -9,7 +9,7 @@ const PUBLIC_DIR = path.join(ROOT_DIR, 'public');
const TEMPLATE_PATH = path.join(DIST_DIR, 'index.html');
const SKILLS_PATH = path.join(PUBLIC_DIR, 'skills.json');
const HOME_CATALOG_COUNT_FALLBACK = 1520;
const HOME_CATALOG_COUNT_FALLBACK = 1525;
const PRERENDER_SOCIAL_IMAGE = 'social-card.svg';
const SITE_NAME = 'Antigravity Awesome Skills';
const REPOSITORY_URL = 'https://github.com/sickn33/antigravity-awesome-skills';
@ -18,7 +18,7 @@ const FAQ_ITEMS = [
{
question: 'What is Antigravity Awesome Skills?',
answer:
'Antigravity Awesome Skills is an installable GitHub library of 1,520+ reusable SKILL.md playbooks for AI coding assistants. It supports Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and related hosts through direct skill installs, specialized plugins, bundles, workflows, and a searchable catalog.',
'Antigravity Awesome Skills is an installable GitHub library of 1,525+ reusable SKILL.md playbooks for AI coding assistants. It supports Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and related hosts through direct skill installs, specialized plugins, bundles, workflows, and a searchable catalog.',
},
{
question: 'How do I install Antigravity Awesome Skills?',

View File

@ -276,7 +276,7 @@ export function assertIndexDiscoveryMeta(htmlText) {
twitterDescription,
].join(' ');
assert(combined.includes('1,520+'), 'Home SEO metadata must expose the current 1,520+ skill count.');
assert(combined.includes('1,525+'), 'Home SEO metadata must expose the current 1,525+ skill count.');
assert(combined.includes('specialized plugins'), 'Home SEO metadata must mention specialized plugins.');
assert(!combined.includes('prompt templates'), 'Home SEO metadata must not use stale prompt-template positioning.');
assertJsonLdTypes(htmlText, ['CollectionPage', 'Organization', 'WebSite', 'SoftwareSourceCode', 'FAQPage']);
@ -344,7 +344,7 @@ export function assertLlms(llmsText) {
const text = String(llmsText ?? '');
const requiredSnippets = [
'# Antigravity Awesome Skills',
'1,520+',
'1,525+',
'specialized plugins',
'Claude Code',
'Codex CLI',

View File

@ -78,7 +78,7 @@ describe('seo assets verification helpers', () => {
it('requires llms.txt discovery signals', () => {
const llms = `
# Antigravity Awesome Skills
1,520+ agentic skills with specialized plugins for Claude Code and Codex CLI.
1,525+ agentic skills with specialized plugins for Claude Code and Codex CLI.
https://github.com/sickn33/antigravity-awesome-skills
Canonical source of truth: the GitHub repository is the primary project URL.
`;
@ -104,12 +104,12 @@ describe('seo assets verification helpers', () => {
const html = `
<html>
<head>
<title>Antigravity Awesome Skills | 1,520+ AI coding skills and plugins</title>
<meta name="description" content="Explore 1,520+ installable agentic skills, specialized plugins, bundles, and workflows." />
<meta property="og:title" content="Antigravity Awesome Skills | 1,520+ AI coding skills and plugins" />
<meta property="og:description" content="Explore 1,520+ installable agentic skills, specialized plugins, bundles, and workflows." />
<meta name="twitter:title" content="Antigravity Awesome Skills | 1,520+ AI coding skills and plugins" />
<meta name="twitter:description" content="Explore 1,520+ installable agentic skills, specialized plugins, bundles, and workflows." />
<title>Antigravity Awesome Skills | 1,525+ AI coding skills and plugins</title>
<meta name="description" content="Explore 1,525+ installable agentic skills, specialized plugins, bundles, and workflows." />
<meta property="og:title" content="Antigravity Awesome Skills | 1,525+ AI coding skills and plugins" />
<meta property="og:description" content="Explore 1,525+ installable agentic skills, specialized plugins, bundles, and workflows." />
<meta name="twitter:title" content="Antigravity Awesome Skills | 1,525+ AI coding skills and plugins" />
<meta name="twitter:description" content="Explore 1,525+ installable agentic skills, specialized plugins, bundles, and workflows." />
<script type="application/ld+json">
[
{"@context":"https://schema.org","@type":"CollectionPage","sameAs":"https://github.com/sickn33/antigravity-awesome-skills"},

View File

@ -83,6 +83,17 @@ function createTarGzip(entries) {
return zlib.gzipSync(Buffer.concat(blocks));
}
function createPaxRecord(key, value) {
let record = ` ${key}=${value}\n`;
let length = Buffer.byteLength(record);
while (true) {
const next = `${length}${record}`;
const nextLength = Buffer.byteLength(next);
if (nextLength === length) return next;
length = nextLength;
}
}
async function loadRefreshHandler() {
const { default: refreshSkillsPlugin } = await import('../../refresh-skills-plugin.js');
const registrations = [];
@ -382,4 +393,43 @@ describe('refresh-skills plugin security', () => {
fs.rmSync(tempDir, { recursive: true, force: true });
}
});
it('prefers PAX tar paths over GNU long names before validation', async () => {
const {
assertSafeArchiveEntries,
readTarGzipEntries,
} = await import('../../refresh-skills-plugin.js');
const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'archive-pax-test-'));
const archivePath = path.join(tempDir, 'pax.tar.gz');
try {
fs.writeFileSync(
archivePath,
createTarGzip([
{
name: 'pax-header',
type: 'x',
data: createPaxRecord('path', '../outside'),
},
{
name: '././@LongLink',
type: 'L',
data: 'antigravity-awesome-skills-main/skills/demo/SKILL.md\0',
},
{
name: 'antigravity-awesome-skills-main/skills/demo/SKILL.md',
data: 'demo',
},
]),
);
const entries = readTarGzipEntries(archivePath);
expect(entries[0].name).toBe('../outside');
expect(() => assertSafeArchiveEntries(entries, { rejectLinks: true })).toThrow(
'Unsafe archive entry path',
);
} finally {
fs.rmSync(tempDir, { recursive: true, force: true });
}
});
});

View File

@ -128,6 +128,6 @@ export const specializedPlugins: SpecializedPlugin[] = [
priority: 'tier-2',
audience: 'Mobile teams shipping Expo, React Native, Flutter, and iOS apps.',
why: 'Covers architecture, Expo routes, distribution, CI, native platforms, and store optimization.',
skills: ['expo-api-routes', 'expo-dev-client', 'expo-deployment', 'expo-cicd-workflows', 'react-native-patterns', 'mobile-design', 'flutter-expert', 'ios-developer', 'app-store-optimization'],
skills: ['mobile-developer', 'react-native-architecture', 'expo-api-routes', 'expo-dev-client', 'expo-deployment', 'expo-cicd-workflows', 'mobile-design', 'flutter-expert', 'ios-developer', 'app-store-optimization'],
},
];

View File

@ -13,6 +13,10 @@ function pluginDocUrl(): string {
return `${repoBaseUrl}/blob/main/docs/users/plugins.md`;
}
function bundleDocUrl(): string {
return `${repoBaseUrl}/blob/main/docs/users/bundles.md`;
}
export function Plugins(): React.ReactElement {
usePageMeta(buildPluginsMeta(specializedPlugins.length));
@ -32,7 +36,7 @@ export function Plugins(): React.ReactElement {
Choose the focused AAS plugin for your AI coding workflow
</h1>
<p className="mt-4 max-w-4xl text-sm leading-relaxed text-slate-600 sm:text-base dark:text-slate-300">
AAS specialized plugins are focused, domain-specific distributions of the 1,520+ skill library.
AAS specialized plugins are focused, domain-specific distributions of the 1,525+ skill library.
Start here when you know the job: web apps, security, data analytics, documents, DevOps, QA,
OSS maintenance, mobile apps, automation, or agent and MCP systems.
</p>
@ -148,7 +152,7 @@ function PluginSection({
View plugin folder
</a>
<a
href={`${repoBaseUrl}/blob/main/docs/users/bundles.md#${plugin.id}`}
href={bundleDocUrl()}
target="_blank"
rel="noreferrer"
className="inline-flex items-center justify-center rounded-lg border border-slate-300 px-3 py-2 text-sm font-semibold text-slate-800 transition-colors hover:bg-slate-100 dark:border-slate-700 dark:text-slate-200 dark:hover:bg-slate-800"

View File

@ -10,7 +10,7 @@ const FAQ_ITEMS = [
{
question: 'What is Antigravity Awesome Skills?',
answer:
'Antigravity Awesome Skills is an installable GitHub library of 1,520+ reusable SKILL.md playbooks for AI coding assistants. It supports Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and related hosts through direct skill installs, specialized plugins, bundles, workflows, and a searchable catalog.',
'Antigravity Awesome Skills is an installable GitHub library of 1,525+ reusable SKILL.md playbooks for AI coding assistants. It supports Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and related hosts through direct skill installs, specialized plugins, bundles, workflows, and a searchable catalog.',
},
{
question: 'How do I install Antigravity Awesome Skills?',

View File

@ -966,6 +966,7 @@
"odoo-xml-views-builder",
"office-productivity",
"one-drive-automation",
"open-dynamic-workflows",
"openclaw-github-repo-commander",
"os-scripting",
"outlook-automation",
@ -982,6 +983,7 @@
"reddit-automation",
"render-automation",
"revops",
"runapi-cli",
"salesforce-automation",
"security-audit",
"security/aws-secrets-rotation",

View File

@ -1,6 +1,6 @@
{
"generatedAt": "2026-02-08T00:00:00.000Z",
"total": 1520,
"total": 1525,
"skills": [
{
"id": "00-andruia-consultant",
@ -2801,6 +2801,34 @@
],
"path": "skills/arm-cortex-expert/SKILL.md"
},
{
"id": "article-illustrations",
"name": "article-illustrations",
"description": "Generate hand-drawn 16:9 article illustrations with the Grav character IP, sparse annotations, and absurd but clear visual metaphors.",
"category": "general",
"tags": [
"illustration",
"article-graphics",
"visual-metaphors",
"image-generation",
"whiteboard-sketch"
],
"triggers": [
"illustration",
"article-graphics",
"visual-metaphors",
"image-generation",
"whiteboard-sketch",
"article",
"illustrations",
"generate",
"hand",
"drawn",
"16",
"grav"
],
"path": "skills/article-illustrations/SKILL.md"
},
{
"id": "asana-automation",
"name": "asana-automation",
@ -10844,6 +10872,35 @@
],
"path": "skills/customs-trade-compliance/SKILL.md"
},
{
"id": "cv-generator",
"name": "cv-generator",
"description": "Generate professional, ATS-optimized CVs for FlowCV, Canva, Google Docs, or Word. Handles multi-source merging, JD targeting, seniority adaptation, and humanized rewriting. Outputs paste-ready text with an ATS flaw report and improvement suggestions.",
"category": "general",
"tags": [
"cv",
"resume",
"ats",
"career",
"job-application",
"career-change"
],
"triggers": [
"cv",
"resume",
"ats",
"career",
"job-application",
"career-change",
"generator",
"generate",
"professional",
"optimized",
"cvs",
"flowcv"
],
"path": "skills/cv-generator/SKILL.md"
},
{
"id": "daily",
"name": "daily",
@ -24758,6 +24815,34 @@
],
"path": "skills/one-drive-automation/SKILL.md"
},
{
"id": "open-dynamic-workflows",
"name": "open-dynamic-workflows",
"description": "Plan, orchestrate, and adversarially verify parallel AI coding agents with a dynamic multi-agent workflow engine.",
"category": "data-ai",
"tags": [
"multi-agent",
"orchestration",
"workflow",
"adversarial-verification",
"coding-agents"
],
"triggers": [
"multi-agent",
"orchestration",
"workflow",
"adversarial-verification",
"coding-agents",
"open",
"dynamic",
"plan",
"orchestrate",
"adversarially",
"verify",
"parallel"
],
"path": "skills/open-dynamic-workflows/SKILL.md"
},
{
"id": "openapi-spec-generation",
"name": "openapi-spec-generation",
@ -28341,6 +28426,36 @@
],
"path": "skills/ruby-pro/SKILL.md"
},
{
"id": "runapi-cli",
"name": "runapi-cli",
"description": "Generate AI images, videos, and music/audio from agents using the RunAPI CLI.",
"category": "data-ai",
"tags": [
"runapi",
"cli",
"models",
"automation",
"codex",
"claude",
"gemini"
],
"triggers": [
"runapi",
"cli",
"models",
"automation",
"codex",
"claude",
"gemini",
"generate",
"ai",
"images",
"videos",
"music"
],
"path": "skills/runapi-cli/SKILL.md"
},
{
"id": "runaway-guard",
"name": "runaway-guard",
@ -35961,6 +36076,35 @@
],
"path": "skills/viboscope/SKILL.md"
},
{
"id": "video-content-extractor",
"name": "video-content-extractor",
"description": "Extract key frames from MP4 videos at configurable intervals, run Tesseract OCR, and generate structured Markdown reports with video metadata and timestamped text transcripts.",
"category": "general",
"tags": [
"video",
"ocr",
"ffmpeg",
"tesseract",
"frame-extraction",
"media"
],
"triggers": [
"video",
"ocr",
"ffmpeg",
"tesseract",
"frame-extraction",
"media",
"content",
"extractor",
"extract",
"key",
"frames",
"mp4"
],
"path": "skills/video-content-extractor/SKILL.md"
},
{
"id": "videodb",
"name": "videodb",

View File

@ -84,16 +84,18 @@
"claude": "supported"
},
"setup": {
"type": "none",
"summary": "",
"docs": null
"type": "manual",
"summary": "Install Python requirements and configure a 2slides API key before running generation scripts.",
"docs": "SKILL.md"
},
"reasons": [],
"blocked_reasons": {
"codex": [],
"claude": []
},
"runtime_files": []
"runtime_files": [
"requirements.txt"
]
},
{
"id": "3d-web-experience",
@ -2141,6 +2143,25 @@
},
"runtime_files": []
},
{
"id": "article-illustrations",
"path": "skills/article-illustrations",
"targets": {
"codex": "supported",
"claude": "supported"
},
"setup": {
"type": "none",
"summary": "",
"docs": null
},
"reasons": [],
"blocked_reasons": {
"codex": [],
"claude": []
},
"runtime_files": []
},
{
"id": "asana-automation",
"path": "skills/asana-automation",
@ -8309,6 +8330,25 @@
},
"runtime_files": []
},
{
"id": "cv-generator",
"path": "skills/cv-generator",
"targets": {
"codex": "supported",
"claude": "supported"
},
"setup": {
"type": "none",
"summary": "",
"docs": null
},
"reasons": [],
"blocked_reasons": {
"codex": [],
"claude": []
},
"runtime_files": []
},
{
"id": "daily",
"path": "skills/daily",
@ -19132,6 +19172,25 @@
},
"runtime_files": []
},
{
"id": "open-dynamic-workflows",
"path": "skills/open-dynamic-workflows",
"targets": {
"codex": "supported",
"claude": "supported"
},
"setup": {
"type": "none",
"summary": "",
"docs": null
},
"reasons": [],
"blocked_reasons": {
"codex": [],
"claude": []
},
"runtime_files": []
},
{
"id": "openapi-spec-generation",
"path": "skills/openapi-spec-generation",
@ -19974,18 +20033,24 @@
"id": "polis-protocol",
"path": "skills/polis-protocol",
"targets": {
"codex": "supported",
"claude": "supported"
"codex": "blocked",
"claude": "blocked"
},
"setup": {
"type": "none",
"summary": "",
"docs": null
},
"reasons": [],
"reasons": [
"explicit_target_restriction"
],
"blocked_reasons": {
"codex": [],
"claude": []
"codex": [
"explicit_target_restriction"
],
"claude": [
"explicit_target_restriction"
]
},
"runtime_files": []
},
@ -21893,6 +21958,25 @@
},
"runtime_files": []
},
{
"id": "runapi-cli",
"path": "skills/runapi-cli",
"targets": {
"codex": "supported",
"claude": "supported"
},
"setup": {
"type": "none",
"summary": "",
"docs": null
},
"reasons": [],
"blocked_reasons": {
"codex": [],
"claude": []
},
"runtime_files": []
},
{
"id": "runaway-guard",
"path": "skills/runaway-guard",
@ -27795,6 +27879,25 @@
},
"runtime_files": []
},
{
"id": "video-content-extractor",
"path": "skills/video-content-extractor",
"targets": {
"codex": "supported",
"claude": "supported"
},
"setup": {
"type": "none",
"summary": "",
"docs": null
},
"reasons": [],
"blocked_reasons": {
"codex": [],
"claude": []
},
"runtime_files": []
},
{
"id": "videodb",
"path": "skills/videodb",
@ -29152,15 +29255,15 @@
}
],
"summary": {
"total_skills": 1520,
"total_skills": 1525,
"supported": {
"codex": 1472,
"claude": 1489
"codex": 1476,
"claude": 1493
},
"blocked": {
"codex": 48,
"claude": 31
"codex": 49,
"claude": 32
},
"manual_setup": 4
"manual_setup": 5
}
}

View File

@ -124,9 +124,9 @@
"claude": "supported"
},
"setup": {
"type": "none",
"summary": "",
"docs": null
"type": "manual",
"summary": "Install Python requirements and configure a 2slides API key before running generation scripts.",
"docs": "SKILL.md"
},
"reasons": []
}
@ -2477,6 +2477,28 @@
"reasons": []
}
},
{
"id": "article-illustrations",
"path": "skills/article-illustrations",
"category": "creative",
"name": "article-illustrations",
"description": "Generate hand-drawn 16:9 article illustrations with the Grav character IP, sparse annotations, and absurd but clear visual metaphors.",
"risk": "safe",
"source": "community",
"date_added": "2026-06-06",
"plugin": {
"targets": {
"codex": "supported",
"claude": "supported"
},
"setup": {
"type": "none",
"summary": "",
"docs": null
},
"reasons": []
}
},
{
"id": "asana-automation",
"path": "skills/asana-automation",
@ -9711,6 +9733,28 @@
"reasons": []
}
},
{
"id": "cv-generator",
"path": "skills/cv-generator",
"category": "content",
"name": "cv-generator",
"description": "Generate professional, ATS-optimized CVs for FlowCV, Canva, Google Docs, or Word. Handles multi-source merging, JD targeting, seniority adaptation, and humanized rewriting. Outputs paste-ready text with an ATS flaw report and improvement suggestions.",
"risk": "safe",
"source": "community",
"date_added": "2026-06-06",
"plugin": {
"targets": {
"codex": "supported",
"claude": "supported"
},
"setup": {
"type": "none",
"summary": "",
"docs": null
},
"reasons": []
}
},
{
"id": "daily",
"path": "skills/daily",
@ -21998,6 +22042,28 @@
"reasons": []
}
},
{
"id": "open-dynamic-workflows",
"path": "skills/open-dynamic-workflows",
"category": "ai-agents",
"name": "open-dynamic-workflows",
"description": "Plan, orchestrate, and adversarially verify parallel AI coding agents with a dynamic multi-agent workflow engine.",
"risk": "critical",
"source": "community",
"date_added": "2026-06-06",
"plugin": {
"targets": {
"codex": "supported",
"claude": "supported"
},
"setup": {
"type": "none",
"summary": "",
"docs": null
},
"reasons": []
}
},
{
"id": "openapi-spec-generation",
"path": "skills/openapi-spec-generation",
@ -22994,20 +23060,22 @@
"category": "orchestration",
"name": "polis-protocol",
"description": "Coordinate multi-vendor AI agents as a self-improving team \u2014 a learning router assigns work by track record and citizens can amend the protocol's own rules.",
"risk": "safe",
"risk": "critical",
"source": "community",
"date_added": "2026-06-02",
"plugin": {
"targets": {
"codex": "supported",
"claude": "supported"
"codex": "blocked",
"claude": "blocked"
},
"setup": {
"type": "none",
"summary": "",
"docs": null
},
"reasons": []
"reasons": [
"explicit_target_restriction"
]
}
},
{
@ -25212,6 +25280,28 @@
"reasons": []
}
},
{
"id": "runapi-cli",
"path": "skills/runapi-cli",
"category": "development",
"name": "runapi-cli",
"description": "Generate AI images, videos, and music/audio from agents using the RunAPI CLI.",
"risk": "critical",
"source": "official",
"date_added": "2026-06-07",
"plugin": {
"targets": {
"codex": "supported",
"claude": "supported"
},
"setup": {
"type": "none",
"summary": "",
"docs": null
},
"reasons": []
}
},
{
"id": "runaway-guard",
"path": "skills/runaway-guard",
@ -31910,6 +32000,28 @@
"reasons": []
}
},
{
"id": "video-content-extractor",
"path": "skills/video-content-extractor",
"category": "media-processing",
"name": "video-content-extractor",
"description": "Extract key frames from MP4 videos at configurable intervals, run Tesseract OCR, and generate structured Markdown reports with video metadata and timestamped text transcripts.",
"risk": "safe",
"source": "community",
"date_added": "2026-06-06",
"plugin": {
"targets": {
"codex": "supported",
"claude": "supported"
},
"setup": {
"type": "none",
"summary": "",
"docs": null
},
"reasons": []
}
},
{
"id": "videodb",
"path": "skills/videodb",

View File

@ -1,9 +1,9 @@
---
title: Jetski/Cortex + Gemini Integration Guide
description: "Use antigravity-awesome-skills with Jetski/Cortex without hitting context-window overflow with 1,520+ skills."
description: "Use antigravity-awesome-skills with Jetski/Cortex without hitting context-window overflow with 1,525+ skills."
---
# Jetski/Cortex + Gemini: safe integration with 1,520+ skills
# Jetski/Cortex + Gemini: safe integration with 1,525+ skills
This guide shows how to integrate the `antigravity-awesome-skills` repository with an agent based on **Jetski/Cortex + Gemini** (or similar frameworks) **without exceeding the model context window**.
@ -23,7 +23,7 @@ Never do:
- concatenate all `SKILL.md` content into a single system prompt;
- re-inject the entire library for **every** request.
With 1,520+ skills, this approach fills the context window before user messages are even added, causing truncation.
With 1,525+ skills, this approach fills the context window before user messages are even added, causing truncation.
---

View File

@ -21,7 +21,7 @@ This example shows one way to integrate **antigravity-awesome-skills** with a Je
- How to enforce a **maximum number of skills per turn** via `maxSkillsPerTurn`.
- How to choose whether to **truncate or error** when too many skills are requested via `overflowBehavior`.
This pattern avoids context overflow when you have 1,520+ skills installed.
This pattern avoids context overflow when you have 1,525+ skills installed.
Manifest contract references:

View File

@ -6,7 +6,7 @@ This document keeps the repository's GitHub-facing discovery copy aligned with t
Preferred positioning:
> Installable GitHub library of 1,520+ agentic skills for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and other AI coding assistants.
> Installable GitHub library of 1,525+ agentic skills for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and other AI coding assistants.
Key framing:
@ -20,7 +20,7 @@ Key framing:
Preferred description:
> Installable GitHub library of 1,520+ agentic skills for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and more. Includes installer CLI, bundles, workflows, and official/community skill collections.
> Installable GitHub library of 1,525+ agentic skills for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and more. Includes installer CLI, bundles, workflows, and official/community skill collections.
Preferred homepage:
@ -28,7 +28,7 @@ Preferred homepage:
Preferred social preview:
- use a clean preview image that says `1,520+ Agentic Skills`;
- use a clean preview image that says `1,525+ Agentic Skills`;
- mention Claude Code, Cursor, Codex CLI, and Gemini CLI;
- avoid dense text and tiny logos that disappear in social cards.

View File

@ -72,7 +72,7 @@ The update process refreshes:
- Canonical skills index (`skills_index.json`)
- Compatibility mirror (`data/skills_index.json`)
- Web app skills data (`apps\web-app\public\skills.json`)
- All 1,520+ skills from the skills directory
- All 1,525+ skills from the skills directory
## When to Update

View File

@ -11,6 +11,7 @@ If you recognize your work here and it is not properly attributed, please open a
| `burp-suite-testing` | [PortSwigger](https://portswigger.net/burp) | N/A | Usage guide only (no binary). |
| `crewai` | [CrewAI](https://github.com/joaomdmoura/crewAI) | MIT | Framework guides. |
| `hasdata`, `hasdata-cli` | [HasData CLI](https://github.com/HasData/hasdata-cli) | MIT | Official HasData API and CLI guidance. |
| `runapi-cli` | [RunAPI CLI Skill](https://github.com/runapi-ai/cli-skill) | Apache-2.0 | Official RunAPI CLI skill for generating AI images, videos, and music/audio, plus other model API jobs. |
| `langgraph` | [LangGraph](https://github.com/langchain-ai/langgraph) | MIT | Framework guides. |
| `react-patterns` | [React Docs](https://react.dev/) | CC-BY | Official patterns. |
| **All Official Skills** | [Anthropic / Google / OpenAI / Microsoft / Supabase / Apify / Vercel Labs] | Proprietary | Usage encouraged by vendors. |

View File

@ -917,4 +917,4 @@ Found a skill that should be in a bundle? Or want to create a new bundle? [Open
---
_Last updated: March 2026 | Total Skills: 1,520+ | Total Bundles: 52_
_Last updated: March 2026 | Total Skills: 1,525+ | Total Bundles: 52_

View File

@ -12,7 +12,7 @@ Install the library into Claude Code, then invoke focused skills directly in the
## Why use this repo for Claude Code
- It includes 1,520+ skills instead of a narrow single-domain starter pack.
- It includes 1,525+ skills instead of a narrow single-domain starter pack.
- It supports the standard `.claude/skills/` path and the Claude Code plugin marketplace flow.
- It also ships generated bundle plugins so teams can install focused packs like `Essentials` or `Security Developer` from the marketplace metadata.
- It includes onboarding docs, bundles, and workflows so new users do not need to guess where to begin.

View File

@ -12,7 +12,7 @@ Install into the Gemini skills path, then ask Gemini to apply one skill at a tim
- It installs directly into the expected Gemini skills path.
- It includes both core software engineering skills and deeper agent/LLM-oriented skills.
- It helps new users get started with bundles and workflows rather than forcing a cold start from 1,520+ files.
- It helps new users get started with bundles and workflows rather than forcing a cold start from 1,525+ files.
- It is useful whether you want a broad internal skill library or a single repo to test many workflows quickly.
## Install Gemini CLI Skills

View File

@ -1,4 +1,4 @@
# Getting Started with Antigravity Awesome Skills (V12.1.0)
# Getting Started with Antigravity Awesome Skills (V12.2.1)
**New here? This guide will help you supercharge your AI Agent in 5 minutes.**

View File

@ -18,7 +18,7 @@ Kiro is AWS's agentic AI IDE that combines:
Kiro's agentic capabilities are enhanced by skills that provide:
- **Domain expertise** across 1,520+ specialized areas
- **Domain expertise** across 1,525+ specialized areas
- **Best practices** from Anthropic, OpenAI, Google, Microsoft, and AWS
- **Workflow automation** for common development tasks
- **AWS-specific patterns** for serverless, infrastructure, and cloud architecture

View File

@ -14,7 +14,7 @@ If you came in through a **Claude Code** or **Codex** plugin instead of a full l
When you ran `npx antigravity-awesome-skills` or cloned the repository, you:
**Downloaded 1,520+ skill files** to your computer (default: `~/.agents/skills/`; or a custom path like `~/.agent/skills/` if you used `--path`)
**Downloaded 1,525+ skill files** to your computer (default: `~/.agents/skills/`; or a custom path like `~/.agent/skills/` if you used `--path`)
**Made them available** to your AI assistant
**Did NOT enable them all automatically** (they're just sitting there, waiting)
@ -34,7 +34,7 @@ Bundles are **curated groups** of skills organized by role. They help you decide
**Analogy:**
- You installed a toolbox with 1,520+ tools (✅ done)
- You installed a toolbox with 1,525+ tools (✅ done)
- Bundles are like **labeled organizer trays** saying: "If you're a carpenter, start with these 10 tools"
- You can either **pick skills from the tray** or install that tray as a focused marketplace bundle plugin
@ -212,7 +212,7 @@ Let's actually use a skill right now. Follow these steps:
## Step 5: Picking Your First Skills (Practical Advice)
Don't try to use all 1,520+ skills at once. Here's a sensible approach:
Don't try to use all 1,525+ skills at once. Here's a sensible approach:
If you want a tool-specific starting point before choosing skills, use:
@ -343,7 +343,7 @@ Usually no, but if your AI doesn't recognize a skill:
### "Can I load all skills into the model at once?"
No. Even though you have 1,520+ skills installed locally, you should **not** concatenate every `SKILL.md` into a single system prompt or context block.
No. Even though you have 1,525+ skills installed locally, you should **not** concatenate every `SKILL.md` into a single system prompt or context block.
The intended pattern is:

View File

@ -34,7 +34,7 @@ antigravity-awesome-skills/
├── 📄 CONTRIBUTING.md ← Contributor workflow
├── 📄 CATALOG.md ← Full generated catalog
├── 📁 skills/ ← 1,520+ skills live here
├── 📁 skills/ ← 1,525+ skills live here
│ │
│ ├── 📁 brainstorming/
│ │ └── 📄 SKILL.md ← Skill definition
@ -47,7 +47,7 @@ antigravity-awesome-skills/
│ │ └── 📁 2d-games/
│ │ └── 📄 SKILL.md ← Nested skills also supported
│ │
│ └── ... (1,520+ total)
│ └── ... (1,525+ total)
├── 📁 apps/
│ └── 📁 web-app/ ← Interactive browser
@ -100,7 +100,7 @@ antigravity-awesome-skills/
```
┌─────────────────────────┐
│ 1,520+ SKILLS │
│ 1,525+ SKILLS │
└────────────┬────────────┘
┌────────────────────────┼────────────────────────┐
@ -201,7 +201,7 @@ If you want a workspace-style manual install instead, cloning into `.agent/skill
│ ├── 📁 brainstorming/ │
│ ├── 📁 stripe-integration/ │
│ ├── 📁 react-best-practices/ │
│ └── ... (1,520+ total) │
│ └── ... (1,525+ total) │
└─────────────────────────────────────────┘
```

View File

@ -1,12 +1,12 @@
{
"name": "antigravity-awesome-skills",
"version": "12.1.0",
"version": "12.2.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "antigravity-awesome-skills",
"version": "12.1.0",
"version": "12.2.1",
"license": "MIT",
"dependencies": {
"yaml": "^2.8.2"

View File

@ -1,7 +1,7 @@
{
"name": "antigravity-awesome-skills",
"version": "12.1.0",
"description": "1,520+ agentic skills for Claude Code, Gemini CLI, Cursor, Antigravity & more. Installer CLI.",
"version": "12.2.1",
"description": "1,525+ agentic skills for Claude Code, Gemini CLI, Cursor, Antigravity & more. Installer CLI.",
"license": "MIT",
"scripts": {
"validate": "node tools/scripts/run-python.js tools/scripts/validate_skills.py",

View File

@ -1,7 +1,7 @@
{
"name": "antigravity-awesome-skills",
"version": "12.1.0",
"description": "Plugin-safe Claude Code distribution of Antigravity Awesome Skills with 1,489 supported skills.",
"version": "12.2.1",
"description": "Plugin-safe Claude Code distribution of Antigravity Awesome Skills with 1,493 supported skills.",
"author": {
"name": "sickn33 and contributors",
"url": "https://github.com/sickn33/antigravity-awesome-skills"

View File

@ -10,6 +10,11 @@ date_added: "2026-06-05"
author: 2slides
tags: [presentations, slides, powerpoint, ai, api-integration, pdf, narration, document-summarization]
tools: [claude, cursor, gemini, codex, antigravity]
plugin:
setup:
type: manual
summary: "Install Python requirements and configure a 2slides API key before running generation scripts."
docs: SKILL.md
---
# 2slides Presentation Generation
@ -269,6 +274,12 @@ Section 2: [Subtopic]
Use the `create_pdf_slides.py` script:
Install the Python dependency first if it is not already available:
```bash
python -m pip install -r requirements.txt
```
```bash
# Basic generation
python scripts/create_pdf_slides.py --content "Your content here"
@ -294,7 +305,6 @@ python scripts/create_pdf_slides.py \
--resolution 1K|2K|4K # default: 2K
--page N # 0=auto, 1-100 (default: 1)
--content-detail concise|standard # default: standard
--mode sync|async # default: async
```
**Step 3: Handle Results**
@ -706,7 +716,7 @@ All scripts accept parameters that match [2slides API](https://2slides.com/api.m
| | `--aspect-ratio` | 1:1, 2:3, 3:2, 3:4, 4:3, 4:5, 5:4, 9:16, 16:9, 21:9 |
| | `--resolution` | 1K, 2K, 4K |
| | `--content-detail` | concise, standard |
| `create_pdf_slides.py` | Same as above + `--design-style` (free text), `--mode` (default async) | |
| `create_pdf_slides.py` | Same as above + `--design-style` / `--design-spec` (free text) | |
| `generate_narration.py` | `--mode` | single, multi |
| | `--voice` | 30 voices (Puck, Aoede, Charon, …); use `--list-voices` |
| | `--content-mode` | concise, standard |

View File

@ -126,7 +126,7 @@ Examples:
)
parser.add_argument("--content", required=True, help="Content for slides")
parser.add_argument("--design-spec", help="Optional design specifications")
parser.add_argument("--design-spec", "--design-style", dest="design_spec", help="Optional design specifications")
parser.add_argument("--language", default="Auto", help="Response language (default: Auto)")
parser.add_argument("--aspect-ratio", default="16:9", help="Aspect ratio in width:height format (default: 16:9)")
parser.add_argument("--resolution", choices=["1K", "2K", "4K"], default="2K",

View File

@ -36,7 +36,10 @@ Branch switching triggers a rebuild but not a browser reload — the CLI opens a
```bash
git diff --quiet && git diff --cached --quiet || git stash push -u -m "accesslint-diff-branch"
git checkout <branch>
branch="<branch>"
git check-ref-format --branch "$branch" >/dev/null
case "$branch" in -*) echo "Refusing option-like branch name: $branch" >&2; exit 1 ;; esac
git checkout -- "$branch"
npx -y @accesslint/cli@latest "<url>" --port "$PORT" --snapshot accesslint-diff --snapshot-dir /tmp --update-snapshot [--wait-for "<selector>"]
git checkout - && git stash pop 2>/dev/null
npx -y @accesslint/cli@latest "<url>" --port "$PORT" --snapshot accesslint-diff --snapshot-dir /tmp --format json [--wait-for "<selector>"]

View File

@ -0,0 +1,159 @@
---
name: article-illustrations
description: "Generate hand-drawn 16:9 article illustrations with the Grav character IP, sparse annotations, and absurd but clear visual metaphors."
category: creative
risk: safe
source: community
source_repo: vipin-si/article-illustrations
source_type: community
license: MIT
license_source: https://github.com/vipin-si/article-illustrations/blob/main/LICENSE
date_added: "2026-06-06"
author: vipin-si
tags: [illustration, article-graphics, visual-metaphors, image-generation, whiteboard-sketch]
tools: [image-generation]
---
# Article Illustrations — Grav Hand-Drawn Style
## Overview
Generate 16:9 landscape hand-drawn illustrations for articles, blog posts, and technical content. Each illustration captures one cognitive anchor point from an article and turns it into a clean, absurd, memorable whiteboard-sketch explanation.
The skill uses a recurring character IP called **Grav**: a small, round, always-floating figure with dot eyes and a thin antenna. Grav participates in the core action of every illustration — never just decoration.
**Repository:** [vipin-si/article-illustrations](https://github.com/vipin-si/article-illustrations)
## When to Use This Skill
- Use when writing articles, blog posts, or documentation that need inline illustrations
- Use when you want to turn abstract concepts into concrete visual metaphors
- Use when you want a consistent visual language across multiple articles
- Use when you need hand-drawn explanation sketches, not PPT infographics
## How It Works
### Step 1: Digest the Article
Read the article and identify cognitive anchor points — core judgments, turning points, input/output loops, before/after contrasts, and common pitfalls. Don't distribute illustrations evenly; prioritize moments that benefit from visual explanation.
### Step 2: Plan a Shot List
For each illustration, define:
- **Placement**: After which section
- **Theme**: What this image is about
- **Core Meaning**: The one idea it conveys
- **Structure Type**: One of 8 composition patterns (Workflow, System Closeup, Before/After, Role States, Conceptual Metaphor, Layered Method, Map Route, Mini Comic)
- **Grav's Action**: What Grav is doing in the scene
- **Annotation Labels**: 35 short English labels
### Step 3: Generate Images
Use the `generate_image` tool with the built-in prompt template. Each image follows strict style rules:
- Pure white background, no textures
- Black hand-drawn line art with slight wobble
- Sparse red/orange/blue handwritten annotations
- Grav always floating (never touching surfaces)
- One core idea per image
- 4060% canvas usage, 35%+ whitespace
### Step 4: QA Check
Verify each image against the QA checklist: correct format, Grav present and active, original metaphor, clean composition, sparse annotations, correct color usage.
## Examples
### Example 1: Plan illustrations for an article
```
Analyze this article and create a shot list of 5 illustrations.
Don't generate images yet — just plan which cognitive anchor points
deserve illustrations and what each image should convey.
<paste article>
```
### Example 2: Generate illustrations directly
```
Generate 4 Grav-style illustrations for this article.
Requirements: 16:9 landscape, pure white background, black hand-drawn
line art, sparse red/orange/blue English annotations.
<paste article>
```
### Example 3: Single concept illustration
```
Generate one 16:9 illustration for this concept:
"Trust isn't declared — it's built one piece of evidence at a time."
Grav must perform the core action. Maximum 5 annotation labels.
```
### Example 4: Iterate on a result
```
This illustration is on the right track, but Grav feels like decoration.
Keep the core meaning but regenerate: make Grav the one actually
driving the structure.
```
## Visual Style
| Element | Rule |
|:--------|:-----|
| Background | Pure white — no cream, texture, gradients, or shadows |
| Line art | Black, hand-drawn, slightly wobbly, not mechanical |
| Whitespace | Main subject 4060% of canvas, 35%+ empty space |
| Annotations | Handwritten English, 25 words each, max 58 per image |
| Color: Black | Main line art, characters, structures, objects |
| Color: Red | Key highlights, problems, warnings, results |
| Color: Orange | Main flow, paths, arrows, direction |
| Color: Blue | Supplementary notes, feedback, system state |
| Prohibited | Green, purple, yellow, pink, gradients, drop shadows, 3D, realistic UI |
## Character: Grav
- Small round body (pebble/potato shape)
- Two dot eyes (slightly asymmetric)
- One thin bent antenna with tiny circle tip
- Thin stick legs that dangle without touching surfaces
- Always hovering — visible gap between Grav and any surface
- Expression: calm, focused, deadpan
- Role: active participant in the system, never decoration
## Best Practices
- ✅ Start with a shot list before generating images
- ✅ Invent a new metaphor for every illustration — never reuse compositions
- ✅ Make Grav the action protagonist, not a bystander
- ✅ Keep it absurd but structurally clear
- ✅ Use color sparingly — when in doubt, use black
- ❌ Don't make PPT infographics or formal flowcharts
- ❌ Don't add title bars or decorative frames
- ❌ Don't let Grav touch the ground or stand on surfaces
- ❌ Don't make Grav cute, smiling, or emoji-like
## Limitations
- Requires access to an image-generation tool that can follow composition, line-art, and annotation constraints.
- The recurring Grav character style can drift between generations; verify every output against the QA checklist.
- Text in generated images may be misspelled or distorted, so short labels and post-generation review are required.
- The style is intended for explanatory article illustrations, not photorealistic product imagery or brand-final artwork.
## Common Pitfalls
- **Problem:** Illustration looks like a PPT slide
**Solution:** Remove 30% of elements, increase whitespace, make it weirder
- **Problem:** Grav is just standing next to the action
**Solution:** Redesign so Grav IS the mechanism — becomes the funnel, dangles from the lever, is suspended inside the machine
- **Problem:** Same metaphor as a previous illustration
**Solution:** Replace the physical object entirely — same concept, different analogy
## Additional Resources
- [Full skill with prompt templates and QA checklist](https://github.com/vipin-si/article-illustrations)
- [Example illustrations](https://github.com/vipin-si/article-illustrations#examples)

View File

@ -0,0 +1,874 @@
---
name: cv-generator
description: "Generate professional, ATS-optimized CVs for FlowCV, Canva, Google Docs, or Word. Handles multi-source merging, JD targeting, seniority adaptation, and humanized rewriting. Outputs paste-ready text with an ATS flaw report and improvement suggestions."
category: content
risk: safe
source: community
date_added: "2026-06-06"
author: "WHOISABHISHEKADHIKARI"
user-invokable: true
tags:
- cv
- resume
- ats
- career
- job-application
- career-change
---
# CV Generator Skill — FlowCV / Canva Edition
## When to Use
Use this skill when you need to:
- Generate a professional, ATS-optimized CV from multiple sources (LinkedIn, GitHub, Portfolio).
- Tailor an existing CV for a specific Job Description (JD).
- Improve the language, metrics, and structure of a draft resume.
- Prepare a paste-ready version of your CV for tools like FlowCV or Canva.
Turns raw profile data into a polished, ATS-ready CV. Outputs a paste-ready plain-text
version formatted for FlowCV, Canva, Google Docs, or Word — with a flaw report and
missing-info checklist.
---
## FLAW REGISTER — KNOWN ISSUES FIXED IN THIS VERSION
The following issues were identified across the two prior skill drafts and are corrected here:
| # | Flaw | Fix applied |
|---|------|-------------|
| F-01 | Output was Markdown-first, not paste-ready plain text | Final output is plain text; Markdown is internal staging only |
| F-02 | FlowCV/Canva field structure was never addressed | Section mapping to tool fields added (section 11c) |
| F-03 | Questionnaire dumped all 20 questions at once in practice | Hard rule: one question at a time, wait for answer |
| F-04 | Anti-hallucination rules listed but never enforced structurally | Enforcement gate added before every output (section 10) |
| F-05 | Cover letter was offered but never scoped for these tools | Cover letter now outputs to a separate plain-text block, not inline |
| F-06 | ATS check listed but had no scored output | Flaw report now scores 0100 with per-item pass/fail |
| F-07 | Seniority detection was "detect or ask" with no fallback | Default is mid-level if undetectable; user is told the assumption |
| F-08 | No guidance on what FlowCV/Canva cannot render | Added explicit field-by-field paste map (section 11c) |
| F-09 | Tense rules stated but never verified in quality gate | Tense check is now a hard gate — output blocked until corrected |
| F-10 | "Passionate about" and similar banned phrases still appeared in examples | Phrase blocklist now machine-checkable (section 7c) |
| F-11 | Nepal/South Asia market conventions were present but incomplete | Confirmed and expanded (section 14) |
| F-12 | No explicit rule on what to do when LinkedIn scraping is blocked | Hard fallback rule: ask for PDF export immediately, do not proceed empty |
| F-13 | File naming convention mentioned once, never enforced | File name rule is part of the final output block (section 11) |
| F-14 | Skill had no version history or upgrade path | Version field added to frontmatter |
| F-15 | GitHub was listed as a source but extraction rules were missing | GitHub extraction rules added (section 4f) |
---
## 1. Invocation
```
Use @cv-generator to build my CV from my LinkedIn PDF.
Use @cv-generator to tailor my CV for this job description.
Use @cv-generator to improve my existing draft.
Use @cv-generator to create a fresh CV via questionnaire.
Use @cv-generator — I want a FlowCV-ready output.
```
Any combination of sources is valid. Multiple sources are merged and deduplicated
before writing begins.
---
## Source Selection
Ask the user which source(s) to use. At least one is required.
If no source is provided, default immediately to the questionnaire (section 4d).
| # | Source | Instruction |
|---|--------|-------------|
| 1 | LinkedIn profile URL | Fetch page; extract all visible sections. **If blocked or empty: immediately ask for a LinkedIn PDF — do not proceed on an empty extraction.** |
| 2 | LinkedIn PDF export | Parse uploaded file. If scanned image: apply OCR and warn the user to verify accuracy. |
| 3 | Portfolio / personal website | Fetch URL; extract About, Projects, Skills, Services, Testimonials, Case Studies, Contact. |
| 4 | Questionnaire | Step-by-step (section 4d). One question at a time. |
| 5 | Existing CV or draft | Upload or paste; improve only — never alter facts. |
| 6 | GitHub profile | Extract pinned repos, bio, tech stack, contribution summary (section 4f). |
| 7 | Resume file (DOCX / PDF / TXT) | Parse and rewrite. Flag scanned PDFs; apply OCR. |
---
## Purpose, seniority, and format
### Purpose
Ask after source selection:
> "What is the main purpose of this CV?"
| Purpose | Key adaptation |
|---------|----------------|
| Applying for a specific job | Full JD analysis + keyword targeting (section 9) |
| General professional CV | Balanced, role-agnostic, reverse-chronological |
| Internship / entry-level | Education and projects lead; transferable skills foregrounded |
| Academic / research | Publications, grants, teaching, research interests |
| Freelance / client proposal | Deliverables, outcomes, services |
| Career change | Functional or hybrid; transferable skills reframed |
| Executive / board-level | Executive summary, board positions, P&L scope |
| Military-to-civilian | Translate ranks and jargon to civilian equivalents |
| Return to work / career break | Frame gap positively; emphasise upskilling |
| Other | Ask the user to describe the goal in one sentence |
### Seniority
Detect from data. If undetectable, **default to mid-level and tell the user:**
> "I've assumed mid-level (38 years). Let me know if this should be different."
| Level | Years | CV emphasis |
|-------|-------|-------------|
| Student / fresh graduate | 01 | Education first; projects; extracurriculars; 1 page |
| Junior / entry | 13 | Skills + education prominent; 1 page |
| Mid-level | 38 | Experience leads; achievements over duties; 12 pages |
| Senior | 815 | Leadership, scope, impact, mentoring; 2 pages |
| Executive / C-suite | 15+ | Strategic narrative; board roles; P&L; 23 pages |
| Academic | Any | No page limit; publications; grants; teaching |
### Format
| Format | Use when |
|--------|----------|
| Chronological (default) | Clear career progression; most job applications |
| Functional / skills-first | Career changers; large gaps; military-to-civilian |
| Hybrid / combination | Senior professionals rebranding; career changers with strong experience |
| Academic CV | University, research, PhDs, postdocs |
| Executive / Board bio | C-suite, NED, advisory |
| Portfolio-led | Designers, architects, creatives |
---
## Data extraction rules
### LinkedIn URL
If the page is blocked or returns no content, **stop immediately** and ask:
> "LinkedIn blocked the fetch. Please export your LinkedIn profile as a PDF
> (LinkedIn → Me → Settings → Data Privacy → Get a copy of your data) and upload it."
If accessible, extract in order:
1. Full name and headline
2. Contact information (email, phone, location — public only)
3. About / Professional Summary
4. Work experience: title, company, location, dates, bullets
5. Education: degree, institution, dates, grade/honours
6. Skills (flag top endorsed skills)
7. Certifications and licences
8. Projects
9. Achievements, honours, awards
10. Volunteer experience
11. Languages and proficiency
12. Publications, patents, courses
### LinkedIn PDF
Hard rules:
- Extract only what is physically present in the document.
- Preserve all dates exactly as written.
- If a section is absent, mark it **[Not provided]** — do not skip silently.
- Do not merge bullets across different roles.
- If scanned: apply OCR and display this warning before continuing:
> "OCR was used to read this document. Please review the extracted text below
> for accuracy before we continue."
### Portfolio / personal website
Extract:
- About / bio → Professional Summary
- Projects: name, description, technologies, outcomes, live/repo URLs
- Skills and services
- Testimonials or client logos → Achievements
- Case studies → 24 bullets each
- Blog posts or articles → Publications / Thought Leadership
- Contact details
### Questionnaire
**One question at a time. Wait for the answer before continuing.**
Do not display the full list unless the user explicitly asks for a form.
```
Q1. Full legal name (as it should appear on the CV)
Q2. Target job title or role
Q3. Email address
Q4. Phone number including country code (optional but recommended)
Q5. City and country of residence
Q6. LinkedIn URL (optional)
Q7. Portfolio, GitHub, or personal website URL (optional)
Q8. Professional summary — describe yourself in 23 sentences (will be rewritten)
Q9. Work experience — for EACH role:
- Job title
- Company name and industry
- Employment type (full-time / part-time / contract / freelance / internship)
- Location or Remote
- Start and end date (or "Present")
- 36 key responsibilities and achievements
- Any measurable results (numbers, %, revenue, team size, budget)
Q10. Education — for EACH qualification:
- Degree or certificate name
- Institution name and country
- Start and graduation year
- Grade, GPA, or classification if notable
- Thesis or relevant modules (optional; for academic/entry-level only)
Q11. Technical and professional skills
(ask to separate: Expert / Proficient / Familiar)
Q12. Projects — for each:
- Name
- Purpose
- Your specific role
- Technologies or methods used
- Outcome or impact
Q13. Certifications (name, issuing body, date, expiry if applicable)
Q14. Achievements, awards, or recognitions
Q15. Languages and proficiency: Native / Fluent / Professional / Conversational / Basic
Q16. Volunteer or open-source work (optional)
Q17. Publications, speaking engagements, press mentions (optional)
Q18. Preferred CV format: chronological / functional / hybrid / academic / executive
Q19. Target country or job market
Q20. Any employment gaps? Dates and brief reason — will be framed constructively.
```
### Existing CV or draft
Rules:
- Preserve every fact: titles, companies, dates, institutions, grades.
- Rewrite weak or passive bullets with strong action verbs.
- Remove repetition across roles.
- Correct grammar, punctuation, spelling.
- Fix tense: past for completed roles, present for current role.
- Replace all banned phrases (section 7c).
- Improve ATS keyword density where natural — do not keyword-stuff.
- Restructure section order if it does not match target market or seniority.
- **Do not add experience, qualifications, metrics, or skills not present in the original.**
### GitHub profile
Extract:
- Bio / tagline → supplement Professional Summary
- Pinned repositories: name, description, tech stack, stars/forks
- Contribution activity (years active, languages used)
- README content for context on major projects
- Do not infer seniority from commit count alone
### Employment gaps and special situations
**Gap under 3 months:** no special treatment.
**Gap 312 months:** one-line entry:
> "Career break — [brief honest reason: personal development / caregiving / travel / health]"
**Gap over 12 months:** add a neutral framing entry in the experience section;
highlight any upskilling, freelance, volunteering, or relevant activity during the gap.
Never fabricate activity.
**Contract / freelance / part-time:** label employment type clearly. Group multiple
short contracts under one umbrella entry (e.g. "Freelance Consultant") if they share
a skill area.
**Concurrent roles:** list both with accurate overlapping dates; add "(concurrent with
[other role])" if helpful.
**Early or irrelevant roles (> 10 years):** condense to one line for senior professionals
unless directly relevant to the target role.
**Fresh graduate:** lead with Education → Projects → Skills → Internships.
Use academic projects as proof of practical skills.
**Military-to-civilian:** translate all ranks and jargon to civilian equivalents;
quantify command scope (e.g. "Managed 35 personnel and $2M in equipment").
**Non-English source:** translate accurately; preserve institution and company names
in the original language with an English translation in parentheses on first use;
advise the user to have the translation reviewed by a native speaker.
---
## Multi-source merging
1. Build a master profile combining all extracted data.
2. Deduplicate: keep the most detailed version of each entry.
3. If two sources conflict on a date or title, flag it and ask the user to confirm.
4. Identify gaps; ask follow-up questions only for critical missing data.
5. Never fabricate a detail — mark it **[Not provided]** until the user confirms.
---
## CV section order
### Chronological (default — mid / senior)
```
1. Full Name
2. Contact Information (email | phone | LinkedIn | portfolio | city, country)
3. Professional Summary
4. Core Skills
5. Work Experience (reverse chronological)
6. Education (reverse chronological)
7. Certifications and Licences
8. Projects
9. Technical Skills (grouped: Languages | Frameworks | Tools | Platforms)
10. Achievements and Awards
11. Volunteer Experience
12. Publications / Speaking
13. Languages
14. Additional Information
```
### Fresh graduate / student
```
1. Full Name + Contact Information
2. Professional Summary / Objective
3. Education
4. Projects and Coursework
5. Skills
6. Work Experience / Internships
7. Certifications
8. Extracurricular / Volunteer
9. Languages
```
### Functional / skills-first (career changers, large gaps)
```
1. Full Name + Contact Information
2. Professional Summary
3. Core Competencies / Skills
4. Key Achievements
5. Work History (company, title, dates — minimal bullets)
6. Education
7. Certifications
8. Languages
```
### Academic CV
```
1. Full Name + Contact + ORCID / ResearchGate
2. Research Interests
3. Education
4. Academic Positions
5. Publications
6. Grants and Funding
7. Teaching Experience
8. Supervision
9. Awards and Honours
10. Conference Presentations
11. Professional Memberships
12. Skills
13. References
```
### Executive / Board
```
1. Full Name + Contact Information
2. Executive Summary
3. Core Competencies
4. Board and Advisory Roles
5. Executive Experience
6. Education and Qualifications
7. Publications / Media / Speaking
8. Professional Memberships
```
---
## Writing rules
### Professional Summary
Write 35 sentences (executive: 57) covering:
1. Who the person is: job title + years of experience
2. Primary domain of expertise
3. One concrete differentiator or standout achievement
4. Value proposition aligned to the target role
- Do not open with "I am".
- Do not open with any banned phrase (section 7c).
- Base strictly on data collected — no padding.
Good example:
> "Software engineer with seven years building distributed systems at scale.
> Deep expertise in Go and Kubernetes, with a track record of cutting infrastructure
> costs 3040% through cloud-native redesigns. Seeking a staff-level role where
> systems reliability and platform engineering intersect."
### Experience bullets — STAR-lite
Pattern: `[Strong verb] + [what you did] + [scale/scope] + [outcome if available]`
Rules:
- 36 bullets per role (23 for short-tenure or early roles)
- Past tense for completed roles; present tense for current role
- 1530 words per bullet
- Different verb to open each bullet — never repeat within one role
- If no metric was provided: write a result-focused statement without inventing numbers
- Never fabricate metrics — if the user says "we grew a lot", ask for specifics
Action verb bank:
```
Leadership: Led, Directed, Managed, Supervised, Mentored, Coached, Championed
Building: Built, Developed, Engineered, Architected, Designed, Implemented, Launched, Shipped
Improvement: Reduced, Improved, Optimised, Streamlined, Accelerated, Automated, Consolidated
Analysis: Analysed, Researched, Evaluated, Identified, Diagnosed, Assessed, Mapped
Communication: Presented, Authored, Documented, Trained, Negotiated, Advised, Collaborated
Growth: Grew, Expanded, Scaled, Generated, Increased, Secured, Delivered
Strategy: Defined, Established, Prioritised, Planned, Coordinated, Oversaw, Aligned
```
Rewrites:
```
BEFORE: "Responsible for managing the team"
AFTER: "Managed a cross-functional team of 8 engineers, delivering the product roadmap
on schedule for three consecutive quarters"
BEFORE: "Helped with developing new features"
AFTER: "Developed four customer-facing features in React, reducing support tickets by 25%"
BEFORE: "Was involved in the migration project"
AFTER: "Led migration from monolith to microservices, cutting deployment time from
45 minutes to under 4 minutes"
```
### Banned phrases — machine-checkable blocklist
Before output, scan the full CV text and **reject any bullet or sentence containing**
any of the following strings (case-insensitive):
```
results-driven
dynamic individual
highly motivated
team player
proven track record
passionate about
passionate professional
detail-oriented
self-starter
hard worker
strong communication skills
excellent communication
synergy
leverage (when used as a verb meaning "use")
paradigm shift
thought leader
go-getter
innovative thinker
outside the box
people person
visionary
change agent
```
If found: rewrite the sentence to show the specific evidence instead.
### Tense enforcement
This is a hard gate — output is blocked until tense is correct:
- **Completed role** → all bullets in past tense (Led, Built, Reduced...)
- **Current role** → all bullets in present tense (Lead, Build, Reduce...)
- **Mixed tense within one role** → always fail; fix before output
### Acronym and terminology
- Spell out on first use: "Machine Learning (ML)"; use abbreviation thereafter.
- Consistent capitalisation throughout: "JavaScript" not "Javascript".
- Mirror exact JD phrasing where applicable.
- Include both full form and abbreviation for searchability.
---
## ATS optimisation
### Structural rules
| Rule | Why it matters |
|------|----------------|
| Name must be the very first line of the body | Parsers read top-to-bottom; name in header/footer is often missed |
| Contact info in body, not in header or footer | Header/footer text is invisible to Taleo, Workday, iCIMS |
| Single-column layout only | Two-column layouts break ATS text extraction order |
| No tables for layout | Table cells are read in unpredictable order |
| No text boxes, shapes, or SmartArt | Text inside shapes is invisible to ATS |
| No images or photos (unless market requires it) | Images are ignored; photos risk bias filtering |
| No icons in bullets or headings | Symbols like ➤ ✓ ★ corrupt parsed text |
| Bullet characters: hyphen (-) or plain dot (•) only | Safe across all ATS platforms |
| Standard section headings only | Non-standard headings cause misclassification |
| No "Objective" heading | Flags CV as outdated; use "Professional Summary" |
| Font: minimum 10pt body, 1214pt headings | Smaller text garbles in PDF-to-text conversion |
| Margins: minimum 0.5 in / 1.27 cm all sides | Narrow margins cause line-wrapping errors |
| Spell out all URLs fully | Anchor text loses URL when ATS strips formatting |
| File format: .docx preferred for ATS; PDF for email | DOCX parses more accurately in most ATS |
| File name: FirstName_LastName_CV.docx | Generic names ("resume.pdf") get buried in recruiter files |
### Keyword strategy
1. Extract top 1020 keywords from the JD (if provided).
2. Categorise: hard skills | soft skills | qualifications | industry terms.
3. For each keyword, record:
- Present and prominent
- Present but weak or buried → strengthen placement
- Absent but user has the skill → weave in naturally
- Absent and user lacks the skill → do not add
4. Target keyword density: 24 natural occurrences per hard skill across the full CV.
5. Include both spelled-out form and abbreviation for key terms.
6. Mirror exact JD phrasing for shared responsibilities.
### ATS platform quick notes
| Platform | Key quirk |
|----------|-----------|
| Workday | DOCX preferred; complex PDF tables fail |
| Taleo | Strictest; no special characters; plain text preferred |
| Greenhouse | Lenient; weights keyword frequency |
| Lever | Modern parser; handles most formats |
| iCIMS | DOCX preferred; strips header/footer text |
| SmartRecruiters | Handles DOCX and PDF; relatively lenient |
Default when platform is unknown: apply Taleo-level strictness.
---
## Job description integration
When a JD is provided, run four steps:
**Step 1 — Parse:**
- Job title and seniority signals
- Required vs preferred qualifications
- Hard skills: tools, languages, platforms, methodologies
- Soft skills and collaboration patterns
- Industry terminology
- Responsibility verb phrases (mirror these in bullets)
**Step 2 — Score:**
For each of the top 15 keywords, mark: present and prominent / present but weak /
absent.
**Step 3 — Integrate:**
- Strengthen weak keyword placements.
- Weave in missing keywords the user genuinely has experience with.
- Never add a keyword the user cannot truthfully claim.
**Step 4 — Report (include at end of output):**
```
JD KEYWORD MATCH REPORT
Total JD keywords identified: 18
Matched in CV: 14 (78%)
Added naturally during generation: 3
Not added (user lacks skill): 1 — Salesforce
Recommendation: even limited Salesforce exposure is worth noting if any exists
```
---
## Anti-hallucination enforcement gate
Before any output is produced, confirm every item in the CV passes this check.
**Output is blocked until all items pass.**
| Item | Rule |
|------|------|
| Job titles | Sourced directly from user data — not inferred or upgraded |
| Company names | Sourced directly — not corrected, normalised, or embellished |
| Dates | Reproduced exactly as provided — no normalisation without noting it |
| Degrees and institutions | Reproduced exactly as provided |
| Certifications | Only those explicitly named by the user |
| Metrics and numbers | Only those provided by the user — never approximated or invented |
| Awards and achievements | Only those named by the user |
| Skills and tools | Only those provided or clearly evidenced in source data |
| Projects | Only those named by the user |
If any item cannot be verified: mark it **[Not provided]** and include it in the
missing information checklist (section 11d). Never fill gaps silently.
---
## Final output — deliver in this exact order
### Formatted CV (staging draft)
Clean plain-text draft with clear section labels. Used as the working version
before generating the tool-specific paste copies below.
### FlowCV paste-ready version
FlowCV uses structured text fields, not free-form documents. Format accordingly:
```
FULL NAME
[First name] [Last name]
PROFESSIONAL TITLE
[Target job title]
CONTACT
Email: [email]
Phone: [+country code number]
Location: [City, Country]
LinkedIn: [full URL]
Portfolio: [full URL if applicable]
PROFESSIONAL SUMMARY
[35 sentence plain paragraph — no bullets, no Markdown]
CORE SKILLS
[skill], [skill], [skill], [skill]
[skill], [skill], [skill], [skill]
WORK EXPERIENCE
[Job Title]
[Company Name] | [City, Country] | [Mon YYYY] [Mon YYYY or Present]
[Employment type if not full-time: Contract / Freelance / Part-time]
- [Bullet one: action verb + context + outcome]
- [Bullet two]
- [Bullet three]
[Repeat for each role]
EDUCATION
[Degree Name]
[Institution Name], [Country] | [YYYY] [YYYY]
[Grade or classification if notable]
[Repeat for each qualification]
CERTIFICATIONS
[Certificate Name] — [Issuing Body] — [Month YYYY]
PROJECTS
[Project Name]
[Technologies: tool, tool, tool]
- [What it does / your role / outcome]
ACHIEVEMENTS
- [Achievement one]
- [Achievement two]
VOLUNTEER EXPERIENCE
[Role] — [Organisation] — [YYYYYYYY]
- [One-line description]
LANGUAGES
[Language]: [Native / Fluent / Professional / Conversational / Basic]
ADDITIONAL INFORMATION
[Anything else: open-source, interests relevant to role]
```
### Canva paste-ready version
Canva CV templates use individual text boxes per section. Provide each section as
a separate clearly labelled block, with no Markdown symbols.
```
--- PASTE INTO: Name field ---
[Full name]
--- PASTE INTO: Job title / headline field ---
[Target job title]
--- PASTE INTO: Contact block ---
[email] | [phone] | [city, country] | [LinkedIn URL]
--- PASTE INTO: Summary / About field ---
[35 sentence paragraph, plain text, no hyphens or bullets]
--- PASTE INTO: Skills field ---
[skill] | [skill] | [skill] | [skill] | [skill]
--- PASTE INTO: Experience entry 1 ---
[Job Title]
[Company] | [Location] | [Mon YYYY Mon YYYY]
- [Bullet]
- [Bullet]
- [Bullet]
[Continue for each role as a separate block]
--- PASTE INTO: Education entry 1 ---
[Degree]
[Institution], [Country] | [YYYY YYYY]
[Grade if notable]
--- PASTE INTO: Certifications ---
[Certificate] | [Issuer] | [YYYY]
--- PASTE INTO: Languages ---
[Language] ([Proficiency])
```
### Missing information checklist
```
MISSING INFORMATION
[ ] Phone number
[ ] LinkedIn URL
[ ] Portfolio or GitHub URL
[ ] Measurable results for [Role] at [Company]
[ ] Certifications — do you hold any?
[ ] Languages — list any beyond English
[ ] Employment gap [Mon YYYY Mon YYYY] — add a brief framing note
[ ] [Any other flagged item]
```
### CV flaw report (scored 0100)
Run all checks. Display a scored report:
```
CV FLAW REPORT
──────────────────────────────────────
Score: [X]/100
PASS Truthfulness — all facts sourced from user data
PASS No hallucination — no fabricated details
PASS Tense correctness — past for completed, present for current
PASS ATS structure — single column, no tables or images
PASS Standard headings — all recognisable by parsers
PASS No forbidden characters — no ➤ ✓ ★
PASS Humanized — no banned phrases found
PASS Contact info in body (not header/footer)
FAIL [Check name] — [specific issue and location in CV]
──────────────────────────────────────
Deductions: -[N] per FAIL item
Final score: [X]/100
ISSUES TO FIX:
1. [Exact location] — [Exact problem] — [Suggested fix]
2. [Exact location] — [Exact problem] — [Suggested fix]
```
Score deductions: -10 per FAIL on truthfulness or hallucination;
-5 per FAIL on tense, ATS structure, or banned phrases;
-3 per FAIL on formatting issues.
### Improvement suggestions (37, specific and actionable)
- "Your summary does not state the target role. Open with your job title explicitly."
- "The [Company] role has no metrics. Even approximate scope (team size, users, budget range) strengthens credibility."
- "Skills section mixes expert and basic tools without distinction. Group into Proficient / Familiar."
- "Add a GitHub or portfolio URL — technical recruiters check it before the interview."
- "Three bullets begin with 'Responsible for' — replace with direct action verbs."
- "CV is [N] pages for [N] years of experience. Target is [N] pages; trim older roles to one line."
### Suggested file name
```
Suggested filename: [FirstName]_[LastName]_CV.docx
```
---
## Cover letter companion (optional)
After the CV output, offer:
> "Would you like a tailored cover letter for this application?"
If yes, output as a **separate clearly labelled plain-text block** — not inline with the CV.
Rules:
- Opens with a specific hook — not "I am writing to apply for…"
- References company and role by name
- Bridges 23 strongest CV points to the JD's key requirements
- Closes with a clear call to action
- Matches tone of the target industry
- 3 paragraphs maximum, 250350 words
- Does not repeat the CV verbatim
---
## Limitations
- **No hallucination.** Never invent a title, company, date, degree, cert, skill, metric, or award.
- **No fake metrics.** If the user says "we grew a lot", ask for specifics — never insert a percentage.
- **Respect source truth.** "Junior Developer" stays "Junior Developer" — suggest a reframe if needed; never silently change it.
- **No silent changes.** If something is materially reworded, note the change.
- **One version at a time.** Complete the CV before offering variants.
- **Privacy.** Do not expose full home address, national ID, DOB, marital status, or religion unless the user's target market requires it.
- **No keyword stuffing.** Adding skills the user does not have is fraud. Flag gaps; never fabricate.
- **OCR warning.** Always display before continuing: "OCR was used — please verify the extracted text for accuracy."
---
## Country and market conventions
| Market | Length | Photo | DOB | Marital status | References |
|--------|--------|-------|-----|----------------|------------|
| USA | 12 pages | No | No | No | "Available on request" |
| Canada | 12 pages | No | No | No | "Available on request" |
| UK | 2 pages | No | No | No | "Available on request" |
| Ireland | 2 pages | No | No | No | "Available on request" |
| Australia / NZ | 23 pages | No | No | No | "Available on request" |
| Germany / Austria / Switzerland | 23 pages | Yes (expected) | Yes | Sometimes | Listed or on request |
| France | 12 pages | Optional | No (illegal to require) | No | On request |
| Netherlands / Scandinavia | 12 pages | Optional | No | No | On request |
| Japan | 12 pages (rirekisho) | Yes | Yes | Yes | Listed |
| South Korea | 12 pages | Yes | Yes | Yes | Listed |
| China | 12 pages | Yes | Yes | Yes | Listed |
| India | 23 pages | Optional | Yes (common) | Sometimes | Listed |
| Nepal | 23 pages | Yes (common) | Yes | Sometimes | Listed |
| Bangladesh / Sri Lanka | 23 pages | Yes (common) | Yes | Sometimes | Listed |
| UAE / Gulf (GCC) | 23 pages | Yes (common) | Yes | Yes (sometimes) | Listed |
| Nigeria / East Africa | 23 pages | Yes (common) | Yes | Sometimes | Listed |
| South Africa | 35 pages | Optional | Yes (common) | No | Listed |
| Brazil | 12 pages | Optional | Yes (common) | No | On request |
| Academic (global) | No limit | Varies | Varies | No | Full list required |
| Executive / board (global) | 23 pages | No | No | No | On request |
Default when market is unknown: UK / international conventions (no photo, no DOB, 2 pages,
"Available on request").
---
## Decision tree
```
User invokes @cv-generator
|
v
Source provided? --No--> Run questionnaire (Q1Q20, one at a time)
|Yes
v
LinkedIn URL blocked? --Yes--> Ask for PDF export immediately; do not proceed empty
|No
v
Collect all sources --> merge and deduplicate (section 5)
|
v
Ask: Purpose? --> Detect or assume seniority (default: mid-level; tell the user)
|
v
Select format (section 3c)
|
v
Select section order (section 6)
|
v
JD provided? --Yes--> Parse JD --> extract and score keywords (section 9)
|No |
v v
Write CV content Integrate keywords naturally
(sections 78) |
|<-------------------+
v
Run anti-hallucination gate (section 10) --> block output until all pass
|
v
Run tense enforcement (section 7d) --> block output until all pass
|
v
Run banned phrase scan (section 7c) --> fix any found
|
v
Output in order:
Formatted CV (staging draft)
FlowCV paste-ready version
Canva paste-ready version
Missing information checklist
CV flaw report (scored)
Improve suggestions
Suggested file name
|
v
Offer cover letter (section 12)
```

View File

@ -19,6 +19,14 @@ tags:
# ExamPrep AI
## When to Use
Use this skill when you need to:
- Convert a syllabus, past papers, or study notes into a prioritized roadmap.
- Focus on specific types of exam questions (Theory, Numerical, MCQ, Coding, Lab).
- Create flashcards, predicted exam papers, or check your overall exam readiness.
- Perform last-minute revision or deep-dive into important exam topics.
## 🎯 Selective Reading Rule — Read ONLY the section matching the request
| What the student asks for | Jump to |

View File

@ -6,7 +6,7 @@ risk: unknown
---
Install by downloading the installer script first, reviewing it, and then running it locally. Example:
`curl -LsSf https://hf.co/cli/install.sh -o /tmp/hf-install.sh && less /tmp/hf-install.sh && bash /tmp/hf-install.sh`
`tmpdir="$(mktemp -d)" && trap 'rm -rf "$tmpdir"' EXIT && curl -LsSf https://hf.co/cli/install.sh -o "$tmpdir/hf-install.sh" && less "$tmpdir/hf-install.sh" && bash "$tmpdir/hf-install.sh"`
## When to Use
Use this skill when you need the `hf` CLI for Hub authentication, downloads, uploads, repo management, or basic compute operations.
@ -182,7 +182,7 @@ Generated with `huggingface_hub v1.8.0`. Run `hf skills add --force` to regenera
To mount Hub repositories or buckets as local filesystems — no download, no copy, no waiting — use `hf-mount`. Files are fetched on demand. GitHub: https://github.com/huggingface/hf-mount
Install by downloading the installer locally, reviewing it, and then running it. Example:
`curl -fsSL https://raw.githubusercontent.com/huggingface/hf-mount/main/install.sh -o /tmp/hf-mount-install.sh && less /tmp/hf-mount-install.sh && sh /tmp/hf-mount-install.sh`
`tmpdir="$(mktemp -d)" && trap 'rm -rf "$tmpdir"' EXIT && curl -fsSL https://raw.githubusercontent.com/huggingface/hf-mount/main/install.sh -o "$tmpdir/hf-mount-install.sh" && less "$tmpdir/hf-mount-install.sh" && sh "$tmpdir/hf-mount-install.sh"`
Some command examples:
- `hf-mount start repo openai-community/gpt2 /tmp/gpt2` — mount a repo (read-only)

View File

@ -0,0 +1,101 @@
---
name: open-dynamic-workflows
description: "Plan, orchestrate, and adversarially verify parallel AI coding agents with a dynamic multi-agent workflow engine."
category: ai-agents
risk: critical
source: community
source_repo: Suraj1235/open-dynamic-workflows
source_type: community
date_added: "2026-06-06"
author: Suraj1235
tags: [multi-agent, orchestration, workflow, adversarial-verification, coding-agents]
tools: [claude, cursor, codex, gemini, antigravity]
# Optional: declare the upstream license if source_repo is set
license: "MIT"
license_source: "https://github.com/Suraj1235/open-dynamic-workflows/blob/main/LICENSE"
---
# Open Dynamic Workflows
## Overview
Open Dynamic Workflows (ODW) is an open-source dynamic multi-agent workflow engine for AI coding agents such as OpenCode, Codex, Antigravity, and VS Code. It lets you plan a task, orchestrate multiple agents working in parallel, and adversarially verify their output before it lands. ODW ships a Codex/Antigravity skill folder (`SKILL.md` plus a daemon bridge) and an OpenCode plugin, and it is bring-your-own-model (Anthropic, OpenAI-compatible, or Ollama). This skill is adapted from the community project at `Suraj1235/open-dynamic-workflows`.
## When to Use This Skill
- Use when you need to decompose a coding task into independent subtasks and run multiple agents in parallel.
- Use when working across more than one AI coding tool (OpenCode, Codex, Antigravity, VS Code) and want a single orchestration layer.
- Use when the user asks for adversarial review or verification of agent-generated changes before merging.
## How It Works
### Step 1: Plan
ODW takes a high-level goal and produces a dynamic workflow graph of subtasks, identifying which can run in parallel and which have dependencies.
### Step 2: Orchestrate
The engine dispatches subtasks to parallel agents through the OpenCode plugin or the Codex/Antigravity daemon bridge, using your configured model provider (Anthropic, OpenAI-compatible, or Ollama).
### Step 3: Adversarially Verify
Completed work is routed through an adversarial verification pass that challenges the output before results are synthesized and returned.
## Examples
### Example 1: Run a parallel workflow
ODW is installed from source (clone the repo, then `npm install`). The CLI is
`odw-daemon` — run it as `npm run odw -- <args>` from inside the repo, or as
`npx odw-daemon <args>` / a global `odw-daemon` if you link the bin.
```bash
# Configure your model provider (bring-your-own-model)
export ANTHROPIC_API_KEY=... # or an OpenAI-compatible / Ollama endpoint
# One-time setup: generate ~/.odw/config.json
npm run setup
# Start the local workflow daemon (once)
npm run odw -- start
# Plan, orchestrate, and verify a task across parallel agents
npm run odw -- run --prompt "refactor the auth module and add tests"
```
### Example 2: Use the Codex/Antigravity skill bridge
```bash
# ODW ships a SKILL.md + daemon bridge consumed by Codex / Antigravity.
# Start the daemon, then run a saved orchestration script through it:
npm run odw -- start
npm run odw -- run --script examples/workflows/studio-prime.workflow.js --cwd .
```
## Best Practices
- ✅ Scope each subtask so agents can run without shared state.
- ✅ Keep the adversarial verification pass enabled before merging agent output.
- ❌ Don't run interdependent subtasks in parallel without declaring their dependencies.
- ❌ Don't commit provider API keys; use environment variables or a secrets manager.
## Limitations
- This skill does not replace environment-specific validation, testing, or expert review.
- Stop and ask for clarification if required inputs, permissions, or safety boundaries are missing.
## Security & Safety Notes
- ODW executes agent-generated code and shell commands; run it only in an authorized, local, or sandboxed environment.
- Model provider credentials (Anthropic / OpenAI-compatible / Ollama) must be supplied via environment variables, never committed to source.
- Review adversarial-verification output before applying changes to a production branch.
## Common Pitfalls
- **Problem:** Parallel agents collide on the same files.
**Solution:** Give each subtask exclusive file/module ownership and run conflicting tasks sequentially.
## Related Skills
- `@multi-agent-orchestration` - When coordinating multiple agents on one goal.
- `@code-review` - How adversarial verification complements human review.

View File

@ -18,5 +18,5 @@ Use this when optimizing opencode's permission settings, reviewing allowed comma
- **Config review**: Loads `~/.config/opencode/opencode.json` or project-level config
- **Permission summary**: Identifies currently allowed commands and skill permissions
- **Safe commands**: Suggests read-only commands (ls*, git status*, git log*, rg, grep, cat, etc.)
- **Safe commands**: Suggests reviewed read-only commands such as `git status --short`, `git log --oneline`, `rg`, `grep`, and `cat`; broad trailing wildcards need manual review.
- **Change application**: Edits config to add/remove permission entries, validates JSON

View File

@ -33,7 +33,8 @@ Complements opencode's built-in allow/deny/ask permissions by auditing current c
## Key Rules
- Never allow commands that modify files, commit, push, or change system state
- Use wildcards appropriately (e.g., `git status*` not just `git status`)
- Prefer exact command entries such as `git status --short`, `git diff --stat`, and `ls -la`
- Avoid trailing wildcards such as `git status*` unless the expanded command family has been manually reviewed as read-only
- Confirm with user before modifying permission config
- Distinguish between bash command permissions and skill permissions
- Keep config organized: group related commands together

View File

@ -1,93 +0,0 @@
---
name: polis-protocol
description: "Coordinate multi-vendor AI agents as a self-improving team — a learning router assigns work by track record and citizens can amend the protocol's own rules."
category: orchestration
risk: safe
source: community
source_repo: yehudalevy-collab/polis-protocol
source_type: community
date_added: "2026-06-02"
author: yehudalevy-collab
tags: [multi-agent, coordination, routing, orchestration, governance, vendor-agnostic]
tools: [claude, cursor, gemini, codex, antigravity]
license: "MIT"
license_source: "https://github.com/yehudalevy-collab/polis-protocol/blob/main/LICENSE"
---
# Polis Protocol — a team of agents that develops
## Overview
Most agent coordination is a passive board: claim a task, do it, mark it done. It records, but it never gets smarter, and its rules are frozen. Polis Protocol is the active alternative — a folder of markdown where each agent is a "citizen" with a capability card, work is routed by a learning bandit to whoever has the best track record on the task's tags, settled work files lessons that update the routing, and citizens can propose and vote on amendments to the protocol itself. It is vendor-agnostic: Antigravity, Claude, Codex, and Gemini agents can all share one `_polis/`.
In Antigravity specifically, this turns Manager View's fixed pipeline into a team that learns who is actually best at each kind of work, instead of running the same roles in the same order every time.
## When to Use This Skill
- Use when 2+ agents (especially across vendors) work on one project and "who should do this" is a real question.
- Use when you want the team to measurably improve over time — routing that adapts from outcomes, not static role labels.
- Use when you need a durable, git-auditable record of who did what, what was learned, and which rules changed.
- Use when Antigravity's default orchestration is too rigid and you want routing + governance on top of it.
## How It Works
### Step 1: Found a polis
Clone the repo and run the scaffolder directly (review `install.sh` first if you prefer the one-line installer):
```bash
git clone https://github.com/yehudalevy-collab/polis-protocol.git
python3 polis-protocol/scripts/init_polis.py \
--project-root . \
--agent-id gemini-antigravity-yourproject \
--vendor google --model gemini-3 --tool antigravity
```
This writes `_polis/` plus the skill into `.antigravity/skills/`, and bridge pointers (`GEMINI.md`, `AGENTS.md`) that point every tool at `_polis/CONSTITUTION.md`. Tip: add `--dry-run` to preview every file before anything is written.
### Step 2: Register citizens and open contracts
Each agent publishes a capability card under `_polis/citizens/`. Work is opened as a contract with `required_tags`, not assigned to a fixed role.
### Step 3: Route by track record
```bash
python3 polis-protocol/scripts/route_contract.py --polis-root _polis \
--contract _polis/contracts/open/your-task.md --explain
```
The router prints a score breakdown (history / self-rating / cost / availability) and recommends the citizen with the strongest record on the task's tags.
### Step 4: Settle, learn, and amend
A settled contract files a lesson; `--reconcile` folds it into `routing_stats.yml` so the next similar task routes better. When a rule stops working, a citizen proposes an amendment and the others vote.
## Examples
### Example 1: See the team learn (no install, 30 seconds)
```bash
git clone https://github.com/yehudalevy-collab/polis-protocol.git
cd polis-protocol && bash scripts/demo.sh
```
The router recommends Gemini for a Spanish-translation contract — because settled work taught it she has the best record on that tag, not because anyone reassigned it.
### Example 2: Explain any routing decision
```bash
python3 scripts/route_contract.py --polis-root examples/research-team/_polis \
--contract examples/research-team/_polis/contracts/open/parent-newsletter-issue-3.md --explain
```
## Notes
- No server, no runtime, no database — the whole protocol is markdown plus two small Python scripts.
- Vendor-agnostic by design; a Claude or Codex agent can join the same polis an Antigravity agent created.
- Full Antigravity integration guide: https://github.com/yehudalevy-collab/polis-protocol/blob/main/docs/antigravity.md
## Limitations
- Routing quality depends on accurate citizen capability cards and enough settled work history to learn from.
- The protocol coordinates agent work but does not replace review, tests, or explicit maintainer approval.
- Multi-agent voting and amendments can add process overhead for small, single-owner tasks.

View File

@ -0,0 +1,140 @@
---
name: runapi-cli
description: Generate AI images, videos, and music/audio from agents using the RunAPI CLI.
category: development
risk: critical
source: official
source_repo: runapi-ai/cli-skill
source_type: official
date_added: "2026-06-07"
author: runapi-ai
tags: [runapi, cli, models, automation, codex, claude, gemini]
tools: [claude, codex, gemini, cursor, antigravity]
license: "Apache-2.0"
license_source: "https://github.com/runapi-ai/cli-skill/blob/main/LICENSE"
---
# RunAPI CLI
## Overview
The `runapi` CLI is the execution layer for RunAPI model tasks. Use it when an agent needs to generate AI images, videos, or music/audio, run a one-off model job, pass a JSON request body, wait for an async task, or script RunAPI from a terminal, server, or CI job.
Source repository: [github.com/runapi-ai/cli-skill](https://github.com/runapi-ai/cli-skill) (Apache-2.0)
## When to Use This Skill
- Use when the user asks to run a RunAPI model from an agent.
- Use when the user needs to inspect RunAPI CLI auth or account status.
- Use when the user wants to pass JSON request bodies to RunAPI services.
- Use when the user wants to submit async RunAPI tasks and wait for completion.
- Use when the user wants to install the RunAPI CLI on a local machine, server, or CI runner.
## Install
### macOS / Linux
```shell
brew install runapi-ai/tap/runapi
```
### Server / CI
Download the installer, inspect it, then run it locally.
```shell
curl -fsSL https://runapi.ai/cli/install.sh -o runapi-install.sh
less runapi-install.sh
sh runapi-install.sh
```
To pin a specific version:
```shell
sh runapi-install.sh --version v0.1.0
```
The installer detects OS and architecture, verifies the SHA-256 checksum from `https://runapi.ai/cli/latest.json`, and refuses to write the binary if verification fails.
## Authentication
Treat RunAPI authentication and generation as security-sensitive: commands can call remote services, consume credits, and expose account state. Review installer scripts before running them and keep API keys in environment variables or stdin, not shell history.
Check the current state first:
```shell
runapi auth status
```
| Source | How |
|---|---|
| Environment | Read `RUNAPI_API_KEY` from the environment |
| Saved config | `printf '%s' "$RUNAPI_API_KEY" \| runapi auth import-token --token -` |
| Browser login | `runapi login` only when the user explicitly wants browser auth |
`RUNAPI_BASE_URL` overrides the default base URL.
Avoid passing secrets directly in command arguments. Prefer `RUNAPI_API_KEY` or stdin token import with `--token -`.
## Discover Services, Commands, and Fields
The CLI is JSON-first. Every service exposes typed commands, and each command documents its request fields through `--help`. Inspect command help before composing a request.
```shell
runapi --help
runapi suno --help
runapi suno text-to-music --help
```
## Run a Model
Pass the request body as JSON through `--input-file`, `--input`, or stdin. The default flow is synchronous and polls until the task completes.
```shell
runapi suno text-to-music --input-file request.json
runapi suno text-to-music --async --input-file request.json
runapi wait <task-id> --service suno --action text-to-music
runapi get <task-id> --service suno --action text-to-music
```
JSON responses go to stdout; progress lines go to stderr. Pipe to `jq` for downstream parsing.
## Account
```shell
runapi account info
runapi account balance
```
## Install the Skill Into Another Agent Runtime
```shell
runapi agent install-skill --target claude
runapi agent install-skill --target codex
runapi agent install-skill --target gemini
runapi agent install-skill --target openclaw
runapi agent list-targets
runapi agent install-skill --target-dir <path>
```
## Limitations
- RunAPI model calls require a valid RunAPI account or API key.
- Some model tasks are long-running and should use `--async` plus `runapi wait`.
- Browser login is interactive and should not be the default path for agents.
- This skill does not replace model-specific parameter validation; inspect command help before building request JSON.
## Security & Safety Notes
- Never paste API keys into example commands or PR text.
- Prefer `RUNAPI_API_KEY` or stdin token import instead of command-line secrets.
- Do not run interactive `runapi login` by default from an agent.
- Check the CLI exit code before assuming a task succeeded.
## References
- RunAPI CLI skill: https://github.com/runapi-ai/cli-skill
- RunAPI CLI repository: https://github.com/runapi-ai/cli
- RunAPI model catalog: https://runapi.ai/models.md

View File

@ -33,10 +33,11 @@ The cleanest approach is a reusable `JsonLd` component:
```jsx
// components/JsonLd.jsx
export function JsonLd({ data }) {
const json = JSON.stringify(data).replace(/</g, '\\u003c');
return (
<script
type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(data) }}
dangerouslySetInnerHTML={{ __html: json }}
/>
);
}

View File

@ -61,8 +61,10 @@ Show the proposed branch name and ask for one-word confirmation (or type alterna
- If not on main/master: check if current branch matches proposed name
- If yes: stay on it
- If no: ask to switch or create new
- Create branch: `git checkout -b <branch-name>`
- Stage changes: `git add <grouped-files>`
- Create branch only after validating the branch name, then use `git checkout -b "$branch_name"`
- Stage explicit pathspecs only: `git add -- path/to/file ...`
- If file paths are generated, keep them NUL-delimited (`git diff -z --name-only`) and pass them as pathspec arguments.
- Never concatenate untrusted filenames into a shell command and never run the placeholder text literally.
- Auto-generate commit message from changes:
- First line: `<type>: <short description>` (max 72 chars)
- Body: grouped file changes with brief descriptions

View File

@ -3,13 +3,20 @@ import re
from pathlib import Path
class UsthtSafetyError(RuntimeError):
"""Raised when a runtime path would escape .ustht/."""
def find_ustht() -> Path | None:
"""Find .ustht/ in the current directory or one of its parents."""
cwd = Path.cwd()
for d in [cwd, *cwd.parents]:
ustht = d / ".ustht"
if ustht.is_dir():
return ustht
if ustht.exists():
if ustht.is_symlink():
raise UsthtSafetyError(f"Refusing symlinked runtime directory: {ustht}")
if ustht.is_dir():
return ustht.resolve()
return None
@ -28,7 +35,7 @@ def read_define_ini(ustht: Path) -> dict:
if not ini.exists():
return {}
result = {}
for line in ini.read_text(encoding="utf-8").splitlines():
for line in safe_read_text(ustht, ini).splitlines():
line = line.strip()
if "=" in line and not line.startswith("#"):
k, v = line.split("=", 1)
@ -40,15 +47,95 @@ def write_define_ini(ustht: Path, cfg: dict):
"""Replace define.ini with the provided key/value pairs."""
ini = ustht / "define.ini"
lines = [f"{k}={v}" for k, v in cfg.items()]
ini.write_text("\n".join(lines) + "\n", encoding="utf-8")
safe_write_text(ustht, ini, "\n".join(lines) + "\n")
def is_processed(filepath: Path) -> bool:
def is_processed(filepath: Path, ustht: Path | None = None) -> bool:
"""Return true when the first raw-file line is the processed marker."""
first_line = filepath.read_text(encoding="utf-8").split("\n", 1)[0].strip()
content = safe_read_text(ustht, filepath) if ustht else filepath.read_text(encoding="utf-8")
first_line = content.split("\n", 1)[0].strip()
return first_line == "<!-- processed -->"
def ensure_runtime_path(ustht: Path, path: Path, *, must_exist: bool = False) -> Path:
"""Return a path only if its real location stays inside .ustht/."""
base = Path(ustht)
if base.is_symlink():
raise UsthtSafetyError(f"Refusing symlinked runtime directory: {base}")
base_real = base.resolve(strict=True)
target = Path(path)
if not target.is_absolute():
target = base_real / target
if target.exists() and target.is_symlink():
raise UsthtSafetyError(f"Refusing symlinked runtime path: {target}")
if must_exist and not target.exists():
raise UsthtSafetyError(f"Runtime path does not exist: {target}")
target_real = target.resolve(strict=must_exist)
try:
target_real.relative_to(base_real)
except ValueError as exc:
raise UsthtSafetyError(f"Runtime path escapes .ustht/: {target}") from exc
rel = target.relative_to(base_real)
current = base_real
for part in rel.parts:
current = current / part
if current.exists() and current.is_symlink():
raise UsthtSafetyError(f"Refusing symlinked runtime path: {current}")
return target
def ensure_runtime_dir(ustht: Path, path: Path, *, create: bool = False) -> Path:
"""Return a safe runtime directory, creating it when requested."""
directory = ensure_runtime_path(ustht, path, must_exist=False)
if create:
directory.mkdir(parents=True, exist_ok=True)
if directory.exists() and not directory.is_dir():
raise UsthtSafetyError(f"Runtime path is not a directory: {directory}")
return directory
def safe_read_text(ustht: Path | None, path: Path) -> str:
"""Read a runtime file after symlink and containment checks."""
safe_path = ensure_runtime_path(ustht, path, must_exist=True) if ustht else path
return safe_path.read_text(encoding="utf-8")
def safe_write_text(ustht: Path, path: Path, content: str):
"""Write a runtime file after symlink and containment checks."""
safe_path = ensure_runtime_path(ustht, path, must_exist=False)
ensure_runtime_dir(ustht, safe_path.parent, create=True)
safe_path.write_text(content, encoding="utf-8")
def safe_markdown_files(ustht: Path, directory: Path, *, reverse: bool = False) -> list[Path]:
"""List safe markdown files under one runtime directory."""
safe_dir = ensure_runtime_dir(ustht, directory)
if not safe_dir.exists():
return []
files = []
for file_path in safe_dir.glob("*.md"):
safe_path = ensure_runtime_path(ustht, file_path, must_exist=True)
if safe_path.is_file():
files.append(safe_path)
return sorted(files, reverse=reverse)
def safe_markdown_tree(ustht: Path, directory: Path) -> list[Path]:
"""List safe markdown files recursively under one runtime directory."""
safe_dir = ensure_runtime_dir(ustht, directory)
if not safe_dir.exists():
return []
files = []
for file_path in safe_dir.rglob("*.md"):
safe_path = ensure_runtime_path(ustht, file_path, must_exist=True)
if safe_path.is_file():
files.append(safe_path)
return sorted(files)
def validate_dim_name(dim: str) -> bool:
"""Validate a dimension path made of safe kebab-case segments."""
reserved = {"raw", "ignored", "export", "define", "readme-ai"}

View File

@ -3,7 +3,7 @@ import sys
from datetime import datetime
from pathlib import Path
from common import find_ustht
from common import ensure_runtime_dir, find_ustht, safe_markdown_files, safe_read_text, safe_write_text
HELP = """Usage: python ignore_ops.py show|remove_last|add_suffix "text" [--help]
@ -14,11 +14,11 @@ Subcommands:
"""
def find_last_raw_entry(raw_dir: Path):
def find_last_raw_entry(ustht: Path, raw_dir: Path):
"""Return (file path, line index, entry text) for the latest raw entry."""
files = sorted(raw_dir.glob("*.md"), reverse=True)
files = safe_markdown_files(ustht, raw_dir, reverse=True)
for f in files:
lines = f.read_text(encoding="utf-8").splitlines()
lines = safe_read_text(ustht, f).splitlines()
if lines and lines[0].strip() == "<!-- processed -->":
continue
for idx in range(len(lines) - 1, -1, -1):
@ -27,16 +27,16 @@ def find_last_raw_entry(raw_dir: Path):
return None, None, None
def remove_line(filepath: Path, idx: int):
def remove_line(ustht: Path, filepath: Path, idx: int):
"""Remove one line from a file."""
lines = filepath.read_text(encoding="utf-8").splitlines()
lines = safe_read_text(ustht, filepath).splitlines()
del lines[idx]
filepath.write_text("\n".join(lines) + ("\n" if lines else ""), encoding="utf-8")
safe_write_text(ustht, filepath, "\n".join(lines) + ("\n" if lines else ""))
def append_to_ignored(ignored_dir: Path, text: str, reason: str):
def append_to_ignored(ustht: Path, ignored_dir: Path, text: str, reason: str):
"""Append one ignored entry to today's ignored file."""
ignored_dir.mkdir(exist_ok=True)
ignored_dir = ensure_runtime_dir(ustht, ignored_dir, create=True)
today = datetime.now().strftime("%Y-%m-%d")
now = datetime.now().strftime("%H:%M")
f = ignored_dir / f"{today}.md"
@ -45,23 +45,23 @@ def append_to_ignored(ignored_dir: Path, text: str, reason: str):
clean = clean.rsplit(" | suggested-dim:", 1)[0]
entry = f"- [{now}] {clean} ({reason})"
if f.exists():
content = f.read_text(encoding="utf-8").rstrip()
f.write_text(f"{content}\n{entry}\n", encoding="utf-8")
content = safe_read_text(ustht, f).rstrip()
safe_write_text(ustht, f, f"{content}\n{entry}\n")
else:
f.write_text(f"{entry}\n", encoding="utf-8")
safe_write_text(ustht, f, f"{entry}\n")
def show_ignored(ignored_dir: Path):
def show_ignored(ustht: Path, ignored_dir: Path):
"""Print all ignored entries."""
if not ignored_dir.exists():
print("No ignored entries.")
return
files = sorted(ignored_dir.glob("*.md"), reverse=True)
files = safe_markdown_files(ustht, ignored_dir, reverse=True)
if not files:
print("No ignored entries.")
return
for f in files:
entries = [line for line in f.read_text(encoding="utf-8").splitlines() if line.strip().startswith("- [")]
entries = [line for line in safe_read_text(ustht, f).splitlines() if line.strip().startswith("- [")]
if entries:
print(f"#{f.name} ({len(entries)} entries):")
for entry in entries:
@ -73,12 +73,12 @@ def remove_last(ustht: Path):
if not raw_dir.exists():
print("No previous thought to ignore.")
return
filepath, idx, entry = find_last_raw_entry(raw_dir)
filepath, idx, entry = find_last_raw_entry(ustht, raw_dir)
if filepath is None:
print("No previous thought to ignore.")
return
remove_line(filepath, idx)
append_to_ignored(ustht / "ignored", entry, "ignored with --last")
remove_line(ustht, filepath, idx)
append_to_ignored(ustht, ustht / "ignored", entry, "ignored with --last")
display = entry
if "] " in display:
display = display.split("] ", 1)[1]
@ -88,7 +88,7 @@ def remove_last(ustht: Path):
def add_suffix(ustht: Path, text: str):
append_to_ignored(ustht / "ignored", text, "ignored by suffix")
append_to_ignored(ustht, ustht / "ignored", text, "ignored by suffix")
print("Ignored current message.")
@ -108,7 +108,7 @@ def main():
cmd = sys.argv[1]
if cmd == "show":
show_ignored(ustht / "ignored")
show_ignored(ustht, ustht / "ignored")
elif cmd == "remove_last":
remove_last(ustht)
elif cmd == "add_suffix":

View File

@ -3,7 +3,7 @@ import shutil
import sys
from pathlib import Path
from common import find_skill_dir
from common import UsthtSafetyError, find_skill_dir
HELP = """Usage: python init.py [--help]
@ -34,6 +34,8 @@ def main():
target = Path.cwd() / ".ustht"
if target.exists():
if target.is_symlink():
raise UsthtSafetyError(f"Refusing symlinked runtime directory: {target}")
print("Already initialized; .ustht/ exists, skipping creation.")
sys.exit(0)

View File

@ -2,7 +2,7 @@
import sys
from pathlib import Path
from common import find_ustht, validate_dim_name
from common import find_ustht, safe_markdown_tree, safe_read_text, validate_dim_name
HELP = """Usage: python show_mdbase.py show [--all|--dimension] [--help]
@ -18,14 +18,14 @@ def show_index(mdbase: Path):
if not index.exists():
print("mdbase/README.ai.md does not exist.")
return
print(index.read_text(encoding="utf-8"))
print(safe_read_text(mdbase.parent, index))
def list_dims(mdbase: Path):
details = mdbase / "details"
if not details.exists():
return []
return sorted(p.relative_to(details).with_suffix("").as_posix() for p in details.rglob("*.md"))
return sorted(p.relative_to(details).with_suffix("").as_posix() for p in safe_markdown_tree(mdbase.parent, details))
def show_dim(mdbase: Path, dim: str):
@ -39,7 +39,7 @@ def show_dim(mdbase: Path, dim: str):
if not path.exists():
print(f"mdbase/details/{dim}.md does not exist yet.")
return
print(path.read_text(encoding="utf-8"))
print(safe_read_text(mdbase.parent, path))
def show_all(mdbase: Path):
@ -54,7 +54,7 @@ def show_all(mdbase: Path):
print(f"mdbase has {len(dims)} dimensions:")
for dim in dims:
path = details / f"{dim}.md"
lines = [line for line in path.read_text(encoding="utf-8").splitlines() if line.strip().startswith("- ")]
lines = [line for line in safe_read_text(mdbase.parent, path).splitlines() if line.strip().startswith("- ")]
print(f" {dim}.md: {len(lines)} entries")

View File

@ -2,7 +2,7 @@
import sys
from pathlib import Path
from common import find_ustht, is_processed
from common import find_ustht, is_processed, safe_markdown_files, safe_read_text
HELP = """Usage: python show_raw.py [--help]
@ -25,13 +25,13 @@ def main():
print("No unprocessed records.")
return
files = [f for f in sorted(raw_dir.glob("*.md"), reverse=True) if not is_processed(f)]
files = [f for f in safe_markdown_files(ustht, raw_dir, reverse=True) if not is_processed(f, ustht)]
if not files:
print("No unprocessed records. All raw files are marked processed.")
return
for f in files:
content = f.read_text(encoding="utf-8").strip()
content = safe_read_text(ustht, f).strip()
entry_count = sum(1 for line in content.splitlines() if line.strip().startswith("- ["))
print(f"#{f.name} ({entry_count} unprocessed entries):")
print(content)

View File

@ -5,7 +5,18 @@ from collections import defaultdict
from datetime import datetime
from pathlib import Path
from common import find_ustht, read_define_ini, write_define_ini, is_processed, validate_dim_name
from common import (
ensure_runtime_dir,
safe_markdown_files,
safe_markdown_tree,
safe_read_text,
safe_write_text,
find_ustht,
read_define_ini,
write_define_ini,
is_processed,
validate_dim_name,
)
HELP = """Usage: python sortin.py [--dry] [--help]
@ -18,7 +29,7 @@ Options:
"""
def parse_raw_file(filepath: Path):
def parse_raw_file(ustht: Path, filepath: Path):
"""Parse raw entries from one file."""
entries = []
date = filepath.stem.split("-", 3)
@ -27,7 +38,7 @@ def parse_raw_file(filepath: Path):
else:
date = datetime.now().strftime("%Y-%m-%d")
for line in filepath.read_text(encoding="utf-8").splitlines():
for line in safe_read_text(ustht, filepath).splitlines():
line = line.strip()
match = re.match(r"^- \[(\d{2}:\d{2})\] (.*)$", line)
if not match:
@ -51,31 +62,31 @@ def dim_path(mdbase: Path, dim: str) -> Path:
return mdbase / "details" / f"{dim}.md"
def count_entries(path: Path) -> int:
def count_entries(ustht: Path, path: Path) -> int:
if not path.exists():
return 0
return sum(1 for line in path.read_text(encoding="utf-8").splitlines() if line.strip().startswith("- "))
return sum(1 for line in safe_read_text(ustht, path).splitlines() if line.strip().startswith("- "))
def append_entries(path: Path, entries):
def append_entries(ustht: Path, path: Path, entries):
"""Append entries grouped by date to one dimension file."""
by_date = defaultdict(list)
for entry in entries:
by_date[entry["date"]].append(entry)
path.parent.mkdir(parents=True, exist_ok=True)
ensure_runtime_dir(ustht, path.parent, create=True)
if not path.exists():
title = path.stem.replace("-", " ").title()
path.write_text(f"# {title}\n\n> Project memory for `{path.stem}`.\n\n", encoding="utf-8")
safe_write_text(ustht, path, f"# {title}\n\n> Project memory for `{path.stem}`.\n\n")
content = path.read_text(encoding="utf-8").rstrip()
content = safe_read_text(ustht, path).rstrip()
for date, date_entries in sorted(by_date.items()):
lines = [f"- {entry['text']}" for entry in date_entries]
block = "\n".join(lines)
heading = f"## {date}"
if heading in content:
content_lines = content.splitlines()
heading_idx = next(i for i, line in enumerate(content_lines) if line.strip() == heading)
content_lines = content.splitlines()
heading_idx = next((i for i, line in enumerate(content_lines) if line.strip() == heading), None)
if heading_idx is not None:
insert_idx = len(content_lines)
for i in range(heading_idx + 1, len(content_lines)):
if content_lines[i].startswith("## "):
@ -92,31 +103,31 @@ def append_entries(path: Path, entries):
content = "\n".join(before).rstrip()
else:
content = f"{content}\n\n{heading}\n\n{block}".rstrip()
path.write_text(content + "\n", encoding="utf-8")
safe_write_text(ustht, path, content + "\n")
def mark_processed(filepath: Path):
def mark_processed(ustht: Path, filepath: Path):
"""Insert the processed marker at the top of a raw file."""
content = filepath.read_text(encoding="utf-8")
content = safe_read_text(ustht, filepath)
if content.split("\n", 1)[0].strip() != "<!-- processed -->":
filepath.write_text("<!-- processed -->\n" + content, encoding="utf-8")
safe_write_text(ustht, filepath, "<!-- processed -->\n" + content)
def update_index(mdbase: Path):
def update_index(ustht: Path, mdbase: Path):
"""Rebuild mdbase/README.ai.md with dimension counts."""
now = datetime.now().strftime("%Y-%m-%d %H:%M")
details = mdbase / "details"
dims = []
if details.exists():
dims = sorted(p.relative_to(details).with_suffix("").as_posix() for p in details.rglob("*.md"))
dims = sorted(p.relative_to(details).with_suffix("").as_posix() for p in safe_markdown_tree(ustht, details))
rows = ["| File | Dimension | Entries |", "|------|-----------|---------|"]
backlog = mdbase / "backlog.md"
if backlog.exists():
rows.append(f"| [backlog.md](backlog.md) | backlog | {count_entries(backlog)} |")
rows.append(f"| [backlog.md](backlog.md) | backlog | {count_entries(ustht, backlog)} |")
for dim in dims:
path = details / f"{dim}.md"
rows.append(f"| [details/{dim}.md](details/{dim}.md) | {dim} | {count_entries(path)} |")
rows.append(f"| [details/{dim}.md](details/{dim}.md) | {dim} | {count_entries(ustht, path)} |")
content = "\n".join([
"# user-thoughts mdbase Index",
@ -137,7 +148,7 @@ def update_index(mdbase: Path):
*rows,
"",
])
(mdbase / "README.ai.md").write_text(content, encoding="utf-8")
safe_write_text(ustht, mdbase / "README.ai.md", content)
def main():
@ -161,7 +172,7 @@ def main():
print("No unprocessed records.")
return
raw_files = [f for f in sorted(raw_dir.glob("*.md")) if not is_processed(f)]
raw_files = [f for f in safe_markdown_files(ustht, raw_dir) if not is_processed(f, ustht)]
if not raw_files:
print("No unprocessed records. All raw files are marked processed.")
return
@ -169,7 +180,7 @@ def main():
all_entries = []
entries_by_file = {}
for f in raw_files:
entries = parse_raw_file(f)
entries = parse_raw_file(ustht, f)
entries_by_file[f] = entries
all_entries.extend(entries)
@ -194,16 +205,16 @@ def main():
return
for dim, entries in grouped.items():
append_entries(dim_path(mdbase, dim), entries)
append_entries(ustht, dim_path(mdbase, dim), entries)
for f in raw_files:
if entries_by_file.get(f):
mark_processed(f)
mark_processed(ustht, f)
now = datetime.now().strftime("%Y-%m-%d %H:%M")
cfg["LAST_SORTIN"] = now
write_define_ini(ustht, cfg)
update_index(mdbase)
update_index(ustht, mdbase)
print(f" LAST_SORTIN updated to {now}")

View File

@ -2,7 +2,7 @@
import sys
from pathlib import Path
from common import find_ustht, read_define_ini, is_processed
from common import find_ustht, read_define_ini, is_processed, safe_markdown_files, safe_markdown_tree
HELP = """Usage: python status.py [--help]
@ -11,21 +11,21 @@ dimension counts.
"""
def count_raw(raw_dir: Path):
def count_raw(ustht: Path, raw_dir: Path):
"""Return total and unprocessed raw file counts."""
if not raw_dir.exists():
return 0, 0
files = list(raw_dir.glob("*.md"))
unprocessed = sum(1 for f in files if not is_processed(f))
files = safe_markdown_files(ustht, raw_dir)
unprocessed = sum(1 for f in files if not is_processed(f, ustht))
return len(files), unprocessed
def count_dims(mdbase: Path):
def count_dims(ustht: Path, mdbase: Path):
"""Count dimension files under mdbase/details/."""
details = mdbase / "details"
if not details.exists():
return 0
return len(list(details.rglob("*.md")))
return len(safe_markdown_tree(ustht, details))
def main():
@ -42,8 +42,8 @@ def main():
skill_status = cfg.get("SKILL_STATUS", "unknown")
instant_status = cfg.get("INSTANT_STATUS", "unknown")
last_sortin = cfg.get("LAST_SORTIN", "never") or "never"
total_raw, unprocessed_raw = count_raw(ustht / "raw")
dims = count_dims(ustht / "mdbase")
total_raw, unprocessed_raw = count_raw(ustht, ustht / "raw")
dims = count_dims(ustht, ustht / "mdbase")
print(f"SKILL_STATUS={skill_status}")
print(f"INSTANT_STATUS={instant_status}")

View File

@ -3,7 +3,15 @@ import sys
from datetime import datetime
from pathlib import Path
from common import find_ustht, read_define_ini, validate_dim_name
from common import (
ensure_runtime_dir,
safe_markdown_files,
safe_read_text,
safe_write_text,
find_ustht,
read_define_ini,
validate_dim_name,
)
HELP = """Usage: python write_raw.py "thought text" [--dim dimension] [--help]
@ -21,12 +29,14 @@ Behavior:
"""
def count_today_raw(raw_dir: Path) -> int:
def count_today_raw(ustht: Path, raw_dir: Path) -> int:
"""Count unprocessed entries across today's raw files."""
today = datetime.now().strftime("%Y-%m-%d")
count = 0
for f in sorted(raw_dir.glob(f"{today}*.md")):
content = f.read_text(encoding="utf-8")
for f in safe_markdown_files(ustht, raw_dir):
if not f.name.startswith(today):
continue
content = safe_read_text(ustht, f)
first_line = content.split("\n", 1)[0].strip()
if first_line == "<!-- processed -->":
continue
@ -72,15 +82,14 @@ def main():
print(f"Invalid dimension name: {dim}. Use lowercase letters, digits, hyphens, and optional / subdirectories.")
sys.exit(1)
raw_dir = ustht / "raw"
raw_dir.mkdir(exist_ok=True)
raw_dir = ensure_runtime_dir(ustht, ustht / "raw", create=True)
today = datetime.now().strftime("%Y-%m-%d")
now = datetime.now().strftime("%H:%M")
raw_file = raw_dir / f"{today}.md"
if raw_file.exists():
first_line = raw_file.read_text(encoding="utf-8").split("\n", 1)[0].strip()
first_line = safe_read_text(ustht, raw_file).split("\n", 1)[0].strip()
if first_line == "<!-- processed -->":
seq = 2
while (raw_dir / f"{today}-{seq}.md").exists():
@ -92,12 +101,12 @@ def main():
entry = f"- [{now}] {thought_clean}{suffix}"
if raw_file.exists():
content = raw_file.read_text(encoding="utf-8").rstrip()
raw_file.write_text(f"{content}\n{entry}\n", encoding="utf-8")
content = safe_read_text(ustht, raw_file).rstrip()
safe_write_text(ustht, raw_file, f"{content}\n{entry}\n")
else:
raw_file.write_text(f"{entry}\n", encoding="utf-8")
safe_write_text(ustht, raw_file, f"{entry}\n")
count = count_today_raw(raw_dir)
count = count_today_raw(ustht, raw_dir)
if count > 5:
print(f"Today has {count} recorded thoughts. Consider running /ustht sortin.")

View File

@ -20,21 +20,22 @@ Before running any Vercel CLI commands, identify where the token is coming from.
### A) `VERCEL_TOKEN` is already set in the environment
```bash
printenv VERCEL_TOKEN
[ -n "${VERCEL_TOKEN:-}" ] && printf 'VERCEL_TOKEN is set\n'
```
If this returns a value, you're ready. Skip to Step 2.
If this reports a configured token, you're ready. Skip to Step 2.
### B) Token is in a `.env` file under `VERCEL_TOKEN`
```bash
grep '^VERCEL_TOKEN=' .env 2>/dev/null
grep -q '^VERCEL_TOKEN=' .env 2>/dev/null && printf 'VERCEL_TOKEN is present in .env\n'
```
If found, export it:
```bash
export VERCEL_TOKEN=$(grep '^VERCEL_TOKEN=' .env | cut -d= -f2-)
VERCEL_TOKEN="$(sed -n 's/^VERCEL_TOKEN=//p' .env | tail -n 1)"
export VERCEL_TOKEN
```
### C) Token is in a `.env` file under a different name
@ -42,13 +43,15 @@ export VERCEL_TOKEN=$(grep '^VERCEL_TOKEN=' .env | cut -d= -f2-)
Look for any variable that looks like a Vercel token (Vercel tokens typically start with `vca_`):
```bash
grep -i 'vercel' .env 2>/dev/null
grep -Eio '^[A-Z0-9_]*VERCEL[A-Z0-9_]*(?==)' .env 2>/dev/null
```
Inspect the output to identify which variable holds the token, then export it as `VERCEL_TOKEN`:
```bash
export VERCEL_TOKEN=$(grep '^<VARIABLE_NAME>=' .env | cut -d= -f2-)
vercel_var="<VARIABLE_NAME>"
VERCEL_TOKEN="$(sed -n "s/^${vercel_var}=//p" .env | tail -n 1)"
export VERCEL_TOKEN
```
### D) No token found — ask the user
@ -64,7 +67,7 @@ If none of the above yield a token, ask the user to provide one. They can create
vercel deploy --token "vca_abc123"
# Good — CLI reads VERCEL_TOKEN from the environment
export VERCEL_TOKEN="vca_abc123"
[ -n "${VERCEL_TOKEN:-}" ] || { echo "Set VERCEL_TOKEN first" >&2; exit 1; }
vercel deploy
```
@ -74,11 +77,11 @@ Similarly, check for the project ID and team scope. These let the CLI target the
```bash
# Check environment
printenv VERCEL_PROJECT_ID
printenv VERCEL_ORG_ID
[ -n "${VERCEL_PROJECT_ID:-}" ] && printf 'VERCEL_PROJECT_ID is set\n'
[ -n "${VERCEL_ORG_ID:-}" ] && printf 'VERCEL_ORG_ID is set\n'
# Or check .env
grep -i 'vercel' .env 2>/dev/null
grep -Eio '^[A-Z0-9_]*VERCEL[A-Z0-9_]*(?==)' .env 2>/dev/null
```
**If you have a project URL** (e.g. `https://vercel.com/my-team/my-project`), extract the team slug:
@ -317,8 +320,8 @@ Full details: https://vercel.com/docs/plans/pro-plan
Check the environment and any `.env` files present:
```bash
printenv | grep -i vercel
grep -i vercel .env 2>/dev/null
env | grep -Eio '^[A-Z0-9_]*VERCEL[A-Z0-9_]*(?==)'
grep -Eio '^[A-Z0-9_]*VERCEL[A-Z0-9_]*(?==)' .env 2>/dev/null
```
### Authentication error

View File

@ -0,0 +1,103 @@
---
name: video-content-extractor
description: "Extract key frames from MP4 videos at configurable intervals, run Tesseract OCR, and generate structured Markdown reports with video metadata and timestamped text transcripts."
category: media-processing
risk: safe
source: community
source_repo: 274326424/video-content-extractor
source_type: community
date_added: "2026-06-06"
author: 274326424
tags: [video, ocr, ffmpeg, tesseract, frame-extraction, media]
tools: [codex]
---
# Video Content Extractor
## Overview
Automatically extracts key frames from MP4 video files at configurable time intervals, performs OCR text recognition on each frame, and generates a structured Markdown report. The report includes video metadata (duration, resolution, codecs) and frame-by-frame OCR transcripts with timestamp references.
This skill is designed for Codex CLI and requires FFmpeg and Tesseract OCR installed on the local machine.
## When to Use This Skill
- Use when you need to extract text content from video presentations, lectures, or screencasts.
- Use when you want to create searchable transcripts from video files without embedded subtitles.
- Use when you need to analyze video content programmatically and generate structured summaries.
- Use when the user asks to "read what is on screen" or "extract the content from this video."
## How It Works
### Step 1: Analyze Video Metadata
The skill uses ffprobe to extract video metadata: duration, resolution, frame rate, codec information, and file size.
### Step 2: Extract Key Frames
Using FFmpeg, the skill captures frames at the configured interval (default: every 30 seconds). Each frame is saved as a timestamped JPEG image.
### Step 3: OCR Text Recognition
Each extracted frame is processed by Tesseract OCR. If the default PSM mode returns no meaningful text, it falls back to fully automatic page segmentation.
### Step 4: Generate Markdown Report
All extracted data is assembled into a structured Markdown document.
## Examples
### Example 1: Basic Extraction
Agent prompt:
Use the video-content-extractor skill to extract content from lecture.mp4
Output generates lecture.md and lecture_frames/ directory.
### Example 2: Custom Interval
Parameters: video_path, output_dir, interval(seconds), lang
Extract every 60 seconds with English-only OCR:
python scripts/extract_video.py recording.mp4 ./output 60 eng
### Example 3: Bilingual Content
Extract with default Chinese + English OCR:
python scripts/extract_video.py lecture.mp4 . 15 chi_sim+eng
## Best Practices
- Use shorter intervals (10-15s) for fast-paced content with frequent text changes.
- Use longer intervals (30-60s) for presentation slides or slow lectures to reduce duplicate frames.
- For Chinese content, ensure Tesseract Chinese language pack is installed (chi_sim).
## Limitations
- Requires FFmpeg and Tesseract OCR to be installed and accessible via PATH.
- Tesseract OCR accuracy depends on video quality, text size, and font clarity.
- Does not extract audio or perform speech-to-text transcription.
- Frame extraction is time-based (not scene-change-based), which may produce near-duplicate frames.
- Large videos with short intervals can generate many frames - ensure sufficient disk space.
## Security and Safety Notes
- This skill only reads video files and writes extracted frames and Markdown reports.
- It does NOT send any data over the network - all processing is local.
- FFmpeg and Tesseract are invoked with fixed, pre-vetted arguments.
- The skill does not modify or delete the original video file.
## Common Pitfalls
- Problem: Tesseract returns garbled text
Solution: Ensure the correct language pack is installed. Run tesseract --list-langs to verify.
- Problem: FFmpeg fails with "not found"
Solution: Make sure FFmpeg is on PATH. Run ffmpeg -version to verify.
- Problem: OCR is slow on large videos
Solution: Increase the interval parameter to reduce frames processed.
## Related Skills
- @media-summarizer - For summarizing video content using visual and audio cues.
- @document-ocr - For OCR on static images or scanned documents without video processing.

View File

@ -1,6 +1,6 @@
{
"name": "antigravity-awesome-skills",
"version": "12.1.0",
"version": "12.2.1",
"description": "Plugin-safe Codex plugin for the Antigravity Awesome Skills library.",
"author": {
"name": "sickn33 and contributors",
@ -19,7 +19,7 @@
"skills": "./skills/",
"interface": {
"displayName": "Antigravity Awesome Skills",
"shortDescription": "1,472 plugin-safe skills for coding, security, product, and ops workflows.",
"shortDescription": "1,476 plugin-safe skills for coding, security, product, and ops workflows.",
"longDescription": "Install a plugin-safe Codex distribution of Antigravity Awesome Skills. Skills that still need hardening or target-specific setup remain available in the repo but are excluded from this plugin.",
"developerName": "sickn33 and contributors",
"category": "Productivity",

View File

@ -10,6 +10,11 @@ date_added: "2026-06-05"
author: 2slides
tags: [presentations, slides, powerpoint, ai, api-integration, pdf, narration, document-summarization]
tools: [claude, cursor, gemini, codex, antigravity]
plugin:
setup:
type: manual
summary: "Install Python requirements and configure a 2slides API key before running generation scripts."
docs: SKILL.md
---
# 2slides Presentation Generation
@ -269,6 +274,12 @@ Section 2: [Subtopic]
Use the `create_pdf_slides.py` script:
Install the Python dependency first if it is not already available:
```bash
python -m pip install -r requirements.txt
```
```bash
# Basic generation
python scripts/create_pdf_slides.py --content "Your content here"
@ -294,7 +305,6 @@ python scripts/create_pdf_slides.py \
--resolution 1K|2K|4K # default: 2K
--page N # 0=auto, 1-100 (default: 1)
--content-detail concise|standard # default: standard
--mode sync|async # default: async
```
**Step 3: Handle Results**
@ -706,7 +716,7 @@ All scripts accept parameters that match [2slides API](https://2slides.com/api.m
| | `--aspect-ratio` | 1:1, 2:3, 3:2, 3:4, 4:3, 4:5, 5:4, 9:16, 16:9, 21:9 |
| | `--resolution` | 1K, 2K, 4K |
| | `--content-detail` | concise, standard |
| `create_pdf_slides.py` | Same as above + `--design-style` (free text), `--mode` (default async) | |
| `create_pdf_slides.py` | Same as above + `--design-style` / `--design-spec` (free text) | |
| `generate_narration.py` | `--mode` | single, multi |
| | `--voice` | 30 voices (Puck, Aoede, Charon, …); use `--list-voices` |
| | `--content-mode` | concise, standard |

View File

@ -126,7 +126,7 @@ Examples:
)
parser.add_argument("--content", required=True, help="Content for slides")
parser.add_argument("--design-spec", help="Optional design specifications")
parser.add_argument("--design-spec", "--design-style", dest="design_spec", help="Optional design specifications")
parser.add_argument("--language", default="Auto", help="Response language (default: Auto)")
parser.add_argument("--aspect-ratio", default="16:9", help="Aspect ratio in width:height format (default: 16:9)")
parser.add_argument("--resolution", choices=["1K", "2K", "4K"], default="2K",

View File

@ -36,7 +36,10 @@ Branch switching triggers a rebuild but not a browser reload — the CLI opens a
```bash
git diff --quiet && git diff --cached --quiet || git stash push -u -m "accesslint-diff-branch"
git checkout <branch>
branch="<branch>"
git check-ref-format --branch "$branch" >/dev/null
case "$branch" in -*) echo "Refusing option-like branch name: $branch" >&2; exit 1 ;; esac
git checkout -- "$branch"
npx -y @accesslint/cli@latest "<url>" --port "$PORT" --snapshot accesslint-diff --snapshot-dir /tmp --update-snapshot [--wait-for "<selector>"]
git checkout - && git stash pop 2>/dev/null
npx -y @accesslint/cli@latest "<url>" --port "$PORT" --snapshot accesslint-diff --snapshot-dir /tmp --format json [--wait-for "<selector>"]

View File

@ -0,0 +1,159 @@
---
name: article-illustrations
description: "Generate hand-drawn 16:9 article illustrations with the Grav character IP, sparse annotations, and absurd but clear visual metaphors."
category: creative
risk: safe
source: community
source_repo: vipin-si/article-illustrations
source_type: community
license: MIT
license_source: https://github.com/vipin-si/article-illustrations/blob/main/LICENSE
date_added: "2026-06-06"
author: vipin-si
tags: [illustration, article-graphics, visual-metaphors, image-generation, whiteboard-sketch]
tools: [image-generation]
---
# Article Illustrations — Grav Hand-Drawn Style
## Overview
Generate 16:9 landscape hand-drawn illustrations for articles, blog posts, and technical content. Each illustration captures one cognitive anchor point from an article and turns it into a clean, absurd, memorable whiteboard-sketch explanation.
The skill uses a recurring character IP called **Grav**: a small, round, always-floating figure with dot eyes and a thin antenna. Grav participates in the core action of every illustration — never just decoration.
**Repository:** [vipin-si/article-illustrations](https://github.com/vipin-si/article-illustrations)
## When to Use This Skill
- Use when writing articles, blog posts, or documentation that need inline illustrations
- Use when you want to turn abstract concepts into concrete visual metaphors
- Use when you want a consistent visual language across multiple articles
- Use when you need hand-drawn explanation sketches, not PPT infographics
## How It Works
### Step 1: Digest the Article
Read the article and identify cognitive anchor points — core judgments, turning points, input/output loops, before/after contrasts, and common pitfalls. Don't distribute illustrations evenly; prioritize moments that benefit from visual explanation.
### Step 2: Plan a Shot List
For each illustration, define:
- **Placement**: After which section
- **Theme**: What this image is about
- **Core Meaning**: The one idea it conveys
- **Structure Type**: One of 8 composition patterns (Workflow, System Closeup, Before/After, Role States, Conceptual Metaphor, Layered Method, Map Route, Mini Comic)
- **Grav's Action**: What Grav is doing in the scene
- **Annotation Labels**: 35 short English labels
### Step 3: Generate Images
Use the `generate_image` tool with the built-in prompt template. Each image follows strict style rules:
- Pure white background, no textures
- Black hand-drawn line art with slight wobble
- Sparse red/orange/blue handwritten annotations
- Grav always floating (never touching surfaces)
- One core idea per image
- 4060% canvas usage, 35%+ whitespace
### Step 4: QA Check
Verify each image against the QA checklist: correct format, Grav present and active, original metaphor, clean composition, sparse annotations, correct color usage.
## Examples
### Example 1: Plan illustrations for an article
```
Analyze this article and create a shot list of 5 illustrations.
Don't generate images yet — just plan which cognitive anchor points
deserve illustrations and what each image should convey.
<paste article>
```
### Example 2: Generate illustrations directly
```
Generate 4 Grav-style illustrations for this article.
Requirements: 16:9 landscape, pure white background, black hand-drawn
line art, sparse red/orange/blue English annotations.
<paste article>
```
### Example 3: Single concept illustration
```
Generate one 16:9 illustration for this concept:
"Trust isn't declared — it's built one piece of evidence at a time."
Grav must perform the core action. Maximum 5 annotation labels.
```
### Example 4: Iterate on a result
```
This illustration is on the right track, but Grav feels like decoration.
Keep the core meaning but regenerate: make Grav the one actually
driving the structure.
```
## Visual Style
| Element | Rule |
|:--------|:-----|
| Background | Pure white — no cream, texture, gradients, or shadows |
| Line art | Black, hand-drawn, slightly wobbly, not mechanical |
| Whitespace | Main subject 4060% of canvas, 35%+ empty space |
| Annotations | Handwritten English, 25 words each, max 58 per image |
| Color: Black | Main line art, characters, structures, objects |
| Color: Red | Key highlights, problems, warnings, results |
| Color: Orange | Main flow, paths, arrows, direction |
| Color: Blue | Supplementary notes, feedback, system state |
| Prohibited | Green, purple, yellow, pink, gradients, drop shadows, 3D, realistic UI |
## Character: Grav
- Small round body (pebble/potato shape)
- Two dot eyes (slightly asymmetric)
- One thin bent antenna with tiny circle tip
- Thin stick legs that dangle without touching surfaces
- Always hovering — visible gap between Grav and any surface
- Expression: calm, focused, deadpan
- Role: active participant in the system, never decoration
## Best Practices
- ✅ Start with a shot list before generating images
- ✅ Invent a new metaphor for every illustration — never reuse compositions
- ✅ Make Grav the action protagonist, not a bystander
- ✅ Keep it absurd but structurally clear
- ✅ Use color sparingly — when in doubt, use black
- ❌ Don't make PPT infographics or formal flowcharts
- ❌ Don't add title bars or decorative frames
- ❌ Don't let Grav touch the ground or stand on surfaces
- ❌ Don't make Grav cute, smiling, or emoji-like
## Limitations
- Requires access to an image-generation tool that can follow composition, line-art, and annotation constraints.
- The recurring Grav character style can drift between generations; verify every output against the QA checklist.
- Text in generated images may be misspelled or distorted, so short labels and post-generation review are required.
- The style is intended for explanatory article illustrations, not photorealistic product imagery or brand-final artwork.
## Common Pitfalls
- **Problem:** Illustration looks like a PPT slide
**Solution:** Remove 30% of elements, increase whitespace, make it weirder
- **Problem:** Grav is just standing next to the action
**Solution:** Redesign so Grav IS the mechanism — becomes the funnel, dangles from the lever, is suspended inside the machine
- **Problem:** Same metaphor as a previous illustration
**Solution:** Replace the physical object entirely — same concept, different analogy
## Additional Resources
- [Full skill with prompt templates and QA checklist](https://github.com/vipin-si/article-illustrations)
- [Example illustrations](https://github.com/vipin-si/article-illustrations#examples)

View File

@ -0,0 +1,874 @@
---
name: cv-generator
description: "Generate professional, ATS-optimized CVs for FlowCV, Canva, Google Docs, or Word. Handles multi-source merging, JD targeting, seniority adaptation, and humanized rewriting. Outputs paste-ready text with an ATS flaw report and improvement suggestions."
category: content
risk: safe
source: community
date_added: "2026-06-06"
author: "WHOISABHISHEKADHIKARI"
user-invokable: true
tags:
- cv
- resume
- ats
- career
- job-application
- career-change
---
# CV Generator Skill — FlowCV / Canva Edition
## When to Use
Use this skill when you need to:
- Generate a professional, ATS-optimized CV from multiple sources (LinkedIn, GitHub, Portfolio).
- Tailor an existing CV for a specific Job Description (JD).
- Improve the language, metrics, and structure of a draft resume.
- Prepare a paste-ready version of your CV for tools like FlowCV or Canva.
Turns raw profile data into a polished, ATS-ready CV. Outputs a paste-ready plain-text
version formatted for FlowCV, Canva, Google Docs, or Word — with a flaw report and
missing-info checklist.
---
## FLAW REGISTER — KNOWN ISSUES FIXED IN THIS VERSION
The following issues were identified across the two prior skill drafts and are corrected here:
| # | Flaw | Fix applied |
|---|------|-------------|
| F-01 | Output was Markdown-first, not paste-ready plain text | Final output is plain text; Markdown is internal staging only |
| F-02 | FlowCV/Canva field structure was never addressed | Section mapping to tool fields added (section 11c) |
| F-03 | Questionnaire dumped all 20 questions at once in practice | Hard rule: one question at a time, wait for answer |
| F-04 | Anti-hallucination rules listed but never enforced structurally | Enforcement gate added before every output (section 10) |
| F-05 | Cover letter was offered but never scoped for these tools | Cover letter now outputs to a separate plain-text block, not inline |
| F-06 | ATS check listed but had no scored output | Flaw report now scores 0100 with per-item pass/fail |
| F-07 | Seniority detection was "detect or ask" with no fallback | Default is mid-level if undetectable; user is told the assumption |
| F-08 | No guidance on what FlowCV/Canva cannot render | Added explicit field-by-field paste map (section 11c) |
| F-09 | Tense rules stated but never verified in quality gate | Tense check is now a hard gate — output blocked until corrected |
| F-10 | "Passionate about" and similar banned phrases still appeared in examples | Phrase blocklist now machine-checkable (section 7c) |
| F-11 | Nepal/South Asia market conventions were present but incomplete | Confirmed and expanded (section 14) |
| F-12 | No explicit rule on what to do when LinkedIn scraping is blocked | Hard fallback rule: ask for PDF export immediately, do not proceed empty |
| F-13 | File naming convention mentioned once, never enforced | File name rule is part of the final output block (section 11) |
| F-14 | Skill had no version history or upgrade path | Version field added to frontmatter |
| F-15 | GitHub was listed as a source but extraction rules were missing | GitHub extraction rules added (section 4f) |
---
## 1. Invocation
```
Use @cv-generator to build my CV from my LinkedIn PDF.
Use @cv-generator to tailor my CV for this job description.
Use @cv-generator to improve my existing draft.
Use @cv-generator to create a fresh CV via questionnaire.
Use @cv-generator — I want a FlowCV-ready output.
```
Any combination of sources is valid. Multiple sources are merged and deduplicated
before writing begins.
---
## Source Selection
Ask the user which source(s) to use. At least one is required.
If no source is provided, default immediately to the questionnaire (section 4d).
| # | Source | Instruction |
|---|--------|-------------|
| 1 | LinkedIn profile URL | Fetch page; extract all visible sections. **If blocked or empty: immediately ask for a LinkedIn PDF — do not proceed on an empty extraction.** |
| 2 | LinkedIn PDF export | Parse uploaded file. If scanned image: apply OCR and warn the user to verify accuracy. |
| 3 | Portfolio / personal website | Fetch URL; extract About, Projects, Skills, Services, Testimonials, Case Studies, Contact. |
| 4 | Questionnaire | Step-by-step (section 4d). One question at a time. |
| 5 | Existing CV or draft | Upload or paste; improve only — never alter facts. |
| 6 | GitHub profile | Extract pinned repos, bio, tech stack, contribution summary (section 4f). |
| 7 | Resume file (DOCX / PDF / TXT) | Parse and rewrite. Flag scanned PDFs; apply OCR. |
---
## Purpose, seniority, and format
### Purpose
Ask after source selection:
> "What is the main purpose of this CV?"
| Purpose | Key adaptation |
|---------|----------------|
| Applying for a specific job | Full JD analysis + keyword targeting (section 9) |
| General professional CV | Balanced, role-agnostic, reverse-chronological |
| Internship / entry-level | Education and projects lead; transferable skills foregrounded |
| Academic / research | Publications, grants, teaching, research interests |
| Freelance / client proposal | Deliverables, outcomes, services |
| Career change | Functional or hybrid; transferable skills reframed |
| Executive / board-level | Executive summary, board positions, P&L scope |
| Military-to-civilian | Translate ranks and jargon to civilian equivalents |
| Return to work / career break | Frame gap positively; emphasise upskilling |
| Other | Ask the user to describe the goal in one sentence |
### Seniority
Detect from data. If undetectable, **default to mid-level and tell the user:**
> "I've assumed mid-level (38 years). Let me know if this should be different."
| Level | Years | CV emphasis |
|-------|-------|-------------|
| Student / fresh graduate | 01 | Education first; projects; extracurriculars; 1 page |
| Junior / entry | 13 | Skills + education prominent; 1 page |
| Mid-level | 38 | Experience leads; achievements over duties; 12 pages |
| Senior | 815 | Leadership, scope, impact, mentoring; 2 pages |
| Executive / C-suite | 15+ | Strategic narrative; board roles; P&L; 23 pages |
| Academic | Any | No page limit; publications; grants; teaching |
### Format
| Format | Use when |
|--------|----------|
| Chronological (default) | Clear career progression; most job applications |
| Functional / skills-first | Career changers; large gaps; military-to-civilian |
| Hybrid / combination | Senior professionals rebranding; career changers with strong experience |
| Academic CV | University, research, PhDs, postdocs |
| Executive / Board bio | C-suite, NED, advisory |
| Portfolio-led | Designers, architects, creatives |
---
## Data extraction rules
### LinkedIn URL
If the page is blocked or returns no content, **stop immediately** and ask:
> "LinkedIn blocked the fetch. Please export your LinkedIn profile as a PDF
> (LinkedIn → Me → Settings → Data Privacy → Get a copy of your data) and upload it."
If accessible, extract in order:
1. Full name and headline
2. Contact information (email, phone, location — public only)
3. About / Professional Summary
4. Work experience: title, company, location, dates, bullets
5. Education: degree, institution, dates, grade/honours
6. Skills (flag top endorsed skills)
7. Certifications and licences
8. Projects
9. Achievements, honours, awards
10. Volunteer experience
11. Languages and proficiency
12. Publications, patents, courses
### LinkedIn PDF
Hard rules:
- Extract only what is physically present in the document.
- Preserve all dates exactly as written.
- If a section is absent, mark it **[Not provided]** — do not skip silently.
- Do not merge bullets across different roles.
- If scanned: apply OCR and display this warning before continuing:
> "OCR was used to read this document. Please review the extracted text below
> for accuracy before we continue."
### Portfolio / personal website
Extract:
- About / bio → Professional Summary
- Projects: name, description, technologies, outcomes, live/repo URLs
- Skills and services
- Testimonials or client logos → Achievements
- Case studies → 24 bullets each
- Blog posts or articles → Publications / Thought Leadership
- Contact details
### Questionnaire
**One question at a time. Wait for the answer before continuing.**
Do not display the full list unless the user explicitly asks for a form.
```
Q1. Full legal name (as it should appear on the CV)
Q2. Target job title or role
Q3. Email address
Q4. Phone number including country code (optional but recommended)
Q5. City and country of residence
Q6. LinkedIn URL (optional)
Q7. Portfolio, GitHub, or personal website URL (optional)
Q8. Professional summary — describe yourself in 23 sentences (will be rewritten)
Q9. Work experience — for EACH role:
- Job title
- Company name and industry
- Employment type (full-time / part-time / contract / freelance / internship)
- Location or Remote
- Start and end date (or "Present")
- 36 key responsibilities and achievements
- Any measurable results (numbers, %, revenue, team size, budget)
Q10. Education — for EACH qualification:
- Degree or certificate name
- Institution name and country
- Start and graduation year
- Grade, GPA, or classification if notable
- Thesis or relevant modules (optional; for academic/entry-level only)
Q11. Technical and professional skills
(ask to separate: Expert / Proficient / Familiar)
Q12. Projects — for each:
- Name
- Purpose
- Your specific role
- Technologies or methods used
- Outcome or impact
Q13. Certifications (name, issuing body, date, expiry if applicable)
Q14. Achievements, awards, or recognitions
Q15. Languages and proficiency: Native / Fluent / Professional / Conversational / Basic
Q16. Volunteer or open-source work (optional)
Q17. Publications, speaking engagements, press mentions (optional)
Q18. Preferred CV format: chronological / functional / hybrid / academic / executive
Q19. Target country or job market
Q20. Any employment gaps? Dates and brief reason — will be framed constructively.
```
### Existing CV or draft
Rules:
- Preserve every fact: titles, companies, dates, institutions, grades.
- Rewrite weak or passive bullets with strong action verbs.
- Remove repetition across roles.
- Correct grammar, punctuation, spelling.
- Fix tense: past for completed roles, present for current role.
- Replace all banned phrases (section 7c).
- Improve ATS keyword density where natural — do not keyword-stuff.
- Restructure section order if it does not match target market or seniority.
- **Do not add experience, qualifications, metrics, or skills not present in the original.**
### GitHub profile
Extract:
- Bio / tagline → supplement Professional Summary
- Pinned repositories: name, description, tech stack, stars/forks
- Contribution activity (years active, languages used)
- README content for context on major projects
- Do not infer seniority from commit count alone
### Employment gaps and special situations
**Gap under 3 months:** no special treatment.
**Gap 312 months:** one-line entry:
> "Career break — [brief honest reason: personal development / caregiving / travel / health]"
**Gap over 12 months:** add a neutral framing entry in the experience section;
highlight any upskilling, freelance, volunteering, or relevant activity during the gap.
Never fabricate activity.
**Contract / freelance / part-time:** label employment type clearly. Group multiple
short contracts under one umbrella entry (e.g. "Freelance Consultant") if they share
a skill area.
**Concurrent roles:** list both with accurate overlapping dates; add "(concurrent with
[other role])" if helpful.
**Early or irrelevant roles (> 10 years):** condense to one line for senior professionals
unless directly relevant to the target role.
**Fresh graduate:** lead with Education → Projects → Skills → Internships.
Use academic projects as proof of practical skills.
**Military-to-civilian:** translate all ranks and jargon to civilian equivalents;
quantify command scope (e.g. "Managed 35 personnel and $2M in equipment").
**Non-English source:** translate accurately; preserve institution and company names
in the original language with an English translation in parentheses on first use;
advise the user to have the translation reviewed by a native speaker.
---
## Multi-source merging
1. Build a master profile combining all extracted data.
2. Deduplicate: keep the most detailed version of each entry.
3. If two sources conflict on a date or title, flag it and ask the user to confirm.
4. Identify gaps; ask follow-up questions only for critical missing data.
5. Never fabricate a detail — mark it **[Not provided]** until the user confirms.
---
## CV section order
### Chronological (default — mid / senior)
```
1. Full Name
2. Contact Information (email | phone | LinkedIn | portfolio | city, country)
3. Professional Summary
4. Core Skills
5. Work Experience (reverse chronological)
6. Education (reverse chronological)
7. Certifications and Licences
8. Projects
9. Technical Skills (grouped: Languages | Frameworks | Tools | Platforms)
10. Achievements and Awards
11. Volunteer Experience
12. Publications / Speaking
13. Languages
14. Additional Information
```
### Fresh graduate / student
```
1. Full Name + Contact Information
2. Professional Summary / Objective
3. Education
4. Projects and Coursework
5. Skills
6. Work Experience / Internships
7. Certifications
8. Extracurricular / Volunteer
9. Languages
```
### Functional / skills-first (career changers, large gaps)
```
1. Full Name + Contact Information
2. Professional Summary
3. Core Competencies / Skills
4. Key Achievements
5. Work History (company, title, dates — minimal bullets)
6. Education
7. Certifications
8. Languages
```
### Academic CV
```
1. Full Name + Contact + ORCID / ResearchGate
2. Research Interests
3. Education
4. Academic Positions
5. Publications
6. Grants and Funding
7. Teaching Experience
8. Supervision
9. Awards and Honours
10. Conference Presentations
11. Professional Memberships
12. Skills
13. References
```
### Executive / Board
```
1. Full Name + Contact Information
2. Executive Summary
3. Core Competencies
4. Board and Advisory Roles
5. Executive Experience
6. Education and Qualifications
7. Publications / Media / Speaking
8. Professional Memberships
```
---
## Writing rules
### Professional Summary
Write 35 sentences (executive: 57) covering:
1. Who the person is: job title + years of experience
2. Primary domain of expertise
3. One concrete differentiator or standout achievement
4. Value proposition aligned to the target role
- Do not open with "I am".
- Do not open with any banned phrase (section 7c).
- Base strictly on data collected — no padding.
Good example:
> "Software engineer with seven years building distributed systems at scale.
> Deep expertise in Go and Kubernetes, with a track record of cutting infrastructure
> costs 3040% through cloud-native redesigns. Seeking a staff-level role where
> systems reliability and platform engineering intersect."
### Experience bullets — STAR-lite
Pattern: `[Strong verb] + [what you did] + [scale/scope] + [outcome if available]`
Rules:
- 36 bullets per role (23 for short-tenure or early roles)
- Past tense for completed roles; present tense for current role
- 1530 words per bullet
- Different verb to open each bullet — never repeat within one role
- If no metric was provided: write a result-focused statement without inventing numbers
- Never fabricate metrics — if the user says "we grew a lot", ask for specifics
Action verb bank:
```
Leadership: Led, Directed, Managed, Supervised, Mentored, Coached, Championed
Building: Built, Developed, Engineered, Architected, Designed, Implemented, Launched, Shipped
Improvement: Reduced, Improved, Optimised, Streamlined, Accelerated, Automated, Consolidated
Analysis: Analysed, Researched, Evaluated, Identified, Diagnosed, Assessed, Mapped
Communication: Presented, Authored, Documented, Trained, Negotiated, Advised, Collaborated
Growth: Grew, Expanded, Scaled, Generated, Increased, Secured, Delivered
Strategy: Defined, Established, Prioritised, Planned, Coordinated, Oversaw, Aligned
```
Rewrites:
```
BEFORE: "Responsible for managing the team"
AFTER: "Managed a cross-functional team of 8 engineers, delivering the product roadmap
on schedule for three consecutive quarters"
BEFORE: "Helped with developing new features"
AFTER: "Developed four customer-facing features in React, reducing support tickets by 25%"
BEFORE: "Was involved in the migration project"
AFTER: "Led migration from monolith to microservices, cutting deployment time from
45 minutes to under 4 minutes"
```
### Banned phrases — machine-checkable blocklist
Before output, scan the full CV text and **reject any bullet or sentence containing**
any of the following strings (case-insensitive):
```
results-driven
dynamic individual
highly motivated
team player
proven track record
passionate about
passionate professional
detail-oriented
self-starter
hard worker
strong communication skills
excellent communication
synergy
leverage (when used as a verb meaning "use")
paradigm shift
thought leader
go-getter
innovative thinker
outside the box
people person
visionary
change agent
```
If found: rewrite the sentence to show the specific evidence instead.
### Tense enforcement
This is a hard gate — output is blocked until tense is correct:
- **Completed role** → all bullets in past tense (Led, Built, Reduced...)
- **Current role** → all bullets in present tense (Lead, Build, Reduce...)
- **Mixed tense within one role** → always fail; fix before output
### Acronym and terminology
- Spell out on first use: "Machine Learning (ML)"; use abbreviation thereafter.
- Consistent capitalisation throughout: "JavaScript" not "Javascript".
- Mirror exact JD phrasing where applicable.
- Include both full form and abbreviation for searchability.
---
## ATS optimisation
### Structural rules
| Rule | Why it matters |
|------|----------------|
| Name must be the very first line of the body | Parsers read top-to-bottom; name in header/footer is often missed |
| Contact info in body, not in header or footer | Header/footer text is invisible to Taleo, Workday, iCIMS |
| Single-column layout only | Two-column layouts break ATS text extraction order |
| No tables for layout | Table cells are read in unpredictable order |
| No text boxes, shapes, or SmartArt | Text inside shapes is invisible to ATS |
| No images or photos (unless market requires it) | Images are ignored; photos risk bias filtering |
| No icons in bullets or headings | Symbols like ➤ ✓ ★ corrupt parsed text |
| Bullet characters: hyphen (-) or plain dot (•) only | Safe across all ATS platforms |
| Standard section headings only | Non-standard headings cause misclassification |
| No "Objective" heading | Flags CV as outdated; use "Professional Summary" |
| Font: minimum 10pt body, 1214pt headings | Smaller text garbles in PDF-to-text conversion |
| Margins: minimum 0.5 in / 1.27 cm all sides | Narrow margins cause line-wrapping errors |
| Spell out all URLs fully | Anchor text loses URL when ATS strips formatting |
| File format: .docx preferred for ATS; PDF for email | DOCX parses more accurately in most ATS |
| File name: FirstName_LastName_CV.docx | Generic names ("resume.pdf") get buried in recruiter files |
### Keyword strategy
1. Extract top 1020 keywords from the JD (if provided).
2. Categorise: hard skills | soft skills | qualifications | industry terms.
3. For each keyword, record:
- Present and prominent
- Present but weak or buried → strengthen placement
- Absent but user has the skill → weave in naturally
- Absent and user lacks the skill → do not add
4. Target keyword density: 24 natural occurrences per hard skill across the full CV.
5. Include both spelled-out form and abbreviation for key terms.
6. Mirror exact JD phrasing for shared responsibilities.
### ATS platform quick notes
| Platform | Key quirk |
|----------|-----------|
| Workday | DOCX preferred; complex PDF tables fail |
| Taleo | Strictest; no special characters; plain text preferred |
| Greenhouse | Lenient; weights keyword frequency |
| Lever | Modern parser; handles most formats |
| iCIMS | DOCX preferred; strips header/footer text |
| SmartRecruiters | Handles DOCX and PDF; relatively lenient |
Default when platform is unknown: apply Taleo-level strictness.
---
## Job description integration
When a JD is provided, run four steps:
**Step 1 — Parse:**
- Job title and seniority signals
- Required vs preferred qualifications
- Hard skills: tools, languages, platforms, methodologies
- Soft skills and collaboration patterns
- Industry terminology
- Responsibility verb phrases (mirror these in bullets)
**Step 2 — Score:**
For each of the top 15 keywords, mark: present and prominent / present but weak /
absent.
**Step 3 — Integrate:**
- Strengthen weak keyword placements.
- Weave in missing keywords the user genuinely has experience with.
- Never add a keyword the user cannot truthfully claim.
**Step 4 — Report (include at end of output):**
```
JD KEYWORD MATCH REPORT
Total JD keywords identified: 18
Matched in CV: 14 (78%)
Added naturally during generation: 3
Not added (user lacks skill): 1 — Salesforce
Recommendation: even limited Salesforce exposure is worth noting if any exists
```
---
## Anti-hallucination enforcement gate
Before any output is produced, confirm every item in the CV passes this check.
**Output is blocked until all items pass.**
| Item | Rule |
|------|------|
| Job titles | Sourced directly from user data — not inferred or upgraded |
| Company names | Sourced directly — not corrected, normalised, or embellished |
| Dates | Reproduced exactly as provided — no normalisation without noting it |
| Degrees and institutions | Reproduced exactly as provided |
| Certifications | Only those explicitly named by the user |
| Metrics and numbers | Only those provided by the user — never approximated or invented |
| Awards and achievements | Only those named by the user |
| Skills and tools | Only those provided or clearly evidenced in source data |
| Projects | Only those named by the user |
If any item cannot be verified: mark it **[Not provided]** and include it in the
missing information checklist (section 11d). Never fill gaps silently.
---
## Final output — deliver in this exact order
### Formatted CV (staging draft)
Clean plain-text draft with clear section labels. Used as the working version
before generating the tool-specific paste copies below.
### FlowCV paste-ready version
FlowCV uses structured text fields, not free-form documents. Format accordingly:
```
FULL NAME
[First name] [Last name]
PROFESSIONAL TITLE
[Target job title]
CONTACT
Email: [email]
Phone: [+country code number]
Location: [City, Country]
LinkedIn: [full URL]
Portfolio: [full URL if applicable]
PROFESSIONAL SUMMARY
[35 sentence plain paragraph — no bullets, no Markdown]
CORE SKILLS
[skill], [skill], [skill], [skill]
[skill], [skill], [skill], [skill]
WORK EXPERIENCE
[Job Title]
[Company Name] | [City, Country] | [Mon YYYY] [Mon YYYY or Present]
[Employment type if not full-time: Contract / Freelance / Part-time]
- [Bullet one: action verb + context + outcome]
- [Bullet two]
- [Bullet three]
[Repeat for each role]
EDUCATION
[Degree Name]
[Institution Name], [Country] | [YYYY] [YYYY]
[Grade or classification if notable]
[Repeat for each qualification]
CERTIFICATIONS
[Certificate Name] — [Issuing Body] — [Month YYYY]
PROJECTS
[Project Name]
[Technologies: tool, tool, tool]
- [What it does / your role / outcome]
ACHIEVEMENTS
- [Achievement one]
- [Achievement two]
VOLUNTEER EXPERIENCE
[Role] — [Organisation] — [YYYYYYYY]
- [One-line description]
LANGUAGES
[Language]: [Native / Fluent / Professional / Conversational / Basic]
ADDITIONAL INFORMATION
[Anything else: open-source, interests relevant to role]
```
### Canva paste-ready version
Canva CV templates use individual text boxes per section. Provide each section as
a separate clearly labelled block, with no Markdown symbols.
```
--- PASTE INTO: Name field ---
[Full name]
--- PASTE INTO: Job title / headline field ---
[Target job title]
--- PASTE INTO: Contact block ---
[email] | [phone] | [city, country] | [LinkedIn URL]
--- PASTE INTO: Summary / About field ---
[35 sentence paragraph, plain text, no hyphens or bullets]
--- PASTE INTO: Skills field ---
[skill] | [skill] | [skill] | [skill] | [skill]
--- PASTE INTO: Experience entry 1 ---
[Job Title]
[Company] | [Location] | [Mon YYYY Mon YYYY]
- [Bullet]
- [Bullet]
- [Bullet]
[Continue for each role as a separate block]
--- PASTE INTO: Education entry 1 ---
[Degree]
[Institution], [Country] | [YYYY YYYY]
[Grade if notable]
--- PASTE INTO: Certifications ---
[Certificate] | [Issuer] | [YYYY]
--- PASTE INTO: Languages ---
[Language] ([Proficiency])
```
### Missing information checklist
```
MISSING INFORMATION
[ ] Phone number
[ ] LinkedIn URL
[ ] Portfolio or GitHub URL
[ ] Measurable results for [Role] at [Company]
[ ] Certifications — do you hold any?
[ ] Languages — list any beyond English
[ ] Employment gap [Mon YYYY Mon YYYY] — add a brief framing note
[ ] [Any other flagged item]
```
### CV flaw report (scored 0100)
Run all checks. Display a scored report:
```
CV FLAW REPORT
──────────────────────────────────────
Score: [X]/100
PASS Truthfulness — all facts sourced from user data
PASS No hallucination — no fabricated details
PASS Tense correctness — past for completed, present for current
PASS ATS structure — single column, no tables or images
PASS Standard headings — all recognisable by parsers
PASS No forbidden characters — no ➤ ✓ ★
PASS Humanized — no banned phrases found
PASS Contact info in body (not header/footer)
FAIL [Check name] — [specific issue and location in CV]
──────────────────────────────────────
Deductions: -[N] per FAIL item
Final score: [X]/100
ISSUES TO FIX:
1. [Exact location] — [Exact problem] — [Suggested fix]
2. [Exact location] — [Exact problem] — [Suggested fix]
```
Score deductions: -10 per FAIL on truthfulness or hallucination;
-5 per FAIL on tense, ATS structure, or banned phrases;
-3 per FAIL on formatting issues.
### Improvement suggestions (37, specific and actionable)
- "Your summary does not state the target role. Open with your job title explicitly."
- "The [Company] role has no metrics. Even approximate scope (team size, users, budget range) strengthens credibility."
- "Skills section mixes expert and basic tools without distinction. Group into Proficient / Familiar."
- "Add a GitHub or portfolio URL — technical recruiters check it before the interview."
- "Three bullets begin with 'Responsible for' — replace with direct action verbs."
- "CV is [N] pages for [N] years of experience. Target is [N] pages; trim older roles to one line."
### Suggested file name
```
Suggested filename: [FirstName]_[LastName]_CV.docx
```
---
## Cover letter companion (optional)
After the CV output, offer:
> "Would you like a tailored cover letter for this application?"
If yes, output as a **separate clearly labelled plain-text block** — not inline with the CV.
Rules:
- Opens with a specific hook — not "I am writing to apply for…"
- References company and role by name
- Bridges 23 strongest CV points to the JD's key requirements
- Closes with a clear call to action
- Matches tone of the target industry
- 3 paragraphs maximum, 250350 words
- Does not repeat the CV verbatim
---
## Limitations
- **No hallucination.** Never invent a title, company, date, degree, cert, skill, metric, or award.
- **No fake metrics.** If the user says "we grew a lot", ask for specifics — never insert a percentage.
- **Respect source truth.** "Junior Developer" stays "Junior Developer" — suggest a reframe if needed; never silently change it.
- **No silent changes.** If something is materially reworded, note the change.
- **One version at a time.** Complete the CV before offering variants.
- **Privacy.** Do not expose full home address, national ID, DOB, marital status, or religion unless the user's target market requires it.
- **No keyword stuffing.** Adding skills the user does not have is fraud. Flag gaps; never fabricate.
- **OCR warning.** Always display before continuing: "OCR was used — please verify the extracted text for accuracy."
---
## Country and market conventions
| Market | Length | Photo | DOB | Marital status | References |
|--------|--------|-------|-----|----------------|------------|
| USA | 12 pages | No | No | No | "Available on request" |
| Canada | 12 pages | No | No | No | "Available on request" |
| UK | 2 pages | No | No | No | "Available on request" |
| Ireland | 2 pages | No | No | No | "Available on request" |
| Australia / NZ | 23 pages | No | No | No | "Available on request" |
| Germany / Austria / Switzerland | 23 pages | Yes (expected) | Yes | Sometimes | Listed or on request |
| France | 12 pages | Optional | No (illegal to require) | No | On request |
| Netherlands / Scandinavia | 12 pages | Optional | No | No | On request |
| Japan | 12 pages (rirekisho) | Yes | Yes | Yes | Listed |
| South Korea | 12 pages | Yes | Yes | Yes | Listed |
| China | 12 pages | Yes | Yes | Yes | Listed |
| India | 23 pages | Optional | Yes (common) | Sometimes | Listed |
| Nepal | 23 pages | Yes (common) | Yes | Sometimes | Listed |
| Bangladesh / Sri Lanka | 23 pages | Yes (common) | Yes | Sometimes | Listed |
| UAE / Gulf (GCC) | 23 pages | Yes (common) | Yes | Yes (sometimes) | Listed |
| Nigeria / East Africa | 23 pages | Yes (common) | Yes | Sometimes | Listed |
| South Africa | 35 pages | Optional | Yes (common) | No | Listed |
| Brazil | 12 pages | Optional | Yes (common) | No | On request |
| Academic (global) | No limit | Varies | Varies | No | Full list required |
| Executive / board (global) | 23 pages | No | No | No | On request |
Default when market is unknown: UK / international conventions (no photo, no DOB, 2 pages,
"Available on request").
---
## Decision tree
```
User invokes @cv-generator
|
v
Source provided? --No--> Run questionnaire (Q1Q20, one at a time)
|Yes
v
LinkedIn URL blocked? --Yes--> Ask for PDF export immediately; do not proceed empty
|No
v
Collect all sources --> merge and deduplicate (section 5)
|
v
Ask: Purpose? --> Detect or assume seniority (default: mid-level; tell the user)
|
v
Select format (section 3c)
|
v
Select section order (section 6)
|
v
JD provided? --Yes--> Parse JD --> extract and score keywords (section 9)
|No |
v v
Write CV content Integrate keywords naturally
(sections 78) |
|<-------------------+
v
Run anti-hallucination gate (section 10) --> block output until all pass
|
v
Run tense enforcement (section 7d) --> block output until all pass
|
v
Run banned phrase scan (section 7c) --> fix any found
|
v
Output in order:
Formatted CV (staging draft)
FlowCV paste-ready version
Canva paste-ready version
Missing information checklist
CV flaw report (scored)
Improve suggestions
Suggested file name
|
v
Offer cover letter (section 12)
```

View File

@ -19,6 +19,14 @@ tags:
# ExamPrep AI
## When to Use
Use this skill when you need to:
- Convert a syllabus, past papers, or study notes into a prioritized roadmap.
- Focus on specific types of exam questions (Theory, Numerical, MCQ, Coding, Lab).
- Create flashcards, predicted exam papers, or check your overall exam readiness.
- Perform last-minute revision or deep-dive into important exam topics.
## 🎯 Selective Reading Rule — Read ONLY the section matching the request
| What the student asks for | Jump to |

View File

@ -6,7 +6,7 @@ risk: unknown
---
Install by downloading the installer script first, reviewing it, and then running it locally. Example:
`curl -LsSf https://hf.co/cli/install.sh -o /tmp/hf-install.sh && less /tmp/hf-install.sh && bash /tmp/hf-install.sh`
`tmpdir="$(mktemp -d)" && trap 'rm -rf "$tmpdir"' EXIT && curl -LsSf https://hf.co/cli/install.sh -o "$tmpdir/hf-install.sh" && less "$tmpdir/hf-install.sh" && bash "$tmpdir/hf-install.sh"`
## When to Use
Use this skill when you need the `hf` CLI for Hub authentication, downloads, uploads, repo management, or basic compute operations.
@ -182,7 +182,7 @@ Generated with `huggingface_hub v1.8.0`. Run `hf skills add --force` to regenera
To mount Hub repositories or buckets as local filesystems — no download, no copy, no waiting — use `hf-mount`. Files are fetched on demand. GitHub: https://github.com/huggingface/hf-mount
Install by downloading the installer locally, reviewing it, and then running it. Example:
`curl -fsSL https://raw.githubusercontent.com/huggingface/hf-mount/main/install.sh -o /tmp/hf-mount-install.sh && less /tmp/hf-mount-install.sh && sh /tmp/hf-mount-install.sh`
`tmpdir="$(mktemp -d)" && trap 'rm -rf "$tmpdir"' EXIT && curl -fsSL https://raw.githubusercontent.com/huggingface/hf-mount/main/install.sh -o "$tmpdir/hf-mount-install.sh" && less "$tmpdir/hf-mount-install.sh" && sh "$tmpdir/hf-mount-install.sh"`
Some command examples:
- `hf-mount start repo openai-community/gpt2 /tmp/gpt2` — mount a repo (read-only)

View File

@ -0,0 +1,101 @@
---
name: open-dynamic-workflows
description: "Plan, orchestrate, and adversarially verify parallel AI coding agents with a dynamic multi-agent workflow engine."
category: ai-agents
risk: critical
source: community
source_repo: Suraj1235/open-dynamic-workflows
source_type: community
date_added: "2026-06-06"
author: Suraj1235
tags: [multi-agent, orchestration, workflow, adversarial-verification, coding-agents]
tools: [claude, cursor, codex, gemini, antigravity]
# Optional: declare the upstream license if source_repo is set
license: "MIT"
license_source: "https://github.com/Suraj1235/open-dynamic-workflows/blob/main/LICENSE"
---
# Open Dynamic Workflows
## Overview
Open Dynamic Workflows (ODW) is an open-source dynamic multi-agent workflow engine for AI coding agents such as OpenCode, Codex, Antigravity, and VS Code. It lets you plan a task, orchestrate multiple agents working in parallel, and adversarially verify their output before it lands. ODW ships a Codex/Antigravity skill folder (`SKILL.md` plus a daemon bridge) and an OpenCode plugin, and it is bring-your-own-model (Anthropic, OpenAI-compatible, or Ollama). This skill is adapted from the community project at `Suraj1235/open-dynamic-workflows`.
## When to Use This Skill
- Use when you need to decompose a coding task into independent subtasks and run multiple agents in parallel.
- Use when working across more than one AI coding tool (OpenCode, Codex, Antigravity, VS Code) and want a single orchestration layer.
- Use when the user asks for adversarial review or verification of agent-generated changes before merging.
## How It Works
### Step 1: Plan
ODW takes a high-level goal and produces a dynamic workflow graph of subtasks, identifying which can run in parallel and which have dependencies.
### Step 2: Orchestrate
The engine dispatches subtasks to parallel agents through the OpenCode plugin or the Codex/Antigravity daemon bridge, using your configured model provider (Anthropic, OpenAI-compatible, or Ollama).
### Step 3: Adversarially Verify
Completed work is routed through an adversarial verification pass that challenges the output before results are synthesized and returned.
## Examples
### Example 1: Run a parallel workflow
ODW is installed from source (clone the repo, then `npm install`). The CLI is
`odw-daemon` — run it as `npm run odw -- <args>` from inside the repo, or as
`npx odw-daemon <args>` / a global `odw-daemon` if you link the bin.
```bash
# Configure your model provider (bring-your-own-model)
export ANTHROPIC_API_KEY=... # or an OpenAI-compatible / Ollama endpoint
# One-time setup: generate ~/.odw/config.json
npm run setup
# Start the local workflow daemon (once)
npm run odw -- start
# Plan, orchestrate, and verify a task across parallel agents
npm run odw -- run --prompt "refactor the auth module and add tests"
```
### Example 2: Use the Codex/Antigravity skill bridge
```bash
# ODW ships a SKILL.md + daemon bridge consumed by Codex / Antigravity.
# Start the daemon, then run a saved orchestration script through it:
npm run odw -- start
npm run odw -- run --script examples/workflows/studio-prime.workflow.js --cwd .
```
## Best Practices
- ✅ Scope each subtask so agents can run without shared state.
- ✅ Keep the adversarial verification pass enabled before merging agent output.
- ❌ Don't run interdependent subtasks in parallel without declaring their dependencies.
- ❌ Don't commit provider API keys; use environment variables or a secrets manager.
## Limitations
- This skill does not replace environment-specific validation, testing, or expert review.
- Stop and ask for clarification if required inputs, permissions, or safety boundaries are missing.
## Security & Safety Notes
- ODW executes agent-generated code and shell commands; run it only in an authorized, local, or sandboxed environment.
- Model provider credentials (Anthropic / OpenAI-compatible / Ollama) must be supplied via environment variables, never committed to source.
- Review adversarial-verification output before applying changes to a production branch.
## Common Pitfalls
- **Problem:** Parallel agents collide on the same files.
**Solution:** Give each subtask exclusive file/module ownership and run conflicting tasks sequentially.
## Related Skills
- `@multi-agent-orchestration` - When coordinating multiple agents on one goal.
- `@code-review` - How adversarial verification complements human review.

View File

@ -18,5 +18,5 @@ Use this when optimizing opencode's permission settings, reviewing allowed comma
- **Config review**: Loads `~/.config/opencode/opencode.json` or project-level config
- **Permission summary**: Identifies currently allowed commands and skill permissions
- **Safe commands**: Suggests read-only commands (ls*, git status*, git log*, rg, grep, cat, etc.)
- **Safe commands**: Suggests reviewed read-only commands such as `git status --short`, `git log --oneline`, `rg`, `grep`, and `cat`; broad trailing wildcards need manual review.
- **Change application**: Edits config to add/remove permission entries, validates JSON

View File

@ -33,7 +33,8 @@ Complements opencode's built-in allow/deny/ask permissions by auditing current c
## Key Rules
- Never allow commands that modify files, commit, push, or change system state
- Use wildcards appropriately (e.g., `git status*` not just `git status`)
- Prefer exact command entries such as `git status --short`, `git diff --stat`, and `ls -la`
- Avoid trailing wildcards such as `git status*` unless the expanded command family has been manually reviewed as read-only
- Confirm with user before modifying permission config
- Distinguish between bash command permissions and skill permissions
- Keep config organized: group related commands together

View File

@ -1,93 +0,0 @@
---
name: polis-protocol
description: "Coordinate multi-vendor AI agents as a self-improving team — a learning router assigns work by track record and citizens can amend the protocol's own rules."
category: orchestration
risk: safe
source: community
source_repo: yehudalevy-collab/polis-protocol
source_type: community
date_added: "2026-06-02"
author: yehudalevy-collab
tags: [multi-agent, coordination, routing, orchestration, governance, vendor-agnostic]
tools: [claude, cursor, gemini, codex, antigravity]
license: "MIT"
license_source: "https://github.com/yehudalevy-collab/polis-protocol/blob/main/LICENSE"
---
# Polis Protocol — a team of agents that develops
## Overview
Most agent coordination is a passive board: claim a task, do it, mark it done. It records, but it never gets smarter, and its rules are frozen. Polis Protocol is the active alternative — a folder of markdown where each agent is a "citizen" with a capability card, work is routed by a learning bandit to whoever has the best track record on the task's tags, settled work files lessons that update the routing, and citizens can propose and vote on amendments to the protocol itself. It is vendor-agnostic: Antigravity, Claude, Codex, and Gemini agents can all share one `_polis/`.
In Antigravity specifically, this turns Manager View's fixed pipeline into a team that learns who is actually best at each kind of work, instead of running the same roles in the same order every time.
## When to Use This Skill
- Use when 2+ agents (especially across vendors) work on one project and "who should do this" is a real question.
- Use when you want the team to measurably improve over time — routing that adapts from outcomes, not static role labels.
- Use when you need a durable, git-auditable record of who did what, what was learned, and which rules changed.
- Use when Antigravity's default orchestration is too rigid and you want routing + governance on top of it.
## How It Works
### Step 1: Found a polis
Clone the repo and run the scaffolder directly (review `install.sh` first if you prefer the one-line installer):
```bash
git clone https://github.com/yehudalevy-collab/polis-protocol.git
python3 polis-protocol/scripts/init_polis.py \
--project-root . \
--agent-id gemini-antigravity-yourproject \
--vendor google --model gemini-3 --tool antigravity
```
This writes `_polis/` plus the skill into `.antigravity/skills/`, and bridge pointers (`GEMINI.md`, `AGENTS.md`) that point every tool at `_polis/CONSTITUTION.md`. Tip: add `--dry-run` to preview every file before anything is written.
### Step 2: Register citizens and open contracts
Each agent publishes a capability card under `_polis/citizens/`. Work is opened as a contract with `required_tags`, not assigned to a fixed role.
### Step 3: Route by track record
```bash
python3 polis-protocol/scripts/route_contract.py --polis-root _polis \
--contract _polis/contracts/open/your-task.md --explain
```
The router prints a score breakdown (history / self-rating / cost / availability) and recommends the citizen with the strongest record on the task's tags.
### Step 4: Settle, learn, and amend
A settled contract files a lesson; `--reconcile` folds it into `routing_stats.yml` so the next similar task routes better. When a rule stops working, a citizen proposes an amendment and the others vote.
## Examples
### Example 1: See the team learn (no install, 30 seconds)
```bash
git clone https://github.com/yehudalevy-collab/polis-protocol.git
cd polis-protocol && bash scripts/demo.sh
```
The router recommends Gemini for a Spanish-translation contract — because settled work taught it she has the best record on that tag, not because anyone reassigned it.
### Example 2: Explain any routing decision
```bash
python3 scripts/route_contract.py --polis-root examples/research-team/_polis \
--contract examples/research-team/_polis/contracts/open/parent-newsletter-issue-3.md --explain
```
## Notes
- No server, no runtime, no database — the whole protocol is markdown plus two small Python scripts.
- Vendor-agnostic by design; a Claude or Codex agent can join the same polis an Antigravity agent created.
- Full Antigravity integration guide: https://github.com/yehudalevy-collab/polis-protocol/blob/main/docs/antigravity.md
## Limitations
- Routing quality depends on accurate citizen capability cards and enough settled work history to learn from.
- The protocol coordinates agent work but does not replace review, tests, or explicit maintainer approval.
- Multi-agent voting and amendments can add process overhead for small, single-owner tasks.

View File

@ -0,0 +1,140 @@
---
name: runapi-cli
description: Generate AI images, videos, and music/audio from agents using the RunAPI CLI.
category: development
risk: critical
source: official
source_repo: runapi-ai/cli-skill
source_type: official
date_added: "2026-06-07"
author: runapi-ai
tags: [runapi, cli, models, automation, codex, claude, gemini]
tools: [claude, codex, gemini, cursor, antigravity]
license: "Apache-2.0"
license_source: "https://github.com/runapi-ai/cli-skill/blob/main/LICENSE"
---
# RunAPI CLI
## Overview
The `runapi` CLI is the execution layer for RunAPI model tasks. Use it when an agent needs to generate AI images, videos, or music/audio, run a one-off model job, pass a JSON request body, wait for an async task, or script RunAPI from a terminal, server, or CI job.
Source repository: [github.com/runapi-ai/cli-skill](https://github.com/runapi-ai/cli-skill) (Apache-2.0)
## When to Use This Skill
- Use when the user asks to run a RunAPI model from an agent.
- Use when the user needs to inspect RunAPI CLI auth or account status.
- Use when the user wants to pass JSON request bodies to RunAPI services.
- Use when the user wants to submit async RunAPI tasks and wait for completion.
- Use when the user wants to install the RunAPI CLI on a local machine, server, or CI runner.
## Install
### macOS / Linux
```shell
brew install runapi-ai/tap/runapi
```
### Server / CI
Download the installer, inspect it, then run it locally.
```shell
curl -fsSL https://runapi.ai/cli/install.sh -o runapi-install.sh
less runapi-install.sh
sh runapi-install.sh
```
To pin a specific version:
```shell
sh runapi-install.sh --version v0.1.0
```
The installer detects OS and architecture, verifies the SHA-256 checksum from `https://runapi.ai/cli/latest.json`, and refuses to write the binary if verification fails.
## Authentication
Treat RunAPI authentication and generation as security-sensitive: commands can call remote services, consume credits, and expose account state. Review installer scripts before running them and keep API keys in environment variables or stdin, not shell history.
Check the current state first:
```shell
runapi auth status
```
| Source | How |
|---|---|
| Environment | Read `RUNAPI_API_KEY` from the environment |
| Saved config | `printf '%s' "$RUNAPI_API_KEY" \| runapi auth import-token --token -` |
| Browser login | `runapi login` only when the user explicitly wants browser auth |
`RUNAPI_BASE_URL` overrides the default base URL.
Avoid passing secrets directly in command arguments. Prefer `RUNAPI_API_KEY` or stdin token import with `--token -`.
## Discover Services, Commands, and Fields
The CLI is JSON-first. Every service exposes typed commands, and each command documents its request fields through `--help`. Inspect command help before composing a request.
```shell
runapi --help
runapi suno --help
runapi suno text-to-music --help
```
## Run a Model
Pass the request body as JSON through `--input-file`, `--input`, or stdin. The default flow is synchronous and polls until the task completes.
```shell
runapi suno text-to-music --input-file request.json
runapi suno text-to-music --async --input-file request.json
runapi wait <task-id> --service suno --action text-to-music
runapi get <task-id> --service suno --action text-to-music
```
JSON responses go to stdout; progress lines go to stderr. Pipe to `jq` for downstream parsing.
## Account
```shell
runapi account info
runapi account balance
```
## Install the Skill Into Another Agent Runtime
```shell
runapi agent install-skill --target claude
runapi agent install-skill --target codex
runapi agent install-skill --target gemini
runapi agent install-skill --target openclaw
runapi agent list-targets
runapi agent install-skill --target-dir <path>
```
## Limitations
- RunAPI model calls require a valid RunAPI account or API key.
- Some model tasks are long-running and should use `--async` plus `runapi wait`.
- Browser login is interactive and should not be the default path for agents.
- This skill does not replace model-specific parameter validation; inspect command help before building request JSON.
## Security & Safety Notes
- Never paste API keys into example commands or PR text.
- Prefer `RUNAPI_API_KEY` or stdin token import instead of command-line secrets.
- Do not run interactive `runapi login` by default from an agent.
- Check the CLI exit code before assuming a task succeeded.
## References
- RunAPI CLI skill: https://github.com/runapi-ai/cli-skill
- RunAPI CLI repository: https://github.com/runapi-ai/cli
- RunAPI model catalog: https://runapi.ai/models.md

View File

@ -33,10 +33,11 @@ The cleanest approach is a reusable `JsonLd` component:
```jsx
// components/JsonLd.jsx
export function JsonLd({ data }) {
const json = JSON.stringify(data).replace(/</g, '\\u003c');
return (
<script
type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(data) }}
dangerouslySetInnerHTML={{ __html: json }}
/>
);
}

View File

@ -61,8 +61,10 @@ Show the proposed branch name and ask for one-word confirmation (or type alterna
- If not on main/master: check if current branch matches proposed name
- If yes: stay on it
- If no: ask to switch or create new
- Create branch: `git checkout -b <branch-name>`
- Stage changes: `git add <grouped-files>`
- Create branch only after validating the branch name, then use `git checkout -b "$branch_name"`
- Stage explicit pathspecs only: `git add -- path/to/file ...`
- If file paths are generated, keep them NUL-delimited (`git diff -z --name-only`) and pass them as pathspec arguments.
- Never concatenate untrusted filenames into a shell command and never run the placeholder text literally.
- Auto-generate commit message from changes:
- First line: `<type>: <short description>` (max 72 chars)
- Body: grouped file changes with brief descriptions

View File

@ -3,13 +3,20 @@ import re
from pathlib import Path
class UsthtSafetyError(RuntimeError):
"""Raised when a runtime path would escape .ustht/."""
def find_ustht() -> Path | None:
"""Find .ustht/ in the current directory or one of its parents."""
cwd = Path.cwd()
for d in [cwd, *cwd.parents]:
ustht = d / ".ustht"
if ustht.is_dir():
return ustht
if ustht.exists():
if ustht.is_symlink():
raise UsthtSafetyError(f"Refusing symlinked runtime directory: {ustht}")
if ustht.is_dir():
return ustht.resolve()
return None
@ -28,7 +35,7 @@ def read_define_ini(ustht: Path) -> dict:
if not ini.exists():
return {}
result = {}
for line in ini.read_text(encoding="utf-8").splitlines():
for line in safe_read_text(ustht, ini).splitlines():
line = line.strip()
if "=" in line and not line.startswith("#"):
k, v = line.split("=", 1)
@ -40,15 +47,95 @@ def write_define_ini(ustht: Path, cfg: dict):
"""Replace define.ini with the provided key/value pairs."""
ini = ustht / "define.ini"
lines = [f"{k}={v}" for k, v in cfg.items()]
ini.write_text("\n".join(lines) + "\n", encoding="utf-8")
safe_write_text(ustht, ini, "\n".join(lines) + "\n")
def is_processed(filepath: Path) -> bool:
def is_processed(filepath: Path, ustht: Path | None = None) -> bool:
"""Return true when the first raw-file line is the processed marker."""
first_line = filepath.read_text(encoding="utf-8").split("\n", 1)[0].strip()
content = safe_read_text(ustht, filepath) if ustht else filepath.read_text(encoding="utf-8")
first_line = content.split("\n", 1)[0].strip()
return first_line == "<!-- processed -->"
def ensure_runtime_path(ustht: Path, path: Path, *, must_exist: bool = False) -> Path:
"""Return a path only if its real location stays inside .ustht/."""
base = Path(ustht)
if base.is_symlink():
raise UsthtSafetyError(f"Refusing symlinked runtime directory: {base}")
base_real = base.resolve(strict=True)
target = Path(path)
if not target.is_absolute():
target = base_real / target
if target.exists() and target.is_symlink():
raise UsthtSafetyError(f"Refusing symlinked runtime path: {target}")
if must_exist and not target.exists():
raise UsthtSafetyError(f"Runtime path does not exist: {target}")
target_real = target.resolve(strict=must_exist)
try:
target_real.relative_to(base_real)
except ValueError as exc:
raise UsthtSafetyError(f"Runtime path escapes .ustht/: {target}") from exc
rel = target.relative_to(base_real)
current = base_real
for part in rel.parts:
current = current / part
if current.exists() and current.is_symlink():
raise UsthtSafetyError(f"Refusing symlinked runtime path: {current}")
return target
def ensure_runtime_dir(ustht: Path, path: Path, *, create: bool = False) -> Path:
"""Return a safe runtime directory, creating it when requested."""
directory = ensure_runtime_path(ustht, path, must_exist=False)
if create:
directory.mkdir(parents=True, exist_ok=True)
if directory.exists() and not directory.is_dir():
raise UsthtSafetyError(f"Runtime path is not a directory: {directory}")
return directory
def safe_read_text(ustht: Path | None, path: Path) -> str:
"""Read a runtime file after symlink and containment checks."""
safe_path = ensure_runtime_path(ustht, path, must_exist=True) if ustht else path
return safe_path.read_text(encoding="utf-8")
def safe_write_text(ustht: Path, path: Path, content: str):
"""Write a runtime file after symlink and containment checks."""
safe_path = ensure_runtime_path(ustht, path, must_exist=False)
ensure_runtime_dir(ustht, safe_path.parent, create=True)
safe_path.write_text(content, encoding="utf-8")
def safe_markdown_files(ustht: Path, directory: Path, *, reverse: bool = False) -> list[Path]:
"""List safe markdown files under one runtime directory."""
safe_dir = ensure_runtime_dir(ustht, directory)
if not safe_dir.exists():
return []
files = []
for file_path in safe_dir.glob("*.md"):
safe_path = ensure_runtime_path(ustht, file_path, must_exist=True)
if safe_path.is_file():
files.append(safe_path)
return sorted(files, reverse=reverse)
def safe_markdown_tree(ustht: Path, directory: Path) -> list[Path]:
"""List safe markdown files recursively under one runtime directory."""
safe_dir = ensure_runtime_dir(ustht, directory)
if not safe_dir.exists():
return []
files = []
for file_path in safe_dir.rglob("*.md"):
safe_path = ensure_runtime_path(ustht, file_path, must_exist=True)
if safe_path.is_file():
files.append(safe_path)
return sorted(files)
def validate_dim_name(dim: str) -> bool:
"""Validate a dimension path made of safe kebab-case segments."""
reserved = {"raw", "ignored", "export", "define", "readme-ai"}

View File

@ -3,7 +3,7 @@ import sys
from datetime import datetime
from pathlib import Path
from common import find_ustht
from common import ensure_runtime_dir, find_ustht, safe_markdown_files, safe_read_text, safe_write_text
HELP = """Usage: python ignore_ops.py show|remove_last|add_suffix "text" [--help]
@ -14,11 +14,11 @@ Subcommands:
"""
def find_last_raw_entry(raw_dir: Path):
def find_last_raw_entry(ustht: Path, raw_dir: Path):
"""Return (file path, line index, entry text) for the latest raw entry."""
files = sorted(raw_dir.glob("*.md"), reverse=True)
files = safe_markdown_files(ustht, raw_dir, reverse=True)
for f in files:
lines = f.read_text(encoding="utf-8").splitlines()
lines = safe_read_text(ustht, f).splitlines()
if lines and lines[0].strip() == "<!-- processed -->":
continue
for idx in range(len(lines) - 1, -1, -1):
@ -27,16 +27,16 @@ def find_last_raw_entry(raw_dir: Path):
return None, None, None
def remove_line(filepath: Path, idx: int):
def remove_line(ustht: Path, filepath: Path, idx: int):
"""Remove one line from a file."""
lines = filepath.read_text(encoding="utf-8").splitlines()
lines = safe_read_text(ustht, filepath).splitlines()
del lines[idx]
filepath.write_text("\n".join(lines) + ("\n" if lines else ""), encoding="utf-8")
safe_write_text(ustht, filepath, "\n".join(lines) + ("\n" if lines else ""))
def append_to_ignored(ignored_dir: Path, text: str, reason: str):
def append_to_ignored(ustht: Path, ignored_dir: Path, text: str, reason: str):
"""Append one ignored entry to today's ignored file."""
ignored_dir.mkdir(exist_ok=True)
ignored_dir = ensure_runtime_dir(ustht, ignored_dir, create=True)
today = datetime.now().strftime("%Y-%m-%d")
now = datetime.now().strftime("%H:%M")
f = ignored_dir / f"{today}.md"
@ -45,23 +45,23 @@ def append_to_ignored(ignored_dir: Path, text: str, reason: str):
clean = clean.rsplit(" | suggested-dim:", 1)[0]
entry = f"- [{now}] {clean} ({reason})"
if f.exists():
content = f.read_text(encoding="utf-8").rstrip()
f.write_text(f"{content}\n{entry}\n", encoding="utf-8")
content = safe_read_text(ustht, f).rstrip()
safe_write_text(ustht, f, f"{content}\n{entry}\n")
else:
f.write_text(f"{entry}\n", encoding="utf-8")
safe_write_text(ustht, f, f"{entry}\n")
def show_ignored(ignored_dir: Path):
def show_ignored(ustht: Path, ignored_dir: Path):
"""Print all ignored entries."""
if not ignored_dir.exists():
print("No ignored entries.")
return
files = sorted(ignored_dir.glob("*.md"), reverse=True)
files = safe_markdown_files(ustht, ignored_dir, reverse=True)
if not files:
print("No ignored entries.")
return
for f in files:
entries = [line for line in f.read_text(encoding="utf-8").splitlines() if line.strip().startswith("- [")]
entries = [line for line in safe_read_text(ustht, f).splitlines() if line.strip().startswith("- [")]
if entries:
print(f"#{f.name} ({len(entries)} entries):")
for entry in entries:
@ -73,12 +73,12 @@ def remove_last(ustht: Path):
if not raw_dir.exists():
print("No previous thought to ignore.")
return
filepath, idx, entry = find_last_raw_entry(raw_dir)
filepath, idx, entry = find_last_raw_entry(ustht, raw_dir)
if filepath is None:
print("No previous thought to ignore.")
return
remove_line(filepath, idx)
append_to_ignored(ustht / "ignored", entry, "ignored with --last")
remove_line(ustht, filepath, idx)
append_to_ignored(ustht, ustht / "ignored", entry, "ignored with --last")
display = entry
if "] " in display:
display = display.split("] ", 1)[1]
@ -88,7 +88,7 @@ def remove_last(ustht: Path):
def add_suffix(ustht: Path, text: str):
append_to_ignored(ustht / "ignored", text, "ignored by suffix")
append_to_ignored(ustht, ustht / "ignored", text, "ignored by suffix")
print("Ignored current message.")
@ -108,7 +108,7 @@ def main():
cmd = sys.argv[1]
if cmd == "show":
show_ignored(ustht / "ignored")
show_ignored(ustht, ustht / "ignored")
elif cmd == "remove_last":
remove_last(ustht)
elif cmd == "add_suffix":

View File

@ -3,7 +3,7 @@ import shutil
import sys
from pathlib import Path
from common import find_skill_dir
from common import UsthtSafetyError, find_skill_dir
HELP = """Usage: python init.py [--help]
@ -34,6 +34,8 @@ def main():
target = Path.cwd() / ".ustht"
if target.exists():
if target.is_symlink():
raise UsthtSafetyError(f"Refusing symlinked runtime directory: {target}")
print("Already initialized; .ustht/ exists, skipping creation.")
sys.exit(0)

View File

@ -2,7 +2,7 @@
import sys
from pathlib import Path
from common import find_ustht, validate_dim_name
from common import find_ustht, safe_markdown_tree, safe_read_text, validate_dim_name
HELP = """Usage: python show_mdbase.py show [--all|--dimension] [--help]
@ -18,14 +18,14 @@ def show_index(mdbase: Path):
if not index.exists():
print("mdbase/README.ai.md does not exist.")
return
print(index.read_text(encoding="utf-8"))
print(safe_read_text(mdbase.parent, index))
def list_dims(mdbase: Path):
details = mdbase / "details"
if not details.exists():
return []
return sorted(p.relative_to(details).with_suffix("").as_posix() for p in details.rglob("*.md"))
return sorted(p.relative_to(details).with_suffix("").as_posix() for p in safe_markdown_tree(mdbase.parent, details))
def show_dim(mdbase: Path, dim: str):
@ -39,7 +39,7 @@ def show_dim(mdbase: Path, dim: str):
if not path.exists():
print(f"mdbase/details/{dim}.md does not exist yet.")
return
print(path.read_text(encoding="utf-8"))
print(safe_read_text(mdbase.parent, path))
def show_all(mdbase: Path):
@ -54,7 +54,7 @@ def show_all(mdbase: Path):
print(f"mdbase has {len(dims)} dimensions:")
for dim in dims:
path = details / f"{dim}.md"
lines = [line for line in path.read_text(encoding="utf-8").splitlines() if line.strip().startswith("- ")]
lines = [line for line in safe_read_text(mdbase.parent, path).splitlines() if line.strip().startswith("- ")]
print(f" {dim}.md: {len(lines)} entries")

View File

@ -2,7 +2,7 @@
import sys
from pathlib import Path
from common import find_ustht, is_processed
from common import find_ustht, is_processed, safe_markdown_files, safe_read_text
HELP = """Usage: python show_raw.py [--help]
@ -25,13 +25,13 @@ def main():
print("No unprocessed records.")
return
files = [f for f in sorted(raw_dir.glob("*.md"), reverse=True) if not is_processed(f)]
files = [f for f in safe_markdown_files(ustht, raw_dir, reverse=True) if not is_processed(f, ustht)]
if not files:
print("No unprocessed records. All raw files are marked processed.")
return
for f in files:
content = f.read_text(encoding="utf-8").strip()
content = safe_read_text(ustht, f).strip()
entry_count = sum(1 for line in content.splitlines() if line.strip().startswith("- ["))
print(f"#{f.name} ({entry_count} unprocessed entries):")
print(content)

View File

@ -5,7 +5,18 @@ from collections import defaultdict
from datetime import datetime
from pathlib import Path
from common import find_ustht, read_define_ini, write_define_ini, is_processed, validate_dim_name
from common import (
ensure_runtime_dir,
safe_markdown_files,
safe_markdown_tree,
safe_read_text,
safe_write_text,
find_ustht,
read_define_ini,
write_define_ini,
is_processed,
validate_dim_name,
)
HELP = """Usage: python sortin.py [--dry] [--help]
@ -18,7 +29,7 @@ Options:
"""
def parse_raw_file(filepath: Path):
def parse_raw_file(ustht: Path, filepath: Path):
"""Parse raw entries from one file."""
entries = []
date = filepath.stem.split("-", 3)
@ -27,7 +38,7 @@ def parse_raw_file(filepath: Path):
else:
date = datetime.now().strftime("%Y-%m-%d")
for line in filepath.read_text(encoding="utf-8").splitlines():
for line in safe_read_text(ustht, filepath).splitlines():
line = line.strip()
match = re.match(r"^- \[(\d{2}:\d{2})\] (.*)$", line)
if not match:
@ -51,31 +62,31 @@ def dim_path(mdbase: Path, dim: str) -> Path:
return mdbase / "details" / f"{dim}.md"
def count_entries(path: Path) -> int:
def count_entries(ustht: Path, path: Path) -> int:
if not path.exists():
return 0
return sum(1 for line in path.read_text(encoding="utf-8").splitlines() if line.strip().startswith("- "))
return sum(1 for line in safe_read_text(ustht, path).splitlines() if line.strip().startswith("- "))
def append_entries(path: Path, entries):
def append_entries(ustht: Path, path: Path, entries):
"""Append entries grouped by date to one dimension file."""
by_date = defaultdict(list)
for entry in entries:
by_date[entry["date"]].append(entry)
path.parent.mkdir(parents=True, exist_ok=True)
ensure_runtime_dir(ustht, path.parent, create=True)
if not path.exists():
title = path.stem.replace("-", " ").title()
path.write_text(f"# {title}\n\n> Project memory for `{path.stem}`.\n\n", encoding="utf-8")
safe_write_text(ustht, path, f"# {title}\n\n> Project memory for `{path.stem}`.\n\n")
content = path.read_text(encoding="utf-8").rstrip()
content = safe_read_text(ustht, path).rstrip()
for date, date_entries in sorted(by_date.items()):
lines = [f"- {entry['text']}" for entry in date_entries]
block = "\n".join(lines)
heading = f"## {date}"
if heading in content:
content_lines = content.splitlines()
heading_idx = next(i for i, line in enumerate(content_lines) if line.strip() == heading)
content_lines = content.splitlines()
heading_idx = next((i for i, line in enumerate(content_lines) if line.strip() == heading), None)
if heading_idx is not None:
insert_idx = len(content_lines)
for i in range(heading_idx + 1, len(content_lines)):
if content_lines[i].startswith("## "):
@ -92,31 +103,31 @@ def append_entries(path: Path, entries):
content = "\n".join(before).rstrip()
else:
content = f"{content}\n\n{heading}\n\n{block}".rstrip()
path.write_text(content + "\n", encoding="utf-8")
safe_write_text(ustht, path, content + "\n")
def mark_processed(filepath: Path):
def mark_processed(ustht: Path, filepath: Path):
"""Insert the processed marker at the top of a raw file."""
content = filepath.read_text(encoding="utf-8")
content = safe_read_text(ustht, filepath)
if content.split("\n", 1)[0].strip() != "<!-- processed -->":
filepath.write_text("<!-- processed -->\n" + content, encoding="utf-8")
safe_write_text(ustht, filepath, "<!-- processed -->\n" + content)
def update_index(mdbase: Path):
def update_index(ustht: Path, mdbase: Path):
"""Rebuild mdbase/README.ai.md with dimension counts."""
now = datetime.now().strftime("%Y-%m-%d %H:%M")
details = mdbase / "details"
dims = []
if details.exists():
dims = sorted(p.relative_to(details).with_suffix("").as_posix() for p in details.rglob("*.md"))
dims = sorted(p.relative_to(details).with_suffix("").as_posix() for p in safe_markdown_tree(ustht, details))
rows = ["| File | Dimension | Entries |", "|------|-----------|---------|"]
backlog = mdbase / "backlog.md"
if backlog.exists():
rows.append(f"| [backlog.md](backlog.md) | backlog | {count_entries(backlog)} |")
rows.append(f"| [backlog.md](backlog.md) | backlog | {count_entries(ustht, backlog)} |")
for dim in dims:
path = details / f"{dim}.md"
rows.append(f"| [details/{dim}.md](details/{dim}.md) | {dim} | {count_entries(path)} |")
rows.append(f"| [details/{dim}.md](details/{dim}.md) | {dim} | {count_entries(ustht, path)} |")
content = "\n".join([
"# user-thoughts mdbase Index",
@ -137,7 +148,7 @@ def update_index(mdbase: Path):
*rows,
"",
])
(mdbase / "README.ai.md").write_text(content, encoding="utf-8")
safe_write_text(ustht, mdbase / "README.ai.md", content)
def main():
@ -161,7 +172,7 @@ def main():
print("No unprocessed records.")
return
raw_files = [f for f in sorted(raw_dir.glob("*.md")) if not is_processed(f)]
raw_files = [f for f in safe_markdown_files(ustht, raw_dir) if not is_processed(f, ustht)]
if not raw_files:
print("No unprocessed records. All raw files are marked processed.")
return
@ -169,7 +180,7 @@ def main():
all_entries = []
entries_by_file = {}
for f in raw_files:
entries = parse_raw_file(f)
entries = parse_raw_file(ustht, f)
entries_by_file[f] = entries
all_entries.extend(entries)
@ -194,16 +205,16 @@ def main():
return
for dim, entries in grouped.items():
append_entries(dim_path(mdbase, dim), entries)
append_entries(ustht, dim_path(mdbase, dim), entries)
for f in raw_files:
if entries_by_file.get(f):
mark_processed(f)
mark_processed(ustht, f)
now = datetime.now().strftime("%Y-%m-%d %H:%M")
cfg["LAST_SORTIN"] = now
write_define_ini(ustht, cfg)
update_index(mdbase)
update_index(ustht, mdbase)
print(f" LAST_SORTIN updated to {now}")

View File

@ -2,7 +2,7 @@
import sys
from pathlib import Path
from common import find_ustht, read_define_ini, is_processed
from common import find_ustht, read_define_ini, is_processed, safe_markdown_files, safe_markdown_tree
HELP = """Usage: python status.py [--help]
@ -11,21 +11,21 @@ dimension counts.
"""
def count_raw(raw_dir: Path):
def count_raw(ustht: Path, raw_dir: Path):
"""Return total and unprocessed raw file counts."""
if not raw_dir.exists():
return 0, 0
files = list(raw_dir.glob("*.md"))
unprocessed = sum(1 for f in files if not is_processed(f))
files = safe_markdown_files(ustht, raw_dir)
unprocessed = sum(1 for f in files if not is_processed(f, ustht))
return len(files), unprocessed
def count_dims(mdbase: Path):
def count_dims(ustht: Path, mdbase: Path):
"""Count dimension files under mdbase/details/."""
details = mdbase / "details"
if not details.exists():
return 0
return len(list(details.rglob("*.md")))
return len(safe_markdown_tree(ustht, details))
def main():
@ -42,8 +42,8 @@ def main():
skill_status = cfg.get("SKILL_STATUS", "unknown")
instant_status = cfg.get("INSTANT_STATUS", "unknown")
last_sortin = cfg.get("LAST_SORTIN", "never") or "never"
total_raw, unprocessed_raw = count_raw(ustht / "raw")
dims = count_dims(ustht / "mdbase")
total_raw, unprocessed_raw = count_raw(ustht, ustht / "raw")
dims = count_dims(ustht, ustht / "mdbase")
print(f"SKILL_STATUS={skill_status}")
print(f"INSTANT_STATUS={instant_status}")

View File

@ -3,7 +3,15 @@ import sys
from datetime import datetime
from pathlib import Path
from common import find_ustht, read_define_ini, validate_dim_name
from common import (
ensure_runtime_dir,
safe_markdown_files,
safe_read_text,
safe_write_text,
find_ustht,
read_define_ini,
validate_dim_name,
)
HELP = """Usage: python write_raw.py "thought text" [--dim dimension] [--help]
@ -21,12 +29,14 @@ Behavior:
"""
def count_today_raw(raw_dir: Path) -> int:
def count_today_raw(ustht: Path, raw_dir: Path) -> int:
"""Count unprocessed entries across today's raw files."""
today = datetime.now().strftime("%Y-%m-%d")
count = 0
for f in sorted(raw_dir.glob(f"{today}*.md")):
content = f.read_text(encoding="utf-8")
for f in safe_markdown_files(ustht, raw_dir):
if not f.name.startswith(today):
continue
content = safe_read_text(ustht, f)
first_line = content.split("\n", 1)[0].strip()
if first_line == "<!-- processed -->":
continue
@ -72,15 +82,14 @@ def main():
print(f"Invalid dimension name: {dim}. Use lowercase letters, digits, hyphens, and optional / subdirectories.")
sys.exit(1)
raw_dir = ustht / "raw"
raw_dir.mkdir(exist_ok=True)
raw_dir = ensure_runtime_dir(ustht, ustht / "raw", create=True)
today = datetime.now().strftime("%Y-%m-%d")
now = datetime.now().strftime("%H:%M")
raw_file = raw_dir / f"{today}.md"
if raw_file.exists():
first_line = raw_file.read_text(encoding="utf-8").split("\n", 1)[0].strip()
first_line = safe_read_text(ustht, raw_file).split("\n", 1)[0].strip()
if first_line == "<!-- processed -->":
seq = 2
while (raw_dir / f"{today}-{seq}.md").exists():
@ -92,12 +101,12 @@ def main():
entry = f"- [{now}] {thought_clean}{suffix}"
if raw_file.exists():
content = raw_file.read_text(encoding="utf-8").rstrip()
raw_file.write_text(f"{content}\n{entry}\n", encoding="utf-8")
content = safe_read_text(ustht, raw_file).rstrip()
safe_write_text(ustht, raw_file, f"{content}\n{entry}\n")
else:
raw_file.write_text(f"{entry}\n", encoding="utf-8")
safe_write_text(ustht, raw_file, f"{entry}\n")
count = count_today_raw(raw_dir)
count = count_today_raw(ustht, raw_dir)
if count > 5:
print(f"Today has {count} recorded thoughts. Consider running /ustht sortin.")

View File

@ -20,21 +20,22 @@ Before running any Vercel CLI commands, identify where the token is coming from.
### A) `VERCEL_TOKEN` is already set in the environment
```bash
printenv VERCEL_TOKEN
[ -n "${VERCEL_TOKEN:-}" ] && printf 'VERCEL_TOKEN is set\n'
```
If this returns a value, you're ready. Skip to Step 2.
If this reports a configured token, you're ready. Skip to Step 2.
### B) Token is in a `.env` file under `VERCEL_TOKEN`
```bash
grep '^VERCEL_TOKEN=' .env 2>/dev/null
grep -q '^VERCEL_TOKEN=' .env 2>/dev/null && printf 'VERCEL_TOKEN is present in .env\n'
```
If found, export it:
```bash
export VERCEL_TOKEN=$(grep '^VERCEL_TOKEN=' .env | cut -d= -f2-)
VERCEL_TOKEN="$(sed -n 's/^VERCEL_TOKEN=//p' .env | tail -n 1)"
export VERCEL_TOKEN
```
### C) Token is in a `.env` file under a different name
@ -42,13 +43,15 @@ export VERCEL_TOKEN=$(grep '^VERCEL_TOKEN=' .env | cut -d= -f2-)
Look for any variable that looks like a Vercel token (Vercel tokens typically start with `vca_`):
```bash
grep -i 'vercel' .env 2>/dev/null
grep -Eio '^[A-Z0-9_]*VERCEL[A-Z0-9_]*(?==)' .env 2>/dev/null
```
Inspect the output to identify which variable holds the token, then export it as `VERCEL_TOKEN`:
```bash
export VERCEL_TOKEN=$(grep '^<VARIABLE_NAME>=' .env | cut -d= -f2-)
vercel_var="<VARIABLE_NAME>"
VERCEL_TOKEN="$(sed -n "s/^${vercel_var}=//p" .env | tail -n 1)"
export VERCEL_TOKEN
```
### D) No token found — ask the user
@ -64,7 +67,7 @@ If none of the above yield a token, ask the user to provide one. They can create
vercel deploy --token "vca_abc123"
# Good — CLI reads VERCEL_TOKEN from the environment
export VERCEL_TOKEN="vca_abc123"
[ -n "${VERCEL_TOKEN:-}" ] || { echo "Set VERCEL_TOKEN first" >&2; exit 1; }
vercel deploy
```
@ -74,11 +77,11 @@ Similarly, check for the project ID and team scope. These let the CLI target the
```bash
# Check environment
printenv VERCEL_PROJECT_ID
printenv VERCEL_ORG_ID
[ -n "${VERCEL_PROJECT_ID:-}" ] && printf 'VERCEL_PROJECT_ID is set\n'
[ -n "${VERCEL_ORG_ID:-}" ] && printf 'VERCEL_ORG_ID is set\n'
# Or check .env
grep -i 'vercel' .env 2>/dev/null
grep -Eio '^[A-Z0-9_]*VERCEL[A-Z0-9_]*(?==)' .env 2>/dev/null
```
**If you have a project URL** (e.g. `https://vercel.com/my-team/my-project`), extract the team slug:
@ -317,8 +320,8 @@ Full details: https://vercel.com/docs/plans/pro-plan
Check the environment and any `.env` files present:
```bash
printenv | grep -i vercel
grep -i vercel .env 2>/dev/null
env | grep -Eio '^[A-Z0-9_]*VERCEL[A-Z0-9_]*(?==)'
grep -Eio '^[A-Z0-9_]*VERCEL[A-Z0-9_]*(?==)' .env 2>/dev/null
```
### Authentication error

View File

@ -0,0 +1,103 @@
---
name: video-content-extractor
description: "Extract key frames from MP4 videos at configurable intervals, run Tesseract OCR, and generate structured Markdown reports with video metadata and timestamped text transcripts."
category: media-processing
risk: safe
source: community
source_repo: 274326424/video-content-extractor
source_type: community
date_added: "2026-06-06"
author: 274326424
tags: [video, ocr, ffmpeg, tesseract, frame-extraction, media]
tools: [codex]
---
# Video Content Extractor
## Overview
Automatically extracts key frames from MP4 video files at configurable time intervals, performs OCR text recognition on each frame, and generates a structured Markdown report. The report includes video metadata (duration, resolution, codecs) and frame-by-frame OCR transcripts with timestamp references.
This skill is designed for Codex CLI and requires FFmpeg and Tesseract OCR installed on the local machine.
## When to Use This Skill
- Use when you need to extract text content from video presentations, lectures, or screencasts.
- Use when you want to create searchable transcripts from video files without embedded subtitles.
- Use when you need to analyze video content programmatically and generate structured summaries.
- Use when the user asks to "read what is on screen" or "extract the content from this video."
## How It Works
### Step 1: Analyze Video Metadata
The skill uses ffprobe to extract video metadata: duration, resolution, frame rate, codec information, and file size.
### Step 2: Extract Key Frames
Using FFmpeg, the skill captures frames at the configured interval (default: every 30 seconds). Each frame is saved as a timestamped JPEG image.
### Step 3: OCR Text Recognition
Each extracted frame is processed by Tesseract OCR. If the default PSM mode returns no meaningful text, it falls back to fully automatic page segmentation.
### Step 4: Generate Markdown Report
All extracted data is assembled into a structured Markdown document.
## Examples
### Example 1: Basic Extraction
Agent prompt:
Use the video-content-extractor skill to extract content from lecture.mp4
Output generates lecture.md and lecture_frames/ directory.
### Example 2: Custom Interval
Parameters: video_path, output_dir, interval(seconds), lang
Extract every 60 seconds with English-only OCR:
python scripts/extract_video.py recording.mp4 ./output 60 eng
### Example 3: Bilingual Content
Extract with default Chinese + English OCR:
python scripts/extract_video.py lecture.mp4 . 15 chi_sim+eng
## Best Practices
- Use shorter intervals (10-15s) for fast-paced content with frequent text changes.
- Use longer intervals (30-60s) for presentation slides or slow lectures to reduce duplicate frames.
- For Chinese content, ensure Tesseract Chinese language pack is installed (chi_sim).
## Limitations
- Requires FFmpeg and Tesseract OCR to be installed and accessible via PATH.
- Tesseract OCR accuracy depends on video quality, text size, and font clarity.
- Does not extract audio or perform speech-to-text transcription.
- Frame extraction is time-based (not scene-change-based), which may produce near-duplicate frames.
- Large videos with short intervals can generate many frames - ensure sufficient disk space.
## Security and Safety Notes
- This skill only reads video files and writes extracted frames and Markdown reports.
- It does NOT send any data over the network - all processing is local.
- FFmpeg and Tesseract are invoked with fixed, pre-vetted arguments.
- The skill does not modify or delete the original video file.
## Common Pitfalls
- Problem: Tesseract returns garbled text
Solution: Ensure the correct language pack is installed. Run tesseract --list-langs to verify.
- Problem: FFmpeg fails with "not found"
Solution: Make sure FFmpeg is on PATH. Run ffmpeg -version to verify.
- Problem: OCR is slow on large videos
Solution: Increase the interval parameter to reduce frames processed.
## Related Skills
- @media-summarizer - For summarizing video content using visual and audio cues.
- @document-ocr - For OCR on static images or scanned documents without video processing.

View File

@ -1,6 +1,6 @@
{
"name": "antigravity-bundle-aas-agent-mcp-builder",
"version": "12.1.0",
"version": "12.2.1",
"description": "Editorial \"AAS Agent & MCP Builder\" bundle for Claude Code from Antigravity Awesome Skills.",
"author": {
"name": "sickn33 and contributors",

View File

@ -1,6 +1,6 @@
{
"name": "agyb-aas-agent-mcp-builder",
"version": "12.1.0",
"version": "12.2.1",
"description": "Install the \"AAS Agent & MCP Builder\" editorial skill bundle from Antigravity Awesome Skills.",
"author": {
"name": "sickn33 and contributors",

View File

@ -1,6 +1,6 @@
{
"name": "antigravity-bundle-aas-automation-builder",
"version": "12.1.0",
"version": "12.2.1",
"description": "Editorial \"AAS Automation Builder\" bundle for Claude Code from Antigravity Awesome Skills.",
"author": {
"name": "sickn33 and contributors",

View File

@ -1,6 +1,6 @@
{
"name": "agyb-aas-automation-builder",
"version": "12.1.0",
"version": "12.2.1",
"description": "Install the \"AAS Automation Builder\" editorial skill bundle from Antigravity Awesome Skills.",
"author": {
"name": "sickn33 and contributors",

View File

@ -1,6 +1,6 @@
{
"name": "antigravity-bundle-aas-data-analytics",
"version": "12.1.0",
"version": "12.2.1",
"description": "Editorial \"AAS Data Analytics\" bundle for Claude Code from Antigravity Awesome Skills.",
"author": {
"name": "sickn33 and contributors",

View File

@ -1,6 +1,6 @@
{
"name": "agyb-aas-data-analytics",
"version": "12.1.0",
"version": "12.2.1",
"description": "Install the \"AAS Data Analytics\" editorial skill bundle from Antigravity Awesome Skills.",
"author": {
"name": "sickn33 and contributors",

View File

@ -1,6 +1,6 @@
{
"name": "antigravity-bundle-aas-devops-cloud",
"version": "12.1.0",
"version": "12.2.1",
"description": "Editorial \"AAS DevOps & Cloud\" bundle for Claude Code from Antigravity Awesome Skills.",
"author": {
"name": "sickn33 and contributors",

View File

@ -1,6 +1,6 @@
{
"name": "agyb-aas-devops-cloud",
"version": "12.1.0",
"version": "12.2.1",
"description": "Install the \"AAS DevOps & Cloud\" editorial skill bundle from Antigravity Awesome Skills.",
"author": {
"name": "sickn33 and contributors",

View File

@ -1,6 +1,6 @@
{
"name": "antigravity-bundle-aas-documents-presentations",
"version": "12.1.0",
"version": "12.2.1",
"description": "Editorial \"AAS Documents & Presentations\" bundle for Claude Code from Antigravity Awesome Skills.",
"author": {
"name": "sickn33 and contributors",

View File

@ -1,6 +1,6 @@
{
"name": "agyb-aas-documents-presentations",
"version": "12.1.0",
"version": "12.2.1",
"description": "Install the \"AAS Documents & Presentations\" editorial skill bundle from Antigravity Awesome Skills.",
"author": {
"name": "sickn33 and contributors",

Some files were not shown because too many files have changed in this diff Show More