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.
- package/dist/cjs/cli.js +1 -1
- package/dist/cjs/cli.js.map +1 -1
- package/dist/cjs/commands/find.js +2 -2
- package/dist/cjs/commands/find.js.map +1 -1
- package/dist/cjs/commands/map.js +3 -3
- package/dist/cjs/commands/map.js.map +1 -1
- package/dist/cjs/commands/named.js +2 -2
- package/dist/cjs/commands/named.js.map +1 -1
- package/dist/cjs/commands/peek.js +2 -2
- package/dist/cjs/commands/peek.js.map +1 -1
- package/dist/cjs/commands/query.js +2 -2
- package/dist/cjs/commands/query.js.map +1 -1
- package/dist/cjs/commands/rebuild.js +2 -2
- package/dist/cjs/commands/rebuild.js.map +1 -1
- package/dist/cjs/commands/{vault.d.cts → shared.d.cts} +1 -1
- package/dist/cjs/commands/{vault.d.ts → shared.d.ts} +1 -1
- package/dist/cjs/commands/{vault.js → shared.js} +3 -3
- package/dist/cjs/commands/shared.js.map +1 -0
- package/dist/cjs/commands/status.js +2 -2
- package/dist/cjs/commands/status.js.map +1 -1
- package/dist/cjs/commands/watch.js +2 -2
- package/dist/cjs/commands/watch.js.map +1 -1
- package/dist/cjs/features/links.js +1 -1
- package/dist/cjs/features/links.js.map +1 -1
- package/dist/cjs/index.d.cts +2 -2
- package/dist/cjs/index.d.ts +2 -2
- package/dist/cjs/index.js +3 -3
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/verbs.d.cts +2 -2
- package/dist/cjs/verbs.d.ts +2 -2
- package/dist/cjs/verbs.js +5 -5
- package/dist/cjs/verbs.js.map +1 -1
- package/dist/esm/cli.js +1 -1
- package/dist/esm/cli.js.map +1 -1
- package/dist/esm/commands/find.js +2 -2
- package/dist/esm/commands/find.js.map +1 -1
- package/dist/esm/commands/map.js +4 -4
- package/dist/esm/commands/map.js.map +1 -1
- package/dist/esm/commands/named.js +1 -1
- package/dist/esm/commands/named.js.map +1 -1
- package/dist/esm/commands/peek.js +2 -2
- package/dist/esm/commands/peek.js.map +1 -1
- package/dist/esm/commands/query.js +1 -1
- package/dist/esm/commands/query.js.map +1 -1
- package/dist/esm/commands/rebuild.js +1 -1
- package/dist/esm/commands/rebuild.js.map +1 -1
- package/dist/esm/commands/{vault.d.ts → shared.d.ts} +1 -1
- package/dist/esm/commands/{vault.js → shared.js} +2 -2
- package/dist/esm/commands/shared.js.map +1 -0
- package/dist/esm/commands/status.js +1 -1
- package/dist/esm/commands/status.js.map +1 -1
- package/dist/esm/commands/watch.js +1 -1
- package/dist/esm/commands/watch.js.map +1 -1
- package/dist/esm/features/links.js +1 -1
- package/dist/esm/features/links.js.map +1 -1
- package/dist/esm/features/types.js +1 -1
- package/dist/esm/features/types.js.map +1 -1
- package/dist/esm/index.d.ts +2 -2
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/verbs.d.ts +2 -2
- package/dist/esm/verbs.js +3 -3
- package/dist/esm/verbs.js.map +1 -1
- package/package.json +1 -1
- package/skills/sense/EXAMPLES.md +12 -13
- package/skills/sense/SKILL.md +24 -15
- package/dist/cjs/commands/vault.js.map +0 -1
- package/dist/esm/commands/vault.js.map +0 -1
package/skills/sense/SKILL.md
CHANGED
|
@@ -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
|
|
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.
|
|
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;
|
|
44
|
-
rewrite.
|
|
45
|
-
|
|
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
|
|
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(
|
|
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
|
-
-
|
|
77
|
-
|
|
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
|
-
-
|
|
87
|
-
weighted search field.
|
|
88
|
-
the only format
|
|
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"}
|