
Parism
Refract the Shell. Every command, structured.
AI ์์ด์ ํธ๋ฅผ ์ํ ์์ ํ๊ณ ์์ธก ๊ฐ๋ฅํ OS ์คํ ๊ฒ์ดํธ์จ์ด.
๋ฌธ์: README ยท SPECIFICATION ยท SECURITY ยท CHANGELOG
์ค๊ณ ๊ฒฐ์ , ๋ฒ์ ์ด๋ ฅ, ๋ชจ๋ ๊ตฌ์กฐ์ ๋จ์ผ ๊ถ์ ๋ฌธ์: SPECIFICATION.md
์ ธ์ ๋น์ ์ ์ํด ์ค๊ณ๋์ง ์์๋ค
1969๋ Ken Thompson์ด Unix๋ฅผ ๋ง๋ค ๋, ๊ทธ๋ ์ถ๋ ฅ ๋์์ด ์ฌ๋์ด๋ผ๊ณ ๊ฐ์ ํ๋ค. ์ ํํ ๋งํ๋ฉด ํฐ๋ฏธ๋ ์์ ์์ ์๋, ๋์ด ๋ฌ๋ฆฐ ์๋ฌผ.
๋ฐ์ธ๊ธฐ๊ฐ ์ง๋ฌ๋ค. ์ด์ ํฐ๋ฏธ๋์ ์ฝ๋ ๊ฒ์ ์ฌ๋๋ง์ด ์๋๋ค.
AI ์์ด์ ํธ๋ ls -la๋ฅผ ์คํํ๊ณ , ๊ทธ ์ถ๋ ฅ์ ๋ฐ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฑฐ๊ธฐ์ ์ง์ง ์์
์ด ์์๋๋ค. ๊ณต๋ฐฑ์ ๊ธฐ์ค์ผ๋ก ๋ถ๋ฆฌํ๊ณ , ์ฒซ ๋ฒ์งธ ์ด์ด ๊ถํ์ด๊ณ , ์ธ ๋ฒ์งธ๊ฐ ์์ ์์ด๊ณ , ํ์ผ๋ช
์ด ์ด๋์ ์์ํ๋์ง๋ฅผ ํ ํฐ์ ํ์๊ฐ๋ฉฐ ์ถ๋ก ํ๋ค. ์ธ๊ฐ์ ๋์ด 0.1์ด์ ์ฒ๋ฆฌํ๋ ๊ฒ์.
์ด๊ฒ์ ๋ฒ์ญ์ด ์๋๋ค. ์ํธํ๋ ์ ๋ ์๋ ๋ฉ์์ง๋ฅผ ํด๋ ํ๋ ์ผ์ด๋ค.
์ ๋ฌธ์ ์ธ๊ฐ
์ธ ๋ฒ์ ๋ฒ์ญ์ด ์ผ์ด๋๋ค.
์ฒซ ๋ฒ์งธ: ์ปค๋์ด ํ์ผ์์คํ
๋ฉํ๋ฐ์ดํฐ๋ฅผ stat ๊ตฌ์กฐ์ฒด๋ก ๊ด๋ฆฌํ๋ค. inode, mode, uid, gid, size, mtime. ์ด๋ฏธ ์๋ฒฝํ๊ฒ ๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ๋ค.
๋ ๋ฒ์งธ: ls๊ฐ ๊ทธ ๊ตฌ์กฐ๋ฅผ ์ธ๊ฐ์ด ์ฝ๊ธฐ ์ข์ ํ
์คํธ๋ก ํํํํ๋ค. drwxr-xr-x 2 user group 4096 Mar 06 09:23 src. ๊ตฌ์กฐ๊ฐ ํ
์คํธ๋ก ๋ฌด๋์ง๋ค.
์ธ ๋ฒ์งธ: ์์ด์ ํธ๊ฐ ๊ทธ ํ ์คํธ๋ฅผ ๋ค์ ๊ตฌ์กฐ๋ก ๋๋๋ฆฌ๋ ค ํ๋ค. ๋ฌด๋์ง ๊ฒ์ ๋ค์ ์ธ์ฐ๋ ์์ ์ด๋ค.
Parism์ด ๊ฐ์ ํ๋ ๊ฒ์ ๋ ๋ฒ์งธ์ ์ธ ๋ฒ์งธ ์ฌ์ด๋ค. ํ ๋ฒ ๋ฒ๋ ค์ง ๊ตฌ์กฐ๋ฅผ ๋์ฐพ๋ ๊ฒ์ด๋ค.
์ด๊ฒ์ด ๋น์ฉ์ด๋ค. ls ํ ๋ฒ ์คํํ๊ณ ํ์ผ ๋ชฉ๋ก์ ์ป๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง, ์ค์ ๋ก๋ ์์ด์ ํธ๊ฐ ์ถ๋ ฅ์ ํ์ฑํ๋ ๋ฐ ์์ญ ๋ฒ์ ์ถ๋ก ๋จ๊ณ๋ฅผ ๊ฑฐ์น๋ค. ๊ทธ๋ฆฌ๊ณ ์ข
์ข
ํ๋ฆฐ๋ค. ๊ฒฝ๊ณ ์ผ์ด์ค, ์์์น ๋ชปํ ๊ณต๋ฐฑ, OS๋ณ๋ก ๋ฏธ๋ฌํ๊ฒ ๋ค๋ฅธ ์ถ๋ ฅ ํ์. ํ๋ฆฌ๋ฉด ์ฌ์๋ํ๋ค. ์ฌ์๋๋ ๋ค์ ํ ํฐ์ด๋ค.
์์งํ ์ด์ผ๊ธฐ โ ํ ํฐ์ ๋ ๋ ๋ค
Parism์ ๋ง๋ค ๋ ๊ธฐ๋ํ ๊ฒ์ ํ ํฐ ์ ์ฝ์ด์๋ค. ๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ๊ฐ raw ํ ์คํธ๋ณด๋ค ํจ์จ์ ์ผ ๊ฒ์ด๋ผ๊ณ .
17๊ฐ ์๋๋ฆฌ์ค๋ฅผ ๋ฒค์น๋งํฌํ ๊ฒฐ๊ณผ๋ ๊ทธ ๊ธฐ๋๋ฅผ ์ ๋ฉด์ผ๋ก ๋ฐฐ๋ฐํ๋ค. JSON ์ถ๋ ฅ์ raw ํ
์คํธ๋ณด๋ค ํ๊ท 205% ๋ ๋ฌด๊ฒ๋ค. ls -la 200๊ฐ ํ์ผ ๊ธฐ์ค์ผ๋ก raw 5,807 ํ ํฐ, Parism 15,531 ํ ํฐ. ๊ฑฐ์ ์ธ ๋ฐฐ๋ค. ํค ์ด๋ฆ์ด ๋งค ํญ๋ชฉ๋ง๋ค ๋ฐ๋ณต๋๊ธฐ ๋๋ฌธ์ด๋ค. ์ธ๊ฐ์ ๋์ ํ
์ด๋ธ ํค๋ ํ ์ค์ด๋ฉด ๋๋ ์ ๋ณด๋ฅผ N๋ฒ ์จ์ผ ํ๋ค.
ํ์ง๋ง ๊ฐ์ ๋ฒค์น๋งํฌ๊ฐ ๋ค๋ฅธ ์ฌ์ค ํ๋๋ฅผ ๋๋ฌ๋๋ค. ์์ด์ ํธ๊ฐ raw ํ ์คํธ๋ฅผ ์ง์ ํ์ฑํ ๋ ์ค๋ ๋ฅ ์ด ํ๊ท 4.18%, ๊ณต๋ฐฑ์ด ์์ธ ํ์ผ๋ช ์์๋ 28.6%์ ๋ฌํ๋ค. ์ด ๋ฒ ์ค ์ธ ๋ฒ์ ํ๋ฆฐ๋ค. ํ๋ฆฐ ๊ฒฐ๊ณผ๋ก ์์ด์ ํธ๊ฐ ๋ค์ ์์ ์ ์ํํ๊ณ , ๊ทธ ์์ ์ด ๋ ํ๋ฆฌ๊ณ , ๊ฒฐ๊ตญ ์ฌ๋์ด ๊ฐ์ ํด์ ๋๋๋ฆฐ๋ค. ์ฌ์๋ ํ ํฐ, ๋๋ฒ๊น ์๊ฐ, ๋กค๋ฐฑ ๋น์ฉ. ๋ณด์ด์ง ์๋ ๊ณณ์์ ๋น์ฉ์ด ๋ถ์ด๋๋ค.
๊ทธ๋ฌ๋ ๊ฐ์ ๋ฒค์น๋งํฌ๊ฐ ํ ๊ฐ์ง ๋ ๋ณด์ฌ์ค ๊ฒ์ด ์๋ค. "AIํํ ์ค๋ช ํ๋ ํ ํฐ"์ ์๋ฉธ์ด๋ค. raw ํ ์คํธ๋ฅผ ์ฃผ๋ฉด ์์ด์ ํธ์๊ฒ "์ด ์ถ๋ ฅ์ ์ด๋ฐ ํ์์ด๊ณ , ์ฒซ ๋ฒ์งธ ์ด์ด ๊ถํ์ด๊ณ , ์ธ ๋ฒ์งธ๊ฐ ์์ ์์ผ"๋ผ๊ณ ์๋ ค์ค์ผ ํ๋ค. ๊ทธ ์ปจํ ์คํธ ํ๋กฌํํธ๊ฐ Parism์ ์ฐ๋ฉด ํ๊ท 61% ์ค์ด๋ ๋ค. JSON์ด ์ค์ค๋ก ์๊ธฐ ๊ตฌ์กฐ๋ฅผ ์ค๋ช ํ๊ธฐ ๋๋ฌธ์ด๋ค. ์์ด์ ํธ๋ ํค๋ฅผ ์ฝ์ผ๋ฉด ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ญ์ ์ด ์ผ์ด๋๋ ์ง์ ์ด ์๋ค. ๋จ๋ฐ์ฑ ์กฐํ โ ls ํ ๋ฒ ์น๊ณ ๋๋๋ ์์
โ ์์๋ Parism์ด ํ ํฐ์ ๋ ๋จน๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์์ด์ ํธ๊ฐ ๋ค์ ์์
์ ์ฌ์ฉํ๋ ์๊ฐ, ๋น์ฉ ๊ตฌ์กฐ๊ฐ ๋ค์งํ๋ค. raw๋ฅผ ์๋ชป ์ฝ์ ์์ด์ ํธ๊ฐ ์กด์ฌํ์ง ์๋ ๊ฒฝ๋ก์ ํ์ผ์ ์ฐ๊ณ , ๊ทธ ์ค๋ฅ๋ฅผ ๋๋ฒ๊น
ํ๋๋ผ ํ์คํ ๋ฆฌ๋ฅผ ๋ค์ง๊ณ , ์ฌ์๋ํ๊ณ , ๋ ํ๋ฆฌ๋ ์ํ์ด ์์๋๋ฉด ํ ํฐ์ ๋๋ฉ์ด๊ฐ ๋๋ค. ๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ๋ก ์์ํ ์์ด์ ํธ๋ ๊ทธ ์ํ์ ์ง์
ํ์ง ์๋๋ค.
Parism์ ๊ฒฝ์ ์ฑ์ ์ฒญ๊ตฌ์ ์์ ์์ง ์๋ค. ํ ๋ฒ ๋ ์ฝ๋ ๋น์ฉ๋ณด๋ค, ํ ๋ฒ ์๋ชป ์ฝ์ด์ ์น๋ฅด๋ ๋น์ฉ์ด ์๋์ ์ผ๋ก ํฌ๋ค.
Parism์ด ํ๋ ์ผ
ํ๋ฆฌ์ฆ์ ๋น์ ํ๊ดดํ์ง ์๋๋ค. ๋ถํดํ ๋ฟ์ด๋ค.
"drwxr-xr-x 2 user group 4096 Mar 06 09:23 src"
โ Parism
{
"type": "directory",
"name": "src",
"permissions": { "owner": "rwx", "group": "r-x", "other": "r-x" },
"size_bytes": 4096,
"owner": "user",
"group": "group",
"modified_at": "2026-03-06T09:23:00"
}์ ๋ณด๋ ๋ฌ๋ผ์ง์ง ์๋๋ค. ํํ๊ฐ ๋ฌ๋ผ์ง๋ค. ์์ด์ ํธ๋ ์ด์ ํ์ฑํ์ง ์๋๋ค. ์ฝ๊ธฐ๋ง ํ๋ค.
์ด๋ป๊ฒ ์ข์๊ฐ
ํ์ฑ ์ค๋ฅ๊ฐ ์์ด์ง๋ค
ํ
์คํธ ํ์ฑ์ ๊นจ์ง๊ธฐ ์ฝ๋ค. ps aux๋ ๋ฆฌ๋
์ค์ macOS์์ ์ปฌ๋ผ ์์๊ฐ ๋ค๋ฅด๋ค. df -h์ 1K-blocks ํค๋๋ ํ๊ฒฝ์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ๋์จ๋ค. ํ์ผ๋ช
์ ๊ณต๋ฐฑ์ด ์์ผ๋ฉด ls ํ์ฑ์ ๊ฑฐ์ ๋ฐ๋์ ํ๋ฆฐ๋ค.
์์น๋ก ๋งํ๋ฉด: raw ํ ์คํธ๋ฅผ ์์ด์ ํธ๊ฐ ์ง์ ํ์ฑํ ๋ ํ๊ท CFR(Critical Failure Rate)์ 4.18%๋ค. ๊ณต๋ฐฑ์ด ํฌํจ๋ ํ์ผ๋ช ์ด ์์ด๋ฉด 28.6%๊น์ง ์น์๋๋ค. 1000ํ ํธ์ถ ์ 286ํ๋ ์๋ชป๋ ํ์ผ ๋ชฉ๋ก์ ๊ธฐ๋ฐ์ผ๋ก ์์ด์ ํธ๊ฐ ๋ค์ ์์ ์ ์ํํ๋ค๋ ๋ป์ด๋ค. ์๋ชป๋ ํ์ผ์ ์ฝ๊ณ , ์กด์ฌํ์ง ์๋ ๊ฒฝ๋ก์ ์ฐ๊ณ , ์๋ฑํ ํ์ผ์ ์ญ์ ํ๋ค.
macOS์ stat์ ๋ ๊ทน์ ์ด๋ค. Linux์ ์ถ๋ ฅ ํ์์ด ์์ ํ ๋ค๋ฅด๋ค. Linux๋ Size: 4096์ฒ๋ผ ๋ ์ด๋ธ์ด ๋ถ์ง๋ง, macOS๋ ๋ ์ด๋ธ ์๋ ๋จ์ผ ์ค์ด๋ค. Linux ํ์ฑ ํจํด์ ์ ์ฉํ๋ฉด ์ ํ๋๋ 0%๋ค. Parism์ OS๋ฅผ ๊ฐ์งํ๊ณ ์ ํฉํ ํ์๋ฅผ ์ ํํ๋ค. ์์ด์ ํธ๋ ๊ทธ ์ฐจ์ด๋ฅผ ์ ํ์๊ฐ ์๋ค.
Parism์ CFR์ 0%๋ค. ํ์๋ deterministic code์ด๊ธฐ ๋๋ฌธ์ด๋ค. ์ ๊ทํํ์ ์ถ๋ก ์ด ์๋๋ผ ๊ตฌ์กฐ์ ๋ถํด๋ค. ์์ด์ ํธ๋ ๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ๋ง ๋ฐ๋๋ค.
์ฌ์๋๊ฐ ์ค์ด๋ ๋ค
์์ด์ ํธ๊ฐ ์ถ๋ ฅ์ ์๋ชป ํด์ํ๋ฉด ์ฌ์ง๋ฌธํ๊ฑฐ๋, ๋ค๋ฅธ ๋ช
๋ น์ผ๋ก ๋ค์ ํ์ธํ๊ฑฐ๋, ์๋ชป๋ ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก ๋ค์ ๋จ๊ณ๋ฅผ ์งํํ๋ค. ์ธ ๊ฐ์ง ๋ชจ๋ ํ ํฐ์ด ๋ ๋ค. ๊ตฌ์กฐํ๋ ์ถ๋ ฅ์ ์คํด์ ์ฌ์ง๋ฅผ ์ค์ธ๋ค. ํ์ผ์ด ๋ช ๊ฐ์ธ์ง ๋ฌป์ง ์์๋ entries.length๋ค.
์์ด์ ํธ๊ฐ ๋ค๋ฅธ ์ผ์ ๋ ์ํ๊ฒ ๋๋ค
ํ ์คํธ๋ฅผ ํ์ฑํ๋ ๊ฒ์ ์ถ๋ก ์ด๋ค. ์ถ๋ก ์๋ ์ธ์ง ์์์ด ์๋ชจ๋๋ค. ์์ด์ ํธ๊ฐ ์ถ๋ ฅ ํ์์ ํด๋ ํ๋ ๋ฐ ์์์ ์ฐ๋ฉด, ์ค์ ์์ โ ์ฝ๋๋ฅผ ๋ถ์ํ๊ณ , ์ค๊ณ๋ฅผ ํ๋จํ๊ณ , ๋ค์ ๋จ๊ณ๋ฅผ ๊ฒฐ์ ํ๋ ์ผ โ ์ ์ธ ์์์ด ์ค์ด๋ ๋ค. ๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ผ๋ฉด ํ์ฑ์ด๋ผ๋ ์์ ์์ฒด๊ฐ ์ฌ๋ผ์ง๋ค. ์์ด์ ํธ๋ ์ฝ๊ธฐ๋ง ํ๋ฉด ๋๊ณ , ๋จ์ ์ญ๋์ ๋ณธ๋์ ์์ ์ ์ง์คํ ์ ์๋ค.
raw๊ฐ ํญ์ ๋ณด์กด๋๋ค
ํ์๊ฐ ํ๋ฆด ์๋ ์๋ค. ํ์๊ฐ ์๋ ๋ช
๋ น์ด์ผ ์๋ ์๋ค. ๊ทธ๋์ Parism์ raw๋ฅผ ํญ์ ์ ์งํ๋ค. parsed๋ ๋ณด๋์ค๋ค. raw๋ ๋ณดํ์ด๋ค. ์์ด์ ํธ๋ ํญ์ ์๋ณธ์ผ๋ก ๋์๊ฐ ์ ์๋ค.
"stdout": {
"raw": "drwxr-xr-x ...",
"parsed": { "entries": [ ... ] }
}์๋ต ๊ตฌ์กฐ๊ฐ ์ผ์ ํ๋ค
์ฑ๊ณต์ด๋ ์คํจ๋ , ok์ exitCode๋ ํญ์ ๊ฐ์ ์๋ฆฌ์ ์๋ค. ์์ด์ ํธ๊ฐ ๋ถ๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์์ฑํ๋ ๋ฐฉ์์ด ๋จ์ํด์ง๋ค. "stdout์ ํ์ฑํด์ ์ค๋ฅ์ธ์ง ํ์ธ"์ด ์๋๋ผ if (!result.ok)๋ค.
์คํ ์๊ฐ์ด ๊ธฐ๋ก๋๋ค
๋ชจ๋ ์๋ต์ duration_ms๊ฐ ํฌํจ๋๋ค. ๋ช
๋ น์ด ๋๋ฆฐ์ง ๋น ๋ฅธ์ง๋ฅผ ์์ด์ ํธ๊ฐ ํ๋จํ๋ ๋ฐ ์ธ ์ ์๋ค. ๋๋ฒ๊น
ํ ๋๋ ์ ์ฉํ๋ค.
diff๋ ์ ํ์ ์ด๋ค
includeDiff: true์ผ ๋๋ง diff์ created, deleted, modified๊ฐ ์ฑ์์ง๋ค. run/run_paged ๊ธฐ๋ณธ๊ฐ์ includeDiff: false์ด๋ฏ๋ก ์ค๋
์ท ๋น์ฉ์ ์๋ตํ์ฌ MCP ํธ์ถ ์ง์ฐ์ ์ค์ธ๋ค.
๊ฐ๋ โ ์์ด์ ํธ๋ฅผ ์ ๋ขฐํ์ง ์๋ ์ด์
rm -rf /๋ ์ธ ๊ฐ์ ๋ฌธ์๋ก ์ธ ์ ์๋ค.
์์ด์ ํธ๋ ์ค๋ฅ๋ฅผ ๋ฒํ๋ค. ๋ฌธ๋งฅ์ ์๊ณ , ๊ฒฝ๋ก๋ฅผ ์ฐฉ๊ฐํ๊ณ , ์๋ํ์ง ์์ ๋ช ๋ น์ ์์ฑํ๋ค. Guard๋ ์์ด์ ํธ๋ฅผ ๋ถ์ ํ๋ ๊ฒ์ด ์๋๋ค. ์์ด์ ํธ์ ์ค์๊ฐ ํ๊ตญ์ผ๋ก ์ด์ด์ง์ง ์๋๋ก ์ค๊ณํ๋ ๊ฒ์ด๋ค.
๋ค ๊ฒน์ ๋ฐฉ์ด์ ์ด ์๋ค.
ํ์ดํธ๋ฆฌ์คํธ: allowed_commands์ ์๋ ๋ช
๋ น์ด๋ ์คํ๋์ง ์๋๋ค. ํ๋ก์ธ์ค๋ฅผ ๋ง๋ค์ง๋ ์๋๋ค. ์ค๋ช
์์ด ๊ฑฐ์ ํ๋ค.
๊ฒฝ๋ก ์ ํ: allowed_paths๋ฅผ ์ค์ ํ๋ฉด cwd์ ๊ฒฝ๋ก ์ธ์๋ฅผ ๊ฒ์ฌํ๋ค. /, ./, ../๋ก ์์ํ๋ ์ธ์์, cat, find, ls, grep, git, docker, kubectl, cargo ๋ฑ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ ๋ช
๋ น์ positional ์ธ์(cat subdir/file, find src)๋ ํ์ฉ ๊ฒฝ๋ก ๋ฐ์ด๋ฉด ์ฐจ๋จ๋๋ค. ์ปค๋ ์์ค ์๋๋ฐ์ค๋ ์๋๋ฉฐ, ๊ฐ๋ ์์ค์ ๋ฐฉ์ด์ ์ด๋ค.
์ธ์ ์
ํจํด ์ฐจ๋จ: ๊ฐ ์ธ์๋ฅผ ๊ฐ๋ณ์ ์ผ๋ก ์ํํ๋ฉฐ ;, $(, `, &&, ||, |, >, >>, <๊ฐ ํฌํจ๋๋ฉด ์คํํ์ง ์๋๋ค. ์ธ์ ๋จ์ ๊ฒ์ฌ์ด๋ฏ๋ก ์๋ก ๋ค๋ฅธ ์ธ์ ๊ฒฝ๊ณ๋ฅผ ๋์ด์๋ ์คํ์ด ๋ฐ์ํ์ง ์๋๋ค.
๋ช
๋ น๋ณ ์ธ์ ์ ํ: ๋ช
๋ น๋ง๋ค ์ฐจ๋จํ ํ๋๊ทธ๋ฅผ ์ง์ ํ ์ ์๋ค. node -e, node --eval, node --input-type์ ๊ธฐ๋ณธ ์ฐจ๋จ๋๋ค. npx --yes๋ ๊ธฐ๋ณธ ์ฐจ๋จ๋๋ค.
์ฐจ๋จ๋ ๋ช ๋ น์ ์ด๋ฐ ์๋ต์ ๋ฐํํ๋ค.
{
"ok": false,
"guard_error": {
"reason": "command_not_allowed",
"message": "Command 'rm' is not in the allowed list"
},
"failure": {
"kind": "guard",
"reason": "command_not_allowed",
"message": "Command 'rm' is not in the allowed list"
}
}v0.6 ๋ถํฐ
failureํ๋๊ฐ ๊ถ์ ํ๋๋ค.guard_error๋ ํ์ ํธํ์ ์ํด ์ ์ง๋๋ค. ์์ด์ ํธ๋result.failure.kind๋ก ๋ถ๊ธฐํ๋ ๊ฒ์ ๊ถ์ฅํ๋ค.
์์ด์ ํธ๋ ์คํ ๊ฒฐ๊ณผ์ ๋์ผํ ๊ตฌ์กฐ๋ก ์ฐจ๋จ ์ด์ ๋ฅผ ๋ฐ๋๋ค. ์์ธ๊ฐ ํฐ์ง์ง ์๋๋ค. ํ์ดํ๋ผ์ธ์ด ๊นจ์ง์ง ์๋๋ค.
Guard์ ์ํ ๋ชจ๋ธ, 4๊ฒน ๋ฐฉ์ด์ ์ ํ๊ณ, ์ ๋ขฐํ ์ ์๋ ํ๊ฒฝ์์์ ๊ฒฉ๋ฆฌ ๊ถ๊ณ ๋ SECURITY.md๋ฅผ ์ฐธ์กฐํ๋ค.
์ง์ ๋ช ๋ น์ด โ 44์ข ๋ด์ฅ ํ์
| ์นดํ ๊ณ ๋ฆฌ | ๋ช ๋ น์ด | ํ์ฑ ๊ฒฐ๊ณผ | ๊ธฐ๋ณธ ํ์ฉ |
|---|---|---|---|
| ํ์ผ์์คํ | ls | entries[] โ ์ด๋ฆ, ํ์
, ๊ถํ, ํฌ๊ธฐ, ์์ ์๊ฐ, ์์ ์ | O |
| ํ์ผ์์คํ | find | paths[] โ ๊ฒฝ๋ก ๋ชฉ๋ก | O |
| ํ์ผ์์คํ | stat | file, size_bytes, inode, permissions, uid, gid, ํ์์คํฌํ | O |
| ํ์ผ์์คํ | du | entries[] โ ํฌ๊ธฐ, ๊ฒฝ๋ก | O |
| ํ์ผ์์คํ | df | filesystems[] โ ํํฐ์
, ์ฌ์ฉ๋, ๋ง์ดํธ ์์น | O |
| ํ์ผ์์คํ | tree | root, tree{} โ ๊ณ์ธต ๊ตฌ์กฐ ๋
ธ๋, total_files, total_dirs | O |
| ํ๋ก์ธ์ค | ps | processes[] โ PID, CPU%, MEM%, ๋ช
๋ น์ด | O |
| ํ๋ก์ธ์ค | kill | raw pass-through (๊ธฐ๋ณธ ์ฐจ๋จ, prism.config.json์์ ๋ช ์์ ํ์ฉ ์ ์ฌ์ฉ) | X |
| ๋คํธ์ํฌ | ping | target, packets_transmitted, packet_loss_percent, rtt_*_ms | O |
| ๋คํธ์ํฌ | curl -I | status_code, headers{} | O |
| ๋คํธ์ํฌ | netstat | connections[] โ proto, local/foreign address, state | O |
| ๋คํธ์ํฌ | lsof -i | entries[] โ PID, ํ๋ก์ธ์ค๋ช
, ํ๋กํ ์ฝ, ๋ก์ปฌ/์๊ฒฉ ์ฃผ์, ์ํ | X |
| ๋คํธ์ํฌ | ss | entries[] โ ์ํ, ์์ /๋ฐ์ ํ, ๋ก์ปฌ/ํผ์ด ์ฃผ์, ํ๋ก์ธ์ค | X |
| ๋คํธ์ํฌ | dig | query, answers[] โ ํ์
, ๊ฐ, TTL, query_time_ms | X |
| ํ ์คํธ | grep -n | matches[] โ ํ์ผ, ๋ผ์ธ ๋ฒํธ, ํ
์คํธ | O |
| ํ ์คํธ | wc | entries[] โ count, ํ์ผ๋ช
| O |
| ํ ์คํธ | head, tail, cat | lines[] | O |
| Git | git status | branch, staged[], modified[], untracked[] | O |
| Git | git log --oneline | commits[] โ hash, message | O |
| Git | git diff | files_changed[] | O |
| Git | git branch -vv | branches[] โ ์ด๋ฆ, current, upstream, ahead/behind | O |
| DevOps | kubectl get pods, kubectl get events | pods[]/events[] โ ์ํ, ์ฌ์๋, ์ด๋ฒคํธ ์ฌ์ /๋ฉ์์ง | O |
| DevOps | docker ps, docker stats --no-stream | containers[]/stats[] โ ์ด๋ฏธ์ง, ์ํ, CPU/MEM/IO | O |
| DevOps | gh pr list | pull_requests[] โ ๋ฒํธ, ์ ๋ชฉ, ์ํ, ์์ฑ์, ๋ผ๋ฒจ | O |
| DevOps | helm list | releases[] โ name, namespace, status, chart, app_version | O |
| DevOps | terraform plan | summary โ to_add, to_change, to_destroy | O |
| ํ๊ฒฝ | env | vars{} โ ํค-๊ฐ ๋งต | O |
| ํ๊ฒฝ | pwd | path | O |
| ํ๊ฒฝ | which | paths[] | O |
| ์์คํ | free | rows{} โ mem/swap๋ณ total, used, free, available (bytes) | X |
| ์์คํ | uname | kernel, hostname, release, version, arch, os | O |
| ์์คํ | id | uid, gid, username, groups[] โ id, name | X |
| ์์คํ | systemctl list-units | units[] โ name, load, active, sub, description (Linux) | O |
| ์์คํ | journalctl -o short-iso | entries[] โ timestamp, hostname, unit, pid, message (Linux) | O |
| ์์คํ | apt list --installed | packages[] โ name, version, arch, status | O |
| ์์คํ | brew list --versions | packages[] โ name, version | O |
| ํจํค์ง | npm list, pnpm list, yarn list | dependencies[] โ name, version, depth | O |
| ํจํค์ง | cargo tree | crates[] โ name, version, path | O |
| Windows | dir | directory, entries[] โ ์ด๋ฆ, ํ์
, ํฌ๊ธฐ, ์์ ์๊ฐ, free_bytes | X |
| Windows | tasklist | processes[] โ ์ด๋ฆ, PID, ์ธ์
, ๋ฉ๋ชจ๋ฆฌ. CSV ํ์ ์ง์ | X |
| Windows | ipconfig | hostname, adapters[] โ IPv4/6, ์๋ธ๋ท, ๊ฒ์ดํธ์จ์ด, DNS, MAC | X |
| Windows | systeminfo | hostname, os_name, ๋ฉ๋ชจ๋ฆฌ, hotfixes[], network_cards[] | X |
๊ธฐ๋ณธ ํ์ฉ(O)=DEFAULT_CONFIG์ ํฌํจ. X=prism.config.json์์ ๋ช ์์ ํ์ฉ ํ์.
ํ์๊ฐ ์๋ ๋ช
๋ น์ด๋ parsed: null๋ก ๋ฐํ๋๋ค. raw๋ ๊ทธ๋๋ก ์๋ค. ํ์๊ฐ ์์ธ๋ฅผ ๋์ง๋ฉด stdout.parse_error์ { reason: "parser_exception", message: string }๊ฐ ํฌํจ๋์ด "ํ์ ์์"๊ณผ "ํ์ ๋ฒ๊ทธ"๋ฅผ ๊ตฌ๋ถํ ์ ์๋ค.
v0.6 ๋ถํฐ
parse_error.reason์"parser_exception","parser_not_found","schema_violation"์ธ ๊ฐ์ ๊ฐ์ง ์ ์๋ค. ๊ฐ์ ์ ๋ณด๊ฐresult.failure.kind === "parse"๋ก๋ ๋ ธ์ถ๋๋ค.
๋ค์ดํฐ๋ธ JSON ํจ์ค์ค๋ฃจ
ํ์๊ฐ ์๋ ๋ช
๋ น์ด๋ผ๋ ์ถ๋ ฅ ์์ฒด๊ฐ JSON์ด๋ฉด(์: kubectl get pods -o json, docker inspect) Parism์ด ์ด๋ฅผ ์๋์ผ๋ก ๊ฐ์งํ์ฌ parsed์ ๋ฃ๋๋ค. Guard ๊ฒ์ฌ์ ๋ดํฌ ๋ํ์ ๋์ผํ๊ฒ ์ ์ฉ๋๋ค. ๋ณ๋ ์ค์ ์ ํ์ ์๋ค.
์ค์น
npx
npx @nerdvana/parism๋ก์ปฌ ๋น๋
git clone https://github.com/JinHo-von-Choi/parism
cd parism
npm install && npm run build
node dist/index.js๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ชจ๋
MCP ์๋ฒ ์์ด Node.js ํ๋ก์ธ์ค ๋ด๋ถ์์ Parism ์ ์ง์ ํธ์ถํ ์ ์๋ค. v1.0.0 ๋ถํฐ ์ ์ API ๋ค. Semantic Versioning ์ ๋ฐ๋ฅด๋ฉฐ, breaking change ๋ v2.0.0 ์์๋ง ๋ฐ์ํ๋ค.
์ต์ ์์:
import { createEngine } from "@nerdvana/parism/engine";
const engine = await createEngine();
const result = await engine.run("ls", { args: ["-la"] });
console.log(result.stdout.parsed);createEngine()์ prism.config.json์ ๋ก๋ํ๊ณ ์ธ๋ถ ํ์๋ฅผ ๋ฑ๋กํ ๋ค ParismEngine ์ธ์คํด์ค๋ฅผ ๋ฐํํ๋ค. ์ปค์คํ
์ค์ ๊ฒฝ๋ก๊ฐ ํ์ํ๋ฉด createEngine({ configPath: "/path/to/prism.config.json" })์ ์ฌ์ฉํ๋ค.
์ค์ ๊ฒฝ๋ก ์ง์ ๊ณผ failure ๋ถ๊ธฐ๋ฅผ ํจ๊ป ์ฐ๋ ์ค์ฉ ์์:
import { createEngine } from "@nerdvana/parism/engine";
const engine = await createEngine({
configPath: "/path/to/custom/prism.config.json",
});
const result = await engine.run("git", { args: ["status", "--porcelain"] });
if (!result.ok) {
console.error(`[${result.failure?.kind}] ${result.failure?.reason}: ${result.failure?.message}`);
process.exit(1);
}
console.log(result.stdout.parsed);RunOptions โ args / cwd / format / includeDiff. RunPagedOptions โ ์ ์ต์
์ ์ฒด + page / page_size.
์ค๊ณ ์์ธ๋ SPECIFICATION.md ยง1.1 ์ฐธ์กฐ.
MCP ํด๋ผ์ด์ธํธ ์ค์
Parism ์ MCP stdio ํ๋กํ ์ฝ์ ํตํด ์ฃผ์ AI CLI/IDE ์ ์ฐ๊ฒฐํ ์ ์๋ค. ํด๋ผ์ด์ธํธ๋ณ ์์ธ ์ค์ ์ docs/mcp-clients/ ๋๋ ํ ๋ฆฌ๋ฅผ ์ฐธ์กฐํ๋ค.
| ํด๋ผ์ด์ธํธ | ๊ฐ์ด๋ |
|---|---|
| Claude Desktop | docs/mcp-clients/claude-desktop.md |
| Claude Code | docs/mcp-clients/claude-code.md |
| Cursor | docs/mcp-clients/cursor.md |
| Gemini CLI | docs/mcp-clients/gemini-cli.md |
| Codex CLI | docs/mcp-clients/codex.md |
| GitHub Copilot CLI | docs/mcp-clients/copilot-cli.md |
์ฐ๊ฒฐ์ด ์ฑ๊ณตํ๋ฉด run, run_paged, describe, dry_run ๋ค ๋๊ตฌ๊ฐ ๋
ธ์ถ๋๋ค. ์์ด์ ํธ๋ ๋จผ์ describe๋ก ํ์ฉ ๋ช
๋ น๊ณผ ํ์๋ฅผ ํ์
ํ๊ณ , dry_run์ผ๋ก guard ํต๊ณผ ์ฌ๋ถ๋ฅผ ์ฌ์ ํ์ธํ ๋ค, run / run_paged๋ก ๋ช
๋ น์ ์คํํ๊ณ ๊ตฌ์กฐํ๋ JSON ์๋ต์ ๋ฐ๋๋ค.
Tools
run
๋ชจ๋ ๋ช ๋ น์ ๊ธฐ๋ณธ ๋๊ตฌ. ์ถ๋ ฅ์ด ์๊ฑฐ๋ ๊ตฌ์กฐํ ํ์ฑ์ด ํ์ํ ๋ ์ฌ์ฉํ๋ค.
ํ๋ผ๋ฏธํฐ:
cmdโ ๋ช ๋ น์ด ์ด๋ฆ (์:ls,git)argsโ ์ธ์ ๋ฐฐ์ด (๊ธฐ๋ณธ๊ฐ:[])cwdโ ์์ ๋๋ ํ ๋ฆฌ (๊ธฐ๋ณธ๊ฐ: ํ์ฌ ๋๋ ํ ๋ฆฌ)formatโ ์ถ๋ ฅ ํ์ ("json"๊ธฐ๋ณธ๊ฐ,"compact","json-no-raw"). compact๋ ๋ฆฌ์คํธํ ์ถ๋ ฅ์ schema+rows ์ปฌ๋ผ ๊ธฐ๋ฐ์ผ๋ก ์์ถํ์ฌ ํ ํฐ ๋น์ฉ์ ์ ๊ฐํ๋ค.includeDiffโ ํ์ผ์์คํ diff ํฌํจ ์ฌ๋ถ (๊ธฐ๋ณธ๊ฐ:false).false๋ฉด ์ค๋ ์ท ์๋ต์ผ๋ก ์ง์ฐ ๊ฐ์. MCP ๊ณ ๋น๋ ํธ์ถ ์ ๊ถ์ฅ.
compact ์์:
{
"schema": ["name", "type", "size_bytes"],
"rows": [["src", "directory", 4096], ["main.ts", "file", 1200]]
}run_paged
๋์ฉ๋ ์ถ๋ ฅ์ ํ์ด์ง ๋จ์๋ก ์ฝ๋๋ค. ps aux, find, grep -r ๋ฑ์ ์ฌ์ฉํ๋ค.
ํ๋ผ๋ฏธํฐ:
cmd,args,cwdโrun๊ณผ ๋์ผpageโ 0-indexed ํ์ด์ง ๋ฒํธ (๊ธฐ๋ณธ๊ฐ:0)page_sizeโ ํ์ด์ง๋น ์ค ์ (๊ธฐ๋ณธ๊ฐ:default_page_size์ค์ ๊ฐ, ๊ธฐ๋ณธ 100)includeDiffโ ํ์ผ์์คํ diff ํฌํจ ์ฌ๋ถ (๊ธฐ๋ณธ๊ฐ:false).false๋ฉด ์ค๋ ์ท ์๋ต์ผ๋ก ์ง์ฐ ๊ฐ์.
์๋ต ์ถ๊ฐ ํ๋:
page_info.total_linesโ ์ ์ฒด ์ค ์page_info.has_nextโ ๋ค์ ํ์ด์ง ์กด์ฌ ์ฌ๋ถstdout.parsedโ ํญ์null(๋ถ๋ถ ์ถ๋ ฅ์ ๊ตฌ์กฐํ ๋ถ๊ฐ)
์์ด์ ํธ ํจํด:
1. run_paged(cmd, page=0) โ page_info.total_lines ํ์ธ
2. ๋ฒ์๊ฐ ์์ผ๋ฉด ๊ทธ๋๋ก ์ฌ์ฉ
3. ๋ฒ์๊ฐ ํฌ๋ฉด grep์ผ๋ก ๋จผ์ ํํฐ๋ง ํ run ํธ์ถ
4. ํ์ํ ํ์ด์ง๋ง run_paged(page=N) ์ถ๊ฐ ํธ์ถdescribe
์์ด์ ํธ ์จ๋ณด๋ฉ ๋๊ตฌ. ํ์ฌ ํ๊ฒฝ์ ํ์ฉ ๋ช ๋ น, ์ฌ์ฉ ๊ฐ๋ฅ ํ์, guard ์ ํ, ๋ฒ์ ์ ๋ณด๋ฅผ ๋ฐํํ๋ค.
ํ๋ผ๋ฏธํฐ: ์์.
์๋ต:
versionโ Parism ํจํค์ง ๋ฒ์ allowed_commandsโ guard์์ ํ์ฉํ๋ ๋ช ๋ น ๋ชฉ๋กavailable_parsersโ ๋ฑ๋ก๋ ํ์ ์ด๋ฆ ๋ชฉ๋กguard_summaryโtimeout_ms,max_output_bytes,max_items,block_patterns_count,allowed_pathstelemetry_enabledโ ํ ๋ ๋ฉํธ๋ฆฌ ํ์ฑํ ์ฌ๋ถ
์์ด์ ํธ๊ฐ Parism์ ์ฒ์ ์ฌ์ฉํ ๋ ์ด ๋๊ตฌ๋ฅผ ๋จผ์ ํธ์ถํ๋ฉด ๊ฐ์ฉ ๋ช ๋ น๊ณผ ์ ํ ์ฌํญ์ ํ๋์ ํ์ ํ ์ ์๋ค.
dry_run
guard ์ฌ์ ๊ฒ์ฆ ๋๊ตฌ. ๋ช ๋ น์ ์คํํ์ง ์๊ณ guard ํต๊ณผ ์ฌ๋ถ๋ง ํ์ธํ๋ค.
ํ๋ผ๋ฏธํฐ:
cmdโ ๋ช ๋ น์ด ์ด๋ฆ (์:rm,git)argsโ ์ธ์ ๋ฐฐ์ด (๊ธฐ๋ณธ๊ฐ:[])cwdโ ์์ ๋๋ ํ ๋ฆฌ (๊ธฐ๋ณธ๊ฐ: ํ์ฌ ๋๋ ํ ๋ฆฌ)
์๋ต:
would_passโ guard ํต๊ณผ ์ฌ๋ถreasonโ ์ฐจ๋จ ์ ์ฌ์ (command_not_allowed,path_not_allowed,injection_pattern,arg_not_allowed)messageโ ์ฐจ๋จ ์ ์์ธ ๋ฉ์์ง
์: dry_run("rm", ["-rf", "/"]) โ { would_pass: false, reason: "command_not_allowed", message: "..." }
์ค์
prism.config.json์ ํ๋ก์ ํธ ๋ฃจํธ์ ๋๋ฉด Guard ๋์์ ์ ์ดํ ์ ์๋ค.
{
"guard": {
"allowed_commands": ["ls", "git", "find", "grep", "env", "ps"],
"allowed_paths": ["/home/user/projects"],
"timeout_ms": 10000,
"max_output_bytes": 102400,
"max_items": 500,
"default_page_size": 100,
"block_patterns": [";", "$(", "`", "&&", "||", ">", ">>", "<", "|"],
"command_arg_restrictions": {
"node": { "blocked_flags": ["-e", "--eval", "-r", "--require", "-p", "--print", "--input-type"] },
"npx": { "blocked_flags": ["--yes", "-y"] }
},
"secrets": {
"env_patterns": ["TOKEN", "SECRET", "AUTHZ", "PASSWORD", "PASSWD", "CREDENTIAL"],
"output_patterns": ["Bearer [A-Za-z0-9._\\-]+", "ghp_[A-Za-z0-9]+"],
"output_redaction_enabled": false
}
},
"parsers": {
"strict_schemas": false
},
"telemetry": {
"enabled": false
}
}allowed_paths๊ฐ ๋น์ด ์์ผ๋ฉด ๊ฒฝ๋ก ์ ํ ์์ด ์คํ๋๋ค. ํ๋จ์ ๋น์ ๋ชซ์ด๋ค.
guard.secrets.env_patterns์ ์ผ์นํ๋ ํ๊ฒฝ ๋ณ์๋ ์คํ ์ ์์ ํ๋ก์ธ์ค์์ ์ ๊ฑฐ๋๋ค. env ๋ช
๋ น ์คํ ์ ํด๋น ๋ณ์๊ฐ ๋
ธ์ถ๋์ง ์๋๋ค.
guard.secrets.output_redaction_enabled๋ ๊ธฐ๋ณธ false ๋ก opt-in ๋ฐฉ์์ด๋ค. true ๋ก ์ค์ ํ๋ฉด output_patterns ์ ๋งค์นญ๋๋ ๋ฌธ์์ด์ ๋ช
๋ น ์คํ ํ raw ์ถ๋ ฅ์์ [REDACTED] ๋ก ๋์ฒดํ๋ค. ํ์ฑ ์ ์ ์ ์ฉ๋๋ฏ๋ก stdout.parsed ๊ฒฐ๊ณผ์๋ ์ํฅ์ ์ฃผ์ง ์๋๋ค.
command_arg_restrictions๋ ๊ธฐ๋ณธ๊ฐ๊ณผ ๋ณํฉ๋๋ค. ์ผ๋ถ ๋ช
๋ น๋ง overrideํด๋ ๋๋จธ์ง ๊ธฐ๋ณธ ์ ํ์ ์ ์ง๋๋ค.
parsers.strict_schemas๋ฅผ true ๋ก ์ค์ ํ๋ฉด ๊ฐ ํ์์ Zod ์คํค๋ง๋ก ํ์ฑ ๊ฒฐ๊ณผ๋ฅผ ๊ฒ์ฆํ๋ค. ์คํค๋ง ์๋ฐ ์ failure.reason === "schema_violation" ์ ๋ฐํํ๋ค. ๊ธฐ๋ณธ false ์ด๋ฉฐ opt-in ๋ฐฉ์์ด๋ค.
telemetry.enabled๋ฅผ true๋ก ์ค์ ํ๋ฉด ์๋ต ๋ดํฌ์ telemetry ํ๋๊ฐ ์ถ๊ฐ๋๋ค. guard/exec/parse/redact ๊ฐ ๋จ๊ณ์ ์์ ์๊ฐ(ms)๊ณผ raw ์ถ๋ ฅ ๋ฐ์ดํธ ์๋ฅผ ํฌํจํ๋ค. ๊ธฐ๋ณธ false์ด๋ฉฐ opt-in ๋ฐฉ์์ด๋ค.
legacy
env_secret_patterns๋ v2.0.0 ์์ ์ ๊ฑฐ๋๋ค. ์ฌ์ฉ ์ stderr ์ deprecation ๊ฒฝ๊ณ ๊ฐ ์ถ๋ ฅ๋๋ค.
์ปค์คํ ํ์ -- ์ง์ ๋ง๋ค๊ณ ๋ฐ๋ก ์ด๋ค
44๊ฐ ๋ด์ฅ ํ์๋ก ๋ถ์กฑํ๋ฉด, ์ง์ ๋ง๋ค๋ฉด ๋๋ค. Parism v0.5.0 ๋ถํฐ CLI ๋๊ตฌ๊ฐ ํฌํจ๋๋ค. v1.0.0 ๋ถํฐ ParserPack.schema ๋ Zod ์คํค๋ง๋ฅผ ๋จ์ผ ์์ค๋ก ์ฌ์ฉํ๋ค.
5๋ถ ์์ ํ์ ๋ง๋ค๊ธฐ
# 1. ๋ช
๋ น์ด ์ถ๋ ฅ์ ์บก์ฒํ๋ค
parism capture "htop -b -n 1"
# 2. ํ์ ํฉ ์ค์บํด๋๋ฅผ ์์ฑํ๋ค
parism init-parser htop
# 3. parser.ts๋ฅผ ํธ์งํ๊ณ fixture๋ฅผ ํ
์คํธํ๋ค
parism test htop
# 4. ๋ฑ๋กํ๋ค -- ์ฌ์์ ์์ด ์ฆ์ ์ฌ์ฉ ๊ฐ๋ฅ
parism add ./htop
# 5. ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ๋ค -- raw/parsed/compact ๋น๊ต + ํ ํฐ ์
parism inspect "htop -b -n 1"๋ฑ๋ก๋ ํ์๋ ~/.parism/parsers/์ ์ ์ฅ๋๊ณ , MCP ์๋ฒ ์์ ์ ์๋์ผ๋ก ๋ก๋๋๋ค.
CLI ๋ช ๋ น์ด
| ๋ช ๋ น์ด | ์ค๋ช |
|---|---|
parism capture "<command>" | ๋ช ๋ น์ด๋ฅผ ์คํํ๊ณ raw ์ถ๋ ฅ์ fixture๋ก ์ ์ฅ |
parism init-parser <name> | TypeScript ํ์ ํฉ ์ค์บํด๋ ์์ฑ (parser.ts + schema.json + fixtures/) |
parism test [parser] | fixture replay ํ ์คํธ ์คํ |
parism add <path> | ๋ก์ปฌ ํ์ ํฉ์ ~/.parism/parsers/์ ์๊ตฌ ๋ฑ๋ก |
parism inspect "<command>" | raw / parsed / compact ์ถ๋ ฅ ๋น๊ต + ํ ํฐ ์ |
ParserPack ์ธํฐํ์ด์ค
์ธ๋ถ ํ์๋ ์ด ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ค.
import type { ParserPack } from "@nerdvana/parism/types";
const pack: ParserPack = {
name: "my-command",
parse(raw, args, ctx?) { /* ๊ตฌ์กฐํ๋ ๊ฒฐ๊ณผ ๋ฐํ */ },
schema: { /* JSON Schema */ },
fixtures: [{ input: "...", args: [], expected: { /* ... */ } }],
};
export default pack;์ธ์ ์์ด parism์ ์คํํ๋ฉด ๊ธฐ์กด๊ณผ ๋์ผํ๊ฒ MCP ์๋ฒ๋ก ๋์ํ๋ค.
Parism์ด ์๋ ๊ฒ
Parism์ ์๋ก์ด ์ ธ์ด ์๋๋ค. bash๋ฅผ ๋์ฒดํ์ง ์๋๋ค. bash ์์ ์์์ ์ถ๋ ฅ์ ๋ฐ์ ๊ตฌ์กฐํํ ๋ฟ์ด๋ค.
Parism์ AI๋ฅผ ์ํ ์ด์์ฒด์ ๊ฐ ์๋๋ค. ๊ด์ฌ์ฌ๋ ํ๋๋ค. ์์ด์ ํธ๊ฐ ๋ช ๋ น์ ๋ด๋ ธ์ ๋, ์์ด์ ํธ๊ฐ ์ดํดํ ์ ์๋ ํํ๋ก ๊ฒฐ๊ณผ๋ฅผ ๋๋ ค์ฃผ๋ ๊ฒ.
Unix ์ฒ ํ์ "ํ๋์ ์ผ์ ์ ํ๋ผ"์๋ค. Parism์ ๊ทธ๊ฒ์ ์ดํดํ๋ค.
Made by Jinho Choi ย |ย Buy me a coffee
npx @nerdvana/parismNo common issues documented yet. If you hit a problem, the repository's GitHub Issues page is the best place to look.
Licensed under MITโ you can use, modify, and redistribute it under that license's terms.
View the full license file on GitHub โ