@vectorize-io/self-driving-agents 0.0.24 โ 0.0.26
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 +483 -92
- package/dist/cli.js +34 -7
- package/dist/skill/SKILL.md +3 -1
- package/dist/tests/lint.test.d.ts +1 -0
- package/dist/tests/lint.test.js +85 -0
- package/hermes-plugin/__init__.py +470 -0
- package/hermes-plugin/plugin.yaml +7 -0
- package/package.json +4 -2
package/README.md
CHANGED
|
@@ -1,136 +1,527 @@
|
|
|
1
|
-
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="public/sda-banner.jpg" alt="Self-Driving Agents" />
|
|
3
|
+
</p>
|
|
2
4
|
|
|
3
|
-
|
|
5
|
+
<p align="center">
|
|
6
|
+
<a href="https://www.npmjs.com/package/@vectorize-io/self-driving-agents"><img src="https://img.shields.io/npm/v/@vectorize-io/self-driving-agents?style=flat-square" alt="npm version" /></a>
|
|
7
|
+
<a href="https://www.npmjs.com/package/@vectorize-io/self-driving-agents"><img src="https://img.shields.io/npm/dm/@vectorize-io/self-driving-agents?style=flat-square" alt="npm downloads" /></a>
|
|
8
|
+
<a href="https://github.com/vectorize-io/self-driving-agents/stargazers"><img src="https://img.shields.io/github/stars/vectorize-io/self-driving-agents?style=flat-square" alt="GitHub stars" /></a>
|
|
9
|
+
<a href="https://github.com/vectorize-io/self-driving-agents/commits"><img src="https://img.shields.io/github/last-commit/vectorize-io/self-driving-agents?style=flat-square" alt="Last commit" /></a>
|
|
10
|
+
<a href="https://github.com/vectorize-io/self-driving-agents/issues"><img src="https://img.shields.io/github/issues/vectorize-io/self-driving-agents?style=flat-square" alt="Open issues" /></a>
|
|
11
|
+
<a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-yellow.svg?style=flat-square" alt="License: MIT" /></a>
|
|
12
|
+
<a href="https://vectorize-io.github.io/self-driving-agents/"><img src="https://img.shields.io/badge/docs-online-blue?style=flat-square" alt="Docs" /></a>
|
|
13
|
+
</p>
|
|
4
14
|
|
|
5
|
-
|
|
15
|
+
## A Complete AI Workforce in a Box
|
|
6
16
|
|
|
7
|
-
|
|
17
|
+
179 ready-to-use, self-learning AI agents organized into 13 departments. Powered by [Hindsight](https://github.com/vectorize-io/hindsight).
|
|
8
18
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
### Claude Chat / Cowork
|
|
19
|
+
**Divisions:** [Design](#design) ยท [Engineering](#engineering) ยท [Finance](#finance) ยท [Game Development](#game-development) ยท [Marketing](#marketing) ยท [Paid Media](#paid-media) ยท [Product](#product) ยท [Project Management](#project-management) ยท [Sales](#sales) ยท [Spatial Computing](#spatial-computing) ยท [Specialized](#specialized) ยท [Support](#support) ยท [Testing](#testing)
|
|
12
20
|
|
|
13
21
|
```bash
|
|
22
|
+
# Built-in agent
|
|
14
23
|
npx @vectorize-io/self-driving-agents install marketing/seo --harness claude
|
|
24
|
+
|
|
25
|
+
# Local directory or any GitHub repo
|
|
26
|
+
npx @vectorize-io/self-driving-agents install ./my-agent --harness claude
|
|
27
|
+
npx @vectorize-io/self-driving-agents install my-org/my-repo/path --harness claude
|
|
28
|
+
|
|
29
|
+
# Start blank, build through conversation
|
|
30
|
+
npx @vectorize-io/self-driving-agents install my-agent --harness claude --empty
|
|
15
31
|
```
|
|
16
32
|
|
|
17
|
-
|
|
33
|
+
Harnesses: `claude` ยท `claude-code` ยท `openclaw` ยท `nemoclaw` ยท `hermes`
|
|
18
34
|
|
|
19
|
-
|
|
35
|
+
**Type `/<agent-name>` in any conversation to activate.** Claude Chat / Cowork only: upload the generated skill via `Customize โ Skills โ Upload`, then allowlist the API host at `Settings โ Capabilities`.
|
|
20
36
|
|
|
21
|
-
|
|
22
|
-
npx @vectorize-io/self-driving-agents install marketing/seo --harness openclaw
|
|
23
|
-
```
|
|
37
|
+
---
|
|
24
38
|
|
|
25
|
-
|
|
39
|
+
## Roster
|
|
26
40
|
|
|
27
|
-
|
|
28
|
-
npx @vectorize-io/self-driving-agents install marketing/seo --harness nemoclaw
|
|
29
|
-
```
|
|
41
|
+
### Design
|
|
30
42
|
|
|
31
|
-
|
|
43
|
+
#### [`design/ux`](design/ux/) โ UX research, UI, architecture
|
|
32
44
|
|
|
33
|
-
|
|
45
|
+
| Agent | Vibe |
|
|
46
|
+
|-------|------|
|
|
47
|
+
| ๐จ [UI Designer](design/ux/ui-designer.md) | Beautiful, consistent, accessible interfaces. |
|
|
48
|
+
| ๐ [UX Architect](design/ux/ux-architect.md) | Developer-friendly CSS foundations and implementation paths. |
|
|
49
|
+
| ๐ฌ [UX Researcher](design/ux/ux-researcher.md) | Real user data, not assumptions. |
|
|
34
50
|
|
|
35
|
-
|
|
36
|
-
npx @vectorize-io/self-driving-agents install ./my-agent --harness claude
|
|
37
|
-
npx @vectorize-io/self-driving-agents install my-org/my-repo/my-agent --harness openclaw
|
|
38
|
-
```
|
|
51
|
+
#### [`design/visual`](design/visual/) โ Brand, imagery, motion, delight
|
|
39
52
|
|
|
40
|
-
|
|
53
|
+
| Agent | Vibe |
|
|
54
|
+
|-------|------|
|
|
55
|
+
| ๐จ [Brand Guardian](design/visual/brand-guardian.md) | Fiercest protector of your brand. |
|
|
56
|
+
| ๐ท [Image Prompt Engineer](design/visual/image-prompt-engineer.md) | Precise prompts for stunning AI imagery. |
|
|
57
|
+
| ๐ [Inclusive Visuals Specialist](design/visual/inclusive-visuals-specialist.md) | Defeats AI bias for culturally accurate imagery. |
|
|
58
|
+
| ๐ฌ [Visual Storyteller](design/visual/visual-storyteller.md) | Visual narratives that move people. |
|
|
59
|
+
| โจ [Whimsy Injector](design/visual/whimsy-injector.md) | The unexpected moments of delight. |
|
|
41
60
|
|
|
42
|
-
|
|
43
|
-
npx @vectorize-io/self-driving-agents install my-agent --harness claude-code --empty
|
|
44
|
-
```
|
|
61
|
+
### Engineering
|
|
45
62
|
|
|
46
|
-
|
|
63
|
+
#### [`engineering/ai`](engineering/ai/) โ AI/ML
|
|
47
64
|
|
|
48
|
-
|
|
65
|
+
| Agent | Vibe |
|
|
66
|
+
|-------|------|
|
|
67
|
+
| ๐ค [AI Engineer](engineering/ai/ai-engineer.md) | Turns ML models into production features that actually scale. |
|
|
68
|
+
| โก [Autonomous Optimization Architect](engineering/ai/autonomous-optimization-architect.md) | System governor that makes things faster without bankrupting you. |
|
|
69
|
+
| ๐ง [Email Intelligence Engineer](engineering/ai/email-intelligence-engineer.md) | Turns messy MIME into reasoning-ready context. |
|
|
70
|
+
| ๐ง [Filament Optimization Specialist](engineering/ai/filament-optimization-specialist.md) | Streamlines complex Filament admin environments. |
|
|
71
|
+
| ๐๏ธ [Voice AI Integration Engineer](engineering/ai/voice-ai-integration-engineer.md) | Turns raw audio into structured, production-ready text. |
|
|
49
72
|
|
|
50
|
-
|
|
51
|
-
2. Conversations are automatically retained into memory
|
|
52
|
-
3. The agent builds knowledge pages that update themselves after each conversation
|
|
53
|
-
4. Next session, the agent reads its updated pages โ it remembers what works and what you prefer
|
|
73
|
+
#### [`engineering/architecture`](engineering/architecture/) โ System & code architecture
|
|
54
74
|
|
|
55
|
-
|
|
75
|
+
| Agent | Vibe |
|
|
76
|
+
|-------|------|
|
|
77
|
+
| โก [Rapid Prototyper](engineering/architecture/rapid-prototyper.md) | Working prototype before the meeting's over. |
|
|
78
|
+
| ๐ [Senior Developer](engineering/architecture/senior-developer.md) | Laravel, Livewire, Three.js, advanced CSS. |
|
|
79
|
+
| ๐๏ธ [Software Architect](engineering/architecture/software-architect.md) | Systems that survive the team that built them. |
|
|
56
80
|
|
|
57
|
-
|
|
81
|
+
#### [`engineering/backend`](engineering/backend/) โ APIs, data, databases
|
|
58
82
|
|
|
59
|
-
|
|
83
|
+
| Agent | Vibe |
|
|
84
|
+
|-------|------|
|
|
85
|
+
| ๐งฌ [AI Data Remediation Engineer](engineering/backend/ai-data-remediation-engineer.md) | Fixes broken data with surgical AI precision. |
|
|
86
|
+
| ๐๏ธ [Backend Architect](engineering/backend/backend-architect.md) | Databases, APIs, cloud, scale. |
|
|
87
|
+
| ๐งฑ [CMS Developer](engineering/backend/cms-developer.md) | Drupal & WordPress at enterprise scale. |
|
|
88
|
+
| ๐ง [Data Engineer](engineering/backend/data-engineer.md) | Pipelines that turn raw data into analytics-ready assets. |
|
|
89
|
+
| ๐๏ธ [Database Optimizer](engineering/backend/database-optimizer.md) | Indexes, query plans, schema design โ no 3am pages. |
|
|
60
90
|
|
|
61
|
-
|
|
91
|
+
#### [`engineering/frontend`](engineering/frontend/) โ Web & mobile UI
|
|
62
92
|
|
|
63
|
-
|
|
|
64
|
-
|
|
65
|
-
|
|
|
66
|
-
|
|
|
67
|
-
|
|
|
68
|
-
| `marketing/content` | Content creator, growth hacker, book co-author |
|
|
69
|
-
| `marketing/ecommerce` | Cross-border commerce, livestream selling |
|
|
70
|
-
| `marketing/china-market` | WeChat, Douyin, Xiaohongshu, Baidu, Bilibili |
|
|
93
|
+
| Agent | Vibe |
|
|
94
|
+
|-------|------|
|
|
95
|
+
| ๐ฅ๏ธ [Frontend Developer](engineering/frontend/frontend-developer.md) | Responsive, accessible web apps, pixel-perfect. |
|
|
96
|
+
| ๐ฒ [Mobile App Builder](engineering/frontend/mobile-app-builder.md) | Native-quality iOS and Android, fast. |
|
|
97
|
+
| ๐ฌ [WeChat Mini Program Developer](engineering/frontend/wechat-mini-program-developer.md) | Mini Programs that thrive in the WeChat ecosystem. |
|
|
71
98
|
|
|
72
|
-
|
|
99
|
+
#### [`engineering/ops`](engineering/ops/) โ DevOps, SRE, firmware, incidents
|
|
73
100
|
|
|
74
|
-
|
|
101
|
+
| Agent | Vibe |
|
|
102
|
+
|-------|------|
|
|
103
|
+
| โ๏ธ [DevOps Automator](engineering/ops/devops-automator.md) | Infra automation so the team ships faster and sleeps better. |
|
|
104
|
+
| ๐ฉ [Embedded Firmware Engineer](engineering/ops/embedded-firmware-engineer.md) | Production-grade firmware for hardware that can't crash. |
|
|
105
|
+
| ๐จ [Incident Response Commander](engineering/ops/incident-response-commander.md) | Production chaos โ structured resolution. |
|
|
106
|
+
| ๐ก๏ธ [SRE](engineering/ops/sre.md) | Error budgets fund velocity โ spend them wisely. |
|
|
75
107
|
|
|
76
|
-
|
|
77
|
-
my-agent/
|
|
78
|
-
bank-template.json # optional โ configures memory bank and knowledge pages
|
|
79
|
-
seo-playbook.md # any .md/.txt files become seed knowledge
|
|
80
|
-
advanced-tips.md
|
|
81
|
-
```
|
|
108
|
+
#### [`engineering/security`](engineering/security/) โ AppSec, smart contracts, detection
|
|
82
109
|
|
|
83
|
-
|
|
110
|
+
| Agent | Vibe |
|
|
111
|
+
|-------|------|
|
|
112
|
+
| ๐ [Security Engineer](engineering/security/security-engineer.md) | Threat modeling, code review, hunting โ holds under adversaries. |
|
|
113
|
+
| โ๏ธ [Solidity Smart Contract Engineer](engineering/security/solidity-smart-contract-engineer.md) | Battle-hardened EVM developer. |
|
|
114
|
+
| ๐ฏ [Threat Detection Engineer](engineering/security/threat-detection-engineer.md) | Catches attackers after they bypass prevention. |
|
|
84
115
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
116
|
+
#### [`engineering/workflow`](engineering/workflow/) โ Code review, Git, docs, onboarding
|
|
117
|
+
|
|
118
|
+
| Agent | Vibe |
|
|
119
|
+
|-------|------|
|
|
120
|
+
| ๐๏ธ [Code Reviewer](engineering/workflow/code-reviewer.md) | Mentor, not gatekeeper โ every comment teaches. |
|
|
121
|
+
| ๐งญ [Codebase Onboarding Engineer](engineering/workflow/codebase-onboarding-engineer.md) | New devs productive โ read code, trace paths, state facts. |
|
|
122
|
+
| ๐ [Feishu Integration Developer](engineering/workflow/feishu-integration-developer.md) | Feishu/Lark integrations โ bots, approvals, data sync, SSO. |
|
|
123
|
+
| ๐ฟ [Git Workflow Master](engineering/workflow/git-workflow-master.md) | Clean history, atomic commits, branches that tell a story. |
|
|
124
|
+
| ๐ชก [Minimal Change Engineer](engineering/workflow/minimal-change-engineer.md) | Smallest diff that solves the problem. |
|
|
125
|
+
| ๐ [Technical Writer](engineering/workflow/technical-writer.md) | Docs developers actually read. |
|
|
126
|
+
|
|
127
|
+
### Finance
|
|
128
|
+
|
|
129
|
+
#### [`finance/accounting`](finance/accounting/) โ Bookkeeping & tax
|
|
130
|
+
|
|
131
|
+
| Agent | Vibe |
|
|
132
|
+
|-------|------|
|
|
133
|
+
| ๐ [Bookkeeper & Controller](finance/accounting/bookkeeper-controller.md) | Every penny accounted, every close on time. |
|
|
134
|
+
| ๐๏ธ [Tax Strategist](finance/accounting/tax-strategist.md) | Every legal dollar of savings. |
|
|
135
|
+
|
|
136
|
+
#### [`finance/analysis`](finance/analysis/) โ FP&A, financial analysis, investment research
|
|
137
|
+
|
|
138
|
+
| Agent | Vibe |
|
|
139
|
+
|-------|------|
|
|
140
|
+
| ๐ [Financial Analyst](finance/analysis/financial-analyst.md) | Spreadsheets โ strategy. |
|
|
141
|
+
| ๐ [FP&A Analyst](finance/analysis/fpa-analyst.md) | The budget whisperer. |
|
|
142
|
+
| ๐ [Investment Researcher](finance/analysis/investment-researcher.md) | Alpha in the footnotes, risk in the narratives. |
|
|
143
|
+
|
|
144
|
+
### Game Development
|
|
145
|
+
|
|
146
|
+
#### [`game-development/blender`](game-development/blender/)
|
|
147
|
+
|
|
148
|
+
| Agent | Vibe |
|
|
149
|
+
|-------|------|
|
|
150
|
+
| ๐งฉ [Blender Add-on Engineer](game-development/blender/addon-engineer.md) | Pipeline drudgery โ one-click tools. |
|
|
151
|
+
|
|
152
|
+
#### [`game-development/core`](game-development/core/) โ Engine-agnostic
|
|
153
|
+
|
|
154
|
+
| Agent | Vibe |
|
|
155
|
+
|-------|------|
|
|
156
|
+
| ๐ต [Game Audio Engineer](game-development/core/game-audio-engineer.md) | Every sound alive in the world. |
|
|
157
|
+
| ๐ฎ [Game Designer](game-development/core/game-designer.md) | Loops, levers, motivations. |
|
|
158
|
+
| ๐บ๏ธ [Level Designer](game-development/core/level-designer.md) | Authored space tells the story. |
|
|
159
|
+
| ๐ [Narrative Designer](game-development/core/narrative-designer.md) | Narrative and gameplay inseparable. |
|
|
160
|
+
| ๐จ [Technical Artist](game-development/core/technical-artist.md) | Art vision โ engine reality. |
|
|
161
|
+
|
|
162
|
+
#### [`game-development/godot`](game-development/godot/)
|
|
163
|
+
|
|
164
|
+
| Agent | Vibe |
|
|
165
|
+
|-------|------|
|
|
166
|
+
| ๐ฏ [Godot Gameplay Scripter](game-development/godot/gameplay-scripter.md) | Godot 4 with software-architect discipline. |
|
|
167
|
+
| ๐ [Godot Multiplayer Engineer](game-development/godot/multiplayer-engineer.md) | MultiplayerAPI made seamless. |
|
|
168
|
+
| ๐ [Godot Shader Developer](game-development/godot/shader-developer.md) | Light and pixels through Godot shading. |
|
|
169
|
+
|
|
170
|
+
#### [`game-development/roblox-studio`](game-development/roblox-studio/)
|
|
171
|
+
|
|
172
|
+
| Agent | Vibe |
|
|
173
|
+
|-------|------|
|
|
174
|
+
| ๐ค [Roblox Avatar Creator](game-development/roblox-studio/roblox-avatar-creator.md) | UGC pipeline from rig to Marketplace. |
|
|
175
|
+
| ๐ช [Roblox Experience Designer](game-development/roblox-studio/roblox-experience-designer.md) | Engagement loops and monetization. |
|
|
176
|
+
| ๐ง [Roblox Systems Scripter](game-development/roblox-studio/roblox-systems-scripter.md) | Luau, client-server security, scale. |
|
|
177
|
+
|
|
178
|
+
#### [`game-development/unity`](game-development/unity/)
|
|
179
|
+
|
|
180
|
+
| Agent | Vibe |
|
|
181
|
+
|-------|------|
|
|
182
|
+
| ๐๏ธ [Unity Architect](game-development/unity/architect.md) | Data-driven, decoupled, no spaghetti. |
|
|
183
|
+
| ๐ ๏ธ [Unity Editor Tool Developer](game-development/unity/editor-tool-developer.md) | Custom editor tools that save hours. |
|
|
184
|
+
| ๐ [Unity Multiplayer Engineer](game-development/unity/multiplayer-engineer.md) | Netcode that feels local. |
|
|
185
|
+
| โจ [Unity Shader Graph Artist](game-development/unity/shader-graph-artist.md) | Shader Graph + custom render passes. |
|
|
186
|
+
|
|
187
|
+
#### [`game-development/unreal-engine`](game-development/unreal-engine/)
|
|
188
|
+
|
|
189
|
+
| Agent | Vibe |
|
|
190
|
+
|-------|------|
|
|
191
|
+
| ๐ [Unreal Multiplayer Architect](game-development/unreal-engine/unreal-multiplayer-architect.md) | Server-authoritative, feels lag-free. |
|
|
192
|
+
| โ๏ธ [Unreal Systems Engineer](game-development/unreal-engine/unreal-systems-engineer.md) | C++/Blueprint for AAA Unreal. |
|
|
193
|
+
| ๐จ [Unreal Technical Artist](game-development/unreal-engine/unreal-technical-artist.md) | Niagara, Material Editor, PCG. |
|
|
194
|
+
| ๐ [Unreal World Builder](game-development/unreal-engine/unreal-world-builder.md) | World Partition, Nanite, procedural foliage. |
|
|
195
|
+
|
|
196
|
+
### Marketing
|
|
197
|
+
|
|
198
|
+
#### [`marketing/china-market`](marketing/china-market/) โ Douyin, WeChat, Xiaohongshu, Bilibili, Weibo, Zhihu, Kuaishou
|
|
199
|
+
|
|
200
|
+
| Agent | Vibe |
|
|
201
|
+
|-------|------|
|
|
202
|
+
| ๐ฌ [Bilibili Content Strategist](marketing/china-market/bilibili-content-strategist.md) | Fluent danmaku, grows your brand on B็ซ. |
|
|
203
|
+
| ๐ [China E-Commerce Operator](marketing/china-market/china-ecommerce-operator.md) | Taobao, Tmall, Pinduoduo, JD โ like a native operator. |
|
|
204
|
+
| ๐จ๐ณ [China Market Localization Strategist](marketing/china-market/china-market-localization-strategist.md) | China trend chaos โ precision marketing. |
|
|
205
|
+
| ๐ต [Douyin Strategist](marketing/china-market/douyin-strategist.md) | Masters the Douyin algorithm. |
|
|
206
|
+
| ๐ฅ [Kuaishou Strategist](marketing/china-market/kuaishou-strategist.md) | Grassroots audiences and live commerce on ๅฟซๆ. |
|
|
207
|
+
| ๐ [Private Domain Operator](marketing/china-market/private-domain-operator.md) | WeChat private traffic empire. |
|
|
208
|
+
| ๐ฑ [WeChat Official Account Manager](marketing/china-market/wechat-official-account.md) | Loyal WeChat subscriber communities. |
|
|
209
|
+
| ๐ฅ [Weibo Strategist](marketing/china-market/weibo-strategist.md) | Makes your brand trend on Weibo. |
|
|
210
|
+
| ๐ธ [Xiaohongshu Specialist](marketing/china-market/xiaohongshu-specialist.md) | Lifestyle and aesthetic storytelling on ๅฐ็บขไนฆ. |
|
|
211
|
+
| ๐ง [Zhihu Strategist](marketing/china-market/zhihu-strategist.md) | Brand authority through expert Q&A. |
|
|
212
|
+
|
|
213
|
+
#### [`marketing/content`](marketing/content/) โ Content, books, growth
|
|
214
|
+
|
|
215
|
+
| Agent | Vibe |
|
|
216
|
+
|-------|------|
|
|
217
|
+
| ๐ [Book Co-Author](marketing/content/book-co-author.md) | Expertise โ book people quote and buy into. |
|
|
218
|
+
| โ๏ธ [Content Creator](marketing/content/content-creator.md) | Stories across every platform your audience uses. |
|
|
219
|
+
| ๐ [Growth Hacker](marketing/content/growth-hacker.md) | Unexploited channel โ find and scale. |
|
|
220
|
+
|
|
221
|
+
#### [`marketing/ecommerce`](marketing/ecommerce/) โ Cross-border & livestream commerce
|
|
222
|
+
|
|
223
|
+
| Agent | Vibe |
|
|
224
|
+
|-------|------|
|
|
225
|
+
| ๐ [Cross-Border E-Commerce Specialist](marketing/ecommerce/cross-border-ecommerce.md) | Chinese factory โ global bestseller. |
|
|
226
|
+
| ๐๏ธ [Livestream Commerce Coach](marketing/ecommerce/livestream-commerce-coach.md) | Hosts: awkward beginner โ million-yuan seller. |
|
|
227
|
+
|
|
228
|
+
#### [`marketing/seo`](marketing/seo/) โ Search, AI citations, app store
|
|
229
|
+
|
|
230
|
+
| Agent | Vibe |
|
|
231
|
+
|-------|------|
|
|
232
|
+
| ๐ค [Agentic Search Optimizer](marketing/seo/agentic-search-optimizer.md) | Makes sure AI can actually do the thing on your site. |
|
|
233
|
+
| ๐ฎ [AI Citation Strategist](marketing/seo/ai-citation-strategist.md) | Rewires signals so AI recommends you, not the competitor. |
|
|
234
|
+
| ๐ฑ [App Store Optimizer](marketing/seo/app-store-optimizer.md) | Found, downloaded, loved in the store. |
|
|
235
|
+
| ๐จ๐ณ [Baidu SEO Specialist](marketing/seo/baidu-seo-specialist.md) | Ranks in China's search ecosystem. |
|
|
236
|
+
| ๐ [SEO Specialist](marketing/seo/seo-specialist.md) | Technical SEO + content for sustainable organic. |
|
|
237
|
+
| ๐ฌ [Video Optimization Specialist](marketing/seo/video-optimization-specialist.md) | Data-driven retention obsession. |
|
|
238
|
+
|
|
239
|
+
#### [`marketing/social-media`](marketing/social-media/) โ TikTok, Instagram, LinkedIn, Reddit, X
|
|
240
|
+
|
|
241
|
+
| Agent | Vibe |
|
|
242
|
+
|-------|------|
|
|
243
|
+
| ๐ [Carousel Growth Engine](marketing/social-media/carousel-growth-engine.md) | Viral carousels from any URL, auto-published. |
|
|
244
|
+
| ๐ธ [Instagram Curator](marketing/social-media/instagram-curator.md) | Grid aesthetic โ engaged community. |
|
|
245
|
+
| ๐ผ [LinkedIn Content Creator](marketing/social-media/linkedin-content-creator.md) | Scroll-stopping professional content. |
|
|
246
|
+
| ๐ง [Podcast Strategist](marketing/social-media/podcast-strategist.md) | Podcast from concept to loyal audience. |
|
|
247
|
+
| ๐ฌ [Reddit Community Builder](marketing/social-media/reddit-community-builder.md) | Fluent Reddit. Trust the authentic way. |
|
|
248
|
+
| ๐ฌ [Short-Video Editing Coach](marketing/social-media/short-video-editing-coach.md) | Raw footage โ scroll-stopping short videos. |
|
|
249
|
+
| ๐ฃ [Social Media Strategist](marketing/social-media/social-media-strategist.md) | Cross-platform campaigns that build community. |
|
|
250
|
+
| ๐ต [TikTok Strategist](marketing/social-media/tiktok-strategist.md) | Rides the algorithm, builds the culture. |
|
|
251
|
+
| ๐ฆ [Twitter Engager](marketing/social-media/twitter-engager.md) | Thought leadership 280 chars at a time. |
|
|
252
|
+
|
|
253
|
+
### Paid Media
|
|
254
|
+
|
|
255
|
+
#### [`paid-media/analytics`](paid-media/analytics/) โ Audits, attribution, search-term mining
|
|
256
|
+
|
|
257
|
+
| Agent | Vibe |
|
|
258
|
+
|-------|------|
|
|
259
|
+
| ๐ [Paid Media Auditor](paid-media/analytics/auditor.md) | Finds the waste before your CFO does. |
|
|
260
|
+
| ๐ [Search Query Analyst](paid-media/analytics/search-query-analyst.md) | Mines queries for gold competitors miss. |
|
|
261
|
+
| ๐ก [Tracking & Measurement Specialist](paid-media/analytics/tracking-specialist.md) | If it's not tracked correctly, it didn't happen. |
|
|
262
|
+
|
|
263
|
+
#### [`paid-media/channels`](paid-media/channels/) โ Creative, PPC, paid social, programmatic
|
|
264
|
+
|
|
265
|
+
| Agent | Vibe |
|
|
266
|
+
|-------|------|
|
|
267
|
+
| โ๏ธ [Ad Creative Strategist](paid-media/channels/creative-strategist.md) | Creative as a repeatable science. |
|
|
268
|
+
| ๐ฑ [Paid Social Strategist](paid-media/channels/paid-social-strategist.md) | Meta, LinkedIn, TikTok โ every dollar working harder. |
|
|
269
|
+
| ๐ฐ [PPC Campaign Strategist](paid-media/channels/ppc-strategist.md) | $10K to $10M+/mo PPC architectures. |
|
|
270
|
+
| ๐บ [Programmatic & Display Buyer](paid-media/channels/programmatic-buyer.md) | Display and video at scale. |
|
|
271
|
+
|
|
272
|
+
### Product
|
|
273
|
+
|
|
274
|
+
#### [`product/delivery`](product/delivery/) โ PM, prioritization, behavioral
|
|
275
|
+
|
|
276
|
+
| Agent | Vibe |
|
|
277
|
+
|-------|------|
|
|
278
|
+
| ๐ง [Behavioral Nudge Engine](product/delivery/behavioral-nudge-engine.md) | Behavioral psych for user motivation. |
|
|
279
|
+
| ๐งญ [Product Manager](product/delivery/manager.md) | Ships the right thing, not the next thing. |
|
|
280
|
+
| ๐ฏ [Sprint Prioritizer](product/delivery/sprint-prioritizer.md) | Ruthless focus on sprint value. |
|
|
281
|
+
|
|
282
|
+
#### [`product/discovery`](product/discovery/) โ Research & feedback
|
|
283
|
+
|
|
284
|
+
| Agent | Vibe |
|
|
285
|
+
|-------|------|
|
|
286
|
+
| ๐ [Feedback Synthesizer](product/discovery/feedback-synthesizer.md) | 1000 user voices โ 5 things to build. |
|
|
287
|
+
| ๐ญ [Trend Researcher](product/discovery/trend-researcher.md) | Trends before mainstream. |
|
|
288
|
+
|
|
289
|
+
### Project Management
|
|
290
|
+
|
|
291
|
+
#### [`project-management/delivery`](project-management/delivery/) โ Experiments & Jira workflow
|
|
292
|
+
|
|
293
|
+
| Agent | Vibe |
|
|
294
|
+
|-------|------|
|
|
295
|
+
| ๐งช [Experiment Tracker](project-management/delivery/experiment-tracker.md) | Designs experiments, tracks results, lets data decide. |
|
|
296
|
+
| ๐ [Jira Workflow Steward](project-management/delivery/jira-workflow-steward.md) | Traceable commits, structured PRs, release-safe branches. |
|
|
297
|
+
|
|
298
|
+
#### [`project-management/planning`](project-management/planning/) โ PM, scoping, shepherding
|
|
299
|
+
|
|
300
|
+
| Agent | Vibe |
|
|
301
|
+
|-------|------|
|
|
302
|
+
| ๐ [Project Shepherd](project-management/planning/project-shepherd.md) | Cross-functional chaos โ on-time delivery. |
|
|
303
|
+
| ๐ [Senior Project Manager](project-management/planning/project-manager-senior.md) | Realistic scope โ no gold-plating. |
|
|
304
|
+
|
|
305
|
+
#### [`project-management/studio`](project-management/studio/) โ Studio production & ops
|
|
306
|
+
|
|
307
|
+
| Agent | Vibe |
|
|
308
|
+
|-------|------|
|
|
309
|
+
| ๐ญ [Studio Operations](project-management/studio/studio-operations.md) | Processes, tools, people in sync. |
|
|
310
|
+
| ๐ฌ [Studio Producer](project-management/studio/studio-producer.md) | Creative vision aligned to business. |
|
|
311
|
+
|
|
312
|
+
### Sales
|
|
313
|
+
|
|
314
|
+
#### [`sales/coaching`](sales/coaching/) โ Discovery and rep coaching
|
|
315
|
+
|
|
316
|
+
| Agent | Vibe |
|
|
317
|
+
|-------|------|
|
|
318
|
+
| ๐ [Discovery Coach](sales/coaching/discovery-coach.md) | The one extra question that closes the deal. |
|
|
319
|
+
| ๐๏ธ [Sales Coach](sales/coaching/coach.md) | Makes the rep rethink the deal. |
|
|
320
|
+
|
|
321
|
+
#### [`sales/ops`](sales/ops/) โ Pipeline analytics & sales engineering
|
|
95
322
|
|
|
96
|
-
|
|
323
|
+
| Agent | Vibe |
|
|
324
|
+
|-------|------|
|
|
325
|
+
| ๐ [Pipeline Analyst](sales/ops/pipeline-analyst.md) | Tells you your forecast is wrong before you do. |
|
|
326
|
+
| ๐ ๏ธ [Sales Engineer](sales/ops/engineer.md) | Wins the technical decision pre-procurement. |
|
|
97
327
|
|
|
98
|
-
|
|
328
|
+
#### [`sales/strategy`](sales/strategy/) โ Account, deal, outbound, proposal
|
|
99
329
|
|
|
100
|
-
|
|
330
|
+
| Agent | Vibe |
|
|
331
|
+
|-------|------|
|
|
332
|
+
| ๐บ๏ธ [Account Strategist](sales/strategy/account-strategist.md) | Maps the org, finds the whitespace, expands. |
|
|
333
|
+
| โ๏ธ [Deal Strategist](sales/strategy/deal-strategist.md) | Qualifies like a surgeon, kills happy ears. |
|
|
334
|
+
| ๐ฏ [Outbound Strategist](sales/strategy/outbound-strategist.md) | Buying signals into booked meetings. |
|
|
335
|
+
| ๐น [Proposal Strategist](sales/strategy/proposal-strategist.md) | RFP responses buyers can't put down. |
|
|
101
336
|
|
|
102
|
-
|
|
103
|
-
2. **Configures connection** โ prompts for Hindsight Cloud or self-hosted API URL and token
|
|
104
|
-
3. **Connects to Hindsight** and imports the `bank-template.json` (memory bank config, knowledge pages, directives)
|
|
105
|
-
4. **Ingests all content files** (`.md`, `.txt`, etc.) found recursively as seed knowledge
|
|
106
|
-
5. **Generates the agent** โ creates a skill (Claude) or workspace (OpenClaw/NemoClaw) with the knowledge tools baked in
|
|
337
|
+
### Spatial Computing
|
|
107
338
|
|
|
108
|
-
|
|
339
|
+
#### [`spatial-computing/platform`](spatial-computing/platform/) โ visionOS, Metal, terminals
|
|
109
340
|
|
|
110
|
-
|
|
341
|
+
| Agent | Vibe |
|
|
342
|
+
|-------|------|
|
|
343
|
+
| ๐ [macOS Spatial/Metal Engineer](spatial-computing/platform/macos-spatial-metal-engineer.md) | Metal pushed to its limits on macOS and Vision Pro. |
|
|
344
|
+
| ๐ฅ๏ธ [Terminal Integration Specialist](spatial-computing/platform/terminal-integration-specialist.md) | Terminal emulation and text rendering in Swift. |
|
|
345
|
+
| ๐ฅฝ [visionOS Spatial Engineer](spatial-computing/platform/visionos-spatial-engineer.md) | Native volumetric interfaces, Liquid Glass. |
|
|
111
346
|
|
|
112
|
-
-
|
|
113
|
-
- No external dependencies โ uses `curl` to call the Hindsight REST API
|
|
114
|
-
- The skill instructs Claude to load knowledge pages at startup, retain user feedback during conversations, and manage pages
|
|
115
|
-
- Upload the zip via **Customize โ Skills โ Upload** in Claude Chat or Cowork
|
|
116
|
-
- After upload, allowlist the API host in **Settings โ Capabilities**
|
|
117
|
-
- Type `/<agent-name>` in any conversation to activate
|
|
347
|
+
#### [`spatial-computing/xr`](spatial-computing/xr/) โ XR/WebXR/cockpit
|
|
118
348
|
|
|
119
|
-
|
|
349
|
+
| Agent | Vibe |
|
|
350
|
+
|-------|------|
|
|
351
|
+
| ๐น๏ธ [XR Cockpit Interaction Specialist](spatial-computing/xr/xr-cockpit-interaction-specialist.md) | Immersive cockpit control systems. |
|
|
352
|
+
| ๐ [XR Immersive Developer](spatial-computing/xr/xr-immersive-developer.md) | Browser-based AR/VR/XR pushing WebXR. |
|
|
353
|
+
| ๐ซง [XR Interface Architect](spatial-computing/xr/xr-interface-architect.md) | Spatial interaction that feels like instinct. |
|
|
354
|
+
|
|
355
|
+
### Specialized
|
|
356
|
+
|
|
357
|
+
#### [`specialized/automation`](specialized/automation/) โ Data, docs, distribution
|
|
358
|
+
|
|
359
|
+
| Agent | Vibe |
|
|
360
|
+
|-------|------|
|
|
361
|
+
| ๐๏ธ [Data Consolidation Agent](specialized/automation/data-consolidation-agent.md) | Scattered sales data โ live dashboards. |
|
|
362
|
+
| ๐ [Document Generator](specialized/automation/document-generator.md) | PDFs, slides, spreadsheets from code. |
|
|
363
|
+
| ๐ค [Report Distribution Agent](specialized/automation/report-distribution-agent.md) | Reports delivered to the right reps. |
|
|
364
|
+
|
|
365
|
+
#### [`specialized/compliance-trust`](specialized/compliance-trust/) โ Identity, audits, ZK
|
|
366
|
+
|
|
367
|
+
| Agent | Vibe |
|
|
368
|
+
|-------|------|
|
|
369
|
+
| ๐ [Agentic Identity & Trust Architect](specialized/compliance-trust/agentic-identity-trust.md) | Every agent proves who, what, when. |
|
|
370
|
+
| โ๏ธ [Automation Governance Architect](specialized/compliance-trust/automation-governance-architect.md) | Reliable systems > automation hype. |
|
|
371
|
+
| ๐ก๏ธ [Blockchain Security Auditor](specialized/compliance-trust/blockchain-security-auditor.md) | Finds the exploit before the attacker. |
|
|
372
|
+
| ๐ [Compliance Auditor](specialized/compliance-trust/compliance-auditor.md) | Readiness โ SOC 2 certification. |
|
|
373
|
+
| ๐ธ๏ธ [Identity Graph Operator](specialized/compliance-trust/identity-graph-operator.md) | Same canonical answer across all agents. |
|
|
374
|
+
| ๐๏ธ [ZK Steward](specialized/compliance-trust/zk-steward.md) | Zettelkasten for validated knowledge bases. |
|
|
375
|
+
|
|
376
|
+
#### [`specialized/customer-service`](specialized/customer-service/) โ Hospitality, retail, general
|
|
377
|
+
|
|
378
|
+
| Agent | Vibe |
|
|
379
|
+
|-------|------|
|
|
380
|
+
| ๐ง [Customer Service](specialized/customer-service/customer-service.md) | Problem โ loyalty, with speed and care. |
|
|
381
|
+
| ๐จ [Hospitality Guest Services](specialized/customer-service/hospitality-guest-services.md) | Hospitality is a feeling. |
|
|
382
|
+
| ๐ [Retail Customer Returns](specialized/customer-service/retail-customer-returns.md) | A return is an opportunity. |
|
|
383
|
+
|
|
384
|
+
#### [`specialized/domain-experts`](specialized/domain-experts/) โ Civil, devrel, gov, supply chain
|
|
385
|
+
|
|
386
|
+
| Agent | Vibe |
|
|
387
|
+
|-------|------|
|
|
388
|
+
| ๐๏ธ [Civil Engineer](specialized/domain-experts/civil-engineer.md) | Structures from seismic Tokyo to wind-swept Dubai. |
|
|
389
|
+
| ๐ฃ๏ธ [Developer Advocate](specialized/domain-experts/developer-advocate.md) | Product team โ developer community. |
|
|
390
|
+
| ๐๏ธ [Government Digital Presales Consultant](specialized/domain-experts/government-digital-presales-consultant.md) | China gov IT procurement, navigated. |
|
|
391
|
+
| ๐ [Supply Chain Strategist](specialized/domain-experts/supply-chain-strategist.md) | Procurement and resilience across China manufacturing. |
|
|
392
|
+
|
|
393
|
+
#### [`specialized/engineering-meta`](specialized/engineering-meta/) โ LSP, MCP, model QA, Salesforce, workflow
|
|
394
|
+
|
|
395
|
+
| Agent | Vibe |
|
|
396
|
+
|-------|------|
|
|
397
|
+
| ๐ [LSP/Index Engineer](specialized/engineering-meta/lsp-index-engineer.md) | LSP orchestration + semantic indexing. |
|
|
398
|
+
| ๐ [MCP Builder](specialized/engineering-meta/mcp-builder.md) | Tools that make AI agents useful. |
|
|
399
|
+
| ๐ฌ [Model QA Specialist](specialized/engineering-meta/model-qa.md) | ML audits end-to-end. |
|
|
400
|
+
| โ๏ธ [Salesforce Architect](specialized/engineering-meta/salesforce-architect.md) | Tangled org โ architecture that scales. |
|
|
401
|
+
| ๐บ๏ธ [Workflow Architect](specialized/engineering-meta/workflow-architect.md) | Every path mapped before code is written. |
|
|
402
|
+
|
|
403
|
+
#### [`specialized/exec-ops`](specialized/exec-ops/) โ Orchestration & chief of staff
|
|
404
|
+
|
|
405
|
+
| Agent | Vibe |
|
|
406
|
+
|-------|------|
|
|
407
|
+
| ๐๏ธ [Agents Orchestrator](specialized/exec-ops/agents-orchestrator.md) | Conducts the entire dev pipeline. |
|
|
408
|
+
| ๐งญ [Chief of Staff](specialized/exec-ops/chief-of-staff.md) | I own the space between functions. |
|
|
409
|
+
|
|
410
|
+
#### [`specialized/finance-ops`](specialized/finance-ops/) โ AP, loans, real estate
|
|
411
|
+
|
|
412
|
+
| Agent | Vibe |
|
|
413
|
+
|-------|------|
|
|
414
|
+
| ๐ธ [Accounts Payable Agent](specialized/finance-ops/accounts-payable-agent.md) | Crypto, fiat, stablecoins โ any rail. |
|
|
415
|
+
| ๐ฆ [Loan Officer Assistant](specialized/finance-ops/loan-officer-assistant.md) | Pipeline with precision and compliance. |
|
|
416
|
+
| ๐ [Real Estate Buyer & Seller](specialized/finance-ops/real-estate-buyer-seller.md) | Biggest financial decision, handled. |
|
|
417
|
+
|
|
418
|
+
#### [`specialized/healthcare`](specialized/healthcare/) โ Patient service & compliance
|
|
419
|
+
|
|
420
|
+
| Agent | Vibe |
|
|
421
|
+
|-------|------|
|
|
422
|
+
| ๐ฅ [Healthcare Customer Service](specialized/healthcare/healthcare-customer-service.md) | Patients heard, respected, supported. |
|
|
423
|
+
| โ๏ธ [Healthcare Marketing Compliance](specialized/healthcare/healthcare-marketing-compliance.md) | Legal in China's healthcare landscape. |
|
|
424
|
+
|
|
425
|
+
#### [`specialized/hr`](specialized/hr/) โ Training, onboarding, recruiting
|
|
426
|
+
|
|
427
|
+
| Agent | Vibe |
|
|
428
|
+
|-------|------|
|
|
429
|
+
| ๐ [Corporate Training Designer](specialized/hr/corporate-training-designer.md) | Training that drives behavior change. |
|
|
430
|
+
| ๐ค [HR Onboarding](specialized/hr/hr-onboarding.md) | First 90 days decide long-term outcome. |
|
|
431
|
+
| ๐ฏ [Recruitment Specialist](specialized/hr/recruitment-specialist.md) | Full-cycle recruiting across hiring platforms. |
|
|
432
|
+
|
|
433
|
+
#### [`specialized/legal`](specialized/legal/) โ Intake, review, billing
|
|
434
|
+
|
|
435
|
+
| Agent | Vibe |
|
|
436
|
+
|-------|------|
|
|
437
|
+
| โฑ๏ธ [Legal Billing & Time Tracking](specialized/legal/legal-billing-time-tracking.md) | Six minutes unbilled is money on the table. |
|
|
438
|
+
| ๐ [Legal Client Intake](specialized/legal/legal-client-intake.md) | First conversation sets the tone. |
|
|
439
|
+
| โ๏ธ [Legal Document Review](specialized/legal/legal-document-review.md) | Every word matters; every missed clause is liability. |
|
|
440
|
+
|
|
441
|
+
#### [`specialized/regional`](specialized/regional/) โ Cross-cultural, French, Korean, study abroad, translation
|
|
442
|
+
|
|
443
|
+
| Agent | Vibe |
|
|
444
|
+
|-------|------|
|
|
445
|
+
| ๐ [Cultural Intelligence Strategist](specialized/regional/cultural-intelligence-strategist.md) | Detects invisible exclusion across cultures. |
|
|
446
|
+
| ๐ซ๐ท [French Consulting Market Navigator](specialized/regional/french-consulting-market.md) | Decodes the French consulting food chain. |
|
|
447
|
+
| ๐ฐ๐ท [Korean Business Navigator](specialized/regional/korean-business-navigator.md) | Western directness โ Korean relationship dynamics. |
|
|
448
|
+
| ๐ [Language Translator](specialized/regional/language-translator.md) | Precision with cultural respect. |
|
|
449
|
+
| ๐ [Study Abroad Advisor](specialized/regional/study-abroad-advisor.md) | School, essays, visas โ end to end. |
|
|
450
|
+
|
|
451
|
+
#### [`specialized/sales-ops`](specialized/sales-ops/) โ Extraction & outreach
|
|
452
|
+
|
|
453
|
+
| Agent | Vibe |
|
|
454
|
+
|-------|------|
|
|
455
|
+
| ๐ [Sales Data Extraction Agent](specialized/sales-ops/sales-data-extraction-agent.md) | Watches Excel, extracts the metrics. |
|
|
456
|
+
| ๐ฏ [Sales Outreach](specialized/sales-ops/sales-outreach.md) | Help people buy, don't sell. |
|
|
457
|
+
|
|
458
|
+
### Support
|
|
459
|
+
|
|
460
|
+
#### [`support/analytics`](support/analytics/) โ Reporting, finance, executive summaries
|
|
461
|
+
|
|
462
|
+
| Agent | Vibe |
|
|
463
|
+
|-------|------|
|
|
464
|
+
| ๐ [Analytics Reporter](support/analytics/analytics-reporter.md) | Raw data โ insights that drive the next decision. |
|
|
465
|
+
| ๐ [Executive Summary Generator](support/analytics/executive-summary-generator.md) | Thinks McKinsey, writes for the C-suite. |
|
|
466
|
+
| ๐ฐ [Finance Tracker](support/analytics/finance-tracker.md) | Clean books, honest forecasts. |
|
|
467
|
+
|
|
468
|
+
#### [`support/ops-response`](support/ops-response/) โ Infra, compliance, support
|
|
469
|
+
|
|
470
|
+
| Agent | Vibe |
|
|
471
|
+
|-------|------|
|
|
472
|
+
| ๐ข [Infrastructure Maintainer](support/ops-response/infrastructure-maintainer.md) | Lights on, servers humming, alerts quiet. |
|
|
473
|
+
| โ๏ธ [Legal Compliance Checker](support/ops-response/legal-compliance-checker.md) | Compliance across every jurisdiction. |
|
|
474
|
+
| ๐ฌ [Support Responder](support/ops-response/support-responder.md) | Frustrated users โ loyal advocates. |
|
|
475
|
+
|
|
476
|
+
### Testing
|
|
477
|
+
|
|
478
|
+
#### [`testing/automation`](testing/automation/) โ APIs, evidence, results
|
|
479
|
+
|
|
480
|
+
| Agent | Vibe |
|
|
481
|
+
|-------|------|
|
|
482
|
+
| ๐ [API Tester](testing/automation/api-tester.md) | Breaks your API before users do. |
|
|
483
|
+
| ๐ธ [Evidence Collector](testing/automation/evidence-collector.md) | Won't approve without visual proof. |
|
|
484
|
+
| ๐ [Test Results Analyzer](testing/automation/test-results-analyzer.md) | Reads results like a detective reads evidence. |
|
|
485
|
+
|
|
486
|
+
#### [`testing/meta`](testing/meta/) โ Tool evaluation & workflow tuning
|
|
487
|
+
|
|
488
|
+
| Agent | Vibe |
|
|
489
|
+
|-------|------|
|
|
490
|
+
| ๐ง [Tool Evaluator](testing/meta/tool-evaluator.md) | The right tools, recommended. |
|
|
491
|
+
| โก [Workflow Optimizer](testing/meta/workflow-optimizer.md) | Bottleneck โ fixed โ automated. |
|
|
492
|
+
|
|
493
|
+
#### [`testing/quality`](testing/quality/) โ Accessibility, performance, reality
|
|
494
|
+
|
|
495
|
+
| Agent | Vibe |
|
|
496
|
+
|-------|------|
|
|
497
|
+
| โฟ [Accessibility Auditor](testing/quality/accessibility-auditor.md) | If it's not screen-reader tested, it's not accessible. |
|
|
498
|
+
| โฑ๏ธ [Performance Benchmarker](testing/quality/performance-benchmarker.md) | Measures, optimizes, proves it. |
|
|
499
|
+
| ๐ง [Reality Checker](testing/quality/reality-checker.md) | Defaults to "NEEDS WORK" โ overwhelming proof required. |
|
|
500
|
+
|
|
501
|
+
---
|
|
502
|
+
|
|
503
|
+
## Build your own
|
|
504
|
+
|
|
505
|
+
An agent is a directory:
|
|
506
|
+
|
|
507
|
+
```
|
|
508
|
+
my-agent/
|
|
509
|
+
bank-template.json # memory bank config (optional)
|
|
510
|
+
*.md # any markdown becomes seed knowledge
|
|
511
|
+
```
|
|
120
512
|
|
|
121
|
-
|
|
513
|
+
Nest for multi-level teams. Each level can have its own `bank-template.json`. Install with any of the local/repo/blank patterns shown at the top.
|
|
122
514
|
|
|
123
|
-
##
|
|
515
|
+
## Harnesses
|
|
124
516
|
|
|
125
|
-
| Harness | Flag |
|
|
126
|
-
|
|
127
|
-
| [Claude Chat](https://claude.ai) | `--harness claude` |
|
|
128
|
-
| [Claude
|
|
129
|
-
| [OpenClaw](https://openclaw.dev) | `--harness openclaw` |
|
|
130
|
-
| [NemoClaw](https://github.com/NVIDIA/NeMo-Agent) | `--harness nemoclaw` |
|
|
517
|
+
| Harness | Flag |
|
|
518
|
+
|---------|------|
|
|
519
|
+
| [Claude Chat](https://claude.ai) / Cowork | `--harness claude` |
|
|
520
|
+
| [Claude Code](https://claude.com/claude-code) | `--harness claude-code` |
|
|
521
|
+
| [OpenClaw](https://openclaw.dev) | `--harness openclaw` |
|
|
522
|
+
| [NemoClaw](https://github.com/NVIDIA/NeMo-Agent) | `--harness nemoclaw` |
|
|
523
|
+
| Hermes | `--harness hermes` |
|
|
131
524
|
|
|
132
|
-
##
|
|
525
|
+
## License
|
|
133
526
|
|
|
134
|
-
|
|
135
|
-
- A Hindsight account ([Cloud](https://hindsight.vectorize.io) or self-hosted)
|
|
136
|
-
- Everything else is handled by the CLI
|
|
527
|
+
MIT.
|
package/dist/cli.js
CHANGED
|
@@ -660,7 +660,9 @@ curl -s -X POST ${apiUrl}/v1/default/banks/${bankId}/memories/retain \\
|
|
|
660
660
|
execSync(`cd "${outDir}" && zip -j "${zipPath}" SKILL.md`, { stdio: "pipe" });
|
|
661
661
|
return zipPath;
|
|
662
662
|
}
|
|
663
|
-
async function promptClaudeConfig(agentId, opts = {
|
|
663
|
+
async function promptClaudeConfig(agentId, opts = {}) {
|
|
664
|
+
const askBankId = opts.askBankId ?? true;
|
|
665
|
+
const allowLocalhost = opts.allowLocalhost ?? false;
|
|
664
666
|
const deploymentType = await p.select({
|
|
665
667
|
message: "Hindsight deployment:",
|
|
666
668
|
options: [
|
|
@@ -679,11 +681,14 @@ async function promptClaudeConfig(agentId, opts = { askBankId: true }) {
|
|
|
679
681
|
else {
|
|
680
682
|
const urlInput = await p.text({
|
|
681
683
|
message: "Hindsight API URL:",
|
|
682
|
-
placeholder:
|
|
684
|
+
placeholder: allowLocalhost
|
|
685
|
+
? "http://localhost:9077 or https://your-hindsight.example.com"
|
|
686
|
+
: "https://your-hindsight.example.com",
|
|
683
687
|
validate: (val) => {
|
|
684
688
|
if (!val)
|
|
685
689
|
return "URL is required";
|
|
686
|
-
if (
|
|
690
|
+
if (!allowLocalhost &&
|
|
691
|
+
(val.startsWith("http://localhost") || val.startsWith("http://127.0.0.1"))) {
|
|
687
692
|
return "Claude cannot reach localhost. Use a publicly accessible URL.";
|
|
688
693
|
}
|
|
689
694
|
return undefined;
|
|
@@ -694,7 +699,9 @@ async function promptClaudeConfig(agentId, opts = { askBankId: true }) {
|
|
|
694
699
|
process.exit(0);
|
|
695
700
|
}
|
|
696
701
|
apiUrl = urlInput;
|
|
697
|
-
|
|
702
|
+
if (!allowLocalhost) {
|
|
703
|
+
p.log.warn("Make sure your Hindsight instance is publicly accessible from Claude's servers.");
|
|
704
|
+
}
|
|
698
705
|
}
|
|
699
706
|
const tokenInput = await p.password({ message: "Hindsight API token:" });
|
|
700
707
|
if (p.isCancel(tokenInput)) {
|
|
@@ -703,7 +710,7 @@ async function promptClaudeConfig(agentId, opts = { askBankId: true }) {
|
|
|
703
710
|
}
|
|
704
711
|
const apiToken = tokenInput || undefined;
|
|
705
712
|
let bankId = agentId;
|
|
706
|
-
if (
|
|
713
|
+
if (askBankId) {
|
|
707
714
|
const bankInput = await p.text({
|
|
708
715
|
message: "Bank ID:",
|
|
709
716
|
initialValue: agentId,
|
|
@@ -992,9 +999,29 @@ async function main() {
|
|
|
992
999
|
catch { /* ignore */ }
|
|
993
1000
|
}
|
|
994
1001
|
const hasConnection = ccConfig.hindsightApiUrl || ccConfig.llmProvider;
|
|
995
|
-
|
|
1002
|
+
let reconfigure = !hasConnection;
|
|
1003
|
+
if (hasConnection && process.stdin.isTTY) {
|
|
1004
|
+
const summary = ccConfig.hindsightApiUrl === HINDSIGHT_CLOUD_API_URL
|
|
1005
|
+
? "Cloud (api.hindsight.vectorize.io)"
|
|
1006
|
+
: ccConfig.hindsightApiUrl
|
|
1007
|
+
? `External: ${ccConfig.hindsightApiUrl}`
|
|
1008
|
+
: `LLM provider: ${ccConfig.llmProvider}`;
|
|
1009
|
+
const ok = await p.confirm({
|
|
1010
|
+
message: `Hindsight: ${color.cyan(summary)}. Use this?\n${color.dim(" Changing this will affect all existing Claude Code agents โ one Claude Code install shares a single Hindsight connection.")}`,
|
|
1011
|
+
});
|
|
1012
|
+
if (p.isCancel(ok)) {
|
|
1013
|
+
p.cancel("Cancelled.");
|
|
1014
|
+
process.exit(0);
|
|
1015
|
+
}
|
|
1016
|
+
if (!ok)
|
|
1017
|
+
reconfigure = true;
|
|
1018
|
+
}
|
|
1019
|
+
if (reconfigure && process.stdin.isTTY) {
|
|
996
1020
|
// Bank ID is derived from agent + cwd at runtime โ don't ask for it
|
|
997
|
-
const claudeConfig = await promptClaudeConfig(agentId, {
|
|
1021
|
+
const claudeConfig = await promptClaudeConfig(agentId, {
|
|
1022
|
+
askBankId: false,
|
|
1023
|
+
allowLocalhost: true,
|
|
1024
|
+
});
|
|
998
1025
|
ccConfig.hindsightApiUrl = claudeConfig.apiUrl;
|
|
999
1026
|
ccConfig.hindsightApiToken = claudeConfig.apiToken;
|
|
1000
1027
|
}
|
package/dist/skill/SKILL.md
CHANGED
|
@@ -41,7 +41,9 @@ Use when pages don't cover what you need.
|
|
|
41
41
|
|
|
42
42
|
## Ingesting documents
|
|
43
43
|
|
|
44
|
-
`agent_knowledge_ingest(title, content)` โ upload raw content into memory. Never summarize before ingesting.
|
|
44
|
+
`agent_knowledge_ingest(title, content)` โ upload raw content into memory. Never summarize before ingesting. Pass the full text inline.
|
|
45
|
+
|
|
46
|
+
`agent_knowledge_ingest_files(paths)` โ ingest one or more files straight from disk. `paths` is a list of file paths or glob patterns (e.g. `["docs/**/*.md", "/abs/path/notes.txt"]`). Each file's content is read and stored under a document ID derived from its path. Prefer this over `agent_knowledge_ingest` when the content already lives in files โ no need to read them first. Use absolute paths when in doubt; relative paths resolve against the working directory.
|
|
45
47
|
|
|
46
48
|
## Updating and deleting
|
|
47
49
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach } from "vitest";
|
|
2
|
+
import { mkdtempSync, rmSync, writeFileSync, mkdirSync } from "fs";
|
|
3
|
+
import { tmpdir } from "os";
|
|
4
|
+
import { join, resolve } from "path";
|
|
5
|
+
// @ts-expect-error - .mjs has no type declarations; runtime import is fine
|
|
6
|
+
import { findBankTemplates, lintBankTemplate, lintAll } from "../scripts/lint-bank-templates.mjs";
|
|
7
|
+
const REPO_ROOT = resolve(__dirname, "..", "..");
|
|
8
|
+
describe("lint-bank-templates", () => {
|
|
9
|
+
let dir;
|
|
10
|
+
beforeEach(() => {
|
|
11
|
+
dir = mkdtempSync(join(tmpdir(), "sda-lint-"));
|
|
12
|
+
});
|
|
13
|
+
afterEach(() => {
|
|
14
|
+
rmSync(dir, { recursive: true, force: true });
|
|
15
|
+
});
|
|
16
|
+
it("accepts a valid template (observations_mission + >=1 mental_models, no reflect_mission)", () => {
|
|
17
|
+
const file = join(dir, "bank-template.json");
|
|
18
|
+
writeFileSync(file, JSON.stringify({
|
|
19
|
+
version: "1",
|
|
20
|
+
bank: { observations_mission: "watch X" },
|
|
21
|
+
mental_models: [{ id: "a", name: "A" }],
|
|
22
|
+
}));
|
|
23
|
+
expect(lintBankTemplate(file)).toEqual([]);
|
|
24
|
+
});
|
|
25
|
+
it("rejects missing observations_mission", () => {
|
|
26
|
+
const file = join(dir, "bank-template.json");
|
|
27
|
+
writeFileSync(file, JSON.stringify({ bank: {}, mental_models: [{ id: "a", name: "A" }] }));
|
|
28
|
+
const errs = lintBankTemplate(file);
|
|
29
|
+
expect(errs.some((e) => e.includes("observations_mission"))).toBe(true);
|
|
30
|
+
});
|
|
31
|
+
it("rejects empty observations_mission", () => {
|
|
32
|
+
const file = join(dir, "bank-template.json");
|
|
33
|
+
writeFileSync(file, JSON.stringify({
|
|
34
|
+
bank: { observations_mission: " " },
|
|
35
|
+
mental_models: [{ id: "a", name: "A" }],
|
|
36
|
+
}));
|
|
37
|
+
const errs = lintBankTemplate(file);
|
|
38
|
+
expect(errs.some((e) => e.includes("observations_mission"))).toBe(true);
|
|
39
|
+
});
|
|
40
|
+
it("rejects empty mental_models", () => {
|
|
41
|
+
const file = join(dir, "bank-template.json");
|
|
42
|
+
writeFileSync(file, JSON.stringify({
|
|
43
|
+
bank: { observations_mission: "watch X" },
|
|
44
|
+
mental_models: [],
|
|
45
|
+
}));
|
|
46
|
+
const errs = lintBankTemplate(file);
|
|
47
|
+
expect(errs.some((e) => e.includes("mental_models"))).toBe(true);
|
|
48
|
+
});
|
|
49
|
+
it("rejects missing mental_models entirely", () => {
|
|
50
|
+
const file = join(dir, "bank-template.json");
|
|
51
|
+
writeFileSync(file, JSON.stringify({ bank: { observations_mission: "watch X" } }));
|
|
52
|
+
const errs = lintBankTemplate(file);
|
|
53
|
+
expect(errs.some((e) => e.includes("mental_models"))).toBe(true);
|
|
54
|
+
});
|
|
55
|
+
it("rejects deprecated reflect_mission", () => {
|
|
56
|
+
const file = join(dir, "bank-template.json");
|
|
57
|
+
writeFileSync(file, JSON.stringify({
|
|
58
|
+
bank: { observations_mission: "watch X", reflect_mission: "old" },
|
|
59
|
+
mental_models: [{ id: "a", name: "A" }],
|
|
60
|
+
}));
|
|
61
|
+
const errs = lintBankTemplate(file);
|
|
62
|
+
expect(errs.some((e) => e.includes("reflect_mission"))).toBe(true);
|
|
63
|
+
});
|
|
64
|
+
it("rejects invalid JSON", () => {
|
|
65
|
+
const file = join(dir, "bank-template.json");
|
|
66
|
+
writeFileSync(file, "{ not json");
|
|
67
|
+
const errs = lintBankTemplate(file);
|
|
68
|
+
expect(errs.some((e) => e.toLowerCase().includes("json"))).toBe(true);
|
|
69
|
+
});
|
|
70
|
+
it("findBankTemplates walks recursively and skips node_modules", () => {
|
|
71
|
+
mkdirSync(join(dir, "a", "b"), { recursive: true });
|
|
72
|
+
mkdirSync(join(dir, "node_modules", "x"), { recursive: true });
|
|
73
|
+
writeFileSync(join(dir, "bank-template.json"), "{}");
|
|
74
|
+
writeFileSync(join(dir, "a", "bank-template.json"), "{}");
|
|
75
|
+
writeFileSync(join(dir, "a", "b", "bank-template.json"), "{}");
|
|
76
|
+
writeFileSync(join(dir, "node_modules", "x", "bank-template.json"), "{}");
|
|
77
|
+
const found = findBankTemplates(dir);
|
|
78
|
+
expect(found).toHaveLength(3);
|
|
79
|
+
expect(found.every((f) => !f.includes("node_modules"))).toBe(true);
|
|
80
|
+
});
|
|
81
|
+
it("the actual repo passes lint", () => {
|
|
82
|
+
const issues = lintAll(REPO_ROOT);
|
|
83
|
+
expect(issues).toEqual([]);
|
|
84
|
+
});
|
|
85
|
+
});
|
|
@@ -0,0 +1,470 @@
|
|
|
1
|
+
"""Self-driving agents Hindsight plugin for Hermes.
|
|
2
|
+
|
|
3
|
+
Registers agent_knowledge_* tools as a regular plugin (not a memory provider),
|
|
4
|
+
so it coexists with the bundled hindsight memory provider or any other provider.
|
|
5
|
+
|
|
6
|
+
Config read from the active Hermes profile's hindsight/config.json (the same file
|
|
7
|
+
the bundled hindsight provider uses), so both share one bank, API URL, and key:
|
|
8
|
+
{ "api_url": "...", "api_key": "...", "bank_id": "..." }
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
import glob
|
|
14
|
+
import json
|
|
15
|
+
import logging
|
|
16
|
+
import os
|
|
17
|
+
from pathlib import Path
|
|
18
|
+
from typing import Any
|
|
19
|
+
|
|
20
|
+
import httpx
|
|
21
|
+
|
|
22
|
+
logger = logging.getLogger(__name__)
|
|
23
|
+
|
|
24
|
+
PAGE_DEFAULTS = {
|
|
25
|
+
"mode": "delta",
|
|
26
|
+
"refresh_after_consolidation": True,
|
|
27
|
+
"exclude_mental_models": True,
|
|
28
|
+
"fact_types": ["observation"],
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def _get_hermes_home() -> Path:
|
|
33
|
+
"""Resolve the active Hermes home, profile-isolation aware.
|
|
34
|
+
|
|
35
|
+
Prefer Hermes's own resolver: it honors the in-process profile override and
|
|
36
|
+
the active-profile marker, not just the ``HERMES_HOME`` env var. This is what
|
|
37
|
+
makes us read the *same* config.json the bundled hindsight provider reads โ
|
|
38
|
+
if we only checked the env var (which is often unset in the agent worker) we
|
|
39
|
+
could silently fall back to the global ~/.hermes config and write to the
|
|
40
|
+
wrong bank. Fall back to the env var, then the default, if Hermes isn't importable.
|
|
41
|
+
"""
|
|
42
|
+
try:
|
|
43
|
+
from hermes_constants import get_hermes_home # type: ignore
|
|
44
|
+
return Path(get_hermes_home())
|
|
45
|
+
except Exception:
|
|
46
|
+
env = os.environ.get("HERMES_HOME")
|
|
47
|
+
if env:
|
|
48
|
+
return Path(env)
|
|
49
|
+
return Path.home() / ".hermes"
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def _load_config() -> dict | None:
|
|
53
|
+
"""Load Hindsight config from the active Hermes profile.
|
|
54
|
+
|
|
55
|
+
Reads the same config.json the bundled hindsight provider uses,
|
|
56
|
+
so both share the same bank, API URL, and credentials.
|
|
57
|
+
"""
|
|
58
|
+
cfg_path = _get_hermes_home() / "hindsight" / "config.json"
|
|
59
|
+
if not cfg_path.exists():
|
|
60
|
+
return None
|
|
61
|
+
try:
|
|
62
|
+
cfg = json.loads(cfg_path.read_text())
|
|
63
|
+
# Normalize field names (bundled provider uses api_url/api_key,
|
|
64
|
+
# we expose as api_url/api_token for consistency with other harnesses)
|
|
65
|
+
return {
|
|
66
|
+
"api_url": cfg.get("api_url", ""),
|
|
67
|
+
"api_token": cfg.get("api_key", ""),
|
|
68
|
+
"bank_id": cfg.get("bank_id", "hermes"),
|
|
69
|
+
}
|
|
70
|
+
except Exception:
|
|
71
|
+
return None
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def _api(
|
|
75
|
+
api_url: str,
|
|
76
|
+
path: str,
|
|
77
|
+
method: str = "GET",
|
|
78
|
+
body: dict | None = None,
|
|
79
|
+
token: str | None = None,
|
|
80
|
+
timeout: float = 30.0,
|
|
81
|
+
) -> Any:
|
|
82
|
+
headers: dict[str, str] = {"Content-Type": "application/json"}
|
|
83
|
+
if token:
|
|
84
|
+
headers["Authorization"] = f"Bearer {token}"
|
|
85
|
+
resp = httpx.request(
|
|
86
|
+
method,
|
|
87
|
+
f"{api_url}{path}",
|
|
88
|
+
json=body,
|
|
89
|
+
headers=headers,
|
|
90
|
+
timeout=timeout,
|
|
91
|
+
)
|
|
92
|
+
resp.raise_for_status()
|
|
93
|
+
return resp.json() if resp.content else {}
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def _is_available() -> bool:
|
|
97
|
+
return _load_config() is not None
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
# โโ Tool handlers โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
def _handle_list_pages(args: dict, **kwargs: Any) -> str:
|
|
104
|
+
config = _load_config()
|
|
105
|
+
if not config:
|
|
106
|
+
return json.dumps({"error": "Plugin not configured"})
|
|
107
|
+
api_url = config["api_url"].rstrip("/")
|
|
108
|
+
token = config.get("api_token")
|
|
109
|
+
bank_id = config["bank_id"]
|
|
110
|
+
try:
|
|
111
|
+
result = _api(api_url, f"/v1/default/banks/{bank_id}/mental-models?detail=metadata", "GET", token=token)
|
|
112
|
+
return json.dumps(result, indent=2)
|
|
113
|
+
except Exception as e:
|
|
114
|
+
return json.dumps({"error": str(e)})
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def _handle_get_page(args: dict, **kwargs: Any) -> str:
|
|
118
|
+
config = _load_config()
|
|
119
|
+
if not config:
|
|
120
|
+
return json.dumps({"error": "Plugin not configured"})
|
|
121
|
+
api_url = config["api_url"].rstrip("/")
|
|
122
|
+
token = config.get("api_token")
|
|
123
|
+
bank_id = config["bank_id"]
|
|
124
|
+
try:
|
|
125
|
+
result = _api(api_url, f"/v1/default/banks/{bank_id}/mental-models/{args['page_id']}", "GET", token=token)
|
|
126
|
+
return json.dumps(result, indent=2)
|
|
127
|
+
except Exception as e:
|
|
128
|
+
return json.dumps({"error": str(e)})
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
def _handle_create_page(args: dict, **kwargs: Any) -> str:
|
|
132
|
+
config = _load_config()
|
|
133
|
+
if not config:
|
|
134
|
+
return json.dumps({"error": "Plugin not configured"})
|
|
135
|
+
api_url = config["api_url"].rstrip("/")
|
|
136
|
+
token = config.get("api_token")
|
|
137
|
+
bank_id = config["bank_id"]
|
|
138
|
+
try:
|
|
139
|
+
result = _api(
|
|
140
|
+
api_url,
|
|
141
|
+
f"/v1/default/banks/{bank_id}/mental-models",
|
|
142
|
+
"POST",
|
|
143
|
+
body={
|
|
144
|
+
"id": args["page_id"],
|
|
145
|
+
"name": args["name"],
|
|
146
|
+
"source_query": args["source_query"],
|
|
147
|
+
"max_tokens": 4096,
|
|
148
|
+
"trigger": PAGE_DEFAULTS,
|
|
149
|
+
},
|
|
150
|
+
token=token,
|
|
151
|
+
)
|
|
152
|
+
return json.dumps(result, indent=2)
|
|
153
|
+
except Exception as e:
|
|
154
|
+
return json.dumps({"error": str(e)})
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
def _handle_update_page(args: dict, **kwargs: Any) -> str:
|
|
158
|
+
config = _load_config()
|
|
159
|
+
if not config:
|
|
160
|
+
return json.dumps({"error": "Plugin not configured"})
|
|
161
|
+
api_url = config["api_url"].rstrip("/")
|
|
162
|
+
token = config.get("api_token")
|
|
163
|
+
bank_id = config["bank_id"]
|
|
164
|
+
try:
|
|
165
|
+
body: dict[str, str] = {}
|
|
166
|
+
if args.get("name"):
|
|
167
|
+
body["name"] = args["name"]
|
|
168
|
+
if args.get("source_query"):
|
|
169
|
+
body["source_query"] = args["source_query"]
|
|
170
|
+
result = _api(api_url, f"/v1/default/banks/{bank_id}/mental-models/{args['page_id']}", "PATCH", body=body, token=token)
|
|
171
|
+
return json.dumps(result, indent=2)
|
|
172
|
+
except Exception as e:
|
|
173
|
+
return json.dumps({"error": str(e)})
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
def _handle_delete_page(args: dict, **kwargs: Any) -> str:
|
|
177
|
+
config = _load_config()
|
|
178
|
+
if not config:
|
|
179
|
+
return json.dumps({"error": "Plugin not configured"})
|
|
180
|
+
api_url = config["api_url"].rstrip("/")
|
|
181
|
+
token = config.get("api_token")
|
|
182
|
+
bank_id = config["bank_id"]
|
|
183
|
+
try:
|
|
184
|
+
_api(api_url, f"/v1/default/banks/{bank_id}/mental-models/{args['page_id']}", "DELETE", token=token)
|
|
185
|
+
return json.dumps({"success": True})
|
|
186
|
+
except Exception as e:
|
|
187
|
+
return json.dumps({"error": str(e)})
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
def _handle_recall(args: dict, **kwargs: Any) -> str:
|
|
191
|
+
config = _load_config()
|
|
192
|
+
if not config:
|
|
193
|
+
return json.dumps({"error": "Plugin not configured"})
|
|
194
|
+
api_url = config["api_url"].rstrip("/")
|
|
195
|
+
token = config.get("api_token")
|
|
196
|
+
bank_id = config["bank_id"]
|
|
197
|
+
try:
|
|
198
|
+
result = _api(
|
|
199
|
+
api_url,
|
|
200
|
+
f"/v1/default/banks/{bank_id}/memories/recall",
|
|
201
|
+
"POST",
|
|
202
|
+
body={"query": args["query"], "max_results": args.get("max_results", 10)},
|
|
203
|
+
token=token,
|
|
204
|
+
)
|
|
205
|
+
return json.dumps(result, indent=2)
|
|
206
|
+
except Exception as e:
|
|
207
|
+
return json.dumps({"error": str(e)})
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
def _handle_ingest(args: dict, **kwargs: Any) -> str:
|
|
211
|
+
config = _load_config()
|
|
212
|
+
if not config:
|
|
213
|
+
return json.dumps({"error": "Plugin not configured"})
|
|
214
|
+
api_url = config["api_url"].rstrip("/")
|
|
215
|
+
token = config.get("api_token")
|
|
216
|
+
bank_id = config["bank_id"]
|
|
217
|
+
try:
|
|
218
|
+
doc_id = args["title"].lower().replace(" ", "-")
|
|
219
|
+
result = _api(
|
|
220
|
+
api_url,
|
|
221
|
+
f"/v1/default/banks/{bank_id}/memories",
|
|
222
|
+
"POST",
|
|
223
|
+
body={"items": [{"content": args["content"], "document_id": doc_id}], "async": True},
|
|
224
|
+
token=token,
|
|
225
|
+
)
|
|
226
|
+
return json.dumps(result, indent=2)
|
|
227
|
+
except Exception as e:
|
|
228
|
+
return json.dumps({"error": str(e)})
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
def _doc_id_for(path: Path) -> str:
|
|
232
|
+
"""Stable, collision-resistant document id from a file path."""
|
|
233
|
+
try:
|
|
234
|
+
rel = path.resolve().relative_to(Path.cwd().resolve())
|
|
235
|
+
except ValueError:
|
|
236
|
+
rel = Path(path.name)
|
|
237
|
+
return str(rel).lower().replace(os.sep, "-").replace(" ", "-").lstrip("-")
|
|
238
|
+
|
|
239
|
+
|
|
240
|
+
def _handle_ingest_files(args: dict, **kwargs: Any) -> str:
|
|
241
|
+
config = _load_config()
|
|
242
|
+
if not config:
|
|
243
|
+
return json.dumps({"error": "Plugin not configured"})
|
|
244
|
+
api_url = config["api_url"].rstrip("/")
|
|
245
|
+
token = config.get("api_token")
|
|
246
|
+
bank_id = config["bank_id"]
|
|
247
|
+
|
|
248
|
+
patterns = args.get("paths") or []
|
|
249
|
+
if isinstance(patterns, str):
|
|
250
|
+
patterns = [patterns]
|
|
251
|
+
if not patterns:
|
|
252
|
+
return json.dumps({"error": "No paths provided"})
|
|
253
|
+
|
|
254
|
+
# Expand globs (and literal paths), dedupe, keep deterministic order
|
|
255
|
+
resolved: list[Path] = []
|
|
256
|
+
seen: set[str] = set()
|
|
257
|
+
for pat in patterns:
|
|
258
|
+
expanded = os.path.expanduser(pat)
|
|
259
|
+
matches = glob.glob(expanded, recursive=True)
|
|
260
|
+
if not matches and os.path.exists(expanded):
|
|
261
|
+
matches = [expanded]
|
|
262
|
+
for m in sorted(matches):
|
|
263
|
+
p = Path(m)
|
|
264
|
+
key = str(p.resolve())
|
|
265
|
+
if p.is_file() and key not in seen:
|
|
266
|
+
seen.add(key)
|
|
267
|
+
resolved.append(p)
|
|
268
|
+
|
|
269
|
+
if not resolved:
|
|
270
|
+
return json.dumps({"error": "No files matched", "patterns": patterns})
|
|
271
|
+
|
|
272
|
+
items: list[dict] = []
|
|
273
|
+
errors: list[dict] = []
|
|
274
|
+
for p in resolved:
|
|
275
|
+
try:
|
|
276
|
+
content = p.read_text(encoding="utf-8", errors="replace")
|
|
277
|
+
except Exception as e:
|
|
278
|
+
errors.append({"path": str(p), "error": str(e)})
|
|
279
|
+
continue
|
|
280
|
+
if not content.strip():
|
|
281
|
+
errors.append({"path": str(p), "error": "empty file, skipped"})
|
|
282
|
+
continue
|
|
283
|
+
items.append({"content": content, "document_id": _doc_id_for(p)})
|
|
284
|
+
|
|
285
|
+
if not items:
|
|
286
|
+
return json.dumps({"error": "No readable, non-empty files", "errors": errors})
|
|
287
|
+
|
|
288
|
+
try:
|
|
289
|
+
result = _api(
|
|
290
|
+
api_url,
|
|
291
|
+
f"/v1/default/banks/{bank_id}/memories",
|
|
292
|
+
"POST",
|
|
293
|
+
body={"items": items, "async": True},
|
|
294
|
+
token=token,
|
|
295
|
+
)
|
|
296
|
+
return json.dumps(
|
|
297
|
+
{"ingested": len(items), "document_ids": [it["document_id"] for it in items],
|
|
298
|
+
"errors": errors, "result": result},
|
|
299
|
+
indent=2,
|
|
300
|
+
)
|
|
301
|
+
except Exception as e:
|
|
302
|
+
return json.dumps({"error": str(e), "errors": errors})
|
|
303
|
+
|
|
304
|
+
|
|
305
|
+
# โโ Tool schemas โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
306
|
+
|
|
307
|
+
_TOOLS = [
|
|
308
|
+
(
|
|
309
|
+
"agent_knowledge_list_pages",
|
|
310
|
+
{
|
|
311
|
+
"name": "agent_knowledge_list_pages",
|
|
312
|
+
"description": "List all your knowledge pages (IDs and names only). Use agent_knowledge_get_page to read the full content of a specific page.",
|
|
313
|
+
"parameters": {"type": "object", "properties": {}},
|
|
314
|
+
},
|
|
315
|
+
_handle_list_pages,
|
|
316
|
+
"๐",
|
|
317
|
+
),
|
|
318
|
+
(
|
|
319
|
+
"agent_knowledge_get_page",
|
|
320
|
+
{
|
|
321
|
+
"name": "agent_knowledge_get_page",
|
|
322
|
+
"description": "Read a specific knowledge page by its ID. Returns the full synthesized content.",
|
|
323
|
+
"parameters": {
|
|
324
|
+
"type": "object",
|
|
325
|
+
"properties": {
|
|
326
|
+
"page_id": {"type": "string", "description": "Page ID (e.g. 'user-preferences')"},
|
|
327
|
+
},
|
|
328
|
+
"required": ["page_id"],
|
|
329
|
+
},
|
|
330
|
+
},
|
|
331
|
+
_handle_get_page,
|
|
332
|
+
"๐",
|
|
333
|
+
),
|
|
334
|
+
(
|
|
335
|
+
"agent_knowledge_create_page",
|
|
336
|
+
{
|
|
337
|
+
"name": "agent_knowledge_create_page",
|
|
338
|
+
"description": (
|
|
339
|
+
"Create a new knowledge page. The source_query is a question the system "
|
|
340
|
+
"re-asks after each consolidation to rebuild the page from conversation observations."
|
|
341
|
+
),
|
|
342
|
+
"parameters": {
|
|
343
|
+
"type": "object",
|
|
344
|
+
"properties": {
|
|
345
|
+
"page_id": {"type": "string", "description": "Unique page ID, lowercase with hyphens"},
|
|
346
|
+
"name": {"type": "string", "description": "Human-readable page name"},
|
|
347
|
+
"source_query": {"type": "string", "description": "The question that rebuilds this page"},
|
|
348
|
+
},
|
|
349
|
+
"required": ["page_id", "name", "source_query"],
|
|
350
|
+
},
|
|
351
|
+
},
|
|
352
|
+
_handle_create_page,
|
|
353
|
+
"๐",
|
|
354
|
+
),
|
|
355
|
+
(
|
|
356
|
+
"agent_knowledge_update_page",
|
|
357
|
+
{
|
|
358
|
+
"name": "agent_knowledge_update_page",
|
|
359
|
+
"description": "Update a page's name or source query. Content re-synthesizes on next consolidation.",
|
|
360
|
+
"parameters": {
|
|
361
|
+
"type": "object",
|
|
362
|
+
"properties": {
|
|
363
|
+
"page_id": {"type": "string", "description": "Page ID to update"},
|
|
364
|
+
"name": {"type": "string", "description": "New name (optional)"},
|
|
365
|
+
"source_query": {"type": "string", "description": "New source query (optional)"},
|
|
366
|
+
},
|
|
367
|
+
"required": ["page_id"],
|
|
368
|
+
},
|
|
369
|
+
},
|
|
370
|
+
_handle_update_page,
|
|
371
|
+
"โ๏ธ",
|
|
372
|
+
),
|
|
373
|
+
(
|
|
374
|
+
"agent_knowledge_delete_page",
|
|
375
|
+
{
|
|
376
|
+
"name": "agent_knowledge_delete_page",
|
|
377
|
+
"description": "Permanently delete a knowledge page.",
|
|
378
|
+
"parameters": {
|
|
379
|
+
"type": "object",
|
|
380
|
+
"properties": {
|
|
381
|
+
"page_id": {"type": "string", "description": "Page ID to delete"},
|
|
382
|
+
},
|
|
383
|
+
"required": ["page_id"],
|
|
384
|
+
},
|
|
385
|
+
},
|
|
386
|
+
_handle_delete_page,
|
|
387
|
+
"๐๏ธ",
|
|
388
|
+
),
|
|
389
|
+
(
|
|
390
|
+
"agent_knowledge_recall",
|
|
391
|
+
{
|
|
392
|
+
"name": "agent_knowledge_recall",
|
|
393
|
+
"description": "Search across all retained conversations and documents for specific facts, numbers, or details not covered by your knowledge pages.",
|
|
394
|
+
"parameters": {
|
|
395
|
+
"type": "object",
|
|
396
|
+
"properties": {
|
|
397
|
+
"query": {"type": "string", "description": "What to search for"},
|
|
398
|
+
"max_results": {"type": "number", "description": "Max results (default 10)"},
|
|
399
|
+
},
|
|
400
|
+
"required": ["query"],
|
|
401
|
+
},
|
|
402
|
+
},
|
|
403
|
+
_handle_recall,
|
|
404
|
+
"๐",
|
|
405
|
+
),
|
|
406
|
+
(
|
|
407
|
+
"agent_knowledge_ingest",
|
|
408
|
+
{
|
|
409
|
+
"name": "agent_knowledge_ingest",
|
|
410
|
+
"description": (
|
|
411
|
+
"Upload a document into your memory bank. Pass the full raw content โ "
|
|
412
|
+
"never summarize before ingesting. The title becomes the document ID."
|
|
413
|
+
),
|
|
414
|
+
"parameters": {
|
|
415
|
+
"type": "object",
|
|
416
|
+
"properties": {
|
|
417
|
+
"title": {"type": "string", "description": "Document title (becomes the document ID)"},
|
|
418
|
+
"content": {"type": "string", "description": "Full raw document content"},
|
|
419
|
+
},
|
|
420
|
+
"required": ["title", "content"],
|
|
421
|
+
},
|
|
422
|
+
},
|
|
423
|
+
_handle_ingest,
|
|
424
|
+
"๐ฅ",
|
|
425
|
+
),
|
|
426
|
+
(
|
|
427
|
+
"agent_knowledge_ingest_files",
|
|
428
|
+
{
|
|
429
|
+
"name": "agent_knowledge_ingest_files",
|
|
430
|
+
"description": (
|
|
431
|
+
"Ingest one or more files from disk into your memory bank by path. "
|
|
432
|
+
"Accepts explicit file paths or glob patterns (e.g. 'docs/**/*.md'). "
|
|
433
|
+
"Reads each file's full raw content โ never summarizes. Each file's path "
|
|
434
|
+
"becomes its document ID. Prefer absolute paths; relative paths resolve "
|
|
435
|
+
"against the agent's working directory. Use this instead of "
|
|
436
|
+
"agent_knowledge_ingest when the content already lives in files."
|
|
437
|
+
),
|
|
438
|
+
"parameters": {
|
|
439
|
+
"type": "object",
|
|
440
|
+
"properties": {
|
|
441
|
+
"paths": {
|
|
442
|
+
"type": "array",
|
|
443
|
+
"items": {"type": "string"},
|
|
444
|
+
"description": "File paths or glob patterns to ingest",
|
|
445
|
+
},
|
|
446
|
+
},
|
|
447
|
+
"required": ["paths"],
|
|
448
|
+
},
|
|
449
|
+
},
|
|
450
|
+
_handle_ingest_files,
|
|
451
|
+
"๐",
|
|
452
|
+
),
|
|
453
|
+
]
|
|
454
|
+
|
|
455
|
+
|
|
456
|
+
# โโ Registration โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
457
|
+
|
|
458
|
+
|
|
459
|
+
def register(ctx: Any) -> None:
|
|
460
|
+
"""Register agent_knowledge_* tools. Called once by the Hermes plugin loader."""
|
|
461
|
+
for name, schema, handler, emoji in _TOOLS:
|
|
462
|
+
ctx.register_tool(
|
|
463
|
+
name=name,
|
|
464
|
+
toolset="hindsight-sda",
|
|
465
|
+
schema=schema,
|
|
466
|
+
handler=handler,
|
|
467
|
+
check_fn=_is_available,
|
|
468
|
+
emoji=emoji,
|
|
469
|
+
)
|
|
470
|
+
logger.info("[hindsight-sda] registered %d tools", len(_TOOLS))
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
name: hindsight-sda
|
|
2
|
+
version: 0.2.0
|
|
3
|
+
description: "Self-driving agents knowledge tools powered by Hindsight. Provides agent_knowledge_* tools for managing knowledge pages, recall, and ingestion (raw content or files)."
|
|
4
|
+
kind: standalone
|
|
5
|
+
pip_dependencies:
|
|
6
|
+
- "httpx>=0.27"
|
|
7
|
+
requires_env: []
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vectorize-io/self-driving-agents",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.26",
|
|
4
4
|
"description": "Install self-driving agents with portable memory on any harness",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/cli.js",
|
|
@@ -8,11 +8,13 @@
|
|
|
8
8
|
"self-driving-agents": "dist/cli.js"
|
|
9
9
|
},
|
|
10
10
|
"files": [
|
|
11
|
-
"dist"
|
|
11
|
+
"dist",
|
|
12
|
+
"hermes-plugin"
|
|
12
13
|
],
|
|
13
14
|
"scripts": {
|
|
14
15
|
"build": "tsc && cp -r src/skill dist/",
|
|
15
16
|
"test": "vitest run src/tests",
|
|
17
|
+
"lint": "node src/scripts/lint-bank-templates.mjs .",
|
|
16
18
|
"prepublishOnly": "npm run build"
|
|
17
19
|
},
|
|
18
20
|
"keywords": [
|