Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
제작자가 쓴 설명(영어 원문)
Record how any CLI behaves and check that a rewrite behaves the same (golden tests).
이 세 가지는 절대 하나의 점수로 합치지 않아요. 의견, 측정, 인기는 서로 다른 것이니까요.
이 서버는 아직 쉬운 말로 된 요약을 쓰지 못했어요. 아래는 레지스트리에서 읽어 온 사실이에요.
쓰고 있는 AI 앱을 고른 다음 설정을 복사하세요.
어떤 앱을 쓰세요?
위에서 앱을 고르세요. 기억해 두었다가 다음부터는 버튼에 “…에 설치”라고 표시해요.
링크는 제작자의 파일로 바로 연결돼요. 우리가 보관하거나 다시 패키징하지 않아요. 파일을 열면 Claude Desktop이 설치해요.
터미널에서 이 명령어를 실행하세요
브라우저가 앱을 열지 물어본 다음, 앱이 설정을 보여 주고 확인을 요청해요. 키 값은 비워 두니 직접 입력하세요.
브라우저가 앱을 열지 물어본 다음, 앱이 설정을 보여 주고 확인을 요청해요. 키 값은 비워 두니 직접 입력하세요.
이 서버는 내 컴퓨터에서 실행되는데, ChatGPT는 인터넷에 있는 서버에만 연결할 수 있어요. 다른 앱을 고르세요.
선택한 앱은 이 기기의 쿠키에만 저장돼요. 계정은 필요 없어요.
이 설정은 제작자의 레지스트리 정보로 만들었어요. README와 다르면 README를 따르세요.
내 컴퓨터에서 실행돼요. 설치하면 AI 앱에 도구 목록이 나타나요.
누구나 볼 수 있는 정보를 점검했고, 코드는 읽지 않았어요. 해당하지 않는 항목은 개수에서 뺐어요. · 2026년 11월 7일 점검
레지스트리 이름이 GitHub 계정 emirmrkaljevic 기준으로 확인되었고, 이 계정이 저장소를 소유하고 있어요
아직 GitHub에서 이 저장소를 읽어 오지 않았어요
아직 GitHub에서 이 저장소를 읽어 오지 않았어요
내 컴퓨터에서 실행되는 서버라 인터넷 엔드포인트가 없어요
내 컴퓨터에서 실행되며, 대신 로컬 설정을 사용해요
내 컴퓨터에서 실행돼요. 도구 목록은 인터넷 엔드포인트가 있는 서버에서만 읽을 수 있어요
레지스트리에서 이 카테고리의 활성 서버 전체와 비교했어요. 스타는 게시자가 저장소를 소유한 경우에만 세요.
해당하는 기본 점검 1개 중 1개를 통과했어요. 코드는 읽지 않았어요. 키나 토큰을 넣기 전에 서버가 어떤 권한을 요구하는지 확인하고, 꼭 필요한 권한만 있는 키를 쓰세요.
레지스트리에 필수 키가 나와 있지 않아요. 다만 처음 쓸 때 로그인을 요구하는 서버도 있어요.
내 컴퓨터에서 실행돼요. AI 앱이 필요할 때 실행하고, 데이터는 제작자의 서버를 거치지 않아요(서버 자체가 온라인 서비스를 호출하는 경우는 제외).
GitHub 저장소는 마지막으로 – 변경됐고, 최신 버전(0.1.7)은 15일 전 레지스트리에 올라왔어요.
Claude Desktop, Claude Code, Cursor, VS Code처럼 MCP를 지원하는 앱에서 쓸 수 있어요. 내 컴퓨터에 MCPB도 있어야 해요.
같은 카테고리에는: Spec Driven Development, Remote Desktop Commander, OpenTakeoff
같은 카테고리에서 다른 제작자가 만든 서버예요. 스타 순으로 정렬했어요.
카드 보는 법:★ GitHub 스타i세 기둥: 리뷰 · 점검 · 사용 정도i업데이트 = 최신 버전을 레지스트리에 공개한 날i
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.
Construction takeoff for AI agents: load plans, set scale, measure, count, export with provenance.
제작자의 저장소에서 쓰인 그대로 가져왔어요. PopNx MCP가 검토하거나 보증한 내용이 아니에요. HTML, 이미지, 스크립트는 제거했어요. 링크를 누르면 이 사이트를 벗어나요.
If you find this useful, you can support me by getting a SkinToScan pack, my other project. It's a one-time purchase that directly funds my open-source work.
Record how any CLI behaves. Prove your rewrite behaves the same.
Proof: running it against uutils coreutils (the Rust rewrite of GNU coreutils) has so far led to 30 upstream bug reports and 37 fix PRs, 21 of them merged (as of Nov 6, 2026). See what it found.
behave treats a command-line tool as a black box. It reads --help (and the man page), generates hundreds of test cases (every flag, flag pairs, every value the help lists for a flag, edge-case stdin, file arguments, bad values, missing files), records what the tool actually does (stdout, stderr, exit code), and replays those cases against another implementation.
Use it when you are:
If you are rewriting an existing command-line tool in Rust or Go, behave gives you a compatibility suite without reading the original source. Three commands:
behave probe sort # record what the original does, case by case
behave run behave-sort # make sure the recording is stable behave diff behave-sort --impl ./target/release/sort # every place your port differs
This is how it led to 30 bug reports and 37 fix PRs in uutils coreutils (24 merged so far). A second, ready to run pair: behave diff examples/jq --impl gojq passes 29 of 33 jq 1.7 cases, and the 4 differences are all error wording on stderr (see examples/jq).
Status: early (v0.1). CLI and MCP server work; feedback welcome.
Install with Homebrew (macOS and Linux), download a binary from Releases, or use go install:
brew install emirmrkaljevic/tap/behave
behave probe sort
behave run behave-sort
behave diff behave-sort --impl ./target/release/sort --skip-tag meta
Or try the committed examples first: behave run examples/cut (27 GNU cut cases), behave run examples/paste (18 GNU paste cases), behave run examples/join (26 GNU join cases), behave run examples/nl (26 GNU nl cases), behave run examples/fold (28 GNU fold cases), behave run examples/head (24 GNU head cases), behave run examples/expand (21 GNU expand cases), behave run examples/unexpand (26 GNU unexpand cases), behave run examples/tr (29 GNU tr cases), behave run examples/comm (30 GNU comm cases), behave run examples/uniq (31 GNU uniq cases), behave run examples/sort (35 GNU sort cases), behave run examples/cat (39 GNU cat cases), behave run examples/wc (38 GNU wc cases), behave run examples/tac (33 GNU tac cases), behave run examples/numfmt (41 GNU numfmt cases), behave run examples/od (36 GNU od cases), behave run examples/basenc (32 GNU basenc cases), behave run examples/seq (39 GNU seq cases), behave run examples/expr (43 GNU expr cases), behave run examples/printf (38 GNU printf cases), behave run examples/factor (31 GNU factor cases), behave run examples/cksum (35 GNU 9.12 cksum cases), behave run examples/md5sum (37 GNU 9.12 md5sum cases), behave run examples/tail (33 GNU 9.12 tail cases), behave run examples/base64 (34 GNU 9.12 base64 cases), behave run examples/base32 (36 GNU 9.12 base32 cases), behave run examples/basename (35 GNU basename cases), behave run examples/dirname (26 GNU dirname cases), behave run examples/fmt (36 GNU 9.12 fmt cases), behave run examples/realpath (38 GNU 9.12 realpath cases), behave run examples/pr (40 GNU 9.12 pr cases), behave run examples/tee (38 GNU 9.12 tee cases), or behave run examples/jq (33 jq 1.7 cases); see examples/.
For tools that need a positional argument (a filter, a pattern, a field list), give samples:
behave probe jq --arg . --arg '.a' --arg '.[]' --arg 'map(.+1)' --arg keys
behave diff behave-jq --impl gojq --ignore-stderr
When the help text lists the values a flag accepts, probe adds one case per value next to the invalid-value cases. It understands GNU style (WHEN can be: auto, always, never, --sort=WORD ... to WORD: none (-U), size (-S), ..., The WHEN argument defaults to 'always' and can also be 'auto' or 'never'.), clap's [possible values: ...], argparse's {json,yaml} and . It only keeps plain lowercase lists it can tie to that flag. --dry-run shows what it found:
$ behave probe ls --dry-run
--color WHEN {always,auto,never} --sort WORD {none,size,time,version,extension,name,width}
Example output (abridged):
✗ flag --output-delimiter, value -1, arg -f1 0135-flag-output-delimiter-value-1-arg-f1.yaml
$ cut --output-delimiter -1 -f1 exit: exit: want 0, got 1 stdout:
flags with differences: --output-delimiter 2/16 cases differ flags fully compatible: 9 of 10
cut vs ./uu/cut: 172/175 passed, 3 failed, 0 skipped (differs in: exit 2, stdout 3) [0.1s]
Run on this machine against real tools, generated cases only, --help/--version excluded:
| original | candidate | cases | pass | notable differences |
|---|---|---|---|---|
| GNU wc 9.7 | uutils wc 0.12.0 | 63 | 63 | none |
| GNU head | uutils head | 51 | 51 | none |
| GNU uniq | uutils uniq | 100 | 100 | none |
| GNU tr | uutils tr | 63 | 63 | none |
| GNU tac 9.12 | uutils tac (main) | 36 | 35 | -s -1 rejected (value starting with -, #15497, now fixed) |
| GNU tail 9.12 | uutils tail (main) | 60 | 58 | -c with no count accepted (#15528, now fixed); file names like 007 printed as 7 (#15533, now fixed in tail); a hand-added -cf FILE case is rejected (#15517) |
| GNU cut | uutils cut | 175 | 172 | --output-delimiter -1 rejected (value starting with -) |
| GNU base64 | uutils base64 | 36 | 31 | -d on invalid input: GNU prints the bytes decoded so far, uutils prints nothing |
| GNU sort | uutils sort | 290 | ~260† | usage errors exit 1 instead of 2; --debug underline width; --check --merge |
| jq 1.7 | gojq 0.12.19 | 596 | 331* | unsupported flags (--seq, --ascii-output, …), key order, big-number formatting |
\* with --ignore-stderr; error message wording differs almost everywhere. † varies by one or two: some --random-sort cases are only sometimes detected as flaky with tiny inputs.
Many of these are deliberate design choices, not bugs. behave just makes them visible. Record from the release the rewrite actually targets. uutils follows the newest GNU release, and GNU 9.12 prints ==> 'standard input' <== in tail -v headers where 9.7 prints no quotes, so a spec recorded from an older GNU reports differences that are really GNU changes. behave.yaml keeps the --version line of the recorded tool, and run/diff print it next to the version being replayed. Some were real bugs and are now fixed upstream:
cut --output-delimiter -x (uutils/coreutils#15341, fixed in #15345)sort --check --merge ignored the check (uutils/coreutils#15380, fixed in #15381)tac -s -1 rejected a separator starting with - (uutils/coreutils#15497, fixed in #15498)tail 007 printed the missing file as '7' (uutils/coreutils#15533, fixed for tail in #15534; the same bug in other utilities is being fixed one by one: tac in #15541 (merged), nl in #15544 (merged), md5sum/cksum in #15548 (merged), sort in #15565 (merged), shred in #15604 (merged))tail -c and tail +NUM ignored _POSIX2_VERSION (uutils/coreutils#15528, fixed in #15529)sort -c dir exited 0 without a message instead of reporting the read error (uutils/coreutils#15615, fixed in #15616)fmt d a.txt stopped at the directory with a bare read error and never formatted a.txt (uutils/coreutils#15922, fixed in #15923)od -t x0 (and d0, u0, f0) silently used the default size, where GNU rejects a 0-byte type, caught by examples/od (uutils/coreutils#16085, fixed in #16086)Still open: a few error messages that lose the file name, mostly caught by the "file with trailing slash" probe case added in v0.1.7:
cp f/ dest prints Not a directory (os error 20) instead of cannot stat 'f/': Not a directory (#15691, fix in #15692)paste open and read errors without the file name (#15254, fix in #15642)shred dir says Not a file instead of failed to open for writing: Is a directory (#15630, fix in #15631)mv missing/ g says Not a directory and mv d/f g with an unsearchable d says No such file or directory, where GNU gives the real reason (#15704, fix in #15705)ln f/ link and ln missing link say failed to create hard link 'link' => ... instead of naming the source with failed to access 'f/' (#15713, fix in #15714)mv a missing/b and mv a ro/b print only `No such file or directory (os e앞부분만 보여 드려요. 나머지는 저장소에서 읽어 보세요