@tyvm/knowhow 0.0.89 → 0.0.90
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/CONFIG.md +52 -0
- package/README.md +344 -29
- package/WORKER.md +169 -334
- package/autodoc/chat-guide.md +540 -0
- package/autodoc/cli-reference.md +765 -0
- package/autodoc/config-reference.md +541 -0
- package/autodoc/embeddings-guide.md +566 -0
- package/autodoc/generate-guide.md +477 -0
- package/autodoc/language-plugin-guide.md +443 -0
- package/autodoc/modules-guide.md +352 -0
- package/autodoc/plugins-guide.md +720 -0
- package/autodoc/quickstart-guide.md +129 -0
- package/autodoc/skills-guide.md +468 -0
- package/autodoc/worker-guide.md +526 -0
- package/package.json +1 -1
- package/src/ai.ts +33 -2
- package/src/config.ts +28 -4
- package/src/index.ts +22 -2
- package/src/processors/TokenCompressor.ts +2 -2
- package/src/processors/ToolResponseCache.ts +3 -3
- package/src/processors/tools/grepToolResponse.ts +9 -4
- package/src/processors/tools/jqToolResponse.ts +11 -6
- package/src/processors/tools/listStoredToolResponses.ts +1 -1
- package/src/processors/tools/tailToolResponse.ts +9 -4
- package/ts_build/package.json +1 -1
- package/ts_build/src/ai.js +18 -1
- package/ts_build/src/ai.js.map +1 -1
- package/ts_build/src/config.js +17 -2
- package/ts_build/src/config.js.map +1 -1
- package/ts_build/src/index.js +12 -2
- package/ts_build/src/index.js.map +1 -1
- package/ts_build/src/processors/TokenCompressor.js +2 -2
- package/ts_build/src/processors/TokenCompressor.js.map +1 -1
- package/ts_build/src/processors/ToolResponseCache.js +3 -3
- package/ts_build/src/processors/ToolResponseCache.js.map +1 -1
- package/ts_build/src/processors/tools/grepToolResponse.d.ts +3 -1
- package/ts_build/src/processors/tools/grepToolResponse.js +8 -2
- package/ts_build/src/processors/tools/grepToolResponse.js.map +1 -1
- package/ts_build/src/processors/tools/jqToolResponse.d.ts +3 -1
- package/ts_build/src/processors/tools/jqToolResponse.js +10 -4
- package/ts_build/src/processors/tools/jqToolResponse.js.map +1 -1
- package/ts_build/src/processors/tools/listStoredToolResponses.js +1 -1
- package/ts_build/src/processors/tools/listStoredToolResponses.js.map +1 -1
- package/ts_build/src/processors/tools/tailToolResponse.d.ts +3 -1
- package/ts_build/src/processors/tools/tailToolResponse.js +8 -2
- package/ts_build/src/processors/tools/tailToolResponse.js.map +1 -1
- package/autodoc/chat.mdx +0 -20
- package/autodoc/cli.mdx +0 -11
- package/autodoc/plugins/asana.mdx +0 -47
- package/autodoc/plugins/downloader/downloader.mdx +0 -38
- package/autodoc/plugins/downloader/plugin.mdx +0 -37
- package/autodoc/plugins/downloader/types.mdx +0 -42
- package/autodoc/plugins/embedding.mdx +0 -41
- package/autodoc/plugins/figma.mdx +0 -45
- package/autodoc/plugins/github.mdx +0 -40
- package/autodoc/plugins/jira.mdx +0 -46
- package/autodoc/plugins/language.mdx +0 -37
- package/autodoc/plugins/linear.mdx +0 -35
- package/autodoc/plugins/notion.mdx +0 -38
- package/autodoc/plugins/plugins.mdx +0 -59
- package/autodoc/plugins/types.mdx +0 -51
- package/autodoc/plugins/vim.mdx +0 -39
- package/autodoc/tools/addInternalTools.mdx +0 -1
- package/autodoc/tools/agentCall.mdx +0 -1
- package/autodoc/tools/asana/definitions.mdx +0 -10
- package/autodoc/tools/asana/index.mdx +0 -12
- package/autodoc/tools/askHuman.mdx +0 -1
- package/autodoc/tools/callPlugin.mdx +0 -1
- package/autodoc/tools/embeddingSearch.mdx +0 -1
- package/autodoc/tools/execCommand.mdx +0 -1
- package/autodoc/tools/fileSearch.mdx +0 -1
- package/autodoc/tools/finalAnswer.mdx +0 -1
- package/autodoc/tools/github/definitions.mdx +0 -6
- package/autodoc/tools/github/index.mdx +0 -8
- package/autodoc/tools/index.mdx +0 -14
- package/autodoc/tools/lintFile.mdx +0 -7
- package/autodoc/tools/list.mdx +0 -16
- package/autodoc/tools/modifyFile.mdx +0 -7
- package/autodoc/tools/patch.mdx +0 -9
- package/autodoc/tools/readBlocks.mdx +0 -1
- package/autodoc/tools/readFile.mdx +0 -1
- package/autodoc/tools/scanFile.mdx +0 -1
- package/autodoc/tools/textSearch.mdx +0 -6
- package/autodoc/tools/types/fileblock.mdx +0 -1
- package/autodoc/tools/visionTool.mdx +0 -1
- package/autodoc/tools/writeFile.mdx +0 -1
- package/test-comprehensive.ts +0 -31
|
@@ -0,0 +1,720 @@
|
|
|
1
|
+
# Plugins Guide (Knowhow CLI)
|
|
2
|
+
|
|
3
|
+
Knowhow **plugins** are modular “context providers” and helpers that can enrich an agent session with additional information and tooling. Depending on the plugin, it can:
|
|
4
|
+
|
|
5
|
+
- **Expand shorthand terms / hotkeys** into files, snippets, and/or URLs (`language`)
|
|
6
|
+
- **Load live editor/session context** (e.g., open Vim buffers) (`vim`)
|
|
7
|
+
- **Perform semantic retrieval** using embeddings (`embeddings`)
|
|
8
|
+
- **Resolve work-item references** (GitHub, Asana, Jira, Linear) into readable context (`github`, `asana`, `jira`, `linear`)
|
|
9
|
+
- **Load rich external content** (web pages, downloads/transcripts, design docs) (`url`, `download`, `figma`, `notion`)
|
|
10
|
+
- **Add codebase signals** (git diff/log) (`git`)
|
|
11
|
+
- **Run safety/quality tooling** after edits (linting) (`linter`)
|
|
12
|
+
- **Incorporate terminal/session state** (`tmux`)
|
|
13
|
+
- **Load local guidance docs** (`agents-md`, `skills`)
|
|
14
|
+
- **Execute commands for context** (`exec`)
|
|
15
|
+
|
|
16
|
+
Internally, Knowhow maintains a **plugin registry** and can call plugins by their **plugin key** (e.g., `github`, `language`). Plugins can also support **embeddings** via an `embed()`-style capability.
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## 1) What plugins are (how they provide context)
|
|
21
|
+
|
|
22
|
+
### 1.1 Plugin “capabilities”
|
|
23
|
+
Most plugins fall into one or more of these roles:
|
|
24
|
+
|
|
25
|
+
- **Context generation (`call`)**
|
|
26
|
+
Reads input (prompt content, URLs, IDs, etc.) and returns text/markdown context.
|
|
27
|
+
|
|
28
|
+
- **Batch processing (`callMany`)**
|
|
29
|
+
Used when multiple values must be resolved at once (e.g., many URLs).
|
|
30
|
+
|
|
31
|
+
- **Embeddings (`embed`)**
|
|
32
|
+
Returns `MinimalEmbedding[]` items so Knowhow can do semantic retrieval over fetched/constructed content.
|
|
33
|
+
|
|
34
|
+
### 1.2 Common patterns
|
|
35
|
+
- **URL / identifier resolution**
|
|
36
|
+
A plugin detects an identifier in the user prompt and fetches/normalizes it into agent-ready context.
|
|
37
|
+
Examples: GitHub PR/issue, Jira ticket, Linear issue, Notion page.
|
|
38
|
+
|
|
39
|
+
- **Language-term expansion** (`language`)
|
|
40
|
+
A plugin mapping turns configured tokens/hotkeys into:
|
|
41
|
+
- local file contents (`kind: "file"`)
|
|
42
|
+
- literal text snippets (`kind: "text"`)
|
|
43
|
+
- URLs or references (often via `kind: "url"` or a service plugin key like `github`)
|
|
44
|
+
|
|
45
|
+
- **Local environment context**
|
|
46
|
+
- `vim`: injects currently open Vim buffers
|
|
47
|
+
- `git`: injects git diff/log context
|
|
48
|
+
- `tmux`: injects terminal pane/session context
|
|
49
|
+
|
|
50
|
+
- **Post-edit automation**
|
|
51
|
+
- `linter`: runs lint after file edits
|
|
52
|
+
- `exec`: runs commands for context (powerful; see security note)
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## 2) Enable / disable plugins (`knowhow.json`)
|
|
57
|
+
|
|
58
|
+
Plugins are controlled in `knowhow.json` using:
|
|
59
|
+
|
|
60
|
+
- `plugins.enabled`: array of plugin keys to enable
|
|
61
|
+
- `plugins.disabled`: array of plugin keys to disable
|
|
62
|
+
|
|
63
|
+
### 2.1 Enable a subset
|
|
64
|
+
```jsonc
|
|
65
|
+
{
|
|
66
|
+
"plugins": {
|
|
67
|
+
"enabled": ["language", "github", "embeddings", "git", "url", "linter"],
|
|
68
|
+
"disabled": []
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### 2.2 Disable specific plugins
|
|
74
|
+
```jsonc
|
|
75
|
+
{
|
|
76
|
+
"plugins": {
|
|
77
|
+
"enabled": ["language", "vim", "tmux", "github", "url", "download"],
|
|
78
|
+
"disabled": ["exec", "tmux"]
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
> **Tip:** Avoid putting the same plugin in both lists. Use one source of truth in your config.
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## 3) Built-in plugins (keys + config examples)
|
|
88
|
+
|
|
89
|
+
Built-in plugins are identified by these keys:
|
|
90
|
+
|
|
91
|
+
- `language`
|
|
92
|
+
- `vim`
|
|
93
|
+
- `embeddings`
|
|
94
|
+
- `github`
|
|
95
|
+
- `git`
|
|
96
|
+
- `asana`
|
|
97
|
+
- `jira`
|
|
98
|
+
- `linear`
|
|
99
|
+
- `figma`
|
|
100
|
+
- `notion`
|
|
101
|
+
- `download`
|
|
102
|
+
- `url`
|
|
103
|
+
- `linter`
|
|
104
|
+
- `tmux`
|
|
105
|
+
- `agents-md`
|
|
106
|
+
- `exec`
|
|
107
|
+
- `skills`
|
|
108
|
+
|
|
109
|
+
Below are practical configuration examples for each plugin key. Some plugin config fields are implementation-specific; the examples show **typical / commonly used** fields and where you’d place plugin-specific options.
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
### 3.1 `language` — language terms / hotkeys expansion
|
|
114
|
+
|
|
115
|
+
**What it does**
|
|
116
|
+
- Detects configured **language terms / hotkeys**
|
|
117
|
+
- Expands them into context sources like:
|
|
118
|
+
- local files
|
|
119
|
+
- literal snippets
|
|
120
|
+
- plugin-backed resolutions (e.g., `github`)
|
|
121
|
+
- URLs
|
|
122
|
+
|
|
123
|
+
**Typical config shape**
|
|
124
|
+
```jsonc
|
|
125
|
+
{
|
|
126
|
+
"plugins": {
|
|
127
|
+
"enabled": ["language"]
|
|
128
|
+
},
|
|
129
|
+
"language": {
|
|
130
|
+
"terms": {
|
|
131
|
+
"@spec": {
|
|
132
|
+
"events": ["file:read", "agent:msg"],
|
|
133
|
+
"sources": [
|
|
134
|
+
{ "kind": "file", "data": ["./docs/spec.md"] }
|
|
135
|
+
]
|
|
136
|
+
},
|
|
137
|
+
"@pr": {
|
|
138
|
+
"events": ["agent:msg"],
|
|
139
|
+
"sources": [
|
|
140
|
+
{ "kind": "github", "data": ["owner/repo#123"] }
|
|
141
|
+
]
|
|
142
|
+
}
|
|
143
|
+
},
|
|
144
|
+
"hotkeys": {
|
|
145
|
+
":runbook": {
|
|
146
|
+
"events": ["agent:msg"],
|
|
147
|
+
"sources": [
|
|
148
|
+
{ "kind": "file", "data": ["./RUNBOOKS/security.md"] }
|
|
149
|
+
]
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
**Env vars**
|
|
157
|
+
- Usually none.
|
|
158
|
+
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
### 3.2 `vim` — loads currently open vim buffers as context
|
|
162
|
+
|
|
163
|
+
**What it does**
|
|
164
|
+
- Reads the contents of **open Vim buffers**
|
|
165
|
+
- Supplies them to the agent as context
|
|
166
|
+
|
|
167
|
+
**Example config**
|
|
168
|
+
```jsonc
|
|
169
|
+
{
|
|
170
|
+
"plugins": {
|
|
171
|
+
"enabled": ["vim"]
|
|
172
|
+
},
|
|
173
|
+
"vim": {
|
|
174
|
+
"maxBuffers": 10,
|
|
175
|
+
"maxBytesPerBuffer": 200000
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
**Env vars**
|
|
181
|
+
- Usually none.
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
### 3.3 `embeddings` — semantic search over embeddings
|
|
186
|
+
|
|
187
|
+
**What it does**
|
|
188
|
+
- Provides embedding-based retrieval (semantic search)
|
|
189
|
+
- In the provided embedding-plugin behavior:
|
|
190
|
+
- subscribes to file lifecycle events (e.g., post-edit)
|
|
191
|
+
- may run `knowhow embed` asynchronously in the background after edits
|
|
192
|
+
- returns top results (implementation chooses the final limit)
|
|
193
|
+
|
|
194
|
+
**Example config**
|
|
195
|
+
```jsonc
|
|
196
|
+
{
|
|
197
|
+
"plugins": {
|
|
198
|
+
"enabled": ["embeddings"]
|
|
199
|
+
},
|
|
200
|
+
"embeddings": {
|
|
201
|
+
"embeddingModel": "text-embedding-3-small",
|
|
202
|
+
"topK": 7,
|
|
203
|
+
"indexDirs": ["./docs", "./src", "./skills"]
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
**Env vars**
|
|
209
|
+
- Depends on embedding provider/model backend (commonly an OpenAI/compatible API key). Verify the plugin’s `meta.requires` for your build.
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
### 3.4 `github` — resolves GitHub PRs, issues, code
|
|
214
|
+
|
|
215
|
+
**What it does**
|
|
216
|
+
- Resolves GitHub identifiers / URLs found in prompts into context:
|
|
217
|
+
- PRs
|
|
218
|
+
- issues
|
|
219
|
+
- (often) code changes/diffs and structured summaries
|
|
220
|
+
|
|
221
|
+
**Example config**
|
|
222
|
+
```jsonc
|
|
223
|
+
{
|
|
224
|
+
"plugins": {
|
|
225
|
+
"enabled": ["github"]
|
|
226
|
+
},
|
|
227
|
+
"github": {
|
|
228
|
+
"repos": ["my-org/my-repo", "my-org/another-repo"],
|
|
229
|
+
"includeDiff": true,
|
|
230
|
+
"maxItems": 10
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
**Env vars**
|
|
236
|
+
- `GITHUB_TOKEN` (commonly required)
|
|
237
|
+
|
|
238
|
+
---
|
|
239
|
+
|
|
240
|
+
### 3.5 `git` — git diff/log context
|
|
241
|
+
|
|
242
|
+
**What it does**
|
|
243
|
+
- Adds codebase history context from git:
|
|
244
|
+
- diff outputs
|
|
245
|
+
- commit history / logs
|
|
246
|
+
- related change signals
|
|
247
|
+
|
|
248
|
+
**Example config**
|
|
249
|
+
```jsonc
|
|
250
|
+
{
|
|
251
|
+
"plugins": {
|
|
252
|
+
"enabled": ["git"]
|
|
253
|
+
},
|
|
254
|
+
"git": {
|
|
255
|
+
"mode": "diff",
|
|
256
|
+
"logDepth": 20,
|
|
257
|
+
"maxChars": 20000
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
**Env vars**
|
|
263
|
+
- Usually none.
|
|
264
|
+
|
|
265
|
+
---
|
|
266
|
+
|
|
267
|
+
### 3.6 `asana` — Asana task context
|
|
268
|
+
|
|
269
|
+
**What it does**
|
|
270
|
+
- Finds Asana task/list URLs in prompts
|
|
271
|
+
- Fetches task details and formats them for the agent
|
|
272
|
+
|
|
273
|
+
**Example config**
|
|
274
|
+
```jsonc
|
|
275
|
+
{
|
|
276
|
+
"plugins": {
|
|
277
|
+
"enabled": ["asana"]
|
|
278
|
+
},
|
|
279
|
+
"asana": {
|
|
280
|
+
"workspaceId": "1234567890",
|
|
281
|
+
"includeSubtasks": true,
|
|
282
|
+
"maxTasks": 5
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
**Env vars**
|
|
288
|
+
- `ASANA_TOKEN` (required/expected)
|
|
289
|
+
|
|
290
|
+
---
|
|
291
|
+
|
|
292
|
+
### 3.7 `jira` — Jira issue context
|
|
293
|
+
|
|
294
|
+
**What it does**
|
|
295
|
+
- Detects Jira issue keys/URLs
|
|
296
|
+
- Fetches ticket context and formats it for the agent
|
|
297
|
+
|
|
298
|
+
**Example config**
|
|
299
|
+
```jsonc
|
|
300
|
+
{
|
|
301
|
+
"plugins": {
|
|
302
|
+
"enabled": ["jira"]
|
|
303
|
+
},
|
|
304
|
+
"jira": {
|
|
305
|
+
"site": "https://your-company.atlassian.net",
|
|
306
|
+
"includeComments": true,
|
|
307
|
+
"maxIssues": 5
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
**Env vars**
|
|
313
|
+
- Commonly one or more of:
|
|
314
|
+
- `JIRA_TOKEN`
|
|
315
|
+
- (sometimes) `JIRA_EMAIL`, `JIRA_BASE_URL`
|
|
316
|
+
- Check your plugin’s `meta.requires` list for exact names.
|
|
317
|
+
|
|
318
|
+
---
|
|
319
|
+
|
|
320
|
+
### 3.8 `linear` — Linear issue context
|
|
321
|
+
|
|
322
|
+
**What it does**
|
|
323
|
+
- Resolves Linear issue URLs/keys and fetches issue context
|
|
324
|
+
|
|
325
|
+
**Example config**
|
|
326
|
+
```jsonc
|
|
327
|
+
{
|
|
328
|
+
"plugins": {
|
|
329
|
+
"enabled": ["linear"]
|
|
330
|
+
},
|
|
331
|
+
"linear": {
|
|
332
|
+
"includeComments": false,
|
|
333
|
+
"maxIssues": 5
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
**Env vars**
|
|
339
|
+
- `LINEAR_TOKEN` (commonly required)
|
|
340
|
+
|
|
341
|
+
---
|
|
342
|
+
|
|
343
|
+
### 3.9 `figma` — Figma design file context
|
|
344
|
+
|
|
345
|
+
**What it does**
|
|
346
|
+
- Accepts Figma file links (often with optional `node-id` targets)
|
|
347
|
+
- Uses Figma API to fetch frame/node images or metadata
|
|
348
|
+
- Can use vision/LLM to describe relevant nodes (implementation-dependent)
|
|
349
|
+
|
|
350
|
+
**Example config**
|
|
351
|
+
```jsonc
|
|
352
|
+
{
|
|
353
|
+
"plugins": {
|
|
354
|
+
"enabled": ["figma"]
|
|
355
|
+
},
|
|
356
|
+
"figma": {
|
|
357
|
+
"maxNodes": 20
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
**Env vars**
|
|
363
|
+
- `FIGMA_API_KEY` (or `FIGMA_TOKEN`, depending on your plugin implementation)
|
|
364
|
+
- Verify against the plugin’s `meta.requires`.
|
|
365
|
+
|
|
366
|
+
---
|
|
367
|
+
|
|
368
|
+
### 3.10 `notion` — Notion page context
|
|
369
|
+
|
|
370
|
+
**What it does**
|
|
371
|
+
- Extracts Notion URLs from prompts
|
|
372
|
+
- Retrieves page blocks/content and produces context for the agent
|
|
373
|
+
- Often supports recursive traversal up to a configured depth
|
|
374
|
+
|
|
375
|
+
**Example config**
|
|
376
|
+
```jsonc
|
|
377
|
+
{
|
|
378
|
+
"plugins": {
|
|
379
|
+
"enabled": ["notion"]
|
|
380
|
+
},
|
|
381
|
+
"notion": {
|
|
382
|
+
"maxDepth": 2,
|
|
383
|
+
"maxBlocks": 500
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
```
|
|
387
|
+
|
|
388
|
+
**Env vars**
|
|
389
|
+
- `NOTION_TOKEN` (commonly required)
|
|
390
|
+
- Some implementations may also need database/page identifiers (config-based).
|
|
391
|
+
|
|
392
|
+
---
|
|
393
|
+
|
|
394
|
+
### 3.11 `download` — download/transcribe URLs, YouTube videos
|
|
395
|
+
|
|
396
|
+
**What it does**
|
|
397
|
+
- Downloads and/or transcribes content from URLs (including video sources like YouTube)
|
|
398
|
+
- Converts to text context for the agent
|
|
399
|
+
- May use chunking + transcription + optional vision keyframe descriptions (implementation-dependent)
|
|
400
|
+
|
|
401
|
+
**Example config**
|
|
402
|
+
```jsonc
|
|
403
|
+
{
|
|
404
|
+
"plugins": {
|
|
405
|
+
"enabled": ["download"]
|
|
406
|
+
},
|
|
407
|
+
"download": {
|
|
408
|
+
"outputRoot": ".knowhow/downloads",
|
|
409
|
+
"transcribe": true,
|
|
410
|
+
"transcriptionLanguage": "en",
|
|
411
|
+
"reuseCachedTranscripts": true
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
```
|
|
415
|
+
|
|
416
|
+
**Env vars**
|
|
417
|
+
- Often depends on the transcription/vision provider used by the plugin
|
|
418
|
+
- Commonly an OpenAI/compatible API key, but verify the plugin’s `meta.requires`.
|
|
419
|
+
|
|
420
|
+
---
|
|
421
|
+
|
|
422
|
+
### 3.12 `url` — load web pages as context
|
|
423
|
+
|
|
424
|
+
**What it does**
|
|
425
|
+
- Detects URLs in prompts
|
|
426
|
+
- Fetches webpage contents and returns context
|
|
427
|
+
- Can support embedding retrieval from the fetched page text
|
|
428
|
+
|
|
429
|
+
**Example config**
|
|
430
|
+
```jsonc
|
|
431
|
+
{
|
|
432
|
+
"plugins": {
|
|
433
|
+
"enabled": ["url"]
|
|
434
|
+
},
|
|
435
|
+
"url": {
|
|
436
|
+
"maxUrls": 10,
|
|
437
|
+
"maxCharsPerPage": 120000,
|
|
438
|
+
"followRedirects": true
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
```
|
|
442
|
+
|
|
443
|
+
**Env vars**
|
|
444
|
+
- Usually none.
|
|
445
|
+
|
|
446
|
+
---
|
|
447
|
+
|
|
448
|
+
### 3.13 `linter` — runs lint after file edits
|
|
449
|
+
|
|
450
|
+
**What it does**
|
|
451
|
+
- Watches for file lifecycle events after the agent edits files
|
|
452
|
+
- Runs lint commands (by extension or configured command list)
|
|
453
|
+
- Emits lint failures/results into the agent context
|
|
454
|
+
|
|
455
|
+
**Example config**
|
|
456
|
+
```jsonc
|
|
457
|
+
{
|
|
458
|
+
"plugins": {
|
|
459
|
+
"enabled": ["linter"]
|
|
460
|
+
},
|
|
461
|
+
"linter": {
|
|
462
|
+
"commands": {
|
|
463
|
+
".ts": "npm run lint --silent -- $1",
|
|
464
|
+
".js": "npm run lint --silent -- $1",
|
|
465
|
+
".md": "markdownlint $1"
|
|
466
|
+
},
|
|
467
|
+
"failOnError": false
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
```
|
|
471
|
+
|
|
472
|
+
**Env vars**
|
|
473
|
+
- Usually none.
|
|
474
|
+
|
|
475
|
+
---
|
|
476
|
+
|
|
477
|
+
### 3.14 `tmux` — tmux session context
|
|
478
|
+
|
|
479
|
+
**What it does**
|
|
480
|
+
- Detects tmux environment (e.g., using `$TMUX`)
|
|
481
|
+
- Reads session/window/pane context and makes it available to the agent
|
|
482
|
+
|
|
483
|
+
**Example config**
|
|
484
|
+
```jsonc
|
|
485
|
+
{
|
|
486
|
+
"plugins": {
|
|
487
|
+
"enabled": ["tmux"]
|
|
488
|
+
},
|
|
489
|
+
"tmux": {
|
|
490
|
+
"includePaneHistory": true,
|
|
491
|
+
"maxCharsPerPane": 20000
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
```
|
|
495
|
+
|
|
496
|
+
**Env vars**
|
|
497
|
+
- Usually none (but requires tmux availability in your environment).
|
|
498
|
+
|
|
499
|
+
---
|
|
500
|
+
|
|
501
|
+
### 3.15 `agents-md` — loads AGENTS.md files
|
|
502
|
+
|
|
503
|
+
**What it does**
|
|
504
|
+
- Loads repository/directory guidance files (commonly `AGENTS.md`)
|
|
505
|
+
- Intended for agent behavior instructions, conventions, constraints, etc.
|
|
506
|
+
|
|
507
|
+
**Example config**
|
|
508
|
+
```jsonc
|
|
509
|
+
{
|
|
510
|
+
"plugins": {
|
|
511
|
+
"enabled": ["agents-md"]
|
|
512
|
+
},
|
|
513
|
+
"agents-md": {
|
|
514
|
+
"glob": "**/AGENTS.md",
|
|
515
|
+
"maxFiles": 30
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
```
|
|
519
|
+
|
|
520
|
+
**Env vars**
|
|
521
|
+
- Usually none.
|
|
522
|
+
|
|
523
|
+
---
|
|
524
|
+
|
|
525
|
+
### 3.16 `exec` — execute commands for context
|
|
526
|
+
|
|
527
|
+
**What it does**
|
|
528
|
+
- Executes shell commands to generate context
|
|
529
|
+
- In the provided implementation behavior:
|
|
530
|
+
- `callMany(input)` only dispatches when input starts with `!` or `/!`
|
|
531
|
+
- `call(input)` runs the command string and returns stdout/stderr formatted context
|
|
532
|
+
- **Security risk:** can run arbitrary commands.
|
|
533
|
+
|
|
534
|
+
**Example config**
|
|
535
|
+
```jsonc
|
|
536
|
+
{
|
|
537
|
+
"plugins": {
|
|
538
|
+
"enabled": ["exec"]
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
```
|
|
542
|
+
|
|
543
|
+
**Example usage with `language` trigger**
|
|
544
|
+
```jsonc
|
|
545
|
+
{
|
|
546
|
+
"plugins": {
|
|
547
|
+
"enabled": ["language", "exec"]
|
|
548
|
+
},
|
|
549
|
+
"language": {
|
|
550
|
+
"terms": {
|
|
551
|
+
"!now": {
|
|
552
|
+
"events": ["agent:msg"],
|
|
553
|
+
"sources": [
|
|
554
|
+
{ "kind": "text", "data": "!date" }
|
|
555
|
+
]
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
```
|
|
561
|
+
|
|
562
|
+
**Env vars**
|
|
563
|
+
- None inherent to the plugin, but your executed commands may depend on your environment.
|
|
564
|
+
|
|
565
|
+
---
|
|
566
|
+
|
|
567
|
+
### 3.17 `skills` — loads SKILL.md files from configured directories
|
|
568
|
+
|
|
569
|
+
**What it does (as implemented by the Skills plugin)**
|
|
570
|
+
- Configures an array of directories to scan
|
|
571
|
+
- Recursively finds `SKILL.md`
|
|
572
|
+
- Parses YAML-like frontmatter at the top:
|
|
573
|
+
- `name`
|
|
574
|
+
- `description`
|
|
575
|
+
- If a skill name appears in the user prompt (case-insensitive substring match):
|
|
576
|
+
- returns the matched skill file content
|
|
577
|
+
- If no skill names match:
|
|
578
|
+
- returns a discovery list of available skills and how to reference them
|
|
579
|
+
|
|
580
|
+
**Example config**
|
|
581
|
+
```jsonc
|
|
582
|
+
{
|
|
583
|
+
"plugins": {
|
|
584
|
+
"enabled": ["skills"]
|
|
585
|
+
},
|
|
586
|
+
"skills": [
|
|
587
|
+
"./skills",
|
|
588
|
+
"./docs/skills"
|
|
589
|
+
]
|
|
590
|
+
}
|
|
591
|
+
```
|
|
592
|
+
|
|
593
|
+
**Example `SKILL.md`**
|
|
594
|
+
```md
|
|
595
|
+
---
|
|
596
|
+
name: sql-tuning
|
|
597
|
+
description: Optimize SQL queries with indexes and query plans
|
|
598
|
+
---
|
|
599
|
+
|
|
600
|
+
# sql-tuning
|
|
601
|
+
|
|
602
|
+
When tuning a query:
|
|
603
|
+
1. Inspect `EXPLAIN`
|
|
604
|
+
2. Find missing indexes
|
|
605
|
+
3. Rewrite joins/filters
|
|
606
|
+
```
|
|
607
|
+
|
|
608
|
+
**Env vars**
|
|
609
|
+
- Usually none.
|
|
610
|
+
|
|
611
|
+
---
|
|
612
|
+
|
|
613
|
+
## 4) Custom plugins via `pluginPackages` (npm packages)
|
|
614
|
+
|
|
615
|
+
Knowhow can load **custom plugins** from npm packages listed under `pluginPackages` in `knowhow.json`.
|
|
616
|
+
|
|
617
|
+
### 4.1 Register a custom plugin package
|
|
618
|
+
|
|
619
|
+
```jsonc
|
|
620
|
+
{
|
|
621
|
+
"plugins": {
|
|
622
|
+
"enabled": ["my-custom-plugin"]
|
|
623
|
+
},
|
|
624
|
+
"pluginPackages": {
|
|
625
|
+
"my-custom-plugin": "@your-scope/knowhow-my-custom-plugin"
|
|
626
|
+
}
|
|
627
|
+
}
|
|
628
|
+
```
|
|
629
|
+
|
|
630
|
+
> In this model, the **key** in `pluginPackages` should map to the plugin key you enable in `plugins.enabled`.
|
|
631
|
+
|
|
632
|
+
### 4.2 What a custom plugin must provide
|
|
633
|
+
A custom plugin package should export a plugin constructor/class that Knowhow can instantiate (typically with a plugin context/service). The plugin instance should include metadata, especially:
|
|
634
|
+
|
|
635
|
+
- `meta.key` (must match the key you enable)
|
|
636
|
+
- `meta.requires` (optional; env vars needed for auth/integration)
|
|
637
|
+
|
|
638
|
+
And implement one or more plugin methods, commonly:
|
|
639
|
+
- `call(input?)`
|
|
640
|
+
- `callMany(input?)`
|
|
641
|
+
- `embed(input)`
|
|
642
|
+
|
|
643
|
+
### 4.3 Example `knowhow.json` using multiple plugins
|
|
644
|
+
```jsonc
|
|
645
|
+
{
|
|
646
|
+
"plugins": {
|
|
647
|
+
"enabled": ["language", "my-custom-plugin", "embeddings"],
|
|
648
|
+
"disabled": []
|
|
649
|
+
},
|
|
650
|
+
"pluginPackages": {
|
|
651
|
+
"my-custom-plugin": "@acme/knowhow-my-custom-plugin"
|
|
652
|
+
}
|
|
653
|
+
}
|
|
654
|
+
```
|
|
655
|
+
|
|
656
|
+
---
|
|
657
|
+
|
|
658
|
+
## 5) Required environment variables (per plugin)
|
|
659
|
+
|
|
660
|
+
Knowhow uses each plugin’s metadata (typically `meta.requires`) to decide whether the plugin is enabled. If env vars are missing, the plugin may be skipped.
|
|
661
|
+
|
|
662
|
+
Below are the **expected** environment variables for the standard external-service integrations:
|
|
663
|
+
|
|
664
|
+
| Plugin key | Environment variables (expected) |
|
|
665
|
+
|---|---|
|
|
666
|
+
| `github` | `GITHUB_TOKEN` |
|
|
667
|
+
| `asana` | `ASANA_TOKEN` |
|
|
668
|
+
| `jira` | `JIRA_TOKEN` (or provider-specific equivalents); often also `JIRA_BASE_URL` / `JIRA_EMAIL` depending on setup |
|
|
669
|
+
| `linear` | `LINEAR_TOKEN` |
|
|
670
|
+
| `figma` | `FIGMA_API_KEY` or `FIGMA_TOKEN` (verify exact `meta.requires`) |
|
|
671
|
+
| `notion` | `NOTION_TOKEN` |
|
|
672
|
+
| `embeddings` | depends on embedding provider (commonly an API key like `OPENAI_API_KEY`, but verify in plugin code/config) |
|
|
673
|
+
| `download` | depends on transcription/vision provider (often an API key; verify in plugin code/config) |
|
|
674
|
+
| `language`, `vim`, `git`, `url`, `linter`, `tmux`, `agents-md`, `exec`, `skills` | typically none required for auth (but `exec` depends on your system tools) |
|
|
675
|
+
|
|
676
|
+
### Example: setting environment variables
|
|
677
|
+
```bash
|
|
678
|
+
export GITHUB_TOKEN="ghp_xxx"
|
|
679
|
+
export ASANA_TOKEN="asca_xxx"
|
|
680
|
+
export JIRA_TOKEN="xxx"
|
|
681
|
+
export LINEAR_TOKEN="linear_xxx"
|
|
682
|
+
export FIGMA_API_KEY="figma_xxx"
|
|
683
|
+
export NOTION_TOKEN="secret_notion_xxx"
|
|
684
|
+
export OPENAI_API_KEY="sk_xxx"
|
|
685
|
+
```
|
|
686
|
+
|
|
687
|
+
---
|
|
688
|
+
|
|
689
|
+
## Recommended “starter” config
|
|
690
|
+
|
|
691
|
+
A safe, useful baseline that covers local context, issue resolution, and retrieval:
|
|
692
|
+
|
|
693
|
+
```jsonc
|
|
694
|
+
{
|
|
695
|
+
"plugins": {
|
|
696
|
+
"enabled": [
|
|
697
|
+
"language",
|
|
698
|
+
"skills",
|
|
699
|
+
"agents-md",
|
|
700
|
+
"github",
|
|
701
|
+
"jira",
|
|
702
|
+
"linear",
|
|
703
|
+
"asana",
|
|
704
|
+
"notion",
|
|
705
|
+
"url",
|
|
706
|
+
"embeddings",
|
|
707
|
+
"git",
|
|
708
|
+
"linter"
|
|
709
|
+
],
|
|
710
|
+
"disabled": ["exec", "download", "vim", "tmux"]
|
|
711
|
+
},
|
|
712
|
+
"pluginPackages": {}
|
|
713
|
+
}
|
|
714
|
+
```
|
|
715
|
+
|
|
716
|
+
> Enable `exec`/`download` only if you trust prompts and external content sources you’ll process.
|
|
717
|
+
|
|
718
|
+
---
|
|
719
|
+
|
|
720
|
+
If you paste your repo’s `knowhow.json` schema (or the plugin `meta.requires` and config types for each built-in plugin), I can revise this guide so **every config block uses the exact field names** your Knowhow version supports.
|