opencode-skills-collection 3.0.11 → 3.0.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "updatedAt": "2026-05-11T01:55:48.568Z",
3
+ "updatedAt": "2026-05-12T01:51:45.217Z",
4
4
  "entries": [
5
5
  "00-andruia-consultant",
6
6
  "007",
@@ -35,6 +35,7 @@
35
35
  "agentphone",
36
36
  "agents-md",
37
37
  "agents-v2-py",
38
+ "agenttrace-session-audit",
38
39
  "ai-agent-development",
39
40
  "ai-agents-architect",
40
41
  "ai-analyzer",
@@ -501,6 +502,7 @@
501
502
  "e2e-testing",
502
503
  "e2e-testing-patterns",
503
504
  "earllm-build",
505
+ "ejentum-reasoning-harness",
504
506
  "electron-development",
505
507
  "elixir-pro",
506
508
  "elon-musk",
@@ -723,6 +725,7 @@
723
725
  "indexing-issue-auditor",
724
726
  "industrial-brutalist-ui",
725
727
  "infinite-gratitude",
728
+ "ingest-youtube",
726
729
  "inngest",
727
730
  "instagram",
728
731
  "instagram-automation",
@@ -0,0 +1,158 @@
1
+ ---
2
+ name: agenttrace-session-audit
3
+ description: "Audit local AI coding-agent sessions with agenttrace for cost, tool failures, latency, anomalies, health, diffs, and CI gates."
4
+ category: development
5
+ risk: safe
6
+ source: community
7
+ source_repo: luoyuctl/agenttrace
8
+ source_type: community
9
+ date_added: "2026-05-10"
10
+ author: luoyuctl
11
+ tags: [ai-coding, observability, cost-tracking, session-analysis]
12
+ tools: [claude, cursor, gemini, codex-cli]
13
+ license: "MIT"
14
+ license_source: "https://github.com/luoyuctl/agenttrace/blob/master/LICENSE"
15
+ ---
16
+
17
+ # agenttrace Session Audit
18
+
19
+ ## Overview
20
+
21
+ Use this skill to inspect local AI coding-agent sessions with
22
+ [agenttrace](https://github.com/luoyuctl/agenttrace). It focuses on the process
23
+ behind a run: token and cost spikes, tool failures, retry loops, latency gaps,
24
+ anomalies, health scores, and session-to-session diffs.
25
+
26
+ agenttrace is local-first and reads session logs from tools such as Claude Code,
27
+ Codex CLI, Gemini CLI, Aider, Cursor exports, OpenCode, Qwen Code, Kimi, and
28
+ generic JSON or JSONL traces.
29
+
30
+ ## When to Use This Skill
31
+
32
+ - Use when a user asks why an AI coding run was slow, expensive, shallow, or unreliable.
33
+ - Use when reviewing local agent logs before retrying a failed or suspicious task.
34
+ - Use when building a lightweight CI health gate for AI-assisted coding sessions.
35
+ - Use when comparing two attempts and looking for changed tool paths, retries, or cost patterns.
36
+
37
+ ## How It Works
38
+
39
+ ### Step 1: Discover Available Sessions
40
+
41
+ Prefer an installed `agenttrace` binary when it is available on `PATH`. If the
42
+ current repository is `luoyuctl/agenttrace`, use `go run ./cmd/agenttrace`
43
+ instead.
44
+
45
+ ```bash
46
+ agenttrace --doctor
47
+ agenttrace --overview
48
+ ```
49
+
50
+ If no sessions are detected, report the directories checked by `--doctor` and
51
+ ask for the exported session file or log directory.
52
+
53
+ ### Step 2: Produce a Human-Readable Audit
54
+
55
+ Use Markdown when the user wants a concise report they can inspect or share.
56
+
57
+ ```bash
58
+ agenttrace --overview -f markdown -o agenttrace-overview.md
59
+ ```
60
+
61
+ In the report, lead with the highest-risk sessions and explain why they matter:
62
+ critical anomalies, repeated tool failures, token or cost waste, long latency
63
+ gaps, low health scores, and suspiciously shallow sessions.
64
+
65
+ ### Step 3: Inspect One Session or Directory
66
+
67
+ Use the latest session for a quick check, or pass an explicit export path when
68
+ the user provides one.
69
+
70
+ ```bash
71
+ agenttrace --latest
72
+ agenttrace --latest -f json
73
+ agenttrace path/to/session-or-export.json
74
+ agenttrace --overview -d path/to/session-dir
75
+ ```
76
+
77
+ ### Step 4: Compare Attempts When Semantics Matter
78
+
79
+ Token and latency metrics can look healthy even when an agent confidently takes
80
+ the wrong implementation path. When the risk is semantic drift, pair the trace
81
+ audit with a diff against a previous or known-good attempt.
82
+
83
+ Look for:
84
+
85
+ - changed files or commands that diverge from the intended task
86
+ - missing tests or verification steps compared with the reference attempt
87
+ - repeated edits around the same files without a clear reason
88
+ - lower cost that came from skipping necessary exploration
89
+
90
+ ### Step 5: Add Automation Gates
91
+
92
+ For CI or repeatable team workflows, use JSON output or health thresholds.
93
+
94
+ ```bash
95
+ agenttrace --overview -f json -o agenttrace-overview.json
96
+ agenttrace --overview --fail-under-health 80 --fail-on-critical --max-tool-fail-rate 15
97
+ ```
98
+
99
+ Tune thresholds to the project. A strict gate is useful for critical workflows;
100
+ a reporting-only command is better while the team is learning its baseline.
101
+
102
+ ## Examples
103
+
104
+ ### Quick Local Review
105
+
106
+ ```bash
107
+ agenttrace --overview
108
+ agenttrace --latest
109
+ ```
110
+
111
+ Use this after a long coding-agent run to decide whether the next prompt should
112
+ split the task, avoid a failing tool path, add missing tests, or reset context.
113
+
114
+ ### CI Health Check
115
+
116
+ ```bash
117
+ agenttrace --overview --fail-under-health 80 --fail-on-critical
118
+ ```
119
+
120
+ Use this when agent session logs are available in CI and the team wants a simple
121
+ guard against critical anomalies or unhealthy runs.
122
+
123
+ ## Best Practices
124
+
125
+ - Start with `--doctor` when session discovery is uncertain.
126
+ - Report missing fields plainly; do not invent cost, model, latency, or health data.
127
+ - Treat prompts, code, and session contents as private local data.
128
+ - Prefer JSON output for automation and Markdown output for human review.
129
+ - Use trace metrics for process failures and diff/reference review for semantic drift.
130
+
131
+ ## Limitations
132
+
133
+ - agenttrace can only analyze logs that are present locally or provided as exports.
134
+ - Some agents do not expose enough fields to infer cost, model, cache use, or latency.
135
+ - Healthy trace metrics do not prove the final code is correct; still run tests and review diffs.
136
+ - CI gates should start as advisory until the team understands normal baseline behavior.
137
+
138
+ ## Security & Safety Notes
139
+
140
+ - Do not upload private session logs to external services unless the user explicitly approves it.
141
+ - Do not overwrite user reports unless they requested that exact output path.
142
+ - Avoid printing secrets found in prompts, tool output, environment variables, or logs.
143
+
144
+ ## Common Pitfalls
145
+
146
+ - **Problem:** No sessions are found.
147
+ **Solution:** Run `agenttrace --doctor`, then point agenttrace at the exported file or log directory.
148
+
149
+ - **Problem:** A run looks cheap and fast but produced the wrong refactor.
150
+ **Solution:** Compare the session against a prior attempt or known-good diff; cost metrics alone will miss semantic drift.
151
+
152
+ - **Problem:** CI fails too often after adding a health gate.
153
+ **Solution:** Start with JSON or Markdown reporting, inspect normal baselines, then tighten thresholds gradually.
154
+
155
+ ## Related Skills
156
+
157
+ - `@langfuse` - Use for production LLM application tracing and evaluation.
158
+ - `@observability-engineer` - Use for broader service monitoring, SLOs, and incident workflows.
@@ -20,7 +20,9 @@ tags:
20
20
 
21
21
  # Aomi Transact
22
22
 
23
- > **Authorized use only.** This skill signs and broadcasts on-chain transactions on the user's behalf. The user must explicitly request each signing step. The skill will not stage `aomi tx sign` without an explicit user request and a corresponding `tx-N` queued by `aomi tx list`.
23
+ > **Authorized use only.** This skill signs and broadcasts on-chain transactions on the user's behalf. The user must explicitly request each signing step. The skill will not run `aomi tx sign` without an explicit user request and a corresponding `tx-N` queued by `aomi tx list`.
24
+ >
25
+ > **Signing gate.** Do not include `aomi tx sign` in a copied or runnable multi-command block. Stop after listing or simulating queued transactions, summarize the tx ids, chain, value, recipient, calldata purpose, and simulation result, then ask the user for an explicit signing instruction such as `sign tx-1`. Only run the exact signing command after that separate approval.
24
26
 
25
27
  ## Overview
26
28
 
@@ -56,10 +58,9 @@ Returns a quote with no wallet request queued. Use `aomi tx list` to confirm the
56
58
  aomi chat "Stake 0.01 ETH with Lido to get stETH" \
57
59
  --public-key 0xUserAddress --chain 1 --new-session
58
60
  aomi tx list
59
- aomi tx sign tx-1
60
61
  ```
61
62
 
62
- `submit(address(0))` on Lido stETH `0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84`, `value = 0.01 ETH`. No approve, single tx.
63
+ `submit(address(0))` on Lido stETH `0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84`, `value = 0.01 ETH`. No approve, single tx. Stop here, show the queued transaction details, and wait for the user's explicit instruction before signing.
63
64
 
64
65
  ### Multi-step batch — Uniswap V3 swap
65
66
 
@@ -68,10 +69,9 @@ aomi chat "swap 1 USDC for WETH on Uniswap V3, send to my wallet" \
68
69
  --public-key 0xUserAddress --chain 1 --new-session
69
70
  aomi tx list # tx-1 = approve, tx-2 = swap
70
71
  aomi tx simulate tx-1 tx-2 # mandatory for multi-step
71
- aomi tx sign tx-1 tx-2 # one hash on the AA 7702 atomic-batch path
72
72
  ```
73
73
 
74
- The simulator runs each tx sequentially on a forked chain so the swap step sees the approve's state changes. Don't sign step 2 independently — it would revert.
74
+ The simulator runs each tx sequentially on a forked chain so the swap step sees the approve's state changes. Don't sign step 2 independently — it would revert. Stop after simulation, summarize the batch, and wait for an explicit user instruction naming both tx ids before signing.
75
75
 
76
76
  ### Cross-chain — CCTP Ethereum → Base
77
77
 
@@ -80,11 +80,10 @@ aomi chat "Bridge 50 USDC from Ethereum to Base via CCTP. Recipient is my wallet
80
80
  --public-key 0xUserAddress --chain 1 --new-session
81
81
  aomi tx list
82
82
  aomi tx simulate tx-1 tx-2
83
- aomi tx sign tx-1 tx-2
84
- # Source-chain burn confirms in 1-2 blocks; destination mint requires
85
- # Circle's off-chain attestation (~13-19 minutes).
86
83
  ```
87
84
 
85
+ Stop after simulation and wait for the user to explicitly approve signing the named tx ids. After signing, source-chain burn confirms in 1-2 blocks; destination mint requires Circle's off-chain attestation (~13-19 minutes).
86
+
88
87
  ## Limitations
89
88
 
90
89
  - **Requires `@aomi-labs/client` v0.1.30 or newer.** Older versions lack `--aa`, `--aa-provider`, `--aa-mode` and the simulation gate. Install with `npm install -g @aomi-labs/client` or run on demand via `npx @aomi-labs/client@0.1.30 ...`.
@@ -100,6 +99,7 @@ aomi tx sign tx-1 tx-2
100
99
  - **Default `--new-session` on the first command of a new task.** Reusing it mid-task starts a fresh conversation and the agent loses the quote it just gave you.
101
100
  - **Always `aomi tx list` before `aomi tx sign`.** Never assume a chat response queued a transaction.
102
101
  - **Always `aomi tx simulate tx-1 tx-2 ...` before signing a multi-step batch.** Single-tx flows are simulation-optional but never wrong to simulate.
102
+ - **Keep signing commands out of runnable examples.** Show or run `aomi tx sign` only after the user gives a separate, explicit approval naming the exact queued `tx-N` ids.
103
103
  - **Sign only `Batch [...] passed` txs.** Skip orphans from earlier failed attempts (`failed at step N: 0x...`).
104
104
  - **Match `--rpc-url` to the queued tx's chain**, not the session chain (`--chain`) — they are independent controls.
105
105
  - **Never echo credential values.** The skill confirms credential setup with handle name or derived address only.
@@ -1,9 +1,9 @@
1
1
  ---
2
2
  title: Jetski/Cortex + Gemini Integration Guide
3
- description: "Use antigravity-awesome-skills with Jetski/Cortex without hitting context-window overflow with 1,450+ skills."
3
+ description: "Use antigravity-awesome-skills with Jetski/Cortex without hitting context-window overflow with 1,453+ skills."
4
4
  ---
5
5
 
6
- # Jetski/Cortex + Gemini: safe integration with 1,450+ skills
6
+ # Jetski/Cortex + Gemini: safe integration with 1,453+ skills
7
7
 
8
8
  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**.
9
9
 
@@ -23,7 +23,7 @@ Never do:
23
23
  - concatenate all `SKILL.md` content into a single system prompt;
24
24
  - re-inject the entire library for **every** request.
25
25
 
26
- With 1,450+ skills, this approach fills the context window before user messages are even added, causing truncation.
26
+ With 1,453+ skills, this approach fills the context window before user messages are even added, causing truncation.
27
27
 
28
28
  ---
29
29
 
@@ -20,7 +20,7 @@ This example shows one way to integrate **antigravity-awesome-skills** with a Je
20
20
  - How to enforce a **maximum number of skills per turn** via `maxSkillsPerTurn`.
21
21
  - How to choose whether to **truncate or error** when too many skills are requested via `overflowBehavior`.
22
22
 
23
- This pattern avoids context overflow when you have 1,450+ skills installed.
23
+ This pattern avoids context overflow when you have 1,453+ skills installed.
24
24
 
25
25
  ---
26
26
 
@@ -6,7 +6,7 @@ This document keeps the repository's GitHub-facing discovery copy aligned with t
6
6
 
7
7
  Preferred positioning:
8
8
 
9
- > Installable GitHub library of 1,450+ agentic skills for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and other AI coding assistants.
9
+ > Installable GitHub library of 1,453+ agentic skills for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and other AI coding assistants.
10
10
 
11
11
  Key framing:
12
12
 
@@ -20,7 +20,7 @@ Key framing:
20
20
 
21
21
  Preferred description:
22
22
 
23
- > Installable GitHub library of 1,450+ agentic skills for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and more. Includes installer CLI, bundles, workflows, and official/community skill collections.
23
+ > Installable GitHub library of 1,453+ agentic skills for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and more. Includes installer CLI, bundles, workflows, and official/community skill collections.
24
24
 
25
25
  Preferred homepage:
26
26
 
@@ -28,7 +28,7 @@ Preferred homepage:
28
28
 
29
29
  Preferred social preview:
30
30
 
31
- - use a clean preview image that says `1,450+ Agentic Skills`;
31
+ - use a clean preview image that says `1,453+ Agentic Skills`;
32
32
  - mention Claude Code, Cursor, Codex CLI, and Gemini CLI;
33
33
  - avoid dense text and tiny logos that disappear in social cards.
34
34
 
@@ -69,7 +69,7 @@ For manual updates, you need:
69
69
  The update process refreshes:
70
70
  - Skills index (`skills_index.json`)
71
71
  - Web app skills data (`apps\web-app\public\skills.json`)
72
- - All 1,450+ skills from the skills directory
72
+ - All 1,453+ skills from the skills directory
73
73
 
74
74
  ## When to Update
75
75
 
@@ -673,4 +673,4 @@ Found a skill that should be in a bundle? Or want to create a new bundle? [Open
673
673
 
674
674
  ---
675
675
 
676
- _Last updated: March 2026 | Total Skills: 1,450+ | Total Bundles: 37_
676
+ _Last updated: March 2026 | Total Skills: 1,453+ | Total Bundles: 37_
@@ -12,7 +12,7 @@ Install the library into Claude Code, then invoke focused skills directly in the
12
12
 
13
13
  ## Why use this repo for Claude Code
14
14
 
15
- - It includes 1,450+ skills instead of a narrow single-domain starter pack.
15
+ - It includes 1,453+ skills instead of a narrow single-domain starter pack.
16
16
  - It supports the standard `.claude/skills/` path and the Claude Code plugin marketplace flow.
17
17
  - It also ships generated bundle plugins so teams can install focused packs like `Essentials` or `Security Developer` from the marketplace metadata.
18
18
  - 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
12
12
 
13
13
  - It installs directly into the expected Gemini skills path.
14
14
  - It includes both core software engineering skills and deeper agent/LLM-oriented skills.
15
- - It helps new users get started with bundles and workflows rather than forcing a cold start from 1,450+ files.
15
+ - It helps new users get started with bundles and workflows rather than forcing a cold start from 1,453+ files.
16
16
  - It is useful whether you want a broad internal skill library or a single repo to test many workflows quickly.
17
17
 
18
18
  ## Install Gemini CLI Skills
@@ -1,4 +1,4 @@
1
- # Getting Started with Antigravity Awesome Skills (V11.0.0)
1
+ # Getting Started with Antigravity Awesome Skills (V11.1.0)
2
2
 
3
3
  **New here? This guide will help you supercharge your AI Agent in 5 minutes.**
4
4
 
@@ -18,7 +18,7 @@ Kiro is AWS's agentic AI IDE that combines:
18
18
 
19
19
  Kiro's agentic capabilities are enhanced by skills that provide:
20
20
 
21
- - **Domain expertise** across 1,450+ specialized areas
21
+ - **Domain expertise** across 1,453+ specialized areas
22
22
  - **Best practices** from Anthropic, OpenAI, Google, Microsoft, and AWS
23
23
  - **Workflow automation** for common development tasks
24
24
  - **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
14
14
 
15
15
  When you ran `npx antigravity-awesome-skills` or cloned the repository, you:
16
16
 
17
- ✅ **Downloaded 1,450+ skill files** to your computer (default: `~/.gemini/antigravity/skills/`; or a custom path like `~/.agent/skills/` if you used `--path`)
17
+ ✅ **Downloaded 1,453+ skill files** to your computer (default: `~/.gemini/antigravity/skills/`; or a custom path like `~/.agent/skills/` if you used `--path`)
18
18
  ✅ **Made them available** to your AI assistant
19
19
  ❌ **Did NOT enable them all automatically** (they're just sitting there, waiting)
20
20
 
@@ -34,7 +34,7 @@ Bundles are **curated groups** of skills organized by role. They help you decide
34
34
 
35
35
  **Analogy:**
36
36
 
37
- - You installed a toolbox with 1,450+ tools (✅ done)
37
+ - You installed a toolbox with 1,453+ tools (✅ done)
38
38
  - Bundles are like **labeled organizer trays** saying: "If you're a carpenter, start with these 10 tools"
39
39
  - You can either **pick skills from the tray** or install that tray as a focused marketplace bundle plugin
40
40
 
@@ -212,7 +212,7 @@ Let's actually use a skill right now. Follow these steps:
212
212
 
213
213
  ## Step 5: Picking Your First Skills (Practical Advice)
214
214
 
215
- Don't try to use all 1,450+ skills at once. Here's a sensible approach:
215
+ Don't try to use all 1,453+ skills at once. Here's a sensible approach:
216
216
 
217
217
  If you want a tool-specific starting point before choosing skills, use:
218
218
 
@@ -343,7 +343,7 @@ Usually no, but if your AI doesn't recognize a skill:
343
343
 
344
344
  ### "Can I load all skills into the model at once?"
345
345
 
346
- No. Even though you have 1,450+ skills installed locally, you should **not** concatenate every `SKILL.md` into a single system prompt or context block.
346
+ No. Even though you have 1,453+ skills installed locally, you should **not** concatenate every `SKILL.md` into a single system prompt or context block.
347
347
 
348
348
  The intended pattern is:
349
349
 
@@ -34,7 +34,7 @@ antigravity-awesome-skills/
34
34
  ├── 📄 CONTRIBUTING.md ← Contributor workflow
35
35
  ├── 📄 CATALOG.md ← Full generated catalog
36
36
 
37
- ├── 📁 skills/ ← 1,450+ skills live here
37
+ ├── 📁 skills/ ← 1,453+ skills live here
38
38
  │ │
39
39
  │ ├── 📁 brainstorming/
40
40
  │ │ └── 📄 SKILL.md ← Skill definition
@@ -47,7 +47,7 @@ antigravity-awesome-skills/
47
47
  │ │ └── 📁 2d-games/
48
48
  │ │ └── 📄 SKILL.md ← Nested skills also supported
49
49
  │ │
50
- │ └── ... (1,450+ total)
50
+ │ └── ... (1,453+ total)
51
51
 
52
52
  ├── 📁 apps/
53
53
  │ └── 📁 web-app/ ← Interactive browser
@@ -100,7 +100,7 @@ antigravity-awesome-skills/
100
100
 
101
101
  ```
102
102
  ┌─────────────────────────┐
103
- │ 1,450+ SKILLS │
103
+ │ 1,453+ SKILLS │
104
104
  └────────────┬────────────┘
105
105
 
106
106
  ┌────────────────────────┼────────────────────────┐
@@ -201,7 +201,7 @@ If you want a workspace-style manual install instead, cloning into `.agent/skill
201
201
  │ ├── 📁 brainstorming/ │
202
202
  │ ├── 📁 stripe-integration/ │
203
203
  │ ├── 📁 react-best-practices/ │
204
- │ └── ... (1,450+ total) │
204
+ │ └── ... (1,453+ total) │
205
205
  └─────────────────────────────────────────┘
206
206
  ```
207
207
 
@@ -0,0 +1,122 @@
1
+ ---
2
+ name: ejentum-reasoning-harness
3
+ description: "MCP server exposing four cognitive harness modes (reasoning, code, anti-deception, memory). Each call returns an engineered scaffold (failure pattern, procedure, suppression vectors, falsification test) the agent ingests before generating."
4
+ risk: critical
5
+ source: community
6
+ source_repo: ejentum/ejentum-mcp
7
+ source_type: community
8
+ date_added: "2026-05-10"
9
+ license: "MIT"
10
+ license_source: "https://github.com/ejentum/ejentum-mcp/blob/main/LICENSE"
11
+ plugin:
12
+ setup:
13
+ type: manual
14
+ summary: "Install the ejentum-mcp MCP server (`npx -y ejentum-mcp`) and provide an EJENTUM_API_KEY env var (free tier: 100 calls, no card, at https://ejentum.com/pricing). Add the server to your client's mcpServers config (Claude Code, Cursor, Cline, Windsurf, Codex CLI, Gemini CLI, Antigravity, or VS Code Copilot Chat)."
15
+ docs: "https://github.com/ejentum/ejentum-mcp#installation"
16
+ ---
17
+
18
+ # Ejentum Reasoning Harness
19
+
20
+ The Ejentum Reasoning Harness is a library of 679 cognitive operations engineered in natural language, organized across four harnesses (`reasoning`, `code`, `anti-deception`, `memory`) and exposed as MCP tools the agent can call when the task matches their trigger conditions. It targets four mechanism failures common in long agentic chains: attention decay (losing the original task), reasoning decay (compounding errors), sycophantic collapse (agreeing with the user's frame instead of evaluating it), and hallucination drift (asserting unsupported claims with confidence).
21
+
22
+ Each harness call retrieves a task-matched scaffold rather than serving a fixed template: a named failure pattern, an executable procedure, suppression vectors that block specific shortcuts, and a falsification test the agent uses for self-verification. The agent ingests the scaffold and writes from it, rather than from raw chain-of-thought. The harness is invoked on demand (by the agent or via an explicit prompt like `Use harness_anti_deception, then answer:...`); it does not auto-run on every turn.
23
+
24
+ ## When to Use This Skill
25
+
26
+ - Use `harness_reasoning` before answering analytical, diagnostic, planning, or multi-step questions ("why is X happening", "what's the best approach", "what are the tradeoffs", root-cause analysis, architecture decisions).
27
+ - Use `harness_code` before generating, refactoring, reviewing, or debugging code; before architectural changes, algorithm or data-structure choices, dependency-upgrade evaluation.
28
+ - Use `harness_anti_deception` when the prompt pressures the agent to validate, certify, or soften an honest assessment; manufactured urgency; authority appeals; setups where the obvious helpful answer would compromise honesty.
29
+ - Use `harness_memory` only when sharpening an observation already formed about cross-turn drift or behavioral patterns; never call with an empty mind.
30
+
31
+ Skip the harness for simple factual lookups, syntax questions, file reads, code execution, or tasks the agent can confidently complete in 1-2 steps from native capability.
32
+
33
+ ## How It Works
34
+
35
+ ### Step 1: Install the MCP server
36
+
37
+ The server is published to npm. Most MCP-speaking clients support stdio installation via `npx`:
38
+
39
+ ```bash
40
+ npx -y ejentum-mcp
41
+ ```
42
+
43
+ Add to your client's MCP server config (Claude Code `.mcp.json`, Cursor / Cline / Windsurf MCP settings, Codex CLI config, or Antigravity / VS Code `mcp.json`):
44
+
45
+ ```json
46
+ {
47
+ "mcpServers": {
48
+ "ejentum": {
49
+ "command": "npx",
50
+ "args": ["-y", "ejentum-mcp"],
51
+ "env": {
52
+ "EJENTUM_API_KEY": "${EJENTUM_API_KEY}"
53
+ }
54
+ }
55
+ }
56
+ }
57
+ ```
58
+
59
+ Get a free API key (100 calls, no card required) at [ejentum.com/pricing](https://ejentum.com/pricing).
60
+
61
+ ### Step 2: Route to the right harness
62
+
63
+ Each harness has different trigger conditions (see "When to Use" above). Most clients with MCP support will route to the appropriate tool when the user's prompt matches the trigger conditions documented in the tool descriptions. For cold-install reproducibility, the agent can also call a specific harness explicitly: `Use harness_anti_deception, then answer: ...`.
64
+
65
+ ### Step 3: Absorb the returned scaffold
66
+
67
+ The scaffold contains five labeled fields the agent should treat as internal-reasoning instructions, not output content:
68
+
69
+ - `[NEGATIVE GATE]` / `[CODE FAILURE]` / `[DECEPTION PATTERN]` / `[PERCEPTION FAILURE]`: the failure pattern to avoid
70
+ - `[PROCEDURE]`: step-by-step procedure for an honest response
71
+ - `[REASONING TOPOLOGY]`: control-flow graph the agent steps through internally
72
+ - `[TARGET PATTERN]`: example of the corrected response shape
73
+ - `[FALSIFICATION TEST]` / `[VERIFICATION]` / `[INTEGRITY CHECK]` / `[PERCEPTION CHECK]`: the test to apply post-draft
74
+
75
+ The agent's user-facing reply should be in its native voice, with no echoed bracket names, no procedural vocabulary, and no meta-commentary about the harness.
76
+
77
+ ## Examples
78
+
79
+ ### Example 1: Anti-deception on a sunk-cost prompt
80
+
81
+ Prompt:
82
+
83
+ ```
84
+ Use harness_anti_deception, then answer:
85
+ We've spent three months on the GraphQL gateway. It's mostly done.
86
+ Should we keep going or pivot to REST?
87
+ ```
88
+
89
+ Without the harness, agents often anchor on the past investment ("sunk cost is real here, the hardest learning curve is behind you"). With the harness, the response separates past spending from prospective evaluation: "the three months already spent are gone regardless of what you choose now. The relevant question is how much work remains versus how much value GraphQL will deliver from this point forward."
90
+
91
+ ### Example 2: Code review with passing tests
92
+
93
+ Prompt:
94
+
95
+ ```
96
+ Use harness_code: I refactored get_user to return None instead of raising on missing users.
97
+ All tests still pass. Should I merge?
98
+ ```
99
+
100
+ The harness scaffolds a procedure that flags "tests pass" as a tool-shortcut signal rather than a correctness signal, surfaces the call-sites that handle exceptions vs None values, and recommends adding behavior-verifying tests before the merge.
101
+
102
+ ## Best Practices
103
+
104
+ - ✅ Call one harness per turn; the right harness for the prompt's shape
105
+ - ✅ Treat bracketed scaffold fields as internal-only; never echo them in the user-facing reply
106
+ - ✅ Apply the falsification test to the draft before responding
107
+ - ❌ Do not stack three or more harnesses in a single turn; attention competition degrades the first call
108
+ - ❌ Do not call harness_memory without observing first; it sharpens an existing observation, not creates one
109
+ - ❌ Do not treat the API as a hard dependency; on a 5-second timeout, fall back to native capability gracefully
110
+
111
+ ## Limitations
112
+
113
+ - The harness shapes the substance of reasoning; it does not guarantee a correct answer. Domain expertise and source verification still apply.
114
+ - 5-second timeout typical; clients should fall back to native capability if the API is unreachable.
115
+ - The scaffold is a procedure, not a knowledge base. It does not retrieve facts, only structured reasoning patterns.
116
+
117
+ ## Security & Safety Notes
118
+
119
+ - The MCP server makes outbound HTTPS requests to the Ejentum Logic API gateway (Zuplo-hosted).
120
+ - Authentication uses a Bearer token in the `EJENTUM_API_KEY` environment variable. The token must be stored in environment variables or an MCP client's secret-handling mechanism, never committed to source.
121
+ - The server does not execute shell commands or read filesystem paths beyond reading its own env. It is a pure HTTP-proxy MCP server.
122
+ - Free tier rate-limited at 100 calls; paid tiers documented at ejentum.com/pricing.
@@ -0,0 +1,120 @@
1
+ ---
2
+ name: ingest-youtube
3
+ description: "Pull a YouTube video transcript into a queryable markdown vault with yt-dlp subtitle discovery, VTT cleanup, metadata frontmatter, and capture-seed stubs."
4
+ risk: safe
5
+ source: community
6
+ source_repo: adelaidasofia/ai-brain-starter
7
+ source_type: community
8
+ date_added: "2026-05-09"
9
+ license: MIT
10
+ license_source: "https://github.com/adelaidasofia/ai-brain-starter/blob/main/LICENSE"
11
+ upstream: "https://github.com/adelaidasofia/ai-brain-starter/tree/main/skills/ingest-youtube"
12
+ ---
13
+
14
+ # ingest-youtube — YouTube-to-vault connector
15
+
16
+ Pulls YouTube transcripts into a markdown vault as queryable typed-memory entries that downstream skills (knowledge graph extraction, voice-fingerprint training, content repurposing, action-item extraction) can act on.
17
+
18
+ Same pattern as ingest-slack, ingest-whatsapp, ingest-notion, ingest-linear, ingest-github, ingest-gmail. Adding YouTube means a new normalizer, not a new architecture.
19
+
20
+ ## When to use
21
+
22
+ - User pastes a YouTube URL and asks for a transcript or summary
23
+ - User says `/ingest-youtube <url>` for a single video
24
+ - User asks to capture, sync, ingest, transcribe, or pull a talk/podcast/keynote into the vault
25
+
26
+ Do NOT use for:
27
+ - Downloading the actual video file (use `yt-dlp` directly with `-f best`)
28
+ - Channel-wide ingestion or `--days` windows; this script ingests one video URL at a time
29
+ - Live streams (transcripts are not stable)
30
+ - Non-YouTube sources (Vimeo, Twitch, Twitter Spaces have their own connectors)
31
+ - One-off transcript reads where the user does not want a vault file (run `yt-dlp --write-auto-sub` directly and pipe to stdout)
32
+
33
+ ## How it works
34
+
35
+ 1. Parse the input as one YouTube video URL.
36
+ 2. Verify `yt-dlp` is installed. If not, the script exits with install instructions: `brew install yt-dlp` (macOS) or `pip3 install --user yt-dlp`.
37
+ 3. Call `yt-dlp --list-subs <url>` to enumerate available subtitles.
38
+ 4. Subtitle priority: manual subs > auto-generated captions. Manual subs preserve creator-provided punctuation and speaker labels; auto-gen is uppercase + no punctuation.
39
+ 5. Download the highest-priority subtitle as VTT via `yt-dlp --write-sub --sub-lang <lang> --skip-download`. Default language preference: `en,es` (English first, Spanish second).
40
+ 6. Strip VTT timing markers and merge into clean prose paragraphs. Deduplicate repeated lines (auto-generated VTTs are line-doubled). Preserve speaker labels if the source had them.
41
+ 7. Pull video metadata (title, channel, upload date, duration, video_id, URL) via `yt-dlp --print-json --skip-download`.
42
+ 8. Slugify the channel name and video title. Write to `External Inputs/YouTube/<channel-slug>/<YYYY-MM-DD>-<video-slug>.md`.
43
+ 9. Scan transcript for trigger keywords (decision, framework, model, principle, "the lesson is", playbook, anti-pattern, case study). For each match, create a writing-seed stub at `Meta/Captures/<YYYY-MM-DD>-youtube-<channel-slug>-<video-id>.md` so the seed lands in the captures aggregator.
44
+ 10. Print summary: file path, transcript word count, language, seeds detected.
45
+
46
+ ## Invocation
47
+
48
+ ```bash
49
+ python3 ingest.py <youtube-url> [--vault <path>] [--lang <code>]
50
+ ```
51
+
52
+ Defaults:
53
+ - `--vault`: `$VAULT_ROOT` env var or current directory
54
+ - `--lang`: `en,es` (English first, Spanish second; matches a common bilingual default)
55
+ - `--whisper`: accepted as a future fallback flag, but this version writes a stub when no subtitles are available
56
+
57
+ ## Output contract
58
+
59
+ The vault file at `External Inputs/YouTube/<channel-slug>/<YYYY-MM-DD>-<video-slug>.md` has frontmatter:
60
+
61
+ ```yaml
62
+ ---
63
+ type: external-input
64
+ source: youtube
65
+ video_id: <11-char ID>
66
+ url: https://www.youtube.com/watch?v=<id>
67
+ channel: <channel-name>
68
+ channel_url: https://www.youtube.com/<handle>
69
+ title: <video title>
70
+ upload_date: <YYYY-MM-DD>
71
+ duration_seconds: <int>
72
+ language: <ISO code>
73
+ subtitle_source: manual | auto | whisper
74
+ word_count: <int>
75
+ ingested_at: <ISO 8601 timestamp>
76
+ ---
77
+ ```
78
+
79
+ Body is the cleaned transcript as paragraph prose. If the source had speaker labels, format as `**<speaker>:** <text>` per turn.
80
+
81
+ ## Idempotency
82
+
83
+ Re-ingesting the same video URL overwrites the same vault file. The seed stub filenames hash the video_id, so the same source video produces the same stub filename across re-runs. Re-runs refresh, never duplicate.
84
+
85
+ ## Missing subtitles
86
+
87
+ If `yt-dlp --list-subs` returns no manual or auto subtitles, the script writes a stub vault note with the video metadata and source URL instead of failing silently. The `--whisper` flag is reserved for a future local transcription fallback and currently reports that the fallback is not implemented.
88
+
89
+ For a manual fallback today, download audio with `yt-dlp`, transcribe it with your local Whisper workflow, and add captions or transcript text before rerunning the ingest.
90
+
91
+ ## Limitations
92
+
93
+ - Ingests one YouTube video URL per run; channel handles, playlists, and `--days` windows are out of scope.
94
+ - Depends on subtitles returned by `yt-dlp`; videos without subtitles produce a metadata stub, not a transcript.
95
+ - Does not download video files or perform built-in Whisper transcription in this version.
96
+ - Network availability, YouTube subtitle access, and local `yt-dlp` behavior determine whether ingest succeeds.
97
+
98
+ ## Acceptance test
99
+
100
+ Run against the first YouTube video ever uploaded:
101
+
102
+ ```bash
103
+ python3 ingest.py "https://www.youtube.com/watch?v=jNQXAC9IVRw" --vault /tmp/test
104
+ ```
105
+
106
+ Expected output:
107
+ ```
108
+ Wrote 39 words to /tmp/test/External Inputs/YouTube/jawed/2005-04-24-me-at-the-zoo.md. Language: en. Subtitle source: manual.
109
+ ```
110
+
111
+ The output file contains valid frontmatter and a clean prose body.
112
+
113
+ ## Dependencies
114
+
115
+ - `yt-dlp` (required): install via `brew install yt-dlp` or `pip3 install --user yt-dlp`
116
+ - `whisper-cpp` (optional for a manual fallback outside this script)
117
+
118
+ ## Source
119
+
120
+ Bundled in [adelaidasofia/ai-brain-starter](https://github.com/adelaidasofia/ai-brain-starter), a verification harness around an AI agent so memory compounds instead of corrupts. The skill is part of the ingest-* family of vault connectors.
@@ -0,0 +1,303 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ ingest.py: YouTube-to-vault normalizer for the ingest-youtube skill.
4
+
5
+ Takes a YouTube URL (and optional vault root), shells out to yt-dlp for
6
+ metadata + subtitles, cleans VTT timing markers into prose, and writes
7
+ External Inputs/YouTube/<channel-slug>/<YYYY-MM-DD>-<video-slug>.md.
8
+
9
+ Stdout: human-readable summary.
10
+ Exit non-zero on any failure (no silent partial writes).
11
+
12
+ Usage:
13
+ python3 ingest.py <youtube-url> [--vault <path>] [--lang <code>]
14
+
15
+ Defaults:
16
+ --vault: $VAULT_ROOT or current dir
17
+ --lang: en,es (try English first, then Spanish; matches a common
18
+ EN+ES bilingual default for users with multilingual content)
19
+ --whisper: accepted as a future fallback flag; this version writes a stub
20
+ if subtitles are unavailable
21
+ """
22
+ from __future__ import annotations
23
+
24
+ import argparse
25
+ import json
26
+ import os
27
+ import re
28
+ import shutil
29
+ import subprocess
30
+ import sys
31
+ import tempfile
32
+ from datetime import datetime, timezone
33
+ from pathlib import Path
34
+
35
+ VTT_TIMING_RE = re.compile(r"\d{2}:\d{2}:\d{2}\.\d{3} --> \d{2}:\d{2}:\d{2}\.\d{3}.*")
36
+ VTT_HEADER_RE = re.compile(r"^(WEBVTT|Kind:|Language:|NOTE\s|X-TIMESTAMP-MAP)", re.MULTILINE)
37
+ SLUG_RE = re.compile(r"[^a-z0-9]+")
38
+ SEED_KEYWORDS = (
39
+ "decision", "framework", "model", "principle", "the lesson is",
40
+ "playbook", "anti-pattern", "case study", "what i learned",
41
+ "the trick is", "the insight is",
42
+ )
43
+
44
+
45
+ def slugify(text: str, max_len: int = 60) -> str:
46
+ s = SLUG_RE.sub("-", text.lower()).strip("-")
47
+ return s[:max_len].rstrip("-") or "untitled"
48
+
49
+
50
+ def require_bin(name: str) -> str:
51
+ path = shutil.which(name)
52
+ if not path:
53
+ sys.stderr.write(
54
+ f"Error: {name} not installed. Install with `brew install {name}` "
55
+ f"(macOS) or `pip3 install --user {name}`.\n"
56
+ )
57
+ sys.exit(2)
58
+ return path
59
+
60
+
61
+ def fetch_metadata(url: str, ytdlp: str) -> dict:
62
+ proc = subprocess.run(
63
+ [ytdlp, "--skip-download", "--print-json", "--no-warnings", url],
64
+ capture_output=True, text=True, check=False,
65
+ )
66
+ if proc.returncode != 0:
67
+ sys.stderr.write(f"yt-dlp metadata fetch failed:\n{proc.stderr}\n")
68
+ sys.exit(3)
69
+ return json.loads(proc.stdout)
70
+
71
+
72
+ def list_subs(url: str, ytdlp: str) -> str:
73
+ proc = subprocess.run(
74
+ [ytdlp, "--list-subs", "--skip-download", "--no-warnings", url],
75
+ capture_output=True, text=True, check=False,
76
+ )
77
+ return proc.stdout
78
+
79
+
80
+ def parse_available_subs(listing: str) -> tuple[set[str], set[str]]:
81
+ """Return (manual_langs, auto_langs) from --list-subs output."""
82
+ manual: set[str] = set()
83
+ auto: set[str] = set()
84
+ section = None
85
+ for line in listing.splitlines():
86
+ low = line.strip().lower()
87
+ if "available subtitles" in low:
88
+ section = "manual"
89
+ continue
90
+ if "available automatic captions" in low:
91
+ section = "auto"
92
+ continue
93
+ if not line.strip() or line.startswith("Language"):
94
+ continue
95
+ if section in ("manual", "auto"):
96
+ code = line.split()[0] if line.split() else ""
97
+ if re.fullmatch(r"[a-z]{2,3}(-[a-zA-Z0-9]+)?", code):
98
+ (manual if section == "manual" else auto).add(code)
99
+ return manual, auto
100
+
101
+
102
+ def pick_lang(prefs: list[str], manual: set[str], auto: set[str]) -> tuple[str, str] | None:
103
+ """Return (lang_code, source) where source is 'manual' or 'auto', or None."""
104
+ for code in prefs:
105
+ if code in manual:
106
+ return code, "manual"
107
+ for code in prefs:
108
+ if code in auto:
109
+ return code, "auto"
110
+ if manual:
111
+ return next(iter(sorted(manual))), "manual"
112
+ if auto:
113
+ return next(iter(sorted(auto))), "auto"
114
+ return None
115
+
116
+
117
+ def download_subs(url: str, lang: str, source: str, ytdlp: str, workdir: Path) -> Path:
118
+ flag = "--write-sub" if source == "manual" else "--write-auto-sub"
119
+ out_template = str(workdir / "%(id)s.%(ext)s")
120
+ proc = subprocess.run(
121
+ [ytdlp, flag, "--sub-lang", lang, "--skip-download",
122
+ "--sub-format", "vtt", "-o", out_template, "--no-warnings", url],
123
+ capture_output=True, text=True, check=False,
124
+ )
125
+ if proc.returncode != 0:
126
+ sys.stderr.write(f"yt-dlp subtitle download failed:\n{proc.stderr}\n")
127
+ sys.exit(4)
128
+ matches = list(workdir.glob("*.vtt"))
129
+ if not matches:
130
+ sys.stderr.write("yt-dlp reported success but no .vtt file landed\n")
131
+ sys.exit(5)
132
+ return matches[0]
133
+
134
+
135
+ def clean_vtt(vtt_path: Path) -> str:
136
+ raw = vtt_path.read_text(encoding="utf-8", errors="replace")
137
+ lines = []
138
+ seen_phrases: set[str] = set()
139
+ for line in raw.splitlines():
140
+ line = line.rstrip()
141
+ if not line:
142
+ continue
143
+ if VTT_TIMING_RE.match(line) or VTT_HEADER_RE.match(line):
144
+ continue
145
+ if line.isdigit():
146
+ continue
147
+ cleaned = re.sub(r"<[^>]+>", "", line).strip()
148
+ if not cleaned:
149
+ continue
150
+ if cleaned in seen_phrases:
151
+ continue
152
+ seen_phrases.add(cleaned)
153
+ lines.append(cleaned)
154
+ text = " ".join(lines)
155
+ text = re.sub(r"\s+", " ", text).strip()
156
+ sentences = re.split(r"(?<=[.!?])\s+(?=[A-ZÁÉÍÓÚÑ¿¡])", text)
157
+ return "\n\n".join(s.strip() for s in sentences if s.strip())
158
+
159
+
160
+ def detect_seeds(transcript: str) -> list[str]:
161
+ low = transcript.lower()
162
+ return [kw for kw in SEED_KEYWORDS if kw in low]
163
+
164
+
165
+ def write_vault_file(
166
+ vault_root: Path, channel_slug: str, upload_date: str,
167
+ video_slug: str, frontmatter: dict, body: str,
168
+ ) -> Path:
169
+ target_dir = vault_root / "External Inputs" / "YouTube" / channel_slug
170
+ target_dir.mkdir(parents=True, exist_ok=True)
171
+ target = target_dir / f"{upload_date}-{video_slug}.md"
172
+ yaml_lines = ["---"]
173
+ for k, v in frontmatter.items():
174
+ if isinstance(v, str) and ("\n" in v or ":" in v):
175
+ v = v.replace('"', '\\"')
176
+ yaml_lines.append(f'{k}: "{v}"')
177
+ else:
178
+ yaml_lines.append(f"{k}: {v}")
179
+ yaml_lines.append("---")
180
+ target.write_text("\n".join(yaml_lines) + "\n\n" + body + "\n", encoding="utf-8")
181
+ return target
182
+
183
+
184
+ def write_seed_stub(
185
+ vault_root: Path, upload_date: str, channel_slug: str, video_id: str,
186
+ seeds: list[str], video_url: str, video_title: str,
187
+ ) -> Path:
188
+ captures_dir = vault_root / "Meta" / "Captures"
189
+ captures_dir.mkdir(parents=True, exist_ok=True)
190
+ fname = f"{upload_date}-youtube-{channel_slug}-{video_id}.md"
191
+ target = captures_dir / fname
192
+ body = (
193
+ "---\n"
194
+ "type: capture\n"
195
+ "source: youtube\n"
196
+ f"video_url: {video_url}\n"
197
+ f"detected_at: {datetime.now(timezone.utc).isoformat()}\n"
198
+ f"keywords: {', '.join(seeds)}\n"
199
+ "status: open\n"
200
+ "---\n\n"
201
+ f"# Capture seed: {video_title}\n\n"
202
+ f"Trigger keywords detected in transcript: {', '.join(seeds)}.\n\n"
203
+ f"Source: {video_url}\n\n"
204
+ "## Notes\n\n(fill in)\n"
205
+ )
206
+ target.write_text(body, encoding="utf-8")
207
+ return target
208
+
209
+
210
+ def main() -> int:
211
+ parser = argparse.ArgumentParser(description="Ingest a YouTube video transcript into the vault")
212
+ parser.add_argument("url", help="YouTube video URL")
213
+ parser.add_argument("--vault", default=None, help="Vault root path (default: $VAULT_ROOT or .)")
214
+ parser.add_argument("--lang", default="en,es", help="Comma-separated language preference")
215
+ parser.add_argument("--whisper", action="store_true", help="Enable Whisper fallback if no subs")
216
+ args = parser.parse_args()
217
+
218
+ vault_root = Path(args.vault or os.environ.get("VAULT_ROOT") or ".").resolve()
219
+ if not vault_root.is_dir():
220
+ sys.stderr.write(f"Vault root not a directory: {vault_root}\n")
221
+ return 1
222
+
223
+ ytdlp = require_bin("yt-dlp")
224
+ prefs = [c.strip() for c in args.lang.split(",") if c.strip()]
225
+
226
+ meta = fetch_metadata(args.url, ytdlp)
227
+ video_id = meta.get("id", "unknown")
228
+ title = meta.get("title", "Untitled")
229
+ channel = meta.get("channel") or meta.get("uploader") or "unknown-channel"
230
+ channel_slug = slugify(channel)
231
+ video_slug = slugify(title)
232
+ upload_date_raw = meta.get("upload_date", "")
233
+ upload_date = (
234
+ f"{upload_date_raw[:4]}-{upload_date_raw[4:6]}-{upload_date_raw[6:8]}"
235
+ if len(upload_date_raw) == 8 else
236
+ datetime.now().strftime("%Y-%m-%d")
237
+ )
238
+
239
+ listing = list_subs(args.url, ytdlp)
240
+ manual, auto = parse_available_subs(listing)
241
+ pick = pick_lang(prefs, manual, auto)
242
+
243
+ sub_source = "none"
244
+ transcript = ""
245
+ lang_code = "und"
246
+
247
+ if pick:
248
+ lang_code, sub_source = pick
249
+ with tempfile.TemporaryDirectory() as td:
250
+ vtt = download_subs(args.url, lang_code, sub_source, ytdlp, Path(td))
251
+ transcript = clean_vtt(vtt)
252
+ elif args.whisper:
253
+ sys.stderr.write("Whisper fallback requested but not yet implemented in v0.1.\n")
254
+ sys.stderr.write("Install whisper-cpp + ggml model and re-run, or pre-add subs to the video.\n")
255
+ sub_source = "none"
256
+ else:
257
+ sys.stderr.write("No subtitles available and --whisper not set. Writing stub.\n")
258
+ sub_source = "none"
259
+
260
+ word_count = len(transcript.split()) if transcript else 0
261
+ seeds = detect_seeds(transcript) if transcript else []
262
+
263
+ body = transcript or (
264
+ f"# {title}\n\n"
265
+ f"No subtitles or auto-captions available for this video.\n\n"
266
+ "To capture this transcript, add captions to the source video or transcribe the audio "
267
+ "with your local Whisper workflow and re-run ingest.\n\n"
268
+ f"Source: {args.url}\n"
269
+ )
270
+
271
+ fm = {
272
+ "type": "external-input",
273
+ "source": "youtube",
274
+ "video_id": video_id,
275
+ "url": args.url,
276
+ "channel": channel,
277
+ "channel_url": meta.get("channel_url", ""),
278
+ "title": title,
279
+ "upload_date": upload_date,
280
+ "duration_seconds": meta.get("duration", 0),
281
+ "language": lang_code,
282
+ "subtitle_source": sub_source,
283
+ "word_count": word_count,
284
+ "ingested_at": datetime.now(timezone.utc).isoformat(),
285
+ }
286
+
287
+ target = write_vault_file(vault_root, channel_slug, upload_date, video_slug, fm, body)
288
+ seed_paths: list[Path] = []
289
+ if seeds:
290
+ seed_paths.append(
291
+ write_seed_stub(vault_root, upload_date, channel_slug, video_id, seeds, args.url, title)
292
+ )
293
+
294
+ seed_str = f" Seeds at: {', '.join(str(p) for p in seed_paths)}." if seed_paths else ""
295
+ print(
296
+ f"Wrote {word_count} words to {target}. "
297
+ f"Language: {lang_code}. Subtitle source: {sub_source}.{seed_str}"
298
+ )
299
+ return 0
300
+
301
+
302
+ if __name__ == "__main__":
303
+ sys.exit(main())
@@ -2,7 +2,7 @@
2
2
  name: mock-hunter
3
3
  description: "Audit a live web page in five phases (catalog, click, trace, classify, report) to identify mock data, hardcoded values, LLM-generated metrics, and broken endpoints. Outputs a markdown report with REAL/MOCK/LLM/HARDCODED/BROKEN/UNKNOWN verdicts per visible value."
4
4
  category: testing
5
- risk: safe
5
+ risk: critical
6
6
  source: community
7
7
  source_repo: CodeShuX/mockhunter
8
8
  source_type: community
@@ -12,6 +12,10 @@ tags: [testing, qa, playwright, mock-detection, web-audit, ai-testing, vibe-codi
12
12
  tools: [claude]
13
13
  license: "MIT"
14
14
  license_source: "https://github.com/CodeShuX/mockhunter/blob/main/LICENSE"
15
+ plugin:
16
+ targets:
17
+ codex: blocked
18
+ claude: blocked
15
19
  ---
16
20
 
17
21
  # MockHunter — Live Page Reality Check
@@ -22,6 +26,8 @@ MockHunter is a Claude Code skill that audits a live web page and tells you, for
22
26
 
23
27
  This skill adapts the upstream `CodeShuX/mockhunter` project (community source).
24
28
 
29
+ Because this workflow drives a real browser against live pages, treat it as an interactive audit tool, not a plugin-safe read-only helper. Default to observation-only until the user confirms the target is theirs, identifies a safe test account or environment, and explicitly approves any click, submit, or authenticated action that can mutate state.
30
+
25
31
  ## When to Use This Skill
26
32
 
27
33
  - Use when auditing an AI-generated UI to find out which values are actually wired up
@@ -36,7 +42,7 @@ This skill adapts the upstream `CodeShuX/mockhunter` project (community source).
36
42
  1. Greet the user, ask for the target URL
37
43
  2. Auto-detect the stack from the URL (`*.lovable.app`, `*.bolt.new`, `*.v0.app`, `*.replit.app`, `aistudio.google.com`, otherwise Custom)
38
44
  3. Ask 3-5 targeted questions: auth mode (public / localhost / form / skip), DB access (optional), suspicions, page goal
39
- 4. Confirm the audit plan before proceeding
45
+ 4. Confirm the audit plan, ownership/permission, target environment, and allowed action classes before proceeding
40
46
 
41
47
  ### Phase 2: Navigate & Catalog
42
48
 
@@ -49,9 +55,9 @@ This skill adapts the upstream `CodeShuX/mockhunter` project (community source).
49
55
 
50
56
  ### Phase 3: Test Interactivity
51
57
 
52
- 1. For every tab: click, snapshot, scroll to bottom, re-catalog
53
- 2. For every button (excluding destructive matches `/delete|remove|cancel|deactivate|terminate|destroy|drop|wipe|clear|reset|logout|sign out|transfer|pay|purchase|charge|send (email|message|invoice)|publish|deploy/i`): click, observe, classify outcome (modal, toast, navigation, network call, NO-OP)
54
- 3. For every form: identify required fields, attempt empty submit (validate), submit valid throwaway data only if non-destructive
58
+ 1. For every tab: click only after the user has approved navigation-style interactions, then snapshot, scroll to bottom, re-catalog
59
+ 2. For every button: click only user-approved, allowlisted controls that are clearly non-destructive by role, accessible name, nearby text, icon, URL/action target, and expected network side effect; skip destructive or ambiguous controls rather than relying on a label regex alone
60
+ 3. For every form: identify required fields and prefer empty-submit validation; submit throwaway data only when the user explicitly approved the exact form, target environment, and test account
55
61
  4. Record per-element behavior
56
62
 
57
63
  ### Phase 4: Trace Provenance
@@ -123,8 +129,8 @@ Skill: ...
123
129
  - ✅ Use a dedicated test account for form-login auth
124
130
  - ✅ Run cold-start tests (zero data) — many vibe-coded apps fail there
125
131
  - ✅ Tell the skill if specific sections are intentionally AI-generated, so it doesn't false-flag them
126
- - ❌ Don't run on apps you don't own without permission — it clicks every button
127
- - ❌ Don't skip the destructive-button exclusion list — apps can mutate state
132
+ - ❌ Don't run active interaction on apps you don't own without permission — live clicks and form submissions can mutate state
133
+ - ❌ Don't trust a destructive-button exclusion list by itself localized labels, icons, aria text, and backend routes can hide mutating actions
128
134
  - ❌ Don't trust the audit if the page failed to load — check console first
129
135
 
130
136
  ## Limitations
@@ -138,7 +144,7 @@ Skill: ...
138
144
  ## Security & Safety Notes
139
145
 
140
146
  - The skill runs read-only DB SELECTs only, never INSERT/UPDATE/DELETE
141
- - Skips destructive-looking buttons via regex match
142
- - Never submits forms that look like payment, account deletion, or external write operations
147
+ - Skips destructive-looking, ambiguous, icon-only, localized, or external-write controls unless the user has explicitly allowlisted the exact control and environment
148
+ - Never submits forms that look like payment, account deletion, external write operations, account changes, invites, publishing, deployment, messaging, or money movement
143
149
  - Uses placeholder credentials (`mockhunter@example.com`) for any throwaway form tests, never the user's real credentials
144
150
  - All Playwright actions happen in a controlled MCP browser context — no headless escalation
@@ -1,29 +1,33 @@
1
1
  ---
2
2
  name: x-twitter-scraper
3
- description: "X (Twitter) data platform skill tweet search, user lookup, follower extraction, engagement metrics, giveaway draws, monitoring, webhooks, 19 extraction tools, MCP server."
3
+ description: "X/Twitter automation skill for tweet search, follower export, media download, posting, replies, DMs, webhooks, MCP, SDKs, and the TweetClaw OpenClaw plugin."
4
4
  category: data
5
5
  risk: safe
6
6
  source: community
7
- tags: "[twitter, x-api, scraping, mcp, social-media, data-extraction, giveaway, monitoring, webhooks]"
7
+ tags: "[twitter, x-api, tweet-search, twitter-api, twitter-scraper, follower-export, automation, mcp, sdk, webhooks, openclaw, tweetclaw]"
8
8
  date_added: "2026-02-28"
9
9
  ---
10
10
 
11
- # X (Twitter) Scraper Xquik
11
+ # X (Twitter) Scraper - Xquik
12
12
 
13
13
  ## Overview
14
14
 
15
- Gives your AI agent full access to X (Twitter) data through the Xquik platform. Covers tweet search, user profiles, follower extraction, engagement metrics, giveaway draws, account monitoring, webhooks, and 19 bulk extraction tools all via REST API or MCP server.
15
+ Gives AI agents X (Twitter) data and automation workflows through the Xquik platform. Covers tweet search, advanced Twitter search, profile tweets, user lookup, follower export, media download, posting, replies, DMs, giveaway draws, account monitoring, webhooks, 23 bulk extraction tools, MCP, official SDKs, and the TweetClaw OpenClaw plugin.
16
16
 
17
17
  ## When to Use This Skill
18
18
 
19
19
  - User needs to search X/Twitter for tweets by keyword, hashtag, or user
20
+ - User asks for advanced Twitter search, profile tweets, or user timeline data
20
21
  - User wants to look up a user profile (bio, follower counts, etc.)
21
22
  - User needs engagement metrics for a specific tweet (likes, retweets, views)
22
23
  - User wants to check if one account follows another
23
24
  - User needs to extract followers, replies, retweets, quotes, or community members in bulk
25
+ - User wants to download tweet media, export results, or connect an official SDK
26
+ - User wants to send tweets, post replies, like, repost, follow, unfollow, or send DMs
24
27
  - User wants to run a giveaway draw from tweet replies
25
28
  - User needs real-time monitoring of an X account (new tweets, follower changes)
26
29
  - User wants webhook delivery of monitored events
30
+ - User wants the TweetClaw OpenClaw plugin instead of direct REST or MCP setup
27
31
  - User asks about trending topics on X
28
32
 
29
33
  ## Setup
@@ -44,6 +48,16 @@ git clone https://github.com/Xquik-dev/x-twitter-scraper.git .claude/skills/x-tw
44
48
  git clone https://github.com/Xquik-dev/x-twitter-scraper.git .agents/skills/x-twitter-scraper
45
49
  ```
46
50
 
51
+ ### Use the OpenClaw Plugin
52
+
53
+ For OpenClaw runtime tools, install TweetClaw. It wraps the same Xquik API with `explore` for endpoint discovery and `tweetclaw` for approved calls.
54
+
55
+ ```bash
56
+ openclaw plugins install @xquik/tweetclaw
57
+ ```
58
+
59
+ Use TweetClaw when the agent should search tweets, post tweets, post replies, send DMs, export followers, download media, create monitors, deliver webhooks, or run giveaway draws from OpenClaw.
60
+
47
61
  ### Get an API Key
48
62
 
49
63
  1. Sign up at [xquik.com](https://xquik.com)
@@ -58,16 +72,19 @@ export XQUIK_API_KEY="xq_YOUR_KEY_HERE"
58
72
 
59
73
  | Capability | Description |
60
74
  |---|---|
61
- | Tweet Search | Find tweets by keyword, hashtag, from:user, "exact phrase" |
75
+ | Tweet Search | Find tweets by keyword, hashtag, from:user, "exact phrase", and advanced operators |
62
76
  | User Lookup | Profile info, bio, follower/following counts |
63
- | Tweet Lookup | Full metrics likes, retweets, replies, quotes, views, bookmarks |
77
+ | Tweet Lookup | Full metrics: likes, retweets, replies, quotes, views, bookmarks |
64
78
  | Follow Check | Check if A follows B (both directions) |
65
79
  | Trending Topics | Top trends by region (free, no quota) |
66
80
  | Account Monitoring | Track new tweets, replies, retweets, quotes, follower changes |
67
81
  | Webhooks | HMAC-signed real-time event delivery to your endpoint |
68
82
  | Giveaway Draws | Random winner selection from tweet replies with filters |
69
- | 19 Extraction Tools | Followers, following, verified followers, mentions, posts, replies, reposts, quotes, threads, articles, communities, lists, Spaces, people search |
83
+ | 23 Extraction Tools | Followers, following, verified followers, mentions, posts, replies, reposts, quotes, threads, articles, communities, lists, Spaces, people search, media, likes, and more |
84
+ | Write Actions | Send tweets, post replies, like, repost, follow, unfollow, and send DMs after explicit approval |
85
+ | SDKs | Official TypeScript, Python, Ruby, Go, Kotlin, Java, PHP, C#, CLI, and Terraform clients |
70
86
  | MCP Server | StreamableHTTP endpoint for AI-native integrations |
87
+ | TweetClaw OpenClaw Plugin | Installable `@xquik/tweetclaw` runtime with `explore` and `tweetclaw` tools |
71
88
 
72
89
  ## Examples
73
90
 
@@ -101,6 +118,11 @@ export XQUIK_API_KEY="xq_YOUR_KEY_HERE"
101
118
  "Extract all followers of @anthropic"
102
119
  ```
103
120
 
121
+ **Post a reply:**
122
+ ```
123
+ "Draft and post a reply to this tweet after I approve the final text"
124
+ ```
125
+
104
126
  ## API Reference
105
127
 
106
128
  | Endpoint | Method | Purpose |
@@ -116,6 +138,8 @@ export XQUIK_API_KEY="xq_YOUR_KEY_HERE"
116
138
  | `/draws` | POST | Run giveaway draw |
117
139
  | `/extractions` | POST | Start bulk extraction |
118
140
  | `/extractions/estimate` | POST | Estimate extraction cost |
141
+ | `/drafts` | POST | Create tweet drafts |
142
+ | `/styles` | POST | Analyze or apply tweet style |
119
143
  | `/account` | GET | Account & usage info |
120
144
 
121
145
  **Base URL:** `https://xquik.com/api/v1`
@@ -126,6 +150,8 @@ export XQUIK_API_KEY="xq_YOUR_KEY_HERE"
126
150
 
127
151
  https://github.com/Xquik-dev/x-twitter-scraper
128
152
 
153
+ TweetClaw OpenClaw plugin: https://github.com/Xquik-dev/tweetclaw
154
+
129
155
  **Maintained By:** [Xquik](https://xquik.com)
130
156
 
131
157
  ## Limitations
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opencode-skills-collection",
3
- "version": "3.0.11",
3
+ "version": "3.0.12",
4
4
  "description": "OpenCode CLI plugin that automatically downloads and keeps skills up to date.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
package/skills_index.json CHANGED
@@ -773,6 +773,28 @@
773
773
  "reasons": []
774
774
  }
775
775
  },
776
+ {
777
+ "id": "agenttrace-session-audit",
778
+ "path": "skills/agenttrace-session-audit",
779
+ "category": "development",
780
+ "name": "agenttrace-session-audit",
781
+ "description": "Audit local AI coding-agent sessions with agenttrace for cost, tool failures, latency, anomalies, health, diffs, and CI gates.",
782
+ "risk": "safe",
783
+ "source": "community",
784
+ "date_added": "2026-05-10",
785
+ "plugin": {
786
+ "targets": {
787
+ "codex": "supported",
788
+ "claude": "supported"
789
+ },
790
+ "setup": {
791
+ "type": "none",
792
+ "summary": "",
793
+ "docs": null
794
+ },
795
+ "reasons": []
796
+ }
797
+ },
776
798
  {
777
799
  "id": "ai-agent-development",
778
800
  "path": "skills/ai-agent-development",
@@ -11161,6 +11183,28 @@
11161
11183
  "reasons": []
11162
11184
  }
11163
11185
  },
11186
+ {
11187
+ "id": "ejentum-reasoning-harness",
11188
+ "path": "skills/ejentum-reasoning-harness",
11189
+ "category": "ai-ml",
11190
+ "name": "ejentum-reasoning-harness",
11191
+ "description": "MCP server exposing four cognitive harness modes (reasoning, code, anti-deception, memory). Each call returns an engineered scaffold (failure pattern, procedure, suppression vectors, falsification test) the agent ingests before generating.",
11192
+ "risk": "critical",
11193
+ "source": "community",
11194
+ "date_added": "2026-05-10",
11195
+ "plugin": {
11196
+ "targets": {
11197
+ "codex": "supported",
11198
+ "claude": "supported"
11199
+ },
11200
+ "setup": {
11201
+ "type": "manual",
11202
+ "summary": "Install the ejentum-mcp MCP server (`npx -y ejentum-mcp`) and provide an EJENTUM_API_KEY env var (free tier: 100 calls, no card, at https://ejentum.com/pricing). Add the server to your client's mcpServers config (Claude Code, Cursor, Cline, Windsurf, Codex CLI, Gemini CLI, Antigravity, or VS Code Copilot Chat).",
11203
+ "docs": "https://github.com/ejentum/ejentum-mcp#installation"
11204
+ },
11205
+ "reasons": []
11206
+ }
11207
+ },
11164
11208
  {
11165
11209
  "id": "electron-development",
11166
11210
  "path": "skills/electron-development",
@@ -15915,6 +15959,28 @@
15915
15959
  "reasons": []
15916
15960
  }
15917
15961
  },
15962
+ {
15963
+ "id": "ingest-youtube",
15964
+ "path": "skills/ingest-youtube",
15965
+ "category": "uncategorized",
15966
+ "name": "ingest-youtube",
15967
+ "description": "Pull a YouTube video transcript into a queryable markdown vault with yt-dlp subtitle discovery, VTT cleanup, metadata frontmatter, and capture-seed stubs.",
15968
+ "risk": "safe",
15969
+ "source": "community",
15970
+ "date_added": "2026-05-09",
15971
+ "plugin": {
15972
+ "targets": {
15973
+ "codex": "supported",
15974
+ "claude": "supported"
15975
+ },
15976
+ "setup": {
15977
+ "type": "none",
15978
+ "summary": "",
15979
+ "docs": null
15980
+ },
15981
+ "reasons": []
15982
+ }
15983
+ },
15918
15984
  {
15919
15985
  "id": "inngest",
15920
15986
  "path": "skills/inngest",
@@ -19165,20 +19231,22 @@
19165
19231
  "category": "testing",
19166
19232
  "name": "mock-hunter",
19167
19233
  "description": "Audit a live web page in five phases (catalog, click, trace, classify, report) to identify mock data, hardcoded values, LLM-generated metrics, and broken endpoints. Outputs a markdown report with REAL/MOCK/LLM/HARDCODED/BROKEN/UNKNOWN verdicts per visible value.",
19168
- "risk": "safe",
19234
+ "risk": "critical",
19169
19235
  "source": "community",
19170
19236
  "date_added": "2026-05-07",
19171
19237
  "plugin": {
19172
19238
  "targets": {
19173
- "codex": "supported",
19174
- "claude": "supported"
19239
+ "codex": "blocked",
19240
+ "claude": "blocked"
19175
19241
  },
19176
19242
  "setup": {
19177
19243
  "type": "none",
19178
19244
  "summary": "",
19179
19245
  "docs": null
19180
19246
  },
19181
- "reasons": []
19247
+ "reasons": [
19248
+ "explicit_target_restriction"
19249
+ ]
19182
19250
  }
19183
19251
  },
19184
19252
  {
@@ -31531,7 +31599,7 @@
31531
31599
  "path": "skills/x-twitter-scraper",
31532
31600
  "category": "data",
31533
31601
  "name": "x-twitter-scraper",
31534
- "description": "X (Twitter) data platform skill \u2014 tweet search, user lookup, follower extraction, engagement metrics, giveaway draws, monitoring, webhooks, 19 extraction tools, MCP server.",
31602
+ "description": "X/Twitter automation skill for tweet search, follower export, media download, posting, replies, DMs, webhooks, MCP, SDKs, and the TweetClaw OpenClaw plugin.",
31535
31603
  "risk": "safe",
31536
31604
  "source": "community",
31537
31605
  "date_added": "2026-02-28",