AGPL-3.0-or-later · forever.

install · v0.116.2

바이너리 하나. 너의 머신.

설치. 명령 하나. 돌아간다.

이미 Claude CodeCodex 가 있다. API 키도, 받을 모델도 필요 없다. Nika는 Rust 바이너리 하나다. daemon 없음, 계정 없음. 설치한 다음 nika new hello.

macOS · Linux · air-gapped OK

  1. 01 · homebrew

    원라이너

    Homebrew가 있는 macOS 또는 Linux: 바로 PATH에 올라간다. nika --version으로 확인.

    이렇게 보여야 한다
    nika --versionnika 0.116.2 (c4cdbeafb)

    real output · nika 0.116.2 · nika --version · re-captured at every release

  2. 02 · script

    Homebrew 없이

    검증된 release 바이너리~/.nika/bin에 내려받고, 셸 프로필에 추가할 PATH 한 줄을 출력한다. 터미널을 다시 열면 nika --version이 답한다.

    curl -LsSf https://nika.sh/install.sh | sh

    toolchain이 이미 있다면: cargo는 미리 빌드된 release tarball을 가져온다. 컴파일 없음 (crates.io publish 전까지 바이너리 이름은 nika-cli: 공개 이름으로 symlink 한 번). nix는 repo flake로 release 소스를 그대로 빌드한다. 첫 run은 컴파일하고, store가 캐시한다.

    cargo binstall --git https://github.com/supernovae-st/nika nika-cli
    nix run github:supernovae-st/nika
  3. 03 · 수동

    air-gapped, 또는 직접

    최신 release에서 플랫폼 tarball과 SHA256SUMS를 내려받아 검증한 뒤 nikaPATH에 놓는다. 아무 데도 연결하지 않는다.

    sha256sum -c SHA256SUMS --ignore-missing
  4. 04 · 에디터

    에디터 확장

    supernovae.nika-lang · VS Code MarketplaceOpen VSX에 있다 (Cursor · Windsurf · VSCodium). 첫 사용 시 맞는 nika release 바이너리를 자동으로 내려받거나, PATH에 이미 있는 것을 재사용한다. 다른 에디터라면: nika lsp가 stdio로 LSP를 말한다 · source + issues.

  5. 05 · 에이전트

    에이전트와 함께

    Nika는 에이전트가 쓰고 네가 리뷰하도록 만들어졌다. nika init이 schema 연결과 AGENTS.md를 repo에 넣어 Claude Code, Cursor, Codex 들이 첫 시도에 valid한 workflow를 쓰게 하고, nika wire는 원하는 곳에만 명시적 agent-tool(MCP) 연결을 더한다.

    nika init
    nika wire cursor
  6. 06 · 첫 run

    키 제로, 다운로드 제로

    nika welcome부터, 거울이다: 이 머신에 이미 있는 것들 (에디터 · 키의 존재 여부만, 값은 절대 아님) 그리고 Next 줄. 현재 release에서는 nika new hello. 오프라인, 키 없음, 아무것도 안 씀, 1초. 리허설이지, 청구되는 답이 아니다. 파일을 남기려면 nika new snippets/hello, 그다음 nika checknika run. 로컬 모델이나 cloud 키는 나중이다, 처음이 아니다. nika doctor가 이미 연결된 것을 이름 붙인다.

    nika welcome
    nika new hello
    nika check hello.nika.yaml
    nika run hello.nika.yaml
    nika doctor
    이렇게 보여야 한다
    nika new hellowrote hello.nika.yaml · nika run hello.nika.yamlnika run hello.nika.yaml  🦋 nika · hello · 1 task     permits ✓ declared boundary · default-deny    greet  infer · mock/echo  0ms  ── 1/1 done · ≥ $0.00 (1 unpriced) · elapsed 0.0s ──────────────    wrote .nika/traces    said "mock(echo) · Say hello in French, in one sh…"    see it whole: nika trace outputs    rehearsal · a mock model echoed the prompt — not a real answer    trace: .nika/traces/<this run> · 5 events · chain <hash-chained>

    real output · nika 0.116.2 · nika new hello · re-captured at every release

    hello.nika.yamlsource
    # first file after install · one exec, zero setup, zero keysnika: hellopermits:  exec: ["echo"]tasks:  greet:    exec:      command: ["echo", "hello", "from", "nika"]
    이렇게 보여야 한다
    nika check hello.nika.yamlnika check · hello.nika.yaml  PLAN     1 wave · 1 task · max parallelism 1      wave 1 greet (exec · echo)  COST     no infer/agent tasks · $0.00 · exec + mcp spend unpriced  SECRETS  no declared secret reaches an effect · model echo untracked  TYPES    deep references fit the shapes tasks declare · builtin output has none  TOOLS    every named nika: tool is canonical · globs + mcp: not checked  ARGS     every builtin invoke arg key is declared + required args present  SCHEMA   no known-unsatisfiable form in an authored schema: · $ref opaque  GATES    no task proven dead · status literals in vocabulary  WRITES   no two unordered tasks write the same static path · computed paths at run · engine writes .nika/traces  EXEC     no literal argv the exec floor refuses at run · a templated argv is the RUN's verdict  ORDER    no exec: sits downstream of a net-effecting task · unauthored content never reaches a shell  PERMITS  literal + const: args fit the boundary · computed paths + symlinks are the RUN's verdict · exec outside the fs bounds  TRIFECTA no lethal trifecta over the declared permits: without a human gate  JOURNEY internal · 0 sources · 1 destination · 0 model endpoints · no secret reaches an external destination  audited · 1 task · 1 wave · permits exec:echo · est out ≤$0.0000 · 0 hints · risk supervisednika run hello.nika.yaml  🦋 nika · hello · 1 task     permits ✓ declared boundary · exec outside the fs bounds    greet  exec · echo  8ms  ── 1/1 done · $0.00 · elapsed 0.0s ─────────────────────────────    wrote .nika/traces    trace: .nika/traces/2026-09-01T00-31-01Z-cd68.ndjson · 8 events · chain 93c13fc0b1070dce8597db1950c93b0522336270451ef3b1bd51a5da9a4d12e0 · sealed

    real output · nika 0.116.2 · nika check hello.nika.yaml · re-captured at every release

    hello-ai.nika.yamlsource
    # first infer · mock rehearsal · zero keys · zero downloadnika: hello-aimodel: mock/echopermits: {}tasks:  greet:    infer:      prompt: "Say hello in one sentence."      max_tokens: 64outputs:  greeting: ${{ tasks.greet.output }}

