@mak-98/dirvi-cli 0.3.2 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/dist/application/action.d.ts +25 -18
  2. package/dist/application/dir-buffer-helpers.d.ts +5 -2
  3. package/dist/application/dir-buffer-helpers.js +17 -17
  4. package/dist/application/display-rows.d.ts +10 -3
  5. package/dist/application/display-rows.d.ts.map +1 -1
  6. package/dist/application/display-rows.js +54 -41
  7. package/dist/application/effect-to-action.d.ts +7 -4
  8. package/dist/application/effect-to-action.d.ts.map +1 -1
  9. package/dist/application/effect-to-action.js +84 -75
  10. package/dist/application/fold-helpers.d.ts +22 -6
  11. package/dist/application/fold-helpers.js +36 -32
  12. package/dist/application/intent-to-effect.d.ts +57 -37
  13. package/dist/application/intent-to-effect.d.ts.map +1 -1
  14. package/dist/application/intent-to-effect.js +116 -103
  15. package/dist/application/reducer-action.d.ts +22 -18
  16. package/dist/application/reducer.d.ts +1 -1
  17. package/dist/application/reducer.d.ts.map +1 -1
  18. package/dist/application/reducer.js +40 -28
  19. package/dist/application/user-input-to-intent.d.ts +38 -14
  20. package/dist/application/user-input-to-intent.d.ts.map +1 -1
  21. package/dist/application/user-input-to-intent.js +103 -49
  22. package/dist/domain/event-message.d.ts +14 -11
  23. package/dist/domain/print-message.d.ts +10 -8
  24. package/dist/index.d.ts +1 -1
  25. package/dist/index.js +35 -30
  26. package/dist/infrastructure/ink-input-to-user-input.d.ts +7 -0
  27. package/dist/infrastructure/ink-input-to-user-input.d.ts.map +1 -0
  28. package/dist/infrastructure/ink-input-to-user-input.js +45 -0
  29. package/dist/infrastructure/input.d.ts +7 -2
  30. package/dist/infrastructure/input.js +71 -71
  31. package/dist/infrastructure/load-initial-props.d.ts +1 -1
  32. package/dist/infrastructure/load-initial-props.d.ts.map +1 -1
  33. package/dist/infrastructure/load-initial-props.js +32 -25
  34. package/dist/infrastructure/user-input.d.ts +31 -16
  35. package/dist/infrastructure/user-input.d.ts.map +1 -1
  36. package/dist/infrastructure/user-input.js +42 -32
  37. package/dist/ui/App.d.ts +11 -6
  38. package/dist/ui/App.d.ts.map +1 -1
  39. package/dist/ui/App.js +127 -89
  40. package/dist/ui/App2.d.ts +11 -6
  41. package/dist/ui/App2.js +95 -84
  42. package/dist/ui/AppShell.d.ts +12 -7
  43. package/dist/ui/AppShell.js +11 -6
  44. package/dist/ui/components/DirEntries.d.ts +8 -5
  45. package/dist/ui/components/DirEntries.js +56 -31
  46. package/dist/ui/components/StatusBar.d.ts +10 -0
  47. package/dist/ui/components/StatusBar.d.ts.map +1 -0
  48. package/dist/ui/components/StatusBar.js +32 -0
  49. package/dist/ui/components/UnixEntry.d.ts +8 -5
  50. package/dist/ui/components/UnixEntry.js +17 -10
  51. package/dist/ui/components/UnixEntryComponent.d.ts +8 -5
  52. package/dist/ui/components/UnixEntryComponent.js +17 -10
  53. package/dist/ui/components/ViewRowComponent.d.ts +6 -4
  54. package/dist/ui/components/ViewRowComponent.js +30 -10
  55. package/dist/ui/hooks/useView.d.ts +6 -2
  56. package/dist/ui/hooks/useView.d.ts.map +1 -1
  57. package/dist/ui/hooks/useView.js +30 -22
  58. package/dist/ui/view.d.ts +15 -10
  59. package/dist/ui/view.d.ts.map +1 -1
  60. package/dist/ui/view.js +63 -59
  61. package/package.json +3 -2
