@quillmeetings/cli 0.1.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Quill Meetings
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,367 @@
1
+ # Quill CLI
2
+
3
+ High-UX command line access to Quill Meetings, backed by the local Quill MCP server.
4
+
5
+ The CLI is designed for two audiences:
6
+
7
+ - Humans get interactive browsing, short aliases, readable tables, and no UUID copy/paste for common flows.
8
+ - Agents and scripts get compact structured output, `--json`, stable errors, pagination hints, and no prompts.
9
+
10
+ ## Install
11
+
12
+ Run the CLI without installing it globally:
13
+
14
+ ```bash
15
+ npx @quillmeetings/cli init
16
+ npx @quillmeetings/cli doctor
17
+ ```
18
+
19
+ Or install it globally:
20
+
21
+ ```bash
22
+ npm i -g @quillmeetings/cli
23
+ quill init
24
+ ```
25
+
26
+ For local development from this repo:
27
+
28
+ ```bash
29
+ npm link
30
+ quill --help
31
+ ```
32
+
33
+ Or run without linking:
34
+
35
+ ```bash
36
+ node bin/quill.js --help
37
+ ```
38
+
39
+ ## Prerequisite: Quill MCP Bridge
40
+
41
+ The CLI talks to Quill through a local MCP bridge that ships with the Quill desktop app. Install Quill desktop, sign in, and enable the MCP server in Quill Settings -> MCP / Integrations.
42
+
43
+ The default bridge path is platform-aware:
44
+
45
+ ```text
46
+ macOS: ~/Library/Application Support/Quill/mcp-stdio-bridge.js
47
+ Windows: %APPDATA%\Quill\mcp-stdio-bridge.js
48
+ ```
49
+
50
+ The CLI uses built-in defaults and does not need a config file for the happy path. To write the default config and check the bridge path:
51
+
52
+ ```bash
53
+ quill init
54
+ ```
55
+
56
+ To diagnose setup problems without running a meeting command:
57
+
58
+ ```bash
59
+ quill doctor
60
+ ```
61
+
62
+ If your bridge is elsewhere, point the CLI at it:
63
+
64
+ ```bash
65
+ quill config set mcp.args '["/path/to/mcp-stdio-bridge.js"]'
66
+ ```
67
+
68
+ The equivalent MCP client config looks like:
69
+
70
+ ```json
71
+ {
72
+ "quill": {
73
+ "command": "node",
74
+ "args": ["<absolute path to mcp-stdio-bridge.js>"]
75
+ }
76
+ }
77
+ ```
78
+
79
+ ## Human Workflow
80
+
81
+ Start with the interactive picker:
82
+
83
+ ```bash
84
+ quill init
85
+ quill doctor
86
+ quill browse
87
+ quill meetings browse --limit 20
88
+ quill meetings browse --search "roadmap"
89
+ ```
90
+
91
+ Keyboard controls:
92
+
93
+ ```text
94
+ From the list
95
+ up/down, j/k Move selection
96
+ Enter View selected meeting
97
+ n Open notes/minutes
98
+ t Open transcript
99
+ a Generate action-item note after confirmation
100
+ f Generate follow-up note after confirmation
101
+ y Confirm note generation
102
+ / Search (live filter while typing, Enter fetches from server)
103
+ ? Toggle help
104
+ q or Esc Quit (Esc first clears active search/filter)
105
+
106
+ From a detail panel
107
+ b or Esc Back to the list
108
+ up/down, j/k Scroll the panel one line
109
+ PgUp/PgDn Scroll the panel eight lines
110
+ c Copy the current panel content to clipboard
111
+ n Switch to notes
112
+ t Switch to transcript
113
+ a Generate action-item note after confirmation
114
+ f Generate follow-up note after confirmation
115
+ y Confirm note generation
116
+ Enter Re-open the meeting view
117
+ ? Toggle help
118
+ q Quit
119
+ ```
120
+
121
+ Browse uses an Ink-powered fullscreen terminal UI with color, keyboard navigation, viewport-aware lists, scrollable detail panels, clipboard copy, and confirmation screens for generated notes. This is intentionally separate from normal command output, which defaults to human tables and supports compact TOON/JSON for agents.
122
+
123
+ Commands that need a meeting ID also open the picker in a real terminal:
124
+
125
+ ```bash
126
+ quill notes
127
+ quill transcript
128
+ ```
129
+
130
+ Short aliases:
131
+
132
+ ```bash
133
+ quill ls # meetings list
134
+ quill v <id> # meetings view
135
+ quill <id> # meetings view
136
+ quill n <id> # notes
137
+ quill t <id> # transcript
138
+ ```
139
+
140
+ ## Common Commands
141
+
142
+ ```bash
143
+ quill doctor
144
+ quill meetings list --limit 10
145
+ quill meetings list --today
146
+ quill meetings view <id>
147
+ quill notes <id>
148
+ quill summarize <id>
149
+ quill note create <id> --prompt "Summarize risks and blockers"
150
+ quill note create <id> "Summarize risks and blockers" # positional prompt
151
+ quill note create <id> --template <template-id> --instruction "Focus on next steps"
152
+ quill actions <id> --instruction "Group by owner"
153
+ quill followup <id> --instruction "Tone: friendly, ready to send"
154
+ quill transcript <id>
155
+ quill search "roadmap risk" --since "last week"
156
+ quill contacts list --search "Jane"
157
+ quill threads list --include-meetings
158
+ quill events list --limit 10
159
+ quill templates list --kind minutes
160
+ ```
161
+
162
+ ## Agent Mode
163
+
164
+ Agent mode disables interactive prompts and keeps output machine-oriented. Without `--json` or `--human`, agent mode defaults to compact TOON output.
165
+
166
+ ```bash
167
+ quill meetings list --json
168
+ quill search "pricing" --json
169
+ quill notes <id> --json
170
+ quill meetings list --agent # TOON by default
171
+ quill meetings list --agent --human # force human tables in agent mode
172
+ ```
173
+
174
+ Enable it globally:
175
+
176
+ ```bash
177
+ quill config set agent.enabled true
178
+ ```
179
+
180
+ Global flags:
181
+
182
+ ```bash
183
+ --json Print structured JSON and enable agent mode
184
+ --agent Disable interactive prompts and human formatting
185
+ --no-agent Override agent.enabled from config for one command
186
+ --human, --table Force human table output when not using --json
187
+ --fields <a,b,c> Select list fields
188
+ --full Disable large text truncation
189
+ --truncate <chars> Large text truncation limit
190
+ -o, --format <fmt> Select output format: human, toon, or json
191
+ -l, --limit <n> Default result limit
192
+ -h, --help Show help
193
+ -v, --version Show version
194
+ ```
195
+
196
+ Interactive browsing is disabled in agent mode. `quill browse --json` returns a structured error instead of prompting:
197
+
198
+ ```json
199
+ {
200
+ "error": {
201
+ "code": "interactive_unavailable",
202
+ "message": "Interactive browsing is disabled in agent mode. Use `quill meetings list --json`."
203
+ }
204
+ }
205
+ ```
206
+
207
+ ## Output
208
+
209
+ Default output is human-readable. Lists render as tables in normal CLI use. Use `--format toon` for compact, YAML-like output that's cheap on LLM context, or `--json` for machine consumers.
210
+
211
+ Default human output:
212
+
213
+ ```text
214
+ Meetings (1)
215
+ id title date duration
216
+ ------------------------------------ ------- ---------- --------
217
+ 36dc4314-b6dc-4950-88ee-1b33556a6578 jtbd II 2 days ago 92min
218
+
219
+ Run `quill meetings view <id>`
220
+ Run `quill transcript <id> --full`
221
+ Run `quill search "<query>"`
222
+ ```
223
+
224
+ Compact TOON output:
225
+
226
+ ```bash
227
+ quill meetings list --limit 1 --format toon
228
+ ```
229
+
230
+ ```text
231
+ tool: search_meetings
232
+ result:
233
+ count: 1
234
+ meetings[1]{id,title,date,duration}:
235
+ 36dc...,jtbd II,2026-05-13T17:32:28.579Z,92min
236
+ next_offset: 1
237
+ help[3]:
238
+ Run `quill meetings view <id>`
239
+ Run `quill transcript <id> --full`
240
+ Run `quill search "<query>"`
241
+ ```
242
+
243
+ JSON output:
244
+
245
+ ```bash
246
+ quill meetings list --limit 1 --json
247
+ ```
248
+
249
+ Ask for more fields only when needed:
250
+
251
+ ```bash
252
+ quill meetings list --fields id,title,tags,url
253
+ ```
254
+
255
+ Get concise help for a specific command:
256
+
257
+ ```bash
258
+ quill meetings --help
259
+ quill browse --help
260
+ quill transcript --help
261
+ ```
262
+
263
+ ## Config
264
+
265
+ Persistent settings live in JSON:
266
+
267
+ ```text
268
+ ~/.config/quill-cli/config.json
269
+ ```
270
+
271
+ Use `QUILL_CONFIG=/path/to/config.json` to point the CLI at a different config file for tests or one-off runs.
272
+ Precedence is: command flags > environment variables > config file > built-in defaults.
273
+
274
+ ```bash
275
+ quill config path
276
+ quill config init
277
+ quill config show
278
+ quill config get mcp.mutation_timeout_ms
279
+ quill config set mcp.mutation_timeout_ms 180000
280
+ quill config set mcp.args '["/path/to/mcp-stdio-bridge.js"]'
281
+ ```
282
+
283
+ `quill init` is the guided setup command. It creates the config only if it is missing, then runs the same setup checks as `quill doctor`.
284
+
285
+ The only Quill-specific environment overrides are:
286
+
287
+ ```bash
288
+ QUILL_CONFIG=/path/to/config.json
289
+ QUILL_AGENT_MODE=1
290
+ QUILL_DEBUG=1
291
+ ```
292
+
293
+ ## Raw MCP Access
294
+
295
+ The curated commands cover common Quill workflows. Raw MCP remains available for discovery and debugging:
296
+
297
+ ```bash
298
+ quill mcp tools
299
+ quill mcp schema <tool>
300
+ quill mcp call <tool> --input '{"key":"value"}'
301
+ ```
302
+
303
+ ## Shell Completion
304
+
305
+ ```bash
306
+ quill completion zsh
307
+ quill completion bash
308
+ quill completion fish
309
+ ```
310
+
311
+ Completion covers commands and subcommands. Meeting IDs are not currently completed.
312
+
313
+ ## Design Principles
314
+
315
+ - Prefer curated meeting workflows over raw MCP tool sprawl.
316
+ - Avoid UUID copy/paste for humans.
317
+ - Keep agent output compact, structured, and prompt-free.
318
+ - Default to 3-4 list fields, with `--fields` for extra context.
319
+ - Truncate large strings by default, with `--full` as the escape hatch.
320
+ - Use `help[]` hints to make next actions discoverable.
321
+ - Keep raw MCP available as an escape hatch.
322
+
323
+ ## Development
324
+
325
+ ```bash
326
+ npm run check # node --check on every source file
327
+ npm run smoke # `quill --help` exits cleanly
328
+ npm test # run the unit-test suite
329
+ node bin/quill.js mcp tools
330
+ ```
331
+
332
+ The test suite uses Node's built-in `node:test` and `node:assert` — no external test framework. Files live in `test/` and cover the highest-leverage code:
333
+
334
+ - `test/mcp-client.test.js` — the `<ToolResponse>` XML-ish parser (`extractToolResult` / `parseQuillToolResponse`).
335
+ - `test/tool-router.test.js` — fuzzy alias matching in `findTool` and key remapping in `buildArgs`.
336
+ - `test/format.test.js` — `shapeForOutput`, `toHuman`, `toToon`, `truncateText`, etc.
337
+
338
+ To run a single file: `node --test test/mcp-client.test.js`.
339
+
340
+ Useful debug commands:
341
+
342
+ ```bash
343
+ QUILL_DEBUG=1 node bin/quill.js mcp tools
344
+ node bin/quill.js config set mcp.timeout_ms 30000
345
+ node bin/quill.js config set mcp.mutation_timeout_ms 180000
346
+ node bin/quill.js config set mcp.max_buffer_bytes 20971520
347
+ node bin/quill.js mcp schema search_meetings --json
348
+ ```
349
+
350
+ Code layout:
351
+
352
+ ```text
353
+ bin/quill.js CLI entrypoint and top-level error handling
354
+ src/cli.js command parsing, routing, help, and MCP command wiring
355
+ src/browser.js Ink-powered interactive meeting browser
356
+ src/config.js JSON config defaults, path resolution, get/set helpers
357
+ src/doctor.js First-run diagnostics for Quill desktop and MCP setup
358
+ src/mcp-client.js Quill MCP bridge client and ToolResponse parsing
359
+ src/format.js TOON/JSON/human output shaping, truncation, field selection
360
+ src/tool-router.js curated command to MCP tool mapping
361
+ ```
362
+
363
+ Implementation notes:
364
+
365
+ - Quill's bridge currently returns newline-delimited JSON-RPC, not standard `Content-Length` stdio framing.
366
+ - Quill tool results often contain XML-like `ToolResponse` text. The CLI parses the known Quill response shapes for compact display and keeps raw MCP access available for debugging.
367
+ - MCP stdout buffers are capped by `mcp.max_buffer_bytes` to avoid unbounded memory growth on malformed or very large responses.
package/bin/quill.js ADDED
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env node
2
+ const major = Number.parseInt(process.versions.node.split(".")[0], 10);
3
+ if (major < 20) {
4
+ process.stderr.write(`Quill CLI needs Node 20+. You have ${process.versions.node}.\n`);
5
+ process.exit(1);
6
+ }
7
+
8
+ const { runCli } = await import("../src/cli.js");
9
+
10
+ runCli(process.argv.slice(2)).catch((error) => {
11
+ const code = Number.isInteger(error?.exitCode) ? error.exitCode : 1;
12
+ const payload = {
13
+ error: {
14
+ code: error?.code || "unexpected_error",
15
+ message: error?.message || String(error),
16
+ },
17
+ };
18
+ process.stdout.write(`${JSON.stringify(payload, null, 2)}\n`);
19
+ process.exit(code);
20
+ });
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "@quillmeetings/cli",
3
+ "version": "0.1.0",
4
+ "description": "Human-friendly and agent-ready CLI for Quill Meetings backed by the Quill MCP server.",
5
+ "type": "module",
6
+ "files": [
7
+ "bin",
8
+ "src",
9
+ "README.md",
10
+ "LICENSE"
11
+ ],
12
+ "bin": {
13
+ "quill": "bin/quill.js"
14
+ },
15
+ "scripts": {
16
+ "start": "node bin/quill.js",
17
+ "check": "node --check bin/quill.js && node --check src/browser.js && node --check src/cli.js && node --check src/config.js && node --check src/doctor.js && node --check src/format.js && node --check src/mcp-client.js && node --check src/tool-router.js",
18
+ "smoke": "node bin/quill.js --help",
19
+ "prepublishOnly": "npm run check && npm test",
20
+ "test": "node --test test/*.test.js"
21
+ },
22
+ "engines": {
23
+ "node": ">=20"
24
+ },
25
+ "keywords": [
26
+ "quill",
27
+ "meetings",
28
+ "mcp",
29
+ "cli",
30
+ "axi"
31
+ ],
32
+ "license": "MIT",
33
+ "author": "Quill Meetings",
34
+ "repository": {
35
+ "type": "git",
36
+ "url": "git+https://github.com/quillmeetings/quill-cli.git"
37
+ },
38
+ "homepage": "https://github.com/quillmeetings/quill-cli#readme",
39
+ "bugs": {
40
+ "url": "https://github.com/quillmeetings/quill-cli/issues"
41
+ },
42
+ "dependencies": {
43
+ "ink": "^7.0.3",
44
+ "react": "^19.2.6"
45
+ }
46
+ }