뭔가 걸린다면

command not found: nika (설치 스크립트 후)

스크립트는 ~/.nika/bin에 설치하고 셸 프로필(~/.zshrc, ~/.bashrc)에 추가할 정확한 PATH 줄을 출력한다. 추가하고 터미널을 다시 열면 nika --version이 답한다.

export PATH="$HOME/.nika/bin:$PATH"
macOS가 바이너리를 차단 (수동 tarball만)

손으로 내려받은 바이너리는 quarantine 플래그가 붙는다. brew와 설치 스크립트는 안 붙는다. 한 번 지우거나, 우클릭 → 열기.

xattr -d com.apple.quarantine ./nika
회사 proxy 뒤에서

설치 스크립트는 순수 curl이다. 다운로드에 표준 proxy 변수를 그대로 쓴다. 바이너리 자체는 어디에도 연결하지 않는다.

HTTPS_PROXY=http://proxy:8080 curl -LsSf https://nika.sh/install.sh | sh
tarball checksum mismatch

mismatch는 손상되었거나 변조된 다운로드라는 뜻이다. 실행하지 말 것. release 페이지에서 tarball과 SHA256SUMS를 다시 받아 재검증한다.

sha256sum -c SHA256SUMS --ignore-missing

다음: 5분 만에 파일 배우기 · 실제 workflow 둘러보기 · 전체 문서