@nerdvana/parism 0.2.0 → 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 (89) hide show
  1. package/README.en.md +88 -43
  2. package/README.md +69 -43
  3. package/dist/config/loader.d.ts.map +1 -1
  4. package/dist/config/loader.js +12 -8
  5. package/dist/config/loader.js.map +1 -1
  6. package/dist/engine/executor.d.ts +3 -1
  7. package/dist/engine/executor.d.ts.map +1 -1
  8. package/dist/engine/executor.js +8 -6
  9. package/dist/engine/executor.js.map +1 -1
  10. package/dist/engine/guard.d.ts.map +1 -1
  11. package/dist/engine/guard.js +24 -4
  12. package/dist/engine/guard.js.map +1 -1
  13. package/dist/parsers/compact.d.ts.map +1 -1
  14. package/dist/parsers/compact.js +12 -1
  15. package/dist/parsers/compact.js.map +1 -1
  16. package/dist/parsers/devops/helm.d.ts +27 -0
  17. package/dist/parsers/devops/helm.d.ts.map +1 -0
  18. package/dist/parsers/devops/helm.js +41 -0
  19. package/dist/parsers/devops/helm.js.map +1 -0
  20. package/dist/parsers/devops/index.d.ts +2 -0
  21. package/dist/parsers/devops/index.d.ts.map +1 -1
  22. package/dist/parsers/devops/index.js +2 -0
  23. package/dist/parsers/devops/index.js.map +1 -1
  24. package/dist/parsers/devops/terraform.d.ts +22 -0
  25. package/dist/parsers/devops/terraform.d.ts.map +1 -0
  26. package/dist/parsers/devops/terraform.js +30 -0
  27. package/dist/parsers/devops/terraform.js.map +1 -0
  28. package/dist/parsers/fs/ls.js +1 -1
  29. package/dist/parsers/fs/ls.js.map +1 -1
  30. package/dist/parsers/fs/stat.d.ts.map +1 -1
  31. package/dist/parsers/fs/stat.js +33 -0
  32. package/dist/parsers/fs/stat.js.map +1 -1
  33. package/dist/parsers/git/diff.d.ts +23 -2
  34. package/dist/parsers/git/diff.d.ts.map +1 -1
  35. package/dist/parsers/git/diff.js +57 -2
  36. package/dist/parsers/git/diff.js.map +1 -1
  37. package/dist/parsers/index.d.ts.map +1 -1
  38. package/dist/parsers/index.js +13 -2
  39. package/dist/parsers/index.js.map +1 -1
  40. package/dist/parsers/network/netstat.d.ts.map +1 -1
  41. package/dist/parsers/network/netstat.js +7 -2
  42. package/dist/parsers/network/netstat.js.map +1 -1
  43. package/dist/parsers/packages/cargo.d.ts +23 -0
  44. package/dist/parsers/packages/cargo.d.ts.map +1 -0
  45. package/dist/parsers/packages/cargo.js +41 -0
  46. package/dist/parsers/packages/cargo.js.map +1 -0
  47. package/dist/parsers/packages/index.d.ts +3 -0
  48. package/dist/parsers/packages/index.d.ts.map +1 -0
  49. package/dist/parsers/packages/index.js +3 -0
  50. package/dist/parsers/packages/index.js.map +1 -0
  51. package/dist/parsers/packages/npm.d.ts +23 -0
  52. package/dist/parsers/packages/npm.d.ts.map +1 -0
  53. package/dist/parsers/packages/npm.js +38 -0
  54. package/dist/parsers/packages/npm.js.map +1 -0
  55. package/dist/parsers/registry.d.ts +18 -5
  56. package/dist/parsers/registry.d.ts.map +1 -1
  57. package/dist/parsers/registry.js +8 -6
  58. package/dist/parsers/registry.js.map +1 -1
  59. package/dist/parsers/system/apt.d.ts +24 -0
  60. package/dist/parsers/system/apt.d.ts.map +1 -0
  61. package/dist/parsers/system/apt.js +38 -0
  62. package/dist/parsers/system/apt.js.map +1 -0
  63. package/dist/parsers/system/brew.d.ts +22 -0
  64. package/dist/parsers/system/brew.d.ts.map +1 -0
  65. package/dist/parsers/system/brew.js +31 -0
  66. package/dist/parsers/system/brew.js.map +1 -0
  67. package/dist/parsers/system/index.d.ts +4 -0
  68. package/dist/parsers/system/index.d.ts.map +1 -1
  69. package/dist/parsers/system/index.js +4 -0
  70. package/dist/parsers/system/index.js.map +1 -1
  71. package/dist/parsers/system/journalctl.d.ts +27 -0
  72. package/dist/parsers/system/journalctl.d.ts.map +1 -0
  73. package/dist/parsers/system/journalctl.js +57 -0
  74. package/dist/parsers/system/journalctl.js.map +1 -0
  75. package/dist/parsers/system/systemctl.d.ts +27 -0
  76. package/dist/parsers/system/systemctl.d.ts.map +1 -0
  77. package/dist/parsers/system/systemctl.js +50 -0
  78. package/dist/parsers/system/systemctl.js.map +1 -0
  79. package/dist/parsers/windows/tasklist.d.ts.map +1 -1
  80. package/dist/parsers/windows/tasklist.js +0 -2
  81. package/dist/parsers/windows/tasklist.js.map +1 -1
  82. package/dist/server.d.ts +3 -3
  83. package/dist/server.d.ts.map +1 -1
  84. package/dist/server.js +48 -18
  85. package/dist/server.js.map +1 -1
  86. package/dist/types/envelope.d.ts +9 -0
  87. package/dist/types/envelope.d.ts.map +1 -1
  88. package/package.json +7 -1
  89. package/prism.config.json +9 -4
