quilltap 4.8.0-dev.124 → 4.8.0-dev.136

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
@@ -187,6 +187,7 @@ quilltap docs status # Per-mount extraction + embeddi
187
187
  quilltap docs scan <mount> # Trigger a rescan
188
188
  quilltap docs reindex <mount> [path] [--force] # Re-extract + re-chunk
189
189
  quilltap docs embed <mount> [path] [--force] [--wait] # Enqueue embedding jobs
190
+ quilltap docs grep --semantic [--top N] [--threshold 0..1] <query> # Embedding search over indexed chunks
190
191
  quilltap docs write [--force] [--base64] <mount> <path> [file] # Stdin or file → mount
191
192
  quilltap docs read [--rendered] [--base64] <mount> <path> # File contents → stdout
192
193
  quilltap docs delete <mount> <path> # Idempotent delete
@@ -226,6 +227,7 @@ quilltap memories grep -i --max 3 --context 1 "concrete examples" # Pattern
226
227
  quilltap memories show <id|prefix> [--depth N] [--no-related] # Full record + related-memory neighbourhood
227
228
  quilltap memories tree <id|prefix> [--depth N] [--max-nodes N] # ASCII walk of the bidirectional related-memory graph
228
229
  quilltap memories status [--character <name|id>] # Per-holder rollup + dangling-edge check
230
+ quilltap memories grep --semantic --character Ariadne "the argument" # Embedding search (server required, one holder)
229
231
  ```
230
232
 
231
233
  Shared filter flags apply to `ls`, `find`, `grep`, and `status` where they make sense: `--character`, `--about` (with `self` / `none` shortcuts), `--source`, `--chat` (with `none` for manual entries), `--project`, `--since`, `--until`, `--min-importance`, `--min-reinforced`, `--has-embedding` / `--no-embedding`. Sort flags (`--sort reinforced|importance|created|accessed|reinforcement-count|links`, plus `-r` to reverse) apply to `ls`, `find`, and `grep`. Names accept fuzzy substrings; ambiguous names print candidates and exit 2. `--json` is supported by every verb. The legacy `quilltap db memories --character <name>` verb remains undisturbed.
@@ -59,3 +59,38 @@ describe('CLI subcommand surface stays documented', () => {
59
59
  expect(missing).toEqual([]);
60
60
  });
61
61
  });
62
+
63
+ /**
64
+ * A bare substring match is too weak: a subcommand named only in a shared
65
+ * `case` list still tab-completes its own flags as nothing. These check that
66
+ * each shell actually has a per-subcommand completion arm — the gap that let
67
+ * `file-verify` (all three shells) and `recall-replay` (fish) ship with the
68
+ * verb completing but none of its flags.
69
+ */
70
+ describe('every subcommand has its own completion arm', () => {
71
+ function template(shell) {
72
+ return fs.readFileSync(path.join(COMPLETION_DIR, `${shell}.template`), 'utf8');
73
+ }
74
+
75
+ it('bash has a case arm per subcommand', () => {
76
+ const tpl = template('bash');
77
+ const missing = SUBCOMMANDS.filter((sub) => !new RegExp(`^\\s*${sub}\\)\\s*$`, 'm').test(tpl));
78
+ expect(missing).toEqual([]);
79
+ });
80
+
81
+ it('zsh dispatches every subcommand from _quilltap_subcommand', () => {
82
+ const tpl = template('zsh');
83
+ const body = tpl.match(/_quilltap_subcommand\(\) \{([\s\S]*?)\n\}/);
84
+ expect(body).toBeTruthy();
85
+ const missing = SUBCOMMANDS.filter((sub) => !new RegExp(`^\\s*${sub}\\)\\s*$`, 'm').test(body[1]));
86
+ expect(missing).toEqual([]);
87
+ });
88
+
89
+ it('fish offers every subcommand at top level and completes inside it', () => {
90
+ const tpl = template('fish');
91
+ const notOffered = SUBCOMMANDS.filter((sub) => !tpl.includes(`-a '${sub}'`));
92
+ expect(notOffered).toEqual([]);
93
+ const noFlags = SUBCOMMANDS.filter((sub) => !tpl.includes(`__quilltap_using_subcommand ${sub}'`));
94
+ expect(noFlags).toEqual([]);
95
+ });
96
+ });
@@ -244,6 +244,10 @@ _quilltap_complete() {
244
244
  COMPREPLY=($(compgen -W "$maint_flags" -- "$cur"))
245
245
  fi
246
246
  ;;
247
+ file-verify)
248
+ local fv_flags="--all --stall-ms --json --instance --data-dir --help"
249
+ COMPREPLY=($(compgen -W "$fv_flags" -- "$cur"))
250
+ ;;
247
251
  completion)
248
252
  if [[ "$cur" == -* ]]; then
249
253
  COMPREPLY=($(compgen -W "--help" -- "$cur"))
@@ -55,6 +55,7 @@ complete -c quilltap -n '__quilltap_no_subcommand' -f -a 'themes' -d 'Manage the
55
55
  complete -c quilltap -n '__quilltap_no_subcommand' -f -a 'instances' -d 'Register or inspect instances'
56
56
  complete -c quilltap -n '__quilltap_no_subcommand' -f -a 'memories' -d 'Search and browse memories'
57
57
  complete -c quilltap -n '__quilltap_no_subcommand' -f -a 'memory-diff' -d 'Memory extraction dry-run'
58
+ complete -c quilltap -n '__quilltap_no_subcommand' -f -a 'recall-replay' -d 'Replay memory recall for a turn'
58
59
  complete -c quilltap -n '__quilltap_no_subcommand' -f -a 'logs' -d 'Tail or print log files'