@@ -1,6 +1,9 @@
1
1
  import { UnixEntry } from 'dirvi-lib';
2
- export declare function UnixEntry({ entry, selected, }: {
3
- entry: UnixEntry;
4
- selected: boolean;
5
- }): import("react").JSX.Element;
6
- //# sourceMappingURL=UnixEntry.d.ts.map
2
+ export declare function UnixEntry({
3
+ entry,
4
+ selected,
5
+ }: {
6
+ entry: UnixEntry;
7
+ selected: boolean;
8
+ }): import('react').JSX.Element;
9
+ //# sourceMappingURL=UnixEntry.d.ts.map
@@ -1,12 +1,19 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs } from 'react/jsx-runtime';
2
2
  import { Text } from 'ink';
3
- export function UnixEntry({ entry, selected, }) {
4
- switch (entry.kind) {
5
- case 'file':
6
- return _jsx(Text, { inverse: selected, children: entry.name });
7
- case 'symlink':
8
- return (_jsxs(Text, { inverse: selected, children: [entry.name, " -> ", entry.target] }));
9
- case 'directory':
10
- return (_jsxs(Text, { inverse: selected, color: "blue", children: [entry.name, "/"] }));
11
- }
3
+ export function UnixEntry({ entry, selected }) {
4
+ switch (entry.kind) {
5
+ case 'file':
6
+ return _jsx(Text, { inverse: selected, children: entry.name });
7
+ case 'symlink':
8
+ return _jsxs(Text, {
9
+ inverse: selected,
10
+ children: [entry.name, ' -> ', entry.target],
11
+ });
12
+ case 'directory':
13
+ return _jsxs(Text, {
14
+ inverse: selected,
15
+ color: 'blue',
16
+ children: [entry.name, '/'],
17
+ });
18
+ }
12
19
  }
@@ -1,6 +1,9 @@
1
1
  import { UnixEntry } from 'dirvi-lib';
2
- export declare function UnixEntryComponent({ entry, selected, }: {
3
- entry: UnixEntry;
4
- selected: boolean;
5
- }): import("react").JSX.Element;
6
- //# sourceMappingURL=UnixEntryComponent.d.ts.map
2
+ export declare function UnixEntryComponent({
3
+ entry,
4
+ selected,
5
+ }: {
6
+ entry: UnixEntry;
7
+ selected: boolean;
8
+ }): import('react').JSX.Element;
9
+ //# sourceMappingURL=UnixEntryComponent.d.ts.map
@@ -1,12 +1,19 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs } from 'react/jsx-runtime';
2
2
  import { Text } from 'ink';
