From domain-intel
Use when the user says 'intel', 'briefing', 'what's new', 'intel status', 'intel setup', 'intel config', or asks a question about collected domain insights. Single human-facing entry point for domain intelligence: status, briefings, Q&A, configuration, and exploration.
npx claudepluginhub n0rvyn/indie-toolkit --plugin domain-intelThis skill uses the workspace's default tool permissions.
The interactive entry point for domain-intel. Routes user requests to the appropriate action. Runs as haiku for fast routing; dispatches sonnet agents when deep analysis is needed.
Provides UI/UX resources: 50+ styles, color palettes, font pairings, guidelines, charts for web/mobile across React, Next.js, Vue, Svelte, Tailwind, React Native, Flutter. Aids planning, building, reviewing interfaces.
Fetches up-to-date documentation from Context7 for libraries and frameworks like React, Next.js, Prisma. Use for setup questions, API references, and code examples.
Builds 3-5 year financial models for startups with cohort revenue projections, cost structures, cash flow, headcount plans, burn rate, runway, and scenario analysis.
The interactive entry point for domain-intel. Routes user requests to the appropriate action. Runs as haiku for fast routing; dispatches sonnet agents when deep analysis is needed.
Bash(command="pwd")
Store the result as WD. All file paths in this skill are relative to WD — prefix every ./ path with {WD}/ when calling Read, Write, Glob, or Grep. Bash commands can use relative paths as-is.
Read {WD}/config.yaml.
[domain-intel] Not initialized. Run /intel setup in this directory. → stopClassify the user's input:
| Intent | Trigger Patterns | Requires config |
|---|---|---|
| help | "help", "/intel help", "how to use", "what can you do" | No |
| setup | "setup", "configure", "init", first run | No |
| status | no args, "status", "what's new" | Yes |
| briefing | "brief", "briefing", "brief me", "catch me up" | Yes |
| query | any question about a topic, "what about X", "tell me about X" | Yes |
| config | "config", "settings", "add source", "change keywords" | Yes |
| explore | an insight ID pattern (YYYY-MM-DD-source-NNN), "show me", "more about" | Yes |
| evolve | "evolve", "update lens", "evolve preferences", "update preferences" | Yes |
If config is required but {WD}/config.yaml does not exist → redirect to setup.
Output directly (no file reads needed):
[domain-intel] Help
Commands:
/intel setup — Initialize this directory as a domain-intel workspace
/intel — Show status (unread count, last scan)
/intel brief — Get a briefing on unread insights
/intel config — View or modify configuration
/intel evolve — Review and apply preference & source updates
/intel help — Show this help
/scan — Run the collection pipeline
/digest — Generate daily digest
/digest week — Generate weekly digest
Automation:
CronCreate(cron="47 8 * * *", prompt="cd {CWD} && /scan")
Note: cron jobs auto-expire after 3 days.
Sources:
GitHub — uses gh CLI API (auto-detected); falls back to web search
Product Hunt — optional, requires API credentials (/intel config to set up)
RSS, official changelogs, figures, companies — configured in setup
Concepts:
Directory = Profile — each initialized directory is a separate workspace
LENS.md — your interests, figures, and companies (evolves over time)
Insights — collected and analyzed intelligence in ./insights/
Evolution — /intel evolve reviews accumulated signals and suggests updates
→ stop
Guided first-time configuration.
Check if {WD}/config.yaml already exists:
/intel config to modify."Read templates from the plugin:
Read ${CLAUDE_PLUGIN_ROOT}/templates/default-config.yaml
Read ${CLAUDE_PLUGIN_ROOT}/templates/default-lens.md
Ask about domains to track (use AskUserQuestion with multiSelect):
Ask about additional RSS feeds (or accept defaults from template).
API source configuration
a. GitHub API check — run Bash(command="gh auth status 2>&1"):
GitHub API: ✓ authenticated via gh CLI (structured search, no scraping)GitHub API: ✗ gh CLI not authenticated — falling back to web search. For better results, run: gh auth loginb. Product Hunt — ask via AskUserQuestion:
Bash(command="python3 \"${CLAUDE_PLUGIN_ROOT}/scripts/fetch_producthunt.py\" --client-id \"<id>\" --client-secret \"<secret>\" --max-items 1 --timeout 15") (check exit code of the script directly; do NOT pipe to tail/grep which overrides the exit code)Product Hunt API: ✓ authenticatedProduct Hunt API: ✗ authentication failed — check credentials. You can update them later in config.yaml under sources.producthunt. Set enabled to true but keep the user's credentials (they may fix them later).https://www.producthunt.com/v2/oauth/applicationsGenerate {WD}/config.yaml from template with user selections (domains, sources, Product Hunt config from step 5b).
Create subdirectories:
mkdir -p ./insights ./digests ./trends ./briefings
Initialize state:
Write {WD}/state.yaml:
last_scan: "never"
total_insights: 0
total_scans: 0
Generate LENS.md — the user's information filtering profile.
a. For each selected domain, ask using AskUserQuestion:
url from the template (e.g., "OpenAI → https://openai.com — correct?"). If user corrects it, use their URL.b. Ask about the user's focus (free text via AskUserQuestion):
c. Generate {WD}/LENS.md using the template structure:
figures[] and companies[] from user selections (uncomment chosen entries, leave others commented)Output:
[domain-intel] Setup complete in {CWD}.
Domains: {domain names}
Sources:
GitHub: {✓ API | ✗ web search fallback}
Product Hunt: {✓ enabled | ✗ disabled | ⚠ enabled, credentials pending}
RSS feeds: {N}
Official sites: {N}
LENS: ./LENS.md (tracking {N} figures, {N} companies)
Next steps:
/scan — run your first collection
/intel evolve — review and update your preferences over time
Set up automated scanning with CronCreate:
CronCreate(cron="47 8 * * *", prompt="cd {CWD} && /scan")
Note: cron jobs auto-expire after 3 days.
Quick overview of current state.
Read {WD}/state.yaml
Count unread insights:
Grep(pattern="read: false", path="{WD}/insights/", output_mode="count")
Count total insight files this month:
Glob(pattern="{WD}/insights/{current_YYYY-MM}/*.md")
Output:
[domain-intel] Status
Last scan: {last_scan}
Total scans: {total_scans}
Unread insights: {N}
This month: {N} insights
Total all-time: {total_insights}
If unread > 0: append Use /intel brief for a briefing.
Synthesize unread insights into a briefing.
Find all unread insight files:
Grep(pattern="read: false", path="{WD}/insights/", output_mode="files_with_matches")
If count == 0: "No unread insights. Last scan: {date}. Run /scan to collect new data." → stop
If count > 150: sort files by filename (which encodes date) descending, take the most recent 150. Output: "Showing most recent 150 of {N} unread insights. Run /intel brief again for the rest."
Read the selected unread insight files (up to 150).
Find any convergence signal files from the same dates:
Grep(pattern="type: signal", path="{WD}/insights/", output_mode="files_with_matches")
Load previous trends (most recent file in {WD}/trends/).
Load LENS.md if it exists: read {WD}/LENS.md, extract body as lens_context.
Dispatch trend-synthesizer agent with:
Save trend snapshot for continuity (so future digests/briefings can track trend lifecycle):
Write trend snapshot to {WD}/trends/{today}-briefing-trends.md
Use the same format as digest Step 6 (date, range, trends, surprises).
Present the synthesis as a briefing (format like digest but labeled "Briefing").
Save briefing to {WD}/briefings/{YYYY-MM-DD}-briefing.md:
---
date: {YYYY-MM-DD}
insight_count: {N}
---
# Briefing — {YYYY-MM-DD}
> {headline}
## Trends
| Trend | Direction | Evidence |
|-------|-----------|----------|
{For each trend: | {name} | {direction} | {N} insights |}
{For each trend:}
### {name}
{summary}
## Surprises
{For each surprise:}
**{title}** — {why}
*Ref: {insight_id}*
## Collective Wisdom
{collective_wisdom}
---
*Insights briefed: {N} | Generated: {timestamp}*
read: true:Bash: sed -i.bak 's/^read: false$/read: true/' {space-separated list of file paths} && rm -f {same paths with .bak suffix}
Answer a specific question from accumulated intelligence.
Extract the query topic from user input. Generate 2-3 synonym/related terms for broader matching (e.g., "local AI models" → also search "on-device inference", "edge AI", "MLX").
Search insights for relevant content using each term:
Grep(pattern="{term}", path="{WD}/insights/", output_mode="files_with_matches", head_limit=20)
Also search trends:
Grep(pattern="{term}", path="{WD}/trends/", output_mode="files_with_matches", head_limit=5)
Merge and deduplicate file lists from all term searches.
If zero results across all searches: "No insights found matching '{query}'. Try broader terms, or run /scan to collect new data." → stop
Read matching files.
4.5. Load LENS.md if it exists: read {WD}/LENS.md, extract body as lens_context.
Dispatch trend-synthesizer agent with:
Present the query-directed synthesis, including:
Query signal: If the query topic is not reflected in LENS.md "Current Questions" and LENS.md exists, append a signal to {WD}/.lens-signals.yaml:
- date: YYYY-MM-DD
type: new-interest
value: "{query topic}"
evidence: ["user-query"]
This captures emergent interests for /intel evolve to surface later.
View or modify configuration.
Read and display current config from {WD}/config.yaml:
gh auth status 2>&1 and report authenticated or notIf user provided a modification request:
/intel evolve or open LENS.md path for manual editinggh auth status and report resultAfter modification: write updated config back to {WD}/config.yaml.
Confirm the change: "Updated: {description of change}"
Deep dive into a specific insight.
Parse the insight ID from input (pattern: YYYY-MM-DD-source-NNN)
Find the file:
Grep(pattern="id: {id}", path="{WD}/insights/", output_mode="files_with_matches")
If not found: "Insight {id} not found." → stop
Read and display the full insight file.
Find related insights (same tags or category):
Grep(pattern="{tag}", path="{WD}/insights/", output_mode="files_with_matches", head_limit=5)
If related insights found: Read their titles and significance. Output:
Related insights:
- {id}: {title} (significance: {N})
- {id}: {title} (significance: {N})
Mark the explored insight as read: true if it wasn't already.
Review and apply evolution proposals for both LENS.md and config.yaml.
Check prerequisites:
{WD}/LENS.md must exist → if not: "No LENS.md found. Run /intel setup first." → stop{WD}/LENS.md{WD}/config.yamlRead {WD}/.lens-signals.yaml:
Group signals by type and deduplicate (same value across multiple dates → merge, keep all evidence IDs).
For each signal group, present using AskUserQuestion:
LENS signals:
new-interest signals:
new-figure signals:
blog_urlnew-company signals:
url and paths[] (suggest common patterns like /blog, /news)Source signals:
suggest-rss signals:
suggest-official-path signals:
suggest-domain signals:
Apply approved changes:
figures[]companies[]{name: auto-detected, url: value} to sources.rss[]paths[]{name: value} to domains[]Clear processed signals from {WD}/.lens-signals.yaml (remove entries that were presented, whether approved or skipped).
Output:
[domain-intel] Profile updated.
LENS:
Added interests: {N}
Added figures: {N}
Added companies: {N}
Sources:
Added RSS feeds: {N}
Added official paths: {N}
Added domains: {N}
Skipped: {N}
Remaining signals: {N}