@wiki0/cli 0.0.5 → 0.1.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/README.md CHANGED
@@ -1,6 +1,7 @@
1
1
  # @wiki0/cli
2
2
 
3
- Command line interface for wiki0 local-first Markdown wiki memory.
3
+ Command line interface for wiki0: search a project's docs and get the
4
+ right section with a `path:start-end` citation.
4
5
 
5
6
  ## Install
6
7
 
@@ -8,32 +9,34 @@ Command line interface for wiki0 local-first Markdown wiki memory.
8
9
  pnpm add -g @wiki0/cli
9
10
  ```
10
11
 
11
- The package exposes the `wiki0` binary.
12
-
13
12
  ## Commands
14
13
 
15
14
  ```sh
16
- wiki0 init ./my-wiki
17
- wiki0 page create "projects/wiki0" --body "Local-first [[topics/memory]]." --root ./my-wiki
18
- wiki0 plan --source_type codebase --scope "current repository" --sources README.md,package.json
19
- wiki0 extract docs/guide.md --root ./my-wiki
20
- wiki0 sync docs --root ./my-wiki
21
- wiki0 index --root ./my-wiki
22
- wiki0 status --root ./my-wiki
23
- wiki0 search "memory" --root ./my-wiki
24
- wiki0 context "what is wiki0?" --root ./my-wiki
25
- wiki0 show topics/memory.md:12 --root ./my-wiki
26
- wiki0 lint --root ./my-wiki
27
- wiki0 graph --root ./my-wiki
28
- wiki0 facts add "Markdown is source of truth" --category decision --confidence high --source decisions/storage.md:12 --root ./my-wiki
29
- wiki0 facts list --root ./my-wiki
30
- wiki0 topics --root ./my-wiki
31
- wiki0 events --root ./my-wiki
32
- wiki0 review --root ./my-wiki
15
+ wiki0 index # index the project docs
16
+ wiki0 status # index path and staleness
17
+ wiki0 search "query" [--limit 5] # one cited section per document
18
+ wiki0 show <target> [--tokens 2000] [--neighbours 1]
19
+ wiki0 context "query" # top sections as cited Markdown
20
+ wiki0 lint # broken links and anchors
21
+ wiki0 graph # documents and links
22
+ wiki0 documents # outline and link counts per document
23
+ wiki0 backlinks <path-or-title>
24
+ wiki0 ui [--no-open] [--stop] # browse the docs in a local web app
33
25
  ```
34
26
 
27
+ `show` targets: `path:12`, `path:12-40`, `path#heading`, `path` or a
28
+ document title. When the text is longer than the token budget, the
29
+ output ends with the range to read next.
30
+
31
+ To show a user this project's docs, an agent runs `npx @wiki0/cli ui`:
32
+ it prints the URL and returns, and a second run reuses the open
33
+ server. Flags: [`@wiki0/ui`](../ui/README.md).
34
+
35
+ Every command takes `--root`; by default the project root is the
36
+ nearest folder with `.git` or `wiki0.toml`. `lint` exits with code 1
37
+ when it finds errors.
38
+
35
39
  ## Output
36
40
 
37
- Most commands return JSON so agents and shell scripts can consume the
38
- results. `wiki0 context` returns Markdown by default and supports
39
- `--json` for structured output.
41
+ `show` and `context` print Markdown (`--json` for structured output).
42
+ `ui` prints the URL. The other commands print JSON.
package/dist/actions.d.ts CHANGED
@@ -1,8 +1 @@
1
- import { type WikiFrontmatter } from '@wiki0/core';
2
- export declare function init_workspace(root: string): string;
3
- export declare function read_markdown_input(options: {
4
- file?: string;
5
- body?: string;
6
- }): string;
7
- export declare function parse_frontmatter_json(data: string): WikiFrontmatter;
8
1
  export declare function print_json(value: unknown): void;
package/dist/actions.js CHANGED
@@ -1,29 +1,3 @@
1
- import { schema_sql } from '@wiki0/core';
2
- import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
3
- import { join } from 'node:path';
4
- export function init_workspace(root) {
5
- for (const dir of [
6
- 'wiki/inbox',
7
- 'wiki/decisions',
8
- 'wiki/people',
9
- 'wiki/projects',
10
- 'wiki/topics',
11
- '.wiki0',
12
- ]) {
13
- mkdirSync(join(root, dir), { recursive: true });
14
- }
15
- writeFileSync(join(root, 'wiki/index.md'), '# Wiki0\n\nStart here. Link pages with `[[topics/example]]`.\n', { flag: 'wx' });
16
- writeFileSync(join(root, '.wiki0/schema.sql'), schema_sql);
17
- return `Created wiki0 workspace at ${root}`;
18
- }
19
- export function read_markdown_input(options) {
20
- return options.file
21
- ? readFileSync(options.file, 'utf-8')
22
- : (options.body ?? '');
23
- }
24
- export function parse_frontmatter_json(data) {
25
- return JSON.parse(data);
26
- }
27
1
  export function print_json(value) {
28
2
  console.log(JSON.stringify(value, null, 2));
29
3
  }
