@heyhuynhgiabuu/pi-pretty 0.3.3 → 0.4.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/README.md +74 -4
- package/package.json +2 -4
- package/release-notes/v0.4.0.md +58 -0
- package/release-notes/v0.4.1.md +28 -0
- package/src/fff-helpers.ts +7 -6
- package/src/index.ts +385 -277
- package/test/fff-integration.test.ts +11 -2
- package/test/image-rendering.test.ts +6 -0
package/README.md
CHANGED
|
@@ -3,13 +3,14 @@
|
|
|
3
3
|
[](https://www.npmjs.com/package/@heyhuynhgiabuu/pi-pretty)
|
|
4
4
|
[](https://github.com/buddingnewinsights/pi-pretty/releases/latest)
|
|
5
5
|
|
|
6
|
-
A [pi](https://pi.dev) extension that upgrades built-in tool output in the terminal
|
|
6
|
+
A [pi](https://pi.dev) extension that upgrades built-in tool output in the terminal and includes built-in FFF-powered search for `find`/`grep`.
|
|
7
7
|
|
|
8
8
|
It currently enhances:
|
|
9
9
|
|
|
10
10
|
- **`read`**: syntax-highlighted text previews with line numbers, plus inline image rendering when the terminal supports it
|
|
11
11
|
- **`bash`**: colored exit summary (`exit 0`/`exit 1`) with a preview body of command output
|
|
12
|
-
- **`ls
|
|
12
|
+
- **`ls`**: Nerd Font file icons with tree-oriented rendering
|
|
13
|
+
- **`find` / `grep`**: built-in FFF-backed search with frecency-aware results, plus grouped/highlighted rendering
|
|
13
14
|
|
|
14
15
|
> Companion to [@heyhuynhgiabuu/pi-diff](https://github.com/buddingnewinsights/pi-diff) for `write`/`edit` diff rendering.
|
|
15
16
|
|
|
@@ -51,9 +52,13 @@ When running in **tmux**, pi-pretty uses passthrough escape sequences.
|
|
|
51
52
|
>
|
|
52
53
|
> (or run once in a session: `tmux set -g allow-passthrough on`)
|
|
53
54
|
|
|
54
|
-
## FFF
|
|
55
|
+
## Bundled FFF search
|
|
55
56
|
|
|
56
|
-
|
|
57
|
+
`pi-pretty` now bundles `@ff-labs/fff-node` and owns the built-in `find` / `grep` search behavior directly.
|
|
58
|
+
|
|
59
|
+
If you use bundled FFF mode, do not load `pi-fff` at the same time, because Pi extensions do not compositionally share ownership of the same built-in tool names.
|
|
60
|
+
|
|
61
|
+
FFF data is stored under a pi-pretty-specific path:
|
|
57
62
|
|
|
58
63
|
```text
|
|
59
64
|
~/.pi/agent/pi-pretty/fff/
|
|
@@ -61,6 +66,71 @@ When FFF is available, pi-pretty now stores its frecency/history data under a pi
|
|
|
61
66
|
|
|
62
67
|
This makes it clear that the cache belongs to this extension rather than Pi core.
|
|
63
68
|
|
|
69
|
+
## How to use it
|
|
70
|
+
|
|
71
|
+
### 1. Install and load only `pi-pretty`
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
pi install npm:@heyhuynhgiabuu/pi-pretty
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Do **not** also load `pi-fff` in the same Pi setup.
|
|
78
|
+
|
|
79
|
+
### 2. Start Pi in a project
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
cd /path/to/your/project
|
|
83
|
+
pi
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
On session start, pi-pretty initializes the bundled FFF index for the current working directory.
|
|
87
|
+
|
|
88
|
+
### 3. Use the built-in tools normally
|
|
89
|
+
|
|
90
|
+
You keep using the normal built-in tool names — pi-pretty owns them directly.
|
|
91
|
+
|
|
92
|
+
Examples:
|
|
93
|
+
|
|
94
|
+
```text
|
|
95
|
+
find pattern="*.ts" path="src"
|
|
96
|
+
grep pattern="handleRequest" glob="*.ts"
|
|
97
|
+
read path="src/index.ts"
|
|
98
|
+
ls path="src"
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### 4. Use `multi_grep` when you want OR-search across multiple strings
|
|
102
|
+
|
|
103
|
+
`multi_grep` is bundled on top of FFF and is useful when you want any of several patterns:
|
|
104
|
+
|
|
105
|
+
```text
|
|
106
|
+
multi_grep patterns=["handleRequest","handle_request","HandleRequest"] constraints="*.ts"
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
Good uses:
|
|
110
|
+
- find several naming variants at once
|
|
111
|
+
- search related symbols in one pass
|
|
112
|
+
- replace slow regex alternation with literal OR matching
|
|
113
|
+
|
|
114
|
+
### 5. Check FFF status or force a rescan
|
|
115
|
+
|
|
116
|
+
pi-pretty also provides two maintenance commands:
|
|
117
|
+
|
|
118
|
+
```text
|
|
119
|
+
/fff-health
|
|
120
|
+
/fff-rescan
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Use them when:
|
|
124
|
+
- you want to confirm indexing is active
|
|
125
|
+
- the session started with a partial index warning
|
|
126
|
+
- you made large filesystem changes and want a fresh scan
|
|
127
|
+
|
|
128
|
+
### Notes
|
|
129
|
+
|
|
130
|
+
- `find` results are frecency-aware, so files you touch more often can bubble up earlier.
|
|
131
|
+
- `grep` and `multi_grep` can show a cursor notice when more results are available.
|
|
132
|
+
- If you see a partial index warning, let the session settle or run `/fff-rescan`.
|
|
133
|
+
|
|
64
134
|
## Configuration
|
|
65
135
|
|
|
66
136
|
Optional environment variables:
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@heyhuynhgiabuu/pi-pretty",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.1",
|
|
4
4
|
"description": "Pretty terminal output for pi — syntax-highlighted file reads, colored bash output, tree-view directory listings, and more.",
|
|
5
5
|
"author": "huynhgiabuu",
|
|
6
6
|
"license": "MIT",
|
|
@@ -22,11 +22,9 @@
|
|
|
22
22
|
"pretty-print"
|
|
23
23
|
],
|
|
24
24
|
"dependencies": {
|
|
25
|
+
"@ff-labs/fff-node": "0.5.2",
|
|
25
26
|
"@shikijs/cli": "^4.0.2"
|
|
26
27
|
},
|
|
27
|
-
"optionalDependencies": {
|
|
28
|
-
"@ff-labs/fff-node": "0.5.2"
|
|
29
|
-
},
|
|
30
28
|
"peerDependencies": {
|
|
31
29
|
"@mariozechner/pi-coding-agent": "*",
|
|
32
30
|
"@mariozechner/pi-tui": "*"
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# pi-pretty v0.4.0
|
|
2
|
+
|
|
3
|
+
## Summary
|
|
4
|
+
This release makes bundled FFF search the primary product direction for `pi-pretty`.
|
|
5
|
+
|
|
6
|
+
`pi-pretty` now owns the built-in `find` / `grep` experience directly via `@ff-labs/fff-node`, includes `multi_grep`, and documents the bundled workflow end-to-end.
|
|
7
|
+
|
|
8
|
+
## What changed
|
|
9
|
+
- Bundled `@ff-labs/fff-node` as a normal dependency instead of an optional coexistence path.
|
|
10
|
+
- Restored bundled FFF-backed behavior for:
|
|
11
|
+
- `find`
|
|
12
|
+
- `grep`
|
|
13
|
+
- `multi_grep`
|
|
14
|
+
- `/fff-health`
|
|
15
|
+
- `/fff-rescan`
|
|
16
|
+
- Kept the pi-pretty-specific FFF data directory:
|
|
17
|
+
- `~/.pi/agent/pi-pretty/fff/`
|
|
18
|
+
- Updated README to document:
|
|
19
|
+
- bundled FFF ownership
|
|
20
|
+
- install/use flow
|
|
21
|
+
- `multi_grep` examples
|
|
22
|
+
- FFF maintenance commands
|
|
23
|
+
- the requirement not to co-load `pi-fff`
|
|
24
|
+
- Tightened FFF/runtime typing:
|
|
25
|
+
- typed `CursorStore` and `fffFormatGrepText()` against `@ff-labs/fff-node`
|
|
26
|
+
- replaced remaining `src/index.ts` explicit `any` usage in tool wrappers with SDK/FFF-backed types
|
|
27
|
+
- typed `find`, `grep`, and `multi_grep` params/results/render paths against Pi tool inputs and FFF result interfaces
|
|
28
|
+
- removed several dead imports/constants and a non-null assertion in renderer code
|
|
29
|
+
|
|
30
|
+
## Files
|
|
31
|
+
- `src/index.ts`
|
|
32
|
+
- `src/fff-helpers.ts`
|
|
33
|
+
- `test/fff-integration.test.ts`
|
|
34
|
+
- `test/image-rendering.test.ts`
|
|
35
|
+
- `README.md`
|
|
36
|
+
- `package.json`
|
|
37
|
+
- `package-lock.json`
|
|
38
|
+
|
|
39
|
+
## Verification
|
|
40
|
+
- `npm run typecheck` ✅
|
|
41
|
+
- `npm test` ✅ (47 tests)
|
|
42
|
+
- `npm run lint -- --max-diagnostics=120` ✅
|
|
43
|
+
- `rg "\\bany\\b" src/index.ts src/fff-helpers.ts` ✅ no matches
|
|
44
|
+
|
|
45
|
+
## Upgrade notes
|
|
46
|
+
- Use only `pi-pretty` for bundled FFF mode:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
pi install npm:@heyhuynhgiabuu/pi-pretty
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
- Do **not** also load `pi-fff` in the same Pi setup.
|
|
53
|
+
- To inspect or refresh the bundled index inside Pi, use:
|
|
54
|
+
|
|
55
|
+
```text
|
|
56
|
+
/fff-health
|
|
57
|
+
/fff-rescan
|
|
58
|
+
```
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# pi-pretty v0.4.1
|
|
2
|
+
|
|
3
|
+
## Summary
|
|
4
|
+
This patch release prevents `grep` from aborting Pi when FFF 0.5.2 indexes Unicode filenames and the grep call includes a `path` or `glob` constraint.
|
|
5
|
+
|
|
6
|
+
## What changed
|
|
7
|
+
- Constrained `grep` calls now bypass native FFF and use the SDK fallback path.
|
|
8
|
+
- Unconstrained `grep` still uses FFF for the fast path.
|
|
9
|
+
- Added regression tests for both `path` and `glob` constrained grep bypass behavior.
|
|
10
|
+
|
|
11
|
+
## Why
|
|
12
|
+
`@ff-labs/fff-node@0.5.2` can panic inside native Rust constraint matching when a byte-based slice lands inside a multi-byte UTF-8 character in an indexed filename, such as an en dash (`–`). Because that panic happens across FFI, JavaScript cannot catch it; the whole `pi` process aborts.
|
|
13
|
+
|
|
14
|
+
This release avoids the crash-prone native constraint path until upstream FFF ships the Unicode boundary fix.
|
|
15
|
+
|
|
16
|
+
## Files
|
|
17
|
+
- `src/index.ts`
|
|
18
|
+
- `test/fff-integration.test.ts`
|
|
19
|
+
- `package.json`
|
|
20
|
+
- `package-lock.json`
|
|
21
|
+
|
|
22
|
+
## Verification
|
|
23
|
+
- `npm run typecheck` ✅
|
|
24
|
+
- `npm run lint` ✅
|
|
25
|
+
- `npm test` ✅ (48 tests)
|
|
26
|
+
|
|
27
|
+
## Upgrade notes
|
|
28
|
+
No configuration changes required. After updating, file- or glob-scoped `grep` calls will prefer the SDK fallback for stability; broad unconstrained grep remains FFF-backed.
|
package/src/fff-helpers.ts
CHANGED
|
@@ -4,12 +4,14 @@
|
|
|
4
4
|
* Pure functions and classes used by the FFF integration in index.ts.
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
+
import type { GrepCursor, GrepMatch } from "@ff-labs/fff-node";
|
|
8
|
+
|
|
7
9
|
/**
|
|
8
10
|
* Store for FFF grep pagination cursors.
|
|
9
11
|
* Evicts oldest entry when exceeding maxSize.
|
|
10
12
|
*/
|
|
11
13
|
export class CursorStore {
|
|
12
|
-
private cursors = new Map<string,
|
|
14
|
+
private cursors = new Map<string, GrepCursor>();
|
|
13
15
|
private counter = 0;
|
|
14
16
|
private maxSize: number;
|
|
15
17
|
|
|
@@ -17,7 +19,7 @@ export class CursorStore {
|
|
|
17
19
|
this.maxSize = maxSize;
|
|
18
20
|
}
|
|
19
21
|
|
|
20
|
-
store(cursor:
|
|
22
|
+
store(cursor: GrepCursor): string {
|
|
21
23
|
const id = `fff_c${++this.counter}`;
|
|
22
24
|
this.cursors.set(id, cursor);
|
|
23
25
|
if (this.cursors.size > this.maxSize) {
|
|
@@ -27,7 +29,7 @@ export class CursorStore {
|
|
|
27
29
|
return id;
|
|
28
30
|
}
|
|
29
31
|
|
|
30
|
-
get(id: string):
|
|
32
|
+
get(id: string): GrepCursor | undefined {
|
|
31
33
|
return this.cursors.get(id);
|
|
32
34
|
}
|
|
33
35
|
|
|
@@ -40,7 +42,7 @@ export class CursorStore {
|
|
|
40
42
|
* Convert FFF GrepResult items to ripgrep-style "file:line:content" text.
|
|
41
43
|
* This ensures pi-pretty's renderGrepResults works unchanged.
|
|
42
44
|
*/
|
|
43
|
-
export function fffFormatGrepText(items:
|
|
45
|
+
export function fffFormatGrepText(items: GrepMatch[], limit: number): string {
|
|
44
46
|
const capped = items.slice(0, limit);
|
|
45
47
|
if (!capped.length) return "No matches found";
|
|
46
48
|
|
|
@@ -58,8 +60,7 @@ export function fffFormatGrepText(items: any[], limit: number): string {
|
|
|
58
60
|
lines.push(`${match.relativePath}-${startLine + i}-${match.contextBefore[i]}`);
|
|
59
61
|
}
|
|
60
62
|
}
|
|
61
|
-
const content =
|
|
62
|
-
match.lineContent.length > 500 ? `${match.lineContent.slice(0, 500)}...` : match.lineContent;
|
|
63
|
+
const content = match.lineContent.length > 500 ? `${match.lineContent.slice(0, 500)}...` : match.lineContent;
|
|
63
64
|
lines.push(`${match.relativePath}:${match.lineNumber}:${content}`);
|
|
64
65
|
if (match.contextAfter?.length) {
|
|
65
66
|
const startLine = match.lineNumber + 1;
|