Sno Station
Sno Station은 AI 에이전트를 하나의 팀으로 묶는 오픈소스 워크스테이션으로, 로컬 머신에서 에이전트 협업을 가능하게 함
기존 워크플로에 맞춰 설계된 Cursor 에이전트가 프롬프트를 단계 출력으로 변환, 검토·요약·변경을 CI에 전달
Built to fit the workflows you already have, a Cursor agent turns a prompt into a step output. Hand off reviews, summaries, and changes to CI.
플러그인TypeScript · ShellGitHub @PunGrumpy온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기GitHub Action to install Cursor CLI and run cursor-agent in CI
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Run Cursor agents in GitHub Actions using the official @cursor/sdk. An independent project, not affiliated with or endorsed by Cursor.
CURSOR_API_KEY.steps.<id>.outputs.summary for the model response.- name: Run Cursor Agent
id: cursor
uses: PunGrumpy/cursor-action@v2
with:
api-key: ${{ secrets.CURSOR_API_KEY }}
prompt: "Review this PR for security issues and summarize your findings."
- name: Print summary
env:
SUMMARY: ${{ steps.cursor.outputs.summary }}
run: echo "$SUMMARY"
The action runs on ubuntu-latest, windows-latest, and macos-latest.
| Input | Required | Default | Description |
|---|---|---|---|
cursor-version | ❌ | latest | (Deprecated) The SDK automatically manages the agent version. |
api-key | ✅ | — | Cursor API key for authentication |
prompt | ✅ | — | Prompt to pass to cursor-agent |
model | ❌ | default | Model id for the agent (e.g. default, composer-2). The Cursor SDK does not accept auto. |
working-directory | ❌ | . | Working directory for the agent to operate in |
permissions | ❌ | read-only | Built-in tools the agent may use: read-only (read, search, and web tools), read-write (adds file edits; no shell or subagents), or full (the SDK's default toolset). |
timeout | ❌ | 300 | Timeout in seconds for the agent run |
| Output | Description |
|---|---|
summary | Text summary returned by the cursor-agent |
exit-code | Exit code from the cursor-agent process |
status | Run status returned by the cursor-agent (finished, error, or cancelled) |
duration-ms | Execution duration in milliseconds |
total-tokens | Total tokens consumed by the agent run |
input-tokens | Input tokens consumed by the agent run |
output-tokens | Output tokens generated by the agent run |
[!IMPORTANT]
Treat
summaryas untrusted model output. Pass it throughenv:rather than interpolating${{ steps.<id>.outputs.summary }}directly into arun:script or agithub-scriptbody — interpolation splices the text into the script before it executes.
Worked examples, what the action does at runtime, and troubleshooting live in docs/, which is published as the documentation site. The tables above are generated from action.yml by the same script that generates the site's reference page, so neither can drift from the manifest.
bun install
bun run typecheck
bun run test
bun run build
dist/ is committed on purpose — GitHub Actions executes it straight from the tag. If you changed anything under src/, run bun run build and commit the result; CI fails when dist/ is out of date. The bundle only contains this repository's own code (a few KB); @actions/core and @cursor/sdk stay external and are installed by the action at runtime, so package-lock.json must stay in sync with package.json.
bun run docs:reference # regenerate the reference tables from action.yml
bun run docs:dev # http://localhost:3000
docs/ is a separate Fumapress project with its own lockfile, so bun install at the repository root does not pull in its dependencies.
export GITHUB_STEP_SUMMARY="$(mktemp)"
export GITHUB_OUTPUT="$(mktemp)"
env "INPUT_API-KEY=$CURSOR_API_KEY" \
"INPUT_PROMPT=Say 'smoke test passed' and nothing else." \
"INPUT_MODEL=default" \
"INPUT_PERMISSIONS=read-only" \
"INPUT_TIMEOUT=60" \
node dist/index.mjs
CI runs typecheck, lint, test, build, and a dist/ freshness check on every push and pull request. The Docs job regenerates the reference from action.yml, typechecks the site, and builds it.Integration jobs install the action's runtime dependencies and run it with an invalid key on Ubuntu, Windows, and macOS. Being rejected at authentication is the pass condition: it proves the dependency tree resolves and the SDK reaches Cursor, without spending an agent run.Smoke Test runs the action for real and needs a CURSOR_API_KEY on a paid plan, so it only runs from the Actions tab (workflow_dispatch).Release runs Changesets on pushes to main to open a release PR or publish, then moves the major version tag (v2) to the published version.uses: PunGrumpy/cursor-action@v2 tracks the latest v2.x.x. Pin a full tag or a commit SHA if you want a frozen version.This project uses Changesets. See .changeset/README.md for the contribution workflow.