@wirecat/cli-memo 0.16.0 → 0.17.0
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 +306 -339
- package/dist/mcp/vocabulary.d.ts +1 -0
- package/dist/mcp/vocabulary.d.ts.map +1 -1
- package/dist/mcp/vocabulary.js +12 -0
- package/dist/mcp/vocabulary.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/vocabulary/command.d.ts.map +1 -1
- package/dist/vocabulary/command.js +22 -0
- package/dist/vocabulary/command.js.map +1 -1
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -1,427 +1,390 @@
|
|
|
1
|
-
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="https://raw.githubusercontent.com/WireCatLabs/cli-memo/main/docs/images/social-preview.png" alt="Local knowledge for your AI agents" width="100%">
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
<h1 align="center">memo</h1>
|
|
6
|
+
|
|
7
|
+
<p align="center">
|
|
8
|
+
<strong>Local knowledge for your AI agents.</strong><br>
|
|
9
|
+
Your notes, documents, mail and messages in one local store — linked to people, tagged, and searchable
|
|
10
|
+
with a reference to every source.
|
|
11
|
+
</p>
|
|
12
|
+
|
|
13
|
+
<p align="center">
|
|
14
|
+
<a href="https://github.com/WireCatLabs/cli-memo/tree/main/docs">Docs</a> ·
|
|
15
|
+
<a href="#what-can-you-do">Examples</a> ·
|
|
16
|
+
<a href="https://wirecat.dev">WireCat</a>
|
|
17
|
+
</p>
|
|
18
|
+
|
|
19
|
+
<p align="center">
|
|
20
|
+
<a href="https://www.npmjs.com/package/@wirecat/cli-memo"><img alt="npm" src="https://img.shields.io/npm/v/@wirecat/cli-memo"></a>
|
|
21
|
+
<a href="https://github.com/WireCatLabs/cli-memo/blob/main/LICENSE"><img alt="License" src="https://img.shields.io/npm/l/@wirecat/cli-memo"></a>
|
|
22
|
+
<img alt="Node" src="https://img.shields.io/node/v/@wirecat/cli-memo">
|
|
23
|
+
</p>
|
|
24
|
+
|
|
25
|
+
`memo` is a command-line tool. It imports a folder of notes such as an Obsidian vault, the documents in
|
|
26
|
+
it, and your mail; it reads the messages that [tg-cli](https://github.com/WireCatLabs/tg-cli) and
|
|
27
|
+
[max-cli](https://github.com/WireCatLabs/max-cli) keep. Then you, or your AI agent, ask: what do I know
|
|
28
|
+
about this person, where did we discuss this, what did I promise. Every answer points back to its source.
|
|
29
|
+
|
|
30
|
+
<!-- Demo slot: a 30–45 s recording of an agent answering "What did I promise Alice?" from memo, with
|
|
31
|
+
sources. Add it here once recorded; until then the example below shows the real output. -->
|
|
32
|
+
|
|
33
|
+
**Example** — two invented notes in a vault, `people/Alice Example.md` and `Projects/Harbour budget.md`:
|
|
34
|
+
|
|
35
|
+
```text
|
|
36
|
+
$ memo search notes budget Friday
|
|
37
|
+
Projects/Harbour budget.md
|
|
38
|
+
# Harbour budget
|
|
39
|
+
people/Alice Example.md
|
|
40
|
+
Asked for the revised budget by Friday. See [[Harbour budget]].
|
|
41
|
+
|
|
42
|
+
Linked from these notes
|
|
43
|
+
Alice Example document:2 (1)
|
|
44
|
+
Bob Sample (nobody by that name yet) (1)
|
|
45
|
+
Harbour budget document:1 (1)
|
|
46
|
+
```
|
|
2
47
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
to its source.
|
|
48
|
+
Each hit names its file, and `[[links]]` become links to notes and people. `Bob Sample` becomes a link to
|
|
49
|
+
a person once someone by that name is in the store.
|
|
6
50
|
|
|
7
|
-
|
|
8
|
-
[max-cli](https://github.com/WireCatLabs/max-cli) share, Markdown notes such as an Obsidian vault, and mail
|
|
9
|
-
through [Himalaya](https://github.com/pimalaya/himalaya). Source files and mailboxes are read-only.
|
|
10
|
-
Notes you write here, links, labels, relationships and task reminders live in the local store.
|
|
11
|
-
Retrieval is local; an explicitly selected model receives evidence only with the configured consent.
|
|
51
|
+
## Quick start
|
|
12
52
|
|
|
13
|
-
|
|
14
|
-
manual relationships, evidence bundles and local reminders work.
|
|
15
|
-
|
|
16
|
-
## Project and topic aliases
|
|
53
|
+
You need Node.js 22.16 or newer.
|
|
17
54
|
|
|
18
55
|
```sh
|
|
19
|
-
|
|
20
|
-
memo
|
|
21
|
-
memo
|
|
22
|
-
memo
|
|
23
|
-
memo vocabulary preflight on-boarding --json
|
|
56
|
+
npm install -g @wirecat/cli-memo
|
|
57
|
+
memo folders add /path/to/notes # your notes folder; Obsidian format by default
|
|
58
|
+
memo notes import # reads the notes, their links and tags; run again after edits
|
|
59
|
+
memo search notes "budget"
|
|
24
60
|
```
|
|
25
61
|
|
|
26
|
-
|
|
27
|
-
Exact aliases reuse one project or label; ambiguous names remain candidates. Preflight suggests
|
|
28
|
-
likely lexical duplicates without creating labels, merging records or loading a model. Existing
|
|
29
|
-
automatic tag creation still needs the native duplicate-review rollout; this preflight alone does
|
|
30
|
-
not protect every creation path.
|
|
62
|
+
That is all notes need. Then add more context:
|
|
31
63
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
64
|
+
- **Messages:** install [tg-cli](https://github.com/WireCatLabs/tg-cli) or
|
|
65
|
+
[max-cli](https://github.com/WireCatLabs/max-cli); memo reads the same local store.
|
|
66
|
+
- **Search by meaning:** `tg models text download e5-small` downloads the local model once.
|
|
67
|
+
- **Mail:** set up [Himalaya](https://github.com/pimalaya/himalaya), then `memo mail <account> import`.
|
|
68
|
+
- **Stay current:** `memo auto on` runs `memo import` every five minutes (Linux, systemd).
|
|
35
69
|
|
|
36
|
-
|
|
70
|
+
Or ask your agent: "Help me install memo with `npm install -g @wirecat/cli-memo`, read `memo --help`, then
|
|
71
|
+
help me connect a notes folder I choose."
|
|
37
72
|
|
|
38
|
-
|
|
39
|
-
memo
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
memo projects meetings list RES --proposed --provider zoom --account STORED_ACCOUNT --json
|
|
43
|
-
memo tasks add --project RES --title 'Research draft' --type feature
|
|
44
|
-
memo tasks add --project RES --title 'Review draft' --type chore
|
|
45
|
-
memo tasks link RES-2 RES-1 --kind blocked-by --json
|
|
46
|
-
memo tasks link RES-2 RES-1 --kind follow-up-of --json
|
|
47
|
-
memo tasks readiness RES-2 --json
|
|
48
|
-
memo tasks ready --project RES --json
|
|
49
|
-
```
|
|
73
|
+
More: [installation](https://github.com/WireCatLabs/cli-memo/blob/main/docs/installation.md) ·
|
|
74
|
+
[install memo on wirecat.dev](https://wirecat.dev/en/docs/memo#install-memo)
|
|
75
|
+
|
|
76
|
+
## What can you do?
|
|
50
77
|
|
|
51
|
-
|
|
52
|
-
confirming an agent's existing proposal requires its current `--expected FINGERPRINT`. Names and
|
|
53
|
-
explicit aliases resolve to one project; ambiguous names require a canonical reference.
|
|
78
|
+
**"What do I need to know about Alice before the call?"**
|
|
54
79
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
edge with the same `--kind`. Parent hierarchy is separate.
|
|
80
|
+
```sh
|
|
81
|
+
memo context telegram:"Alice Example" --json
|
|
82
|
+
```
|
|
59
83
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
meeting-findings batch workflow are separate follow-on work.
|
|
84
|
+
Every identity linked to her, the last message each way, chats in common, linked mail, the notes about
|
|
85
|
+
her and the open tasks — each with a link to its source.
|
|
63
86
|
|
|
64
|
-
|
|
87
|
+
**"Where did we discuss the Harbour budget?"**
|
|
65
88
|
|
|
66
89
|
```sh
|
|
67
|
-
memo
|
|
68
|
-
memo notes add --file review.md --about 'msg:telegram/1/77/42' --about project:PROJECT_ID --export
|
|
69
|
-
memo notes list --about telegram:'Rin Example' --json
|
|
70
|
-
memo notes edit NOTE_ID --revision 1 --text 'Prefers early mornings'
|
|
71
|
-
memo notes remove NOTE_ID
|
|
72
|
-
memo notes export --to /path/to/vault/memo --format obsidian
|
|
90
|
+
memo search all 'harbour budget' --json
|
|
73
91
|
```
|
|
74
92
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
`person:`, `organization:`, `project:`, `task:`, `note:`, `document:`. Several `--about` give it several
|
|
78
|
-
subjects. An edit names the
|
|
79
|
-
revision it changes, so an edit made meanwhile is never lost. tg and max `contacts notes` are the same
|
|
80
|
-
notes.
|
|
81
|
-
|
|
82
|
-
`export` writes them as files, in a folder's format, with `memo-id` and `memo-hash` in the front
|
|
83
|
-
matter: import skips such a file, so an export inside a vault never comes back as a second note. A
|
|
84
|
-
file edited since memo wrote it is left alone and reported; nothing is deleted. `--export [dir]` on `add`
|
|
85
|
-
and `edit` writes one; with no folder given, `notes.export: { "dir": "…", "format": "…" }` in the
|
|
86
|
-
config says where.
|
|
93
|
+
Messages, imported mail and notes, ranked together. When you know the kind, `search notes`,
|
|
94
|
+
`search mail` and `search messages` read every field.
|
|
87
95
|
|
|
88
|
-
|
|
96
|
+
**"What did I promise people this week?"**
|
|
89
97
|
|
|
90
98
|
```sh
|
|
91
|
-
memo
|
|
92
|
-
memo tasks add 'note:NOTE_ID' --provider telegram --account 1 --type request
|
|
93
|
-
memo tasks list --provider telegram --account 1 --json
|
|
94
|
-
memo tasks assign TASK_ID PERSON_UID --role reviewer
|
|
95
|
-
memo tasks close TASK_ID --provider telegram --account 1 --as done
|
|
96
|
-
memo tasks add --project RES --title 'Export drops the last row' --type bug --priority 1 --assignee PERSON_UID
|
|
97
|
-
memo tasks update RES-1 --priority 0 --description 'Seen on CSV export'
|
|
98
|
-
memo tasks list --project RES
|
|
99
|
-
memo tasks close RES-1 --reason fixed
|
|
99
|
+
memo ask 'What did I promise this week?' --query 'promised OR "by Friday"' --all --json
|
|
100
100
|
```
|
|
101
101
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
on any task, one from a message too; `tasks update` changes them later. `tasks assign` names an assignee,
|
|
105
|
-
reviewer or watcher. Every change of status, due date, priority or assignee is recorded as a task event.
|
|
102
|
+
An evidence bundle for your agent: the matching sources with their references, what was searched, and
|
|
103
|
+
the instruction to cite them. Your agent writes the answer; memo calls a model only when you ask it to.
|
|
106
104
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
returns the existing task, including one already closed.
|
|
105
|
+
More: [search and evidence](https://github.com/WireCatLabs/cli-memo/blob/main/docs/search.md) ·
|
|
106
|
+
[ask for the context you need](https://wirecat.dev/en/docs/memo#ask-for-the-context-you-need)
|
|
110
107
|
|
|
111
|
-
|
|
112
|
-
belongs in a person's context only when they authored its source or you assigned it explicitly. Closed
|
|
113
|
-
tasks stay closed on repeated creation. If several accounts of the requested provider exist, use
|
|
114
|
-
`memo context telegram:101 --account 1`.
|
|
108
|
+
## Built for AI agents
|
|
115
109
|
|
|
116
|
-
|
|
110
|
+
- **Any agent with a terminal** — Claude Code, Codex, Gemini CLI and others run `memo` commands; `--json`
|
|
111
|
+
gives them structured output.
|
|
112
|
+
- **Evidence, not guesses** — `memo ask` hands over sources with references, and says what it could not
|
|
113
|
+
search.
|
|
114
|
+
- **MCP** — `memo mcp` lets MCP apps such as Claude Desktop or Cursor propose memories, facts and actions
|
|
115
|
+
and read the agent log; they wait for you to confirm.
|
|
117
116
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
memo search notes 'project progress' --filter 'date:2026-10-08' --tag project --folder /path/to/vault
|
|
121
|
-
memo notes show note:NOTE_ID --json
|
|
122
|
-
memo search all 'budget AND date:[2026-09-01 TO *]' --json
|
|
123
|
-
memo ask 'What work is pending?' --query budget --all --json
|
|
124
|
-
```
|
|
117
|
+
More: [connect your AI agent](https://wirecat.dev/en/docs/agents) ·
|
|
118
|
+
[memories, proposed actions and MCP](https://github.com/WireCatLabs/cli-memo/blob/main/docs/mcp.md)
|
|
125
119
|
|
|
126
|
-
|
|
127
|
-
`AND`/`OR`/`NOT`, `tag:`, `date:`; `--exact` matches every word as written. A message-only field such as
|
|
128
|
-
`from:` is refused. They are also searched by meaning when the model is downloaded, and the two are
|
|
129
|
-
ranked together: `by` says which ran, each hit's `foundBy` which found it, and `meaningSkipped` why
|
|
130
|
-
meaning did not run. Each hit carries its reference, the first matching line and the links the note
|
|
131
|
-
holds; `linked` counts what the notes found link to, with each person's name. Follow `nextOffset` with
|
|
132
|
-
`--offset`.
|
|
133
|
-
|
|
134
|
-
`notes show` takes `note:<id>` or a file in a configured folder, and answers with the note's tags, its
|
|
135
|
-
links, its backlinks and, for a PDF or sheet, where its text came from.
|
|
136
|
-
|
|
137
|
-
`search all` searches messages, imported mail and native notes together, and nothing else: not people,
|
|
138
|
-
memories, projects, organizations or decisions. Use it when you do not know where something was written. When
|
|
139
|
-
you know the kind, its own search reads it with every field: `search mail` takes `from:`, `to:`, `cc:`, `bcc:`,
|
|
140
|
-
`subject:` and `mailbox:` (a folder or Gmail label); `search messages`, `search notes`; `search notes --type
|
|
141
|
-
internal|file` narrows note kinds. An empty answer means those three hold nothing that matches: try the kind's
|
|
142
|
-
own search, looser words, or `tg search conversations` to find mail and messages by meaning.
|
|
143
|
-
`search all` includes a separate `tasks` list for open work linked to matching sources. Results identify source
|
|
144
|
-
kind/account and skipped-resource coverage; a query using a field only messages have (`from:`, `after:`)
|
|
145
|
-
searches the messages and says the notes were not searched. Missing hits do not prove that an event
|
|
146
|
-
never happened.
|
|
147
|
-
|
|
148
|
-
`ask` returns an evidence bundle for your chosen agent by default. To call a model, configure
|
|
149
|
-
`MEMO_MODELS_ANALYSIS_PROVIDER`, `MEMO_MODELS_ANALYSIS_MODEL`, optionally
|
|
150
|
-
`MEMO_MODELS_ANALYSIS_BASE_URL` and `MEMO_MODEL_API_KEY`, then pass `--model`. Remote calls also require
|
|
151
|
-
`--allow-remote`. Model claims are generated and unverified, cite supplied evidence, and distinguish
|
|
152
|
-
assertions, conclusions and inferences. Suggestions create no task until you explicitly run
|
|
153
|
-
`memo tasks add <source> --type <kind>`. Answers are not saved as independent facts.
|
|
154
|
-
|
|
155
|
-
## Organizations and projects
|
|
120
|
+
## Why memo?
|
|
156
121
|
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
122
|
+
1. **Local first.** Everything lives in a local store; search by meaning uses a local model.
|
|
123
|
+
2. **Every answer has a source.** Hits carry a reference you or your agent can open: a note, a file
|
|
124
|
+
page, an email, a message.
|
|
125
|
+
3. **Links, not guesses.** Notes link to people and records; identities are never merged because a name
|
|
126
|
+
matches.
|
|
127
|
+
4. **Your sources stay untouched.** Folders and mailboxes are read-only; tags and your own notes live in
|
|
128
|
+
the store.
|
|
129
|
+
5. **Agents propose, you decide.** Memories and actions an agent suggests wait for your confirmation;
|
|
130
|
+
nothing is ever sent.
|
|
165
131
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
`list`, `remove` and `confirm` manage them. They are manual statements and never merge identities because
|
|
169
|
-
names or domains match. `organizations context` and `projects context` list the relationships, the notes
|
|
170
|
-
about or linking it, and its tags. Tags on a task need no account; its
|
|
171
|
-
reminders name the account it waits on.
|
|
132
|
+
**Status:** early. Context, notes and their links, document import, Gmail and IMAP imports, tasks,
|
|
133
|
+
manual relationships, evidence bundles and local reminders work.
|
|
172
134
|
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
unconfirmed; they do not enter confirmed person context. `relationships confirm <id>` records your
|
|
176
|
-
explicit acceptance. Common free-mail domains are excluded from this heuristic.
|
|
135
|
+
More: [security](https://github.com/WireCatLabs/cli-memo/blob/main/docs/security.md) ·
|
|
136
|
+
[security on wirecat.dev](https://wirecat.dev/en/docs/security)
|
|
177
137
|
|
|
178
|
-
##
|
|
138
|
+
## What it reads
|
|
179
139
|
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
memo facts list --type decision --status proposed
|
|
186
|
-
memo facts accept fact:FACT_ID
|
|
187
|
-
memo actions propose reply --reason 'asked twice' --provider telegram --payload '{"text":"Friday works"}'
|
|
188
|
-
memo actions approve ACTION_ID
|
|
189
|
-
memo agents log --agent memo-mcp --limit 20
|
|
190
|
-
```
|
|
140
|
+
- **Folders of notes:** Obsidian or plain Markdown, with links, aliases and tags.
|
|
141
|
+
- **Documents in them:** TXT, CSV/TSV, text-layer PDF, DOCX, XLSX, ODT/ODS, PPTX and EPUB, with the page,
|
|
142
|
+
row or cell each passage came from.
|
|
143
|
+
- **Mail:** Gmail or another IMAP account, through Himalaya, attachments included.
|
|
144
|
+
- **Messages:** the tg and max store, with the people linked across messengers and mail.
|
|
191
145
|
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
`confirm` it, and `stale` marks one whose evidence no longer holds. `memories search` finds the words in
|
|
195
|
-
them.
|
|
146
|
+
You add your own notes about messages, people and projects, tags, tasks and reminders, organizations and
|
|
147
|
+
projects.
|
|
196
148
|
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
ends the one it replaces once accepted, and `facts reverse` ends an accepted decision nothing replaced.
|
|
149
|
+
More: [notes](https://github.com/WireCatLabs/cli-memo/blob/main/docs/notes.md) ·
|
|
150
|
+
[files memo can read](https://wirecat.dev/en/docs/memo#files-memo-can-read)
|
|
200
151
|
|
|
201
|
-
|
|
202
|
-
sent. `actions approve` makes it a task in that account's inbox, so it shows in `memo tasks list`, and the
|
|
203
|
-
proposal remembers the task; `actions reject` closes it. `actions list --status` filters them.
|
|
152
|
+
## Commands by task
|
|
204
153
|
|
|
205
|
-
|
|
206
|
-
|
|
154
|
+
| Task | Commands |
|
|
155
|
+
| --- | --- |
|
|
156
|
+
| Connect notes folders | `memo folders add` · `folders attach` · `folders list` |
|
|
157
|
+
| Import what changed | `memo import` · `notes import` · `mail <account> import` · `auto on` / `off` / `status` |
|
|
158
|
+
| Read notes | `memo notes list` · `notes show` · `notes about` · `memo note` (the note about a person) |
|
|
159
|
+
| Write your own notes | `memo notes add` · `notes edit` · `notes remove` · `notes export` |
|
|
160
|
+
| Search | `memo search all` · `search notes` · `search mail` · `search messages` |
|
|
161
|
+
| Hand evidence to an agent | `memo ask` |
|
|
162
|
+
| Know a person | `memo context` |
|
|
163
|
+
| Organizations and projects | `memo organizations add` / `list` / `context` · `projects add` / `list` / `context` · `projects meetings list` / `link` |
|
|
164
|
+
| Project and topic aliases | `memo vocabulary list` / `resolve` / `preflight` · `vocabulary aliases add` / `remove` · `vocabulary create` |
|
|
165
|
+
| Relationships | `memo relationships add` / `list` / `remove` / `confirm` / `suggest` |
|
|
166
|
+
| Labels | `memo tags add` · `tags remove` · `tags list` |
|
|
167
|
+
| Open work | `memo tasks add` · `tasks list` · `tasks update` · `tasks assign` · `tasks close` |
|
|
168
|
+
| Task dependencies | `memo tasks link` / `unlink` / `relations` · `tasks readiness` · `tasks ready` |
|
|
169
|
+
| Reminders | `memo reminders schedule` / `list` / `poll` / `ack` / `snooze` / `cancel` |
|
|
170
|
+
| Agents | `memo memories …` · `facts …` · `actions …` · `agents log` · `memo mcp` |
|
|
207
171
|
|
|
208
|
-
|
|
209
|
-
`memories_show`, `memories_search`, `facts_add`, `facts_list`, `facts_show`, `actions_propose`, `actions_list`, `actions_show` and `agents_log`. An
|
|
210
|
-
agent's memories, facts and proposals are its own (`memo-mcp`) and wait for you; it cannot confirm, accept,
|
|
211
|
-
approve or reject. Every call goes into the agent log.
|
|
172
|
+
Every command takes `--help`; most take `--json`.
|
|
212
173
|
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
174
|
+
More: [technical docs](#technical-docs) · [notes and files on wirecat.dev](https://wirecat.dev/en/docs/memo)
|
|
175
|
+
|
|
176
|
+
## Notes from files, and notes you write
|
|
216
177
|
|
|
217
|
-
|
|
178
|
+
**From a folder.** `memo folders add` gives a folder an id that the store uses; its path is only where it is
|
|
179
|
+
on this computer, so the same folder on another computer is attached with `memo folders attach <id> <path>`.
|
|
180
|
+
`memo notes import` stores each file as a note named by its path. An edited file keeps its old text as a
|
|
181
|
+
revision; a moved file keeps its id, links and tags; a deleted file loses its text on the next import. The
|
|
182
|
+
`obsidian` format (the default) reads `[[Note|label]]` links, aliases, `tags:` and `#tags`; `markdown` reads
|
|
183
|
+
`[label](path.md)` links and `tags:`. A `[[Kai Sample]]` link becomes a link to a person once someone by that
|
|
184
|
+
name is in the store. Hidden folders such as `.obsidian` are skipped.
|
|
185
|
+
|
|
186
|
+
**Written in memo.** A note you write is the store's, not a file's, and is about whatever `--about` names: a
|
|
187
|
+
person, a message, a chat, a project, a task, another note.
|
|
218
188
|
|
|
219
189
|
```sh
|
|
220
|
-
memo
|
|
221
|
-
memo
|
|
222
|
-
memo
|
|
223
|
-
memo reminders snooze REMINDER_ID --revision 1 --at 2026-10-10T09:00:00+02:00 --provider telegram --account 1
|
|
224
|
-
memo reminders cancel REMINDER_ID --provider telegram --account 1
|
|
190
|
+
memo notes add 'Prefers mornings' --about telegram:'Alice Example'
|
|
191
|
+
memo notes edit NOTE_ID --revision 1 --text 'Prefers early mornings'
|
|
192
|
+
memo notes export --to /path/to/vault/memo --format obsidian
|
|
225
193
|
```
|
|
226
194
|
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
195
|
+
An edit names the revision it changes, so an edit made meanwhile is never lost. `export` writes your notes
|
|
196
|
+
as files that import then skips, and never overwrites a file you edited.
|
|
197
|
+
|
|
198
|
+
More: [notes](https://github.com/WireCatLabs/cli-memo/blob/main/docs/notes.md) ·
|
|
199
|
+
[add your notes](https://wirecat.dev/en/docs/memo#add-your-notes) ·
|
|
200
|
+
[create your own notes](https://wirecat.dev/en/docs/memo#create-your-own-notes)
|
|
232
201
|
|
|
233
|
-
##
|
|
202
|
+
## Search and evidence
|
|
203
|
+
|
|
204
|
+
Notes are searched by words and word stems in the query language messages use — phrases, `AND`/`OR`/`NOT`,
|
|
205
|
+
`tag:`, `date:` — and by meaning once the local model is downloaded; both are ranked together. `search all`
|
|
206
|
+
reads messages, imported mail and notes together, and nothing else. When you know the kind, its own search
|
|
207
|
+
reads every field: `search mail` takes `from:`, `to:`, `cc:`, `bcc:`, `subject:` and `mailbox:`.
|
|
234
208
|
|
|
235
209
|
```sh
|
|
236
|
-
memo
|
|
210
|
+
memo search notes '"budget review" AND NOT cancelled' --limit 20
|
|
211
|
+
memo search mail 'from:alice@example.com subject:budget'
|
|
212
|
+
memo notes show note:NOTE_ID --json
|
|
237
213
|
```
|
|
238
214
|
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
215
|
+
`memo ask` needs a scope (`--all`, or `--provider` with `--account`) and returns evidence by default. To
|
|
216
|
+
call a model instead, set `MEMO_MODELS_ANALYSIS_PROVIDER` and `MEMO_MODELS_ANALYSIS_MODEL` and pass
|
|
217
|
+
`--model`; a remote model also needs `--allow-remote`.
|
|
218
|
+
|
|
219
|
+
More: [search and evidence](https://github.com/WireCatLabs/cli-memo/blob/main/docs/search.md) ·
|
|
220
|
+
[searching on wirecat.dev](https://wirecat.dev/en/docs/search)
|
|
221
|
+
|
|
222
|
+
## People, organizations and projects
|
|
223
|
+
|
|
224
|
+
`memo context` answers from the shared store: every identity linked to the person, the last message each
|
|
225
|
+
way, recent messages, chats in common, linked mail, the notes about them and the open tasks. Who is who is
|
|
226
|
+
decided in messaging — `tg contacts link <person> email:<address>` — and a same name is never enough.
|
|
227
|
+
`memo note telegram:"Alice Example" /path/to/notes/people/Alice.md` names the note that is about her.
|
|
228
|
+
|
|
229
|
+
Organizations and projects are yours, not one account's. Relationships (`member-of`, `related-to`) are
|
|
230
|
+
manual statements; `relationships suggest` only proposes shared-domain links for you to confirm. A project
|
|
231
|
+
can hold meetings (`projects meetings link`), and `memo vocabulary` gives projects and topics reviewed
|
|
232
|
+
aliases, so one name always means one project.
|
|
245
233
|
|
|
246
|
-
|
|
234
|
+
Before adding a new tag or topic, run `memo vocabulary preflight <name> --json`. Reuse a
|
|
235
|
+
canonical label or add an alias if it means the same thing. For a deliberately distinct label,
|
|
236
|
+
run `memo vocabulary create <name> --expected <creationFingerprint> --json`; select `--kind topic`
|
|
237
|
+
on both commands when creating a topic. The owner accepts this review; MCP exposes preflight
|
|
238
|
+
but no label-creation tool. An intervening label or alias change requires a fresh review.
|
|
239
|
+
`memo vocabulary audit --json` finds likely synonyms already in the catalog. Its `complete`
|
|
240
|
+
flag reports whether the bounded comparison finished; candidates require review and are never
|
|
241
|
+
merged automatically. Use `--kind tag`, `--kind topic` or `--kind project` to narrow the review.
|
|
247
242
|
|
|
248
243
|
```sh
|
|
249
|
-
memo
|
|
250
|
-
memo
|
|
251
|
-
memo
|
|
252
|
-
memo notes about telegram:"Rin Example" # notes about a person, and the notes linking them
|
|
244
|
+
memo organizations add 'Synthetic Studio' --kind company
|
|
245
|
+
memo projects add 'Synthetic Harbour' --organization organization:ORGANIZATION_ID
|
|
246
|
+
memo projects context PROJECT_ID --json
|
|
253
247
|
```
|
|
254
248
|
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
run that finds most notes missing at once deletes nothing and says so. A file moved inside the folder —
|
|
258
|
-
gone from one path, the same content at another — keeps its id, its links and its tags.
|
|
259
|
-
|
|
260
|
-
Import also stores what each note links, through the folder's format. A link to a note the folder has
|
|
261
|
-
once becomes a link to that note. A name no note has, such as `[[Kai Sample]]`, is kept as written and
|
|
262
|
-
becomes a link to the person the moment someone by that name, local alias or username is in the store —
|
|
263
|
-
or stays unresolved while two people share it. A file's `tags:` and `#tags` become the note's tags, and
|
|
264
|
-
a tag removed from the file is removed from the note — unless you added the same tag yourself.
|
|
265
|
-
|
|
266
|
-
Import then embeds the notes for search by meaning with the local e5-small model (shared with tg and
|
|
267
|
-
max: `tg models text download e5-small`), only what changed, at most 600 chunks a run — the next run
|
|
268
|
-
continues. `--no-embed`, or `notes.embed: false` in the config, skips it.
|
|
269
|
-
|
|
270
|
-
`about` takes `<messenger>:<name or id>` or a reference (`person:`, `organization:`, `project:`, `note:`,
|
|
271
|
-
`document:`) and lists the
|
|
272
|
-
notes about it, the notes that link it, the notes that link a note about it, and links written with the
|
|
273
|
-
person's name that two people share. Hidden folders such as `.obsidian` are skipped, and nothing is ever
|
|
274
|
-
written to a notes folder.
|
|
275
|
-
|
|
276
|
-
Imports accept Markdown/TXT, CSV/TSV, text-layer PDF, DOCX, XLSX, ODT/ODS, PPTX and EPUB.
|
|
277
|
-
PDF/DOCX use optional `unpdf` and `mammoth` packages installed alongside the CLI; modern office
|
|
278
|
-
formats use the bounded built-in shared readers. Results report missing engines, unreadable files, unsupported legacy DOC/XLS, scanned
|
|
279
|
-
PDFs needing an agent, oversized inputs and truncation. PDF page spans, CSV row/column ranges and
|
|
280
|
-
XLSX sheet/cell addresses preserve source provenance. Files are capped at 50 MiB and stored text at
|
|
281
|
-
200,000 characters. Content hashes detect equal-size edits.
|
|
282
|
-
|
|
283
|
-
Folders and what to skip go in `~/.config/cli-memo/config.json`; `--folder` narrows a run to some of the
|
|
284
|
-
configured folders and `--ignore` adds rules for one run. An ignore rule is a path inside the folder — a file, or a folder and everything under it —
|
|
285
|
-
or a glob (`**/Private*`, `*.txt`):
|
|
249
|
+
More: [people, organizations and projects](https://github.com/WireCatLabs/cli-memo/blob/main/docs/people.md) ·
|
|
250
|
+
[people on wirecat.dev](https://wirecat.dev/en/docs/people)
|
|
286
251
|
|
|
287
|
-
|
|
288
|
-
{ "notes": { "folders": [{ "id": "3", "path": "/path/to/vault" }], "ignore": ["Journal/Private.md", "Archive"] } }
|
|
289
|
-
```
|
|
252
|
+
## Mail
|
|
290
253
|
|
|
291
|
-
|
|
254
|
+
memo reads mail through [Himalaya](https://github.com/pimalaya/himalaya), a command-line mail client you
|
|
255
|
+
set up first. Gmail is the default; another IMAP provider uses `mode: "imap"` with the folders to read. The
|
|
256
|
+
mailbox is opened read-only, `--max` (default 200) bounds the new mail per run and the next run continues.
|
|
257
|
+
Gmail labels become mailboxes, attachments' text is searched with its email, and mail deleted at the
|
|
258
|
+
source loses its text in the store. Each account is named in `mail.accounts`, and the import names it:
|
|
259
|
+
memo never picks one for you. `memo import` and the timer import every account.
|
|
292
260
|
|
|
293
261
|
```sh
|
|
294
|
-
memo
|
|
295
|
-
memo
|
|
296
|
-
memo folders attach FOLDER_ID /other/path/to/vault # the same folder on another computer
|
|
297
|
-
memo folders list
|
|
262
|
+
memo mail work import --since 2026-09-01 # work: the account's name in mail.accounts
|
|
263
|
+
memo search mail 'mailbox:important budget'
|
|
298
264
|
```
|
|
299
265
|
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
folders the store has from another computer, to attach. A path can belong to one id only. A bare path in
|
|
303
|
-
`notes.folders`, or a folder with no id, is refused by import with both commands named — memo never
|
|
304
|
-
invents an id, which would give every note a new identity. A folder id from a store older than
|
|
305
|
-
`wirecat.db` is not in the store: `memo folders add <path>` gives the folder a new one.
|
|
266
|
+
More: [mail](https://github.com/WireCatLabs/cli-memo/blob/main/docs/mail.md) ·
|
|
267
|
+
[email on wirecat.dev](https://wirecat.dev/en/docs/email)
|
|
306
268
|
|
|
307
|
-
|
|
308
|
-
with `#heading` and `#^block` anchors, `aliases`, `tags:` and inline `#tags`. `markdown` reads
|
|
309
|
-
`[label](path.md)` links and `tags:`; a `#word` in its text is not a tag. Both read links to stored
|
|
310
|
-
records — `[Rin](person:…)`, or a bare `msg:…` in the text.
|
|
269
|
+
## Tags, tasks and reminders
|
|
311
270
|
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
271
|
+
Tags are your labels on a note, an email, a message, a chat, a person, an organization, a project, a task,
|
|
272
|
+
a meeting, or every note under a folder. They live in the store; files, Gmail labels and mailbox flags are
|
|
273
|
+
never changed. A task points at the message or note it came from, or is your own in a
|
|
274
|
+
project (`--project RES --title …`), and can be blocked by another until it is done. Reminders are local:
|
|
275
|
+
a caller you choose polls for them, and nothing is delivered to a messenger or mailbox.
|
|
315
276
|
|
|
316
277
|
```sh
|
|
317
|
-
memo
|
|
318
|
-
memo
|
|
319
|
-
memo
|
|
320
|
-
memo auto off # stop and remove the timer
|
|
278
|
+
memo tags add follow-up --note note:NOTE_ID
|
|
279
|
+
memo tasks add 'msg:telegram/1/77/42' --type request
|
|
280
|
+
memo reminders schedule TASK_ID --at 2026-10-09T09:00:00+02:00 --provider telegram --account 1
|
|
321
281
|
```
|
|
322
282
|
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
from, with the `PATH` of that shell, so Himalaya and the keyring helper are found.
|
|
283
|
+
More: [tags](https://github.com/WireCatLabs/cli-memo/blob/main/docs/tags.md) ·
|
|
284
|
+
[open work and reminders](https://github.com/WireCatLabs/cli-memo/blob/main/docs/tasks.md) ·
|
|
285
|
+
[tag your sources](https://wirecat.dev/en/docs/memo#tag-your-sources)
|
|
327
286
|
|
|
328
|
-
|
|
329
|
-
not read; one whose content hash the store already has is not saved, so a second computer importing the
|
|
330
|
-
same folder saves nothing new. What this computer last saw is kept per folder in memo's state folder. Mail reads bodies only of messages not stored yet. A lock
|
|
331
|
-
keeps two imports from running at once, and one failing source does not stop the others.
|
|
287
|
+
## Agents and MCP
|
|
332
288
|
|
|
333
|
-
|
|
289
|
+
An agent with a terminal runs `memo` with `--json`. An MCP app starts `memo mcp`, which serves memories,
|
|
290
|
+
facts, proposed actions and the agent log on stdin and stdout:
|
|
334
291
|
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
UIDVALIDITY/folder/UID fallback, which can change after a move/reset. Configured folders are listed
|
|
339
|
-
completely before deletion checks; a changed folder scope skips deletion for that run.
|
|
292
|
+
```json
|
|
293
|
+
{ "mcpServers": { "memo": { "command": "memo", "args": ["mcp"] } } }
|
|
294
|
+
```
|
|
340
295
|
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
`memo mail <account> import --retry-attachments` to reread a bounded batch of stored mail. Import embeds mail
|
|
345
|
-
for search by meaning (`--no-embed` skips it); `memo search mail` itself matches words, and `tg search
|
|
346
|
-
conversations` finds mail by meaning.
|
|
296
|
+
An agent's memories, facts and proposals wait as `proposed`; it cannot confirm, accept, approve or reject. Approving an
|
|
297
|
+
action makes it your task; nothing is ever sent. `memo agents log` lists every call — the agent, the tool,
|
|
298
|
+
the outcome and the times, never the arguments. Search and context are not served over MCP.
|
|
347
299
|
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
memo search mail 'budget' --account you@example.com # one mail account; every one without --account
|
|
351
|
-
```
|
|
300
|
+
More: [memories, proposed actions and MCP](https://github.com/WireCatLabs/cli-memo/blob/main/docs/mcp.md) ·
|
|
301
|
+
[MCP on wirecat.dev](https://wirecat.dev/en/docs/mcp)
|
|
352
302
|
|
|
353
|
-
|
|
354
|
-
configured accounts when it is missing or unknown. `memo import` and the timer import every account in
|
|
355
|
-
`mail.accounts`. A mail import and `memo import` share one lock, so they never run at the same time.
|
|
303
|
+
## Keeping it current
|
|
356
304
|
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
label mailboxes, so `search mail mailbox:important` finds them. `search mail`, `search all`, `ask`, person context and tags
|
|
361
|
-
see it. Mail an import before 0.8.0 saved as messages stays searchable; an email imported again is listed
|
|
362
|
-
once.
|
|
305
|
+
`memo import` brings notes and mail up to date and reads only what changed. `memo auto on --every 5m` runs
|
|
306
|
+
it on a systemd user timer; `auto status` shows the next and last run. A lock keeps two imports apart, and
|
|
307
|
+
one failing source does not stop the others.
|
|
363
308
|
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
per run, and the next run continues.
|
|
367
|
-
- A mail deleted at the source loses its text in the store. The first two days of the window are left
|
|
368
|
-
alone, and a run that finds an unusually large share missing deletes nothing and says so. Mail moved
|
|
369
|
-
to Spam leaves All Mail and counts as deleted.
|
|
309
|
+
More: [keeping the store current](https://github.com/WireCatLabs/cli-memo/blob/main/docs/archive.md) ·
|
|
310
|
+
[import a folder on wirecat.dev](https://wirecat.dev/en/docs/memo#import-the-folder-you-choose)
|
|
370
311
|
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
312
|
+
## Configuration
|
|
313
|
+
|
|
314
|
+
`memo folders add` and `memo auto on` write `~/.config/cli-memo/config.json` for you. By hand you set what
|
|
315
|
+
to skip, mail accounts and where exported notes go:
|
|
374
316
|
|
|
375
317
|
```json
|
|
376
|
-
{
|
|
318
|
+
{
|
|
319
|
+
"notes": { "ignore": ["Journal/Private.md", "Archive"], "export": { "dir": "/path/to/vault/memo" } },
|
|
320
|
+
"mail": { "accounts": [{ "name": "work", "address": "you@example.com" }] }
|
|
321
|
+
}
|
|
377
322
|
```
|
|
378
323
|
|
|
379
|
-
|
|
380
|
-
|
|
324
|
+
More: [configuration](https://github.com/WireCatLabs/cli-memo/blob/main/docs/configuration.md) ·
|
|
325
|
+
[configuration on wirecat.dev](https://wirecat.dev/en/docs/configuration)
|
|
381
326
|
|
|
382
|
-
##
|
|
327
|
+
## Security
|
|
383
328
|
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
329
|
+
- Note folders and mailboxes are read-only; nothing is sent, moved or marked read.
|
|
330
|
+
- What memo adds — your notes, links, tags, tasks, memories — stays in the local store.
|
|
331
|
+
- A note or mail deleted at the source loses its text in the store on the next import; a run that finds an
|
|
332
|
+
unusually large share missing deletes nothing and says so.
|
|
333
|
+
- Evidence reaches a model only with `--model`, and a remote one only with `--allow-remote`.
|
|
334
|
+
- Agents propose; only you confirm memories and approve actions.
|
|
387
335
|
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
memo note telegram:"Rin Example" --clear
|
|
391
|
-
```
|
|
336
|
+
More: [security](https://github.com/WireCatLabs/cli-memo/blob/main/docs/security.md) ·
|
|
337
|
+
[security on wirecat.dev](https://wirecat.dev/en/docs/security)
|
|
392
338
|
|
|
393
|
-
|
|
394
|
-
choose from. The note must be imported first; the link is an `about` link in the store. Entries of an
|
|
395
|
-
older `~/.config/cli-memo/people-notes.json` move into the store once their notes are imported; the file
|
|
396
|
-
itself is left as it is.
|
|
339
|
+
## Limits
|
|
397
340
|
|
|
398
|
-
|
|
341
|
+
- Files up to 50 MiB; stored text up to 200,000 characters a file. Scanned PDFs and legacy DOC/XLS are
|
|
342
|
+
reported, not read.
|
|
343
|
+
- Search by meaning embeds at most 600 chunks a run; the next run continues.
|
|
344
|
+
- `memo mail <account> import` reads 200 new messages a run by default (`--max`) and keeps up to 1,000,000
|
|
345
|
+
characters of a body and 200,000 of an attachment's text (`mail.maxBodyChars`, `mail.maxAttachmentChars`).
|
|
346
|
+
- Searches return at most 100 results; `tags list` shows 100 labels unless `--limit` says more.
|
|
347
|
+
- Tags are 1–32 letters a–z, digits or hyphens.
|
|
399
348
|
|
|
400
|
-
|
|
401
|
-
memo
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
memo tags add follow-up --message 'msg:email/you%40example.com/12345/67890'
|
|
405
|
-
memo tags add follow-up --chat 12345 --provider email --account you@example.com
|
|
406
|
-
memo tags list --tag follow-up --json
|
|
407
|
-
tg search mail 'tag:follow-up'
|
|
408
|
-
```
|
|
349
|
+
More: [documents in a folder](https://github.com/WireCatLabs/cli-memo/blob/main/docs/notes.md#documents-in-a-folder) ·
|
|
350
|
+
[files memo can read](https://wirecat.dev/en/docs/memo#files-memo-can-read)
|
|
351
|
+
|
|
352
|
+
## When something is missing
|
|
409
353
|
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
354
|
+
- **Searched by words only:** the meaning model is not downloaded — `tg models text download e5-small`.
|
|
355
|
+
- **A folder is refused by import:** it has no id yet — `memo folders add <path>`.
|
|
356
|
+
- **A name is refused:** two people share it; use one of the ids it lists.
|
|
357
|
+
- **`memo ask` asks for a scope:** add `--all`, or `--provider` with `--account`.
|
|
358
|
+
- **An empty search:** the store holds nothing that matches — not proof that it never happened. Try the
|
|
359
|
+
kind's own search, looser words, or import that source first.
|
|
360
|
+
|
|
361
|
+
More: [if something is missing](https://wirecat.dev/en/docs/memo#if-something-is-missing) ·
|
|
362
|
+
[search and evidence](https://github.com/WireCatLabs/cli-memo/blob/main/docs/search.md)
|
|
363
|
+
|
|
364
|
+
## Part of WireCat
|
|
365
|
+
|
|
366
|
+
[WireCat](https://wirecat.dev) is an open-source, local-first context layer for AI agents: tg for
|
|
367
|
+
Telegram, max for MAX, memo for your notes and mail, all in one local store. Start with your notes. Add
|
|
368
|
+
more context when you need it. Your context. Any agent.
|
|
369
|
+
|
|
370
|
+
## Technical docs
|
|
371
|
+
|
|
372
|
+
| Page | What it covers |
|
|
373
|
+
| --- | --- |
|
|
374
|
+
| [Installation](https://github.com/WireCatLabs/cli-memo/blob/main/docs/installation.md) | Requirements, install, where files go, update |
|
|
375
|
+
| [Notes](https://github.com/WireCatLabs/cli-memo/blob/main/docs/notes.md) | Folders, formats, documents, your own notes, export |
|
|
376
|
+
| [Search and evidence](https://github.com/WireCatLabs/cli-memo/blob/main/docs/search.md) | Query language, `search all`, `ask` |
|
|
377
|
+
| [People, organizations and projects](https://github.com/WireCatLabs/cli-memo/blob/main/docs/people.md) | Person context, linking, relationships |
|
|
378
|
+
| [Mail](https://github.com/WireCatLabs/cli-memo/blob/main/docs/mail.md) | Gmail and IMAP through Himalaya |
|
|
379
|
+
| [Tags](https://github.com/WireCatLabs/cli-memo/blob/main/docs/tags.md) | Labels on any source |
|
|
380
|
+
| [Open work and reminders](https://github.com/WireCatLabs/cli-memo/blob/main/docs/tasks.md) | Tasks and local reminders |
|
|
381
|
+
| [Memories, facts, proposed actions and MCP](https://github.com/WireCatLabs/cli-memo/blob/main/docs/mcp.md) | What agents propose, the agent log |
|
|
382
|
+
| [Keeping the store current](https://github.com/WireCatLabs/cli-memo/blob/main/docs/archive.md) | `memo import` and the timer |
|
|
383
|
+
| [Configuration](https://github.com/WireCatLabs/cli-memo/blob/main/docs/configuration.md) | Every setting and variable |
|
|
384
|
+
| [Security](https://github.com/WireCatLabs/cli-memo/blob/main/docs/security.md) | What is read, written and sent |
|
|
385
|
+
| [Changelog](https://github.com/WireCatLabs/cli-memo/blob/main/CHANGELOG.md) | Every release |
|
|
386
|
+
|
|
387
|
+
The reader guides live on [wirecat.dev](https://wirecat.dev/en/docs/memo).
|
|
425
388
|
|
|
426
389
|
## Development
|
|
427
390
|
|
|
@@ -430,6 +393,10 @@ pnpm install
|
|
|
430
393
|
pnpm lint && pnpm typecheck && pnpm test
|
|
431
394
|
```
|
|
432
395
|
|
|
396
|
+
Pull requests are welcome; examples and tests use invented people only.
|
|
397
|
+
|
|
398
|
+
More: [installation](https://github.com/WireCatLabs/cli-memo/blob/main/docs/installation.md#development)
|
|
399
|
+
|
|
433
400
|
## License
|
|
434
401
|
|
|
435
|
-
[Apache License 2.0](LICENSE).
|
|
402
|
+
[Apache License 2.0](https://github.com/WireCatLabs/cli-memo/blob/main/LICENSE).
|
package/dist/mcp/vocabulary.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vocabulary.d.ts","sourceRoot":"","sources":["../../src/mcp/vocabulary.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,eAAe;IAC1B,eAAe;IAQf,kBAAkB;IAQlB,oBAAoB;CAarB,CAAA"}
|
|
1
|
+
{"version":3,"file":"vocabulary.d.ts","sourceRoot":"","sources":["../../src/mcp/vocabulary.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,eAAe;IAC1B,eAAe;IAQf,gBAAgB;IAahB,kBAAkB;IAQlB,oBAAoB;CAarB,CAAA"}
|
package/dist/mcp/vocabulary.js
CHANGED
|
@@ -15,6 +15,18 @@ export const vocabularyTools = {
|
|
|
15
15
|
input: v.object(options),
|
|
16
16
|
run: (store, args) => store.knowledge.vocabulary(args),
|
|
17
17
|
}),
|
|
18
|
+
vocabulary_audit: define({
|
|
19
|
+
title: "Discover vocabulary synonyms",
|
|
20
|
+
description: "Bounded lexical comparison of canonical names and aliases. Review candidates; incomplete scans do not prove uniqueness. This tool neither accepts synonyms nor merges or creates records.",
|
|
21
|
+
writes: false,
|
|
22
|
+
input: v.object({
|
|
23
|
+
...options,
|
|
24
|
+
minSimilarity: v.optional(v.pipe(v.number(), v.minValue(0.65), v.maxValue(1))),
|
|
25
|
+
maxComparisons: bounded(100000),
|
|
26
|
+
limit: bounded(200),
|
|
27
|
+
}),
|
|
28
|
+
run: (store, args) => store.knowledge.auditVocabulary(args),
|
|
29
|
+
}),
|
|
18
30
|
vocabulary_resolve: define({
|
|
19
31
|
title: "Resolve a canonical name",
|
|
20
32
|
description: "Resolve only exact names and explicit aliases. Ambiguous matches remain candidates; never infer identity from similarity.",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vocabulary.js","sourceRoot":"","sources":["../../src/mcp/vocabulary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAElC,MAAM,OAAO,GAAG,CAAC,OAAe,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;AACpH,MAAM,OAAO,GAAG;IACd,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;IACzD,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;IACnD,UAAU,EAAE,OAAO,CAAC,KAAK,CAAC;IAC1B,YAAY,EAAE,OAAO,CAAC,QAAQ,CAAC;CAChC,CAAA;AACD,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,eAAe,EAAE,MAAM,CAAC;QACtB,KAAK,EAAE,2BAA2B;QAClC,WAAW,EACT,kIAAkI;QACpI,MAAM,EAAE,KAAK;QACb,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;QACxB,GAAG,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC;KACvD,CAAC;IACF,kBAAkB,EAAE,MAAM,CAAC;QACzB,KAAK,EAAE,0BAA0B;QACjC,WAAW,EACT,2HAA2H;QAC7H,MAAM,EAAE,KAAK;QACb,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC;QAC3F,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC;KACjF,CAAC;IACF,oBAAoB,EAAE,MAAM,CAAC;QAC3B,KAAK,EAAE,yBAAyB;QAChC,WAAW,EACT,+JAA+J;QACjK,MAAM,EAAE,KAAK;QACb,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;YACd,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YAC1D,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;YAC9C,UAAU,EAAE,OAAO,CAAC,KAAK,CAAC;YAC1B,YAAY,EAAE,OAAO,CAAC,QAAQ,CAAC;SAChC,CAAC;QACF,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC;KAC5E,CAAC;CACH,CAAA"}
|
|
1
|
+
{"version":3,"file":"vocabulary.js","sourceRoot":"","sources":["../../src/mcp/vocabulary.ts"],"names":[],"mappings":"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"}
|
package/dist/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const VERSION = "0.
|
|
1
|
+
export declare const VERSION = "0.17.0";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/version.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export const VERSION = "0.
|
|
1
|
+
export const VERSION = "0.17.0";
|
|
2
2
|
//# sourceMappingURL=version.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/vocabulary/command.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,KAAK,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAQ1E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAWxC,eAAO,MAAM,iBAAiB,YAAa,OAAO,WAAW,OAAO,OAAO,MAAM,CAAC,UAAU,KAAG,
|
|
1
|
+
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/vocabulary/command.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,KAAK,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAQ1E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAWxC,eAAO,MAAM,iBAAiB,YAAa,OAAO,WAAW,OAAO,OAAO,MAAM,CAAC,UAAU,KAAG,IAwG9F,CAAA"}
|
|
@@ -42,6 +42,16 @@ export const vocabularyCommand = (program, streams, env) => {
|
|
|
42
42
|
.command("resolve")
|
|
43
43
|
.argument("<name>")
|
|
44
44
|
.description("Resolve an exact name or alias; ambiguity is reported")).action((name, options) => execute(options, (store) => store.knowledge.resolveVocabulary(name, catalogOptions(options))));
|
|
45
|
+
readOptions(vocabulary.command("audit").description("Discover likely synonyms without accepting or merging them"))
|
|
46
|
+
.option("--min-similarity <n>", "minimum lexical similarity, 0.65–1", Number)
|
|
47
|
+
.option("--max-comparisons <n>", "bound name comparisons", positive)
|
|
48
|
+
.option("--limit <n>", "maximum candidate pairs", positive)
|
|
49
|
+
.action((options) => execute(options, (store) => store.knowledge.auditVocabulary({
|
|
50
|
+
...catalogOptions(options),
|
|
51
|
+
...(options.minSimilarity === undefined ? {} : { minSimilarity: options.minSimilarity }),
|
|
52
|
+
...(options.maxComparisons === undefined ? {} : { maxComparisons: options.maxComparisons }),
|
|
53
|
+
...(options.limit === undefined ? {} : { limit: options.limit }),
|
|
54
|
+
})));
|
|
45
55
|
vocabulary
|
|
46
56
|
.command("preflight")
|
|
47
57
|
.argument("<name>")
|
|
@@ -49,6 +59,18 @@ export const vocabularyCommand = (program, streams, env) => {
|
|
|
49
59
|
.option("--kind <kind>", "tag or topic", oneOf(["tag", "topic"]))
|
|
50
60
|
.option("--json", "print JSON")
|
|
51
61
|
.action((name, options) => execute(options, (store) => store.knowledge.tagPreflight(name, { ...(options.kind === undefined ? {} : { kind: options.kind }) })));
|
|
62
|
+
vocabulary
|
|
63
|
+
.command("create")
|
|
64
|
+
.argument("<name>")
|
|
65
|
+
.description("Owner: create a distinct tag or topic after reviewing its preflight")
|
|
66
|
+
.option("--kind <kind>", "tag or topic", oneOf(["tag", "topic"]))
|
|
67
|
+
.requiredOption("--expected <fingerprint>", "the current preflight creationFingerprint")
|
|
68
|
+
.option("--json", "print JSON")
|
|
69
|
+
.action((name, options) => execute(options, (store) => store.knowledge.createTag(name, {
|
|
70
|
+
by: "owner",
|
|
71
|
+
...(options.kind === undefined ? {} : { kind: options.kind }),
|
|
72
|
+
expectedCreationFingerprint: options.expected,
|
|
73
|
+
})));
|
|
52
74
|
const aliases = vocabulary.command("aliases").description("Owner-reviewed aliases on stable canonical IDs");
|
|
53
75
|
aliases
|
|
54
76
|
.command("add")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/vocabulary/command.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/vocabulary/command.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wirecat/cli-memo",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.17.0",
|
|
4
4
|
"description": "Context about people across messengers, notes and mail, from a local store",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": "Viacheslav Ptsarev",
|
|
@@ -35,24 +35,24 @@
|
|
|
35
35
|
"prepublishOnly": "pnpm build",
|
|
36
36
|
"standards:check": "node config/wirecat/check.mjs",
|
|
37
37
|
"docs:lint": "markdownlint-cli2",
|
|
38
|
-
"docs:spell": "cspell lint --config cspell.json --no-progress README.md",
|
|
38
|
+
"docs:spell": "cspell lint --config cspell.json --no-progress README.md \"docs/*.md\"",
|
|
39
39
|
"ci:quick": "pnpm typecheck"
|
|
40
40
|
},
|
|
41
41
|
"dependencies": {
|
|
42
42
|
"@modelcontextprotocol/server": "2.1.0",
|
|
43
43
|
"@valibot/to-json-schema": "1.8.0",
|
|
44
44
|
"@wirecat/cli-core": "0.20.0",
|
|
45
|
-
"@wirecat/cli-messaging": "0.
|
|
45
|
+
"@wirecat/cli-messaging": "0.246.0",
|
|
46
46
|
"commander": "15.0.0",
|
|
47
47
|
"valibot": "1.5.0",
|
|
48
48
|
"yaml": "2.9.1"
|
|
49
49
|
},
|
|
50
50
|
"devDependencies": {
|
|
51
51
|
"@biomejs/biome": "2.5.15",
|
|
52
|
-
"@modelcontextprotocol/client": "2.2.0",
|
|
53
52
|
"@cspell/dict-en-gb": "5.0.34",
|
|
54
53
|
"@cspell/dict-es-es": "3.0.9",
|
|
55
54
|
"@cspell/dict-ru_ru": "2.3.3",
|
|
55
|
+
"@modelcontextprotocol/client": "2.2.0",
|
|
56
56
|
"@types/node": "^22.20.4",
|
|
57
57
|
"@vitest/coverage-v8": "5.0.3",
|
|
58
58
|
"cspell": "10.3.6",
|