@docyrus/docyrus 0.0.64 → 0.0.66
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/agent-loader.js +165 -20
- package/agent-loader.js.map +2 -2
- package/main.js +188 -101
- package/main.js.map +4 -4
- package/package.json +5 -4
- package/resources/pi-agent/extensions/browser-tools.ts +1 -1
- package/resources/pi-agent/extensions/context.ts +12 -73
- package/resources/pi-agent/extensions/control.ts +1 -1
- package/resources/pi-agent/extensions/loop.ts +4 -1
- package/resources/pi-agent/extensions/pi-bash-live-view/index.ts +1 -1
- package/resources/pi-agent/extensions/pi-bash-live-view/package.json +3 -3
- package/resources/pi-agent/extensions/pi-fff/README.md +152 -0
- package/resources/pi-agent/extensions/pi-fff/VENDORED_FROM.md +7 -0
- package/resources/pi-agent/extensions/pi-fff/package.json +53 -0
- package/resources/pi-agent/extensions/pi-fff/src/index.ts +820 -0
- package/resources/pi-agent/extensions/pi-mcp-adapter/index.ts +1 -1
- package/resources/pi-agent/extensions/pi-mcp-adapter/package.json +1 -1
- package/resources/pi-agent/extensions/prompt-editor.ts +26 -7
- package/resources/pi-agent/extensions/todos.ts +1 -1
- package/server-loader.js +126 -24
- package/server-loader.js.map +2 -2
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@docyrus/docyrus",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.66",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Docyrus API CLI",
|
|
6
6
|
"main": "./main.js",
|
|
@@ -12,16 +12,16 @@
|
|
|
12
12
|
},
|
|
13
13
|
"dependencies": {
|
|
14
14
|
"@clack/prompts": "^0.11.0",
|
|
15
|
+
"@ff-labs/fff-node": "0.6.4",
|
|
15
16
|
"@hono/node-server": "^1.19.13",
|
|
16
|
-
"@mariozechner/pi-ai": "0.
|
|
17
|
-
"@mariozechner/pi-coding-agent": "0.
|
|
17
|
+
"@mariozechner/pi-ai": "0.70.2",
|
|
18
|
+
"@mariozechner/pi-coding-agent": "0.70.2",
|
|
18
19
|
"@modelcontextprotocol/ext-apps": "^1.2.2",
|
|
19
20
|
"@modelcontextprotocol/sdk": "^1.25.1",
|
|
20
21
|
"@mozilla/readability": "^0.6.0",
|
|
21
22
|
"@opentui/core": "0.1.96",
|
|
22
23
|
"@opentui/react": "0.1.96",
|
|
23
24
|
"@repomix/tree-sitter-wasms": "^0.1.16",
|
|
24
|
-
"@sinclair/typebox": "^0.34.48",
|
|
25
25
|
"@xterm/headless": "^5.5.0",
|
|
26
26
|
"diff": "^9.0.0",
|
|
27
27
|
"hono": "^4.12.14",
|
|
@@ -40,6 +40,7 @@
|
|
|
40
40
|
"strip-ansi": "^7.1.0",
|
|
41
41
|
"turndown": "^7.2.2",
|
|
42
42
|
"turndown-plugin-gfm": "^1.0.2",
|
|
43
|
+
"typebox": "^1.1.24",
|
|
43
44
|
"undici": "^7.24.0",
|
|
44
45
|
"unified": "^11.0.5",
|
|
45
46
|
"unist-util-visit": "^5.1.0",
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
* 6. ctx.ui.input() resolves → execute() returns result to agent
|
|
18
18
|
*/
|
|
19
19
|
|
|
20
|
-
import { Type } from "
|
|
20
|
+
import { Type } from "typebox";
|
|
21
21
|
import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
|
|
22
22
|
|
|
23
23
|
const TOOL_TIMEOUT_MS = 60_000;
|
|
@@ -9,12 +9,10 @@
|
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
11
|
import type { ExtensionAPI, ExtensionCommandContext, ExtensionContext, ToolResultEvent } from "@mariozechner/pi-coding-agent";
|
|
12
|
-
import { DynamicBorder } from "@mariozechner/pi-coding-agent";
|
|
12
|
+
import { DynamicBorder, getAgentDir as piGetAgentDir, loadProjectContextFiles as piLoadProjectContextFiles } from "@mariozechner/pi-coding-agent";
|
|
13
13
|
import { Container, Key, Text, matchesKey, type Component, type TUI } from "@mariozechner/pi-tui";
|
|
14
14
|
import os from "node:os";
|
|
15
15
|
import path from "node:path";
|
|
16
|
-
import fs from "node:fs/promises";
|
|
17
|
-
import { existsSync } from "node:fs";
|
|
18
16
|
|
|
19
17
|
function formatUsd(cost: number): string {
|
|
20
18
|
if (!Number.isFinite(cost) || cost <= 0) {return "$0.00";}
|
|
@@ -38,75 +36,16 @@ function normalizeReadPath(inputPath: string, cwd: string): string {
|
|
|
38
36
|
return path.resolve(p);
|
|
39
37
|
}
|
|
40
38
|
|
|
41
|
-
function
|
|
42
|
-
//
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
}
|
|
51
|
-
if (!envDir) {
|
|
52
|
-
for (const [k, v] of Object.entries(process.env)) {
|
|
53
|
-
if (k.endsWith("_CODING_AGENT_DIR") && v) {
|
|
54
|
-
envDir = v;
|
|
55
|
-
break;
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
if (envDir) {
|
|
61
|
-
if (envDir === "~") {return os.homedir();}
|
|
62
|
-
if (envDir.startsWith("~/")) {return path.join(os.homedir(), envDir.slice(2));}
|
|
63
|
-
return envDir;
|
|
64
|
-
}
|
|
65
|
-
return path.join(os.homedir(), ".pi", "agent");
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
async function readFileIfExists(filePath: string): Promise<{ path: string; content: string; bytes: number } | null> {
|
|
69
|
-
if (!existsSync(filePath)) {return null;}
|
|
70
|
-
try {
|
|
71
|
-
const buf = await fs.readFile(filePath);
|
|
72
|
-
return { path: filePath, content: buf.toString("utf8"), bytes: buf.byteLength };
|
|
73
|
-
} catch {
|
|
74
|
-
return null;
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
async function loadProjectContextFiles(cwd: string): Promise<Array<{ path: string; tokens: number; bytes: number }>> {
|
|
79
|
-
const out: Array<{ path: string; tokens: number; bytes: number }> = [];
|
|
80
|
-
const seen = new Set<string>();
|
|
81
|
-
|
|
82
|
-
const loadFromDir = async(dir: string) => {
|
|
83
|
-
for (const name of ["AGENTS.md", "CLAUDE.md"]) {
|
|
84
|
-
const p = path.join(dir, name);
|
|
85
|
-
const f = await readFileIfExists(p);
|
|
86
|
-
if (f && !seen.has(f.path)) {
|
|
87
|
-
seen.add(f.path);
|
|
88
|
-
out.push({ path: f.path, tokens: estimateTokens(f.content), bytes: f.bytes });
|
|
89
|
-
// pi loads at most one of those per dir
|
|
90
|
-
return;
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
};
|
|
94
|
-
|
|
95
|
-
await loadFromDir(getAgentDir());
|
|
96
|
-
|
|
97
|
-
// Ancestors: root → cwd (same order as pi)
|
|
98
|
-
const stack: string[] = [];
|
|
99
|
-
let current = path.resolve(cwd);
|
|
100
|
-
while (true) {
|
|
101
|
-
stack.push(current);
|
|
102
|
-
const parent = path.resolve(current, "..");
|
|
103
|
-
if (parent === current) {break;}
|
|
104
|
-
current = parent;
|
|
105
|
-
}
|
|
106
|
-
stack.reverse();
|
|
107
|
-
for (const dir of stack) {await loadFromDir(dir);}
|
|
108
|
-
|
|
109
|
-
return out;
|
|
39
|
+
function loadProjectContextFilesWithStats(cwd: string): Array<{ path: string; tokens: number; bytes: number }> {
|
|
40
|
+
// Delegate AGENTS.md / CLAUDE.md discovery and precedence to the pi SDK so resolution order
|
|
41
|
+
// stays in lockstep with pi (exported by pi-coding-agent v0.67.4+). Only the tokens/bytes
|
|
42
|
+
// annotation layer is local.
|
|
43
|
+
const files = piLoadProjectContextFiles({ cwd, agentDir: piGetAgentDir() });
|
|
44
|
+
return files.map((f) => ({
|
|
45
|
+
path: f.path,
|
|
46
|
+
tokens: estimateTokens(f.content),
|
|
47
|
+
bytes: Buffer.byteLength(f.content, "utf8"),
|
|
48
|
+
}));
|
|
110
49
|
}
|
|
111
50
|
|
|
112
51
|
function normalizeSkillName(name: string): string {
|
|
@@ -492,7 +431,7 @@ export default function contextExtension(pi: ExtensionAPI) {
|
|
|
492
431
|
.map((c) => normalizeSkillName(c.name))
|
|
493
432
|
.sort((a, b) => a.localeCompare(b));
|
|
494
433
|
|
|
495
|
-
const agentFiles =
|
|
434
|
+
const agentFiles = loadProjectContextFilesWithStats(ctx.cwd);
|
|
496
435
|
const agentFilePaths = agentFiles.map((f) => shortenPath(f.path, ctx.cwd));
|
|
497
436
|
const agentTokens = agentFiles.reduce((a, f) => a + f.tokens, 0);
|
|
498
437
|
|
|
@@ -47,7 +47,7 @@ import { getMarkdownTheme } from "@mariozechner/pi-coding-agent";
|
|
|
47
47
|
import { complete, type Model, type Api, type UserMessage, type TextContent } from "@mariozechner/pi-ai";
|
|
48
48
|
import { StringEnum } from "@mariozechner/pi-ai";
|
|
49
49
|
import { Box, Container, Markdown, Spacer, Text } from "@mariozechner/pi-tui";
|
|
50
|
-
import { Type } from "
|
|
50
|
+
import { Type } from "typebox";
|
|
51
51
|
import { promises as fs } from "node:fs";
|
|
52
52
|
import * as net from "node:net";
|
|
53
53
|
import * as os from "node:os";
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* signal_loop_success tool.
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
-
import { Type } from "
|
|
9
|
+
import { Type } from "typebox";
|
|
10
10
|
import { complete, type Api, type Model, type UserMessage } from "@mariozechner/pi-ai";
|
|
11
11
|
import type { ExtensionAPI, ExtensionContext } from "@mariozechner/pi-coding-agent";
|
|
12
12
|
import { compact } from "@mariozechner/pi-coding-agent";
|
|
@@ -333,6 +333,9 @@ export default function loopExtension(pi: ExtensionAPI): void {
|
|
|
333
333
|
return {
|
|
334
334
|
content: [{ type: "text", text: "Loop ended." }],
|
|
335
335
|
details: { active: false },
|
|
336
|
+
// The loop is finished and turn_end will no longer re-prompt; skip the automatic follow-up
|
|
337
|
+
// LLM call that would otherwise just emit a closing pleasantry (pi-mono v0.69.0 feature #133).
|
|
338
|
+
terminate: true,
|
|
336
339
|
};
|
|
337
340
|
},
|
|
338
341
|
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createBashTool, type ExtensionAPI, type ExtensionCommandContext, type ExtensionContext } from '@mariozechner/pi-coding-agent';
|
|
2
|
-
import { Type } from '
|
|
2
|
+
import { Type } from 'typebox';
|
|
3
3
|
import { executePtyCommand } from './pty-execute.ts';
|
|
4
4
|
import { ensureSpawnHelperExecutable } from './spawn-helper.ts';
|
|
5
5
|
|
|
@@ -40,11 +40,11 @@
|
|
|
40
40
|
"test": "node --test tests/*.test.mjs"
|
|
41
41
|
},
|
|
42
42
|
"dependencies": {
|
|
43
|
-
"@mariozechner/pi-coding-agent": "^0.
|
|
44
|
-
"@sinclair/typebox": "^0.34.38",
|
|
43
|
+
"@mariozechner/pi-coding-agent": "^0.69.0",
|
|
45
44
|
"@xterm/headless": "^5.5.0",
|
|
46
45
|
"node-pty": "^1.0.0",
|
|
47
|
-
"strip-ansi": "^7.1.0"
|
|
46
|
+
"strip-ansi": "^7.1.0",
|
|
47
|
+
"typebox": "^1.1.24"
|
|
48
48
|
},
|
|
49
49
|
"devDependencies": {
|
|
50
50
|
"@types/node": "^24.3.0",
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
# @ff-labs/pi-fff
|
|
2
|
+
|
|
3
|
+
A [pi](https://github.com/badlogic/pi-mono) extension that replaces the built-in `find` and `grep` tools with [FFF](https://github.com/dmtrKovalenko/fff.nvim) — a Rust-native, SIMD-accelerated file finder with built-in memory.
|
|
4
|
+
|
|
5
|
+
## What it does
|
|
6
|
+
|
|
7
|
+
| Built-in tool | pi-fff replacement | Improvement |
|
|
8
|
+
|---|---|---|
|
|
9
|
+
| `find` (spawns `fd`) | `fffind` (FFF `fileSearch`) | Fuzzy matching, frecency ranking, git-aware, pre-indexed |
|
|
10
|
+
| `grep` (spawns `rg`) | `ffgrep` (FFF `grep`) | SIMD-accelerated, frecency-ordered, mmap-cached, no subprocess |
|
|
11
|
+
| *(none)* | `fff-multi-grep` (FFF `multiGrep`) | OR-logic multi-pattern search via Aho-Corasick |
|
|
12
|
+
| `@` file autocomplete (fd-backed) | `@` file autocomplete (FFF-backed, default) | Fuzzy ranking from FFF index/frecency |
|
|
13
|
+
|
|
14
|
+
### Key advantages over built-in tools
|
|
15
|
+
|
|
16
|
+
- **No subprocess spawning** — FFF is a Rust native library called through the Node binding. No `fd`/`rg` process per call.
|
|
17
|
+
- **Pre-indexed** — files are indexed in the background at session start. Searches are instant.
|
|
18
|
+
- **Frecency ranking** — files you access often rank higher. Learns across sessions.
|
|
19
|
+
- **Query history** — remembers which files were selected for which queries. Combo boost.
|
|
20
|
+
- **Git-aware** — modified/staged/untracked files are boosted in results.
|
|
21
|
+
- **Smart case** — case-insensitive when query is all lowercase, case-sensitive otherwise.
|
|
22
|
+
- **Fuzzy file search** — `find` uses fuzzy matching, not glob-only. Typo-tolerant.
|
|
23
|
+
- **Cursor pagination** — grep results include a cursor for fetching the next page.
|
|
24
|
+
|
|
25
|
+
## Install
|
|
26
|
+
|
|
27
|
+
Requirements:
|
|
28
|
+
- pi
|
|
29
|
+
|
|
30
|
+
### Install as a pi package
|
|
31
|
+
|
|
32
|
+
**Via npm (recommended):**
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
pi install npm:@ff-labs/pi-fff
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Project-local install:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
pi install -l npm:@ff-labs/pi-fff
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
**Via git:**
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
pi install git:github.com/dmtrKovalenko/fff.nvim
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Pin to a release:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
pi install git:github.com/dmtrKovalenko/fff.nvim@v0.3.0
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### Local development / manual install
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
git clone https://github.com/dmtrKovalenko/fff.nvim.git
|
|
60
|
+
cd fff.nvim/packages/pi-fff
|
|
61
|
+
npm install
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Then add to your pi `settings.json`:
|
|
65
|
+
|
|
66
|
+
```json
|
|
67
|
+
{
|
|
68
|
+
"extensions": ["/path/to/fff.nvim/packages/pi-fff/src/index.ts"]
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Or test directly:
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
pi -e /path/to/fff.nvim/packages/pi-fff/src/index.ts
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
This extension registers FFF-powered tools (`fffind`, `ffgrep`, `fff-multi-grep`) alongside pi's built-in tools.
|
|
79
|
+
|
|
80
|
+
## Tools
|
|
81
|
+
|
|
82
|
+
### `ffgrep`
|
|
83
|
+
|
|
84
|
+
Search file contents. Smart case, plain text by default, regex optional.
|
|
85
|
+
|
|
86
|
+
Parameters:
|
|
87
|
+
- `pattern` — search text or regex
|
|
88
|
+
- `path` — directory/file constraint (e.g. `src/`, `*.ts`)
|
|
89
|
+
- `ignoreCase` — force case-insensitive
|
|
90
|
+
- `literal` — treat as literal string (default: true)
|
|
91
|
+
- `context` — context lines around matches
|
|
92
|
+
- `limit` — max matches (default: 100)
|
|
93
|
+
- `cursor` — pagination cursor from previous result
|
|
94
|
+
|
|
95
|
+
### `fffind`
|
|
96
|
+
|
|
97
|
+
Fuzzy file name search. Frecency-ranked.
|
|
98
|
+
|
|
99
|
+
Parameters:
|
|
100
|
+
- `pattern` — fuzzy query (e.g. `main.ts`, `src/ config`)
|
|
101
|
+
- `path` — directory constraint
|
|
102
|
+
- `limit` — max results (default: 200)
|
|
103
|
+
|
|
104
|
+
### `fff-multi-grep`
|
|
105
|
+
|
|
106
|
+
OR-logic multi-pattern content search. SIMD-accelerated Aho-Corasick.
|
|
107
|
+
|
|
108
|
+
Parameters:
|
|
109
|
+
- `patterns` — array of literal patterns (OR logic)
|
|
110
|
+
- `constraints` — file constraints (e.g. `*.{ts,tsx} !test/`)
|
|
111
|
+
- `context` — context lines
|
|
112
|
+
- `limit` — max matches (default: 100)
|
|
113
|
+
- `cursor` — pagination cursor
|
|
114
|
+
|
|
115
|
+
## Commands
|
|
116
|
+
|
|
117
|
+
- `/fff-health` — show FFF status (indexed files, git info, frecency/history DB status)
|
|
118
|
+
- `/fff-rescan` — trigger a file rescan
|
|
119
|
+
- `/fff-mode <mode>` — switch mode (tool name change requires restart)
|
|
120
|
+
|
|
121
|
+
## Modes
|
|
122
|
+
|
|
123
|
+
- `tools-and-ui` (default): registers `fffind`, `ffgrep`, `fff-multi-grep` as additional tools + FFF-backed `@` autocomplete
|
|
124
|
+
- `tools-only`: additional tools only; keep pi's default `@` autocomplete
|
|
125
|
+
- `override`: replaces pi's built-in `find`, `grep` and adds `multi_grep` + FFF-backed `@` autocomplete
|
|
126
|
+
|
|
127
|
+
Mode precedence:
|
|
128
|
+
1. `--fff-mode <mode>` CLI flag
|
|
129
|
+
2. `PI_FFF_MODE=<mode>` environment variable
|
|
130
|
+
3. default (`tools-and-ui`)
|
|
131
|
+
|
|
132
|
+
## Flags
|
|
133
|
+
|
|
134
|
+
- `--fff-mode <mode>` — set mode (see above)
|
|
135
|
+
- `--fff-frecency-db <path>` — path to frecency database (also: `FFF_FRECENCY_DB` env)
|
|
136
|
+
- `--fff-history-db <path>` — path to query history database (also: `FFF_HISTORY_DB` env)
|
|
137
|
+
|
|
138
|
+
## Data
|
|
139
|
+
|
|
140
|
+
When database paths are provided, FFF stores:
|
|
141
|
+
- frecency database — file access frequency/recency
|
|
142
|
+
- history database — query-to-file selection history
|
|
143
|
+
|
|
144
|
+
No project files are uploaded anywhere by this extension. It runs locally and only uses the configured LLM through pi itself.
|
|
145
|
+
|
|
146
|
+
## Security
|
|
147
|
+
|
|
148
|
+
- No shell execution
|
|
149
|
+
- No network calls in the extension code
|
|
150
|
+
- No telemetry
|
|
151
|
+
- No credential handling beyond whatever pi and your configured model provider already do
|
|
152
|
+
- Search state is stored locally under `~/.pi/agent/fff/`
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
Vendored from [`@ff-labs/pi-fff`](https://github.com/dmtrKovalenko/fff.nvim/tree/main/packages/pi-fff)
|
|
2
|
+
|
|
3
|
+
- Upstream npm package: `@ff-labs/pi-fff@0.6.4`
|
|
4
|
+
- Upstream commit: `4b13a91aa57c5e9ed32ee381d9ee521800818370`
|
|
5
|
+
- Vendored for: `docyrus agent` / `docyrus coder`
|
|
6
|
+
- Local adaptation:
|
|
7
|
+
- swap `@sinclair/typebox` for the repo-wide `typebox` package to match existing pi extensions (e.g. `pi-mcp-adapter`)
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@ff-labs/pi-fff",
|
|
3
|
+
"version": "0.6.4",
|
|
4
|
+
"description": "pi extension: FFF-powered fuzzy file and content search",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"pi",
|
|
7
|
+
"pi-package",
|
|
8
|
+
"pi-extension",
|
|
9
|
+
"fff",
|
|
10
|
+
"search",
|
|
11
|
+
"grep",
|
|
12
|
+
"fuzzy-search",
|
|
13
|
+
"ai-agent"
|
|
14
|
+
],
|
|
15
|
+
"homepage": "https://github.com/dmtrKovalenko/fff.nvim/tree/main/packages/pi-fff",
|
|
16
|
+
"bugs": {
|
|
17
|
+
"url": "https://github.com/dmtrKovalenko/fff.nvim/issues"
|
|
18
|
+
},
|
|
19
|
+
"repository": {
|
|
20
|
+
"type": "git",
|
|
21
|
+
"url": "git+https://github.com/dmtrKovalenko/fff.nvim.git",
|
|
22
|
+
"directory": "packages/pi-fff"
|
|
23
|
+
},
|
|
24
|
+
"license": "MIT",
|
|
25
|
+
"type": "module",
|
|
26
|
+
"files": [
|
|
27
|
+
"src"
|
|
28
|
+
],
|
|
29
|
+
"scripts": {
|
|
30
|
+
"typecheck": "tsc --noEmit"
|
|
31
|
+
},
|
|
32
|
+
"dependencies": {
|
|
33
|
+
"@ff-labs/fff-node": "*"
|
|
34
|
+
},
|
|
35
|
+
"devDependencies": {
|
|
36
|
+
"@types/node": "^22.0.0",
|
|
37
|
+
"typescript": "^5.0.0"
|
|
38
|
+
},
|
|
39
|
+
"peerDependencies": {
|
|
40
|
+
"@mariozechner/pi-coding-agent": "*",
|
|
41
|
+
"@mariozechner/pi-tui": "*",
|
|
42
|
+
"typebox": "*"
|
|
43
|
+
},
|
|
44
|
+
"publishConfig": {
|
|
45
|
+
"access": "public"
|
|
46
|
+
},
|
|
47
|
+
"pi": {
|
|
48
|
+
"extensions": [
|
|
49
|
+
"./src/index.ts"
|
|
50
|
+
]
|
|
51
|
+
},
|
|
52
|
+
"public": true
|
|
53
|
+
}
|