sensemaking 0.3.2 → 0.4.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.
Files changed (68) hide show
  1. package/dist/cjs/cli.js +1 -1
  2. package/dist/cjs/cli.js.map +1 -1
  3. package/dist/cjs/commands/find.js +2 -2
  4. package/dist/cjs/commands/find.js.map +1 -1
  5. package/dist/cjs/commands/map.js +3 -3
  6. package/dist/cjs/commands/map.js.map +1 -1
  7. package/dist/cjs/commands/named.js +2 -2
  8. package/dist/cjs/commands/named.js.map +1 -1
  9. package/dist/cjs/commands/peek.js +2 -2
  10. package/dist/cjs/commands/peek.js.map +1 -1
  11. package/dist/cjs/commands/query.js +2 -2
  12. package/dist/cjs/commands/query.js.map +1 -1
  13. package/dist/cjs/commands/rebuild.js +2 -2
  14. package/dist/cjs/commands/rebuild.js.map +1 -1
  15. package/dist/cjs/commands/{vault.d.cts → shared.d.cts} +1 -1
  16. package/dist/cjs/commands/{vault.d.ts → shared.d.ts} +1 -1
  17. package/dist/cjs/commands/{vault.js → shared.js} +3 -3
  18. package/dist/cjs/commands/shared.js.map +1 -0
  19. package/dist/cjs/commands/status.js +2 -2
  20. package/dist/cjs/commands/status.js.map +1 -1
  21. package/dist/cjs/commands/watch.js +2 -2
  22. package/dist/cjs/commands/watch.js.map +1 -1
  23. package/dist/cjs/features/links.js +1 -1
  24. package/dist/cjs/features/links.js.map +1 -1
  25. package/dist/cjs/index.d.cts +2 -2
  26. package/dist/cjs/index.d.ts +2 -2
  27. package/dist/cjs/index.js +3 -3
  28. package/dist/cjs/index.js.map +1 -1
  29. package/dist/cjs/verbs.d.cts +2 -2
  30. package/dist/cjs/verbs.d.ts +2 -2
  31. package/dist/cjs/verbs.js +5 -5
  32. package/dist/cjs/verbs.js.map +1 -1
  33. package/dist/esm/cli.js +1 -1
  34. package/dist/esm/cli.js.map +1 -1
  35. package/dist/esm/commands/find.js +2 -2
  36. package/dist/esm/commands/find.js.map +1 -1
  37. package/dist/esm/commands/map.js +4 -4
  38. package/dist/esm/commands/map.js.map +1 -1
  39. package/dist/esm/commands/named.js +1 -1
  40. package/dist/esm/commands/named.js.map +1 -1
  41. package/dist/esm/commands/peek.js +2 -2
  42. package/dist/esm/commands/peek.js.map +1 -1
  43. package/dist/esm/commands/query.js +1 -1
  44. package/dist/esm/commands/query.js.map +1 -1
  45. package/dist/esm/commands/rebuild.js +1 -1
  46. package/dist/esm/commands/rebuild.js.map +1 -1
  47. package/dist/esm/commands/{vault.d.ts → shared.d.ts} +1 -1
  48. package/dist/esm/commands/{vault.js → shared.js} +2 -2
  49. package/dist/esm/commands/shared.js.map +1 -0
  50. package/dist/esm/commands/status.js +1 -1
  51. package/dist/esm/commands/status.js.map +1 -1
  52. package/dist/esm/commands/watch.js +1 -1
  53. package/dist/esm/commands/watch.js.map +1 -1
  54. package/dist/esm/features/links.js +1 -1
  55. package/dist/esm/features/links.js.map +1 -1
  56. package/dist/esm/features/types.js +1 -1
  57. package/dist/esm/features/types.js.map +1 -1
  58. package/dist/esm/index.d.ts +2 -2
  59. package/dist/esm/index.js +1 -1
  60. package/dist/esm/index.js.map +1 -1
  61. package/dist/esm/verbs.d.ts +2 -2
  62. package/dist/esm/verbs.js +3 -3
  63. package/dist/esm/verbs.js.map +1 -1
  64. package/package.json +1 -1
  65. package/skills/sense/EXAMPLES.md +12 -13
  66. package/skills/sense/SKILL.md +24 -15
  67. package/dist/cjs/commands/vault.js.map +0 -1
  68. package/dist/esm/commands/vault.js.map +0 -1
@@ -21,9 +21,11 @@ only as deep as the question needs.
21
21
  `a OR b OR c` for any-word matching.
