sensemaking 0.2.1 → 0.3.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 (182) hide show
  1. package/README.md +107 -132
  2. package/dist/cjs/cli.js +172 -182
  3. package/dist/cjs/cli.js.map +1 -1
  4. package/dist/cjs/commands/find.d.cts +3 -0
  5. package/dist/cjs/commands/find.d.ts +3 -0
  6. package/dist/cjs/commands/find.js +73 -0
  7. package/dist/cjs/commands/find.js.map +1 -0
  8. package/dist/cjs/commands/index.d.cts +5 -0
  9. package/dist/cjs/commands/index.d.ts +5 -0
  10. package/dist/cjs/commands/index.js +94 -0
  11. package/dist/cjs/commands/index.js.map +1 -0
  12. package/dist/cjs/commands/init.d.cts +3 -0
  13. package/dist/cjs/commands/init.d.ts +3 -0
  14. package/dist/cjs/commands/init.js +18 -0
  15. package/dist/cjs/commands/init.js.map +1 -0
  16. package/dist/cjs/commands/map.d.cts +3 -0
  17. package/dist/cjs/commands/map.d.ts +3 -0
  18. package/dist/cjs/commands/map.js +21 -0
  19. package/dist/cjs/commands/map.js.map +1 -0
  20. package/dist/cjs/commands/named.d.cts +2 -0
  21. package/dist/cjs/commands/named.d.ts +2 -0
  22. package/dist/cjs/commands/named.js +23 -0
  23. package/dist/cjs/commands/named.js.map +1 -0
  24. package/dist/cjs/commands/peek.d.cts +3 -0
  25. package/dist/cjs/commands/peek.d.ts +3 -0
  26. package/dist/cjs/commands/peek.js +69 -0
  27. package/dist/cjs/commands/peek.js.map +1 -0
  28. package/dist/cjs/commands/query.d.cts +3 -0
  29. package/dist/cjs/commands/query.d.ts +3 -0
  30. package/dist/cjs/commands/query.js +43 -0
  31. package/dist/cjs/commands/query.js.map +1 -0
  32. package/dist/cjs/commands/rebuild.d.cts +3 -0
  33. package/dist/cjs/commands/rebuild.d.ts +3 -0
  34. package/dist/cjs/commands/rebuild.js +20 -0
  35. package/dist/cjs/commands/rebuild.js.map +1 -0
  36. package/dist/cjs/commands/status.d.cts +3 -0
  37. package/dist/cjs/commands/status.d.ts +3 -0
  38. package/dist/cjs/commands/status.js +24 -0
  39. package/dist/cjs/commands/status.js.map +1 -0
  40. package/dist/cjs/commands/types.d.cts +15 -0
  41. package/dist/cjs/commands/types.d.ts +15 -0
  42. package/dist/cjs/commands/types.js +5 -0
  43. package/dist/cjs/commands/types.js.map +1 -0
  44. package/dist/cjs/commands/vault.d.cts +6 -0
  45. package/dist/cjs/commands/vault.d.ts +6 -0
  46. package/dist/cjs/commands/vault.js +94 -0
  47. package/dist/cjs/commands/vault.js.map +1 -0
  48. package/dist/cjs/commands/watch.d.cts +3 -0
  49. package/dist/cjs/commands/watch.d.ts +3 -0
  50. package/dist/cjs/commands/watch.js +173 -0
  51. package/dist/cjs/commands/watch.js.map +1 -0
  52. package/dist/cjs/config.d.cts +11 -1
  53. package/dist/cjs/config.d.ts +11 -1
  54. package/dist/cjs/config.js +82 -9
  55. package/dist/cjs/config.js.map +1 -1
  56. package/dist/cjs/db.d.cts +1 -1
  57. package/dist/cjs/db.d.ts +1 -1
  58. package/dist/cjs/db.js +107 -16
  59. package/dist/cjs/db.js.map +1 -1
  60. package/dist/cjs/errors.d.cts +1 -1
  61. package/dist/cjs/errors.d.ts +1 -1
  62. package/dist/cjs/errors.js.map +1 -1
  63. package/dist/cjs/features/index.d.cts +7 -0
  64. package/dist/cjs/features/index.d.ts +7 -0
  65. package/dist/cjs/features/index.js +36 -0
  66. package/dist/cjs/features/index.js.map +1 -0
  67. package/dist/cjs/features/links.d.cts +4 -0
  68. package/dist/cjs/features/links.d.ts +4 -0
  69. package/dist/cjs/features/links.js +217 -0
  70. package/dist/cjs/features/links.js.map +1 -0
  71. package/dist/cjs/features/rank.d.cts +2 -0
  72. package/dist/cjs/features/rank.d.ts +2 -0
  73. package/dist/cjs/features/rank.js +95 -0
  74. package/dist/cjs/features/rank.js.map +1 -0
  75. package/dist/cjs/features/sections.d.cts +9 -0
  76. package/dist/cjs/features/sections.d.ts +9 -0
  77. package/dist/cjs/features/sections.js +54 -0
  78. package/dist/cjs/features/sections.js.map +1 -0
  79. package/dist/cjs/features/types.d.cts +11 -0
  80. package/dist/cjs/features/types.d.ts +11 -0
  81. package/dist/cjs/features/types.js +5 -0
  82. package/dist/cjs/features/types.js.map +1 -0
  83. package/dist/cjs/graph.d.cts +7 -0
  84. package/dist/cjs/graph.d.ts +7 -0
  85. package/dist/cjs/graph.js +237 -0
  86. package/dist/cjs/graph.js.map +1 -0
  87. package/dist/cjs/index.d.cts +9 -2
  88. package/dist/cjs/index.d.ts +9 -2
  89. package/dist/cjs/index.js +39 -0
  90. package/dist/cjs/index.js.map +1 -1
  91. package/dist/cjs/output.d.cts +21 -0
  92. package/dist/cjs/output.d.ts +21 -0
  93. package/dist/cjs/output.js +112 -3
  94. package/dist/cjs/output.js.map +1 -1
  95. package/dist/cjs/scan.d.cts +3 -1
  96. package/dist/cjs/scan.d.ts +3 -1
  97. package/dist/cjs/scan.js +62 -14
  98. package/dist/cjs/scan.js.map +1 -1
  99. package/dist/cjs/verbs.d.cts +31 -0
  100. package/dist/cjs/verbs.d.ts +31 -0
  101. package/dist/cjs/verbs.js +284 -0
  102. package/dist/cjs/verbs.js.map +1 -0
  103. package/dist/esm/cli.js +63 -107
  104. package/dist/esm/cli.js.map +1 -1
  105. package/dist/esm/commands/find.d.ts +3 -0
  106. package/dist/esm/commands/find.js +14 -0
  107. package/dist/esm/commands/find.js.map +1 -0
  108. package/dist/esm/commands/index.d.ts +5 -0
  109. package/dist/esm/commands/index.js +13 -0
  110. package/dist/esm/commands/index.js.map +1 -0
  111. package/dist/esm/commands/init.d.ts +3 -0
  112. package/dist/esm/commands/init.js +7 -0
  113. package/dist/esm/commands/init.js.map +1 -0
  114. package/dist/esm/commands/map.d.ts +3 -0
  115. package/dist/esm/commands/map.js +10 -0
  116. package/dist/esm/commands/map.js.map +1 -0
  117. package/dist/esm/commands/named.d.ts +2 -0
  118. package/dist/esm/commands/named.js +12 -0
  119. package/dist/esm/commands/named.js.map +1 -0
  120. package/dist/esm/commands/peek.d.ts +3 -0
  121. package/dist/esm/commands/peek.js +12 -0
  122. package/dist/esm/commands/peek.js.map +1 -0
  123. package/dist/esm/commands/query.d.ts +3 -0
  124. package/dist/esm/commands/query.js +7 -0
  125. package/dist/esm/commands/query.js.map +1 -0
  126. package/dist/esm/commands/rebuild.d.ts +3 -0
  127. package/dist/esm/commands/rebuild.js +9 -0
  128. package/dist/esm/commands/rebuild.js.map +1 -0
  129. package/dist/esm/commands/status.d.ts +3 -0
  130. package/dist/esm/commands/status.js +13 -0
  131. package/dist/esm/commands/status.js.map +1 -0
  132. package/dist/esm/commands/types.d.ts +15 -0
  133. package/dist/esm/commands/types.js +1 -0
  134. package/dist/esm/commands/types.js.map +1 -0
  135. package/dist/esm/commands/vault.d.ts +6 -0
  136. package/dist/esm/commands/vault.js +29 -0
  137. package/dist/esm/commands/vault.js.map +1 -0
  138. package/dist/esm/commands/watch.d.ts +3 -0
  139. package/dist/esm/commands/watch.js +19 -0
  140. package/dist/esm/commands/watch.js.map +1 -0
  141. package/dist/esm/config.d.ts +11 -1
  142. package/dist/esm/config.js +68 -12
  143. package/dist/esm/config.js.map +1 -1
  144. package/dist/esm/db.d.ts +1 -1
  145. package/dist/esm/db.js +27 -9
  146. package/dist/esm/db.js.map +1 -1
  147. package/dist/esm/errors.d.ts +1 -1
  148. package/dist/esm/errors.js.map +1 -1
  149. package/dist/esm/features/index.d.ts +7 -0
  150. package/dist/esm/features/index.js +14 -0
  151. package/dist/esm/features/index.js.map +1 -0
  152. package/dist/esm/features/links.d.ts +4 -0
  153. package/dist/esm/features/links.js +81 -0
  154. package/dist/esm/features/links.js.map +1 -0
  155. package/dist/esm/features/rank.d.ts +2 -0
  156. package/dist/esm/features/rank.js +17 -0
  157. package/dist/esm/features/rank.js.map +1 -0
  158. package/dist/esm/features/sections.d.ts +9 -0
  159. package/dist/esm/features/sections.js +41 -0
  160. package/dist/esm/features/sections.js.map +1 -0
  161. package/dist/esm/features/types.d.ts +11 -0
  162. package/dist/esm/features/types.js +3 -0
  163. package/dist/esm/features/types.js.map +1 -0
  164. package/dist/esm/graph.d.ts +7 -0
  165. package/dist/esm/graph.js +79 -0
  166. package/dist/esm/graph.js.map +1 -0
  167. package/dist/esm/index.d.ts +9 -2
  168. package/dist/esm/index.js +4 -1
  169. package/dist/esm/index.js.map +1 -1
  170. package/dist/esm/output.d.ts +21 -0
  171. package/dist/esm/output.js +28 -0
  172. package/dist/esm/output.js.map +1 -1
  173. package/dist/esm/scan.d.ts +3 -1
  174. package/dist/esm/scan.js +56 -7
  175. package/dist/esm/scan.js.map +1 -1
  176. package/dist/esm/verbs.d.ts +31 -0
  177. package/dist/esm/verbs.js +139 -0
  178. package/dist/esm/verbs.js.map +1 -0
  179. package/package.json +4 -4
  180. package/schema.json +23 -4
  181. package/skills/sense/EXAMPLES.md +46 -81
  182. package/skills/sense/SKILL.md +58 -92
