Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,12 @@
"name": "indrasvat",
"url": "https://github.com/indrasvat"
},
"description": "15 Claude Code skills for dev workflows, CI/CD, Kubernetes, browser automation, and AI-assisted development",
"description": "16 Claude Code skills for dev workflows, CI/CD, Kubernetes, browser automation, cross-platform signal research, and AI-assisted development",
"plugins": [
{
"name": "indrasvat-skills",
"source": "./",
"description": "15 Claude Code skills for dev workflows, CI/CD, Kubernetes, browser automation, and AI-assisted development",
"description": "16 Claude Code skills for dev workflows, CI/CD, Kubernetes, browser automation, cross-platform signal research, and AI-assisted development",
"category": "productivity"
},
{
Expand Down
4 changes: 2 additions & 2 deletions .claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "indrasvat-skills",
"description": "15 Claude Code skills: CI gating, exec plans, PR shipping, code cleanup, PR triage, K8s diffing, migration safety, API compat, rollout health, CRD impact analysis, PRD generation, iTerm2 automation, Cloudflare deployment, CodeRabbit reviews, and browsing-as-you (shared authenticated Chrome over CDP)",
"version": "1.5.0",
"description": "16 Claude Code skills: CI gating, exec plans, PR shipping, code cleanup, PR triage, K8s diffing, migration safety, API compat, rollout health, CRD impact analysis, PRD generation, iTerm2 automation, Cloudflare deployment, CodeRabbit reviews, browsing-as-you (shared authenticated Chrome over CDP), and grokery (grok-powered cross-platform signal research)",
"version": "1.6.0",
"commands": "./commands/",
"skills": "./skills/",
"author": {
Expand Down
14 changes: 10 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
# Claude Code Skills

A marketplace of personal [Claude Code](https://claude.ai/code) plugins: 15 skills for AI-assisted dev workflows, plus `dootdashaa`, a glanceable statusline.
A marketplace of personal [Claude Code](https://claude.ai/code) plugins: 16 skills for AI-assisted dev workflows, plus `dootdashaa`, a glanceable statusline.

## 🎯 Overview

This repository is a Claude Code marketplace exposing two independently-installable plugins:

| Plugin | Install command | What it adds |
|---|---|---|
| **indrasvat-skills** | `/plugin install indrasvat-skills@indrasvat-skills` | 15 skills (CI gating, exec plans, PR shipping, K8s diffing, PRD generation, iTerm2 automation, browsing-as-you, …) |
| **indrasvat-skills** | `/plugin install indrasvat-skills@indrasvat-skills` | 16 skills (CI gating, exec plans, PR shipping, K8s diffing, PRD generation, iTerm2 automation, browsing-as-you, grokery signal research, …) |
| **dootdashaa** | `/plugin install dootdashaa@indrasvat-skills` | Single-line, Nerd-Font-icon statusline. `~9ms` p50 render budget. |

Both share one `/plugin marketplace add` step (see [Installation](#installation)). Each can be installed, updated, and uninstalled on its own.
Expand All @@ -17,7 +17,7 @@ Both share one `/plugin marketplace add` step (see [Installation](#installation)

Glanceable, single-line. One carrier per signal (icon, text, or colour β€” never two). Zero emoji. Pre-computed git cache keeps the hot path under the 300ms Claude Code debounce. See [`plugins/dootdashaa/README.md`](plugins/dootdashaa/README.md) for env-var options and the install / uninstall command list; design report is at [`plugins/dootdashaa/docs/DESIGN.html`](plugins/dootdashaa/docs/DESIGN.html).

### Skills (15 total)
### Skills (16 total)

#### Universal Dev Workflow (5 new)

Expand All @@ -39,6 +39,12 @@ Glanceable, single-line. One carrier per signal (icon, text, or colour β€” never
| **rollout-check** | `/rollout-check` | Verify K8s deployment health β€” pods, events, HPA, logs. |
| **crd-impact** | `/crd-impact` | Find all controllers, webhooks, RBAC, and manifests affected by a CRD change. |

#### Research & Signals (1 new)

| Skill | Command | Description |
|-------|---------|-------------|
| **grokery** πŸ›’ | `/grokery` | Grok-powered cross-platform signal scan (X + HN + GitHub + Reddit + Polymarket + web), engagement-ranked. A `last30days`-style brief with **no API keys or browser login** β€” X/Reddit/web run through the `grok` CLI. |

#### Original Skills (4)

#### πŸ“‹ **prd-generator**
Expand Down Expand Up @@ -127,7 +133,7 @@ Inside a `claude` session, register the marketplace once and install whichever p
```
/plugin marketplace add indrasvat/claude-code-skills # once per machine

# 15 skills (CI gating, exec plans, PR shipping, K8s diffing, PRD generation, browsing-as-you, ...)
# 16 skills (CI gating, exec plans, PR shipping, K8s diffing, PRD generation, browsing-as-you, grokery, ...)
/plugin install indrasvat-skills@indrasvat-skills

# Statusline
Expand Down
72 changes: 72 additions & 0 deletions skills/grokery/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
---
name: grokery
description: >
Scanning the live internet for what people are actually saying about a topic,
then synthesizing an engagement-ranked brief β€” grok-powered first-party X
search plus Hacker News, GitHub, Reddit, Polymarket, YouTube and the open web,
with no API keys or browser login. Use when the user says "grokery", "what's
the buzz on", "what is X / the internet saying about", "scan the discourse",
"vibe check", "trend check", "social signals on", "what are people saying
about <topic>", "research the chatter on", or wants real-time cross-platform
sentiment, a comparison ("A vs B"), or a shareable HTML signal brief on a
tech / culture / product / person topic.
allowed-tools: Bash, Read, Write, WebFetch
argument-hint: <topic | A vs B> [--days N] [--mode hiring|competitors] [--github-user H] [--html]
---

# grokery πŸ›’

Grok-powered cross-platform signal scan. Like `last30days`, but the auth-walled,
key-hungry sources (X, Reddit, grounded web search) all run through the **`grok`
CLI on your X subscription** β€” so there is **no Bird client, no browser login,
no Brave/Perplexity keys**. _"Searches people, not editors. Ranked by upvotes,
likes, and real money."_

## Prerequisites
- **`grok`** CLI, logged in (`grok login`) β€” powers X + Reddit + web. Required for those sources; everything else still runs without it.
- **`curl`** + **`jq`** β€” for Hacker News, GitHub, Polymarket (keyless).
- Optional: **`yt-dlp`** (YouTube), **`GITHUB_TOKEN`** (higher GitHub limits), **`python3`** (`--store` trend DB + HTML render).

## Quickstart
Run the orchestrator β€” it fans out every source in parallel and prints combined
raw signal (also saved to `~/Documents/Grokery/<slug>-raw.md`):

```bash
bash skills/grokery/scripts/grokery.sh "grok cli" --days 30
```
> The grok pass is one combined session over X + Reddit + web and is the slow part β€” typically **3–7 min** (default `--timeout 420`s; after that it degrades gracefully and every other source still returns). The keyless sources (HN/GitHub/Polymarket) return in seconds. Run it and wait; do not abort.

Then **you synthesize** the raw output into the final brief (this is the agent's
job, mirroring last30days' "scripts gather, agent synthesizes" split):
read [`references/ranking.md`](references/ranking.md) and
[`references/modes.md`](references/modes.md), then produce the brief.

## Pipeline (what to do)
1. **Resolve** β€” grok identifies key handles / subreddits / repos / hashtags internally (entity resolution).
2. **Gather** β€” `grokery.sh` queries all enabled sources in parallel.
3. **Dedup** β€” merge the same story across platforms into one cluster ([ranking.md](references/ranking.md)).
4. **Rank** β€” order by real engagement (likes, upvotes, views, $ volume), not SEO.
5. **Synthesize** β€” write a tight narrative with citations; surface genuinely witty/viral one-liners verbatim ([modes.md](references/modes.md)).
6. **Emit** β€” markdown by default; `--html` β†’ self-contained dark brief ([html-brief.md](references/html-brief.md)).

## Modes & options (detail β†’ [references/modes.md](references/modes.md))
- **`A vs B vs C`** β€” run `grokery.sh` once per side, then compare side-by-side.
- **`--mode competitors`** β€” auto-discover top peers and run the comparison.
- **`--mode hiring`** / `--github-user <h>` β€” focus/career signals; person mode.
- **`--days N`**, **`--max N`**, **`--save-suffix`**, **`--store`** (SQLite trend log), **`--no-save`**.
- **`EXCLUDE_SOURCES=youtube,polymarket`** env to suppress sources.
- **`eli5`** β€” after a run, ask to rewrite the synthesis jargon-free.

## References (load on demand)
| File | When to read |
|---|---|
| [`references/sources.md`](references/sources.md) | Per-source detail, grok mapping, optional deps, honest gaps vs last30days |
| [`references/modes.md`](references/modes.md) | Comparison / competitors / hiring / person / eli5 recipes + synthesis & wit guidance |
| [`references/ranking.md`](references/ranking.md) | Cross-platform engagement normalization + dedup/clustering |
| [`references/html-brief.md`](references/html-brief.md) | HTML emit: `render-html.sh` or hand-craft from `brief-template.html` |

## Honest gaps vs last30days
- **Paid-only sources:** TikTok / Instagram / Pinterest / Threads **native** metrics and Digg's curated leaderboard need the paid ScrapeCreators API and are **out of scope** β€” grok's web/X pass surfaces mentions, not first-party engagement numbers.
- **Data fidelity trade-off:** last30days reads X/Reddit through deterministic API clients (exact counts). grokery reads them through the grok LLM, which is faster to set up but can **approximate or misreport** engagement numbers. Treat grok-sourced metrics as indicative, prefer the cited URL as ground truth, and spot-check any number you'll quote. The curl sources (HN / GitHub / Polymarket) are exact.

Everything else is at or near parity, with far less setup.
51 changes: 51 additions & 0 deletions skills/grokery/references/brief-template.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
<!DOCTYPE html>
<html lang="en"><head><meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>grokery β€” TOPIC</title>
<!--
grokery HTML brief template. Self-contained: inline CSS, no JS, no external
assets. Fill the placeholders (TOPIC, WINDOW, DATE, SOURCES) and the CONTENT
slot below, then save as the brief file. Keep it offline-ready.
-->
<style>
:root{
color-scheme:dark;
--bg:#000;--card:#16181c;--border:#2f3336;--text:#e7e9ea;--text2:#c8cdd2;--dim:#71767b;
--blue:#1d9bf0;--purple:#7856ff;--green:#00ba7c;
}
*{box-sizing:border-box}
body{margin:0;background:var(--bg);color:var(--text);
font:16px/1.6 -apple-system,BlinkMacSystemFont,"Segoe UI",Inter,Roboto,Helvetica,Arial,sans-serif;letter-spacing:-.003em}
.wrap{max-width:760px;margin:0 auto;padding:32px 20px 80px}
.badge{display:inline-block;font-size:12px;font-weight:800;letter-spacing:.08em;text-transform:uppercase;
color:#fff;background:linear-gradient(135deg,var(--blue),var(--purple));padding:5px 12px;border-radius:999px}
h1{font-size:30px;font-weight:850;letter-spacing:-.02em;margin:18px 0 4px}
.meta{color:var(--dim);font-size:13px;margin-bottom:8px}
.verdict{background:var(--card);border:1px solid var(--border);border-left:3px solid var(--blue);
border-radius:12px;padding:14px 16px;margin:18px 0;color:var(--text2)}
h2{font-size:21px;font-weight:800;margin:32px 0 6px;padding-bottom:6px;border-bottom:1px solid var(--border)}
h3{font-size:16px;font-weight:750;color:#7cc6f7;margin:20px 0 4px}
p,li{color:var(--text2)}
ul{margin:8px 0;padding-left:20px}li{margin:5px 0}
a{color:var(--blue);text-decoration:none}a:hover{text-decoration:underline}
strong{color:#f3f5f6}
code{font-family:ui-monospace,"JetBrains Mono",Menlo,Consolas,monospace;font-size:.86em;
background:var(--card);border:1px solid var(--border);border-radius:5px;padding:.05em .4em;color:#cfd9e0}
.bar{height:6px;border-radius:3px;background:linear-gradient(90deg,var(--blue),var(--purple));margin:2px 0 8px}
.foot{margin-top:40px;padding-top:16px;border-top:1px solid var(--border);color:var(--dim);font-size:13px}
@media print{body{background:#fff;color:#000}.verdict,code{background:#f4f4f4}a{color:#06c}}
</style></head>
<body><div class="wrap">
<span class="badge">grokery Β· signal brief</span>
<h1>TOPIC</h1>
<div class="meta">Window: last WINDOW days Β· DATE Β· sources: SOURCES</div>

<div class="verdict"><strong>Verdict β€”</strong> one-to-three-sentence dominant take + strongest counter-take.</div>

<!-- CONTENT: themes as <h2>, sub-points as <h3>/<ul>, citations as inline <a>,
engagement numbers in <strong>. Optional <div class="bar"></div> under a
heading to visualize relative engagement. -->

<!-- Footer: state which sources actually returned, e.g. "Sources: X, HN, GitHub, Polymarket". Do not claim sources that failed or were skipped. -->
<div class="foot">Generated by <code>grokery</code> β€” grok-powered cross-platform signal scan. Β· Ranked by engagement, not SEO. Β· Sources: SOURCES.</div>
</div></body></html>
28 changes: 28 additions & 0 deletions skills/grokery/references/html-brief.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# grokery HTML brief

Two ways to produce the shareable, self-contained, dark-mode brief
(`--html` / "give me an HTML brief" / "export as html"). Both are offline:
inline CSS, no JavaScript, system fonts, print-friendly.

## A. Deterministic (CLI) β€” `render-html.sh`
Write your synthesized markdown to a file, then convert:
```bash
bash skills/grokery/scripts/render-html.sh ~/Documents/Grokery/<slug>-synthesis.md \
--title 'grokery β€” <topic>' --out ~/Documents/Grokery/<slug>-brief.html
```
The script handles headings, bold/italic, links, autolinks (`<https://…>`),
bullets, code, and `---` rules, and wraps them in the styled shell with a badge
and the `βœ… All sources reported back.` footer.

## B. Hand-crafted (richer)
For a higher-touch brief (callouts, a verdict hero, simple inline-SVG bars for
engagement), copy [`brief-template.html`](brief-template.html) and fill the
`<!-- CONTENT -->` slot. Keep it self-contained: no external fonts, scripts, or
images. Reuse the template's CSS variables so it stays on-brand.

## Conventions
- **Filename:** `<slug>-brief.html` in the memory dir (default `~/Documents/Grokery/`).
- **Top:** badge β†’ topic `<h1>` β†’ metadata line (window, date, sources that reported).
- **Body:** the synthesis β€” themes as `<h2>`, citations as inline links, engagement numbers in `<strong>`.
- **Footer:** a one-line colophon naming grokery and "ranked by engagement, not SEO", plus the sources that **actually returned** (e.g. "Sources: X, HN, GitHub, Polymarket"). Never claim a source that failed or was skipped.
- Verify it opens offline (double-click) before declaring done.
41 changes: 41 additions & 0 deletions skills/grokery/references/modes.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# grokery modes & synthesis

## Synthesis (always)
After `grokery.sh` returns raw signal, write the brief:
- **Lead with the verdict** β€” 2–3 sentences: the dominant take + the strongest counter-take.
- **Group by theme**, not by platform. Each theme cites its strongest 1–2 sources with engagement numbers.
- **Quote wit verbatim.** Surface genuinely funny / viral one-liners β€” they carry signal and are why people read these. (last30days calls this "humor scoring".)
- **Numbers over adjectives** β€” "365K views Β· 117β™₯" beats "went viral".
- **Cite everything** β€” every claim links to a concrete URL.
- **Flag confidence** β€” call out when a take is one loud account vs broad consensus.

## Research (default)
Single topic. Run:
```bash
bash skills/grokery/scripts/grokery.sh "<topic>" --days 30
```

## Comparison β€” `A vs B [vs C]`
Detect `vs` in the request. Run the orchestrator **once per side**, then synthesize a side-by-side:
```bash
bash skills/grokery/scripts/grokery.sh "OpenClaw" --save-suffix cmp --days 30
bash skills/grokery/scripts/grokery.sh "Hermes" --save-suffix cmp --days 30
```
Compare on the axes people actually argue about (architecture, reliability, price, momentum) and include live GitHub stars per side.

## `--mode competitors`
Pass `--mode competitors`; grok names the top ~3 peers in its `### Competitors`
subsection. Then run a comparison pass on those names.

## `--mode hiring` / `--github-user <handle>` (person mode)
- `--mode hiring` adds a `### Hiring signals` subsection (open roles, careers-page shifts) β€” reveals where a person/company is focusing.
- `--github-user steipete` switches GitHub to person mode: recent PRs/pushes + top repos. Combine with the topic for a full "what is this person up to" brief.

## `eli5` (post-run)
If the user says `eli5 on`, rewrite the existing synthesis in plain language β€”
short sentences, no jargon, concrete analogies β€” without re-running sources.
`eli5 off` restores the standard brief.

## Persistence
- Snapshots auto-save to `~/Documents/Grokery/<slug>-raw.md` (override `--save-dir`, disable `--no-save`).
- `--store` appends the run to `grokery.sqlite3` for trend monitoring; diff successive `<slug>-raw.md` snapshots to see what changed since last time.
37 changes: 37 additions & 0 deletions skills/grokery/references/ranking.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# grokery ranking & dedup

The fetchers pre-sort within each source. Cross-source ranking and clustering is
the agent's job β€” engagement is the currency, not SEO.

## 1. Normalize engagement across platforms
Different platforms, different scales. Judge by **reach within a platform's norms**, not raw counts:

| Platform | Primary signal | "High signal" rule of thumb |
|---|---|---|
| X | likes + reposts + views | 4-figure+ likes, or high views relative to author size |
| Reddit | upvotes + comments | 3-figure+ upvotes, or top comment of a big thread |
| Hacker News | points + comments | 100+ pts; comment count β‰ˆ controversy |
| YouTube | views + recency | high views for the topic's niche |
| GitHub | stars + push recency | stars signal adoption; recent pushes signal momentum |
| Polymarket | $ volume (odds on event page) | high volume = real conviction; open the event link for the crowd's number |

Weight by **independence**: 5 unrelated accounts > 1 account quoted 5 times.

## 2. Dedup / cluster
Merge the same story across sources into one cluster:
- Same URL, or same event/claim described by multiple platforms β†’ one bullet, list the corroborating sources.
- Quote-reposts and reaction threads collapse into the original.
- A claim appearing on X **and** HN **and** Reddit is *stronger* β€” say so; don't list it three times.

## 3. Recency
Within the `--days` window, prefer fresher items on fast-moving topics; for
evergreen topics, let engagement dominate.

## 4. Confidence labels
- **Consensus** β€” corroborated across β‰₯3 independent sources/platforms.
- **Contested** β€” strong takes on both sides; present both.
- **Single loud voice** β€” one high-reach account; flag as not-yet-corroborated.

## 5. Final order
Lead with the highest-confidence, highest-engagement cluster. Bury low-signal
chatter or drop it. A short, sharp brief beats an exhaustive dump.
Loading