22
22
  3. `sense peek <path>` — structure before reading: outline with `[L143-162, ~380t]` ranges,
23
23
  links both ways. ~17% the cost of reading the file.
24
- 4. `Read` the line range peek gave you not the whole file.
24
+ 4. `Read` the payload. On large files, peek's line ranges let you read just the section
25
+ you need; small files are often cheaper to read whole.
25
26
 
26
- Every result is a reference, never file contents. Prefer `--format json` when consuming output.
27
+ Every result is a reference, never file contents. Output defaults to a table, built for
28
+ humans; `--format json` returns the same rows machine-parseable.
27
29
 
28
30
  ## Verbs
29
31
 
@@ -36,13 +38,16 @@ sense <name> [params...] # named query from sense.config.
36
38
  sense --list | status | rebuild
37
39
  ```
38
40
 
39
- - **Expand terms before searching.** Write `pricing OR billing OR invoicing`, not one word — you
40
- know the synonyms; the index only knows the words in the files. Expand categories into their
41
- likely members too: a note about TypeScript never says "programming language".
42
41
  - Terms pass verbatim to FTS5 MATCH. Bare words AND-join — one absent word means zero rows —
43
- so write `OR` yourself when you want any-word matching; invalid syntax is an error, not a
44
- rewrite.
45
- - **Over-fetch, then choose.** `--k 20`, read the rows, open the 2–3 that matter.
42
+ so write `OR` yourself when you want any-word matching; double-quote punctuated terms
43
+ (`"customer-facing"`, `"founder's"`); invalid syntax is an error, not a rewrite. The same
44
+ rules apply to search commands you write into subagent briefs.
45
+ - When a search misses, the recall levers are: OR-in synonyms and concrete instances (the
46
+ index only knows the words in the files — a note about a specific tool rarely names its
47
+ category), and raise `--k` (a row costs ~30 tokens). Each widening adds candidates and
48
+ dilutes ranking, so the noise trade-off runs both ways.
49
+ - A frontmatter query enumerates its matches deterministically; search ranks by term overlap,
50
+ so results shift as phrasing shifts. Trade-off: a query needs a known field, search doesn't.
46
51
  - `find` fuses BM25 with link-graph expansion; the `via` column says what produced each row —
47
52
  `match` (terms hit), `link` (connected to notes that hit), `match+link` (both).
48
53
  - `--where` takes a frontmatter condition against alias `f`, e.g. `"f.status = 'active' AND has(f.tags, 'x')"`.
@@ -66,15 +71,18 @@ sense query "SELECT j.value, COUNT(*) n FROM frontmatter, json_each(frontmatter.
66
71
  - Rank with `ORDER BY bm25(content, 10.0, 5.0, 1.0)` (title > summary > body); excerpt with
67
72
  `snippet(content, -1, '«', '»', '…', 10)`.
68
73
  - Select `content.title`/`content.summary` (always exist, empty when absent) rather than
69
- `f.title`/`f.summary` (discovered columns — error on vaults that never declare them).
74
+ `f.title`/`f.summary` (discovered columns — error on trees that never declare them).
70
75
  - `has(field, value)`: array membership on JSON-array fields, substring on strings, false on NULL.
71
76
  To aggregate per member instead, use `json_each(frontmatter.<field>)` (above) -- GROUP BY on the
72
77
  raw column splits `["a","b"]` and `["b","a"]` into separate buckets.
73
78
  - Date fields are stored as written. Compare through `datetime()`, which normalizes ISO 8601
74
- timezone offsets to UTC: `WHERE datetime(dateCreated) >= datetime(?)`. Bare string comparison
79
+ timezone offsets to UTC: `WHERE datetime(created) >= datetime(?)`. Bare string comparison
75
80
  is only safe when every note uses the same offset.
76
- - Never `SELECT text FROM content` that is the whole vault into context. `SELECT * FROM
77
- frontmatter` is safe; prose is not a frontmatter column. Always `LIMIT`.
81
+ - To bound what a query puts into context: `snippet()` excerpts just the matching text,
82
+ `LIMIT` caps row counts, and selecting `path`/`title`/`summary` keeps rows small.
83
+ `SELECT text FROM content` returns the tree's entire prose (sense warns past 50 KB).
84
+ Aggregates (`COUNT`, `GROUP BY`) are already bounded. `SELECT * FROM frontmatter` is always
85
+ safe — prose is not a frontmatter column.
78
86
 
79
87
  Worked traces: [EXAMPLES.md](EXAMPLES.md).
80
88
 
@@ -83,9 +91,10 @@ Worked traces: [EXAMPLES.md](EXAMPLES.md).
83
91
  - Missing CLI: `npm install -g sensemaking`. Missing config: `sense init` at the tree root.
84
92
  Discovery walks up from cwd; `--config <path>` overrides.
85
93
  - Save a query into `sense.config.json` only when it will be reused; run ad-hoc otherwise.
86
- - When writing notes, give each a one-line `summary:` it appears in every result row and is a
87
- weighted search field. Write date fields as ISO 8601 (`2026-08-12`, or with time and offset) —
88
- the only format SQL date comparisons understand.
94
+ - A one-line `summary:` per note is optional and pays twice: it appears in result rows and is a
95
+ weighted search field. Date comparisons work for dates written as ISO 8601 (`2026-08-12`, or
96
+ with time and offset) — the only format `datetime()` parses. Field names in examples
97
+ (`status`, `tags`, `created`) are illustrative; your tree defines its own.
89
98
  - Reserved frontmatter keys (dropped with a warning): `path`, `_mtime`, `_size`, `_rank`,
90
99
  `content`, `links`, `sections`.
91
100
  - Exit codes: `0` ok, `1` error (SQLite message verbatim), `2` usage (unknown query, wrong
@@ -1 +0,0 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/commands/vault.ts"],"sourcesContent":["import type { ResolvedConfig } from '../config.ts';\nimport type { OpenResult } from '../db.ts';\nimport { open } from '../db.ts';\nimport type { Row } from '../output.ts';\nimport { printRows } from '../output.ts';\nimport type { Ctx } from './types.ts';\n\n// Shared open-query-close envelope for commands that touch the vault.\n\nexport function printWarnings(warnings: string[]): void {\n for (const w of warnings) console.warn(w);\n}\n\nexport function withVault(ctx: Ctx, fn: (db: OpenResult['db'], cfg: ResolvedConfig) => void): void {\n const cfg = ctx.resolveConfig();\n const { db, warnings } = open(cfg);\n printWarnings(warnings);\n try {\n fn(db, cfg);\n } finally {\n db.close();\n }\n}\n\n// An unbound `?` silently binds NULL, so mismatched param counts fail loudly instead.\nexport function runSql(cfg: ResolvedConfig, sql: string, params: string[], format: 'table' | 'json', label: string): void {\n const placeholderCount = (sql.match(/\\?/g) ?? []).length;\n if (params.length !== placeholderCount) {\n console.error(`${label} expects ${placeholderCount} parameter(s), got ${params.length}`);\n process.exit(2);\n }\n const { db, warnings } = open(cfg);\n printWarnings(warnings);\n printRows(db.prepare(sql).all(...params) as Row[], format);\n db.close();\n}\n"],"names":["printWarnings","runSql","withVault","warnings","w","console","warn","ctx","fn","cfg","resolveConfig","open","db","close","sql","params","format","label","placeholderCount","match","length","error","process","exit","printRows","prepare","all"],"mappings":";;;;;;;;;;;QASgBA;eAAAA;;QAgBAC;eAAAA;;QAZAC;eAAAA;;;oBAXK;wBAEK;;;;;;;;;;;;;;;;;;;;;;;;;;AAKnB,SAASF,cAAcG,QAAkB;QACzC,kCAAA,2BAAA;;QAAL,QAAK,YAAWA,6BAAX,SAAA,6BAAA,QAAA,yBAAA;YAAA,IAAMC,IAAN;YAAqBC,QAAQC,IAAI,CAACF;;;QAAlC;QAAA;;;iBAAA,6BAAA;gBAAA;;;gBAAA;sBAAA;;;;AACP;AAEO,SAASF,UAAUK,GAAQ,EAAEC,EAAuD;IACzF,IAAMC,MAAMF,IAAIG,aAAa;IAC7B,IAAyBC,QAAAA,IAAAA,UAAI,EAACF,MAAtBG,KAAiBD,MAAjBC,IAAIT,WAAaQ,MAAbR;IACZH,cAAcG;IACd,IAAI;QACFK,GAAGI,IAAIH;IACT,SAAU;QACRG,GAAGC,KAAK;IACV;AACF;AAGO,SAASZ,OAAOQ,GAAmB,EAAEK,GAAW,EAAEC,MAAgB,EAAEC,MAAwB,EAAEC,KAAa;QAQtGL;QAPgBE;IAA1B,IAAMI,mBAAmB,EAACJ,aAAAA,IAAIK,KAAK,CAAC,oBAAVL,wBAAAA,aAAoB,EAAE,EAAEM,MAAM;IACxD,IAAIL,OAAOK,MAAM,KAAKF,kBAAkB;QACtCb,QAAQgB,KAAK,CAAC,AAAC,GAAmBH,OAAjBD,OAAM,aAAiDF,OAAtCG,kBAAiB,uBAAmC,OAAdH,OAAOK,MAAM;QACrFE,QAAQC,IAAI,CAAC;IACf;IACA,IAAyBZ,QAAAA,IAAAA,UAAI,EAACF,MAAtBG,KAAiBD,MAAjBC,IAAIT,WAAaQ,MAAbR;IACZH,cAAcG;IACdqB,IAAAA,mBAAS,EAACZ,CAAAA,cAAAA,GAAGa,OAAO,CAACX,MAAKY,GAAG,OAAnBd,aAAoB,qBAAGG,UAAkBC;IACnDJ,GAAGC,KAAK;AACV"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/commands/vault.ts"],"sourcesContent":["import type { ResolvedConfig } from '../config.ts';\nimport type { OpenResult } from '../db.ts';\nimport { open } from '../db.ts';\nimport type { Row } from '../output.ts';\nimport { printRows } from '../output.ts';\nimport type { Ctx } from './types.ts';\n\n// Shared open-query-close envelope for commands that touch the vault.\n\nexport function printWarnings(warnings: string[]): void {\n for (const w of warnings) console.warn(w);\n}\n\nexport function withVault(ctx: Ctx, fn: (db: OpenResult['db'], cfg: ResolvedConfig) => void): void {\n const cfg = ctx.resolveConfig();\n const { db, warnings } = open(cfg);\n printWarnings(warnings);\n try {\n fn(db, cfg);\n } finally {\n db.close();\n }\n}\n\n// An unbound `?` silently binds NULL, so mismatched param counts fail loudly instead.\nexport function runSql(cfg: ResolvedConfig, sql: string, params: string[], format: 'table' | 'json', label: string): void {\n const placeholderCount = (sql.match(/\\?/g) ?? []).length;\n if (params.length !== placeholderCount) {\n console.error(`${label} expects ${placeholderCount} parameter(s), got ${params.length}`);\n process.exit(2);\n }\n const { db, warnings } = open(cfg);\n printWarnings(warnings);\n printRows(db.prepare(sql).all(...params) as Row[], format);\n db.close();\n}\n"],"names":["open","printRows","printWarnings","warnings","w","console","warn","withVault","ctx","fn","cfg","resolveConfig","db","close","runSql","sql","params","format","label","placeholderCount","match","length","error","process","exit","prepare","all"],"mappings":"AAEA,SAASA,IAAI,QAAQ,WAAW;AAEhC,SAASC,SAAS,QAAQ,eAAe;AAGzC,sEAAsE;AAEtE,OAAO,SAASC,cAAcC,QAAkB;IAC9C,KAAK,MAAMC,KAAKD,SAAUE,QAAQC,IAAI,CAACF;AACzC;AAEA,OAAO,SAASG,UAAUC,GAAQ,EAAEC,EAAuD;IACzF,MAAMC,MAAMF,IAAIG,aAAa;IAC7B,MAAM,EAAEC,EAAE,EAAET,QAAQ,EAAE,GAAGH,KAAKU;IAC9BR,cAAcC;IACd,IAAI;QACFM,GAAGG,IAAIF;IACT,SAAU;QACRE,GAAGC,KAAK;IACV;AACF;AAEA,sFAAsF;AACtF,OAAO,SAASC,OAAOJ,GAAmB,EAAEK,GAAW,EAAEC,MAAgB,EAAEC,MAAwB,EAAEC,KAAa;QACtFH;IAA1B,MAAMI,mBAAmB,EAACJ,aAAAA,IAAIK,KAAK,CAAC,oBAAVL,wBAAAA,aAAoB,EAAE,EAAEM,MAAM;IACxD,IAAIL,OAAOK,MAAM,KAAKF,kBAAkB;QACtCd,QAAQiB,KAAK,CAAC,GAAGJ,MAAM,SAAS,EAAEC,iBAAiB,mBAAmB,EAAEH,OAAOK,MAAM,EAAE;QACvFE,QAAQC,IAAI,CAAC;IACf;IACA,MAAM,EAAEZ,EAAE,EAAET,QAAQ,EAAE,GAAGH,KAAKU;IAC9BR,cAAcC;IACdF,UAAUW,GAAGa,OAAO,CAACV,KAAKW,GAAG,IAAIV,SAAkBC;IACnDL,GAAGC,KAAK;AACV"}