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,25 @@
1
+ {
2
+ "name": "linear",
3
+ "version": "1.0.0",
4
+ "description": "Manage Linear issues, projects, and cycles via the Linear GraphQL API",
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
+ "linear",
15
+ "issues",
16
+ "project-management",
17
+ "graphql",
18
+ "engineering",
19
+ "sprint",
20
+ "cycle",
21
+ "team",
22
+ "tasks"
23
+ ],
24
+ "created": "2026-04-27T17:11:39.895Z"
25
+ }
@@ -0,0 +1,113 @@
1
+ ---
2
+ name: nano-pdf
3
+ description: Edit PDFs with natural-language instructions using the nano-pdf CLI tool
4
+ category: productivity
5
+ version: 1.0.0
6
+ origin: aiden
7
+ license: Apache-2.0
8
+ tags: pdf, edit, merge, split, compress, redact, nano-pdf, cli, document, watermark
9
+ ---
10
+
11
+ # nano-pdf — Natural-Language PDF Editing
12
+
13
+ Use the `nano-pdf` CLI to perform common PDF operations — merge, split, compress, add watermarks, redact text, and more — via simple natural-language or flag-based commands.
14
+
15
+ ## When to Use
16
+
17
+ - User wants to merge multiple PDFs into one
18
+ - User wants to split a PDF into individual pages or page ranges
19
+ - User wants to compress a large PDF to reduce file size
20
+ - User wants to add a watermark or page numbers to a PDF
21
+ - User wants to redact or remove specific pages
22
+
23
+ ## How to Use
24
+
25
+ ### 1. Install nano-pdf
26
+
27
+ ```powershell
28
+ pip install nano-pdf
29
+ # Verify installation
30
+ nano-pdf --version
31
+ ```
32
+
33
+ ### 2. Merge multiple PDFs
34
+
35
+ ```powershell
36
+ nano-pdf merge report1.pdf report2.pdf appendix.pdf --output merged.pdf
37
+ ```
38
+
39
+ ### 3. Split a PDF into individual pages
40
+
41
+ ```powershell
42
+ # Split every page into a separate file
43
+ nano-pdf split document.pdf --output ./pages/
44
+
45
+ # Split a specific range into a new file
46
+ nano-pdf split document.pdf --pages 1-5 --output extract.pdf
47
+ ```
48
+
49
+ ### 4. Compress a PDF
50
+
51
+ ```powershell
52
+ # Default compression
53
+ nano-pdf compress large_file.pdf --output compressed.pdf
54
+
55
+ # Aggressive compression (lower image quality)
56
+ nano-pdf compress large_file.pdf --level high --output compressed.pdf
57
+ ```
58
+
59
+ ### 5. Add a watermark
60
+
61
+ ```powershell
62
+ nano-pdf watermark input.pdf --text "CONFIDENTIAL" --output watermarked.pdf
63
+ # Custom font size and opacity
64
+ nano-pdf watermark input.pdf --text "DRAFT" --size 60 --opacity 0.3 --output draft.pdf
65
+ ```
66
+
67
+ ### 6. Add page numbers
68
+
69
+ ```powershell
70
+ nano-pdf number input.pdf --position bottom-right --output numbered.pdf
71
+ ```
72
+
73
+ ### 7. Remove specific pages
74
+
75
+ ```powershell
76
+ # Remove pages 3 and 7 from a 10-page PDF
77
+ nano-pdf remove input.pdf --pages 3,7 --output trimmed.pdf
78
+ ```
79
+
80
+ ### 8. Rotate pages
81
+
82
+ ```powershell
83
+ # Rotate all pages 90 degrees clockwise
84
+ nano-pdf rotate input.pdf --degrees 90 --output rotated.pdf
85
+
86
+ # Rotate only page 2
87
+ nano-pdf rotate input.pdf --degrees 180 --pages 2 --output rotated.pdf
88
+ ```
89
+
90
+ ### 9. Extract images from a PDF
91
+
92
+ ```powershell
93
+ nano-pdf extract-images input.pdf --output ./images/
94
+ ```
95
+
96
+ ## Examples
97
+
98
+ **"Merge contract.pdf and appendix.pdf into one file"**
99
+ → Use step 2: `nano-pdf merge contract.pdf appendix.pdf --output final_contract.pdf`
100
+
101
+ **"Compress this 50MB report so I can email it"**
102
+ → Use step 4 with `--level high` to aggressively reduce size.
103
+
104
+ **"Split the quarterly report — I only need pages 10 to 15"**
105
+ → Use step 3 with `--pages 10-15`.
106
+
107
+ ## Cautions
108
+
109
+ - nano-pdf preserves PDF/A compliance when the input is already PDF/A — check if needed for legal documents
110
+ - Aggressive compression (`--level high`) reduces image resolution — not suitable for print-quality output
111
+ - Encrypted or password-protected PDFs cannot be processed without first removing the password
112
+ - Very large PDFs (> 200 MB) may require chunked processing — split first, process, then merge
113
+ - nano-pdf is a Python package — confirm it is installed before use (`pip show nano-pdf`)
@@ -0,0 +1,26 @@
1
+ {
2
+ "name": "nano-pdf",
3
+ "version": "1.0.0",
4
+ "description": "Edit PDFs with natural-language instructions using the nano-pdf CLI tool",
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
+ "pdf",
15
+ "edit",
16
+ "merge",
17
+ "split",
18
+ "compress",
19
+ "redact",
20
+ "nano-pdf",
21
+ "cli",
22
+ "document",
23
+ "watermark"
24
+ ],
25
+ "created": "2026-04-27T17:11:39.938Z"
26
+ }
@@ -0,0 +1,108 @@
1
+ ---
2
+ name: notion
3
+ description: Read, create, and update Notion pages and databases via the Notion REST API
4
+ category: productivity
5
+ version: 1.0.0
6
+ origin: aiden
7
+ license: Apache-2.0
8
+ tags: notion, notes, database, pages, workspace, api, knowledge-base, tasks
9
+ ---
10
+
11
+ # Notion API Integration
12
+
13
+ Interact with Notion workspaces through the official REST API. Requires an Internal Integration token (`NOTION_TOKEN`) and pages/databases shared with that integration.
14
+
15
+ ## When to Use
16
+
17
+ - User wants to read content from a Notion page
18
+ - User wants to create a new page or database entry
19
+ - User wants to query a Notion database with filters
20
+ - User wants to append blocks to an existing page
21
+ - User wants to search across their Notion workspace
22
+
23
+ ## How to Use
24
+
25
+ ### 1. Set up the integration token
26
+
27
+ The user must create an Internal Integration at https://www.notion.so/my-integrations and share their pages/databases with it.
28
+
29
+ ```powershell
30
+ # Set token in session (or add to .env)
31
+ $env:NOTION_TOKEN = "ntn_..."
32
+ ```
33
+
34
+ ### 2. Search workspace
35
+
36
+ ```powershell
37
+ $headers = @{ "Authorization" = "Bearer $env:NOTION_TOKEN"; "Notion-Version" = "2022-06-28"; "Content-Type" = "application/json" }
38
+ $body = '{"query": "meeting notes"}'
39
+ $resp = Invoke-RestMethod -Uri "https://api.notion.com/v1/search" -Method Post -Headers $headers -Body $body
40
+ $resp.results | Select-Object -ExpandProperty properties | ConvertTo-Json -Depth 5
41
+ ```
42
+
43
+ ### 3. Read a page
44
+
45
+ ```powershell
46
+ $pageId = "your-page-id" # from Notion URL: notion.so/Page-Title-<pageId>
47
+ $headers = @{ "Authorization" = "Bearer $env:NOTION_TOKEN"; "Notion-Version" = "2022-06-28" }
48
+ $page = Invoke-RestMethod -Uri "https://api.notion.com/v1/pages/$pageId" -Headers $headers
49
+ $blocks = Invoke-RestMethod -Uri "https://api.notion.com/v1/blocks/$pageId/children" -Headers $headers
50
+ $blocks.results | ForEach-Object { $_.paragraph.rich_text.plain_text }
51
+ ```
52
+
53
+ ### 4. Query a database
54
+
55
+ ```powershell
56
+ $dbId = "your-database-id"
57
+ $headers = @{ "Authorization" = "Bearer $env:NOTION_TOKEN"; "Notion-Version" = "2022-06-28"; "Content-Type" = "application/json" }
58
+ $filter = '{"filter": {"property": "Status", "select": {"equals": "In Progress"}}}'
59
+ $resp = Invoke-RestMethod -Uri "https://api.notion.com/v1/databases/$dbId/query" -Method Post -Headers $headers -Body $filter
60
+ $resp.results | ForEach-Object { $_.properties.Name.title.plain_text }
61
+ ```
62
+
63
+ ### 5. Create a page in a database
64
+
65
+ ```powershell
66
+ $dbId = "your-database-id"
67
+ $headers = @{ "Authorization" = "Bearer $env:NOTION_TOKEN"; "Notion-Version" = "2022-06-28"; "Content-Type" = "application/json" }
68
+ $payload = @{
69
+ parent = @{ database_id = $dbId }
70
+ properties = @{
71
+ Name = @{ title = @(@{ text = @{ content = "My New Page" } }) }
72
+ }
73
+ } | ConvertTo-Json -Depth 10
74
+ Invoke-RestMethod -Uri "https://api.notion.com/v1/pages" -Method Post -Headers $headers -Body $payload
75
+ ```
76
+
77
+ ### 6. Append text blocks to a page
78
+
79
+ ```powershell
80
+ $pageId = "your-page-id"
81
+ $headers = @{ "Authorization" = "Bearer $env:NOTION_TOKEN"; "Notion-Version" = "2022-06-28"; "Content-Type" = "application/json" }
82
+ $payload = @{
83
+ children = @(@{
84
+ object = "block"
85
+ type = "paragraph"
86
+ paragraph = @{ rich_text = @(@{ type = "text"; text = @{ content = "Appended content here." } }) }
87
+ })
88
+ } | ConvertTo-Json -Depth 10
89
+ Invoke-RestMethod -Uri "https://api.notion.com/v1/blocks/$pageId/children" -Method Patch -Headers $headers -Body $payload
90
+ ```
91
+
92
+ ## Examples
93
+
94
+ **"Show me all In Progress tasks in my Notion project database"**
95
+ → Use step 4 with a Status filter. Ask for database ID from the Notion URL.
96
+
97
+ **"Create a new meeting notes page in Notion for today"**
98
+ → Use step 5 to create a page, then step 6 to append an agenda block.
99
+
100
+ **"Search my Notion workspace for anything about Q2 planning"**
101
+ → Use step 2 with query `Q2 planning`.
102
+
103
+ ## Cautions
104
+
105
+ - Integration must be explicitly shared with each page/database — it won't see everything by default
106
+ - Page IDs are the 32-character hex string at the end of Notion URLs
107
+ - API rate limit is 3 requests/second per integration — add delays for bulk operations
108
+ - Rich text properties have nested structure — always check `rich_text[0].plain_text` for text values
@@ -0,0 +1,24 @@
1
+ {
2
+ "name": "notion",
3
+ "version": "1.0.0",
4
+ "description": "Read, create, and update Notion pages and databases via the Notion REST API",
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
+ "notion",
15
+ "notes",
16
+ "database",
17
+ "pages",
18
+ "workspace",
19
+ "api",
20
+ "knowledge-base",
21
+ "tasks"
22
+ ],
23
+ "created": "2026-04-27T17:11:39.995Z"
24
+ }
@@ -0,0 +1,115 @@
1
+ ---
2
+ name: obsidian
3
+ description: Read, search, and create notes in Obsidian vaults using file system operations and CLI tools
4
+ category: productivity
5
+ version: 1.0.0
6
+ origin: aiden
7
+ license: Apache-2.0
8
+ tags: obsidian, notes, vault, markdown, knowledge-base, zettelkasten, wiki, pkm
9
+ ---
10
+
11
+ # Obsidian Vault Operations
12
+
13
+ Interact with Obsidian vaults directly through the file system. Obsidian notes are plain Markdown files, so you can read, search, create, and link notes without launching the Obsidian app.
14
+
15
+ ## When to Use
16
+
17
+ - User wants to search notes across an Obsidian vault
18
+ - User wants to create a new note in a specific vault folder
19
+ - User wants to find all notes tagged with a given tag
20
+ - User wants to read a specific note by name
21
+ - User wants to find backlinks or internal wiki-links across notes
22
+
23
+ ## How to Use
24
+
25
+ ### 1. Locate the vault
26
+
27
+ Obsidian vaults are folders containing `.md` files and a `.obsidian/` config dir. Ask the user for the vault path or search common locations.
28
+
29
+ ```powershell
30
+ # Find Obsidian vaults on Windows (searches common locations)
31
+ Get-ChildItem "$env:USERPROFILE" -Recurse -Filter ".obsidian" -Directory -ErrorAction SilentlyContinue |
32
+ Select-Object -ExpandProperty Parent | Select-Object FullName
33
+ ```
34
+
35
+ ### 2. Search notes by keyword
36
+
37
+ ```powershell
38
+ # Full-text search across all notes in vault
39
+ $vault = "C:\Users\shiva\Documents\MyVault"
40
+ Get-ChildItem $vault -Recurse -Filter "*.md" |
41
+ Select-String -Pattern "your keyword" -SimpleMatch |
42
+ Select-Object Path, LineNumber, Line |
43
+ Format-Table -AutoSize
44
+ ```
45
+
46
+ ### 3. Search notes by tag
47
+
48
+ Obsidian tags appear as `#tag` in note body or `tags: [tag]` in frontmatter.
49
+
50
+ ```powershell
51
+ $vault = "C:\Users\shiva\Documents\MyVault"
52
+ $tag = "project"
53
+ Get-ChildItem $vault -Recurse -Filter "*.md" |
54
+ Select-String -Pattern "#$tag\b|tags:.*\b$tag\b" -SimpleMatch:$false |
55
+ Select-Object Path | Sort-Object Path -Unique
56
+ ```
57
+
58
+ ### 4. Read a specific note
59
+
60
+ ```powershell
61
+ $note = "C:\Users\shiva\Documents\MyVault\Daily\2026-04-17.md"
62
+ Get-Content $note -Raw
63
+ ```
64
+
65
+ ### 5. Create a new note
66
+
67
+ ```powershell
68
+ $vault = "C:\Users\shiva\Documents\MyVault"
69
+ $folder = "Projects"
70
+ $title = "New Project Idea"
71
+ $date = Get-Date -Format "yyyy-MM-dd"
72
+ $content = @"
73
+ ---
74
+ title: $title
75
+ date: $date
76
+ tags: [project, idea]
77
+ ---
78
+
79
+ # $title
80
+
81
+ Write your note content here.
82
+ "@
83
+ $path = Join-Path $vault $folder "$title.md"
84
+ New-Item -ItemType Directory -Force -Path (Split-Path $path) | Out-Null
85
+ Set-Content -Path $path -Value $content -Encoding UTF8
86
+ Write-Host "Created: $path"
87
+ ```
88
+
89
+ ### 6. Find all backlinks to a note
90
+
91
+ ```powershell
92
+ $vault = "C:\Users\shiva\Documents\MyVault"
93
+ $noteName = "Index" # without .md
94
+ Get-ChildItem $vault -Recurse -Filter "*.md" |
95
+ Select-String -Pattern "\[\[$noteName(\|[^\]]*)?\]\]" |
96
+ Select-Object Path | Sort-Object Path -Unique
97
+ ```
98
+
99
+ ## Examples
100
+
101
+ **"Search my Obsidian vault for notes about async/await"**
102
+ → Use step 2 with keyword `async/await`. Ask user for vault path first if not known.
103
+
104
+ **"Create a daily note for today in my vault"**
105
+ → Use step 5 with folder `Daily`, title as today's date `2026-04-17`, and standard daily note frontmatter.
106
+
107
+ **"Find all notes tagged #book-review in my vault"**
108
+ → Use step 3 with tag `book-review`.
109
+
110
+ ## Cautions
111
+
112
+ - Never delete notes without explicit user confirmation — deletions are hard to recover
113
+ - Obsidian vaults can be very large; use `-Recurse` with care on deep vault trees
114
+ - The `.obsidian/` directory contains config/plugins — do not modify it
115
+ - If the user has Obsidian open, writing files simultaneously is safe (Obsidian watches for changes), but avoid writing the same file from two places at once
@@ -0,0 +1,24 @@
1
+ {
2
+ "name": "obsidian",
3
+ "version": "1.0.0",
4
+ "description": "Read, search, and create notes in Obsidian vaults using file system operations and 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
+ "obsidian",
15
+ "notes",
16
+ "vault",
17
+ "markdown",
18
+ "knowledge-base",
19
+ "zettelkasten",
20
+ "wiki",
21
+ "pkm"
22
+ ],
23
+ "created": "2026-04-27T17:11:40.306Z"
24
+ }
@@ -0,0 +1,125 @@
1
+ ---
2
+ name: ocr-and-documents
3
+ description: Extract text from PDFs, images, scans, and Word documents using Python libraries and CLI tools
4
+ category: productivity
5
+ version: 1.0.0
6
+ origin: aiden
7
+ license: Apache-2.0
8
+ tags: ocr, pdf, image, text-extraction, documents, docx, scan, pymupdf, tesseract, pdf-parse
9
+ ---
10
+
11
+ # OCR and Document Text Extraction
12
+
13
+ Extract readable text from PDFs, scanned images, and Word documents using Python libraries available in most environments. No cloud API required.
14
+
15
+ ## When to Use
16
+
17
+ - User wants to read text from a PDF file
18
+ - User wants to extract text from a scanned image or photo of a document
19
+ - User wants to read a `.docx` Word document programmatically
20
+ - User wants to convert a multi-page document to plain text for analysis
21
+ - User wants to extract specific pages or sections from a PDF
22
+
23
+ ## How to Use
24
+
25
+ ### 1. Extract text from a PDF (pymupdf — fastest)
26
+
27
+ ```python
28
+ import fitz # pip install pymupdf
29
+
30
+ doc = fitz.open("document.pdf")
31
+ text = "\n\n".join(page.get_text() for page in doc)
32
+ print(text[:2000]) # preview first 2000 chars
33
+ doc.close()
34
+ ```
35
+
36
+ ### 2. Extract text from a PDF (pdf-parse via Node.js)
37
+
38
+ ```javascript
39
+ // requires: npm install pdf-parse (already in DevOS dependencies)
40
+ const pdfParse = require('pdf-parse')
41
+ const fs = require('fs')
42
+ const data = await pdfParse(fs.readFileSync('document.pdf'))
43
+ console.log(data.text.slice(0, 2000))
44
+ console.log(`Pages: ${data.numpages}`)
45
+ ```
46
+
47
+ ### 3. OCR a scanned image (Tesseract)
48
+
49
+ Requires Tesseract installed: `winget install UB-Mannheim.TesseractOCR`
50
+
51
+ ```python
52
+ import pytesseract # pip install pytesseract
53
+ from PIL import Image # pip install Pillow
54
+
55
+ img = Image.open("scan.png")
56
+ text = pytesseract.image_to_string(img, lang="eng")
57
+ print(text)
58
+ ```
59
+
60
+ ### 4. OCR with preprocessing for better accuracy
61
+
62
+ ```python
63
+ import pytesseract
64
+ from PIL import Image, ImageFilter, ImageOps
65
+
66
+ img = Image.open("scan.jpg")
67
+ img = ImageOps.grayscale(img)
68
+ img = img.filter(ImageFilter.SHARPEN)
69
+ img = img.point(lambda p: 255 if p > 128 else 0) # binarize
70
+ text = pytesseract.image_to_string(img, config="--psm 6")
71
+ print(text)
72
+ ```
73
+
74
+ ### 5. Extract text from a Word .docx file
75
+
76
+ ```python
77
+ from docx import Document # pip install python-docx
78
+
79
+ doc = Document("report.docx")
80
+ paras = [p.text for p in doc.paragraphs if p.text.strip()]
81
+ text = "\n".join(paras)
82
+ print(text)
83
+ ```
84
+
85
+ ### 6. Extract a specific page range from a PDF
86
+
87
+ ```python
88
+ import fitz
89
+
90
+ doc = fitz.open("big_report.pdf")
91
+ pages = range(4, 9) # pages 5-9 (0-indexed)
92
+ text = "\n\n".join(doc[i].get_text() for i in pages)
93
+ print(text)
94
+ ```
95
+
96
+ ### 7. Extract tables from a PDF
97
+
98
+ ```python
99
+ import pdfplumber # pip install pdfplumber
100
+
101
+ with pdfplumber.open("financial_report.pdf") as pdf:
102
+ for page in pdf.pages:
103
+ for table in page.extract_tables():
104
+ for row in table:
105
+ print("\t".join(str(cell or "") for cell in row))
106
+ ```
107
+
108
+ ## Examples
109
+
110
+ **"Read the text from this PDF contract"**
111
+ → Use step 1 (pymupdf) or step 2 (pdf-parse) depending on whether Python or Node is preferred.
112
+
113
+ **"Extract the table from page 3 of this quarterly report PDF"**
114
+ → Use step 7 (pdfplumber) targeting `pdf.pages[2]` for page 3.
115
+
116
+ **"Read the text from this scanned invoice image"**
117
+ → Use step 3 or 4 (Tesseract). For low-quality scans, use step 4 with preprocessing.
118
+
119
+ ## Cautions
120
+
121
+ - Scanned PDFs (image-only) have no embedded text — Tesseract OCR is required
122
+ - Tesseract accuracy drops on handwriting, decorative fonts, or low-resolution images (< 150 DPI)
123
+ - pymupdf (`fitz`) extracts only programmatically embedded text — it won't OCR scanned pages
124
+ - Large PDFs can use significant memory — process page by page for files > 100 MB
125
+ - For non-English text, specify the language code in Tesseract: `lang="hin"` for Hindi, `"deu"` for German
@@ -0,0 +1,26 @@
1
+ {
2
+ "name": "ocr-and-documents",
3
+ "version": "1.0.0",
4
+ "description": "Extract text from PDFs, images, scans, and Word documents using Python libraries and 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
+ "ocr",
15
+ "pdf",
16
+ "image",
17
+ "text-extraction",
18
+ "documents",
19
+ "docx",
20
+ "scan",
21
+ "pymupdf",
22
+ "tesseract",
23
+ "pdf-parse"
24
+ ],
25
+ "created": "2026-04-27T17:11:40.330Z"
26
+ }