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.
- package/README.md +1 -1
- package/dist/api/server.js +24 -25
- package/dist/core/agentLoop.js +8 -6
- package/dist/core/aidenPersonality.js +20 -3
- package/dist/core/protectedContext.js +15 -2
- package/dist/core/skillLoader.js +2 -0
- package/dist/core/skillTeacher.js +18 -5
- package/dist/core/version.js +1 -1
- package/dist-bundle/cli.js +50 -18
- package/dist-bundle/index.js +73 -35
- package/package.json +2 -1
- package/scripts/postinstall.js +70 -1
- package/workspace-templates/HEARTBEAT.md +16 -0
- package/workspace-templates/SOUL.md +267 -0
- package/workspace-templates/STANDING_ORDERS.md +21 -0
- package/workspace-templates/permissions.yaml +180 -0
- package/workspace-templates/skills/architecture-diagram/SKILL.md +126 -0
- package/workspace-templates/skills/architecture-diagram/skill.json +25 -0
- package/workspace-templates/skills/arxiv/SKILL.md +124 -0
- package/workspace-templates/skills/arxiv/skill.json +26 -0
- package/workspace-templates/skills/ascii-art/SKILL.md +142 -0
- package/workspace-templates/skills/ascii-art/skill.json +26 -0
- package/workspace-templates/skills/blogwatcher/SKILL.md +147 -0
- package/workspace-templates/skills/blogwatcher/skill.json +26 -0
- package/workspace-templates/skills/censys/SKILL.md +104 -0
- package/workspace-templates/skills/censys/index.ts +133 -0
- package/workspace-templates/skills/censys/skill.json +25 -0
- package/workspace-templates/skills/clipboard-history/SKILL.md +101 -0
- package/workspace-templates/skills/clipboard-history/skill.json +23 -0
- package/workspace-templates/skills/crt-sh/SKILL.md +102 -0
- package/workspace-templates/skills/crt-sh/index.ts +59 -0
- package/workspace-templates/skills/crt-sh/skill.json +25 -0
- package/workspace-templates/skills/cveapi/SKILL.md +114 -0
- package/workspace-templates/skills/cveapi/index.ts +249 -0
- package/workspace-templates/skills/cveapi/skill.json +25 -0
- package/workspace-templates/skills/docker-management/SKILL.md +156 -0
- package/workspace-templates/skills/docker-management/skill.json +25 -0
- package/workspace-templates/skills/excalidraw/SKILL.md +148 -0
- package/workspace-templates/skills/excalidraw/skill.json +25 -0
- package/workspace-templates/skills/explainshell/SKILL.md +93 -0
- package/workspace-templates/skills/explainshell/index.ts +132 -0
- package/workspace-templates/skills/explainshell/skill.json +25 -0
- package/workspace-templates/skills/financial_research/SKILL.md +21 -0
- package/workspace-templates/skills/financial_research/skill.json +24 -0
- package/workspace-templates/skills/gif-search/SKILL.md +122 -0
- package/workspace-templates/skills/gif-search/skill.json +25 -0
- package/workspace-templates/skills/github-auth/SKILL.md +134 -0
- package/workspace-templates/skills/github-auth/skill.json +26 -0
- package/workspace-templates/skills/github-issues/SKILL.md +130 -0
- package/workspace-templates/skills/github-issues/skill.json +25 -0
- package/workspace-templates/skills/github-pr-workflow/SKILL.md +143 -0
- package/workspace-templates/skills/github-pr-workflow/skill.json +26 -0
- package/workspace-templates/skills/github-repo-management/SKILL.md +147 -0
- package/workspace-templates/skills/github-repo-management/skill.json +26 -0
- package/workspace-templates/skills/google-workspace/SKILL.md +110 -0
- package/workspace-templates/skills/google-workspace/skill.json +26 -0
- package/workspace-templates/skills/greynoise/SKILL.md +96 -0
- package/workspace-templates/skills/greynoise/index.ts +107 -0
- package/workspace-templates/skills/greynoise/skill.json +25 -0
- package/workspace-templates/skills/haveibeenpwned/SKILL.md +100 -0
- package/workspace-templates/skills/haveibeenpwned/index.ts +72 -0
- package/workspace-templates/skills/haveibeenpwned/skill.json +24 -0
- package/workspace-templates/skills/jupyter-live-kernel/SKILL.md +116 -0
- package/workspace-templates/skills/jupyter-live-kernel/skill.json +25 -0
- package/workspace-templates/skills/linear/SKILL.md +107 -0
- package/workspace-templates/skills/linear/skill.json +25 -0
- package/workspace-templates/skills/nano-pdf/SKILL.md +113 -0
- package/workspace-templates/skills/nano-pdf/skill.json +26 -0
- package/workspace-templates/skills/notion/SKILL.md +108 -0
- package/workspace-templates/skills/notion/skill.json +24 -0
- package/workspace-templates/skills/obsidian/SKILL.md +115 -0
- package/workspace-templates/skills/obsidian/skill.json +24 -0
- package/workspace-templates/skills/ocr-and-documents/SKILL.md +125 -0
- package/workspace-templates/skills/ocr-and-documents/skill.json +26 -0
- package/workspace-templates/skills/p5js/SKILL.md +163 -0
- package/workspace-templates/skills/p5js/skill.json +24 -0
- package/workspace-templates/skills/research-paper-writing/SKILL.md +158 -0
- package/workspace-templates/skills/research-paper-writing/skill.json +26 -0
- package/workspace-templates/skills/securityheaders/SKILL.md +99 -0
- package/workspace-templates/skills/securityheaders/index.ts +213 -0
- package/workspace-templates/skills/securityheaders/skill.json +26 -0
- package/workspace-templates/skills/shodan/SKILL.md +113 -0
- package/workspace-templates/skills/shodan/index.ts +94 -0
- package/workspace-templates/skills/shodan/skill.json +26 -0
- package/workspace-templates/skills/songsee/SKILL.md +152 -0
- package/workspace-templates/skills/songsee/skill.json +25 -0
- package/workspace-templates/skills/ssllabs/SKILL.md +107 -0
- package/workspace-templates/skills/ssllabs/index.ts +208 -0
- package/workspace-templates/skills/ssllabs/skill.json +27 -0
- package/workspace-templates/skills/stable-diffusion-image-generation/SKILL.md +136 -0
- package/workspace-templates/skills/stable-diffusion-image-generation/skill.json +24 -0
- package/workspace-templates/skills/systematic-debugging/SKILL.md +131 -0
- package/workspace-templates/skills/systematic-debugging/skill.json +25 -0
- package/workspace-templates/skills/test-driven-development/SKILL.md +164 -0
- package/workspace-templates/skills/test-driven-development/skill.json +25 -0
- package/workspace-templates/skills/urlscan/SKILL.md +118 -0
- package/workspace-templates/skills/urlscan/index.ts +94 -0
- package/workspace-templates/skills/urlscan/skill.json +24 -0
- package/workspace-templates/skills/virustotal/SKILL.md +120 -0
- package/workspace-templates/skills/virustotal/index.ts +124 -0
- package/workspace-templates/skills/virustotal/skill.json +26 -0
- package/workspace-templates/skills/web_research/SKILL.md +18 -0
- package/workspace-templates/skills/web_research/skill.json +20 -0
- package/workspace-templates/skills/xitter/SKILL.md +148 -0
- package/workspace-templates/skills/xitter/skill.json +26 -0
- package/workspace-templates/skills/youtube-content/SKILL.md +121 -0
- 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
|