sensemaking 0.9.0 → 0.9.2
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 +1 -1
- package/dist/cjs/cli/check.js +34 -3
- package/dist/cjs/cli/check.js.map +1 -1
- package/dist/cjs/cli/index.d.cts +11 -0
- package/dist/cjs/cli/index.d.ts +11 -0
- package/dist/cjs/cli/index.js +22 -3
- package/dist/cjs/cli/index.js.map +1 -1
- package/dist/cjs/cli/init.js +3 -0
- package/dist/cjs/cli/init.js.map +1 -1
- package/dist/cjs/cli/map.js +33 -2
- package/dist/cjs/cli/map.js.map +1 -1
- package/dist/cjs/cli/named.d.cts +1 -1
- package/dist/cjs/cli/named.d.ts +1 -1
- package/dist/cjs/cli/named.js +46 -12
- package/dist/cjs/cli/named.js.map +1 -1
- package/dist/cjs/cli/peek.js +36 -4
- package/dist/cjs/cli/peek.js.map +1 -1
- package/dist/cjs/cli/query.js +35 -3
- package/dist/cjs/cli/query.js.map +1 -1
- package/dist/cjs/cli/rebuild.js +31 -1
- package/dist/cjs/cli/rebuild.js.map +1 -1
- package/dist/cjs/cli/search.js +42 -10
- package/dist/cjs/cli/search.js.map +1 -1
- package/dist/cjs/cli/shared.d.cts +13 -2
- package/dist/cjs/cli/shared.d.ts +13 -2
- package/dist/cjs/cli/shared.js +139 -7
- package/dist/cjs/cli/shared.js.map +1 -1
- package/dist/cjs/cli/status.js +5 -2
- package/dist/cjs/cli/status.js.map +1 -1
- package/dist/cjs/cli/types.d.cts +2 -12
- package/dist/cjs/cli/types.d.ts +2 -12
- package/dist/cjs/cli/watch.js +38 -2
- package/dist/cjs/cli/watch.js.map +1 -1
- package/dist/cjs/cli.js +113 -121
- package/dist/cjs/cli.js.map +1 -1
- package/dist/esm/cli/check.js +9 -3
- package/dist/esm/cli/check.js.map +1 -1
- package/dist/esm/cli/index.d.ts +11 -0
- package/dist/esm/cli/index.js +14 -0
- package/dist/esm/cli/index.js.map +1 -1
- package/dist/esm/cli/init.js +3 -0
- package/dist/esm/cli/init.js.map +1 -1
- package/dist/esm/cli/map.js +11 -3
- package/dist/esm/cli/map.js.map +1 -1
- package/dist/esm/cli/named.d.ts +1 -1
- package/dist/esm/cli/named.js +23 -13
- package/dist/esm/cli/named.js.map +1 -1
- package/dist/esm/cli/peek.js +12 -5
- package/dist/esm/cli/peek.js.map +1 -1
- package/dist/esm/cli/query.js +11 -4
- package/dist/esm/cli/query.js.map +1 -1
- package/dist/esm/cli/rebuild.js +6 -2
- package/dist/esm/cli/rebuild.js.map +1 -1
- package/dist/esm/cli/search.js +18 -10
- package/dist/esm/cli/search.js.map +1 -1
- package/dist/esm/cli/shared.d.ts +13 -2
- package/dist/esm/cli/shared.js +74 -7
- package/dist/esm/cli/shared.js.map +1 -1
- package/dist/esm/cli/status.js +9 -3
- package/dist/esm/cli/status.js.map +1 -1
- package/dist/esm/cli/types.d.ts +2 -12
- package/dist/esm/cli/types.js.map +1 -1
- package/dist/esm/cli/watch.js +11 -3
- package/dist/esm/cli/watch.js.map +1 -1
- package/dist/esm/cli.js +82 -95
- package/dist/esm/cli.js.map +1 -1
- package/package.json +1 -1
- package/skills/sense/SKILL.md +3 -1
package/dist/esm/cli.js
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { createRequire } from 'node:module';
|
|
2
2
|
import { parseArgs } from 'node:util';
|
|
3
|
-
import { COMMANDS } from './cli/index.js';
|
|
3
|
+
import { COMMANDS, USAGE } from './cli/index.js';
|
|
4
4
|
import { loadConfig, SUPPORTED_CONFIG_VERSION } from './config.js';
|
|
5
5
|
// Parsing and dispatch only. Commands live in src/cli/, one file each, lazy-loaded --
|
|
6
|
-
// nothing tree- or dependency-heavy may be imported at the top of this file.
|
|
6
|
+
// nothing tree- or dependency-heavy may be imported at the top of this file. Flags parse
|
|
7
|
+
// per command (each command's own parse() call); this file only handles the bare top-level
|
|
8
|
+
// flags (--version/--help/--list/--config) and dispatch.
|
|
7
9
|
// Works from dist/cjs and dist/esm alike: walk up past the dist type-marker package.json.
|
|
8
10
|
function packageVersion() {
|
|
9
11
|
const load = createRequire(import.meta.url);
|
|
@@ -20,118 +22,103 @@ function packageVersion() {
|
|
|
20
22
|
return 'unknown';
|
|
21
23
|
}
|
|
22
24
|
function usage(name) {
|
|
23
|
-
|
|
25
|
+
const lines = Object.values(USAGE).map((u)=>` ${name} ${u}`);
|
|
26
|
+
return [
|
|
27
|
+
`usage: ${name} <name> [params...] [--format table|json] [--config path]`,
|
|
28
|
+
...lines,
|
|
29
|
+
` ${name} --list`,
|
|
30
|
+
` ${name} --version`
|
|
31
|
+
].join('\n');
|
|
32
|
+
}
|
|
33
|
+
function resolveConfigFor(name, configPath) {
|
|
34
|
+
const cfg = loadConfig(configPath);
|
|
35
|
+
if (cfg.migratedFrom !== undefined) {
|
|
36
|
+
console.warn(`${name}: migrated ${cfg.configPath} from config version ${cfg.migratedFrom} to ${SUPPORTED_CONFIG_VERSION}`);
|
|
37
|
+
}
|
|
38
|
+
if (cfg.unknownKeys !== undefined) {
|
|
39
|
+
console.warn(`${name}: ${cfg.configPath} sets ${cfg.unknownKeys.join(', ')}, which this build does not read (no effect); see schema.json for the keys it does`);
|
|
40
|
+
}
|
|
41
|
+
return cfg;
|
|
24
42
|
}
|
|
25
43
|
// Thrown errors -> exit 1 with the message verbatim; usage errors exit 2 directly.
|
|
26
44
|
export default async function cli(argv, name) {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
},
|
|
53
|
-
lexical: {
|
|
54
|
-
type: 'boolean',
|
|
55
|
-
default: false
|
|
56
|
-
},
|
|
57
|
-
list: {
|
|
58
|
-
type: 'boolean',
|
|
59
|
-
default: false
|
|
60
|
-
},
|
|
61
|
-
force: {
|
|
62
|
-
type: 'boolean',
|
|
63
|
-
default: false
|
|
64
|
-
},
|
|
65
|
-
version: {
|
|
66
|
-
type: 'boolean',
|
|
67
|
-
default: false,
|
|
68
|
-
short: 'v'
|
|
45
|
+
const first = argv[0];
|
|
46
|
+
// No command word, or the first token looks like a flag: the only flags this level knows.
|
|
47
|
+
if (!first || first.startsWith('-')) {
|
|
48
|
+
let values;
|
|
49
|
+
try {
|
|
50
|
+
({ values } = parseArgs({
|
|
51
|
+
args: argv,
|
|
52
|
+
options: {
|
|
53
|
+
version: {
|
|
54
|
+
type: 'boolean',
|
|
55
|
+
default: false,
|
|
56
|
+
short: 'v'
|
|
57
|
+
},
|
|
58
|
+
help: {
|
|
59
|
+
type: 'boolean',
|
|
60
|
+
default: false,
|
|
61
|
+
short: 'h'
|
|
62
|
+
},
|
|
63
|
+
list: {
|
|
64
|
+
type: 'boolean',
|
|
65
|
+
default: false
|
|
66
|
+
},
|
|
67
|
+
config: {
|
|
68
|
+
type: 'string'
|
|
69
|
+
}
|
|
69
70
|
},
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
71
|
+
allowPositionals: true
|
|
72
|
+
}));
|
|
73
|
+
} catch (err) {
|
|
74
|
+
console.error(err.message);
|
|
75
|
+
console.error(usage(name));
|
|
76
|
+
process.exit(2);
|
|
77
|
+
}
|
|
78
|
+
try {
|
|
79
|
+
if (values.version) {
|
|
80
|
+
console.log(`v${packageVersion()}`);
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
if (values.help) {
|
|
84
|
+
console.log(usage(name));
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
if (values.list) {
|
|
88
|
+
const queries = resolveConfigFor(name, values.config).queries;
|
|
89
|
+
for (const queryName of Object.keys(queries).sort()){
|
|
90
|
+
const entry = queries[queryName];
|
|
91
|
+
const isSavedSearch = typeof entry === 'object' && entry !== null && 'search' in entry;
|
|
92
|
+
console.log(isSavedSearch ? `${queryName} (search)` : queryName);
|
|
74
93
|
}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
})
|
|
78
|
-
|
|
79
|
-
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
} catch (err) {
|
|
97
|
+
console.error(err.message);
|
|
98
|
+
process.exit(1);
|
|
99
|
+
}
|
|
80
100
|
console.error(usage(name));
|
|
81
101
|
process.exit(2);
|
|
82
102
|
}
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
console.log(usage(name));
|
|
89
|
-
return;
|
|
103
|
+
// find -> search (breaking rename): one release of a pointer instead of "unknown query".
|
|
104
|
+
if (first === 'find') {
|
|
105
|
+
console.error(`${name}: find is now search`);
|
|
106
|
+
console.error(usage(name));
|
|
107
|
+
process.exit(2);
|
|
90
108
|
}
|
|
91
109
|
const ctx = {
|
|
92
110
|
name,
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
values: values,
|
|
96
|
-
resolveConfig () {
|
|
97
|
-
const cfg = loadConfig(values.config);
|
|
98
|
-
if (cfg.migratedFrom !== undefined) {
|
|
99
|
-
console.warn(`${name}: migrated ${cfg.configPath} from config version ${cfg.migratedFrom} to ${SUPPORTED_CONFIG_VERSION}`);
|
|
100
|
-
}
|
|
101
|
-
if (cfg.unknownKeys !== undefined) {
|
|
102
|
-
console.warn(`${name}: ${cfg.configPath} sets ${cfg.unknownKeys.join(', ')}, which this build does not read (no effect); see schema.json for the keys it does`);
|
|
103
|
-
}
|
|
104
|
-
return cfg;
|
|
105
|
-
},
|
|
111
|
+
argv: argv.slice(1),
|
|
112
|
+
resolveConfig: (configPath)=>resolveConfigFor(name, configPath),
|
|
106
113
|
usageError (message) {
|
|
107
114
|
console.error(message);
|
|
108
115
|
process.exit(2);
|
|
109
116
|
}
|
|
110
117
|
};
|
|
111
118
|
try {
|
|
112
|
-
if (values.list) {
|
|
113
|
-
const queries = ctx.resolveConfig().queries;
|
|
114
|
-
for (const queryName of Object.keys(queries).sort()){
|
|
115
|
-
const entry = queries[queryName];
|
|
116
|
-
const isSavedSearch = typeof entry === 'object' && entry !== null && 'search' in entry;
|
|
117
|
-
console.log(isSavedSearch ? `${queryName} (search)` : queryName);
|
|
118
|
-
}
|
|
119
|
-
return;
|
|
120
|
-
}
|
|
121
|
-
const [first, ...params] = positionals;
|
|
122
|
-
if (!first) {
|
|
123
|
-
console.error(usage(name));
|
|
124
|
-
process.exit(2);
|
|
125
|
-
}
|
|
126
|
-
// find -> search (breaking rename): one release of a pointer instead of "unknown query".
|
|
127
|
-
if (first === 'find') {
|
|
128
|
-
console.error(`${name}: find is now search`);
|
|
129
|
-
console.error(usage(name));
|
|
130
|
-
process.exit(2);
|
|
131
|
-
}
|
|
132
119
|
const load = COMMANDS[first];
|
|
133
120
|
if (load) await (await load()).default(ctx);
|
|
134
|
-
else await (await import('./cli/named.js')).default(ctx, first
|
|
121
|
+
else await (await import('./cli/named.js')).default(ctx, first);
|
|
135
122
|
} catch (err) {
|
|
136
123
|
console.error(err.message);
|
|
137
124
|
process.exit(1);
|
package/dist/esm/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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 './cli/index.ts';\nimport type { Ctx } from './cli/types.ts';\nimport { loadConfig, SUPPORTED_CONFIG_VERSION } from './config.ts';\n\n// Parsing and dispatch only. Commands live in src/cli/, one file each, lazy-loaded --\n// nothing tree- 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
|
|
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, USAGE } from './cli/index.ts';\nimport type { Ctx } from './cli/types.ts';\nimport { loadConfig, SUPPORTED_CONFIG_VERSION } from './config.ts';\n\n// Parsing and dispatch only. Commands live in src/cli/, one file each, lazy-loaded --\n// nothing tree- or dependency-heavy may be imported at the top of this file. Flags parse\n// per command (each command's own parse() call); this file only handles the bare top-level\n// flags (--version/--help/--list/--config) and dispatch.\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 const lines = Object.values(USAGE).map((u) => ` ${name} ${u}`);\n return [`usage: ${name} <name> [params...] [--format table|json] [--config path]`, ...lines, ` ${name} --list`, ` ${name} --version`].join('\\n');\n}\n\nfunction resolveConfigFor(name: string, configPath: string | undefined) {\n const cfg = loadConfig(configPath);\n if (cfg.migratedFrom !== undefined) {\n console.warn(`${name}: migrated ${cfg.configPath} from config version ${cfg.migratedFrom} to ${SUPPORTED_CONFIG_VERSION}`);\n }\n if (cfg.unknownKeys !== undefined) {\n console.warn(`${name}: ${cfg.configPath} sets ${cfg.unknownKeys.join(', ')}, which this build does not read (no effect); see schema.json for the keys it does`);\n }\n return cfg;\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 first = argv[0];\n\n // No command word, or the first token looks like a flag: the only flags this level knows.\n if (!first || first.startsWith('-')) {\n let values: Record<string, string | boolean | undefined>;\n try {\n ({ values } = parseArgs({\n args: argv,\n options: {\n version: { type: 'boolean', default: false, short: 'v' },\n help: { type: 'boolean', default: false, short: 'h' },\n list: { type: 'boolean', default: false },\n config: { type: 'string' },\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 try {\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 if (values.list) {\n const queries = resolveConfigFor(name, values.config as string | undefined).queries;\n for (const queryName of Object.keys(queries).sort()) {\n const entry = queries[queryName];\n const isSavedSearch = typeof entry === 'object' && entry !== null && 'search' in entry;\n console.log(isSavedSearch ? `${queryName} (search)` : queryName);\n }\n return;\n }\n } catch (err) {\n console.error((err as Error).message);\n process.exit(1);\n }\n\n console.error(usage(name));\n process.exit(2);\n }\n\n // find -> search (breaking rename): one release of a pointer instead of \"unknown query\".\n if (first === 'find') {\n console.error(`${name}: find is now search`);\n console.error(usage(name));\n process.exit(2);\n }\n\n const ctx: Ctx = {\n name,\n argv: argv.slice(1),\n resolveConfig: (configPath) => resolveConfigFor(name, configPath),\n usageError(message) {\n console.error(message);\n process.exit(2);\n },\n };\n\n try {\n const load = COMMANDS[first];\n if (load) await (await load()).default(ctx);\n else await (await import('./cli/named.ts')).default(ctx, first);\n } catch (err) {\n console.error((err as Error).message);\n process.exit(1);\n }\n}\n"],"names":["createRequire","parseArgs","COMMANDS","USAGE","loadConfig","SUPPORTED_CONFIG_VERSION","packageVersion","load","url","rel","pkg","name","version","usage","lines","Object","values","map","u","join","resolveConfigFor","configPath","cfg","migratedFrom","undefined","console","warn","unknownKeys","cli","argv","first","startsWith","args","options","type","default","short","help","list","config","allowPositionals","err","error","message","process","exit","log","queries","queryName","keys","sort","entry","isSavedSearch","ctx","slice","resolveConfig","usageError"],"mappings":"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"}
|
package/package.json
CHANGED
package/skills/sense/SKILL.md
CHANGED
|
@@ -40,7 +40,9 @@ question:
|
|
|
40
40
|
whole.
|
|
41
41
|
|
|
42
42
|
Output defaults to a table, built for humans; `--format json` returns the same rows
|
|
43
|
-
machine-parseable.
|
|
43
|
+
machine-parseable. That also makes a saved query usable as a CI/hook gate with zero added
|
|
44
|
+
mechanism: `[ "$(sense <query> --format json)" = "[]" ]` is true exactly when the query
|
|
45
|
+
returned no rows.
|
|
44
46
|
|
|
45
47
|
## Commands
|
|
46
48
|
|