@djolex999/vir-cli 0.1.0 โ†’ 0.1.1

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/src/state/db.ts DELETED
@@ -1,451 +0,0 @@
1
- import Database from "better-sqlite3";
2
- import { dirname } from "node:path";
3
- import { existsSync, mkdirSync, renameSync } from "node:fs";
4
- import { LEGACY_STATE_PATH, STATE_PATH } from "../config.js";
5
- import type { Category } from "../pipeline/types.js";
6
-
7
- export interface SessionRow {
8
- path: string;
9
- hash: string;
10
- processed_at: string;
11
- skipped: number;
12
- note_paths: string;
13
- error: string | null;
14
- content: string | null;
15
- category: string | null;
16
- topic: string | null;
17
- project: string | null;
18
- confidence: number | null;
19
- started_at: string | null;
20
- }
21
-
22
- export interface EmbeddingRow {
23
- sessionId: string;
24
- topic: string;
25
- category: string;
26
- project: string;
27
- filePath: string;
28
- embedding: number[];
29
- }
30
-
31
- export interface ProjectStats {
32
- total: number;
33
- patterns: number;
34
- gotchas: number;
35
- decisions: number;
36
- tools: number;
37
- avgConfidence: number;
38
- lastSeen: string;
39
- }
40
-
41
- export interface KnowledgeStats {
42
- total: number;
43
- byProject: Record<string, ProjectStats>;
44
- byCategory: Record<string, number>;
45
- avgConfidence: number;
46
- highConf: number;
47
- lowConf: number;
48
- oldestNote: string;
49
- newestNote: string;
50
- }
51
-
52
- export interface DistilledRow {
53
- path: string;
54
- sessionId: string;
55
- startedAt: string | null;
56
- category: Category;
57
- topic: string;
58
- project: string;
59
- confidence: number;
60
- content: string;
61
- }
62
-
63
- interface ColumnInfo {
64
- name: string;
65
- }
66
-
67
- const ADDED_COLUMNS: Array<{ name: string; ddl: string }> = [
68
- { name: "content", ddl: "ALTER TABLE sessions ADD COLUMN content TEXT" },
69
- { name: "category", ddl: "ALTER TABLE sessions ADD COLUMN category TEXT" },
70
- { name: "topic", ddl: "ALTER TABLE sessions ADD COLUMN topic TEXT" },
71
- { name: "project", ddl: "ALTER TABLE sessions ADD COLUMN project TEXT" },
72
- {
73
- name: "confidence",
74
- ddl: "ALTER TABLE sessions ADD COLUMN confidence REAL",
75
- },
76
- {
77
- name: "started_at",
78
- ddl: "ALTER TABLE sessions ADD COLUMN started_at TEXT",
79
- },
80
- {
81
- name: "archived",
82
- ddl: "ALTER TABLE sessions ADD COLUMN archived INTEGER NOT NULL DEFAULT 0",
83
- },
84
- { name: "embedding", ddl: "ALTER TABLE sessions ADD COLUMN embedding TEXT" },
85
- ];
86
-
87
- export class StateDb {
88
- private db: Database.Database;
89
-
90
- constructor(path: string = STATE_PATH) {
91
- const dir = dirname(path);
92
- if (!existsSync(dir)) mkdirSync(dir, { recursive: true });
93
- // One-shot rename: docs always referred to vir.db, but earlier builds
94
- // wrote to state.db. Migrate transparently so deleting `vir.db` does
95
- // what the user expects.
96
- if (
97
- path === STATE_PATH &&
98
- !existsSync(STATE_PATH) &&
99
- existsSync(LEGACY_STATE_PATH)
100
- ) {
101
- try {
102
- renameSync(LEGACY_STATE_PATH, STATE_PATH);
103
- } catch {
104
- // If rename fails (cross-device, perms), fall through โ€” better-sqlite3
105
- // will simply open a fresh DB at STATE_PATH.
106
- }
107
- }
108
- this.db = new Database(path);
109
- this.db.pragma("journal_mode = WAL");
110
- this.db.exec(`
111
- CREATE TABLE IF NOT EXISTS sessions (
112
- path TEXT PRIMARY KEY,
113
- hash TEXT NOT NULL,
114
- processed_at TEXT NOT NULL,
115
- skipped INTEGER NOT NULL DEFAULT 0,
116
- note_paths TEXT NOT NULL DEFAULT '[]',
117
- error TEXT
118
- );
119
- CREATE INDEX IF NOT EXISTS idx_sessions_hash ON sessions(hash);
120
- `);
121
- this.migrate();
122
- }
123
-
124
- private migrate(): void {
125
- const rows = this.db
126
- .prepare("PRAGMA table_info(sessions)")
127
- .all() as ColumnInfo[];
128
- const existing = new Set(rows.map((r) => r.name));
129
- for (const col of ADDED_COLUMNS) {
130
- if (!existing.has(col.name)) this.db.exec(col.ddl);
131
- }
132
- }
133
-
134
- getByPath(path: string): SessionRow | undefined {
135
- return this.db
136
- .prepare("SELECT * FROM sessions WHERE path = ?")
137
- .get(path) as SessionRow | undefined;
138
- }
139
-
140
- isProcessed(path: string, hash: string): boolean {
141
- const row = this.getByPath(path);
142
- return row !== undefined && row.hash === hash;
143
- }
144
-
145
- record(opts: {
146
- path: string;
147
- hash: string;
148
- skipped: boolean;
149
- notePaths: string[];
150
- error?: string | null;
151
- content?: string | null;
152
- category?: string | null;
153
- topic?: string | null;
154
- project?: string | null;
155
- confidence?: number | null;
156
- startedAt?: string | null;
157
- }): void {
158
- this.db
159
- .prepare(
160
- `INSERT INTO sessions (
161
- path, hash, processed_at, skipped, note_paths, error,
162
- content, category, topic, project, confidence, started_at
163
- )
164
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
165
- ON CONFLICT(path) DO UPDATE SET
166
- hash = excluded.hash,
167
- processed_at = excluded.processed_at,
168
- skipped = excluded.skipped,
169
- note_paths = excluded.note_paths,
170
- error = excluded.error,
171
- content = COALESCE(excluded.content, sessions.content),
172
- category = COALESCE(excluded.category, sessions.category),
173
- topic = COALESCE(excluded.topic, sessions.topic),
174
- project = COALESCE(excluded.project, sessions.project),
175
- confidence = COALESCE(excluded.confidence, sessions.confidence),
176
- started_at = COALESCE(excluded.started_at, sessions.started_at)`,
177
- )
178
- .run(
179
- opts.path,
180
- opts.hash,
181
- new Date().toISOString(),
182
- opts.skipped ? 1 : 0,
183
- JSON.stringify(opts.notePaths),
184
- opts.error ?? null,
185
- opts.content ?? null,
186
- opts.category ?? null,
187
- opts.topic ?? null,
188
- opts.project ?? null,
189
- opts.confidence ?? null,
190
- opts.startedAt ?? null,
191
- );
192
- }
193
-
194
- listDistilled(): DistilledRow[] {
195
- const rows = this.db
196
- .prepare(
197
- `SELECT path, content, category, topic, project, confidence, started_at
198
- FROM sessions
199
- WHERE skipped = 0
200
- AND error IS NULL
201
- AND content IS NOT NULL
202
- AND category IS NOT NULL
203
- AND topic IS NOT NULL
204
- AND COALESCE(archived, 0) = 0`,
205
- )
206
- .all() as Array<{
207
- path: string;
208
- content: string;
209
- category: string;
210
- topic: string;
211
- project: string | null;
212
- confidence: number | null;
213
- started_at: string | null;
214
- }>;
215
- return rows.map((r) => ({
216
- path: r.path,
217
- sessionId: deriveSessionId(r.path),
218
- startedAt: r.started_at,
219
- category: r.category as Category,
220
- topic: r.topic,
221
- project: r.project ?? "",
222
- confidence: r.confidence ?? 0,
223
- content: r.content,
224
- }));
225
- }
226
-
227
- stats(): {
228
- total: number;
229
- skipped: number;
230
- distilled: number;
231
- errored: number;
232
- lastRun: string | null;
233
- } {
234
- const total = (
235
- this.db.prepare("SELECT COUNT(*) as c FROM sessions").get() as {
236
- c: number;
237
- }
238
- ).c;
239
- const skipped = (
240
- this.db
241
- .prepare("SELECT COUNT(*) as c FROM sessions WHERE skipped = 1")
242
- .get() as { c: number }
243
- ).c;
244
- const errored = (
245
- this.db
246
- .prepare("SELECT COUNT(*) as c FROM sessions WHERE error IS NOT NULL")
247
- .get() as { c: number }
248
- ).c;
249
- const lastRow = this.db
250
- .prepare(
251
- "SELECT processed_at FROM sessions ORDER BY processed_at DESC LIMIT 1",
252
- )
253
- .get() as { processed_at: string } | undefined;
254
- return {
255
- total,
256
- skipped,
257
- distilled: total - skipped - errored,
258
- errored,
259
- lastRun: lastRow?.processed_at ?? null,
260
- };
261
- }
262
-
263
- getStats(): KnowledgeStats {
264
- const rows = this.db
265
- .prepare(
266
- `SELECT category, project, confidence, started_at
267
- FROM sessions
268
- WHERE skipped = 0
269
- AND error IS NULL
270
- AND content IS NOT NULL
271
- AND COALESCE(archived, 0) = 0`,
272
- )
273
- .all() as Array<{
274
- category: string | null;
275
- project: string | null;
276
- confidence: number | null;
277
- started_at: string | null;
278
- }>;
279
-
280
- const byProject: Record<string, ProjectStats> = {};
281
- const byCategory: Record<string, number> = {
282
- pattern: 0,
283
- gotcha: 0,
284
- decision: 0,
285
- tool: 0,
286
- };
287
- let confSum = 0;
288
- let confCount = 0;
289
- let highConf = 0;
290
- let lowConf = 0;
291
- let oldest: string | null = null;
292
- let newest: string | null = null;
293
-
294
- const projectConfSum: Record<string, number> = {};
295
- const projectConfCount: Record<string, number> = {};
296
-
297
- for (const r of rows) {
298
- const cat = r.category ?? "";
299
- const proj = r.project ?? "unknown";
300
- const conf = typeof r.confidence === "number" ? r.confidence : 0;
301
- const started = r.started_at;
302
-
303
- if (cat in byCategory) byCategory[cat] = (byCategory[cat] ?? 0) + 1;
304
-
305
- let p = byProject[proj];
306
- if (!p) {
307
- p = {
308
- total: 0,
309
- patterns: 0,
310
- gotchas: 0,
311
- decisions: 0,
312
- tools: 0,
313
- avgConfidence: 0,
314
- lastSeen: "",
315
- };
316
- byProject[proj] = p;
317
- projectConfSum[proj] = 0;
318
- projectConfCount[proj] = 0;
319
- }
320
- p.total += 1;
321
- if (cat === "pattern") p.patterns += 1;
322
- else if (cat === "gotcha") p.gotchas += 1;
323
- else if (cat === "decision") p.decisions += 1;
324
- else if (cat === "tool") p.tools += 1;
325
- projectConfSum[proj] = (projectConfSum[proj] ?? 0) + conf;
326
- projectConfCount[proj] = (projectConfCount[proj] ?? 0) + 1;
327
- if (started && (p.lastSeen === "" || started > p.lastSeen)) {
328
- p.lastSeen = started;
329
- }
330
-
331
- confSum += conf;
332
- confCount += 1;
333
- if (conf >= 0.8) highConf += 1;
334
- if (conf < 0.5) lowConf += 1;
335
-
336
- if (started) {
337
- if (oldest === null || started < oldest) oldest = started;
338
- if (newest === null || started > newest) newest = started;
339
- }
340
- }
341
-
342
- for (const proj of Object.keys(byProject)) {
343
- const sum = projectConfSum[proj] ?? 0;
344
- const n = projectConfCount[proj] ?? 0;
345
- const p = byProject[proj];
346
- if (p) p.avgConfidence = n > 0 ? sum / n : 0;
347
- }
348
-
349
- return {
350
- total: confCount,
351
- byProject,
352
- byCategory,
353
- avgConfidence: confCount > 0 ? confSum / confCount : 0,
354
- highConf,
355
- lowConf,
356
- oldestNote: oldest ?? "",
357
- newestNote: newest ?? "",
358
- };
359
- }
360
-
361
- // Embedding storage is keyed by sessionId (the JSONL basename), since callers
362
- // typically have that handy and not the full path. Match suffix-anchored:
363
- // `path LIKE '%/<sessionId>.jsonl'`.
364
- storeEmbedding(sessionId: string, embedding: number[]): void {
365
- this.db
366
- .prepare("UPDATE sessions SET embedding = ? WHERE path LIKE ?")
367
- .run(JSON.stringify(embedding), `%/${sessionId}.jsonl`);
368
- }
369
-
370
- getEmbeddings(vaultRoot: string): EmbeddingRow[] {
371
- const rows = this.db
372
- .prepare(
373
- `SELECT path, embedding, topic, category, project
374
- FROM sessions
375
- WHERE skipped = 0
376
- AND error IS NULL
377
- AND embedding IS NOT NULL
378
- AND COALESCE(archived, 0) = 0
379
- AND topic IS NOT NULL
380
- AND category IS NOT NULL`,
381
- )
382
- .all() as Array<{
383
- path: string;
384
- embedding: string;
385
- topic: string;
386
- category: string;
387
- project: string | null;
388
- }>;
389
-
390
- const out: EmbeddingRow[] = [];
391
- for (const r of rows) {
392
- let vec: number[];
393
- try {
394
- const parsed = JSON.parse(r.embedding) as unknown;
395
- if (!Array.isArray(parsed)) continue;
396
- vec = parsed.map((x) => Number(x));
397
- if (vec.some((n) => !Number.isFinite(n))) continue;
398
- } catch {
399
- continue;
400
- }
401
- const sessionId = deriveSessionId(r.path);
402
- const slug = kebabLite(r.topic);
403
- const suffix = sessionId.slice(0, 8);
404
- const dir = `${r.category}s`;
405
- const filePath = `${vaultRoot}/${dir}/${slug}-${suffix}.md`;
406
- out.push({
407
- sessionId,
408
- topic: r.topic,
409
- category: r.category,
410
- project: r.project ?? "",
411
- filePath,
412
- embedding: vec,
413
- });
414
- }
415
- return out;
416
- }
417
-
418
- archive(path: string): void {
419
- this.db
420
- .prepare("UPDATE sessions SET archived = 1 WHERE path = ?")
421
- .run(path);
422
- }
423
-
424
- updateContent(path: string, content: string): void {
425
- this.db
426
- .prepare("UPDATE sessions SET content = ? WHERE path = ?")
427
- .run(content, path);
428
- }
429
-
430
- reset(): void {
431
- this.db.exec("DELETE FROM sessions");
432
- }
433
-
434
- close(): void {
435
- this.db.close();
436
- }
437
- }
438
-
439
- function deriveSessionId(path: string): string {
440
- const base = path.split("/").pop() ?? path;
441
- return base.replace(/\.jsonl$/, "");
442
- }
443
-
444
- // Local copy of `kebab()` so db.ts doesn't pull in pipeline/writer.ts (which
445
- // would create an import cycle once writer.ts depends on db state).
446
- function kebabLite(s: string): string {
447
- return s
448
- .toLowerCase()
449
- .replace(/[^a-z0-9]+/g, "-")
450
- .replace(/^-+|-+$/g, "");
451
- }
package/src/ui/display.ts DELETED
@@ -1,184 +0,0 @@
1
- import chalk, { type ChalkInstance } from "chalk";
2
- import ora, { type Ora } from "ora";
3
-
4
- // โ”€โ”€โ”€ palette โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
5
-
6
- export const dim = chalk.hex("#4a4a6a");
7
- export const muted = chalk.hex("#6b6b8a");
8
- export const text = chalk.hex("#e8e8f0");
9
- export const accent = chalk.hex("#7c6af7");
10
- export const success = chalk.hex("#4fd1a0");
11
- export const warn = chalk.hex("#f7a26a");
12
- export const errorColor = chalk.hex("#f76a7c");
13
- export const info = chalk.hex("#6ab4f7");
14
-
15
- export const colorForCategory: Record<string, ChalkInstance> = {
16
- pattern: accent,
17
- gotcha: errorColor,
18
- decision: info,
19
- tool: warn,
20
- };
21
-
22
- // โ”€โ”€โ”€ glyphs โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
23
-
24
- export const BULLET = "ยท";
25
- export const ARROW = "โ†’";
26
- export const CHECK = "โœ“";
27
- export const CROSS = "โœ—";
28
- export const DASH = "โ”€";
29
- export const SPINNER = "โ†ป";
30
- export const DIAMOND = "โŸก";
31
- export const WARN_GLYPH = "โš ";
32
- export const UP_ARROW = "โ†‘";
33
-
34
- const DEFAULT_WIDTH = 48;
35
- const BOX_INNER_WIDTH = 42;
36
- const ANSI_RE = /\[[0-9;]*m/g;
37
-
38
- // Strips ANSI so width math is correct against displayed characters.
39
- function visible(s: string): string {
40
- return s.replace(ANSI_RE, "");
41
- }
42
-
43
- export function visibleLength(s: string): number {
44
- return visible(s).length;
45
- }
46
-
47
- function padRightVisible(s: string, width: number): string {
48
- const pad = width - visibleLength(s);
49
- return pad > 0 ? s + " ".repeat(pad) : s;
50
- }
51
-
52
- function padLeftVisible(s: string, width: number): string {
53
- const pad = width - visibleLength(s);
54
- return pad > 0 ? " ".repeat(pad) + s : s;
55
- }
56
-
57
- // โ”€โ”€โ”€ primitives โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
58
-
59
- export function blank(): void {
60
- console.log("");
61
- }
62
-
63
- export function line(s = ""): void {
64
- console.log(s);
65
- }
66
-
67
- export function header(title: string): void {
68
- console.log(`${accent(DIAMOND)} ${dim("vir")} ${text(title)}`);
69
- }
70
-
71
- export function divider(width = DEFAULT_WIDTH): void {
72
- console.log(dim(DASH.repeat(width)));
73
- }
74
-
75
- export interface BoxOptions {
76
- title?: string;
77
- width?: number;
78
- }
79
-
80
- export function box(lines: string[], opts: BoxOptions = {}): void {
81
- const inner = opts.width ?? BOX_INNER_WIDTH;
82
- const titleText = opts.title ? ` ${opts.title} ` : "";
83
- const titlePad = inner - visibleLength(titleText);
84
- const top =
85
- dim("โ”Œ") +
86
- (opts.title
87
- ? dim(DASH) + muted(titleText) + dim(DASH.repeat(Math.max(0, titlePad)))
88
- : dim(DASH.repeat(inner + 2))) +
89
- dim("โ”");
90
- console.log(top);
91
- for (const l of lines) {
92
- console.log(`${dim("โ”‚")} ${padRightVisible(l, inner)} ${dim("โ”‚")}`);
93
- }
94
- console.log(dim("โ””" + DASH.repeat(inner + 2) + "โ”˜"));
95
- }
96
-
97
- export function stat(
98
- label: string,
99
- value: string | number,
100
- color: ChalkInstance = text,
101
- ): void {
102
- console.log(` ${dim(label + ":")} ${color(String(value))}`);
103
- }
104
-
105
- export function row(icon: string, label: string, detail?: string): void {
106
- const left = `${icon} ${label}`;
107
- console.log(detail ? `${left} ${dim(detail)}` : left);
108
- }
109
-
110
- export function spinner(label: string): Ora {
111
- return ora({
112
- text: dim(label),
113
- spinner: "dots",
114
- color: "gray",
115
- });
116
- }
117
-
118
- export interface SummaryStat {
119
- value: number | string;
120
- color?: ChalkInstance;
121
- }
122
-
123
- export function summary(stats: Record<string, SummaryStat>): void {
124
- const parts: string[] = [];
125
- for (const [label, s] of Object.entries(stats)) {
126
- const c = s.color ?? text;
127
- parts.push(`${dim(label)} ${c(String(s.value))}`);
128
- }
129
- console.log(parts.join(dim(` ${BULLET} `)));
130
- }
131
-
132
- // โ”€โ”€โ”€ higher-level helpers โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
133
-
134
- // Wrap plain prose at `width`, splitting only on spaces. No reflow inside
135
- // paragraphs โ€” newlines in the input are preserved as paragraph breaks.
136
- export function wrap(s: string, width = 60): string {
137
- const out: string[] = [];
138
- for (const paragraph of s.split(/\n/)) {
139
- if (paragraph.length === 0) {
140
- out.push("");
141
- continue;
142
- }
143
- const words = paragraph.split(/\s+/);
144
- let line2 = "";
145
- for (const word of words) {
146
- if (line2.length === 0) {
147
- line2 = word;
148
- } else if (line2.length + 1 + word.length <= width) {
149
- line2 += " " + word;
150
- } else {
151
- out.push(line2);
152
- line2 = word;
153
- }
154
- }
155
- if (line2.length > 0) out.push(line2);
156
- }
157
- return out.join("\n");
158
- }
159
-
160
- // Compact note ref โ†’ "<dir>/<basename>" form, dropping any vault prefix the
161
- // caller might have. Used in all command output for consistency.
162
- export function shortNotePath(p: string): string {
163
- // already a category-prefixed ref like "patterns/foo"
164
- const parts = p.replace(/\.md$/, "").split("/");
165
- if (parts.length <= 2) return parts.join("/");
166
- return `${parts[parts.length - 2]}/${parts[parts.length - 1]}`;
167
- }
168
-
169
- // Aligned source-list row: " ยท patterns/foo 0.84"
170
- export function sourceRow(path: string, score: number, leftWidth = 38): void {
171
- const left = ` ${dim(BULLET)} ${text(shortNotePath(path))}`;
172
- const padded = padRightVisible(left, leftWidth);
173
- const s = score.toFixed(2);
174
- console.log(`${padded}${muted(padLeftVisible(s, 6))}`);
175
- }
176
-
177
- export function categoryRow(category: string, topic: string): void {
178
- const color = colorForCategory[category] ?? text;
179
- // pad to 9 so 'decision' (8 chars) still has a visual gap before the topic
180
- const left = `${dim(BULLET)} ${color(category.padEnd(9))}`;
181
- console.log(`${left}${text(topic)}`);
182
- }
183
-
184
- export { ora };
package/tsconfig.json DELETED
@@ -1,23 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "target": "ESNext",
4
- "module": "NodeNext",
5
- "moduleResolution": "NodeNext",
6
- "lib": ["ESNext"],
7
- "outDir": "./dist",
8
- "rootDir": "./src",
9
- "strict": true,
10
- "noImplicitAny": true,
11
- "noImplicitReturns": true,
12
- "noFallthroughCasesInSwitch": true,
13
- "noUncheckedIndexedAccess": true,
14
- "esModuleInterop": true,
15
- "skipLibCheck": true,
16
- "forceConsistentCasingInFileNames": true,
17
- "resolveJsonModule": true,
18
- "declaration": false,
19
- "sourceMap": true
20
- },
21
- "include": ["src/**/*"],
22
- "exclude": ["node_modules", "dist"]
23
- }