59
60
  complete -c quilltap -n '__quilltap_no_subcommand' -f -a 'migrations' -d 'Inspect migration status'
60
61
  complete -c quilltap -n '__quilltap_no_subcommand' -f -a 'maintenance' -d 'Run retention/cleanup sweeps'
@@ -261,6 +262,16 @@ complete -c quilltap -n '__quilltap_using_subcommand memory-diff' -l 'port' -s '
261
262
  complete -c quilltap -n '__quilltap_using_subcommand memory-diff' -l 'concurrency' -d 'Concurrency limit' -x
262
263
  complete -c quilltap -n '__quilltap_using_subcommand memory-diff' -l 'out' -d 'Output file' -r -F
263
264
 
265
+ # ---------- recall-replay flags ----------
266
+ complete -c quilltap -n '__quilltap_using_subcommand recall-replay' -l 'turn' -d 'Interchange to replay (1-based)' -x
267
+ complete -c quilltap -n '__quilltap_using_subcommand recall-replay' -l 'char' -d 'Character whose memories are searched' -x
268
+ complete -c quilltap -n '__quilltap_using_subcommand recall-replay' -l 'limit' -d 'Candidate rows per path' -x
269
+ complete -c quilltap -n '__quilltap_using_subcommand recall-replay' -l 'port' -d 'Server port' -x
270
+
271
+ # ---------- file-verify flags ----------
272
+ complete -c quilltap -n '__quilltap_using_subcommand file-verify' -l 'all' -d 'Read every top-level file, not just dataless ones'
273
+ complete -c quilltap -n '__quilltap_using_subcommand file-verify' -l 'stall-ms' -d 'Per-chunk stall threshold (ms)' -x
274
+
264
275
  # ---------- logs flags ----------
265
276
  complete -c quilltap -n '__quilltap_using_subcommand logs' -l 'stream' -d 'Log stream' -x -a 'combined error stdout stderr startup'
266
277
  complete -c quilltap -n '__quilltap_using_subcommand logs' -l 'tail' -d 'Last N lines (0=full)' -x
@@ -85,6 +85,9 @@ _quilltap_subcommand() {
85
85
  maintenance)
86
86
  _quilltap_maintenance
87
87
  ;;
88
+ file-verify)
89
+ _arguments '--all[read every top-level file, not just dataless ones]' '--stall-ms[per-chunk stall threshold in ms]:ms:' '--json[machine-readable output]' '--help[show help]'
90
+ ;;
88
91
  completion)
89
92
  _quilltap_completion
90
93
  ;;
@@ -73,6 +73,9 @@ Read subcommands:
73
73
  status [--mount <name|id>] [--top N] Per-mount extraction + embedding rollup
74
74
 
75
75
  Server-required subcommands (background-job queue lives in the running server):
76
+ grep --semantic [--mount <name|id|all>] [--top N] [--threshold 0..1] <query>
77
+ Embedding search over indexed chunks
78
+ (default --top 20, --threshold 0.5)
76
79
  reindex <mount> [path] [--force] Re-extract text + re-chunk affected files
77
80
  embed <mount> [path] [--force] [--wait]
78
81
  Enqueue embedding jobs for un-embedded chunks
@@ -158,6 +161,7 @@ Examples:
158
161
  quilltap docs find --mount notes --ext md Knowledge
159
162
  quilltap docs grep --mount notes --ignore-case "five-point Calvinist"
160
163
  quilltap docs grep --mount notes -l "TODO"
164
+ quilltap docs grep --semantic --mount notes --top 10 "what did we decide about pricing"
161
165
  quilltap docs read qtap://notes/today.md
162
166
  quilltap docs find --uri Manifesto
163
167
  quilltap docs status
@@ -1276,6 +1276,11 @@ Subcommands:
1276
1276
  grep [filters] [-i] [-l] [--max N] [--context N] <pattern>
1277
1277
  Pattern search inside content
1278
1278
  with snippets.
1279
+ grep --semantic --character <name|id> [--top N] [--threshold 0..1] <query>
1280
+ Embedding search via the running
1281
+ server (default --top 20,
1282
+ --threshold 0.5). One holder at a
1283
+ time; --port sets the server port.
1279
1284
  show <id|prefix> [--depth N] [--no-related] [--json]
1280
1285
  Full record + related-memory
1281
1286
  neighbourhood.
@@ -1326,6 +1331,7 @@ Examples:
1326
1331
  quilltap memories ls --character Ariadne --sort created --limit 10
1327
1332
  quilltap memories find "concrete examples"
1328
1333
  quilltap memories grep -i --max 3 --context 1 "concrete examples"
1334
+ quilltap memories grep --semantic --character Ariadne --top 10 "the argument about Calvin"
1329
1335
  quilltap memories show abc12345 --depth 2
1330
1336
  quilltap memories tree abc12345 --depth 3
1331
1337
  quilltap memories status --character Ariadne
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "quilltap",
3
- "version": "4.8.0-dev.124",
3
+ "version": "4.8.0-dev.136",
4
4
  "description": "Self-hosted AI workspace for writers, worldbuilders, and roleplayers. Run with npx quilltap.",
5
5
  "author": {
6
6
  "name": "Charles Sebold",
@@ -39,8 +39,8 @@
39
39
  "@napi-rs/canvas": "^0.1.100",
40
40
  "better-sqlite3-multiple-ciphers": "^12.11.1",
41
41
  "node-pty": "^1.1.0",
42
- "sharp": "^0.34.5",
43
- "tar": "^7.5.20",
42
+ "sharp": "^0.35.3",
43
+ "tar": "^7.5.22",
44
44
  "yauzl": "^3.4.0"
45
45
  },
46
46
  "engines": {