aiden-runtime 3.19.5 → 3.19.7

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.
Files changed (107) hide show
  1. package/README.md +1 -1
  2. package/dist/api/server.js +24 -25
  3. package/dist/core/agentLoop.js +8 -6
  4. package/dist/core/aidenPersonality.js +20 -3
  5. package/dist/core/protectedContext.js +15 -2
  6. package/dist/core/skillLoader.js +2 -0
  7. package/dist/core/skillTeacher.js +18 -5
  8. package/dist/core/version.js +1 -1
  9. package/dist-bundle/cli.js +50 -18
  10. package/dist-bundle/index.js +73 -35
  11. package/package.json +2 -1
  12. package/scripts/postinstall.js +70 -1
  13. package/workspace-templates/HEARTBEAT.md +16 -0
  14. package/workspace-templates/SOUL.md +267 -0
  15. package/workspace-templates/STANDING_ORDERS.md +21 -0
  16. package/workspace-templates/permissions.yaml +180 -0
  17. package/workspace-templates/skills/architecture-diagram/SKILL.md +126 -0
  18. package/workspace-templates/skills/architecture-diagram/skill.json +25 -0
  19. package/workspace-templates/skills/arxiv/SKILL.md +124 -0
  20. package/workspace-templates/skills/arxiv/skill.json +26 -0
  21. package/workspace-templates/skills/ascii-art/SKILL.md +142 -0
  22. package/workspace-templates/skills/ascii-art/skill.json +26 -0
  23. package/workspace-templates/skills/blogwatcher/SKILL.md +147 -0
  24. package/workspace-templates/skills/blogwatcher/skill.json +26 -0
  25. package/workspace-templates/skills/censys/SKILL.md +104 -0
  26. package/workspace-templates/skills/censys/index.ts +133 -0
  27. package/workspace-templates/skills/censys/skill.json +25 -0
  28. package/workspace-templates/skills/clipboard-history/SKILL.md +101 -0
  29. package/workspace-templates/skills/clipboard-history/skill.json +23 -0
  30. package/workspace-templates/skills/crt-sh/SKILL.md +102 -0
  31. package/workspace-templates/skills/crt-sh/index.ts +59 -0
  32. package/workspace-templates/skills/crt-sh/skill.json +25 -0
  33. package/workspace-templates/skills/cveapi/SKILL.md +114 -0
  34. package/workspace-templates/skills/cveapi/index.ts +249 -0
  35. package/workspace-templates/skills/cveapi/skill.json +25 -0
  36. package/workspace-templates/skills/docker-management/SKILL.md +156 -0
  37. package/workspace-templates/skills/docker-management/skill.json +25 -0
  38. package/workspace-templates/skills/excalidraw/SKILL.md +148 -0
  39. package/workspace-templates/skills/excalidraw/skill.json +25 -0
  40. package/workspace-templates/skills/explainshell/SKILL.md +93 -0
  41. package/workspace-templates/skills/explainshell/index.ts +132 -0
  42. package/workspace-templates/skills/explainshell/skill.json +25 -0
  43. package/workspace-templates/skills/financial_research/SKILL.md +21 -0
  44. package/workspace-templates/skills/financial_research/skill.json +24 -0
  45. package/workspace-templates/skills/gif-search/SKILL.md +122 -0
  46. package/workspace-templates/skills/gif-search/skill.json +25 -0
  47. package/workspace-templates/skills/github-auth/SKILL.md +134 -0
  48. package/workspace-templates/skills/github-auth/skill.json +26 -0
  49. package/workspace-templates/skills/github-issues/SKILL.md +130 -0
  50. package/workspace-templates/skills/github-issues/skill.json +25 -0
  51. package/workspace-templates/skills/github-pr-workflow/SKILL.md +143 -0
  52. package/workspace-templates/skills/github-pr-workflow/skill.json +26 -0
  53. package/workspace-templates/skills/github-repo-management/SKILL.md +147 -0
  54. package/workspace-templates/skills/github-repo-management/skill.json +26 -0
  55. package/workspace-templates/skills/google-workspace/SKILL.md +110 -0
  56. package/workspace-templates/skills/google-workspace/skill.json +26 -0
  57. package/workspace-templates/skills/greynoise/SKILL.md +96 -0
  58. package/workspace-templates/skills/greynoise/index.ts +107 -0
  59. package/workspace-templates/skills/greynoise/skill.json +25 -0
  60. package/workspace-templates/skills/haveibeenpwned/SKILL.md +100 -0
  61. package/workspace-templates/skills/haveibeenpwned/index.ts +72 -0
  62. package/workspace-templates/skills/haveibeenpwned/skill.json +24 -0
  63. package/workspace-templates/skills/jupyter-live-kernel/SKILL.md +116 -0
  64. package/workspace-templates/skills/jupyter-live-kernel/skill.json +25 -0
  65. package/workspace-templates/skills/linear/SKILL.md +107 -0
  66. package/workspace-templates/skills/linear/skill.json +25 -0
  67. package/workspace-templates/skills/nano-pdf/SKILL.md +113 -0
  68. package/workspace-templates/skills/nano-pdf/skill.json +26 -0
  69. package/workspace-templates/skills/notion/SKILL.md +108 -0
  70. package/workspace-templates/skills/notion/skill.json +24 -0
  71. package/workspace-templates/skills/obsidian/SKILL.md +115 -0
  72. package/workspace-templates/skills/obsidian/skill.json +24 -0
  73. package/workspace-templates/skills/ocr-and-documents/SKILL.md +125 -0
  74. package/workspace-templates/skills/ocr-and-documents/skill.json +26 -0
  75. package/workspace-templates/skills/p5js/SKILL.md +163 -0
  76. package/workspace-templates/skills/p5js/skill.json +24 -0
  77. package/workspace-templates/skills/research-paper-writing/SKILL.md +158 -0
  78. package/workspace-templates/skills/research-paper-writing/skill.json +26 -0
  79. package/workspace-templates/skills/securityheaders/SKILL.md +99 -0
  80. package/workspace-templates/skills/securityheaders/index.ts +213 -0
  81. package/workspace-templates/skills/securityheaders/skill.json +26 -0
  82. package/workspace-templates/skills/shodan/SKILL.md +113 -0
  83. package/workspace-templates/skills/shodan/index.ts +94 -0
  84. package/workspace-templates/skills/shodan/skill.json +26 -0
  85. package/workspace-templates/skills/songsee/SKILL.md +152 -0
  86. package/workspace-templates/skills/songsee/skill.json +25 -0
  87. package/workspace-templates/skills/ssllabs/SKILL.md +107 -0
  88. package/workspace-templates/skills/ssllabs/index.ts +208 -0
  89. package/workspace-templates/skills/ssllabs/skill.json +27 -0
  90. package/workspace-templates/skills/stable-diffusion-image-generation/SKILL.md +136 -0
  91. package/workspace-templates/skills/stable-diffusion-image-generation/skill.json +24 -0
  92. package/workspace-templates/skills/systematic-debugging/SKILL.md +131 -0
  93. package/workspace-templates/skills/systematic-debugging/skill.json +25 -0
  94. package/workspace-templates/skills/test-driven-development/SKILL.md +164 -0
  95. package/workspace-templates/skills/test-driven-development/skill.json +25 -0
  96. package/workspace-templates/skills/urlscan/SKILL.md +118 -0
  97. package/workspace-templates/skills/urlscan/index.ts +94 -0
  98. package/workspace-templates/skills/urlscan/skill.json +24 -0
  99. package/workspace-templates/skills/virustotal/SKILL.md +120 -0
  100. package/workspace-templates/skills/virustotal/index.ts +124 -0
  101. package/workspace-templates/skills/virustotal/skill.json +26 -0
  102. package/workspace-templates/skills/web_research/SKILL.md +18 -0
  103. package/workspace-templates/skills/web_research/skill.json +20 -0
  104. package/workspace-templates/skills/xitter/SKILL.md +148 -0
  105. package/workspace-templates/skills/xitter/skill.json +26 -0
  106. package/workspace-templates/skills/youtube-content/SKILL.md +121 -0
  107. package/workspace-templates/skills/youtube-content/skill.json +25 -0
