opencode-skills-collection 3.0.11 → 3.0.13
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.
- package/bundled-skills/.antigravity-install-manifest.json +4 -1
- package/bundled-skills/agenttrace-session-audit/SKILL.md +158 -0
- package/bundled-skills/aomi-transact/SKILL.md +8 -8
- package/bundled-skills/docs/integrations/jetski-cortex.md +3 -3
- package/bundled-skills/docs/integrations/jetski-gemini-loader/README.md +1 -1
- package/bundled-skills/docs/maintainers/repo-growth-seo.md +3 -3
- package/bundled-skills/docs/maintainers/skills-update-guide.md +1 -1
- package/bundled-skills/docs/users/bundles.md +1 -1
- package/bundled-skills/docs/users/claude-code-skills.md +1 -1
- package/bundled-skills/docs/users/gemini-cli-skills.md +1 -1
- package/bundled-skills/docs/users/getting-started.md +1 -1
- package/bundled-skills/docs/users/kiro-integration.md +1 -1
- package/bundled-skills/docs/users/usage.md +4 -4
- package/bundled-skills/docs/users/visual-guide.md +4 -4
- package/bundled-skills/ejentum-reasoning-harness/SKILL.md +122 -0
- package/bundled-skills/ingest-youtube/SKILL.md +120 -0
- package/bundled-skills/ingest-youtube/ingest.py +303 -0
- package/bundled-skills/mock-hunter/SKILL.md +15 -9
- package/bundled-skills/x-twitter-scraper/SKILL.md +33 -7
- package/package.json +1 -1
- package/skills_index.json +73 -5
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
|
-
"updatedAt": "2026-05-
|
|
3
|
+
"updatedAt": "2026-05-13T01:56:16.789Z",
|
|
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
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
72
|
+
- All 1,453+ skills from the skills directory
|
|
73
73
|
|
|
74
74
|
## When to Update
|
|
75
75
|
|
|
@@ -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,
|
|
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,
|
|
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
|
|
@@ -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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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:
|
|
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
|
|
54
|
-
3. For every form: identify required fields
|
|
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 —
|
|
127
|
-
- ❌ Don't
|
|
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
|
|
142
|
-
- Never submits forms that look like payment, account deletion,
|
|
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
|
|
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,
|
|
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
|
|
11
|
+
# X (Twitter) Scraper - Xquik
|
|
12
12
|
|
|
13
13
|
## Overview
|
|
14
14
|
|
|
15
|
-
Gives
|
|
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
|
|
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
|
-
|
|
|
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
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": "
|
|
19234
|
+
"risk": "critical",
|
|
19169
19235
|
"source": "community",
|
|
19170
19236
|
"date_added": "2026-05-07",
|
|
19171
19237
|
"plugin": {
|
|
19172
19238
|
"targets": {
|
|
19173
|
-
"codex": "
|
|
19174
|
-
"claude": "
|
|
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
|
|
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",
|