@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 +21 -0
- package/README.md +367 -0
- package/bin/quill.js +20 -0
- package/package.json +46 -0
- package/src/browser.js +695 -0
- package/src/cli.js +841 -0
- package/src/config.js +132 -0
- package/src/doctor.js +190 -0
- package/src/format.js +275 -0
- package/src/mcp-client.js +326 -0
- package/src/tool-router.js +104 -0
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
|
+
}
|