@@ -0,0 +1,124 @@
1
+ ---
2
+ name: arxiv
3
+ description: Search, fetch, and download academic papers from arXiv using the public REST API — no API key required
4
+ category: research
5
+ version: 1.0.0
6
+ origin: aiden
7
+ license: Apache-2.0
8
+ tags: arxiv, research, papers, academic, ai, ml, science, pdf, preprint, citations
9
+ ---
10
+
11
+ # arXiv Paper Search and Download
12
+
13
+ Search and retrieve academic papers from arXiv using the free public REST API. No API key or authentication required.
14
+
15
+ ## When to Use
16
+
17
+ - User wants to find recent ML/AI/CS papers on a topic
18
+ - User wants to read the abstract of a specific paper
19
+ - User wants to download a paper PDF
20
+ - User wants to find papers by a specific author
21
+ - User wants to stay up-to-date on a research area
22
+
23
+ ## How to Use
24
+
25
+ ### 1. Search papers by keyword
26
+
27
+ The arXiv API uses Atom XML — parse with PowerShell or Python.
28
+
29
+ ```powershell
30
+ $query = [Uri]::EscapeDataString("attention mechanism transformer")
31
+ $url = "http://export.arxiv.org/api/query?search_query=all:$query&start=0&max_results=5&sortBy=lastUpdatedDate&sortOrder=descending"
32
+ $resp = Invoke-RestMethod -Uri $url
33
+ $resp.feed.entry | ForEach-Object {
34
+ [PSCustomObject]@{
35
+ Title = $_.title
36
+ Authors = ($_.author | ForEach-Object { $_.name }) -join ", "
37
+ Date = $_.published
38
+ Id = $_.id
39
+ }
40
+ } | Format-Table -AutoSize
41
+ ```
42
+
43
+ ### 2. Search by category (cs.AI, cs.LG, stat.ML, etc.)
44
+
45
+ ```powershell
46
+ $cat = "cs.LG"
47
+ $query = [Uri]::EscapeDataString("large language models")
48
+ $url = "http://export.arxiv.org/api/query?search_query=cat:$cat+AND+all:$query&max_results=10&sortBy=submittedDate&sortOrder=descending"
49
+ $resp = Invoke-RestMethod -Uri $url
50
+ $resp.feed.entry | Select-Object title, published
51
+ ```
52
+
53
+ ### 3. Fetch a specific paper by arXiv ID
54
+
55
+ ```powershell
56
+ $arxivId = "2305.17333" # from URL: arxiv.org/abs/2305.17333
57
+ $url = "http://export.arxiv.org/api/query?id_list=$arxivId"
58
+ $resp = Invoke-RestMethod -Uri $url
59
+ $entry = $resp.feed.entry
60
+ Write-Host "Title: " $entry.title
61
+ Write-Host "Authors: " (($entry.author | ForEach-Object { $_.name }) -join ", ")
62
+ Write-Host "Abstract:" $entry.summary
63
+ ```
64
+
65
+ ### 4. Download a paper PDF
66
+
67
+ ```powershell
68
+ $arxivId = "2305.17333"
69
+ $pdfUrl = "https://arxiv.org/pdf/$arxivId.pdf"
70
+ $outPath = "C:\Users\shiva\Downloads\paper_$arxivId.pdf"
71
+ Invoke-WebRequest -Uri $pdfUrl -OutFile $outPath
72
+ Write-Host "Downloaded to $outPath"
73
+ ```
74
+
75
+ ### 5. Search papers with Python
76
+
77
+ ```python
78
+ import urllib.request, urllib.parse, xml.etree.ElementTree as ET
79
+
80
+ def search_arxiv(query, max_results=5, category="cs.LG"):
81
+ params = urllib.parse.urlencode({
82
+ "search_query": f"cat:{category} AND all:{query}",
83
+ "max_results": max_results,
84
+ "sortBy": "submittedDate",
85
+ "sortOrder": "descending"
86
+ })
87
+ url = f"http://export.arxiv.org/api/query?{params}"
88
+ resp = urllib.request.urlopen(url).read()
89
+ root = ET.fromstring(resp)
90
+ ns = {"a": "http://www.w3.org/2005/Atom"}
91
+ for entry in root.findall("a:entry", ns):
92
+ print(entry.find("a:title", ns).text.strip())
93
+ print(entry.find("a:id", ns).text.strip())
94
+ print()
95
+
96
+ search_arxiv("chain of thought reasoning", max_results=5)
97
+ ```
98
+
99
+ ### 6. Find papers by author
100
+
101
+ ```powershell
102
+ $author = [Uri]::EscapeDataString("Andrej Karpathy")
103
+ $url = "http://export.arxiv.org/api/query?search_query=au:$author&max_results=10&sortBy=submittedDate&sortOrder=descending"
104
+ $resp = Invoke-RestMethod -Uri $url
105
+ $resp.feed.entry | Select-Object title, published | Format-Table
106
+ ```
107
+
108
+ ## Examples
109
+
110
+ **"Find the 5 most recent papers on retrieval-augmented generation"**
111
+ → Use step 2 with query `retrieval augmented generation` and category `cs.CL` or `cs.AI`.
112
+
113
+ **"Get me the abstract of paper 2305.17333"**
114
+ → Use step 3 with the arXiv ID.
115
+
116
+ **"Download the Attention Is All You Need paper"**
117
+ → arXiv ID is `1706.03762`. Use step 4 to download the PDF.
118
+
119
+ ## Cautions
120
+
121
+ - arXiv API rate limit is 3 requests per second — add a 1-second delay between calls for bulk operations
122
+ - Papers on arXiv are preprints and have not necessarily been peer-reviewed
123
+ - arXiv IDs changed format in 2007 — old IDs use `category/YYMMNNN` format; new ones use `YYMM.NNNNN`
124
+ - PDF download uses the standard `arxiv.org/pdf/<id>.pdf` URL — some papers have versioned PDFs at `arxiv.org/pdf/<id>v1.pdf`
@@ -0,0 +1,26 @@
1
+ {
2
+ "name": "arxiv",
3
+ "version": "1.0.0",
4
+ "description": "Search, fetch, and download academic papers from arXiv using the public REST API — no API key required",
5
+ "author": "aiden",
6
+ "license": "MIT",
7
+ "tools": [],
8
+ "trigger_phrases": [],
9
+ "compatible_agents": [
10
+ "aiden"
11
+ ],
12
+ "min_agent_version": "3.0.0",
13
+ "tags": [
14
+ "arxiv",
15
+ "research",
16
+ "papers",
17
+ "academic",
18
+ "ai",
19
+ "ml",
20
+ "science",
21
+ "pdf",
22
+ "preprint",
23
+ "citations"
24
+ ],
25
+ "created": "2026-04-27T17:11:39.176Z"
26
+ }
@@ -0,0 +1,142 @@
1
+ ---
2
+ name: ascii-art
3
+ description: Generate ASCII art text banners, box art, and decorative text using pyfiglet, cowsay, and boxes CLI tools
4
+ category: creative
5
+ version: 1.0.0
6
+ origin: aiden
7
+ license: Apache-2.0
8
+ tags: ascii, art, banner, text, figlet, cowsay, terminal, decoration, cli, creative
9
+ ---
10
+
11
+ # ASCII Art Generation
12
+
13
+ Create ASCII art text banners, speech bubbles, box decorations, and large display text using `pyfiglet`, `cowsay`, and `boxes` — all CLI/Python tools.
14
+
15
+ ## When to Use
16
+
17
+ - User wants a stylized text banner for a terminal script or README
18
+ - User wants a fun cowsay/fortune-style message
19
+ - User wants decorative box borders around text
20
+ - User wants large ASCII letters for display purposes
21
+ - User wants ASCII art for CLI tool headers or splash screens
22
+
23
+ ## How to Use
24
+
25
+ ### 1. Install tools
26
+
27
+ ```powershell
28
+ pip install pyfiglet
29
+ pip install cowsay
30
+
31
+ # boxes (optional, for border art)
32
+ # Windows: winget install info-zip.unzip # then download boxes binary
33
+ ```
34
+
35
+ ### 2. Generate a text banner with pyfiglet
36
+
37
+ ```python
38
+ import pyfiglet
39
+
40
+ # Default font (Standard)
41
+ print(pyfiglet.figlet_format("Hello World"))
42
+
43
+ # Specific font
44
+ print(pyfiglet.figlet_format("DevOS", font="banner3-D"))
45
+
46
+ # List all available fonts
47
+ fonts = pyfiglet.FigletFont.getFonts()
48
+ print(f"Available fonts: {len(fonts)}")
49
+ print(fonts[:20])
50
+ ```
51
+
52
+ ### 3. Sample popular pyfiglet fonts
53
+
54
+ ```python
55
+ import pyfiglet
56
+
57
+ text = "AIDEN"
58
+ for font in ["banner3", "big", "block", "colossal", "doom", "epic", "isometric1", "larry3d", "ogre", "slant", "speed", "starwars"]:
59
+ print(f"\n--- {font} ---")
60
+ print(pyfiglet.figlet_format(text, font=font))
61
+ ```
62
+
63
+ ### 4. Generate cowsay messages
64
+
65
+ ```python
66
+ import cowsay
67
+
68
+ # Default cow
69
+ cowsay.cow("Hello from Aiden!")
70
+
71
+ # Different characters
72
+ cowsay.tux("Linux penguin says hi")
73
+ cowsay.dragon("Deploy to production!")
74
+ cowsay.cheese("It is time to cheese")
75
+
76
+ # List available characters
77
+ print(cowsay.char_names)
78
+ ```
79
+
80
+ ### 5. Create a custom cowsay-style speech bubble
81
+
82
+ ```python
83
+ def speech_bubble(text, speaker="Aiden"):
84
+ width = max(len(line) for line in text.split("\n")) + 4
85
+ border = "─" * width
86
+ lines = [f"│ {line.ljust(width-2)} │" for line in text.split("\n")]
87
+ bubble = [f"┌{border}┐"] + lines + [f"└{border}┘"]
88
+ bubble.append(f" {speaker}")
89
+ print("\n".join(bubble))
90
+
91
+ speech_bubble("Task complete.\n3 files created.\nAll tests passing.", speaker="🤖 Aiden")
92
+ ```
93
+
94
+ ### 6. Create ASCII box borders
95
+
96
+ ```python
97
+ def boxed(text, style="double"):
98
+ styles = {
99
+ "single": ("┌","─","┐","│","└","┘"),
100
+ "double": ("╔","═","╗","║","╚","╝"),
101
+ "round": ("╭","─","╮","│","╰","╯"),
102
+ }
103
+ tl,h,tr,v,bl,br = styles.get(style, styles["single"])
104
+ lines = text.split("\n")
105
+ width = max(len(l) for l in lines) + 2
106
+ border = h * width
107
+ print(f"{tl}{border}{tr}")
108
+ for line in lines:
109
+ print(f"{v} {line.ljust(width-1)}{v}")
110
+ print(f"{bl}{border}{br}")
111
+
112
+ boxed("System Status: OK\nUptime: 99.9%\nTasks: 0 pending", style="double")
113
+ ```
114
+
115
+ ### 7. Color the output
116
+
117
+ ```python
118
+ import pyfiglet
119
+
120
+ CYAN = "\033[96m"
121
+ RESET = "\033[0m"
122
+ banner = pyfiglet.figlet_format("DEVOS", font="slant")
123
+ print(CYAN + banner + RESET)
124
+ ```
125
+
126
+ ## Examples
127
+
128
+ **"Create a banner saying 'AIDEN' for the CLI startup screen"**
129
+ → Use step 2 with font `slant` or `doom`, then step 7 to add cyan color.
130
+
131
+ **"Make a cowsay message that says 'Deployment successful'"**
132
+ → Use step 4: `cowsay.tux("Deployment successful!")`.
133
+
134
+ **"Add a decorative box around my summary output"**
135
+ → Use step 6 with `style="double"` for a professional-looking double-line box.
136
+
137
+ ## Cautions
138
+
139
+ - pyfiglet output width depends on font — some fonts produce very wide output; use short text (< 12 chars) for block fonts
140
+ - Terminal color codes (ANSI) may not render correctly in all terminals — test before using in production scripts
141
+ - cowsay requires `pip install cowsay` (Python port) — the Unix `cowsay` binary is separate
142
+ - Some pyfiglet fonts are available only if `pyfiglet[all]` is installed — run `pip install pyfiglet[all]` for the full set
@@ -0,0 +1,26 @@
1
+ {
2
+ "name": "ascii-art",
3
+ "version": "1.0.0",
4
+ "description": "Generate ASCII art text banners, box art, and decorative text using pyfiglet, cowsay, and boxes CLI tools",
5
+ "author": "aiden",
6
+ "license": "MIT",
7
+ "tools": [],
8
+ "trigger_phrases": [],
9
+ "compatible_agents": [
10
+ "aiden"
11
+ ],
12
+ "min_agent_version": "3.0.0",
13
+ "tags": [
14
+ "ascii",
15
+ "art",
16
+ "banner",
17
+ "text",
18
+ "figlet",
19
+ "cowsay",
20
+ "terminal",
21
+ "decoration",
22
+ "cli",
23
+ "creative"
24
+ ],
25
+ "created": "2026-04-27T17:11:39.195Z"
26
+ }
@@ -0,0 +1,147 @@
1
+ ---
2
+ name: blogwatcher
3
+ description: Monitor RSS and Atom feeds for new posts from blogs, news sites, and podcasts using Python feedparser
4
+ category: research
5
+ version: 1.0.0
6
+ origin: aiden
7
+ license: Apache-2.0
8
+ tags: rss, atom, feed, blog, news, monitor, feedparser, podcast, updates, aggregation
9
+ ---
10
+
11
+ # Blog and Feed Watcher
12
+
13
+ Monitor RSS and Atom feeds from blogs, news sites, and podcasts to track new posts. Uses the `feedparser` Python library — no API keys required for most feeds.
14
+
15
+ ## When to Use
16
+
17
+ - User wants to check for new posts from specific blogs or news sites
18
+ - User wants to aggregate headlines from multiple sources
19
+ - User wants to monitor a research blog or tech feed for updates
20
+ - User wants to read the latest posts from a site that has an RSS feed
21
+ - User wants to set up periodic feed monitoring
22
+
23
+ ## How to Use
24
+
25
+ ### 1. Install feedparser
26
+
27
+ ```powershell
28
+ pip install feedparser
29
+ ```
30
+
31
+ ### 2. Read a single RSS/Atom feed
32
+
33
+ ```python
34
+ import feedparser
35
+ from datetime import datetime
36
+
37
+ feed = feedparser.parse("https://news.ycombinator.com/rss")
38
+ print(f"Feed: {feed.feed.title}")
39
+ print(f"Posts: {len(feed.entries)}\n")
40
+
41
+ for entry in feed.entries[:5]:
42
+ title = entry.get("title", "No title")
43
+ link = entry.get("link", "")
44
+ date = entry.get("published", "Unknown date")
45
+ print(f"• {title}\n {link}\n {date}\n")
46
+ ```
47
+
48
+ ### 3. Monitor multiple feeds
49
+
50
+ ```python
51
+ import feedparser, time
52
+
53
+ FEEDS = [
54
+ "https://feeds.feedburner.com/oreilly/radar",
55
+ "https://blog.openai.com/rss/",
56
+ "https://news.ycombinator.com/rss",
57
+ "https://simonwillison.net/atom/everything/",
58
+ ]
59
+
60
+ def fetch_all(feeds, max_per_feed=5):
61
+ results = []
62
+ for url in feeds:
63
+ feed = feedparser.parse(url)
64
+ for entry in feed.entries[:max_per_feed]:
65
+ results.append({
66
+ "source": feed.feed.get("title", url),
67
+ "title": entry.get("title", ""),
68
+ "link": entry.get("link", ""),
69
+ "published": entry.get("published", ""),
70
+ })
71
+ return sorted(results, key=lambda x: x["published"], reverse=True)
72
+
73
+ for item in fetch_all(FEEDS):
74
+ print(f"[{item['source']}] {item['title']}\n {item['link']}")
75
+ ```
76
+
77
+ ### 4. Filter posts by keyword
78
+
79
+ ```python
80
+ import feedparser
81
+
82
+ def search_feed(url, keyword):
83
+ feed = feedparser.parse(url)
84
+ keyword = keyword.lower()
85
+ matches = [
86
+ e for e in feed.entries
87
+ if keyword in e.get("title","").lower() or keyword in e.get("summary","").lower()
88
+ ]
89
+ for e in matches:
90
+ print(f"• {e.title}\n {e.link}\n")
91
+
92
+ search_feed("https://news.ycombinator.com/rss", "llm")
93
+ ```
94
+
95
+ ### 5. Find the RSS feed URL for a site
96
+
97
+ Common RSS URL patterns:
98
+ ```
99
+ https://site.com/feed
100
+ https://site.com/rss
101
+ https://site.com/feed.xml
102
+ https://site.com/atom.xml
103
+ https://site.com/blog/feed
104
+ ```
105
+
106
+ ```python
107
+ import feedparser, requests
108
+ from bs4 import BeautifulSoup # pip install beautifulsoup4
109
+
110
+ def find_feed(site_url):
111
+ resp = requests.get(site_url, timeout=10, headers={"User-Agent": "Mozilla/5.0"})
112
+ soup = BeautifulSoup(resp.text, "html.parser")
113
+ for tag in soup.find_all("link", type=lambda t: t and "rss" in t or "atom" in t):
114
+ print(tag.get("href"))
115
+
116
+ find_feed("https://simonwillison.net")
117
+ ```
118
+
119
+ ### 6. Save latest posts to a file
120
+
121
+ ```python
122
+ import feedparser, json
123
+
124
+ feed = feedparser.parse("https://news.ycombinator.com/rss")
125
+ posts = [{"title": e.title, "link": e.link, "date": e.get("published","")} for e in feed.entries[:20]]
126
+ with open("hn_feed.json", "w") as f:
127
+ json.dump(posts, f, indent=2)
128
+ print(f"Saved {len(posts)} posts to hn_feed.json")
129
+ ```
130
+
131
+ ## Examples
132
+
133
+ **"What are the latest posts from Hacker News?"**
134
+ → Use step 2 with `https://news.ycombinator.com/rss`.
135
+
136
+ **"Monitor these 4 AI blogs and show me posts about agents from the last week"**
137
+ → Use step 3 to fetch all, then step 4 logic to filter for `agent` keyword.
138
+
139
+ **"Does this blog have an RSS feed? If so, get the latest 5 posts"**
140
+ → Use step 5 to discover the feed URL, then step 2 to fetch posts.
141
+
142
+ ## Cautions
143
+
144
+ - Some sites block RSS scrapers — use a browser-like `User-Agent` header if getting 403 errors
145
+ - feedparser handles both RSS 2.0, RSS 1.0, and Atom — no need to distinguish them
146
+ - `entry.published` format varies by feed — some use RFC 2822, others ISO 8601; don't assume a format
147
+ - Very active feeds (e.g. Reddit) may return 100+ entries — always use slicing (`[:n]`) to limit output
@@ -0,0 +1,26 @@
1
+ {
2
+ "name": "blogwatcher",
3
+ "version": "1.0.0",
4
+ "description": "Monitor RSS and Atom feeds for new posts from blogs, news sites, and podcasts using Python feedparser",
5
+ "author": "aiden",
6
+ "license": "MIT",
7
+ "tools": [],
8
+ "trigger_phrases": [],
9
+ "compatible_agents": [
10
+ "aiden"
11
+ ],
12
+ "min_agent_version": "3.0.0",
13
+ "tags": [
14
+ "rss",
15
+ "atom",
16
+ "feed",
17
+ "blog",
18
+ "news",
19
+ "monitor",
20
+ "feedparser",
21
+ "podcast",
22
+ "updates",
23
+ "aggregation"
24
+ ],
25
+ "created": "2026-04-27T17:11:39.230Z"
26
+ }
@@ -0,0 +1,104 @@
1
+ ---
2
+ name: censys
3
+ description: Search Censys for internet-exposed hosts, certificates, and services — host lookups, queries, and certificate analysis
4
+ category: security
5
+ version: 1.0.0
6
+ license: Apache-2.0
7
+ origin: aiden
8
+ tags: security, censys, osint, recon, ports, certificates, tls, asset-discovery, internet-scan
9
+ env_required:
10
+ - CENSYS_API_ID
11
+ - CENSYS_API_SECRET
12
+ ---
13
+
14
+ # Censys — Internet Asset Discovery
15
+
16
+ Censys continuously scans the public internet and indexes detailed metadata about every reachable host: open ports, running services, TLS certificates, and BGP routing information. Complementary to Shodan with different scanner vantage points and richer certificate data.
17
+
18
+ **Requires:** `CENSYS_API_ID` and `CENSYS_API_SECRET` — free tier at https://search.censys.io/register (0.4 req/sec, 250 queries/month).
19
+
20
+ ## When to Use
21
+
22
+ - Look up what Censys sees on a specific IP address
23
+ - Discover internet-exposed assets for a given organisation or ASN
24
+ - Investigate TLS certificates — find all hosts sharing a certificate or subject
25
+ - Security audit: verify which services are visible from the public internet
26
+ - User asks "what does Censys show for IP X", "find hosts with this certificate", "look up ASN exposure"
27
+
28
+ ## How to Use
29
+
30
+ ### Look up a specific host by IP
31
+
32
+ ```powershell
33
+ $ip = "8.8.8.8"
34
+ $id = $env:CENSYS_API_ID
35
+ $secret = $env:CENSYS_API_SECRET
36
+ $b64 = [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes("${id}:${secret}"))
37
+ $headers = @{ Authorization = "Basic $b64" }
38
+
39
+ $result = Invoke-RestMethod -Uri "https://search.censys.io/api/v2/hosts/$ip" -Headers $headers
40
+ $r = $result.result
41
+ Write-Host "IP: $($r.ip)"
42
+ Write-Host "AS: $($r.autonomous_system.name) (ASN $($r.autonomous_system.asn))"
43
+ Write-Host "Country: $($r.location.country)"
44
+ Write-Host "Open ports:"
45
+ $r.services | ForEach-Object {
46
+ Write-Host " $($_.port)/$($_.transport_protocol) — $($_.service_name)"
47
+ }
48
+ ```
49
+
50
+ ### Search with a query string
51
+
52
+ ```powershell
53
+ $query = "services.service_name: HTTP and location.country_code: IN"
54
+ $b64 = [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes("$($env:CENSYS_API_ID):$($env:CENSYS_API_SECRET)"))
55
+ $headers = @{ Authorization = "Basic $b64" }
56
+ $encoded = [Uri]::EscapeDataString($query)
57
+
58
+ $result = Invoke-RestMethod -Uri "https://search.censys.io/api/v2/hosts/search?q=$encoded" -Headers $headers
59
+ Write-Host "Total matches: $($result.result.total)"
60
+ $result.result.hits | Select-Object -First 10 | ForEach-Object {
61
+ Write-Host " $($_.ip) — $($_.autonomous_system.name) ($($_.location.country_name))"
62
+ }
63
+ ```
64
+
65
+ ### Look up a TLS certificate by SHA-256 fingerprint
66
+
67
+ ```powershell
68
+ $sha256 = "YOUR_CERT_SHA256_HERE"
69
+ $b64 = [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes("$($env:CENSYS_API_ID):$($env:CENSYS_API_SECRET)"))
70
+ $headers = @{ Authorization = "Basic $b64" }
71
+
72
+ $result = Invoke-RestMethod -Uri "https://search.censys.io/api/v2/certificates/$sha256" -Headers $headers
73
+ $parsed = $result.result.parsed
74
+ Write-Host "Subject: $($parsed.subject_dn)"
75
+ Write-Host "Issuer: $($parsed.issuer_dn)"
76
+ Write-Host "Valid: $($parsed.validity.start) → $($parsed.validity.end)"
77
+ Write-Host "SANs: $($parsed.names_from_san -join ', ')"
78
+ ```
79
+
80
+ ## Examples
81
+
82
+ **"What is exposed on IP 1.2.3.4?"**
83
+ → Host lookup: returns open ports, service names, ASN, and location.
84
+
85
+ **"Find all exposed Redis servers in Germany"**
86
+ → Query: `services.service_name: REDIS and location.country_code: DE`
87
+
88
+ **"Who else uses this TLS certificate?"**
89
+ → Certificate lookup by SHA-256 fingerprint — shows SAN names and validity.
90
+
91
+ **"Show me all hosts in ASN 15169"**
92
+ → Query: `autonomous_system.asn: 15169`
93
+
94
+ ## Cautions
95
+
96
+ - Free tier: 250 queries/month, 0.4 req/sec — pace bulk operations with `Start-Sleep -Milliseconds 2500`
97
+ - Censys data reflects last scan date — real-time state may differ
98
+ - Host lookup counts against your monthly quota
99
+ - Certificate search may return expired or revoked certs — check validity dates
100
+ - Never use Censys results to attempt unauthorised access; recon and awareness only
101
+
102
+ ## Requirements
103
+
104
+ - `CENSYS_API_ID` and `CENSYS_API_SECRET` — free account at https://search.censys.io/register