📦 deps(thirdparty): update snapshots
This commit is contained in:
parent
772a1da63c
commit
ac39ab52f3
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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 |
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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 -->
|
||||
[](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)
|
||||
|
||||
[](https://github.com/sickn33/antigravity-awesome-skills/stargazers)
|
||||
[](https://x.com/AASkills_)
|
||||
|
|
@ -27,13 +27,13 @@ The canonical project page is the GitHub repository at <https://github.com/sickn
|
|||
[](https://github.com/opencode-ai/opencode)
|
||||
[](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.
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -1 +0,0 @@
|
|||
google-site-verification: google5815fd8827d2319c.html
|
||||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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 |
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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?',
|
||||
|
|
|
|||
|
|
@ -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',
|
||||
|
|
|
|||
|
|
@ -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"},
|
||||
|
|
|
|||
|
|
@ -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 });
|
||||
}
|
||||
});
|
||||
});
|
||||
|
|
|
|||
|
|
@ -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'],
|
||||
},
|
||||
];
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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?',
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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. |
|
||||
|
|
|
|||
|
|
@ -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_
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.**
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
||||
|
|
|
|||
|
|
@ -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) │
|
||||
└─────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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 |
|
||||
|
|
|
|||
|
|
@ -0,0 +1 @@
|
|||
requests>=2.31.0
|
||||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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>"]
|
||||
|
|
|
|||
|
|
@ -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**: 3–5 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
|
||||
- 40–60% 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 40–60% of canvas, 35%+ empty space |
|
||||
| Annotations | Handwritten English, 2–5 words each, max 5–8 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)
|
||||
|
|
@ -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 0–100 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 (3–8 years). Let me know if this should be different."
|
||||
|
||||
| Level | Years | CV emphasis |
|
||||
|-------|-------|-------------|
|
||||
| Student / fresh graduate | 0–1 | Education first; projects; extracurriculars; 1 page |
|
||||
| Junior / entry | 1–3 | Skills + education prominent; 1 page |
|
||||
| Mid-level | 3–8 | Experience leads; achievements over duties; 1–2 pages |
|
||||
| Senior | 8–15 | Leadership, scope, impact, mentoring; 2 pages |
|
||||
| Executive / C-suite | 15+ | Strategic narrative; board roles; P&L; 2–3 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 → 2–4 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 2–3 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")
|
||||
- 3–6 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 3–12 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 3–5 sentences (executive: 5–7) 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 30–40% 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:
|
||||
- 3–6 bullets per role (2–3 for short-tenure or early roles)
|
||||
- Past tense for completed roles; present tense for current role
|
||||
- 15–30 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, 12–14pt 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 10–20 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: 2–4 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
|
||||
[3–5 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] — [YYYY–YYYY]
|
||||
- [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 ---
|
||||
[3–5 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 0–100)
|
||||
|
||||
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 (3–7, 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 2–3 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, 250–350 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 | 1–2 pages | No | No | No | "Available on request" |
|
||||
| Canada | 1–2 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 | 2–3 pages | No | No | No | "Available on request" |
|
||||
| Germany / Austria / Switzerland | 2–3 pages | Yes (expected) | Yes | Sometimes | Listed or on request |
|
||||
| France | 1–2 pages | Optional | No (illegal to require) | No | On request |
|
||||
| Netherlands / Scandinavia | 1–2 pages | Optional | No | No | On request |
|
||||
| Japan | 1–2 pages (rirekisho) | Yes | Yes | Yes | Listed |
|
||||
| South Korea | 1–2 pages | Yes | Yes | Yes | Listed |
|
||||
| China | 1–2 pages | Yes | Yes | Yes | Listed |
|
||||
| India | 2–3 pages | Optional | Yes (common) | Sometimes | Listed |
|
||||
| Nepal | 2–3 pages | Yes (common) | Yes | Sometimes | Listed |
|
||||
| Bangladesh / Sri Lanka | 2–3 pages | Yes (common) | Yes | Sometimes | Listed |
|
||||
| UAE / Gulf (GCC) | 2–3 pages | Yes (common) | Yes | Yes (sometimes) | Listed |
|
||||
| Nigeria / East Africa | 2–3 pages | Yes (common) | Yes | Sometimes | Listed |
|
||||
| South Africa | 3–5 pages | Optional | Yes (common) | No | Listed |
|
||||
| Brazil | 1–2 pages | Optional | Yes (common) | No | On request |
|
||||
| Academic (global) | No limit | Varies | Varies | No | Full list required |
|
||||
| Executive / board (global) | 2–3 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 (Q1–Q20, 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 7–8) |
|
||||
|<-------------------+
|
||||
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)
|
||||
```
|
||||
|
|
@ -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 |
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
@ -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
|
||||
|
|
@ -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 }}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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"}
|
||||
|
|
|
|||
|
|
@ -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":
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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}")
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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}")
|
||||
|
|
|
|||
|
|
@ -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.")
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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 |
|
||||
|
|
|
|||
|
|
@ -0,0 +1 @@
|
|||
requests>=2.31.0
|
||||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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>"]
|
||||
|
|
|
|||
|
|
@ -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**: 3–5 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
|
||||
- 40–60% 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 40–60% of canvas, 35%+ empty space |
|
||||
| Annotations | Handwritten English, 2–5 words each, max 5–8 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)
|
||||
|
|
@ -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 0–100 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 (3–8 years). Let me know if this should be different."
|
||||
|
||||
| Level | Years | CV emphasis |
|
||||
|-------|-------|-------------|
|
||||
| Student / fresh graduate | 0–1 | Education first; projects; extracurriculars; 1 page |
|
||||
| Junior / entry | 1–3 | Skills + education prominent; 1 page |
|
||||
| Mid-level | 3–8 | Experience leads; achievements over duties; 1–2 pages |
|
||||
| Senior | 8–15 | Leadership, scope, impact, mentoring; 2 pages |
|
||||
| Executive / C-suite | 15+ | Strategic narrative; board roles; P&L; 2–3 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 → 2–4 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 2–3 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")
|
||||
- 3–6 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 3–12 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 3–5 sentences (executive: 5–7) 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 30–40% 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:
|
||||
- 3–6 bullets per role (2–3 for short-tenure or early roles)
|
||||
- Past tense for completed roles; present tense for current role
|
||||
- 15–30 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, 12–14pt 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 10–20 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: 2–4 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
|
||||
[3–5 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] — [YYYY–YYYY]
|
||||
- [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 ---
|
||||
[3–5 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 0–100)
|
||||
|
||||
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 (3–7, 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 2–3 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, 250–350 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 | 1–2 pages | No | No | No | "Available on request" |
|
||||
| Canada | 1–2 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 | 2–3 pages | No | No | No | "Available on request" |
|
||||
| Germany / Austria / Switzerland | 2–3 pages | Yes (expected) | Yes | Sometimes | Listed or on request |
|
||||
| France | 1–2 pages | Optional | No (illegal to require) | No | On request |
|
||||
| Netherlands / Scandinavia | 1–2 pages | Optional | No | No | On request |
|
||||
| Japan | 1–2 pages (rirekisho) | Yes | Yes | Yes | Listed |
|
||||
| South Korea | 1–2 pages | Yes | Yes | Yes | Listed |
|
||||
| China | 1–2 pages | Yes | Yes | Yes | Listed |
|
||||
| India | 2–3 pages | Optional | Yes (common) | Sometimes | Listed |
|
||||
| Nepal | 2–3 pages | Yes (common) | Yes | Sometimes | Listed |
|
||||
| Bangladesh / Sri Lanka | 2–3 pages | Yes (common) | Yes | Sometimes | Listed |
|
||||
| UAE / Gulf (GCC) | 2–3 pages | Yes (common) | Yes | Yes (sometimes) | Listed |
|
||||
| Nigeria / East Africa | 2–3 pages | Yes (common) | Yes | Sometimes | Listed |
|
||||
| South Africa | 3–5 pages | Optional | Yes (common) | No | Listed |
|
||||
| Brazil | 1–2 pages | Optional | Yes (common) | No | On request |
|
||||
| Academic (global) | No limit | Varies | Varies | No | Full list required |
|
||||
| Executive / board (global) | 2–3 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 (Q1–Q20, 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 7–8) |
|
||||
|<-------------------+
|
||||
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)
|
||||
```
|
||||
|
|
@ -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 |
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
@ -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
|
||||
|
|
@ -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 }}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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"}
|
||||
|
|
|
|||
|
|
@ -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":
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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}")
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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}")
|
||||
|
|
|
|||
|
|
@ -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.")
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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
Loading…
Reference in New Issue