@nerdvana/parism 0.1.3 → 0.1.4
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 +39 -2
- package/dist/config/loader.d.ts +3 -0
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +3 -0
- package/dist/config/loader.js.map +1 -1
- package/dist/engine/executor.d.ts +1 -1
- package/dist/engine/executor.d.ts.map +1 -1
- package/dist/engine/executor.js +14 -2
- package/dist/engine/executor.js.map +1 -1
- package/dist/engine/paginator.d.ts +11 -0
- package/dist/engine/paginator.d.ts.map +1 -0
- package/dist/engine/paginator.js +25 -0
- package/dist/engine/paginator.js.map +1 -0
- package/dist/parsers/fs/find.d.ts +8 -1
- package/dist/parsers/fs/find.d.ts.map +1 -1
- package/dist/parsers/fs/find.js +8 -1
- package/dist/parsers/fs/find.js.map +1 -1
- package/dist/parsers/fs/ls.d.ts +8 -1
- package/dist/parsers/fs/ls.d.ts.map +1 -1
- package/dist/parsers/fs/ls.js +8 -1
- package/dist/parsers/fs/ls.js.map +1 -1
- package/dist/parsers/process/ps.d.ts +8 -1
- package/dist/parsers/process/ps.d.ts.map +1 -1
- package/dist/parsers/process/ps.js +8 -1
- package/dist/parsers/process/ps.js.map +1 -1
- package/dist/parsers/registry.d.ts +9 -2
- package/dist/parsers/registry.d.ts.map +1 -1
- package/dist/parsers/registry.js +2 -2
- package/dist/parsers/registry.js.map +1 -1
- package/dist/parsers/text/grep.d.ts +8 -1
- package/dist/parsers/text/grep.d.ts.map +1 -1
- package/dist/parsers/text/grep.js +16 -3
- package/dist/parsers/text/grep.js.map +1 -1
- package/dist/server.d.ts +5 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +54 -3
- package/dist/server.js.map +1 -1
- package/dist/types/envelope.d.ts +11 -0
- package/dist/types/envelope.d.ts.map +1 -1
- package/package.json +8 -3
package/README.md
CHANGED
|
@@ -210,7 +210,43 @@ Claude Code (Linux):
|
|
|
210
210
|
}
|
|
211
211
|
```
|
|
212
212
|
|
|
213
|
-
연결이 되면 `run`
|
|
213
|
+
연결이 되면 `run`과 `run_paged` 두 도구가 노출된다. 에이전트는 이 도구로 명령을 실행하고 JSON을 받는다.
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
## Tools
|
|
218
|
+
|
|
219
|
+
### run
|
|
220
|
+
|
|
221
|
+
모든 명령의 기본 도구. 출력이 작거나 구조화 파싱이 필요할 때 사용한다.
|
|
222
|
+
|
|
223
|
+
파라미터:
|
|
224
|
+
- `cmd` — 명령어 이름 (예: `ls`, `git`)
|
|
225
|
+
- `args` — 인자 배열 (기본값: `[]`)
|
|
226
|
+
- `cwd` — 작업 디렉토리 (기본값: 현재 디렉토리)
|
|
227
|
+
|
|
228
|
+
### run_paged
|
|
229
|
+
|
|
230
|
+
대용량 출력을 페이지 단위로 읽는다. `ps aux`, `find`, `grep -r` 등에 사용한다.
|
|
231
|
+
|
|
232
|
+
파라미터:
|
|
233
|
+
- `cmd`, `args`, `cwd` — `run`과 동일
|
|
234
|
+
- `page` — 0-indexed 페이지 번호 (기본값: `0`)
|
|
235
|
+
- `page_size` — 페이지당 줄 수 (기본값: `default_page_size` 설정값, 기본 100)
|
|
236
|
+
|
|
237
|
+
응답 추가 필드:
|
|
238
|
+
- `page_info.total_lines` — 전체 줄 수
|
|
239
|
+
- `page_info.has_next` — 다음 페이지 존재 여부
|
|
240
|
+
- `stdout.parsed` — 항상 `null` (부분 출력은 구조화 불가)
|
|
241
|
+
|
|
242
|
+
에이전트 패턴:
|
|
243
|
+
|
|
244
|
+
```
|
|
245
|
+
1. run_paged(cmd, page=0) → page_info.total_lines 확인
|
|
246
|
+
2. 범위가 작으면 그대로 사용
|
|
247
|
+
3. 범위가 크면 grep으로 먼저 필터링 후 run 호출
|
|
248
|
+
4. 필요한 페이지만 run_paged(page=N) 추가 호출
|
|
249
|
+
```
|
|
214
250
|
|
|
215
251
|
---
|
|
216
252
|
|
|
@@ -229,7 +265,8 @@ Claude Code (Linux):
|
|
|
229
265
|
"node": { "blocked_flags": ["-e", "--eval", "-r", "--require", "-p", "--print"] },
|
|
230
266
|
"npx": { "blocked_flags": ["--yes", "-y"] }
|
|
231
267
|
},
|
|
232
|
-
"env_secret_patterns": ["TOKEN", "SECRET", "AUTHZ", "PASSWORD", "CREDENTIAL"]
|
|
268
|
+
"env_secret_patterns": ["TOKEN", "SECRET", "AUTHZ", "PASSWORD", "CREDENTIAL"],
|
|
269
|
+
"default_page_size": 100
|
|
233
270
|
}
|
|
234
271
|
}
|
|
235
272
|
```
|
package/dist/config/loader.d.ts
CHANGED
|
@@ -5,6 +5,9 @@ export interface PrismGuardConfig {
|
|
|
5
5
|
allowed_commands: string[];
|
|
6
6
|
allowed_paths: string[];
|
|
7
7
|
timeout_ms: number;
|
|
8
|
+
max_output_bytes: number;
|
|
9
|
+
max_items: number;
|
|
10
|
+
default_page_size: number;
|
|
8
11
|
block_patterns: string[];
|
|
9
12
|
command_arg_restrictions: Record<string, CommandArgRestriction>;
|
|
10
13
|
env_secret_patterns: string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,qBAAqB;IACpC,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,gBAAgB;IAC/B,gBAAgB,EAAU,MAAM,EAAE,CAAC;IACnC,aAAa,EAAa,MAAM,EAAE,CAAC;IACnC,UAAU,EAAgB,MAAM,CAAC;IACjC,cAAc,EAAY,MAAM,EAAE,CAAC;IACnC,wBAAwB,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;IAChE,mBAAmB,EAAO,MAAM,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,gBAAgB,CAAC;CACzB;AAED,eAAO,MAAM,cAAc,EAAE,
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,qBAAqB;IACpC,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,gBAAgB;IAC/B,gBAAgB,EAAU,MAAM,EAAE,CAAC;IACnC,aAAa,EAAa,MAAM,EAAE,CAAC;IACnC,UAAU,EAAgB,MAAM,CAAC;IACjC,gBAAgB,EAAU,MAAM,CAAC;IACjC,SAAS,EAAiB,MAAM,CAAC;IACjC,iBAAiB,EAAS,MAAM,CAAC;IACjC,cAAc,EAAY,MAAM,EAAE,CAAC;IACnC,wBAAwB,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;IAChE,mBAAmB,EAAO,MAAM,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,gBAAgB,CAAC;CACzB;AAED,eAAO,MAAM,cAAc,EAAE,WAyB5B,CAAC;AAEF;;;GAGG;AACH,wBAAsB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAWzE"}
|
package/dist/config/loader.js
CHANGED
|
@@ -12,6 +12,9 @@ export const DEFAULT_CONFIG = {
|
|
|
12
12
|
],
|
|
13
13
|
allowed_paths: [],
|
|
14
14
|
timeout_ms: 10000,
|
|
15
|
+
max_output_bytes: 102400, // 100 KB
|
|
16
|
+
max_items: 500,
|
|
17
|
+
default_page_size: 100,
|
|
15
18
|
block_patterns: [";", "$(", "`", "&&", "||", ">", ">>", "<", "|"],
|
|
16
19
|
command_arg_restrictions: {
|
|
17
20
|
node: { blocked_flags: ["-e", "--eval", "-r", "--require", "-p", "--print", "--input-type"] },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAsB5C,MAAM,CAAC,MAAM,cAAc,GAAgB;IACzC,KAAK,EAAE;QACL,gBAAgB,EAAE;YAChB,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM;YACxC,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,MAAM,EAAE,SAAS;YACzB,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK;YACnC,KAAK;YACL,KAAK,EAAE,KAAK,EAAE,OAAO;YACrB,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU;SACpC;QACD,aAAa,EAAK,EAAE;QACpB,UAAU,EAAQ,KAAK;QACvB,gBAAgB,EAAG,MAAM,EAAI,SAAS;QACtC,SAAS,EAAU,GAAG;QACtB,iBAAiB,EAAE,GAAG;QACtB,cAAc,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC;QACjE,wBAAwB,EAAE;YACxB,IAAI,EAAE,EAAE,aAAa,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,cAAc,CAAC,EAAE;YAC7F,GAAG,EAAG,EAAE,aAAa,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE;SACzC;QACD,mBAAmB,EAAE;YACnB,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY;SAC/D;KACF;CACF,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,UAAkB;IACjD,IAAI,CAAC;QACH,MAAM,GAAG,GAAI,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACjD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAyB,CAAC;QAErD,OAAO;YACL,KAAK,EAAE,EAAE,GAAG,cAAc,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE;SAC1D,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,cAAc,CAAC;IACxB,CAAC;AACH,CAAC"}
|
|
@@ -5,5 +5,5 @@ import type { ResponseEnvelope } from "../types/envelope.js";
|
|
|
5
5
|
* - secretPatterns에 해당하는 환경 변수는 자식 프로세스에 전달하지 않음
|
|
6
6
|
* - 실행 실패(명령 없음 포함)는 예외 대신 ok=false 봉투로 반환
|
|
7
7
|
*/
|
|
8
|
-
export declare function execute(cmd: string, args: string[], cwd: string, secretPatterns?: string[], timeoutMs?: number): Promise<ResponseEnvelope>;
|
|
8
|
+
export declare function execute(cmd: string, args: string[], cwd: string, secretPatterns?: string[], timeoutMs?: number, maxOutputBytes?: number): Promise<ResponseEnvelope>;
|
|
9
9
|
//# sourceMappingURL=executor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/engine/executor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAsB7D;;;;;GAKG;AACH,wBAAsB,OAAO,CAC3B,GAAG,
|
|
1
|
+
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/engine/executor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAsB7D;;;;;GAKG;AACH,wBAAsB,OAAO,CAC3B,GAAG,EAAc,MAAM,EACvB,IAAI,EAAa,MAAM,EAAE,EACzB,GAAG,EAAc,MAAM,EACvB,cAAc,GAAG,MAAM,EAAO,EAC9B,SAAS,GAAQ,MAAgB,EACjC,cAAc,GAAG,MAAY,GAC5B,OAAO,CAAC,gBAAgB,CAAC,CA6D3B"}
|
package/dist/engine/executor.js
CHANGED
|
@@ -24,7 +24,7 @@ function buildSanitizedEnv(secretPatterns) {
|
|
|
24
24
|
* - secretPatterns에 해당하는 환경 변수는 자식 프로세스에 전달하지 않음
|
|
25
25
|
* - 실행 실패(명령 없음 포함)는 예외 대신 ok=false 봉투로 반환
|
|
26
26
|
*/
|
|
27
|
-
export async function execute(cmd, args, cwd, secretPatterns = [], timeoutMs = 10000) {
|
|
27
|
+
export async function execute(cmd, args, cwd, secretPatterns = [], timeoutMs = 10000, maxOutputBytes = 0) {
|
|
28
28
|
const start = Date.now();
|
|
29
29
|
const before = await takeSnapshot(cwd);
|
|
30
30
|
try {
|
|
@@ -35,6 +35,17 @@ export async function execute(cmd, args, cwd, secretPatterns = [], timeoutMs = 1
|
|
|
35
35
|
env: { ...buildSanitizedEnv(secretPatterns), LC_ALL: "C", LANG: "C" },
|
|
36
36
|
});
|
|
37
37
|
const after = await takeSnapshot(cwd);
|
|
38
|
+
// stdout 크기 제한: 초과 시 마지막 완전한 줄까지 잘라내고 truncated=true 표시
|
|
39
|
+
let outRaw = stdout;
|
|
40
|
+
let truncated;
|
|
41
|
+
if (maxOutputBytes > 0 && Buffer.byteLength(outRaw, "utf8") > maxOutputBytes) {
|
|
42
|
+
const buf = Buffer.from(outRaw, "utf8").subarray(0, maxOutputBytes);
|
|
43
|
+
const partial = buf.toString("utf8");
|
|
44
|
+
const lastNewline = partial.lastIndexOf("\n");
|
|
45
|
+
outRaw = lastNewline > 0 ? partial.slice(0, lastNewline + 1) : partial;
|
|
46
|
+
outRaw += `...[truncated: output exceeded ${maxOutputBytes} bytes]\n`;
|
|
47
|
+
truncated = true;
|
|
48
|
+
}
|
|
38
49
|
return {
|
|
39
50
|
ok: true,
|
|
40
51
|
exitCode: 0,
|
|
@@ -42,9 +53,10 @@ export async function execute(cmd, args, cwd, secretPatterns = [], timeoutMs = 1
|
|
|
42
53
|
args,
|
|
43
54
|
cwd,
|
|
44
55
|
duration_ms: Date.now() - start,
|
|
45
|
-
stdout: { raw:
|
|
56
|
+
stdout: { raw: outRaw, parsed: null },
|
|
46
57
|
stderr: { raw: stderr, parsed: null },
|
|
47
58
|
diff: computeDiff(before, after),
|
|
59
|
+
truncated,
|
|
48
60
|
};
|
|
49
61
|
}
|
|
50
62
|
catch (err) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/engine/executor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAE/D,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C;;;GAGG;AACH,SAAS,iBAAiB,CAAC,cAAwB;IACjD,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC,GAAG,CAAC;IAEpD,MAAM,SAAS,GAAsB,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACvD,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;QAChC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC;YAC/D,SAAS,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACzB,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,
|
|
1
|
+
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/engine/executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { PageInfo } from "../types/envelope.js";
|
|
2
|
+
export interface PaginateResult {
|
|
3
|
+
lines: string[];
|
|
4
|
+
page_info: PageInfo;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* raw stdout을 줄 단위로 분할하고 지정 페이지를 반환한다.
|
|
8
|
+
* trailing 빈 줄(마지막 newline으로 인한 빈 문자열)은 제외한다.
|
|
9
|
+
*/
|
|
10
|
+
export declare function paginateLines(raw: string, page: number, pageSize: number): PaginateResult;
|
|
11
|
+
//# sourceMappingURL=paginator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paginator.d.ts","sourceRoot":"","sources":["../../src/engine/paginator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAM,MAAM,EAAE,CAAC;IACpB,SAAS,EAAE,QAAQ,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,cAAc,CAqBzF"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* raw stdout을 줄 단위로 분할하고 지정 페이지를 반환한다.
|
|
3
|
+
* trailing 빈 줄(마지막 newline으로 인한 빈 문자열)은 제외한다.
|
|
4
|
+
*/
|
|
5
|
+
export function paginateLines(raw, page, pageSize) {
|
|
6
|
+
const allLines = raw.split("\n");
|
|
7
|
+
// trailing empty string from final newline 제거
|
|
8
|
+
if (allLines.length > 0 && allLines[allLines.length - 1] === "") {
|
|
9
|
+
allLines.pop();
|
|
10
|
+
}
|
|
11
|
+
const totalLines = allLines.length;
|
|
12
|
+
const start = page * pageSize;
|
|
13
|
+
const end = start + pageSize;
|
|
14
|
+
const sliced = allLines.slice(start, end);
|
|
15
|
+
return {
|
|
16
|
+
lines: sliced,
|
|
17
|
+
page_info: {
|
|
18
|
+
page,
|
|
19
|
+
page_size: pageSize,
|
|
20
|
+
total_lines: totalLines,
|
|
21
|
+
has_next: end < totalLines,
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=paginator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paginator.js","sourceRoot":"","sources":["../../src/engine/paginator.ts"],"names":[],"mappings":"AAOA;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,GAAW,EAAE,IAAY,EAAE,QAAgB;IACvE,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACjC,8CAA8C;IAC9C,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;QAChE,QAAQ,CAAC,GAAG,EAAE,CAAC;IACjB,CAAC;IAED,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC;IACnC,MAAM,KAAK,GAAQ,IAAI,GAAG,QAAQ,CAAC;IACnC,MAAM,GAAG,GAAU,KAAK,GAAG,QAAQ,CAAC;IACpC,MAAM,MAAM,GAAO,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAE9C,OAAO;QACL,KAAK,EAAM,MAAM;QACjB,SAAS,EAAE;YACT,IAAI;YACJ,SAAS,EAAI,QAAQ;YACrB,WAAW,EAAE,UAAU;YACvB,QAAQ,EAAK,GAAG,GAAG,UAAU;SAC9B;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,4 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
import type { ParseContext } from "../registry.js";
|
|
2
|
+
export interface FindSummary {
|
|
3
|
+
total: number;
|
|
4
|
+
shown: number;
|
|
5
|
+
truncated: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare function parseFind(cmd: string, args: string[], raw: string, ctx?: ParseContext): {
|
|
2
8
|
paths: string[];
|
|
9
|
+
_summary?: FindSummary;
|
|
3
10
|
};
|
|
4
11
|
//# sourceMappingURL=find.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"find.d.ts","sourceRoot":"","sources":["../../../src/parsers/fs/find.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"find.d.ts","sourceRoot":"","sources":["../../../src/parsers/fs/find.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAM,MAAM,CAAC;IAClB,KAAK,EAAM,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,SAAS,CACvB,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,YAAY,GAC3D;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,CAAC,EAAE,WAAW,CAAA;CAAE,CAW7C"}
|
package/dist/parsers/fs/find.js
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
|
-
export function parseFind(cmd, args, raw) {
|
|
1
|
+
export function parseFind(cmd, args, raw, ctx) {
|
|
2
2
|
const paths = raw.split("\n").map(l => l.trim()).filter(Boolean);
|
|
3
|
+
const maxItems = ctx?.maxItems ?? 0;
|
|
4
|
+
if (maxItems > 0 && paths.length > maxItems) {
|
|
5
|
+
return {
|
|
6
|
+
paths: paths.slice(0, maxItems),
|
|
7
|
+
_summary: { total: paths.length, shown: maxItems, truncated: true },
|
|
8
|
+
};
|
|
9
|
+
}
|
|
3
10
|
return { paths };
|
|
4
11
|
}
|
|
5
12
|
//# sourceMappingURL=find.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"find.js","sourceRoot":"","sources":["../../../src/parsers/fs/find.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"find.js","sourceRoot":"","sources":["../../../src/parsers/fs/find.ts"],"names":[],"mappings":"AAQA,MAAM,UAAU,SAAS,CACvB,GAAW,EAAE,IAAc,EAAE,GAAW,EAAE,GAAkB;IAE5D,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAEjE,MAAM,QAAQ,GAAG,GAAG,EAAE,QAAQ,IAAI,CAAC,CAAC;IACpC,IAAI,QAAQ,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC;QAC5C,OAAO;YACL,KAAK,EAAK,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC;YAClC,QAAQ,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE;SACpE,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,CAAC;AACnB,CAAC"}
|
package/dist/parsers/fs/ls.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { ParseContext } from "../registry.js";
|
|
1
2
|
export interface LsEntry {
|
|
2
3
|
permissions: string;
|
|
3
4
|
links: number;
|
|
@@ -8,7 +9,13 @@ export interface LsEntry {
|
|
|
8
9
|
name: string;
|
|
9
10
|
type: "file" | "directory" | "symlink" | "other";
|
|
10
11
|
}
|
|
11
|
-
export
|
|
12
|
+
export interface LsSummary {
|
|
13
|
+
total: number;
|
|
14
|
+
shown: number;
|
|
15
|
+
truncated: boolean;
|
|
16
|
+
}
|
|
17
|
+
export declare function parseLs(cmd: string, args: string[], raw: string, ctx?: ParseContext): {
|
|
12
18
|
entries: LsEntry[];
|
|
19
|
+
_summary?: LsSummary;
|
|
13
20
|
};
|
|
14
21
|
//# sourceMappingURL=ls.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ls.d.ts","sourceRoot":"","sources":["../../../src/parsers/fs/ls.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,OAAO;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAQ,MAAM,CAAC;IACpB,KAAK,EAAQ,MAAM,CAAC;IACpB,KAAK,EAAQ,MAAM,CAAC;IACpB,UAAU,EAAG,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAS,MAAM,CAAC;IACpB,IAAI,EAAS,MAAM,GAAG,WAAW,GAAG,SAAS,GAAG,OAAO,CAAC;CACzD;AAED,
|
|
1
|
+
{"version":3,"file":"ls.d.ts","sourceRoot":"","sources":["../../../src/parsers/fs/ls.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD,MAAM,WAAW,OAAO;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAQ,MAAM,CAAC;IACpB,KAAK,EAAQ,MAAM,CAAC;IACpB,KAAK,EAAQ,MAAM,CAAC;IACpB,UAAU,EAAG,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAS,MAAM,CAAC;IACpB,IAAI,EAAS,MAAM,GAAG,WAAW,GAAG,SAAS,GAAG,OAAO,CAAC;CACzD;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAM,MAAM,CAAC;IAClB,KAAK,EAAM,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,OAAO,CACrB,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,YAAY,GAC3D;IAAE,OAAO,EAAE,OAAO,EAAE,CAAC;IAAC,QAAQ,CAAC,EAAE,SAAS,CAAA;CAAE,CAoC9C"}
|
package/dist/parsers/fs/ls.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export function parseLs(cmd, args, raw) {
|
|
1
|
+
export function parseLs(cmd, args, raw, ctx) {
|
|
2
2
|
const entries = [];
|
|
3
3
|
for (const line of raw.split("\n")) {
|
|
4
4
|
if (!line || line.startsWith("total "))
|
|
@@ -21,6 +21,13 @@ export function parseLs(cmd, args, raw) {
|
|
|
21
21
|
: "other",
|
|
22
22
|
});
|
|
23
23
|
}
|
|
24
|
+
const maxItems = ctx?.maxItems ?? 0;
|
|
25
|
+
if (maxItems > 0 && entries.length > maxItems) {
|
|
26
|
+
return {
|
|
27
|
+
entries: entries.slice(0, maxItems),
|
|
28
|
+
_summary: { total: entries.length, shown: maxItems, truncated: true },
|
|
29
|
+
};
|
|
30
|
+
}
|
|
24
31
|
return { entries };
|
|
25
32
|
}
|
|
26
33
|
//# sourceMappingURL=ls.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ls.js","sourceRoot":"","sources":["../../../src/parsers/fs/ls.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ls.js","sourceRoot":"","sources":["../../../src/parsers/fs/ls.ts"],"names":[],"mappings":"AAmBA,MAAM,UAAU,OAAO,CACrB,GAAW,EAAE,IAAc,EAAE,GAAW,EAAE,GAAkB;IAE5D,MAAM,OAAO,GAAc,EAAE,CAAC;IAE9B,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,SAAS;QAEjD,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAClB,0FAA0F,CAC3F,CAAC;QACF,IAAI,CAAC,CAAC;YAAE,SAAS;QAEjB,MAAM,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QAEtE,OAAO,CAAC,IAAI,CAAC;YACX,WAAW,EAAE,QAAQ,GAAG,KAAK;YAC7B,KAAK,EAAQ,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC;YAChC,KAAK;YACL,KAAK;YACL,UAAU,EAAG,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;YAC/B,WAAW,EAAE,KAAK,CAAC,IAAI,EAAE;YACzB,IAAI,EAAS,IAAI,CAAC,IAAI,EAAE;YACxB,IAAI,EAAS,QAAQ,KAAK,GAAG,CAAC,CAAC,CAAC,WAAW;gBAChC,CAAC,CAAC,QAAQ,KAAK,GAAG,CAAC,CAAC,CAAC,SAAS;oBAC9B,CAAC,CAAC,QAAQ,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM;wBAC3B,CAAC,CAAC,OAAO;SACrB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,QAAQ,GAAG,GAAG,EAAE,QAAQ,IAAI,CAAC,CAAC;IACpC,IAAI,QAAQ,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC;QAC9C,OAAO;YACL,OAAO,EAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC;YACpC,QAAQ,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE;SACtE,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,CAAC;AACrB,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { ParseContext } from "../registry.js";
|
|
1
2
|
export interface PsEntry {
|
|
2
3
|
user: string;
|
|
3
4
|
pid: number;
|
|
@@ -11,7 +12,13 @@ export interface PsEntry {
|
|
|
11
12
|
time: string;
|
|
12
13
|
command: string;
|
|
13
14
|
}
|
|
14
|
-
export
|
|
15
|
+
export interface PsSummary {
|
|
16
|
+
total: number;
|
|
17
|
+
shown: number;
|
|
18
|
+
truncated: boolean;
|
|
19
|
+
}
|
|
20
|
+
export declare function parsePs(cmd: string, args: string[], raw: string, ctx?: ParseContext): {
|
|
15
21
|
processes: PsEntry[];
|
|
22
|
+
_summary?: PsSummary;
|
|
16
23
|
};
|
|
17
24
|
//# sourceMappingURL=ps.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ps.d.ts","sourceRoot":"","sources":["../../../src/parsers/process/ps.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,OAAO;IACtB,IAAI,EAAK,MAAM,CAAC;IAChB,GAAG,EAAM,MAAM,CAAC;IAChB,GAAG,EAAM,MAAM,CAAC;IAChB,GAAG,EAAM,MAAM,CAAC;IAChB,GAAG,EAAM,MAAM,CAAC;IAChB,GAAG,EAAM,MAAM,CAAC;IAChB,GAAG,EAAM,MAAM,CAAC;IAChB,IAAI,EAAK,MAAM,CAAC;IAChB,KAAK,EAAI,MAAM,CAAC;IAChB,IAAI,EAAK,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,
|
|
1
|
+
{"version":3,"file":"ps.d.ts","sourceRoot":"","sources":["../../../src/parsers/process/ps.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD,MAAM,WAAW,OAAO;IACtB,IAAI,EAAK,MAAM,CAAC;IAChB,GAAG,EAAM,MAAM,CAAC;IAChB,GAAG,EAAM,MAAM,CAAC;IAChB,GAAG,EAAM,MAAM,CAAC;IAChB,GAAG,EAAM,MAAM,CAAC;IAChB,GAAG,EAAM,MAAM,CAAC;IAChB,GAAG,EAAM,MAAM,CAAC;IAChB,IAAI,EAAK,MAAM,CAAC;IAChB,KAAK,EAAI,MAAM,CAAC;IAChB,IAAI,EAAK,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAM,MAAM,CAAC;IAClB,KAAK,EAAM,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,OAAO,CACrB,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,YAAY,GAC3D;IAAE,SAAS,EAAE,OAAO,EAAE,CAAC;IAAC,QAAQ,CAAC,EAAE,SAAS,CAAA;CAAE,CA8BhD"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export function parsePs(cmd, args, raw) {
|
|
1
|
+
export function parsePs(cmd, args, raw, ctx) {
|
|
2
2
|
const lines = raw.split("\n").filter(Boolean);
|
|
3
3
|
const processes = [];
|
|
4
4
|
for (const line of lines.slice(1)) {
|
|
@@ -19,6 +19,13 @@ export function parsePs(cmd, args, raw) {
|
|
|
19
19
|
command: cols.slice(10).join(" "),
|
|
20
20
|
});
|
|
21
21
|
}
|
|
22
|
+
const maxItems = ctx?.maxItems ?? 0;
|
|
23
|
+
if (maxItems > 0 && processes.length > maxItems) {
|
|
24
|
+
return {
|
|
25
|
+
processes: processes.slice(0, maxItems),
|
|
26
|
+
_summary: { total: processes.length, shown: maxItems, truncated: true },
|
|
27
|
+
};
|
|
28
|
+
}
|
|
22
29
|
return { processes };
|
|
23
30
|
}
|
|
24
31
|
//# sourceMappingURL=ps.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ps.js","sourceRoot":"","sources":["../../../src/parsers/process/ps.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ps.js","sourceRoot":"","sources":["../../../src/parsers/process/ps.ts"],"names":[],"mappings":"AAsBA,MAAM,UAAU,OAAO,CACrB,GAAW,EAAE,IAAc,EAAE,GAAW,EAAE,GAAkB;IAE5D,MAAM,KAAK,GAAO,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAClD,MAAM,SAAS,GAAc,EAAE,CAAC;IAEhC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE;YAAE,SAAS;QAC/B,SAAS,CAAC,IAAI,CAAC;YACb,IAAI,EAAK,IAAI,CAAC,CAAC,CAAC;YAChB,GAAG,EAAM,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YAC9B,GAAG,EAAM,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC5B,GAAG,EAAM,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC5B,GAAG,EAAM,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YAC9B,GAAG,EAAM,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YAC9B,GAAG,EAAM,IAAI,CAAC,CAAC,CAAC;YAChB,IAAI,EAAK,IAAI,CAAC,CAAC,CAAC;YAChB,KAAK,EAAI,IAAI,CAAC,CAAC,CAAC;YAChB,IAAI,EAAK,IAAI,CAAC,CAAC,CAAC;YAChB,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;SAClC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,QAAQ,GAAG,GAAG,EAAE,QAAQ,IAAI,CAAC,CAAC;IACpC,IAAI,QAAQ,GAAG,CAAC,IAAI,SAAS,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC;QAChD,OAAO;YACL,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC;YACvC,QAAQ,EAAG,EAAE,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE;SACzE,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,SAAS,EAAE,CAAC;AACvB,CAAC"}
|
|
@@ -1,7 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 파서가 항목 수를 제한할 때 사용하는 컨텍스트.
|
|
3
|
+
* maxItems=0 이면 무제한.
|
|
4
|
+
*/
|
|
5
|
+
export interface ParseContext {
|
|
6
|
+
maxItems: number;
|
|
7
|
+
}
|
|
1
8
|
/**
|
|
2
9
|
* 파서 함수 시그니처.
|
|
3
10
|
*/
|
|
4
|
-
export type ParserFn = (cmd: string, args: string[], raw: string) => unknown;
|
|
11
|
+
export type ParserFn = (cmd: string, args: string[], raw: string, ctx?: ParseContext) => unknown;
|
|
5
12
|
/**
|
|
6
13
|
* 명령어 → 파서 함수의 매핑 테이블.
|
|
7
14
|
* 파서가 없거나 실패하면 null을 반환한다 (graceful degradation).
|
|
@@ -13,6 +20,6 @@ export declare class ParserRegistry {
|
|
|
13
20
|
* cmd에 등록된 파서를 찾아 실행한다.
|
|
14
21
|
* 파서 없음 또는 예외 → null 반환.
|
|
15
22
|
*/
|
|
16
|
-
parse(cmd: string, args: string[], raw: string): unknown | null;
|
|
23
|
+
parse(cmd: string, args: string[], raw: string, ctx?: ParseContext): unknown | null;
|
|
17
24
|
}
|
|
18
25
|
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/parsers/registry.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/parsers/registry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,YAAY,KAAK,OAAO,CAAC;AAEjG;;;GAGG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA+B;IAEvD,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,GAAG,IAAI;IAIzC;;;OAGG;IACH,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,YAAY,GAAG,OAAO,GAAG,IAAI;CAUpF"}
|
package/dist/parsers/registry.js
CHANGED
|
@@ -11,12 +11,12 @@ export class ParserRegistry {
|
|
|
11
11
|
* cmd에 등록된 파서를 찾아 실행한다.
|
|
12
12
|
* 파서 없음 또는 예외 → null 반환.
|
|
13
13
|
*/
|
|
14
|
-
parse(cmd, args, raw) {
|
|
14
|
+
parse(cmd, args, raw, ctx) {
|
|
15
15
|
const fn = this.parsers.get(cmd);
|
|
16
16
|
if (!fn)
|
|
17
17
|
return null;
|
|
18
18
|
try {
|
|
19
|
-
return fn(cmd, args, raw);
|
|
19
|
+
return fn(cmd, args, raw, ctx);
|
|
20
20
|
}
|
|
21
21
|
catch {
|
|
22
22
|
return null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/parsers/registry.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/parsers/registry.ts"],"names":[],"mappings":"AAaA;;;GAGG;AACH,MAAM,OAAO,cAAc;IACR,OAAO,GAAG,IAAI,GAAG,EAAoB,CAAC;IAEvD,QAAQ,CAAC,GAAW,EAAE,EAAY;QAChC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC5B,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,GAAW,EAAE,IAAc,EAAE,GAAW,EAAE,GAAkB;QAChE,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QAErB,IAAI,CAAC;YACH,OAAO,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QACjC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;CACF"}
|
|
@@ -1,9 +1,16 @@
|
|
|
1
|
+
import type { ParseContext } from "../registry.js";
|
|
1
2
|
export interface GrepMatch {
|
|
2
3
|
file: string;
|
|
3
4
|
line: number;
|
|
4
5
|
text: string;
|
|
5
6
|
}
|
|
6
|
-
export
|
|
7
|
+
export interface GrepSummary {
|
|
8
|
+
total: number;
|
|
9
|
+
shown: number;
|
|
10
|
+
truncated: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare function parseGrep(cmd: string, args: string[], raw: string, ctx?: ParseContext): {
|
|
7
13
|
matches: GrepMatch[];
|
|
14
|
+
_summary?: GrepSummary;
|
|
8
15
|
};
|
|
9
16
|
//# sourceMappingURL=grep.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grep.d.ts","sourceRoot":"","sources":["../../../src/parsers/text/grep.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,
|
|
1
|
+
{"version":3,"file":"grep.d.ts","sourceRoot":"","sources":["../../../src/parsers/text/grep.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAM,MAAM,CAAC;IAClB,KAAK,EAAM,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,SAAS,CACvB,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,YAAY,GAC3D;IAAE,OAAO,EAAE,SAAS,EAAE,CAAC;IAAC,QAAQ,CAAC,EAAE,WAAW,CAAA;CAAE,CA6ClD"}
|
|
@@ -1,9 +1,15 @@
|
|
|
1
|
-
export function parseGrep(cmd, args, raw) {
|
|
1
|
+
export function parseGrep(cmd, args, raw, ctx) {
|
|
2
2
|
const matches = [];
|
|
3
3
|
for (const line of raw.split("\n")) {
|
|
4
4
|
if (!line.trim())
|
|
5
5
|
continue;
|
|
6
|
-
//
|
|
6
|
+
// Case 1: 첫 세그먼트가 순수 숫자 → linenum:text (단일파일 grep -n)
|
|
7
|
+
const lineNumOnly = line.match(/^(\d+):(.*)$/);
|
|
8
|
+
if (lineNumOnly) {
|
|
9
|
+
matches.push({ file: "", line: parseInt(lineNumOnly[1], 10), text: lineNumOnly[2] });
|
|
10
|
+
continue;
|
|
11
|
+
}
|
|
12
|
+
// Case 2: file:linenum:text 형태 (grep -rn 또는 다중파일 -n)
|
|
7
13
|
const withLineNum = line.match(/^([^:]+):(\d+):(.*)$/);
|
|
8
14
|
if (withLineNum) {
|
|
9
15
|
matches.push({
|
|
@@ -13,7 +19,7 @@ export function parseGrep(cmd, args, raw) {
|
|
|
13
19
|
});
|
|
14
20
|
continue;
|
|
15
21
|
}
|
|
16
|
-
// file:text 형태 (grep -r without -n) — 콜론 앞이 파일 경로
|
|
22
|
+
// Case 3: file:text 형태 (grep -r without -n) — 콜론 앞이 파일 경로
|
|
17
23
|
const colonIdx = line.indexOf(":");
|
|
18
24
|
if (colonIdx > 0) {
|
|
19
25
|
matches.push({
|
|
@@ -26,6 +32,13 @@ export function parseGrep(cmd, args, raw) {
|
|
|
26
32
|
matches.push({ file: "", line: 0, text: line });
|
|
27
33
|
}
|
|
28
34
|
}
|
|
35
|
+
const maxItems = ctx?.maxItems ?? 0;
|
|
36
|
+
if (maxItems > 0 && matches.length > maxItems) {
|
|
37
|
+
return {
|
|
38
|
+
matches: matches.slice(0, maxItems),
|
|
39
|
+
_summary: { total: matches.length, shown: maxItems, truncated: true },
|
|
40
|
+
};
|
|
41
|
+
}
|
|
29
42
|
return { matches };
|
|
30
43
|
}
|
|
31
44
|
//# sourceMappingURL=grep.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grep.js","sourceRoot":"","sources":["../../../src/parsers/text/grep.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"grep.js","sourceRoot":"","sources":["../../../src/parsers/text/grep.ts"],"names":[],"mappings":"AAcA,MAAM,UAAU,SAAS,CACvB,GAAW,EAAE,IAAc,EAAE,GAAW,EAAE,GAAkB;IAE5D,MAAM,OAAO,GAAgB,EAAE,CAAC;IAEhC,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YAAE,SAAS;QAE3B,sDAAsD;QACtD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QAC/C,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAE,EAAE,CAAC,CAAC;YACvF,SAAS;QACX,CAAC;QAED,qDAAqD;QACrD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QACvD,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,WAAW,CAAC,CAAC,CAAE;gBACrB,IAAI,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC;gBACnC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAE;aACtB,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,0DAA0D;QAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;YACjB,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC;gBAC7B,IAAI,EAAE,CAAC;gBACP,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC;aAC/B,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,GAAG,EAAE,QAAQ,IAAI,CAAC,CAAC;IACpC,IAAI,QAAQ,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC;QAC9C,OAAO;YACL,OAAO,EAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC;YACpC,QAAQ,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE;SACtE,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,CAAC;AACrB,CAAC"}
|
package/dist/server.d.ts
CHANGED
|
@@ -5,6 +5,11 @@ import type { PrismConfig } from "./config/loader.js";
|
|
|
5
5
|
* MCP 서버와 테스트 코드가 공통으로 사용한다.
|
|
6
6
|
*/
|
|
7
7
|
export declare function buildRunResult(cmd: string, args: string[], cwd: string, config: PrismConfig): Promise<string>;
|
|
8
|
+
/**
|
|
9
|
+
* Guard 검사 → 실행 → 페이지 분할 → JSON 직렬화.
|
|
10
|
+
* parsed는 항상 null (부분 출력은 구조화 파싱 불가).
|
|
11
|
+
*/
|
|
12
|
+
export declare function buildPagedResult(cmd: string, args: string[], cwd: string, page: number, pageSize: number, config: PrismConfig): Promise<string>;
|
|
8
13
|
/**
|
|
9
14
|
* MCP 서버를 생성하고 `run` 도구를 등록한다.
|
|
10
15
|
*/
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAmB,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAmB,yCAAyC,CAAC;AAOjF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAY,oBAAoB,CAAC;AAI5D;;;GAGG;AACH,wBAAsB,cAAc,CAClC,GAAG,EAAK,MAAM,EACd,IAAI,EAAI,MAAM,EAAE,EAChB,GAAG,EAAK,MAAM,EACd,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,MAAM,CAAC,CA+BjB;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAO,MAAM,EAChB,IAAI,EAAM,MAAM,EAAE,EAClB,GAAG,EAAO,MAAM,EAChB,IAAI,EAAM,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAI,WAAW,GACpB,OAAO,CAAC,MAAM,CAAC,CAqCjB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,CA2C3D"}
|
package/dist/server.js
CHANGED
|
@@ -3,7 +3,8 @@ import { z } from "zod";
|
|
|
3
3
|
import { execute } from "./engine/executor.js";
|
|
4
4
|
import { checkGuard, GuardError } from "./engine/guard.js";
|
|
5
5
|
import { defaultRegistry } from "./parsers/index.js";
|
|
6
|
-
|
|
6
|
+
import { paginateLines } from "./engine/paginator.js";
|
|
7
|
+
const PACKAGE_VERSION = "0.1.4";
|
|
7
8
|
/**
|
|
8
9
|
* Guard 검사 → 실행 → JSON 직렬화까지의 파이프라인.
|
|
9
10
|
* MCP 서버와 테스트 코드가 공통으로 사용한다.
|
|
@@ -30,11 +31,48 @@ export async function buildRunResult(cmd, args, cwd, config) {
|
|
|
30
31
|
}
|
|
31
32
|
throw err;
|
|
32
33
|
}
|
|
33
|
-
const envelope = await execute(cmd, args, cwd, config.guard.env_secret_patterns, config.guard.timeout_ms);
|
|
34
|
-
const parsed = defaultRegistry.parse(cmd, args, envelope.stdout.raw);
|
|
34
|
+
const envelope = await execute(cmd, args, cwd, config.guard.env_secret_patterns, config.guard.timeout_ms, config.guard.max_output_bytes);
|
|
35
|
+
const parsed = defaultRegistry.parse(cmd, args, envelope.stdout.raw, { maxItems: config.guard.max_items });
|
|
35
36
|
const enriched = { ...envelope, stdout: { ...envelope.stdout, parsed } };
|
|
36
37
|
return JSON.stringify(enriched, null, 2);
|
|
37
38
|
}
|
|
39
|
+
/**
|
|
40
|
+
* Guard 검사 → 실행 → 페이지 분할 → JSON 직렬화.
|
|
41
|
+
* parsed는 항상 null (부분 출력은 구조화 파싱 불가).
|
|
42
|
+
*/
|
|
43
|
+
export async function buildPagedResult(cmd, args, cwd, page, pageSize, config) {
|
|
44
|
+
try {
|
|
45
|
+
checkGuard(cmd, args, cwd, config);
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
if (err instanceof GuardError) {
|
|
49
|
+
const envelope = {
|
|
50
|
+
ok: false,
|
|
51
|
+
exitCode: -1,
|
|
52
|
+
cmd,
|
|
53
|
+
args,
|
|
54
|
+
cwd,
|
|
55
|
+
duration_ms: 0,
|
|
56
|
+
stdout: { raw: "", parsed: null },
|
|
57
|
+
stderr: { raw: err.message, parsed: null },
|
|
58
|
+
diff: null,
|
|
59
|
+
guard_error: { reason: err.reason, message: err.message },
|
|
60
|
+
};
|
|
61
|
+
return JSON.stringify(envelope, null, 2);
|
|
62
|
+
}
|
|
63
|
+
throw err;
|
|
64
|
+
}
|
|
65
|
+
// 전체 stdout이 필요하므로 max_output_bytes 비활성 (0)
|
|
66
|
+
const envelope = await execute(cmd, args, cwd, config.guard.env_secret_patterns, config.guard.timeout_ms, 0);
|
|
67
|
+
const { lines, page_info } = paginateLines(envelope.stdout.raw, page, pageSize);
|
|
68
|
+
const pagedRaw = lines.join("\n") + (lines.length > 0 ? "\n" : "");
|
|
69
|
+
const enriched = {
|
|
70
|
+
...envelope,
|
|
71
|
+
stdout: { raw: pagedRaw, parsed: null },
|
|
72
|
+
page_info,
|
|
73
|
+
};
|
|
74
|
+
return JSON.stringify(enriched, null, 2);
|
|
75
|
+
}
|
|
38
76
|
/**
|
|
39
77
|
* MCP 서버를 생성하고 `run` 도구를 등록한다.
|
|
40
78
|
*/
|
|
@@ -54,6 +92,19 @@ export function createServer(config) {
|
|
|
54
92
|
content: [{ type: "text", text: result }],
|
|
55
93
|
};
|
|
56
94
|
});
|
|
95
|
+
server.tool("run_paged", "Execute a shell command and return paginated stdout. " +
|
|
96
|
+
"Use this for commands with large output (ps aux, find, grep -r). " +
|
|
97
|
+
"Returns page_info with total_lines and has_next for navigation.", {
|
|
98
|
+
cmd: z.string().describe("Command name"),
|
|
99
|
+
args: z.array(z.string()).default([]).describe("Command arguments"),
|
|
100
|
+
cwd: z.string().default(process.cwd()).describe("Working directory"),
|
|
101
|
+
page: z.number().int().min(0).default(0).describe("Page index (0-based)"),
|
|
102
|
+
page_size: z.number().int().min(1).default(config.guard.default_page_size)
|
|
103
|
+
.describe("Lines per page"),
|
|
104
|
+
}, async ({ cmd, args, cwd, page, page_size }) => {
|
|
105
|
+
const result = await buildPagedResult(cmd, args, cwd, page, page_size, config);
|
|
106
|
+
return { content: [{ type: "text", text: result }] };
|
|
107
|
+
});
|
|
57
108
|
return server;
|
|
58
109
|
}
|
|
59
110
|
//# sourceMappingURL=server.js.map
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAmB,yCAAyC,CAAC;AAEjF,OAAO,EAAE,CAAC,EAAE,MAA2B,KAAK,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAqB,sBAAsB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAa,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/dist/types/envelope.d.ts
CHANGED
|
@@ -14,6 +14,15 @@ export interface DiffField {
|
|
|
14
14
|
deleted: string[];
|
|
15
15
|
modified: string[];
|
|
16
16
|
}
|
|
17
|
+
/**
|
|
18
|
+
* run_paged 응답에 포함되는 페이지 메타데이터.
|
|
19
|
+
*/
|
|
20
|
+
export interface PageInfo {
|
|
21
|
+
page: number;
|
|
22
|
+
page_size: number;
|
|
23
|
+
total_lines: number;
|
|
24
|
+
has_next: boolean;
|
|
25
|
+
}
|
|
17
26
|
/**
|
|
18
27
|
* Prism의 모든 명령 실행 결과가 따르는 응답 봉투.
|
|
19
28
|
* - ok: 실행 성공 여부 (exitCode === 0)
|
|
@@ -29,5 +38,7 @@ export interface ResponseEnvelope {
|
|
|
29
38
|
stdout: OutputField;
|
|
30
39
|
stderr: OutputField;
|
|
31
40
|
diff: DiffField | null;
|
|
41
|
+
truncated?: boolean;
|
|
42
|
+
page_info?: PageInfo;
|
|
32
43
|
}
|
|
33
44
|
//# sourceMappingURL=envelope.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"envelope.d.ts","sourceRoot":"","sources":["../../src/types/envelope.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAK,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;CACxB;AAGD,MAAM,MAAM,WAAW,GAAG,WAAW,CAAC;AAEtC;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,OAAO,EAAG,MAAM,EAAE,CAAC;IACnB,OAAO,EAAG,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAW,OAAO,CAAC;IACrB,QAAQ,EAAK,MAAM,CAAC;IACpB,GAAG,EAAU,MAAM,CAAC;IACpB,IAAI,EAAS,MAAM,EAAE,CAAC;IACtB,GAAG,EAAU,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAO,WAAW,CAAC;IACzB,MAAM,EAAO,WAAW,CAAC;IACzB,IAAI,EAAS,SAAS,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"envelope.d.ts","sourceRoot":"","sources":["../../src/types/envelope.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAK,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;CACxB;AAGD,MAAM,MAAM,WAAW,GAAG,WAAW,CAAC;AAEtC;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,OAAO,EAAG,MAAM,EAAE,CAAC;IACnB,OAAO,EAAG,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAS,MAAM,CAAC;IACpB,SAAS,EAAI,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAK,OAAO,CAAC;CACtB;AAED;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAW,OAAO,CAAC;IACrB,QAAQ,EAAK,MAAM,CAAC;IACpB,GAAG,EAAU,MAAM,CAAC;IACpB,IAAI,EAAS,MAAM,EAAE,CAAC;IACtB,GAAG,EAAU,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAO,WAAW,CAAC;IACzB,MAAM,EAAO,WAAW,CAAC;IACzB,IAAI,EAAS,SAAS,GAAG,IAAI,CAAC;IAC9B,SAAS,CAAC,EAAG,OAAO,CAAC;IACrB,SAAS,CAAC,EAAG,QAAQ,CAAC;CACvB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nerdvana/parism",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.4",
|
|
4
4
|
"description": "Structured shell output wrapper for AI agents",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -23,6 +23,11 @@
|
|
|
23
23
|
"typescript": "^5.7.0",
|
|
24
24
|
"vitest": "^3.0.0"
|
|
25
25
|
},
|
|
26
|
-
"files": [
|
|
27
|
-
|
|
26
|
+
"files": [
|
|
27
|
+
"dist",
|
|
28
|
+
"prism.config.json"
|
|
29
|
+
],
|
|
30
|
+
"engines": {
|
|
31
|
+
"node": ">=20"
|
|
32
|
+
}
|
|
28
33
|
}
|