package/dist/esm/cli.js CHANGED
@@ -1,14 +1,33 @@
1
+ import { createRequire } from 'node:module';
1
2
  import { parseArgs } from 'node:util';
2
- import { initConfig, loadConfig } from './config.js';
3
- import { docCount, getMeta, open, rebuild } from './db.js';
4
- import { printRows } from './output.js';
5
- import { runWatch } from './watch.js';
3
+ import { COMMANDS } from './commands/index.js';
4
+ import { loadConfig, SUPPORTED_CONFIG_VERSION } from './config.js';
5
+ // Parsing and dispatch only. Commands live in src/commands/, one file each, lazy-loaded --
6
+ // nothing vault- or dependency-heavy may be imported at the top of this file.
7
+ // Works from dist/cjs and dist/esm alike: walk up past the dist type-marker package.json.
8
+ function packageVersion() {
9
+ const load = createRequire(import.meta.url);
10
+ for (const rel of [
11
+ '../package.json',
12
+ '../../package.json',
13
+ '../../../package.json'
14
+ ]){
15
+ try {
16
+ const pkg = load(rel);
17
+ if (pkg.name === 'sensemaking' && pkg.version) return pkg.version;
18
+ } catch {}
19
+ }
20
+ return 'unknown';
21
+ }
6
22
  function usage(name) {
7
- return `usage: ${name} <name> [params...] [--format table|json] [--config path]\n` + ` ${name} query "<sql>" [params...]\n` + ` ${name} --list\n` + ` ${name} init\n` + ` ${name} watch [--force]\n` + ` ${name} status\n` + ` ${name} rebuild`;
23
+ return `usage: ${name} <name> [params...] [--format table|json] [--config path]\n` + ` ${name} query "<sql>" [params...]\n` + ` ${name} find "<terms>" [--where "<sql>"] [--k n]\n` + ` ${name} map\n` + ` ${name} peek <path>\n` + ` ${name} --list\n` + ` ${name} init\n` + ` ${name} watch [--force]\n` + ` ${name} status\n` + ` ${name} rebuild\n` + ` ${name} --version`;
8
24
  }