@@ -1 +1 @@
1
- {"version":3,"file":"actions.js","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAwB,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,UAAU,cAAc,CAAC,IAAY;IAC1C,KAAK,MAAM,GAAG,IAAI;QACjB,YAAY;QACZ,gBAAgB;QAChB,aAAa;QACb,eAAe;QACf,aAAa;QACb,QAAQ;KACR,EAAE,CAAC;QACH,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACjD,CAAC;IAED,aAAa,CACZ,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,EAC3B,gEAAgE,EAChE,EAAE,IAAI,EAAE,IAAI,EAAE,CACd,CAAC;IACF,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,mBAAmB,CAAC,EAAE,UAAU,CAAC,CAAC;IAC3D,OAAO,8BAA8B,IAAI,EAAE,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAGnC;IACA,OAAO,OAAO,CAAC,IAAI;QAClB,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;QACrC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,sBAAsB,CACrC,IAAY;IAEZ,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAoB,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAc;IACxC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC7C,CAAC"}
1
+ {"version":3,"file":"actions.js","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,UAAU,CAAC,KAAc;IACxC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC7C,CAAC"}
package/dist/commands.js CHANGED
@@ -1,544 +1,215 @@
1
- import { add_fact, append_page, backlinks_for_page, create_page, get_wiki_context, graph_wiki, index_status, index_wiki, lint_wiki, list_facts, list_topic_threads, list_wiki_events, parse_document, plan_wiki, read_page, review_wiki, search_wiki, set_page_frontmatter, show_wiki_chunk, sync_documents, } from '@wiki0/core';
1
+ import { backlinks_for_page, get_wiki_context, graph_wiki, index_status, index_wiki, lint_wiki, list_documents, search, show, } from '@wiki0/core';
2
2
  import { defineCommand } from 'citty';
