skill1ssue: Find the Right Skill
Autonomous multi-platform skill discovery. Check local skills and cache first, then launch parallel crawlers across git forges with stealth anti-bot protection. Deduplicate, rank, and present results in 5 contextual response modes.
Overview
| Input | Process | Output |
|---|---|---|
| User query (skill name or problem description) | Local check → cache check → parallel swarm search → dedup/rank | Categorized skill list with install commands |
8 Platforms: GitHub, GitLab, Codeberg, Gitea, Forgejo, Moltbook, Bitbucket, SourceHut
5 Response Modes: Quick Discovery, Structured Comparison, Domain Exploration, Deep Analysis, Zero-Result
Quick Start
# Search across all platforms (8 forges)
python3 scripts/swarm_orchestrator.py "pdf processing" --platforms all --max-workers 6
# Search with quality filters (min 10 stars, fetch descriptions)
python3 scripts/swarm_orchestrator.py "data viz" --min-stars 10 --fetch-descriptions --max-results 20
# Scrape a single platform
python3 scripts/platform_scraper.py github "data visualization"
# Scrape with license detection and star filter
python3 scripts/platform_scraper.py gitlab "api docs" --min-stars 5 --detect-license
# Check cached results
python3 scripts/state_manager.py --query "pdf processing"
# Cache management
python3 scripts/state_manager.py --stats # Show cache stats
python3 scripts/state_manager.py --prune --age-hours 48 # Remove stale entries
python3 scripts/state_manager.py --clear-cache # Clear all cache
# Dry run (show what would be searched)
python3 scripts/swarm_orchestrator.py "testing" --platforms all --dry-run
# Save results to file instead of stdout
python3 scripts/swarm_orchestrator.py "pdf processing" --platforms all --output results.json
# List supported platforms
python3 scripts/platform_scraper.py --list-platforms
python3 scripts/swarm_orchestrator.py --list-platforms
Example workflow:
User: "I need a skill that generates charts from CSV data"
→ Check local: ls /app/.agents/skills/ | grep -i chart
→ Check cache: python3 scripts/state_manager.py --query "chart csv"
→ Swarm search: python3 scripts/swarm_orchestrator.py "chart csv" --platforms all --min-stars 5
→ Deduplicate by full_name, rank by stars × weight × description_bonus × license_bonus
→ Present: Mode 1 (Quick) if 1-2 matches, Mode 2 (Comparison) if 3+
Architecture
User Query
|
├─> [Phase 0: Fast Path] ──Hit?──> Return immediately
| Local skills → Cache → Registry
| Miss?
├─> [Phase 1: Swarm] ──Parallel platform search
| GitHub + GitLab + Codeberg (Tier 1)
| Gitea + Forgejo + Moltbook (Tier 2, if needed)
| Bitbucket + SourceHut (Tier 3, if needed)
| Web search fallback (if all fail)
|
├─> [Phase 2: Fallback Chain] ──If swarm empty
| Web search → Browser visit → Repo download → Raw file probe
|
├─> [Phase 3: Processing]
| Deduplicate → Categorize → Rank → Cache → Present
|
└─> [Phase 4: Output] ──5 contextual modes
Skill Integration Points
| Skill | Phase | Trigger | Purpose |
|---|---|---|---|
/deep-research |
Pre-search | Vague query ("help with data") | Domain research to find precise keywords |
/weighted-scorer |
Post-rank | 3+ candidates with trade-offs | Decision matrix for final selection |
/playwright-scraper-skill |
Phase 1 | 403/Cloudflare error | Anti-bot scraping fallback |
/fast-browser-use |
Phase 2 | High-volume browsing needed | Rust-powered fast browsing |
Phase 0: Fast Path (Always First)
Check Local Skills
# Search built-in skills
ls /app/.agents/skills/ | grep -i <keyword>
# Search user skills
ls /app/.user/skills/ | grep -i <keyword>
If match found, read SKILL.md and present immediately. No search needed.
Check Cache
python3 scripts/state_manager.py --query "<keyword>"
Checks ~/.kimi/skill1ssue/result_cache.json with 24h TTL. On hit, return cached results.
Phase 1: Swarm Search (Parallel)
Tier 1 (Always)
| Platform | Weight | Command |
|---|---|---|
| GitHub | 1.0 | python3 scripts/platform_scraper.py github "<query>" |
| GitLab | 0.9 | python3 scripts/platform_scraper.py gitlab "<query>" |
| Codeberg | 0.85 | python3 scripts/platform_scraper.py codeberg "<query>" |
Tier 2 (If Tier 1 < 5 results)
| Platform | Weight | Condition |
|---|---|---|
| Gitea | 0.7 | Auto-launch if needed |
| Forgejo | 0.7 | Auto-launch if needed |
| Moltbook | 0.6 | Auto-launch if needed |
Tier 3 + Fallback (If Tier 2 < 3 results)
| Platform | Weight | Command |
|---|---|---|
| Bitbucket | 0.5 | python3 scripts/platform_scraper.py bitbucket "<query>" |
| SourceHut | 0.5 | python3 scripts/platform_scraper.py sourcehut "<query>" |
| Web search | 0.4 | Use web_search tool with site:github.com etc. |
Orchestrate All Tiers
# Full sweep (Tier 1-3 + fallback)
python3 scripts/swarm_orchestrator.py "<query>" --platforms all --max-workers 8
# Tier 1 only (fastest)
python3 scripts/swarm_orchestrator.py "<query>" --platforms github gitlab codeberg --max-workers 3
Anti-Bot Handling
| Error | Method | Command |
|---|---|---|
| 403/Cloudflare | Activate /playwright-scraper-skill |
Stealth browser with navigator.webdriver hidden |
| Dynamic JS | Activate /fast-browser-use |
Rust-powered rapid DOM extraction |
| Rate limit | Retry with backoff | Automatic (built into scraper) |
Note:
playwright-stealth.jsandplaywright-simple.jsare not bundled. Activate the/playwright-scraper-skillor/fast-browser-useskills when anti-bot protection is encountered. See Skill Integration Points above.
Phase 2: Fallback Chain
If swarm yields no results, try in order:
- Web search —
web_searchwithsite:github.com agent skill <query> - Browser visit —
browser_visitplatform search pages +browser_find - Download full repo —
curl -L -o skill.zip "https://github.com/{user}/{repo}/archive/main.zip" - Raw file probe (last resort) —
https://raw.githubusercontent.com/{user}/{repo}/main/SKILL.md
Phase 3: Result Processing
Ranking Formula
score = (stars + 1) × platform_weight × description_bonus × license_bonus
description_bonus = 1.3 if description present, else 1.0
license_bonus = 1.1 if license detected, else 1.0
Results are auto-cached by the orchestrator after each successful search (24h TTL). Use --no-cache to skip caching.
Deduplication
Merge by full_name (owner/repo). Keep entry with highest star count.
Caching
The swarm orchestrator auto-caches results after each successful search (24h TTL). Manual cache operations:
# Check if results were cached
python3 scripts/state_manager.py --query "<your search query>"
# Manually cache a results file
python3 scripts/state_manager.py --cache-results results.json
Cache stored at ~/.kimi/skill1ssue/result_cache.json with atomic writes and file locking for concurrent access safety.
Phase 4: Output (5 Response Modes)
Select mode by result count and query intent:
| Condition | Mode | Structure |
|---|---|---|
| 1-2 strong matches | Quick Discovery | Verdict + rationale + install steps |
| 3+ viable with trade-offs | Structured Comparison | Categorized matrix + scored ranking |
| 5+ broad results | Domain Exploration | Theme clusters + ecosystem map |
| Complex evaluation needed | Deep Analysis | Per-skill audit + trade-off analysis |
| No results | Zero-Result Response | Diagnostic + adjacent suggestions |
Mode 1: Quick Discovery (1-2 results)
## Recommendation: {skill-name}
**Verdict**: {skill-name} is the best match for "{query}".
**Why it fits**: {2-3 sentence rationale linking user's need to skill capabilities}
**Install**: Download the full repo:
```bash
curl -L -o skill.zip "{repo-zip-url}" && unzip -q skill.zip
Also found: {secondary skill} — worth considering if {specific condition}.
### Mode 2: Structured Comparison (3+ results)
Skill Comparison for "{query}"
Found {N} skills across {P} platforms. Organized by primary purpose:
{Category A} -- {description of what this category addresses}
| Skill | Platform | Stars | Maturity | Best For |
|---|---|---|---|---|
| {name} | GitHub ★{stars} | {high/med/low} | {one-line fit} | |
| {name} | GitLab ★{stars} | {high/med/low} | {one-line fit} |
{Category B} -- {description}
| Skill | Platform | Stars | Maturity | Best For |
|---|---|---|---|---|
| ... | ... | ... | ... | ... |
Head-to-Head: Top Candidates
Activate /weighted-scorer with criteria: Feature Fit, Ecosystem Maturity,
Maintenance Burden, License, Security Posture.
python3 /path/to/decision_matrix.py --json '{...}'
### Mode 3: Domain Exploration (5+ broad results)
{Domain} Skill Landscape
Found {N} skills across {P} platforms. The ecosystem has {observation}.
Core Capabilities
These handle the primary workflow:
- {skill} ({platform} ★{stars}) -- {what it does}. {why it stands out}
- {skill} ({platform} ★{stars}) -- {what it does}. {why it stands out}
Specialized / Niche
These address specific sub-problems:
- {skill} ({platform} ★{stars}) -- {narrow purpose}. Use when: {condition}
Emerging / Experimental
Lower maturity but worth watching:
- {skill} ({platform} ★{stars}) -- {promise}. Risk: {why not ready}
Ecosystem Notes
- Coverage gap: {what no skill addresses yet}
- Most active: {which skill has recent commits}
- Safest bet: {highest maturity + stars + description quality}
- Next step: Narrow query to one category, or use
/deep-research
### Mode 4: Deep Analysis (complex evaluation)
Skill Deep Analysis: "{query}"
Search Summary
- Platforms searched: {P} (health: {rates})
- Skills found: {N} (after dedup: {M})
- Cache status: {fresh/cached/stale}
Per-Skill Assessment
{Skill A} -- {platform} ★{stars}
| Dimension | Assessment | Evidence |
|---|---|---|
| Scope match | {strong/partial/weak} | {description alignment} |
| Maturity | {high/medium/low} | {stars, last update, commits} |
| Ecosystem | {rich/moderate/minimal} | {scripts, references, assets} |
| License | {open/restrictive/unknown} | {detected license} |
| Risk | {low/medium/high} | {bus factor, maintenance} |
Trade-off Analysis
| You want... | Choose... | But know... |
|---|---|---|
| {primary need} | {Skill X} | {trade-off} |
| {secondary need} | {Skill Y} | {trade-off} |
Recommendation
{clear verdict with confidence level and rationale}
Install
curl -L -o skill.zip "{repo-zip-url}" && unzip -q skill.zip
### Mode 5: Zero-Result Response
No Skills Found for "{query}"
Searched: {platforms}. Cache: {checked}. Registry: {queried}.
Why: {too niche? wrong keywords? new domain?}
Try:
- Rephrase: "{query}" → "{alternative}"
- Broaden: Search "{broader category}" instead
- Deep research: Activate
/deep-researchto map the domain - Create your own: Use
/skill-creator
### Response Rules (all modes)
1. Never output flat numbered lists — always categorize or compare
2. Every skill must have a one-line fit annotation
3. Show provenance: which platform, cached or fresh
4. Surface gaps: note what no skill addresses
5. End with concrete next step: install, compare, research, or create
## Persistent State
Managed by `scripts/state_manager.py`:
| File | Purpose | TTL |
|------|---------|-----|
| `~/.kimi/skill1ssue/search_history.json` | Last 500 queries | Permanent |
| `~/.kimi/skill1ssue/result_cache.json` | Cached results | 24h |
| `~/.kimi/skill1ssue/skill_registry.json` | All discovered skills | Permanent |
```python
from state_manager import StateManager
sm = StateManager()
# Cache management
stats = sm.cache_stats() # {"entries": 12, "total_results": 340, ...}
removed = sm.prune_cache(48) # Remove entries older than 48h
sm.clear_cache() # Clear all cached results
# Similar query lookup
similar = sm.get_similar_queries("current query")
Troubleshooting
| Problem | Cause | Fix |
|---|---|---|
| Swarm returns empty | All platforms rate-limited | Wait 60s, retry with --platforms github only |
| 403 on GitHub | IP flagged | Switch to --platforms gitlab codeberg or use stealth mode |
| Cache stale (>24h) | TTL expired | Use --query to check age; run fresh search if needed |
| Playwright not found | Node.js not installed | Use web search fallback (automatic in Phase 2) or activate /fast-browser-use |
| Results irrelevant | Query too broad | Add domain terms: "{broad} agent skill" or "{broad} SKILL.md" |
| Too many results | Query too generic | Add qualifiers: "{generic} python cli" or use --max-results N |
| Slow search | Too many platforms | Limit to Tier 1: --platforms github gitlab codeberg |
| No descriptions | Default behavior | Add --fetch-descriptions (slower, more data) |
| Want only quality skills | No filter set | Add --min-stars 10 to filter low-star repos |
| Cache growing large | Old entries accumulating | Run state_manager.py --prune --age-hours 48 |
| Need to start fresh | Corrupted cache | Run state_manager.py --clear-cache |
| Dry run before search | Uncertain what will be searched | Use swarm_orchestrator.py "query" --dry-run |
Edge Cases
Edge Case: All platforms down. Every scraper fails. Fall back to web search exclusively. Cache result as [status: degraded — web-only results].
Edge Case: Query matches 10+ skills. Switch to Mode 3 (Domain Exploration) automatically. Cluster by capability domain. Surface top 3 per cluster.
Edge Case: Skill has no description. Extracted from README or skip. Rank with description_bonus = 1.0 instead of 1.3. Flag as [description: inferred].
Edge Case: Private repository. Scraper returns 404. Skip silently. Do not expose existence of private repos.
Edge Case: Rate limit on all platforms. Back off exponentially: 30s → 60s → 120s. After 3 failures, return cached results with [status: stale — rate limited].
When NOT to Use
Decline or defer when:
- User wants to browse without a goal — skill discovery needs a problem or keyword, not idle browsing
- User asks for pirated/proprietary skills — only discover publicly available, open-source skills
- Query is for a specific skill already known — direct them to install instead of searching
- Network is completely unavailable — cache check still works, but fresh search is impossible
Confidence Calibration
- High: Phase 0 (local skills) — deterministic file system check
- High: Phase 1 (swarm) — reliable for popular skills on GitHub/GitLab
- Medium: Phase 2 (fallbacks) — web search quality varies
- Medium: Ranking formula — heuristic, not ground truth
- Low: Mode 4 (Deep Analysis) — requires judgment on skill quality
Iteration Guidance
After presenting results:
- User may refine query — re-run Phase 0 (cache) then Phase 1 if needed
- User may ask "which one?" — activate
/weighted-scorerfor structured comparison - User may want details on one skill — download full repo, read SKILL.md + bundled resources
- If no skill fits — offer
/deep-researchto map domain, then/skill-creatorto build one - Update cache with user feedback (relevant/irrelevant flags) to improve future rankings
Cache Management
The state manager stores data in ~/.kimi/skill1ssue/:
| Command | Purpose |
|---|---|
state_manager.py --stats |
Show cache size, entry count, oldest entry |
state_manager.py --prune --age-hours 48 |
Remove entries older than 48 hours |
state_manager.py --clear-cache |
Wipe all cached results |
state_manager.py --get-history |
View last 500 search queries |
state_manager.py --get-registry |
View discovered skills registry |
Cache TTL is 24 hours by default. Prune weekly to prevent bloat.
Script Reference
| Script | When to Use | Key Flags |
|---|---|---|
swarm_orchestrator.py |
Multi-platform parallel search | --platforms, --min-stars, --fetch-descriptions, --dry-run, --max-workers, --no-cache, --output |
platform_scraper.py |
Single-platform targeted scrape | --min-stars, --fetch-descriptions, --detect-license, --timeout, --quiet |
state_manager.py |
Cache ops, history, registry | --query, --cache-results, --stats, --prune, --clear-cache, --get-history, --get-registry |
Resources
- Script details (when to use each script, key flags): See
## Script Referenceabove - Platform details (URLs, anti-bot levels, rate limits, forge-specific gotchas):
references/platforms.md— load when configuring scraper for a new forge - Query patterns (templates by search intent, advanced operator syntax):
references/search_queries.md— load when user's query is vague and needs reformulation