3
- export function UnixEntryComponent({ entry, selected, }) {
4
- switch (entry.kind) {
5
- case 'file':
6
- return _jsx(Text, { inverse: selected, children: entry.name });
7
- case 'symlink':
8
- return (_jsxs(Text, { inverse: selected, children: [entry.name, " -> ", entry.target] }));
9
- case 'directory':
10
- return (_jsxs(Text, { inverse: selected, color: "blue", children: [entry.name, "/"] }));
11
- }
3
+ export function UnixEntryComponent({ entry, selected }) {
4
+ switch (entry.kind) {
5
+ case 'file':
6
+ return _jsx(Text, { inverse: selected, children: entry.name });
7
+ case 'symlink':
8
+ return _jsxs(Text, {
9
+ inverse: selected,
10
+ children: [entry.name, ' -> ', entry.target],
11
+ });
12
+ case 'directory':
13
+ return _jsxs(Text, {
14
+ inverse: selected,
15
+ color: 'blue',
16
+ children: [entry.name, '/'],
17
+ });
18
+ }
12
19
  }
@@ -1,5 +1,7 @@
1
1
  import { ViewRow } from '../view.js';
2
- export declare function ViewRowComponent({ row }: {
3
- row: ViewRow;
4
- }): import("react").JSX.Element;
5
- //# sourceMappingURL=ViewRowComponent.d.ts.map
2
+ export declare function ViewRowComponent({
3
+ row,
4
+ }: {
5
+ row: ViewRow;
6
+ }): import('react').JSX.Element;
7
+ //# sourceMappingURL=ViewRowComponent.d.ts.map
@@ -1,13 +1,33 @@
1
- import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
1
+ import { jsxs as _jsxs, jsx as _jsx } from 'react/jsx-runtime';
2
2
  import { Box, Text } from 'ink';
3
3
  export function ViewRowComponent({ row }) {
4
- const prefix = '';
5
- switch (row.type) {
6
- case 'file':
7
- return (_jsx(Box, { paddingLeft: row.indent * 2, children: _jsxs(Text, { inverse: row.selected, children: [prefix, row.content] }) }));
8
- case 'directory':
9
- return (_jsx(Box, { paddingLeft: row.indent * 2, children: _jsxs(Text, { inverse: row.selected, color: "blue", children: [prefix, row.content] }) }));
10
- case 'fold':
11
- return (_jsx(Box, { paddingLeft: row.indent * 2, children: _jsxs(Text, { inverse: row.selected, dimColor: true, children: [prefix, row.content] }) }));
12
- }
4
+ const prefix = '';
5
+ switch (row.type) {
6
+ case 'file':
7
+ return _jsx(Box, {
8
+ paddingLeft: row.indent * 2,
9
+ children: _jsxs(Text, {
10
+ inverse: row.selected,
11
+ children: [prefix, row.content],
12
+ }),
13
+ });
14
+ case 'directory':
15
+ return _jsx(Box, {
16
+ paddingLeft: row.indent * 2,
17
+ children: _jsxs(Text, {
18
+ inverse: row.selected,
19
+ color: 'blue',
20
+ children: [prefix, row.content],
21
+ }),
22
+ });
23
+ case 'fold':
24
+ return _jsx(Box, {
25
+ paddingLeft: row.indent * 2,
26
+ children: _jsxs(Text, {
27
+ inverse: row.selected,
28
+ dimColor: true,
29
+ children: [prefix, row.content],
30
+ }),
31
+ });
32
+ }
13
33
  }
@@ -1,4 +1,8 @@
1
1
  import { NavigationNode, State } from 'dirvi-lib';
2
2
  import { View } from '../view.js';
3
- export declare function useView(navigation: NavigationNode, state: State): View;
4
- //# sourceMappingURL=useView.d.ts.map
3
+ export declare function useView(
4
+ navigation: NavigationNode,
5
+ state: State,
6
+ terminalRows: number,
7
+ ): View;
8
+ //# sourceMappingURL=useView.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useView.d.ts","sourceRoot":"","sources":["../../../src/ui/hooks/useView.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,cAAc,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AACtE,OAAO,EAAE,IAAI,EAAW,MAAM,YAAY,CAAC;AAO3C,wBAAgB,OAAO,CAAC,UAAU,EAAE,cAAc,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI,CAmBtE"}
1
+ {"version":3,"file":"useView.d.ts","sourceRoot":"","sources":["../../../src/ui/hooks/useView.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAClD,OAAO,EAAE,IAAI,EAAW,MAAM,YAAY,CAAC;AAO3C,wBAAgB,OAAO,CACrB,UAAU,EAAE,cAAc,EAC1B,KAAK,EAAE,KAAK,EACZ,YAAY,EAAE,MAAM,GACnB,IAAI,CAkBN"}
@@ -1,30 +1,38 @@
1
1
  import { View } from '../view.js';
2
- import { useWindowSize } from 'ink';
3
2
  import { useRef } from 'react';
3
+ import { STATUS_BAR_HEIGHT } from '../components/StatusBar.js';
4
4
  // Hooks that keeps Ref of the viewport's start, and returns View sliced to
5
5
  // only the rows that should be visible.
6
- export function useView(navigation, state) {
7
- const { rows: terminalRows } = useWindowSize();
8
- const viewportStartRef = useRef(0);
9
- const viewportHeight = Math.max(1, terminalRows);
10
- const rows = View.createRows(navigation, state.cursor);
11
- viewportStartRef.current = viewportStart(rows, viewportHeight, viewportStartRef.current);
12
- return View.create(navigation, state.cursor, viewportHeight, viewportStartRef.current);
6
+ export function useView(navigation, state, terminalRows) {
7
+ const viewportStartRef = useRef(0);
8
+ const viewportHeight = Math.max(1, terminalRows - STATUS_BAR_HEIGHT);
9
+ const rows = View.createRows(navigation, state.cursor);
10
+ viewportStartRef.current = viewportStart(
11
+ rows,
12
+ viewportHeight,
13
+ viewportStartRef.current,
14
+ );
15
+ return View.create(
16
+ navigation,
17
+ state.cursor,
18
+ viewportHeight,
19
+ viewportStartRef.current,
20
+ );
13
21
  }
14
22
  function viewportStart(rows, viewportHeight, currentViewportStart) {
15
- const scrollMargin = 3;
16
- const cursorIndex = rows.findIndex((row) => row.cursor);
17
- const maximumViewportStart = Math.max(0, rows.length - viewportHeight);
18
- let viewportStart = currentViewportStart;
19
- if (cursorIndex >= 0) {
20
- const firstVisibleCursorIndex = viewportStart + scrollMargin;
21
- const lastVisibleCursorIndex = viewportStart + viewportHeight - 1 - scrollMargin;
22
- if (cursorIndex < firstVisibleCursorIndex) {
23
- viewportStart = cursorIndex - scrollMargin;
24
- }
25
- else if (cursorIndex > lastVisibleCursorIndex) {
26
- viewportStart = cursorIndex - viewportHeight + 1 + scrollMargin;
27
- }
23
+ const scrollMargin = 3;
24
+ const cursorIndex = rows.findIndex((row) => row.cursor);
25
+ const maximumViewportStart = Math.max(0, rows.length - viewportHeight);
26
+ let viewportStart = currentViewportStart;
27
+ if (cursorIndex >= 0) {
28
+ const firstVisibleCursorIndex = viewportStart + scrollMargin;
29
+ const lastVisibleCursorIndex =
30
+ viewportStart + viewportHeight - 1 - scrollMargin;
31
+ if (cursorIndex < firstVisibleCursorIndex) {
32
+ viewportStart = cursorIndex - scrollMargin;
33
+ } else if (cursorIndex > lastVisibleCursorIndex) {
34
+ viewportStart = cursorIndex - viewportHeight + 1 + scrollMargin;
28
35
  }
29
- return Math.max(0, Math.min(viewportStart, maximumViewportStart));
36
+ }
37
+ return Math.max(0, Math.min(viewportStart, maximumViewportStart));
30
38
  }
package/dist/ui/view.d.ts CHANGED
@@ -1,18 +1,23 @@
1
1
  import { Cursor, NavigationNode } from 'dirvi-lib';
2
2
  export type ViewRowType = 'file' | 'directory' | 'fold';
3
3
  export type ViewRow = {
4
- id: string;
5
- indent: number;
6
- selected: boolean;
7
- cursor: boolean;
8
- content: string;
9
- type: ViewRowType;
4
+ id: string;
5
+ indent: number;
6
+ selected: boolean;
7
+ cursor: boolean;
8
+ content: string;
9
+ type: ViewRowType;
10
10
  };
11
11
  export type View = {
12
- rows: ViewRow[];
12
+ rows: ViewRow[];
13
13
  };
14
14
  export declare const View: {
15
- createRows(navigation: NavigationNode, cursor: Cursor): ViewRow[];
16
- create(navigation: NavigationNode, cursor: Cursor, viewportHeight: number, viewportStart: number): View;
15
+ createRows(navigation: NavigationNode, cursor: Cursor): ViewRow[];
16
+ create(
17
+ navigation: NavigationNode,
18
+ cursor: Cursor,
19
+ viewportHeight: number,
20
+ viewportStart: number,
21
+ ): View;
17
22
  };
18
- //# sourceMappingURL=view.d.ts.map
23
+ //# sourceMappingURL=view.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../src/ui/view.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EAEN,cAAc,EAEf,MAAM,WAAW,CAAC;AAEnB,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;AAMxD,MAAM,MAAM,OAAO,GAAG;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,WAAW,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,IAAI,GAAG;IACjB,IAAI,EAAE,OAAO,EAAE,CAAC;CACjB,CAAC;AAEF,eAAO,MAAM,IAAI;2BAED,cAAc,UAClB,MAAM,GACb,OAAO,EAAE;uBAKE,cAAc,UAClB,MAAM,kBACE,MAAM,iBACP,MAAM,GACpB,IAAI;CAUR,CAAC"}
1
+ {"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../src/ui/view.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EAEN,cAAc,EAEf,MAAM,WAAW,CAAC;AAEnB,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;AAMxD,MAAM,MAAM,OAAO,GAAG;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,WAAW,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,IAAI,GAAG;IACjB,IAAI,EAAE,OAAO,EAAE,CAAC;CACjB,CAAC;AAEF,eAAO,MAAM,IAAI;2BACQ,cAAc,UAAU,MAAM,GAAG,OAAO,EAAE;uBAKnD,cAAc,UAClB,MAAM,kBACE,MAAM,iBACP,MAAM,GACpB,IAAI;CAOR,CAAC"}
package/dist/ui/view.js CHANGED
@@ -1,74 +1,78 @@
1
- import { UnixEntryPath, } from 'dirvi-lib';
1
+ import { UnixEntryPath } from 'dirvi-lib';
2
2
  export const View = {
3
- createRows(navigation, cursor) {
4
- return viewRowsAtNode(navigation, [], cursor);
5
- },
6
- create(navigation, cursor, viewportHeight, viewportStart) {
7
- const rows = View.createRows(navigation, cursor);
8
- return {
9
- rows: rows.slice(viewportStart, viewportStart + viewportHeight),
10
- };
11
- },
3
+ createRows(navigation, cursor) {
4
+ return viewRowsAtNode(navigation, [], cursor);
5
+ },
6
+ create(navigation, cursor, viewportHeight, viewportStart) {
7
+ const rows = View.createRows(navigation, cursor);
8
+ return {
9
+ rows: rows.slice(viewportStart, viewportStart + viewportHeight),
10
+ };
11
+ },
12
12
  };
13
13
  function viewRowsAtNode(node, parentPath, cursor) {
14
- const rows = [];
15
- for (const entry of node.entries) {
16
- const isCursor = cursor.kind === 'entry' &&
17
- UnixEntryPath.equal(cursor.parentPath, parentPath) &&
18
- cursor.entryName === entry.name;
19
- rows.push(viewRowForEntry(entry, parentPath, isCursor));
20
- if (entry.kind !== 'directory' || entry.node === undefined) {
21
- continue;
22
- }
23
- rows.push(...viewRowsAtNode(entry.node, [...parentPath, entry.name], cursor));
14
+ const rows = [];
15
+ for (const entry of node.entries) {
16
+ const isCursor =
17
+ cursor.kind === 'entry' &&
18
+ UnixEntryPath.equal(cursor.parentPath, parentPath) &&
19
+ cursor.entryName === entry.name;
20
+ rows.push(viewRowForEntry(entry, parentPath, isCursor));
21
+ if (entry.kind !== 'directory' || entry.node === undefined) {
22
+ continue;
24
23
  }
25
- if (node.foldedEntries.length > 0) {
26
- const isCursor = cursor.kind === 'fold' &&
27
- UnixEntryPath.equal(cursor.parentPath, parentPath);
28
- rows.push({
29
- id: foldId(parentPath),
30
- indent: parentPath.length,
31
- selected: isCursor,
32
- cursor: isCursor,
33
- content: `⋯ ${node.foldedEntries.length} folded entries`,
34
- type: 'fold',
35
- });
36
- }
37
- return rows;
24
+ rows.push(
25
+ ...viewRowsAtNode(entry.node, [...parentPath, entry.name], cursor),
26
+ );
27
+ }
28
+ if (node.foldedEntries.length > 0) {
29
+ const isCursor =
30
+ cursor.kind === 'fold' &&
31
+ UnixEntryPath.equal(cursor.parentPath, parentPath);
32
+ rows.push({
33
+ id: foldId(parentPath),
34
+ indent: parentPath.length,
35
+ selected: isCursor,
36
+ cursor: isCursor,
37
+ content: `⋯ ${node.foldedEntries.length} folded`,
38
+ type: 'fold',
39
+ });
40
+ }
41
+ return rows;
38
42
  }
39
43
  function viewRowForEntry(entry, parentPath, cursor) {
40
- return {
41
- id: entryId(parentPath, entry.name),
42
- indent: parentPath.length,
43
- selected: cursor,
44
- cursor,
45
- content: content(entry),
46
- type: type(entry),
47
- };
44
+ return {
45
+ id: entryId(parentPath, entry.name),
46
+ indent: parentPath.length,
47
+ selected: cursor,
48
+ cursor,
49
+ content: content(entry),
50
+ type: type(entry),
51
+ };
48
52
  }
49
53
  function entryId(parentPath, entryName) {
50
- return `entry:${JSON.stringify([...parentPath, entryName])}`;
54
+ return `entry:${JSON.stringify([...parentPath, entryName])}`;
51
55
  }
52
56
  function foldId(parentPath) {
53
- return `fold:${JSON.stringify(parentPath)}`;
57
+ return `fold:${JSON.stringify(parentPath)}`;
54
58
  }
55
59
  function content(entry) {
56
- switch (entry.kind) {
57
- case 'file':
58
- return entry.name;
59
- case 'directory':
60
- return `${entry.name}/`;
61
- case 'symlink':
62
- return `${entry.name} -> ${entry.target}`;
63
- }
60
+ switch (entry.kind) {
61
+ case 'file':
62
+ return entry.name;
63
+ case 'directory':
64
+ return `${entry.name}/`;
65
+ case 'symlink':
66
+ return `${entry.name} -> ${entry.target}`;
67
+ }
64
68
  }
65
69
  function type(entry) {
66
- switch (entry.kind) {
67
- case 'file':
68
- return 'file';
69
- case 'directory':
70
- return 'directory';
71
- case 'symlink':
72
- return 'file';
73
- }
70
+ switch (entry.kind) {
71
+ case 'file':
72
+ return 'file';
73
+ case 'directory':
74
+ return 'directory';
75
+ case 'symlink':
76
+ return 'file';
77
+ }
74
78
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mak-98/dirvi-cli",
3
- "version": "0.3.2",
3
+ "version": "0.4.0",
4
4
  "description": "A Vim-inspired TUI for browsing directories.",
5
5
  "type": "module",
6
6
  "license": "GPL-3.0-or-later",
@@ -13,7 +13,7 @@
13
13
  ],
14
14
  "dependencies": {
15
15
  "commander": "^13.0.0",
16
- "dirvi-lib": "0.3.0",
16
+ "dirvi-lib": "0.4.0",
17
17
  "ink": "^7.1.1",
18
18
  "react": "^19.0.0"
19
19
  },
@@ -28,6 +28,7 @@
28
28
  "dev": "FORCE_COLOR=3 tsx src/index.tsx",
29
29
  "start": "node dist/index.js",
30
30
  "typecheck": "tsc --noEmit",
31
+ "format": "prettier . --write",
31
32
  "update-global": "npm install --global @mak-98/dirvi-cli@latest"
32
33
  }
33
34
  }