@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 CHANGED
@@ -1,136 +1,527 @@
1
- # Self-Driving Agents
1
+ <p align="center">
2
+ <img src="public/sda-banner.jpg" alt="Self-Driving Agents" />
3
+ </p>
2
4
 
3
- Agents that learn from every conversation and get better over time.
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
- No retraining, no manual updates โ€” just use them and they improve. Powered by [Hindsight](https://github.com/vectorize-io/hindsight), so agent memory is portable across harnesses.
15
+ ## A Complete AI Workforce in a Box
6
16
 
7
- ๐Ÿ“– **Docs:** <https://vectorize-io.github.io/self-driving-agents/>
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
- ## Quick start
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
- The CLI prompts for your Hindsight connection (Cloud or self-hosted), creates a skill zip, and tells you how to upload it. Then type `/<agent-name>` in any conversation to activate the agent.
33
+ Harnesses: `claude` ยท `claude-code` ยท `openclaw` ยท `nemoclaw` ยท `hermes`
18
34
 
19
- ### OpenClaw
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
- ```bash
22
- npx @vectorize-io/self-driving-agents install marketing/seo --harness openclaw
23
- ```
37
+ ---
24
38
 
25
- ### NemoClaw
39
+ ## Roster
26
40
 
27
- ```bash
28
- npx @vectorize-io/self-driving-agents install marketing/seo --harness nemoclaw
29
- ```
41
+ ### Design
30
42
 
31
- That's it. The CLI fetches the agent from this repo, sets up its memory bank, ingests the seed knowledge, and registers it with your harness. Follow the on-screen instructions to start chatting.
43
+ #### [`design/ux`](design/ux/) โ€” UX research, UI, architecture
32
44
 
33
- You can also point at a local directory or any GitHub repo:
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
- ```bash
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
- Or start with a blank agent โ€” no template, no seed content โ€” using `--empty`:
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
- ```bash
43
- npx @vectorize-io/self-driving-agents install my-agent --harness claude-code --empty
44
- ```
61
+ ### Engineering
45
62
 
46
- The first positional becomes the agent name. The CLI provisions the bank, sets up the harness, and lets you build everything up from the conversation.
63
+ #### [`engineering/ai`](engineering/ai/) โ€” AI/ML
47
64
 
48
- ## How it works
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
- 1. You chat with the agent
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
- You never tell it to "save" or "remember." It decides what matters and keeps itself current.
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
- ## Available agents
81
+ #### [`engineering/backend`](engineering/backend/) โ€” APIs, data, databases
58
82
 
59
- ### [marketing/](marketing/)
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
- Full marketing team โ€” install the whole department or pick a specialty.
91
+ #### [`engineering/frontend`](engineering/frontend/) โ€” Web & mobile UI
62
92
 
63
- | Install | What you get |
64
- |---------|-------------|
65
- | `marketing` | Generalist โ€” all 30 agent knowledge files across every specialty |
66
- | `marketing/seo` | SEO specialist, search optimizer, citation strategist |
67
- | `marketing/social-media` | Platform strategists for TikTok, Instagram, LinkedIn, X, Reddit |
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
- ## Create your own
99
+ #### [`engineering/ops`](engineering/ops/) โ€” DevOps, SRE, firmware, incidents
73
100
 
74
- An agent is just a directory:
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
- Nest directories for multi-level agents:
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
- my-team/
87
- bank-template.json # install my-team โ†’ everything below
88
- specialist-a/
89
- bank-template.json # install my-team/specialist-a โ†’ just this
90
- reference.md
91
- specialist-b/
92
- bank-template.json
93
- guide.md
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
- Content files are discovered recursively. Each level can have its own `bank-template.json` with a tailored mission and knowledge pages.
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
- ## What `install` does
328
+ #### [`sales/strategy`](sales/strategy/) โ€” Account, deal, outbound, proposal
99
329
 
100
- The CLI is a single setup command โ€” no manual steps required. Here's what happens:
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
- 1. **Fetches the agent** โ€” downloads the directory from GitHub (or uses a local path)
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
- ### Claude harness
339
+ #### [`spatial-computing/platform`](spatial-computing/platform/) โ€” visionOS, Metal, terminals
109
340
 
110
- For Claude Chat and Cowork, the CLI generates a self-contained skill zip:
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
- - The agent's Hindsight API URL, bank ID, and token are baked directly into the skill
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
- ### OpenClaw / NemoClaw harness
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
- For OpenClaw and NemoClaw, the CLI installs the Hindsight plugin, creates a workspace, and registers the agent with the harness. Restart the gateway and start chatting.
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
- ## Supported harnesses
515
+ ## Harnesses
124
516
 
125
- | Harness | Flag | Status |
126
- |---------|------|--------|
127
- | [Claude Chat](https://claude.ai) | `--harness claude` | Supported |
128
- | [Claude Cowork](https://claude.ai) | `--harness claude` | Supported |
129
- | [OpenClaw](https://openclaw.dev) | `--harness openclaw` | Supported |
130
- | [NemoClaw](https://github.com/NVIDIA/NeMo-Agent) | `--harness nemoclaw` | Supported |
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
- ## Requirements
525
+ ## License
133
526
 
134
- - A supported harness
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 = { askBankId: true }) {
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: "https://your-hindsight.example.com",
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 (val.startsWith("http://localhost") || val.startsWith("http://127.0.0.1")) {
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
- p.log.warn("Make sure your Hindsight instance is publicly accessible from Claude's servers.");
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 (opts.askBankId) {
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
- if (!hasConnection && process.stdin.isTTY) {
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, { askBankId: false });
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
  }
@@ -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. Save large content to a file first, read it, then pass the full text.
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.24",
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": [