9
- function parseCliArgs(argv, name) {
25
+ // Thrown errors -> exit 1 with the message verbatim; usage errors exit 2 directly.
26
+ export default async function cli(argv, name) {
27
+ let values;
28
+ let positionals;
10
29
  try {
11
- return parseArgs({
30
+ ({ values, positionals } = parseArgs({
12
31
  args: argv,
13
32
  options: {
14
33
  format: {
@@ -18,6 +37,12 @@ function parseCliArgs(argv, name) {
18
37
  config: {
19
38
  type: 'string'
20
39
  },
40
+ where: {
41
+ type: 'string'
42
+ },
43
+ k: {
44
+ type: 'string'
45
+ },
21
46
  list: {
22
47
  type: 'boolean',
23
48
  default: false
@@ -26,6 +51,11 @@ function parseCliArgs(argv, name) {
26
51
  type: 'boolean',
27
52
  default: false
28
53
  },
54
+ version: {
55
+ type: 'boolean',
56
+ default: false,
57
+ short: 'v'
58
+ },
29
59
  help: {
30
60
  type: 'boolean',
31
61
  default: false,
@@ -33,124 +63,50 @@ function parseCliArgs(argv, name) {
33
63
  }
34
64
  },
35
65
  allowPositionals: true
36
- });
66
+ }));
37
67
  } catch (err) {
38
68
  console.error(err.message);
39
69
  console.error(usage(name));
40
70
  process.exit(2);
41
71
  }
42
- }
43
- function printWarnings(warnings) {
44
- for (const w of warnings)console.warn(w);
45
- }
46
- // An unbound `?` silently binds NULL, so mismatched param counts fail loudly instead.
47
- function runSql(cfg, sql, params, format, label) {
48
- var _sql_match;
49
- const placeholderCount = ((_sql_match = sql.match(/\?/g)) !== null && _sql_match !== void 0 ? _sql_match : []).length;
50
- if (params.length !== placeholderCount) {
51
- console.error(`${label} expects ${placeholderCount} parameter(s), got ${params.length}`);
52
- process.exit(2);
53
- }
54
- const { db, warnings } = open(cfg);
55
- printWarnings(warnings);
56
- const rows = db.prepare(sql).all(...params);
57
- printRows(rows, format);
58
- db.close();
59
- }
60
- function logWatchEvent(event) {
61
- if (event.type === 'started') {
62
- console.log(`sense watch: watching ${event.baseDir}`);
63
- console.log(`sense watch: db ${event.dbPath}`);
72
+ if (values.version) {
73
+ console.log(`v${packageVersion()}`);
64
74
  return;
65
75
  }
66
- if (event.type === 'reconciled') {
67
- printWarnings(event.warnings);
68
- if (event.parsed > 0) {
69
- console.log(`sense watch: reconciled, ${event.parsed} file(s) reparsed (${event.total} total)`);
70
- }
71
- return;
72
- }
73
- console.error(`sense watch: reconcile error: ${event.message}`);
74
- }
75
- // Thrown errors -> exit 1 with the message verbatim; usage errors exit(2) directly.
76
- export default async function cli(argv, name) {
77
- const { values, positionals } = parseCliArgs(argv, name);
78
76
  if (values.help) {
79
77
  console.log(usage(name));
80
- process.exit(0);
78
+ return;
81
79
  }
82
- const resolveConfig = ()=>loadConfig(values.config);
83
- try {
84
- const [first, ...rest] = positionals;
85
- if (first === 'init') {
86
- const configPath = initConfig(process.cwd());
87
- console.log(`created ${configPath}`);
88
- console.log('query away: sense query "SELECT path FROM frontmatter LIMIT 10"');
89
- process.exit(0);
90
- }
91
- if (first === 'watch') {
92
- const cfg = resolveConfig();
93
- await runWatch(cfg, {
94
- force: values.force,
95
- onEvent: logWatchEvent
96
- });
97
- process.exit(0);
98
- }
99
- if (first === 'status') {
100
- const cfg = resolveConfig();
101
- const { db, dbPath, warnings } = open(cfg);
102
- printWarnings(warnings);
103
- console.log(`db: ${dbPath}`);
104
- console.log(`docs: ${docCount(db)}`);
105
- const heartbeat = getMeta(db, 'watch_heartbeat');
106
- if (heartbeat) {
107
- const ageSec = Math.round((Date.now() - Date.parse(heartbeat)) / 1000);
108
- console.log(`watcher: last heartbeat ${ageSec}s ago`);
109
- } else {
110
- console.log('watcher: no watcher');
80
+ const ctx = {
81
+ name,
82
+ rest: positionals.slice(1),
83
+ format: values.format === 'json' ? 'json' : 'table',
84
+ values: values,
85
+ resolveConfig () {
86
+ const cfg = loadConfig(values.config);
87
+ if (cfg.migratedFrom !== undefined) {
88
+ console.warn(`${name}: migrated ${cfg.configPath} from config version ${cfg.migratedFrom} to ${SUPPORTED_CONFIG_VERSION}`);
111
89
  }
112
- db.close();
113
- process.exit(0);
114
- }
115
- if (first === 'rebuild') {
116
- const cfg = resolveConfig();
117
- const result = rebuild(cfg);
118
- printWarnings(result.warnings);
119
- console.log(`rebuilt: ${docCount(result.db)} docs`);
120
- result.db.close();
121
- process.exit(0);
90
+ return cfg;
91
+ },
92
+ usageError (message) {
93
+ console.error(message);
94
+ process.exit(2);
122
95
  }
96
+ };
97
+ try {
123
98
  if (values.list) {
124
- const cfg = resolveConfig();
125
- for (const queryName of Object.keys(cfg.queries).sort())console.log(queryName);
126
- process.exit(0);
127
- }
128
- const format = values.format === 'json' ? 'json' : 'table';
129
- if (first === 'query') {
130
- const [sql, ...params] = rest;
131
- if (!sql) {
132
- console.error(`usage: ${name} query "<sql>" [params...]`);
133
- process.exit(2);
134
- }
135
- runSql(resolveConfig(), sql, params, format, 'ad-hoc query');
99
+ for (const queryName of Object.keys(ctx.resolveConfig().queries).sort())console.log(queryName);
136
100
  return;
137
101
  }
138
- const [name_, ...params] = [
139
- first,
140
- ...rest
141
- ];
142
- if (!name_) {
102
+ const [first, ...params] = positionals;
103
+ if (!first) {
143
104
  console.error(usage(name));
144
105
  process.exit(2);
145
106
  }
146
- const cfg = resolveConfig();
147
- const sql = cfg.queries[name_];
148
- if (!sql) {
149
- console.error(`unknown query: "${name_}"`);
150
- console.error(`valid queries: ${Object.keys(cfg.queries).sort().join(', ')}`);
151
- process.exit(2);
152
- }
153
- runSql(cfg, sql, params, format, `query "${name_}"`);
107
+ const load = COMMANDS[first];
108
+ if (load) await (await load()).default(ctx);
109
+ else (await import('./commands/named.js')).default(ctx, first, params);
154
110
  } catch (err) {
155
111
  console.error(err.message);
156
112
  process.exit(1);
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/cli.ts"],"sourcesContent":["import { parseArgs } from 'node:util';\nimport type { ResolvedConfig } from './config.ts';\nimport { initConfig, loadConfig } from './config.ts';\nimport { docCount, getMeta, open, rebuild } from './db.ts';\nimport type { Row } from './output.ts';\nimport { printRows } from './output.ts';\nimport type { WatchEvent } from './watch.ts';\nimport { runWatch } from './watch.ts';\n\nfunction usage(name: string): string {\n return `usage: ${name} <name> [params...] [--format table|json] [--config path]\\n` + ` ${name} query \"<sql>\" [params...]\\n` + ` ${name} --list\\n` + ` ${name} init\\n` + ` ${name} watch [--force]\\n` + ` ${name} status\\n` + ` ${name} rebuild`;\n}\n\nfunction parseCliArgs(argv: string[], name: string) {\n try {\n return parseArgs({\n args: argv,\n options: {\n format: { type: 'string', default: 'table' },\n config: { type: 'string' },\n list: { type: 'boolean', default: false },\n force: { type: 'boolean', default: false },\n help: { type: 'boolean', default: false, short: 'h' },\n },\n allowPositionals: true,\n });\n } catch (err) {\n console.error((err as Error).message);\n console.error(usage(name));\n process.exit(2);\n }\n}\n\nfunction printWarnings(warnings: string[]): void {\n for (const w of warnings) console.warn(w);\n}\n\n// An unbound `?` silently binds NULL, so mismatched param counts fail loudly instead.\nfunction 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 const rows = db.prepare(sql).all(...params) as Row[];\n printRows(rows, format);\n db.close();\n}\n\nfunction logWatchEvent(event: WatchEvent): void {\n if (event.type === 'started') {\n console.log(`sense watch: watching ${event.baseDir}`);\n console.log(`sense watch: db ${event.dbPath}`);\n return;\n }\n if (event.type === 'reconciled') {\n printWarnings(event.warnings);\n if (event.parsed > 0) {\n console.log(`sense watch: reconciled, ${event.parsed} file(s) reparsed (${event.total} total)`);\n }\n return;\n }\n console.error(`sense watch: reconcile error: ${event.message}`);\n}\n\n// Thrown errors -> exit 1 with the message verbatim; usage errors exit(2) directly.\nexport default async function cli(argv: string[], name: string): Promise<void> {\n const { values, positionals } = parseCliArgs(argv, name);\n\n if (values.help) {\n console.log(usage(name));\n process.exit(0);\n }\n\n const resolveConfig = () => loadConfig(values.config);\n\n try {\n const [first, ...rest] = positionals;\n\n if (first === 'init') {\n const configPath = initConfig(process.cwd());\n console.log(`created ${configPath}`);\n console.log('query away: sense query \"SELECT path FROM frontmatter LIMIT 10\"');\n process.exit(0);\n }\n\n if (first === 'watch') {\n const cfg = resolveConfig();\n await runWatch(cfg, { force: values.force, onEvent: logWatchEvent });\n process.exit(0);\n }\n\n if (first === 'status') {\n const cfg = resolveConfig();\n const { db, dbPath, warnings } = open(cfg);\n printWarnings(warnings);\n console.log(`db: ${dbPath}`);\n console.log(`docs: ${docCount(db)}`);\n const heartbeat = getMeta(db, 'watch_heartbeat');\n if (heartbeat) {\n const ageSec = Math.round((Date.now() - Date.parse(heartbeat)) / 1000);\n console.log(`watcher: last heartbeat ${ageSec}s ago`);\n } else {\n console.log('watcher: no watcher');\n }\n db.close();\n process.exit(0);\n }\n\n if (first === 'rebuild') {\n const cfg = resolveConfig();\n const result = rebuild(cfg);\n printWarnings(result.warnings);\n console.log(`rebuilt: ${docCount(result.db)} docs`);\n result.db.close();\n process.exit(0);\n }\n\n if (values.list) {\n const cfg = resolveConfig();\n for (const queryName of Object.keys(cfg.queries).sort()) console.log(queryName);\n process.exit(0);\n }\n\n const format = values.format === 'json' ? 'json' : 'table';\n\n if (first === 'query') {\n const [sql, ...params] = rest;\n if (!sql) {\n console.error(`usage: ${name} query \"<sql>\" [params...]`);\n process.exit(2);\n }\n runSql(resolveConfig(), sql, params, format, 'ad-hoc query');\n return;\n }\n\n const [name_, ...params] = [first, ...rest];\n\n if (!name_) {\n console.error(usage(name));\n process.exit(2);\n }\n\n const cfg = resolveConfig();\n\n const sql = cfg.queries[name_];\n if (!sql) {\n console.error(`unknown query: \"${name_}\"`);\n console.error(`valid queries: ${Object.keys(cfg.queries).sort().join(', ')}`);\n process.exit(2);\n }\n\n runSql(cfg, sql, params, format, `query \"${name_}\"`);\n } catch (err) {\n console.error((err as Error).message);\n process.exit(1);\n }\n}\n"],"names":["parseArgs","initConfig","loadConfig","docCount","getMeta","open","rebuild","printRows","runWatch","usage","name","parseCliArgs","argv","args","options","format","type","default","config","list","force","help","short","allowPositionals","err","console","error","message","process","exit","printWarnings","warnings","w","warn","runSql","cfg","sql","params","label","placeholderCount","match","length","db","rows","prepare","all","close","logWatchEvent","event","log","baseDir","dbPath","parsed","total","cli","values","positionals","resolveConfig","first","rest","configPath","cwd","onEvent","heartbeat","ageSec","Math","round","Date","now","parse","result","queryName","Object","keys","queries","sort","name_","join"],"mappings":"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"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/cli.ts"],"sourcesContent":["import { createRequire } from 'node:module';\nimport { parseArgs } from 'node:util';\nimport { COMMANDS } from './commands/index.ts';\nimport type { Ctx } from './commands/types.ts';\nimport { loadConfig, SUPPORTED_CONFIG_VERSION } from './config.ts';\n\n// Parsing and dispatch only. Commands live in src/commands/, one file each, lazy-loaded --\n// nothing vault- or dependency-heavy may be imported at the top of this file.\n\n// Works from dist/cjs and dist/esm alike: walk up past the dist type-marker package.json.\nfunction packageVersion(): string {\n const load = createRequire(import.meta.url);\n for (const rel of ['../package.json', '../../package.json', '../../../package.json']) {\n try {\n const pkg = load(rel) as { name?: string; version?: string };\n if (pkg.name === 'sensemaking' && pkg.version) return pkg.version;\n } catch {}\n }\n return 'unknown';\n}\n\nfunction usage(name: string): string {\n return (\n `usage: ${name} <name> [params...] [--format table|json] [--config path]\\n` +\n ` ${name} query \"<sql>\" [params...]\\n` +\n ` ${name} find \"<terms>\" [--where \"<sql>\"] [--k n]\\n` +\n ` ${name} map\\n` +\n ` ${name} peek <path>\\n` +\n ` ${name} --list\\n` +\n ` ${name} init\\n` +\n ` ${name} watch [--force]\\n` +\n ` ${name} status\\n` +\n ` ${name} rebuild\\n` +\n ` ${name} --version`\n );\n}\n\n// Thrown errors -> exit 1 with the message verbatim; usage errors exit 2 directly.\nexport default async function cli(argv: string[], name: string): Promise<void> {\n let values: Record<string, string | boolean | undefined>;\n let positionals: string[];\n try {\n ({ values, positionals } = parseArgs({\n args: argv,\n options: {\n format: { type: 'string', default: 'table' },\n config: { type: 'string' },\n where: { type: 'string' },\n k: { type: 'string' },\n list: { type: 'boolean', default: false },\n force: { type: 'boolean', default: false },\n version: { type: 'boolean', default: false, short: 'v' },\n help: { type: 'boolean', default: false, short: 'h' },\n },\n allowPositionals: true,\n }));\n } catch (err) {\n console.error((err as Error).message);\n console.error(usage(name));\n process.exit(2);\n }\n\n if (values.version) {\n console.log(`v${packageVersion()}`);\n return;\n }\n if (values.help) {\n console.log(usage(name));\n return;\n }\n\n const ctx: Ctx = {\n name,\n rest: positionals.slice(1),\n format: values.format === 'json' ? 'json' : 'table',\n values: values as Ctx['values'],\n resolveConfig() {\n const cfg = loadConfig(values.config as string | undefined);\n if (cfg.migratedFrom !== undefined) {\n console.warn(`${name}: migrated ${cfg.configPath} from config version ${cfg.migratedFrom} to ${SUPPORTED_CONFIG_VERSION}`);\n }\n return cfg;\n },\n usageError(message) {\n console.error(message);\n process.exit(2);\n },\n };\n\n try {\n if (values.list) {\n for (const queryName of Object.keys(ctx.resolveConfig().queries).sort()) console.log(queryName);\n return;\n }\n\n const [first, ...params] = positionals;\n if (!first) {\n console.error(usage(name));\n process.exit(2);\n }\n\n const load = COMMANDS[first];\n if (load) await (await load()).default(ctx);\n else (await import('./commands/named.ts')).default(ctx, first, params);\n } catch (err) {\n console.error((err as Error).message);\n process.exit(1);\n }\n}\n"],"names":["createRequire","parseArgs","COMMANDS","loadConfig","SUPPORTED_CONFIG_VERSION","packageVersion","load","url","rel","pkg","name","version","usage","cli","argv","values","positionals","args","options","format","type","default","config","where","k","list","force","short","help","allowPositionals","err","console","error","message","process","exit","log","ctx","rest","slice","resolveConfig","cfg","migratedFrom","undefined","warn","configPath","usageError","queryName","Object","keys","queries","sort","first","params"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from './types.js';
2
+ declare const findCmd: Command;
3
+ export default findCmd;
@@ -0,0 +1,14 @@
1
+ import { printRows } from '../output.js';
2
+ import { find } from '../verbs.js';
3
+ import { withVault } from './vault.js';
4
+ const findCmd = (ctx)=>{
5
+ const [terms] = ctx.rest;
6
+ if (!terms) ctx.usageError(`usage: ${ctx.name} find "<terms>" [--where "<sql>"] [--k n]`);
7
+ const k = ctx.values.k === undefined ? undefined : Number.parseInt(ctx.values.k, 10);
8
+ if (ctx.values.k !== undefined && !Number.isInteger(k)) ctx.usageError(`--k expects an integer, got "${ctx.values.k}"`);
9
+ withVault(ctx, (db, cfg)=>printRows(find(db, cfg, terms, {
10
+ k,
11
+ where: ctx.values.where
12
+ }), ctx.format));
13
+ };
14
+ export default findCmd;
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/commands/find.ts"],"sourcesContent":["import { printRows } from '../output.ts';\nimport { find } from '../verbs.ts';\nimport type { Command } from './types.ts';\nimport { withVault } from './vault.ts';\n\nconst findCmd: Command = (ctx) => {\n const [terms] = ctx.rest;\n if (!terms) ctx.usageError(`usage: ${ctx.name} find \"<terms>\" [--where \"<sql>\"] [--k n]`);\n const k = ctx.values.k === undefined ? undefined : Number.parseInt(ctx.values.k, 10);\n if (ctx.values.k !== undefined && !Number.isInteger(k)) ctx.usageError(`--k expects an integer, got \"${ctx.values.k}\"`);\n withVault(ctx, (db, cfg) => printRows(find(db, cfg, terms, { k, where: ctx.values.where }), ctx.format));\n};\nexport default findCmd;\n"],"names":["printRows","find","withVault","findCmd","ctx","terms","rest","usageError","name","k","values","undefined","Number","parseInt","isInteger","db","cfg","where","format"],"mappings":"AAAA,SAASA,SAAS,QAAQ,eAAe;AACzC,SAASC,IAAI,QAAQ,cAAc;AAEnC,SAASC,SAAS,QAAQ,aAAa;AAEvC,MAAMC,UAAmB,CAACC;IACxB,MAAM,CAACC,MAAM,GAAGD,IAAIE,IAAI;IACxB,IAAI,CAACD,OAAOD,IAAIG,UAAU,CAAC,CAAC,OAAO,EAAEH,IAAII,IAAI,CAAC,yCAAyC,CAAC;IACxF,MAAMC,IAAIL,IAAIM,MAAM,CAACD,CAAC,KAAKE,YAAYA,YAAYC,OAAOC,QAAQ,CAACT,IAAIM,MAAM,CAACD,CAAC,EAAE;IACjF,IAAIL,IAAIM,MAAM,CAACD,CAAC,KAAKE,aAAa,CAACC,OAAOE,SAAS,CAACL,IAAIL,IAAIG,UAAU,CAAC,CAAC,6BAA6B,EAAEH,IAAIM,MAAM,CAACD,CAAC,CAAC,CAAC,CAAC;IACtHP,UAAUE,KAAK,CAACW,IAAIC,MAAQhB,UAAUC,KAAKc,IAAIC,KAAKX,OAAO;YAAEI;YAAGQ,OAAOb,IAAIM,MAAM,CAACO,KAAK;QAAC,IAAIb,IAAIc,MAAM;AACxG;AACA,eAAef,QAAQ"}
@@ -0,0 +1,5 @@
1
+ import type { Command } from './types.js';
2
+ export declare const COMMANDS: Record<string, () => Promise<{
3
+ default: Command;
4
+ }>>;
5
+ export type { Command, Ctx } from './types.js';
@@ -0,0 +1,13 @@
1
+ // Lazy registry: a command's imports load only when it runs, so a heavy dependency in one
2
+ // command never taxes the others (or --version/--help). These names are reserved: a named
3
+ // query in config can never shadow them.
4
+ export const COMMANDS = {
5
+ init: ()=>import('./init.js'),
6
+ watch: ()=>import('./watch.js'),
7
+ status: ()=>import('./status.js'),
8
+ rebuild: ()=>import('./rebuild.js'),
9
+ query: ()=>import('./query.js'),
10
+ find: ()=>import('./find.js'),
11
+ map: ()=>import('./map.js'),
12
+ peek: ()=>import('./peek.js')
13
+ };
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/commands/index.ts"],"sourcesContent":["import type { Command } from './types.ts';\n\n// Lazy registry: a command's imports load only when it runs, so a heavy dependency in one\n// command never taxes the others (or --version/--help). These names are reserved: a named\n// query in config can never shadow them.\nexport const COMMANDS: Record<string, () => Promise<{ default: Command }>> = {\n init: () => import('./init.ts'),\n watch: () => import('./watch.ts'),\n status: () => import('./status.ts'),\n rebuild: () => import('./rebuild.ts'),\n query: () => import('./query.ts'),\n find: () => import('./find.ts'),\n map: () => import('./map.ts'),\n peek: () => import('./peek.ts'),\n};\n\nexport type { Command, Ctx } from './types.ts';\n"],"names":["COMMANDS","init","watch","status","rebuild","query","find","map","peek"],"mappings":"AAEA,0FAA0F;AAC1F,0FAA0F;AAC1F,yCAAyC;AACzC,OAAO,MAAMA,WAAgE;IAC3EC,MAAM,IAAM,MAAM,CAAC;IACnBC,OAAO,IAAM,MAAM,CAAC;IACpBC,QAAQ,IAAM,MAAM,CAAC;IACrBC,SAAS,IAAM,MAAM,CAAC;IACtBC,OAAO,IAAM,MAAM,CAAC;IACpBC,MAAM,IAAM,MAAM,CAAC;IACnBC,KAAK,IAAM,MAAM,CAAC;IAClBC,MAAM,IAAM,MAAM,CAAC;AACrB,EAAE"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from './types.js';
2
+ declare const init: Command;
3
+ export default init;
@@ -0,0 +1,7 @@
1
+ import { initConfig } from '../config.js';
2
+ const init = (ctx)=>{
3
+ const configPath = initConfig(process.cwd());
4
+ console.log(`created ${configPath}`);
5
+ console.log(`query away: ${ctx.name} query "SELECT path FROM frontmatter LIMIT 10"`);
6
+ };
7
+ export default init;
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/commands/init.ts"],"sourcesContent":["import { initConfig } from '../config.ts';\nimport type { Command } from './types.ts';\n\nconst init: Command = (ctx) => {\n const configPath = initConfig(process.cwd());\n console.log(`created ${configPath}`);\n console.log(`query away: ${ctx.name} query \"SELECT path FROM frontmatter LIMIT 10\"`);\n};\nexport default init;\n"],"names":["initConfig","init","ctx","configPath","process","cwd","console","log","name"],"mappings":"AAAA,SAASA,UAAU,QAAQ,eAAe;AAG1C,MAAMC,OAAgB,CAACC;IACrB,MAAMC,aAAaH,WAAWI,QAAQC,GAAG;IACzCC,QAAQC,GAAG,CAAC,CAAC,QAAQ,EAAEJ,YAAY;IACnCG,QAAQC,GAAG,CAAC,CAAC,YAAY,EAAEL,IAAIM,IAAI,CAAC,8CAA8C,CAAC;AACrF;AACA,eAAeP,KAAK"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from './types.js';
2
+ declare const map: Command;
3
+ export default map;
@@ -0,0 +1,10 @@
1
+ import { renderMap } from '../output.js';
2
+ import { vaultMap } from '../verbs.js';
3
+ import { withVault } from './vault.js';
4
+ const map = (ctx)=>{
5
+ withVault(ctx, (db, cfg)=>{
6
+ const result = vaultMap(db, cfg);
7
+ console.log(ctx.format === 'json' ? JSON.stringify(result, null, 2) : renderMap(result));
8
+ });
9
+ };
10
+ export default map;
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/commands/map.ts"],"sourcesContent":["import { renderMap } from '../output.ts';\nimport { vaultMap } from '../verbs.ts';\nimport type { Command } from './types.ts';\nimport { withVault } from './vault.ts';\n\nconst map: Command = (ctx) => {\n withVault(ctx, (db, cfg) => {\n const result = vaultMap(db, cfg);\n console.log(ctx.format === 'json' ? JSON.stringify(result, null, 2) : renderMap(result));\n });\n};\nexport default map;\n"],"names":["renderMap","vaultMap","withVault","map","ctx","db","cfg","result","console","log","format","JSON","stringify"],"mappings":"AAAA,SAASA,SAAS,QAAQ,eAAe;AACzC,SAASC,QAAQ,QAAQ,cAAc;AAEvC,SAASC,SAAS,QAAQ,aAAa;AAEvC,MAAMC,MAAe,CAACC;IACpBF,UAAUE,KAAK,CAACC,IAAIC;QAClB,MAAMC,SAASN,SAASI,IAAIC;QAC5BE,QAAQC,GAAG,CAACL,IAAIM,MAAM,KAAK,SAASC,KAAKC,SAAS,CAACL,QAAQ,MAAM,KAAKP,UAAUO;IAClF;AACF;AACA,eAAeJ,IAAI"}
@@ -0,0 +1,2 @@
1
+ import type { Ctx } from './types.js';
2
+ export default function named(ctx: Ctx, queryName: string, params: string[]): void;
@@ -0,0 +1,12 @@
1
+ import { runSql } from './vault.js';
2
+ // Fallback when the first positional is not a command: a named query from config.
3
+ export default function named(ctx, queryName, params) {
4
+ const cfg = ctx.resolveConfig();
5
+ const sql = cfg.queries[queryName];
6
+ if (!sql) {
7
+ console.error(`unknown query: "${queryName}"`);
8
+ console.error(`valid queries: ${Object.keys(cfg.queries).sort().join(', ')}`);
9
+ process.exit(2);
10
+ }
11
+ runSql(cfg, sql, params, ctx.format, `query "${queryName}"`);
12
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/commands/named.ts"],"sourcesContent":["import type { Ctx } from './types.ts';\nimport { runSql } from './vault.ts';\n\n// Fallback when the first positional is not a command: a named query from config.\nexport default function named(ctx: Ctx, queryName: string, params: string[]): void {\n const cfg = ctx.resolveConfig();\n const sql = cfg.queries[queryName];\n if (!sql) {\n console.error(`unknown query: \"${queryName}\"`);\n console.error(`valid queries: ${Object.keys(cfg.queries).sort().join(', ')}`);\n process.exit(2);\n }\n runSql(cfg, sql, params, ctx.format, `query \"${queryName}\"`);\n}\n"],"names":["runSql","named","ctx","queryName","params","cfg","resolveConfig","sql","queries","console","error","Object","keys","sort","join","process","exit","format"],"mappings":"AACA,SAASA,MAAM,QAAQ,aAAa;AAEpC,kFAAkF;AAClF,eAAe,SAASC,MAAMC,GAAQ,EAAEC,SAAiB,EAAEC,MAAgB;IACzE,MAAMC,MAAMH,IAAII,aAAa;IAC7B,MAAMC,MAAMF,IAAIG,OAAO,CAACL,UAAU;IAClC,IAAI,CAACI,KAAK;QACRE,QAAQC,KAAK,CAAC,CAAC,gBAAgB,EAAEP,UAAU,CAAC,CAAC;QAC7CM,QAAQC,KAAK,CAAC,CAAC,eAAe,EAAEC,OAAOC,IAAI,CAACP,IAAIG,OAAO,EAAEK,IAAI,GAAGC,IAAI,CAAC,OAAO;QAC5EC,QAAQC,IAAI,CAAC;IACf;IACAhB,OAAOK,KAAKE,KAAKH,QAAQF,IAAIe,MAAM,EAAE,CAAC,OAAO,EAAEd,UAAU,CAAC,CAAC;AAC7D"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from './types.js';
2
+ declare const peekCmd: Command;
3
+ export default peekCmd;
@@ -0,0 +1,12 @@
1
+ import { renderPeek } from '../output.js';
2
+ import { peek } from '../verbs.js';
3
+ import { withVault } from './vault.js';
4
+ const peekCmd = (ctx)=>{
5
+ const [pathArg] = ctx.rest;
6
+ if (!pathArg) ctx.usageError(`usage: ${ctx.name} peek <path>`);
7
+ withVault(ctx, (db, cfg)=>{
8
+ const result = peek(db, cfg, pathArg);
9
+ console.log(ctx.format === 'json' ? JSON.stringify(result, null, 2) : renderPeek(result));
10
+ });
11
+ };
12
+ export default peekCmd;
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/commands/peek.ts"],"sourcesContent":["import { renderPeek } from '../output.ts';\nimport { peek } from '../verbs.ts';\nimport type { Command } from './types.ts';\nimport { withVault } from './vault.ts';\n\nconst peekCmd: Command = (ctx) => {\n const [pathArg] = ctx.rest;\n if (!pathArg) ctx.usageError(`usage: ${ctx.name} peek <path>`);\n withVault(ctx, (db, cfg) => {\n const result = peek(db, cfg, pathArg);\n console.log(ctx.format === 'json' ? JSON.stringify(result, null, 2) : renderPeek(result));\n });\n};\nexport default peekCmd;\n"],"names":["renderPeek","peek","withVault","peekCmd","ctx","pathArg","rest","usageError","name","db","cfg","result","console","log","format","JSON","stringify"],"mappings":"AAAA,SAASA,UAAU,QAAQ,eAAe;AAC1C,SAASC,IAAI,QAAQ,cAAc;AAEnC,SAASC,SAAS,QAAQ,aAAa;AAEvC,MAAMC,UAAmB,CAACC;IACxB,MAAM,CAACC,QAAQ,GAAGD,IAAIE,IAAI;IAC1B,IAAI,CAACD,SAASD,IAAIG,UAAU,CAAC,CAAC,OAAO,EAAEH,IAAII,IAAI,CAAC,YAAY,CAAC;IAC7DN,UAAUE,KAAK,CAACK,IAAIC;QAClB,MAAMC,SAASV,KAAKQ,IAAIC,KAAKL;QAC7BO,QAAQC,GAAG,CAACT,IAAIU,MAAM,KAAK,SAASC,KAAKC,SAAS,CAACL,QAAQ,MAAM,KAAKX,WAAWW;IACnF;AACF;AACA,eAAeR,QAAQ"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from './types.js';
2
+ declare const query: Command;
3
+ export default query;
@@ -0,0 +1,7 @@
1
+ import { runSql } from './vault.js';
2
+ const query = (ctx)=>{
3
+ const [sql, ...params] = ctx.rest;
4
+ if (!sql) ctx.usageError(`usage: ${ctx.name} query "<sql>" [params...]`);
5
+ runSql(ctx.resolveConfig(), sql, params, ctx.format, 'ad-hoc query');
6
+ };
7
+ export default query;
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/commands/query.ts"],"sourcesContent":["import type { Command } from './types.ts';\nimport { runSql } from './vault.ts';\n\nconst query: Command = (ctx) => {\n const [sql, ...params] = ctx.rest;\n if (!sql) ctx.usageError(`usage: ${ctx.name} query \"<sql>\" [params...]`);\n runSql(ctx.resolveConfig(), sql, params, ctx.format, 'ad-hoc query');\n};\nexport default query;\n"],"names":["runSql","query","ctx","sql","params","rest","usageError","name","resolveConfig","format"],"mappings":"AACA,SAASA,MAAM,QAAQ,aAAa;AAEpC,MAAMC,QAAiB,CAACC;IACtB,MAAM,CAACC,KAAK,GAAGC,OAAO,GAAGF,IAAIG,IAAI;IACjC,IAAI,CAACF,KAAKD,IAAII,UAAU,CAAC,CAAC,OAAO,EAAEJ,IAAIK,IAAI,CAAC,0BAA0B,CAAC;IACvEP,OAAOE,IAAIM,aAAa,IAAIL,KAAKC,QAAQF,IAAIO,MAAM,EAAE;AACvD;AACA,eAAeR,MAAM"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from './types.js';
2
+ declare const rebuildCmd: Command;
3
+ export default rebuildCmd;
@@ -0,0 +1,9 @@
1
+ import { docCount, rebuild } from '../db.js';
2
+ import { printWarnings } from './vault.js';
3
+ const rebuildCmd = (ctx)=>{
4
+ const result = rebuild(ctx.resolveConfig());
5
+ printWarnings(result.warnings);
6
+ console.log(`rebuilt: ${docCount(result.db)} docs`);
7
+ result.db.close();
8
+ };
9
+ export default rebuildCmd;
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/commands/rebuild.ts"],"sourcesContent":["import { docCount, rebuild } from '../db.ts';\nimport type { Command } from './types.ts';\nimport { printWarnings } from './vault.ts';\n\nconst rebuildCmd: Command = (ctx) => {\n const result = rebuild(ctx.resolveConfig());\n printWarnings(result.warnings);\n console.log(`rebuilt: ${docCount(result.db)} docs`);\n result.db.close();\n};\nexport default rebuildCmd;\n"],"names":["docCount","rebuild","printWarnings","rebuildCmd","ctx","result","resolveConfig","warnings","console","log","db","close"],"mappings":"AAAA,SAASA,QAAQ,EAAEC,OAAO,QAAQ,WAAW;AAE7C,SAASC,aAAa,QAAQ,aAAa;AAE3C,MAAMC,aAAsB,CAACC;IAC3B,MAAMC,SAASJ,QAAQG,IAAIE,aAAa;IACxCJ,cAAcG,OAAOE,QAAQ;IAC7BC,QAAQC,GAAG,CAAC,CAAC,SAAS,EAAET,SAASK,OAAOK,EAAE,EAAE,KAAK,CAAC;IAClDL,OAAOK,EAAE,CAACC,KAAK;AACjB;AACA,eAAeR,WAAW"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from './types.js';
2
+ declare const status: Command;
3
+ export default status;
@@ -0,0 +1,13 @@
1
+ import { docCount, getMeta, open } from '../db.js';
2
+ import { printWarnings } from './vault.js';
3
+ const status = (ctx)=>{
4
+ const { db, dbPath, warnings } = open(ctx.resolveConfig());
5
+ printWarnings(warnings);
6
+ console.log(`db: ${dbPath}`);
7
+ console.log(`docs: ${docCount(db)}`);
8
+ const heartbeat = getMeta(db, 'watch_heartbeat');
9
+ if (heartbeat) console.log(`watcher: last heartbeat ${Math.round((Date.now() - Date.parse(heartbeat)) / 1000)}s ago`);
10
+ else console.log('watcher: no watcher');
11
+ db.close();
12
+ };
13
+ export default status;
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/commands/status.ts"],"sourcesContent":["import { docCount, getMeta, open } from '../db.ts';\nimport type { Command } from './types.ts';\nimport { printWarnings } from './vault.ts';\n\nconst status: Command = (ctx) => {\n const { db, dbPath, warnings } = open(ctx.resolveConfig());\n printWarnings(warnings);\n console.log(`db: ${dbPath}`);\n console.log(`docs: ${docCount(db)}`);\n const heartbeat = getMeta(db, 'watch_heartbeat');\n if (heartbeat) console.log(`watcher: last heartbeat ${Math.round((Date.now() - Date.parse(heartbeat)) / 1000)}s ago`);\n else console.log('watcher: no watcher');\n db.close();\n};\nexport default status;\n"],"names":["docCount","getMeta","open","printWarnings","status","ctx","db","dbPath","warnings","resolveConfig","console","log","heartbeat","Math","round","Date","now","parse","close"],"mappings":"AAAA,SAASA,QAAQ,EAAEC,OAAO,EAAEC,IAAI,QAAQ,WAAW;AAEnD,SAASC,aAAa,QAAQ,aAAa;AAE3C,MAAMC,SAAkB,CAACC;IACvB,MAAM,EAAEC,EAAE,EAAEC,MAAM,EAAEC,QAAQ,EAAE,GAAGN,KAAKG,IAAII,aAAa;IACvDN,cAAcK;IACdE,QAAQC,GAAG,CAAC,CAAC,IAAI,EAAEJ,QAAQ;IAC3BG,QAAQC,GAAG,CAAC,CAAC,MAAM,EAAEX,SAASM,KAAK;IACnC,MAAMM,YAAYX,QAAQK,IAAI;IAC9B,IAAIM,WAAWF,QAAQC,GAAG,CAAC,CAAC,wBAAwB,EAAEE,KAAKC,KAAK,CAAC,AAACC,CAAAA,KAAKC,GAAG,KAAKD,KAAKE,KAAK,CAACL,UAAS,IAAK,MAAM,KAAK,CAAC;SAC/GF,QAAQC,GAAG,CAAC;IACjBL,GAAGY,KAAK;AACV;AACA,eAAed,OAAO"}
@@ -0,0 +1,15 @@
1
+ import type { ResolvedConfig } from '../config.js';
2
+ export interface Ctx {
3
+ name: string;
4
+ rest: string[];
5
+ format: 'table' | 'json';
6
+ values: {
7
+ config?: string;
8
+ where?: string;
9
+ k?: string;
10
+ force: boolean;
11
+ };
12
+ resolveConfig(): ResolvedConfig;
13
+ usageError(message: string): never;
14
+ }
15
+ export type Command = (ctx: Ctx) => Promise<void> | void;
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/commands/types.ts"],"sourcesContent":["import type { ResolvedConfig } from '../config.ts';\n\n// Handed to every command; argv parsing stays in cli.ts.\nexport interface Ctx {\n name: string;\n rest: string[]; // positionals after the command word\n format: 'table' | 'json';\n values: { config?: string; where?: string; k?: string; force: boolean };\n resolveConfig(): ResolvedConfig;\n usageError(message: string): never;\n}\n\nexport type Command = (ctx: Ctx) => Promise<void> | void;\n"],"names":[],"mappings":"AAYA,WAAyD"}
@@ -0,0 +1,6 @@
1
+ import type { ResolvedConfig } from '../config.js';
2
+ import type { OpenResult } from '../db.js';
3
+ import type { Ctx } from './types.js';
4
+ export declare function printWarnings(warnings: string[]): void;
5
+ export declare function withVault(ctx: Ctx, fn: (db: OpenResult['db'], cfg: ResolvedConfig) => void): void;
6
+ export declare function runSql(cfg: ResolvedConfig, sql: string, params: string[], format: 'table' | 'json', label: string): void;
@@ -0,0 +1,29 @@
1
+ import { open } from '../db.js';
2
+ import { printRows } from '../output.js';
3
+ // Shared open-query-close envelope for commands that touch the vault.
4
+ export function printWarnings(warnings) {
5
+ for (const w of warnings)console.warn(w);
6
+ }
7
+ export function withVault(ctx, fn) {
8
+ const cfg = ctx.resolveConfig();
9
+ const { db, warnings } = open(cfg);
10
+ printWarnings(warnings);
11
+ try {
12
+ fn(db, cfg);
13
+ } finally{
14
+ db.close();
15
+ }
16
+ }
17
+ // An unbound `?` silently binds NULL, so mismatched param counts fail loudly instead.
18
+ export function runSql(cfg, sql, params, format, label) {
19
+ var _sql_match;
20
+ const placeholderCount = ((_sql_match = sql.match(/\?/g)) !== null && _sql_match !== void 0 ? _sql_match : []).length;
21
+ if (params.length !== placeholderCount) {
22
+ console.error(`${label} expects ${placeholderCount} parameter(s), got ${params.length}`);
23
+ process.exit(2);
24
+ }
25
+ const { db, warnings } = open(cfg);
26
+ printWarnings(warnings);
27
+ printRows(db.prepare(sql).all(...params), format);
28
+ db.close();
29
+ }
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from './types.js';
2
+ declare const watch: Command;
3
+ export default watch;
@@ -0,0 +1,19 @@
1
+ import { runWatch } from '../watch.js';
2
+ import { printWarnings } from './vault.js';
3
+ const watch = async (ctx)=>{
4
+ await runWatch(ctx.resolveConfig(), {
5
+ force: ctx.values.force,
6
+ onEvent: (event)=>{
7
+ if (event.type === 'started') {
8
+ console.log(`${ctx.name} watch: watching ${event.baseDir}`);
9
+ console.log(`${ctx.name} watch: db ${event.dbPath}`);
10
+ } else if (event.type === 'reconciled') {
11
+ printWarnings(event.warnings);
12
+ if (event.parsed > 0) console.log(`${ctx.name} watch: reconciled, ${event.parsed} file(s) reparsed (${event.total} total)`);
13
+ } else {
14
+ console.error(`${ctx.name} watch: reconcile error: ${event.message}`);
15
+ }
16
+ }
17
+ });
18
+ };
19
+ export default watch;
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/commands/watch.ts"],"sourcesContent":["import type { WatchEvent } from '../watch.ts';\nimport { runWatch } from '../watch.ts';\nimport type { Command } from './types.ts';\nimport { printWarnings } from './vault.ts';\n\nconst watch: Command = async (ctx) => {\n await runWatch(ctx.resolveConfig(), {\n force: ctx.values.force,\n onEvent: (event: WatchEvent) => {\n if (event.type === 'started') {\n console.log(`${ctx.name} watch: watching ${event.baseDir}`);\n console.log(`${ctx.name} watch: db ${event.dbPath}`);\n } else if (event.type === 'reconciled') {\n printWarnings(event.warnings);\n if (event.parsed > 0) console.log(`${ctx.name} watch: reconciled, ${event.parsed} file(s) reparsed (${event.total} total)`);\n } else {\n console.error(`${ctx.name} watch: reconcile error: ${event.message}`);\n }\n },\n });\n};\nexport default watch;\n"],"names":["runWatch","printWarnings","watch","ctx","resolveConfig","force","values","onEvent","event","type","console","log","name","baseDir","dbPath","warnings","parsed","total","error","message"],"mappings":"AACA,SAASA,QAAQ,QAAQ,cAAc;AAEvC,SAASC,aAAa,QAAQ,aAAa;AAE3C,MAAMC,QAAiB,OAAOC;IAC5B,MAAMH,SAASG,IAAIC,aAAa,IAAI;QAClCC,OAAOF,IAAIG,MAAM,CAACD,KAAK;QACvBE,SAAS,CAACC;YACR,IAAIA,MAAMC,IAAI,KAAK,WAAW;gBAC5BC,QAAQC,GAAG,CAAC,GAAGR,IAAIS,IAAI,CAAC,iBAAiB,EAAEJ,MAAMK,OAAO,EAAE;gBAC1DH,QAAQC,GAAG,CAAC,GAAGR,IAAIS,IAAI,CAAC,WAAW,EAAEJ,MAAMM,MAAM,EAAE;YACrD,OAAO,IAAIN,MAAMC,IAAI,KAAK,cAAc;gBACtCR,cAAcO,MAAMO,QAAQ;gBAC5B,IAAIP,MAAMQ,MAAM,GAAG,GAAGN,QAAQC,GAAG,CAAC,GAAGR,IAAIS,IAAI,CAAC,oBAAoB,EAAEJ,MAAMQ,MAAM,CAAC,mBAAmB,EAAER,MAAMS,KAAK,CAAC,OAAO,CAAC;YAC5H,OAAO;gBACLP,QAAQQ,KAAK,CAAC,GAAGf,IAAIS,IAAI,CAAC,yBAAyB,EAAEJ,MAAMW,OAAO,EAAE;YACtE;QACF;IACF;AACF;AACA,eAAejB,MAAM"}
@@ -1,18 +1,28 @@
1
1
  export declare const CONFIG_FILENAME = "sense.config.json";
2
2
  export declare const STATE_DIR = ".sense";
3
- export declare const SUPPORTED_CONFIG_VERSION = 1;
3
+ export declare const SUPPORTED_CONFIG_VERSION = 2;
4
+ export declare const FEATURE_NAMES: readonly ["links", "sections", "rank"];
5
+ export type FeatureName = (typeof FEATURE_NAMES)[number];
4
6
  export interface Config {
5
7
  $schema?: string;
6
8
  version?: number;
7
9
  scan: {
8
10
  include: string[];
9
11
  };
12
+ features?: Partial<Record<FeatureName, boolean>>;
10
13
  queries: Record<string, string>;
11
14
  }
12
15
  export interface ResolvedConfig extends Config {
13
16
  baseDir: string;
14
17
  configPath: string | null;
18
+ migratedFrom?: number;
15
19
  }
20
+ export declare function featureEnabled(cfg: Config, name: FeatureName): boolean;
21
+ export declare function enabledFeatures(cfg: Config): FeatureName[];
22
+ export declare function migrateConfig(cfg: Config): {
23
+ cfg: Config;
24
+ from: number;
25
+ };
16
26
  export declare function initConfig(dir: string): string;
17
27
  export declare function findConfigPath(startDir: string): string | null;
18
28
  export declare function loadConfig(explicitPath?: string): ResolvedConfig;