package/dist/server.js CHANGED
@@ -6,7 +6,7 @@ import { defaultRegistry } from "./parsers/index.js";
6
6
  import { paginateLines } from "./engine/paginator.js";
7
7
  import { toCompact } from "./parsers/compact.js";
8
8
  import { tryParseNativeJson } from "./parsers/json-passthrough.js";
9
- export const PACKAGE_VERSION = "0.2.0";
9
+ export const PACKAGE_VERSION = "0.4.0";
10
10
  /**
11
11
  * Guard 차단 시 반환하는 에러 봉투를 생성한다.
12
12
  */
@@ -28,7 +28,7 @@ function buildGuardErrorEnvelope(cmd, args, cwd, err) {
28
28
  * Guard 검사 → 실행 → JSON 직렬화까지의 파이프라인.
29
29
  * MCP 서버와 테스트 코드가 공통으로 사용한다.
30
30
  */
31
- export async function buildRunResult(cmd, args, cwd, config, format = "json") {
31
+ export async function buildRunResult(cmd, args, cwd, config, format = "json", includeDiff = true) {
32
32
  try {
33
33
  checkGuard(cmd, args, cwd, config);
34
34
  }
@@ -37,19 +37,24 @@ export async function buildRunResult(cmd, args, cwd, config, format = "json") {
37
37
  return buildGuardErrorEnvelope(cmd, args, cwd, err);
38
38
  throw err;
39
39
  }
40
- const envelope = await execute(cmd, args, cwd, config.guard.env_secret_patterns, config.guard.timeout_ms, config.guard.max_output_bytes);
41
- let parsed = defaultRegistry.parse(cmd, args, envelope.stdout.raw, { maxItems: config.guard.max_items, format });
40
+ const envelope = await execute(cmd, args, cwd, config.guard.env_secret_patterns, config.guard.timeout_ms, config.guard.max_output_bytes, includeDiff);
41
+ const parseFormat = format === "json-no-raw" ? "json" : format;
42
+ const parseResult = defaultRegistry.parse(cmd, args, envelope.stdout.raw, { maxItems: config.guard.max_items, format: parseFormat });
43
+ let parsed = parseResult.parsed;
42
44
  if (parsed == null)
43
45
  parsed = tryParseNativeJson(envelope.stdout.raw);
44
- const final = format === "compact" ? toCompact(parsed) : parsed;
45
- const enriched = { ...envelope, stdout: { ...envelope.stdout, parsed: final } };
46
+ const final = parseFormat === "compact" ? toCompact(parsed) : parsed;
47
+ const stdout = format === "json-no-raw"
48
+ ? { raw: "", parsed: final, ...(parseResult.parse_error && { parse_error: parseResult.parse_error }) }
49
+ : { ...envelope.stdout, parsed: final, ...(parseResult.parse_error && { parse_error: parseResult.parse_error }) };
50
+ const enriched = { ...envelope, stdout };
46
51
  return JSON.stringify(enriched, null, 2);
47
52
  }
48
53
  /**
49
54
  * Guard 검사 → 실행 → 페이지 분할 → JSON 직렬화.
50
55
  * parsed는 항상 null (부분 출력은 구조화 파싱 불가).
51
56
  */
52
- export async function buildPagedResult(cmd, args, cwd, page, pageSize, config) {
57
+ export async function buildPagedResult(cmd, args, cwd, page, pageSize, config, includeDiff = true) {
53
58
  try {
54
59
  checkGuard(cmd, args, cwd, config);
55
60
  }
@@ -59,7 +64,7 @@ export async function buildPagedResult(cmd, args, cwd, page, pageSize, config) {
59
64
  throw err;
60
65
  }
61
66
  // 전체 stdout이 필요하므로 max_output_bytes 비활성 (0)
62
- const envelope = await execute(cmd, args, cwd, config.guard.env_secret_patterns, config.guard.timeout_ms, 0);
67
+ const envelope = await execute(cmd, args, cwd, config.guard.env_secret_patterns, config.guard.timeout_ms, 0, includeDiff);
63
68
  const { lines, page_info } = paginateLines(envelope.stdout.raw, page, pageSize);
64
69
  const pagedRaw = lines.join("\n") + (lines.length > 0 ? "\n" : "");
65
70
  const enriched = {
@@ -69,24 +74,47 @@ export async function buildPagedResult(cmd, args, cwd, page, pageSize, config) {
69
74
  };
70
75
  return JSON.stringify(enriched, null, 2);
71
76
  }
77
+ const MCP_INSTRUCTIONS = `Parism: Structured shell output for AI agents.
78
+
79
+ When to use Parism:
80
+ - File listing (ls, find): Get entries[] with name, type, size, permissions — no raw parsing.
81
+ - Git state (status, log, diff): Structured branch, modified[], commits[], hunks — code review ready.
82
+ - Process/container (ps, docker ps): Structured processes[]/containers[] — filter by PID, status.
83
+ - Disk/network (df, netstat): Structured filesystems[]/connections[] — no column alignment guess.
84
+ - System (systemctl list-units, journalctl -o short-iso): units[]/entries[] — service status, logs.
85
+ - DevOps (helm list, terraform plan): releases[]/summary — deployments, plan changes.
86
+ - Packages (apt list, brew list, npm list, cargo tree): packages[]/dependencies[]/crates[].
87
+ - When output has spaces in filenames or OS-specific format: Parism parses deterministically, CFR 0%.
88
+ - When you need to count, filter, or compare: Use parsed.entries.length, parsed.files_changed, etc.
89
+
90
+ When NOT to use: Simple one-line output (pwd, echo), or when you need pipe/redirect (Guard blocks).
91
+
92
+ Tools:
93
+ - run: Execute command, get structured JSON. format: json|compact|json-no-raw.
94
+ - run_paged: Paginated stdout for large output (ps aux, find, grep -r). parsed is always null.
95
+
96
+ Usage:
97
+ 1. Prefer run when output is small. Use format=compact for token savings.
98
+ 2. For large output: run_paged(page=0) first, check page_info.total_lines, then fetch needed pages.
99
+ 3. Guard blocks disallowed commands. Check result.ok and result.guard_error on failure.
100
+ 4. stdout.parsed has structured data; stdout.raw is fallback. Schema varies by command.`;
72
101
  /**
73
102
  * MCP 서버를 생성하고 `run` 도구를 등록한다.
74
103
  */
75
104
  export function createServer(config) {
76
- const server = new McpServer({
77
- name: "parism",
78
- version: PACKAGE_VERSION,
79
- });
105
+ const server = new McpServer({ name: "parism", version: PACKAGE_VERSION }, { instructions: MCP_INSTRUCTIONS });
80
106
  server.tool("run", "Execute a shell command and receive structured output. " +
81
107
  "All commands are filtered through an execution guard (whitelist + injection prevention). " +
82
108
  "Use format='compact' for token-efficient columnar output.", {
83
109
  cmd: z.string().describe("Command name (e.g. 'ls', 'git')"),
84
110
  args: z.array(z.string()).default([]).describe("Command arguments"),
85
111
  cwd: z.string().default(process.cwd()).describe("Working directory"),
86
- format: z.enum(["json", "compact"]).default("json")
87
- .describe("Output format. 'compact' uses columnar schema+rows for lower token cost"),
88
- }, async ({ cmd, args, cwd, format }) => {
89
- const result = await buildRunResult(cmd, args, cwd, config, format);
112
+ format: z.enum(["json", "compact", "json-no-raw"]).default("json")
113
+ .describe("Output format. 'compact'=columnar. 'json-no-raw'=omit raw for token savings."),
114
+ includeDiff: z.boolean().default(false)
115
+ .describe("Include filesystem diff (created/deleted/modified). false=skip snapshot, lower latency."),
116
+ }, async ({ cmd, args, cwd, format, includeDiff }) => {
117
+ const result = await buildRunResult(cmd, args, cwd, config, format, includeDiff);
90
118
  return {
91
119
  content: [{ type: "text", text: result }],
92
120
  };
@@ -100,8 +128,10 @@ export function createServer(config) {
100
128
  page: z.number().int().min(0).default(0).describe("Page index (0-based)"),
101
129
  page_size: z.number().int().min(1).default(config.guard.default_page_size)
102
130
  .describe("Lines per page"),
103
- }, async ({ cmd, args, cwd, page, page_size }) => {
104
- const result = await buildPagedResult(cmd, args, cwd, page, page_size, config);
131
+ includeDiff: z.boolean().default(false)
132
+ .describe("Include filesystem diff. false=skip snapshot, lower latency."),
133
+ }, async ({ cmd, args, cwd, page, page_size, includeDiff }) => {
134
+ const result = await buildPagedResult(cmd, args, cwd, page, page_size, config, includeDiff);
105
135
  return { content: [{ type: "text", text: result }] };
106
136
  });
107
137
  return server;
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,18 @@
1
+ /**
2
+ * 파서 예외 정보. 파서가 예외를 던졌을 때만 존재. "파서 없음"과 "파서 버그"를 구분한다.
3
+ */
4
+ export interface ParseErrorField {
5
+ reason: "parser_exception";
6
+ message: string;
7
+ }
1
8
  /**
2
9
  * 명령 stdout/stderr 필드. raw는 항상 보존되고, parsed는 파서 존재 시 채워진다.
10
+ * parse_error는 파서가 예외를 던졌을 때만 존재한다 (파서 없음과 구분).
3
11
  */
4
12
  export interface OutputField {
5
13
  raw: string;
6
14
  parsed: unknown | null;
15
+ parse_error?: ParseErrorField;
7
16
  }
8
17
  export type StdoutField = OutputField;
9
18
  /**
@@ -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;;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"}
1
+ {"version":3,"file":"envelope.d.ts","sourceRoot":"","sources":["../../src/types/envelope.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAG,kBAAkB,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAU,MAAM,CAAC;IACpB,MAAM,EAAO,OAAO,GAAG,IAAI,CAAC;IAC5B,WAAW,CAAC,EAAE,eAAe,CAAC;CAC/B;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.2.0",
3
+ "version": "0.4.0",
4
4
  "description": "Structured shell output wrapper for AI agents",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -14,6 +14,7 @@
14
14
  "test": "vitest run",
15
15
  "test:watch": "vitest",
16
16
  "test:coverage": "vitest run --coverage",
17
+ "lint": "eslint src tests",
17
18
  "benchmark": "npx tsx benchmarks/index.ts"
18
19
  },
19
20
  "dependencies": {
@@ -21,10 +22,15 @@
21
22
  "zod": "^3.24.0"
22
23
  },
23
24
  "devDependencies": {
25
+ "@eslint/js": "^10.0.1",
24
26
  "@types/node": "^22.0.0",
27
+ "@typescript-eslint/eslint-plugin": "^8.56.1",
28
+ "@typescript-eslint/parser": "^8.56.1",
25
29
  "@vitest/coverage-v8": "^3.0.0",
30
+ "eslint": "^10.0.3",
26
31
  "gpt-tokenizer": "^3.4.0",
27
32
  "typescript": "^5.7.0",
33
+ "typescript-eslint": "^8.56.1",
28
34
  "vitest": "^3.0.0"
29
35
  },
30
36
  "files": [
package/prism.config.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "guard": {
3
3
  "allowed_commands": [
4
4
  "ls", "find", "stat", "du", "df", "tree",
5
- "ps", "kill",
5
+ "ps",
6
6
  "ping", "curl", "netstat", "lsof", "ss", "dig",
7
7
  "grep", "wc", "head", "tail", "cat",
8
8
  "git",
@@ -11,14 +11,19 @@
11
11
  "echo", "date", "hostname",
12
12
  "npm", "node", "npx",
13
13
  "dir", "tasklist", "ipconfig", "systeminfo",
14
- "kubectl", "docker", "gh"
14
+ "kubectl", "docker", "gh",
15
+ "terraform", "helm", "cargo",
16
+ "systemctl", "journalctl", "apt", "brew"
15
17
  ],
16
- "allowed_paths": [],
18
+ "allowed_paths": ["./"],
17
19
  "timeout_ms": 10000,
18
20
  "block_patterns": [";", "$(", "`", "&&", "||", ">", ">>", "<", "|"],
19
21
  "command_arg_restrictions": {
20
22
  "node": { "blocked_flags": ["-e", "--eval", "-r", "--require", "-p", "--print", "--input-type"] },
21
- "npx": { "blocked_flags": ["--yes", "-y"] }
23
+ "npx": { "blocked_flags": ["--yes", "-y"] },
24
+ "curl": {
25
+ "blocked_flags": ["-d", "--data", "-F", "--upload-file", "-T", "-K", "--config", "-o", "--output", "-O"]
26
+ }
22
27
  },
23
28
  "env_secret_patterns": [
24
29
  "TOKEN", "SECRET", "AUTHZ", "PASSWORD", "PASSWD", "CREDENTIAL"