@wirecat/cli-memo 0.16.0 → 0.18.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 CHANGED
@@ -1,427 +1,390 @@
1
- # cli-memo
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
- `memo` answers "what do I need to know about this person": who they are in each messenger, the
4
- newest messages each way, the notes about them, and the newest mail threads — each item with a link
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
- It reads the local message store that [tg-cli](https://github.com/WireCatLabs/tg-cli) and
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
- **Status:** early. Context, notes and their links, document import, Gmail and IMAP imports, tasks,
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
- memo vocabulary list --kind project --scope work --json
20
- memo vocabulary resolve 'Lab Example' --kind project --json
21
- memo vocabulary aliases add project:1 'Lab Example' --expected FINGERPRINT --json
22
- memo vocabulary aliases remove project:1 ALIAS_ID --expected FINGERPRINT --json
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
- Use canonical IDs and the fingerprint from `vocabulary list` when reviewing an alias change.
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
- Read-only MCP tools `vocabulary_list`, `vocabulary_resolve` and `vocabulary_preflight` expose the same
33
- catalog to an agent. Alias changes remain owner operations. An agent's `facts_add` can name the
34
- canonical `project:<id>` and retains its proposed status until reviewed.
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
- ## Project meetings and ready work
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
- ```sh
39
- memo projects add 'Research Example' --key RES --scope work
40
- memo projects meetings list RES --provider zoom --account STORED_ACCOUNT --json
41
- memo projects meetings link RES MEETING_ID --provider zoom --account STORED_ACCOUNT --json
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
- Select the exact stored account explicitly. Meeting links are reviewed owner operations;
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
- New project keys have 3–4 characters; existing project/task keys remain valid. Only completed
56
- prerequisites make a blocked task ready. Dismissed or deleted blockers need review. Follow-up and
57
- related links are informational. `tasks relations` lists edges; `tasks unlink` removes a reviewed
58
- edge with the same `--kind`. Parent hierarchy is separate.
80
+ ```sh
81
+ memo context telegram:"Alice Example" --json
82
+ ```
59
83
 
60
- MCP `task_relations`, `task_readiness` and `tasks_ready` expose bounded discovery to an agent. They
61
- never claim, assign, execute or accept task relationships. Durable worker leases and the cited
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
- ## Your notes on messages, people and projects
87
+ **"Where did we discuss the Harbour budget?"**
65
88
 
66
89
  ```sh
67
- memo notes add 'Prefers mornings' --about telegram:'Rin Example'
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
- A note written here is the store's, not a file's, and is about whatever `--about` names: a person by
76
- `<messenger>:<name or id>`, or any stored record by its reference — `msg:`, `chat:`, `contact:`,
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
- ## Open work
96
+ **"What did I promise people this week?"**
89
97
 
90
98
  ```sh
91
- memo tasks add 'msg:telegram/1/77/42' --type request
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
- A bug, feature or chore has no source: `--project` (its key or `project:<id>`) and `--title` make it there,
103
- keyed `<project key>-<n>`. `--priority` (0 urgent … 4 low), `--parent`, `--description` and `--assignee` work
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
- Native note tasks belong to the explicitly selected stored account. Their previews read current note
108
- text; deleting a note keeps its task with an unavailable source. Repeated creation of the same kind
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
- `context` includes directly related open tasks and explicit task assignments. A task in a shared group
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
- ## Search and gather evidence
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
- ```sh
119
- memo search notes '"budget review" AND NOT cancelled' --limit 20
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
- Notes are searched by their words and word stems, in the query language messages use: phrases,
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
- ```sh
158
- memo organizations add 'Synthetic Studio' --kind company
159
- memo projects add 'Synthetic Harbour' --organization organization:ORGANIZATION_ID
160
- memo relationships add person:PERSON_UID project:PROJECT_ID --role author
161
- memo projects context PROJECT_ID --json
162
- memo tags add client --organization ORGANIZATION_ID
163
- memo tags add follow-up --task TASK_ID
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
- Organizations (a company, team, family or community) and projects (with a short key, a type and the
167
- organization they belong to) are yours, not one account's. Relationships use `member-of` or `related-to`;
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
- `memo relationships suggest --provider email --account owner@example.test` stores bounded weak
174
- shared-domain proposals for direct email contacts. Proposals retain rule provenance and remain
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
- ## Memories, proposed actions and the agent log
138
+ ## What it reads
179
139
 
180
- ```sh
181
- memo memories add 'Bob Sample prefers Friday meetings' --kind preference --scope work --evidence note:NOTE_ID
182
- memo memories list --status proposed
183
- memo memories confirm memory:MEMORY_ID
184
- memo facts add 'Releases go out on Fridays' --type decision --evidence msg:telegram/1/77/42
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
- A memory is what was concluded — a summary, digest or preference — with its evidence (any stored reference)
193
- and a scope, `personal` or `work`. One you write is confirmed at once; an agent's waits as `proposed` until you
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
- A fact is what happened: a fact, a statement, a question, a decision or a promise, with its evidence. Yours is
198
- accepted at once; an agent's waits as `proposed` until you `facts accept` it. A decision with `--supersedes`
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
- A proposed action is what an agent wants done in one account: a reply, a ban, an invitation. Nothing is ever
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
- `memo agents log` lists what agents did through the MCP servers that share the store, newest first: the
206
- agent, the tool, its tier, the outcome and the times, never the arguments.
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
- `memo mcp` serves the same to an agent over MCP, on stdin and stdout: `memories_add`, `memories_list`,
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
- ```json
214
- { "mcpServers": { "memo": { "command": "memo", "args": ["mcp"] } } }
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
- ## Local task reminders
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 reminders schedule TASK_ID --at 2026-10-09T09:00:00+02:00 --timezone Europe/Madrid --provider telegram --account 1
221
- memo reminders poll --provider telegram --account 1 --json
222
- memo reminders ack REMINDER_ID RECEIPT --provider telegram --account 1
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
- Reminders are local deliveries for an explicitly scheduled open task. Poll leases due deliveries;
228
- acknowledgement confirms consumption. Expired leases retry with a new receipt; integrations deduplicate
229
- by `deliveryId` (reminder ID and revision). State survives restart. Snooze checks the current revision;
230
- task closure cancels pending reminders. The import timer continues to import sources and does not
231
- deliver reminders to messengers or email. A caller can schedule `poll` using its chosen local scheduler.
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
- ## Context about a person
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 context telegram:"Rin Example" # or max:<name or id>, email:<address>
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
- One answer from the shared store: every identity linked to the person (`tg|max contacts link`), the
240
- last message each way, recent messages in direct chats and groups, chats in common — mail included once
241
- an address is linked — then the notes linked to them: the note about them (`memo note`), notes that link
242
- them, notes that link the note about them, and the notes you wrote here about them. A name in a note's
243
- plain text is not a link and is not listed. What gave nothing is listed with the reason. `--json` for
244
- agents, `--limit` for more.
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
- ## Notes
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 folders add /path/to/vault # once: gives the folder an id
250
- memo notes import # load the notes into the shared store; run again after edits
251
- memo search notes "lighthouse budget" # notes by their words and meaning, and what they link
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
- `import` stores each file as a note of its folder, named by its path inside the folder. An edited note
256
- keeps its old text as a revision; a note deleted from the folder loses its text on the next import, and a
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
- ```json
288
- { "notes": { "folders": [{ "id": "3", "path": "/path/to/vault" }], "ignore": ["Journal/Private.md", "Archive"] } }
289
- ```
252
+ ## Mail
290
253
 
291
- ### Folders and their format
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 folders add /path/to/vault # gives the folder an id and prints it
295
- memo folders add /path/to/notes --format markdown # a plain Markdown folder
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
- A folder's id is the store's and is what notes and links use; its path is only where it is on this
301
- computer, so the config differs between computers and the id does not. `folders list` also shows the
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
- `format` says how the folder's notes are written. `obsidian` (the default) reads `[[Note|label]]` links
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
- A Markdown file whose front matter carries `memo-id` was written by memo and is skipped by import.
313
-
314
- ## Keeping it current
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 import # notes and mail, only what changed since the last run
318
- memo auto on --every 5m # run memo import on a systemd user timer (default 5m, a minute or more)
319
- memo auto status # on/off, interval, next and last run
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
- The config is the one source: `memo auto on/off` write `auto: { enabled, every }` to
324
- `~/.config/cli-memo/config.json`, and a hand edit there takes effect at the next timer run, which
325
- rewrites or removes its own timer to match. The timer runs `memo import` from the place it was set up
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
- `memo import` is incremental. A note whose size and change time are as this computer last saw them is
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
- ## Mail
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
- Gmail remains the default. For another IMAP provider, configure an account with `mode: "imap"`
336
- and `folders: ["INBOX", "Archive"]` in `mail.accounts`. Message-ID and reference headers preserve
337
- message/thread identities across folder moves and UID resets. Mail without Message-ID uses an explicit
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
- Imports report the proven date/folder window. No thread is called globally complete on the basis of one
342
- window. To, CC and BCC are kept. A readable attachment's text is kept with its email and searched with it
343
- (`content:`, `filename:`); extraction failures are reported. After installing an optional engine, use
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
- ```sh
349
- memo mail work import --since 2026-09-01 # work: the account's name in mail.accounts
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
- `<account>` is required, even with one account configured: memo never picks one for you, and names the
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
- Reads a Gmail account's All Mail through [Himalaya](https://github.com/pimalaya/himalaya) into the
358
- shared store's mail tables: one thread per Gmail thread, each folder a mailbox, the mailbox address as
359
- the account, senders and recipients as people. Gmail labels (Inbox, Important, Starred, your own) become
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
- - Read only: the mailbox is opened read-only, nothing is sent, and no mail is marked read.
365
- - Run it again any time: what is stored is skipped; `--max` (default 200) bounds the new mails read
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
- Set the account up in Himalaya first (an IMAP account with a Gmail
372
- [app password](https://myaccount.google.com/apppasswords); `bin/mail-password <name>` stores it in the
373
- keyring), then name it in `~/.config/cli-memo/config.json`:
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
- { "mail": { "accounts": [{ "name": "work", "address": "you@example.com" }] } }
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
- `mail.maxBodyChars` (default 1,000,000) and `mail.maxAttachmentChars` (default 200,000) set how many characters
380
- of a body and of one attachment's text are kept.
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
- ## People
327
+ ## Security
383
328
 
384
- Who is who is decided in messaging: `tg contacts link <person> email:<address>` (or `max contacts link`)
385
- records that a messenger identity and a mail address are one person, in the shared store. A same name
386
- is never enough. `memo` only names the note that is about the person:
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
- ```sh
389
- memo note telegram:"Rin Example" ~/Notes/people/Rin.md
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
- An identity is `<messenger>:<name or id>`; a name two people share is refused, with their ids to
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
- ## Tags on sources
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
- ```sh
401
- memo tags add work follow-up --note note:NOTE_ID
402
- memo tags add project --folder FOLDER_ID --path Projects
403
- memo search notes "budget" --tag work
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
- A note is labelled by its reference (`--note note:<id>`, or `document:<id>` for a file in a notes
411
- folder), an email or messenger message by its full `msg:` locator, a mail thread or chat by its exact id
412
- and account. A person, organization, project or task is labelled by `--person`, `--organization`,
413
- `--project` or `--task`, with no account; a contact names its account, and so does a meeting:
414
- `--meeting <id> --provider <provider> --account <account>`, the meeting's id in the store. A note about a
415
- meeting takes the same three options: `memo notes add 'Send the agenda' --meeting <id> --provider <provider>
416
- --account <account>`. `--folder` with an id from
417
- `memo folders list`, and `--path` for one subfolder, labels every note under it at any depth. Tags use 1–32 letters a–z, digits or hyphens; case is ignored.
418
- Adding an existing tag or removing an absent one leaves it unchanged.
419
-
420
- Labels live in the shared local store. Tagging leaves note files, front matter, Gmail labels and mailbox
421
- flags untouched. Labels survive edits and moves of the note; a deleted note disappears from search.
422
- `tags list` shows up to 100 labels by default (`--limit` for more, `hasMore` in JSON); a note's tags
423
- say whether its file or you stated them. Contact identity
424
- tags remain available through `tg|max tags`.
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).
@@ -1,5 +1,6 @@
1
1
  export declare const vocabularyTools: {
2
2
  vocabulary_list: import("./tool.js").MemoTool;
3
+ vocabulary_audit: import("./tool.js").MemoTool;
3
4
  vocabulary_resolve: import("./tool.js").MemoTool;
4
5
  vocabulary_preflight: import("./tool.js").MemoTool;
5
6
  };
@@ -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"}
@@ -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.16.0";
1
+ export declare const VERSION = "0.18.0";
2
2
  //# sourceMappingURL=version.d.ts.map
package/dist/version.js CHANGED
@@ -1,2 +1,2 @@
1
- export const VERSION = "0.16.0";
1
+ export const VERSION = "0.18.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,IA0E9F,CAAA"}
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":"AAAA,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAgB,MAAM,mBAAmB,CAAA;AAC1E,OAAO,EAEL,SAAS,GAIV,MAAM,8BAA8B,CAAA;AAErC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAE/C,MAAM,KAAK,GAAG,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,CAAU,CAAA;AAClD,MAAM,QAAQ,GAAG,CAAC,SAAiB,EAAoB,EAAE;IACvD,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAA;IACjE,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,kEAAkE,CAAC,CAAA;IACtH,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAmB,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC,CAAW,EAAE,CAAA;AACrE,CAAC,CAAA;AAGD,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,OAAgB,EAAE,OAAgB,EAAE,GAAsB,EAAQ,EAAE;IACpG,MAAM,UAAU,GAAG,OAAO;SACvB,OAAO,CAAC,YAAY,CAAC;SACrB,WAAW,CAAC,2DAA2D,CAAC,CAAA;IAC3E,MAAM,OAAO,GAAG,KAAK,EAAE,OAAgB,EAAE,IAA+C,EAAE,EAAE;QAC1F,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,EAAE,GAAG,EAAE,CAAC,CAAA;QACtC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,CAAA;YAChC,IAAI,OAAO,CAAC,IAAI;gBAAE,cAAc,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;;gBACrF,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAA;QAC3D,CAAC;gBAAS,CAAC;YACT,MAAM,KAAK,CAAC,KAAK,EAAE,CAAA;QACrB,CAAC;IACH,CAAC,CAAA;IACD,MAAM,WAAW,GAAG,CAAC,OAAgB,EAAE,EAAE,CACvC,OAAO;SACJ,MAAM,CAAC,eAAe,EAAE,uBAAuB,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;SAC9D,MAAM,CAAC,iBAAiB,EAAE,2BAA2B,EAAE,KAAK,CAAC,CAAC,UAAU,EAAE,MAAM,CAAU,CAAC,CAAC;SAC5F,MAAM,CAAC,mBAAmB,EAAE,uCAAuC,EAAE,QAAQ,CAAC;SAC9E,MAAM,CAAC,sBAAsB,EAAE,2BAA2B,EAAE,QAAQ,CAAC;SACrE,MAAM,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;IACnC,MAAM,cAAc,GAAG,CAAC,OAAgB,EAAqB,EAAE,CAAC,CAAC;QAC/D,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;QAC7D,GAAG,CAAC,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC;QAChE,GAAG,CAAC,OAAO,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC;QAC/E,GAAG,CAAC,OAAO,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC;KACtF,CAAC,CAAA;IACF,WAAW,CACT,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,qEAAqE,CAAC,CAC9G,CAAC,MAAM,CAAC,CAAC,OAAgB,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;IAChH,WAAW,CACT,UAAU;SACP,OAAO,CAAC,SAAS,CAAC;SAClB,QAAQ,CAAC,QAAQ,CAAC;SAClB,WAAW,CAAC,uDAAuD,CAAC,CACxE,CAAC,MAAM,CAAC,CAAC,IAAY,EAAE,OAAgB,EAAE,EAAE,CAC1C,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,iBAAiB,CAAC,IAAI,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAC9F,CAAA;IACD,UAAU;SACP,OAAO,CAAC,WAAW,CAAC;SACpB,QAAQ,CAAC,QAAQ,CAAC;SAClB,WAAW,CAAC,uEAAuE,CAAC;SACpF,MAAM,CAAC,eAAe,EAAE,cAAc,EAAE,KAAK,CAAC,CAAC,KAAK,EAAE,OAAO,CAAU,CAAC,CAAC;SACzE,MAAM,CAAC,QAAQ,EAAE,YAAY,CAAC;SAC9B,MAAM,CAAC,CAAC,IAAY,EAAE,OAA6C,EAAE,EAAE,CACtE,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CACzB,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CACtG,CACF,CAAA;IACH,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,gDAAgD,CAAC,CAAA;IAC3G,OAAO;SACJ,OAAO,CAAC,KAAK,CAAC;SACd,QAAQ,CAAC,aAAa,CAAC;SACvB,QAAQ,CAAC,QAAQ,CAAC;SAClB,cAAc,CAAC,0BAA0B,EAAE,4CAA4C,CAAC;SACxF,MAAM,CAAC,QAAQ,EAAE,YAAY,CAAC;SAC9B,MAAM,CAAC,CAAC,SAAiB,EAAE,IAAY,EAAE,OAAgB,EAAE,EAAE;QAC5D,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAA;QAClC,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAChC,KAAK,CAAC,SAAS,CAAC,kBAAkB,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,mBAAmB,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CACzG,CAAA;IACH,CAAC,CAAC,CAAA;IACJ,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,QAAQ,CAAC,aAAa,CAAC;SACvB,QAAQ,CAAC,YAAY,CAAC;SACtB,cAAc,CAAC,0BAA0B,EAAE,4CAA4C,CAAC;SACxF,MAAM,CAAC,QAAQ,EAAE,YAAY,CAAC;SAC9B,MAAM,CAAC,CAAC,SAAiB,EAAE,OAAe,EAAE,OAAgB,EAAE,EAAE;QAC/D,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAA;QAClC,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAChC,KAAK,CAAC,SAAS,CAAC,qBAAqB,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,mBAAmB,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAC/G,CAAA;IACH,CAAC,CAAC,CAAA;AACN,CAAC,CAAA"}
1
+ {"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/vocabulary/command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAgB,MAAM,mBAAmB,CAAA;AAC1E,OAAO,EAEL,SAAS,GAIV,MAAM,8BAA8B,CAAA;AAErC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAE/C,MAAM,KAAK,GAAG,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,CAAU,CAAA;AAClD,MAAM,QAAQ,GAAG,CAAC,SAAiB,EAAoB,EAAE;IACvD,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAA;IACjE,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,kEAAkE,CAAC,CAAA;IACtH,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAmB,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC,CAAW,EAAE,CAAA;AACrE,CAAC,CAAA;AAGD,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,OAAgB,EAAE,OAAgB,EAAE,GAAsB,EAAQ,EAAE;IACpG,MAAM,UAAU,GAAG,OAAO;SACvB,OAAO,CAAC,YAAY,CAAC;SACrB,WAAW,CAAC,2DAA2D,CAAC,CAAA;IAC3E,MAAM,OAAO,GAAG,KAAK,EAAE,OAAgB,EAAE,IAA+C,EAAE,EAAE;QAC1F,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,EAAE,GAAG,EAAE,CAAC,CAAA;QACtC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,CAAA;YAChC,IAAI,OAAO,CAAC,IAAI;gBAAE,cAAc,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;;gBACrF,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAA;QAC3D,CAAC;gBAAS,CAAC;YACT,MAAM,KAAK,CAAC,KAAK,EAAE,CAAA;QACrB,CAAC;IACH,CAAC,CAAA;IACD,MAAM,WAAW,GAAG,CAAC,OAAgB,EAAE,EAAE,CACvC,OAAO;SACJ,MAAM,CAAC,eAAe,EAAE,uBAAuB,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;SAC9D,MAAM,CAAC,iBAAiB,EAAE,2BAA2B,EAAE,KAAK,CAAC,CAAC,UAAU,EAAE,MAAM,CAAU,CAAC,CAAC;SAC5F,MAAM,CAAC,mBAAmB,EAAE,uCAAuC,EAAE,QAAQ,CAAC;SAC9E,MAAM,CAAC,sBAAsB,EAAE,2BAA2B,EAAE,QAAQ,CAAC;SACrE,MAAM,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;IACnC,MAAM,cAAc,GAAG,CAAC,OAAgB,EAAqB,EAAE,CAAC,CAAC;QAC/D,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;QAC7D,GAAG,CAAC,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC;QAChE,GAAG,CAAC,OAAO,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC;QAC/E,GAAG,CAAC,OAAO,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC;KACtF,CAAC,CAAA;IACF,WAAW,CACT,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,qEAAqE,CAAC,CAC9G,CAAC,MAAM,CAAC,CAAC,OAAgB,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;IAChH,WAAW,CACT,UAAU;SACP,OAAO,CAAC,SAAS,CAAC;SAClB,QAAQ,CAAC,QAAQ,CAAC;SAClB,WAAW,CAAC,uDAAuD,CAAC,CACxE,CAAC,MAAM,CAAC,CAAC,IAAY,EAAE,OAAgB,EAAE,EAAE,CAC1C,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,iBAAiB,CAAC,IAAI,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAC9F,CAAA;IACD,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,4DAA4D,CAAC,CAAC;SAC/G,MAAM,CAAC,sBAAsB,EAAE,oCAAoC,EAAE,MAAM,CAAC;SAC5E,MAAM,CAAC,uBAAuB,EAAE,wBAAwB,EAAE,QAAQ,CAAC;SACnE,MAAM,CAAC,aAAa,EAAE,yBAAyB,EAAE,QAAQ,CAAC;SAC1D,MAAM,CAAC,CAAC,OAAsF,EAAE,EAAE,CACjG,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CACzB,KAAK,CAAC,SAAS,CAAC,eAAe,CAAC;QAC9B,GAAG,cAAc,CAAC,OAAO,CAAC;QAC1B,GAAG,CAAC,OAAO,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC;QACxF,GAAG,CAAC,OAAO,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC;QAC3F,GAAG,CAAC,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC;KACjE,CAAC,CACH,CACF,CAAA;IACH,UAAU;SACP,OAAO,CAAC,WAAW,CAAC;SACpB,QAAQ,CAAC,QAAQ,CAAC;SAClB,WAAW,CAAC,uEAAuE,CAAC;SACpF,MAAM,CAAC,eAAe,EAAE,cAAc,EAAE,KAAK,CAAC,CAAC,KAAK,EAAE,OAAO,CAAU,CAAC,CAAC;SACzE,MAAM,CAAC,QAAQ,EAAE,YAAY,CAAC;SAC9B,MAAM,CAAC,CAAC,IAAY,EAAE,OAA6C,EAAE,EAAE,CACtE,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CACzB,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CACtG,CACF,CAAA;IACH,UAAU;SACP,OAAO,CAAC,QAAQ,CAAC;SACjB,QAAQ,CAAC,QAAQ,CAAC;SAClB,WAAW,CAAC,qEAAqE,CAAC;SAClF,MAAM,CAAC,eAAe,EAAE,cAAc,EAAE,KAAK,CAAC,CAAC,KAAK,EAAE,OAAO,CAAU,CAAC,CAAC;SACzE,cAAc,CAAC,0BAA0B,EAAE,2CAA2C,CAAC;SACvF,MAAM,CAAC,QAAQ,EAAE,YAAY,CAAC;SAC9B,MAAM,CAAC,CAAC,IAAY,EAAE,OAA6C,EAAE,EAAE,CACtE,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CACzB,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,EAAE;QAC9B,EAAE,EAAE,OAAO;QACX,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;QAC7D,2BAA2B,EAAE,OAAO,CAAC,QAAQ;KAC9C,CAAC,CACH,CACF,CAAA;IACH,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,gDAAgD,CAAC,CAAA;IAC3G,OAAO;SACJ,OAAO,CAAC,KAAK,CAAC;SACd,QAAQ,CAAC,aAAa,CAAC;SACvB,QAAQ,CAAC,QAAQ,CAAC;SAClB,cAAc,CAAC,0BAA0B,EAAE,4CAA4C,CAAC;SACxF,MAAM,CAAC,QAAQ,EAAE,YAAY,CAAC;SAC9B,MAAM,CAAC,CAAC,SAAiB,EAAE,IAAY,EAAE,OAAgB,EAAE,EAAE;QAC5D,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAA;QAClC,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAChC,KAAK,CAAC,SAAS,CAAC,kBAAkB,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,mBAAmB,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CACzG,CAAA;IACH,CAAC,CAAC,CAAA;IACJ,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,QAAQ,CAAC,aAAa,CAAC;SACvB,QAAQ,CAAC,YAAY,CAAC;SACtB,cAAc,CAAC,0BAA0B,EAAE,4CAA4C,CAAC;SACxF,MAAM,CAAC,QAAQ,EAAE,YAAY,CAAC;SAC9B,MAAM,CAAC,CAAC,SAAiB,EAAE,OAAe,EAAE,OAAgB,EAAE,EAAE;QAC/D,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAA;QAClC,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAChC,KAAK,CAAC,SAAS,CAAC,qBAAqB,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,mBAAmB,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAC/G,CAAA;IACH,CAAC,CAAC,CAAA;AACN,CAAC,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wirecat/cli-memo",
3
- "version": "0.16.0",
3
+ "version": "0.18.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.242.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",