3
- import { isAbsolute, resolve } from 'node:path';
4
- import { init_workspace, parse_frontmatter_json, print_json, read_markdown_input, } from './actions.js';
5
- function parse_wiki_source_type(value) {
6
- const source_type = typeof value === 'string' ? value : 'general';
7
- if (source_type === 'general' ||
8
- source_type === 'codebase' ||
9
- source_type === 'docs' ||
10
- source_type === 'research' ||
11
- source_type === 'notes') {
12
- return source_type;
13
- }
14
- throw new Error(`Invalid wiki source type: ${source_type}`);
15
- }
16
- function parse_sources(value) {
17
- if (typeof value !== 'string' || value.trim().length === 0) {
18
- return undefined;
19
- }
20
- return value
21
- .split(',')
22
- .map((source) => source.trim())
23
- .filter(Boolean);
24
- }
25
- function parse_optional_sources(value) {
26
- return parse_sources(value);
27
- }
28
- function resolve_cli_source(root, source) {
29
- return isAbsolute(source) ? source : resolve(root, source);
30
- }
31
- function parse_fact_confidence(value) {
32
- const confidence = typeof value === 'string' ? value : 'unknown';
33
- if (confidence === 'unknown' ||
34
- confidence === 'low' ||
35
- confidence === 'medium' ||
36
- confidence === 'high' ||
37
- confidence === 'verified') {
38
- return confidence;
39
- }
40
- throw new Error(`Invalid fact confidence: ${confidence}`);
41
- }
3
+ import { print_json } from './actions.js';
4
+ import { run_ui } from './ui.js';
5
+ const root_arg = {
6
+ root: {
7
+ type: 'string',
8
+ description: 'Project root (default: nearest folder with .git)',
9
+ default: '.',
10
+ },
11
+ };
12
+ const json_arg = {
13
+ json: {
14
+ type: 'boolean',
15
+ description: 'Output JSON instead of Markdown',
16
+ },
17
+ };
42
18
  export const main = defineCommand({
43
19
  meta: {
44
20
  name: 'wiki0',
45
- description: 'Local-first Markdown wiki memory for humans and agents',
21
+ description: 'Search a project’s docs and get the right section with a path:line citation',
46
22
  },
47
23
  subCommands: {
48
- init: defineCommand({
49
- meta: { description: 'Create a wiki0 folder structure' },
50
- args: {
51
- path: {
52
- type: 'positional',
53
- description: 'Wiki root path',
54
- default: '.',
55
- },
56
- },
57
- run({ args }) {
58
- console.log(init_workspace(String(args.path ?? '.')));
59
- },
60
- }),
61
- page: defineCommand({
62
- meta: {
63
- description: 'Create, read, append, and tag wiki pages',
64
- },
65
- subCommands: {
66
- create: defineCommand({
67
- meta: { description: 'Create a wiki page' },
68
- args: {
69
- title: {
70
- type: 'positional',
71
- required: true,
72
- description: 'Page title or path',
73
- },
74
- body: { type: 'string', description: 'Markdown body' },
75
- file: {
76
- type: 'string',
77
- description: 'Read Markdown body from a file',
78
- },
79
- root: {
80
- type: 'string',
81
- description: 'Wiki root path',
82
- default: '.',
83
- },
84
- overwrite: {
85
- type: 'boolean',
86
- description: 'Overwrite an existing page',
87
- },
88
- },
89
- run({ args }) {
90
- const page = create_page(String(args.title), read_markdown_input(args), {
91
- root: String(args.root ?? '.'),
92
- overwrite: Boolean(args.overwrite),
93
- });
94
- print_json(page);
95
- },
96
- }),
97
- read: defineCommand({
98
- meta: { description: 'Read a wiki page' },
99
- args: {
100
- title: {
101
- type: 'positional',
102
- required: true,
103
- description: 'Page title or path',
104
- },
105
- root: {
106
- type: 'string',
107
- description: 'Wiki root path',
108
- default: '.',
109
- },
110
- },
111
- run({ args }) {
112
- print_json(read_page(String(args.title), String(args.root ?? '.')));
113
- },
114
- }),
115
- frontmatter: defineCommand({
116
- meta: {
117
- description: 'Set YAML frontmatter on a wiki page',
118
- },
119
- args: {
120
- title: {
121
- type: 'positional',
122
- required: true,
123
- description: 'Page title or path',
124
- },
125
- data: {
126
- type: 'string',
127
- required: true,
128
- description: 'Frontmatter as a JSON object',
129
- },
130
- root: {
131
- type: 'string',
132
- description: 'Wiki root path',
133
- default: '.',
134
- },
135
- merge: {
136
- type: 'boolean',
137
- description: 'Merge with existing frontmatter',
138
- },
139
- },
140
- run({ args }) {
141
- const page = set_page_frontmatter(String(args.title), parse_frontmatter_json(args.data), {
142
- root: String(args.root ?? '.'),
143
- merge: Boolean(args.merge),
144
- });
145
- print_json(page);
146
- },
147
- }),
148
- append: defineCommand({
149
- meta: { description: 'Append Markdown to a wiki page' },
150
- args: {
151
- title: {
152
- type: 'positional',
153
- required: true,
154
- description: 'Page title or path',
155
- },
156
- body: {
157
- type: 'string',
158
- description: 'Markdown body to append',
159
- },
160
- file: {
161
- type: 'string',
162
- description: 'Read Markdown body from a file',
163
- },
164
- root: {
165
- type: 'string',
166
- description: 'Wiki root path',
167
- default: '.',
168
- },
169
- },
170
- run({ args }) {
171
- const page = append_page(String(args.title), read_markdown_input(args), String(args.root ?? '.'));
172
- print_json(page);
173
- },
174
- }),
175
- },
176
- }),
177
- extract: defineCommand({
178
- meta: {
179
- description: 'Extract normalized text and metadata from a source document',
180
- },
181
- args: {
182
- source: {
183
- type: 'positional',
184
- required: true,
185
- description: 'Source document path',
186
- },
187
- root: {
188
- type: 'string',
189
- description: 'Wiki root path for relative sources',
190
- default: '.',
191
- },
192
- },
24
+ index: defineCommand({
25
+ meta: { description: 'Index the project docs' },
26
+ args: { ...root_arg },
193
27
  async run({ args }) {
194
- print_json(await parse_document(resolve_cli_source(String(args.root ?? '.'), String(args.source))));
28
+ print_json(await index_wiki(String(args.root)));
195
29
  },
196
30
  }),
197
- sync: defineCommand({
31
+ status: defineCommand({
198
32
  meta: {
199
- description: 'Sync source documents into wiki source pages, then index the wiki',
33
+ description: 'Show where the index is and whether it is stale',
200
34
  },
201
- args: {
202
- sources: {
203
- type: 'positional',
204
- required: true,
205
- description: 'Comma-separated source paths or directories',
206
- },
207
- root: {
208
- type: 'string',
209
- description: 'Wiki root path',
210
- default: '.',
211
- },
212
- overwrite: {
213
- type: 'boolean',
214
- description: 'Overwrite existing synced source pages',
215
- },
216
- include: {
217
- type: 'string',
218
- description: 'Comma-separated glob patterns to include during recursive sync',
219
- },
220
- ignore: {
221
- type: 'string',
222
- description: 'Comma-separated glob patterns to ignore during recursive sync',
223
- },
224
- noFacts: {
225
- type: 'boolean',
226
- description: 'Skip deriving SQLite facts from source text',
227
- },
228
- proposePages: {
229
- type: 'boolean',
230
- description: 'Generate proposed concept/workflow pages from source text',
231
- },
232
- noIndex: {
233
- type: 'boolean',
234
- description: 'Skip rebuilding the SQLite index after sync',
235
- },
236
- },
237
- async run({ args }) {
238
- print_json(await sync_documents({
239
- root: String(args.root ?? '.'),
240
- sources: parse_sources(args.sources) ?? [],
241
- overwrite: Boolean(args.overwrite),
242
- index: !args.noIndex,
243
- include: parse_optional_sources(args.include),
244
- ignore: parse_optional_sources(args.ignore),
245
- derive_facts: !args.noFacts,
246
- propose_pages: Boolean(args.proposePages),
247
- }));
35
+ args: { ...root_arg },
36
+ run({ args }) {
37
+ print_json(index_status(String(args.root)));
248
38
  },
249
39
  }),
250
- plan: defineCommand({
40
+ search: defineCommand({
251
41
  meta: {
252
- description: 'Print a deterministic workflow and starter page plan for building a wiki',
42
+ description: 'Search the docs; one cited section per document, most authoritative first',
253
43
  },
254
44
  args: {
255
- source_type: {
256
- type: 'string',
257
- description: 'general, codebase, docs, research, or notes',
258
- default: 'general',
259
- },
260
- scope: {
45
+ query: { type: 'positional', required: true },
46
+ ...root_arg,
47
+ limit: {
261
48
  type: 'string',
262
- description: 'Source scope description',
49
+ description: 'Maximum number of documents',
50
+ default: '5',
263
51
  },
264
- sources: {
265
- type: 'string',
266
- description: 'Comma-separated source paths or URLs',
52
+ includeSuperseded: {
53
+ type: 'boolean',
54
+ description: 'Keep superseded documents in results',
55
+ default: true,
267
56
  },
268
57
  },
269
58
  run({ args }) {
270
- print_json(plan_wiki({
271
- source_type: parse_wiki_source_type(args.source_type),
272
- scope: args.scope ? String(args.scope) : undefined,
273
- sources: parse_sources(args.sources),
59
+ print_json(search(String(args.query), String(args.root), {
60
+ limit: Number(args.limit),
61
+ include_superseded: args.includeSuperseded !== false,
274
62
  }));
275
63
  },
276
64
  }),
277
- facts: defineCommand({
278
- meta: { description: 'Add and list structured wiki facts' },
279
- subCommands: {
280
- add: defineCommand({
281
- meta: { description: 'Add a structured wiki fact' },
282
- args: {
283
- summary: { type: 'positional', required: true },
284
- category: {
285
- type: 'string',
286
- description: 'Fact category',
287
- default: 'note',
288
- },
289
- body: { type: 'string', description: 'Fact details' },
290
- confidence: {
291
- type: 'string',
292
- description: 'unknown, low, medium, high, or verified',
293
- default: 'unknown',
294
- },
295
- page: {
296
- type: 'string',
297
- description: 'Related page title or path',
298
- },
299
- source: {
300
- type: 'string',
301
- description: 'Source page or page:line target for provenance',
302
- },
303
- sourceQuote: {
304
- type: 'string',
305
- description: 'Exact source quote for provenance',
306
- },
307
- root: {
308
- type: 'string',
309
- description: 'Wiki root path',
310
- default: '.',
311
- },
312
- },
313
- run({ args }) {
314
- print_json(add_fact({
315
- root: String(args.root ?? '.'),
316
- page: args.page ? String(args.page) : undefined,
317
- category: String(args.category ?? 'note'),
318
- summary: String(args.summary),
319
- body: args.body ? String(args.body) : undefined,
320
- confidence: parse_fact_confidence(args.confidence),
321
- source: args.source ? String(args.source) : undefined,
322
- source_quote: args.sourceQuote
323
- ? String(args.sourceQuote)
324
- : undefined,
325
- }));
326
- },
327
- }),
328
- list: defineCommand({
329
- meta: { description: 'List structured wiki facts' },
330
- args: {
331
- category: {
332
- type: 'string',
333
- description: 'Filter by category',
334
- },
335
- root: {
336
- type: 'string',
337
- description: 'Wiki root path',
338
- default: '.',
339
- },
340
- },
341
- run({ args }) {
342
- print_json(list_facts(String(args.root ?? '.'), args.category ? String(args.category) : undefined));
343
- },
344
- }),
65
+ show: defineCommand({
66
+ meta: {
67
+ description: 'Show a cited section: path:line, path:start-end, path#heading, path or title',
345
68
  },
346
- }),
347
- events: defineCommand({
348
- meta: { description: 'List recent wiki operation log events' },
349
69
  args: {
350
- root: {
70
+ target: { type: 'positional', required: true },
71
+ ...root_arg,
72
+ tokens: {
351
73
  type: 'string',
352
- description: 'Wiki root path',
353
- default: '.',
74
+ description: 'Token budget for the returned text',
75
+ default: '2000',
354
76
  },
355
- limit: {
77
+ neighbours: {
356
78
  type: 'string',
357
- description: 'Maximum number of events',
358
- default: '50',
79
+ description: 'Also include this many sections either side',
80
+ default: '0',
359
81
  },
82
+ ...json_arg,
360
83
  },
361
84
  run({ args }) {
362
- print_json(list_wiki_events(String(args.root ?? '.'), Number(args.limit ?? 50)));
85
+ const result = show(String(args.target), String(args.root), {
86
+ token_budget: Number(args.tokens),
87
+ neighbours: Number(args.neighbours),
88
+ });
89
+ if (args.json) {
90
+ print_json(result);
91
+ return;
92
+ }
93
+ if (!result) {
94
+ console.log('No indexed section found.');
95
+ process.exitCode = 1;
96
+ return;
97
+ }
98
+ console.log(`Source: ${result.citation}`);
99
+ for (const warning of result.warnings) {
100
+ console.log(`Warning: ${warning}`);
101
+ }
102
+ if (result.superseded_by) {
103
+ console.log(`Superseded by: ${result.superseded_by}`);
104
+ }
105
+ console.log('');
106
+ console.log(result.markdown);
107
+ if (result.next) {
108
+ console.log(`\nMore: wiki0 show ${result.next}`);
109
+ }
363
110
  },
364
111
  }),
365
- topics: defineCommand({
112
+ context: defineCommand({
366
113
  meta: {
367
- description: 'List lightweight topic threads from indexed chunks',
114
+ description: 'Search and return the top sections as cited Markdown',
368
115
  },
369
116
  args: {
370
- root: {
371
- type: 'string',
372
- description: 'Wiki root path',
373
- default: '.',
374
- },
117
+ query: { type: 'positional', required: true },
118
+ ...root_arg,
375
119
  limit: {
376
120
  type: 'string',
377
- description: 'Maximum number of topics',
378
- default: '50',
121
+ description: 'Maximum number of sections',
122
+ default: '3',
379
123
  },
124
+ ...json_arg,
380
125
  },
381
126
  run({ args }) {
382
- print_json(list_topic_threads(String(args.root ?? '.'), Number(args.limit ?? 50)));
127
+ const result = get_wiki_context(String(args.query), String(args.root), Number(args.limit));
128
+ console.log(args.json
129
+ ? JSON.stringify(result, null, 2)
130
+ : result.markdown);
383
131
  },
384
132
  }),
385
- index: defineCommand({
386
- meta: { description: 'Index Markdown pages into SQLite' },
387
- args: {
388
- root: {
389
- type: 'string',
390
- description: 'Wiki root path',
391
- default: '.',
392
- },
133
+ lint: defineCommand({
134
+ meta: {
135
+ description: 'Report broken links, missing headings and other link problems',
393
136
  },
137
+ args: { ...root_arg },
394
138
  run({ args }) {
395
- print_json(index_wiki(String(args.root ?? '.')));
139
+ const result = lint_wiki(String(args.root));
140
+ print_json(result);
141
+ if (!result.ok)
142
+ process.exitCode = 1;
396
143
  },
397
144
  }),
398
- status: defineCommand({
399
- meta: { description: 'Show index freshness and schema status' },
400
- args: {
401
- root: {
402
- type: 'string',
403
- description: 'Wiki root path',
404
- default: '.',
405
- },
406
- },
145
+ graph: defineCommand({
146
+ meta: { description: 'Output the document link graph' },
147
+ args: { ...root_arg },
407
148
  run({ args }) {
408
- print_json(index_status(String(args.root ?? '.')));
149
+ print_json(graph_wiki(String(args.root)));
409
150
  },
410
151
  }),
411
- search: defineCommand({
412
- meta: { description: 'Search indexed wiki pages' },
413
- args: {
414
- query: { type: 'positional', required: true },
415
- root: {
416
- type: 'string',
417
- description: 'Wiki root path',
418
- default: '.',
419
- },
420
- limit: {
421
- type: 'string',
422
- description: 'Maximum number of results',
423
- default: '10',
424
- },
152
+ documents: defineCommand({
153
+ meta: {
154
+ description: 'List indexed documents with outlines and link counts',
425
155
  },
156
+ args: { ...root_arg },
426
157
  run({ args }) {
427
- print_json(search_wiki(String(args.query), String(args.root ?? '.'), Number(args.limit ?? 10)));
158
+ print_json(list_documents(String(args.root)));
428
159
  },
429
160
  }),
430
- show: defineCommand({
431
- meta: {
432
- description: 'Show the indexed wiki chunk for a page or page:line target',
433
- },
161
+ backlinks: defineCommand({
162
+ meta: { description: 'List documents that link to a document' },
434
163
  args: {
435
- target: {
436
- type: 'positional',
437
- required: true,
438
- description: 'Page path/title, optionally with :line',
439
- },
440
- root: {
441
- type: 'string',
442
- description: 'Wiki root path',
443
- default: '.',
444
- },
445
- json: {
446
- type: 'boolean',
447
- description: 'Output structured JSON instead of Markdown',
448
- },
164
+ target: { type: 'positional', required: true },
165
+ ...root_arg,
449
166
  },
450
167
  run({ args }) {
451
- const result = show_wiki_chunk(String(args.target), String(args.root ?? '.'));
452
- if (args.json)
453
- print_json(result);
454
- else
455
- console.log(result?.body ?? 'No indexed chunk found.');
168
+ print_json(backlinks_for_page(String(args.target), String(args.root)));
456
169
  },
457
170
  }),
458
- context: defineCommand({
171
+ ui: defineCommand({
459
172
  meta: {
460
- description: 'Retrieve indexed context with citations',
173
+ description: 'Open the project docs in the browser; prints the URL and reuses a running server',
461
174
  },
462
175
  args: {
463
- query: { type: 'positional', required: true },
464
- root: {
176
+ ...root_arg,
177
+ host: {
465
178
  type: 'string',
466
- description: 'Wiki root path',
467
- default: '.',
179
+ description: 'Host to bind (default: 127.0.0.1)',
468
180
  },
469
- limit: {
181
+ port: {
470
182
  type: 'string',
471
- description: 'Maximum number of context results',
472
- default: '5',
183
+ description: 'Port (default: 4100 or WIKI0_UI_PORT; a busy port falls back)',
473
184
  },
474
- json: {
185
+ open: {
475
186
  type: 'boolean',
476
- description: 'Output structured JSON instead of Markdown',
477
- },
478
- },
479
- run({ args }) {
480
- const result = get_wiki_context(String(args.query), String(args.root ?? '.'), Number(args.limit ?? 5));
481
- console.log(args.json
482
- ? JSON.stringify(result, null, 2)
483
- : result.markdown);
484
- },
485
- }),
486
- graph: defineCommand({
487
- meta: { description: 'Output indexed wiki graph data' },
488
- args: {
489
- root: {
490
- type: 'string',
491
- description: 'Wiki root path',
492
- default: '.',
187
+ description: 'Open a browser (--no-open to only print the URL)',
188
+ default: true,
493
189
  },
494
- },
495
- run({ args }) {
496
- print_json(graph_wiki(String(args.root ?? '.')));
497
- },
498
- }),
499
- lint: defineCommand({
500
- meta: { description: 'Lint wiki links and duplicate names' },
501
- args: {
502
- root: {
503
- type: 'string',
504
- description: 'Wiki root path',
505
- default: '.',
190
+ detach: {
191
+ type: 'boolean',
192
+ description: 'Run in the background and return (default when not in a terminal)',
506
193
  },
507
- },
508
- run({ args }) {
509
- const result = lint_wiki(String(args.root ?? '.'));
510
- print_json(result);
511
- if (!result.ok)
512
- process.exitCode = 1;
513
- },
514
- }),
515
- backlinks: defineCommand({
516
- meta: { description: 'List resolved backlinks for a page' },
517
- args: {
518
- title: { type: 'positional', required: true },
519
- root: {
520
- type: 'string',
521
- description: 'Wiki root path',
522
- default: '.',
194
+ foreground: {
195
+ type: 'boolean',
196
+ description: 'Stay in the foreground until Ctrl-C',
523
197
  },
524
- },
525
- run({ args }) {
526
- print_json(backlinks_for_page(String(args.title), String(args.root ?? '.')));
527
- },
528
- }),
529
- review: defineCommand({
530
- meta: {
531
- description: 'List pages marked for review',
532
- },
533
- args: {
534
- root: {
535
- type: 'string',
536
- description: 'Wiki root path',
537
- default: '.',
198
+ stop: {
199
+ type: 'boolean',
200
+ description: 'Stop the server for this project',
538
201
  },
539
202
  },
540
- run({ args }) {
541
- print_json(review_wiki(String(args.root ?? '.')));
203
+ async run({ args }) {
204
+ await run_ui({
205
+ root: String(args.root),
206
+ host: args.host,
207
+ port: args.port,
208
+ open: args.open,
209
+ detach: args.detach,
210
+ foreground: args.foreground,
211
+ stop: args.stop,
212
+ });
542
213
  },
543
214
  }),
544
215
  },
@@ -1 +1 @@
1
- {"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"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"}
package/dist/ui.d.ts ADDED
@@ -0,0 +1,12 @@
1
+ import type { LaunchOptions } from '@wiki0/ui';
2
+ export type UiArgs = {
3
+ root: string;
4
+ host?: string;
5
+ port?: string;
6
+ open?: boolean;
7
+ detach?: boolean;
8
+ foreground?: boolean;
9
+ stop?: boolean;
10
+ };
11
+ export declare function ui_launch_options(args: UiArgs, parse_port: (value: string | undefined) => number | undefined, env?: NodeJS.ProcessEnv): LaunchOptions;
12
+ export declare function run_ui(args: UiArgs): Promise<void>;
package/dist/ui.js ADDED
@@ -0,0 +1,25 @@
1
+ // Maps `wiki0 ui` flags to launch options. Detach is left unset
2
+ // unless asked for, so @wiki0/ui can detach when stdout is not a
3
+ // terminal, as when an agent runs the command.
4
+ export function ui_launch_options(args, parse_port, env = process.env) {
5
+ return {
6
+ root: args.root,
7
+ host: args.host || undefined,
8
+ port: parse_port(args.port || env.WIKI0_UI_PORT),
9
+ open: args.open !== false,
10
+ detach: args.foreground ? false : args.detach ? true : undefined,
11
+ stop: args.stop === true,
12
+ };
13
+ }
14
+ export async function run_ui(args) {
15
+ // Loaded on use, so other commands don't pay for the server.
16
+ const { launch_ui, parse_port } = await import('@wiki0/ui');
17
+ try {
18
+ await launch_ui(ui_launch_options(args, parse_port));
19
+ }
20
+ catch (error) {
21
+ console.error(error instanceof Error ? error.message : error);
22
+ process.exitCode = 1;
23
+ }
24
+ }
25
+ //# sourceMappingURL=ui.js.map
package/dist/ui.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"AAYA,gEAAgE;AAChE,iEAAiE;AACjE,+CAA+C;AAC/C,MAAM,UAAU,iBAAiB,CAChC,IAAY,EACZ,UAA6D,EAC7D,GAAG,GAAsB,OAAO,CAAC,GAAG;IAEpC,OAAO;QACN,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,SAAS;QAC5B,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,aAAa,CAAC;QAChD,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK,KAAK;QACzB,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;QAChE,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK,IAAI;KACxB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAY;IACxC,6DAA6D;IAC7D,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;IAC5D,IAAI,CAAC;QACJ,MAAM,SAAS,CAAC,iBAAiB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC;IACtD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAC9D,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACtB,CAAC;AACF,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function serve_viewer(root: string, host: string, port: number, open: boolean): void;
package/dist/viewer.js ADDED
@@ -0,0 +1,186 @@
1
+ import { backlinks_for_page, graph_wiki, index_status, index_wiki, read_page, review_wiki, search_wiki, } from '@wiki0/core';
2
+ import { spawn } from 'node:child_process';
3
+ import { createServer } from 'node:http';
4
+ function send_json(response, status_code, data) {
5
+ response.writeHead(status_code, {
6
+ 'content-type': 'application/json; charset=utf-8',
7
+ 'cache-control': 'no-store',
8
+ });
9
+ response.end(JSON.stringify(data));
10
+ }
11
+ function send_html(response, html) {
12
+ response.writeHead(200, {
13
+ 'content-type': 'text/html; charset=utf-8',
14
+ 'cache-control': 'no-store',
15
+ });
16
+ response.end(html);
17
+ }
18
+ function open_url(url) {
19
+ const command = process.platform === 'darwin'
20
+ ? 'open'
21
+ : process.platform === 'win32'
22
+ ? 'cmd'
23
+ : 'xdg-open';
24
+ const args = process.platform === 'win32' ? ['/c', 'start', '', url] : [url];
25
+ const child = spawn(command, args, { detached: true, stdio: 'ignore' });
26
+ child.unref();
27
+ }
28
+ function read_view_state(root, url) {
29
+ const status = index_status(root);
30
+ if (status.stale)
31
+ index_wiki(root);
32
+ const graph = graph_wiki(root);
33
+ const review = review_wiki(root);
34
+ const query = url.searchParams.get('q')?.trim() ?? '';
35
+ const search = query ? search_wiki(query, root, 8) : [];
36
+ const selected_path = url.searchParams.get('page') ?? graph.nodes[0]?.path ?? null;
37
+ let selected_page = null;
38
+ let backlinks = [];
39
+ if (selected_path) {
40
+ try {
41
+ const selected_title = selected_path.replace(/\.md$/u, '');
42
+ selected_page = read_page(selected_title, root);
43
+ backlinks = backlinks_for_page(selected_title, root);
44
+ }
45
+ catch {
46
+ selected_page = null;
47
+ }
48
+ }
49
+ return {
50
+ root,
51
+ status: status.stale ? index_status(root) : status,
52
+ graph,
53
+ review,
54
+ query,
55
+ search,
56
+ selected_path,
57
+ selected_page,
58
+ backlinks,
59
+ };
60
+ }
61
+ function viewer_html() {
62
+ return `<!doctype html>
63
+ <html lang="en">
64
+ <head>
65
+ <meta charset="utf-8" />
66
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
67
+ <title>wiki0 viewer</title>
68
+ <style>
69
+ :root{color-scheme:light dark;font-family:Inter,ui-sans-serif,system-ui,sans-serif;background:#0f172a;color:#e2e8f0}body{margin:0}main{padding:24px;display:grid;gap:16px}header{display:flex;justify-content:space-between;gap:16px;align-items:end;flex-wrap:wrap}.muted{color:#94a3b8}.cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:12px}.card{background:#111827;border:1px solid #334155;border-radius:14px;padding:16px;box-shadow:0 12px 40px #02061740}.value{font-size:28px;font-weight:700}input,button{border-radius:10px;border:1px solid #475569;background:#020617;color:#e2e8f0;padding:10px 12px}button{cursor:pointer}button:hover{border-color:#93c5fd}.layout{display:grid;grid-template-columns:minmax(0,1fr) 380px;gap:16px}.graph{min-height:520px;overflow:hidden}.side{display:grid;gap:16px;align-content:start}.page-list{display:grid;gap:6px;max-height:220px;overflow:auto}.page-list button{text-align:left}.selected{border-color:#38bdf8;background:#082f49}svg{width:100%;height:520px}.node{fill:#38bdf8;cursor:pointer}.node.selected{fill:#f59e0b}.edge{stroke:#64748b;stroke-width:1.4}.edge.unresolved{stroke:#f97316;stroke-dasharray:4 4}.label{fill:#cbd5e1;font-size:12px;pointer-events:none}pre{white-space:pre-wrap;max-height:420px;overflow:auto}.result{border-top:1px solid #334155;padding:10px 0}@media(max-width:900px){.layout{grid-template-columns:1fr}}
70
+ </style>
71
+ </head>
72
+ <body>
73
+ <main>
74
+ <header><div><h1>wiki0 viewer</h1><p id="root" class="muted"></p></div><form id="search"><input id="q" name="q" placeholder="Search wiki" /><button>Search</button></form></header>
75
+ <section class="cards"><div class="card"><div class="muted">Pages</div><div id="pages" class="value">0</div></div><div class="card"><div class="muted">Edges</div><div id="edges" class="value">0</div></div><div class="card"><div class="muted">Unresolved</div><div id="unresolved" class="value">0</div></div><div class="card"><div class="muted">Review</div><div id="review" class="value">0</div></div></section>
76
+ <section class="layout"><div class="card graph"><svg id="graph" role="img" aria-label="Wiki graph"></svg></div><aside class="side"><div class="card"><h2>Pages</h2><div id="page-list" class="page-list"></div></div><div class="card"><h2 id="page-title">Select a page</h2><p id="page-path" class="muted"></p><pre id="page-content"></pre><div id="backlinks"></div></div></aside></section>
77
+ <section id="search-results" class="card" hidden><h2>Search results</h2><div id="results"></div></section>
78
+ </main>
79
+ <script>
80
+ const state = { data: null };
81
+ const esc = (value) => String(value ?? '').replace(/[&<>"']/g, (char) => ({'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;',"'":'&#39;'}[char]));
82
+ async function load_state() {
83
+ const params = new URLSearchParams(location.search);
84
+ const response = await fetch('/api/state?' + params.toString());
85
+ state.data = await response.json();
86
+ render_state(state.data);
87
+ }
88
+ function select_page(path) {
89
+ const params = new URLSearchParams(location.search);
90
+ params.set('page', path);
91
+ history.pushState(null, '', '?' + params.toString());
92
+ load_state();
93
+ }
94
+ function render_state(data) {
95
+ document.getElementById('root').textContent = data.root;
96
+ document.getElementById('q').value = data.query;
97
+ document.getElementById('pages').textContent = data.graph.nodes.length;
98
+ document.getElementById('edges').textContent = data.graph.edges.length;
99
+ document.getElementById('unresolved').textContent = data.graph.edges.filter((edge) => edge.status === 'unresolved').length;
100
+ document.getElementById('review').textContent = data.review.length;
101
+ document.getElementById('page-list').innerHTML = data.graph.nodes.map((node) => '<button class="' + (node.path === data.selected_path ? 'selected' : '') + '" type="button" onclick="select_page(' + JSON.stringify(node.path).replace(/"/g, '&quot;') + ')">' + esc(node.title) + '</button>').join('');
102
+ render_graph(data);
103
+ render_page(data);
104
+ render_search(data);
105
+ }
106
+ function render_graph(data) {
107
+ const svg = document.getElementById('graph');
108
+ const nodes = data.graph.nodes;
109
+ const width = svg.clientWidth || 800;
110
+ const height = svg.clientHeight || 520;
111
+ const radius = Math.max(130, Math.min(width, height) / 2 - 70);
112
+ const center_x = width / 2;
113
+ const center_y = height / 2;
114
+ const positions = new Map(nodes.map((node, index) => {
115
+ const angle = (Math.PI * 2 * index) / Math.max(nodes.length, 1) - Math.PI / 2;
116
+ return [node.path, { x: center_x + Math.cos(angle) * radius, y: center_y + Math.sin(angle) * radius }];
117
+ }));
118
+ const edge_markup = data.graph.edges.map((edge) => {
119
+ const from = positions.get(edge.from);
120
+ const to = positions.get(edge.to);
121
+ if (!from || !to) return '';
122
+ return '<line class="edge ' + edge.status + '" x1="' + from.x + '" y1="' + from.y + '" x2="' + to.x + '" y2="' + to.y + '"></line>';
123
+ }).join('');
124
+ const node_markup = nodes.map((node) => {
125
+ const point = positions.get(node.path);
126
+ const selected = node.path === data.selected_path ? ' selected' : '';
127
+ return '<g onclick="select_page(' + JSON.stringify(node.path).replace(/"/g, '&quot;') + ')"><circle class="node' + selected + '" cx="' + point.x + '" cy="' + point.y + '" r="8"></circle><text class="label" x="' + (point.x + 12) + '" y="' + (point.y + 4) + '">' + esc(node.title) + '</text></g>';
128
+ }).join('');
129
+ svg.innerHTML = edge_markup + node_markup;
130
+ }
131
+ function render_page(data) {
132
+ const page = data.selected_page;
133
+ document.getElementById('page-title').textContent = page ? page.title : 'Select a page';
134
+ document.getElementById('page-path').textContent = page ? page.path : '';
135
+ document.getElementById('page-content').textContent = page ? page.content : '';
136
+ document.getElementById('backlinks').innerHTML = '<h3>Backlinks</h3>' + (data.backlinks.length ? data.backlinks.map((link) => '<button type="button" onclick="select_page(' + JSON.stringify(link.path).replace(/"/g, '&quot;') + ')">' + esc(link.title) + '</button>').join(' ') : '<p class="muted">No backlinks.</p>');
137
+ }
138
+ function render_search(data) {
139
+ const section = document.getElementById('search-results');
140
+ section.hidden = !data.query;
141
+ document.getElementById('results').innerHTML = data.search.length ? data.search.map((result) => '<article class="result"><strong>' + esc(result.title) + '</strong><p class="muted">' + esc(result.path) + '</p><p>' + esc(result.snippet) + '</p></article>').join('') : '<p class="muted">No results.</p>';
142
+ }
143
+ document.getElementById('search').addEventListener('submit', (event) => {
144
+ event.preventDefault();
145
+ const params = new URLSearchParams(location.search);
146
+ const q = document.getElementById('q').value.trim();
147
+ if (q) params.set('q', q); else params.delete('q');
148
+ history.pushState(null, '', '?' + params.toString());
149
+ load_state();
150
+ });
151
+ addEventListener('popstate', load_state);
152
+ addEventListener('resize', () => state.data && render_graph(state.data));
153
+ load_state();
154
+ </script>
155
+ </body>
156
+ </html>`;
157
+ }
158
+ export function serve_viewer(root, host, port, open) {
159
+ const server = createServer((request, response) => {
160
+ const url = new URL(request.url ?? '/', `http://${host}:${port}`);
161
+ try {
162
+ if (url.pathname === '/api/state') {
163
+ send_json(response, 200, read_view_state(root, url));
164
+ return;
165
+ }
166
+ if (url.pathname === '/') {
167
+ send_html(response, viewer_html());
168
+ return;
169
+ }
170
+ send_json(response, 404, { error: 'Not found' });
171
+ }
172
+ catch (error) {
173
+ send_json(response, 500, {
174
+ error: error instanceof Error ? error.message : String(error),
175
+ });
176
+ }
177
+ });
178
+ server.listen(port, host, () => {
179
+ const address = `http://${host}:${port}`;
180
+ console.log(`Serving wiki0 viewer for ${root}`);
181
+ console.log(address);
182
+ if (open)
183
+ open_url(address);
184
+ });
185
+ }
186
+ //# sourceMappingURL=viewer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"viewer.js","sourceRoot":"","sources":["../src/viewer.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wiki0/cli",
3
- "version": "0.0.5",
3
+ "version": "0.1.0",
4
4
  "description": "wiki0 command line interface",
5
5
  "homepage": "https://github.com/spences10/wiki0/tree/main/packages/cli#readme",
6
6
  "license": "MIT",
@@ -30,14 +30,15 @@
30
30
  "access": "public"
31
31
  },
32
32
  "dependencies": {
33
- "citty": "^0.2.2",
34
- "@wiki0/core": "0.0.5"
33
+ "@wiki0/core": "0.1.0",
34
+ "@wiki0/ui": "0.1.0",
35
+ "citty": "^0.2.2"
35
36
  },
36
37
  "devDependencies": {
37
- "@types/node": "^25.8.0",
38
- "typescript": "^6.0.3",
39
- "vite-plus": "^0.1.22",
40
- "vitest": "4.1.7"
38
+ "@types/node": "^24.0.0",
39
+ "typescript": "^7.0.2",
40
+ "vite-plus": "1.1.0",
41
+ "vitest": "5.0.3"
41
42
  },
42
43
  "engines": {
43
44
  "node": ">=24.15.0"
@@ -45,6 +46,6 @@
45
46
  "scripts": {
46
47
  "build:self": "vp exec tsc -p tsconfig.build.json && chmod +x dist/index.js",
47
48
  "check:self": "vp exec tsc --noEmit -p tsconfig.json",
48
- "test:self": "vitest run"
49
+ "test:self": "vp test"
49
50
  }
50
51
  }