tykimos/agent-native-agent/ana
Claude Code and agent skill by tykimos/agent-native-agent
- community
Checking that the SKILL.md file is still in the repository.
Attach ANA (Agent-Native Agent) to an existing web app or service so the user can operate it by watching a dashboard and chatting with a coding agent that runs inside tmux — chat is injected via tmux paste-buffer and the session is mirrored via capture-pane, with zero dependencies (no MCP, no bridge, no hooks, no plugin runtime). Use this whenever the user wants to "add ANA / a chat+watch dashboard to my app", "attach a coding-agent chat to an existing service", "make my dashboard talk to a tmux agent", "화면 보면서 대화로 조작", "기존 서비스에 ANA 붙이기", or to scaffold the standalone ANA base app. The single file `channel-core.js` is the whole runtime — drop it in and mount it.
Install
npx vskill@latest install tykimos/agent-native-agent/anaSKILL.md
Attach ANA to your service
ANA turns any web app into one you operate by watching + talking: a coding agent runs inside a tmux pane; the browser sends chat that ANA injects into that pane, and mirrors the session (agent replies, tool activity, busy state) back to the page — no MCP, no bridge, no hooks. The entire runtime is one dependency-free file: `channel-core.js`.
The whole idea (2 pieces)
- A server that mounts
channel-core.jsand serves your HTML. - A tmux session running a coding-agent CLI (
claude, or any).
Attach in 3 steps (very simple)
1. Copy `channel-core.js` into your project (it is dependency-free, Node ≥ 20 + tmux).
2. Mount it — add ~12 lines to (or beside) your server:
3. Add the chat widget to your page — send with POST /api/chat {text} and stream with GET /api/stream (SSE). Minimal client:
Run
Session name = <ANA name>-claude. The ANA name is your project folder when it is <xxx>-ana (e.g. ~/ana/shop-ana → shop-ana-claude), otherwise base-ana. The chat's session list shows only <ANA name>-<yyy> sessions (-codex, -review, …); ANA_NAME, TMUX_SESSION and ANA_TMUX_ALL=1 override.
That's it — type in the page, the agent answers in the page.
What channel-core gives you (the API)
| Endpoint | Purpose | |
|---|---|---|
POST /api/chat {text, force?} | inject a message into the tmux agent (use force:true from the web — it clears the input line first, avoiding false "draft" blocks) | |
POST /api/keys {key} | send a control key (enter/esc/up/down/1..9/ctrl-c …) — used to answer TUI dialogs | |
GET /api/stream (SSE) | snapshot + incremental commit/pending/status/screen/draft/dialog/target events for the caller's session | |
GET /api/feed?since=<seq> | that session's conversation ledger (cursor pagination) — survives restarts | |
GET /api/health | {session, target, you, command, ready, dialog, dialogInfo, busy} — connection + terminal-dialog state | |
GET /api/config / POST /api/config {target} | list tmux sessions (message count, who picked it, who is watching) / switch your session live — remembered per person | |
GET /api/dialog / POST /api/dialog {action, n?, text?} | structured terminal dialog (AskUserQuestion, permission menus) / answer it: pick n (+text for "Type something"), submit (multi-select), next/prev (question tabs), esc | |
GET /api/screen | raw pane snapshot (for a terminal view / dialog card) |
Sessions. Every tmux session (target) gets its own ledger (.ana/transcripts/<target>.jsonl; the default session keeps .ana/transcript.jsonl), poll loop, SSE subscribers and injection queue. A request's session is: x-ana-target header or ?target= (explicit, e.g. for the agent's own curl) → the person's most recent pick (.ana/targets.json, keyed by the userKey(req) hook — the identity header in the ANA base) → the default TARGET. Switching sessions swaps the whole chat history, and each signed-in person lands on the session they used last.
Rich responses (optional)
Plain replies mirror automatically. For preview + approve cards, the agent posts POST /api/agent {text, diff, why?, ask?, effect?, ifNot?} (the plain fields show on the approval card — what's going on, what's asked, what it changes, what if not; without them the card says how many items it adds, changes and removes); your server applies the diff on approval and bumps a version so every device re-syncs. See dashboard-api.js in the ANA base for the todo/schedule/memo/evolve reference implementation.
Safety notes (already built in)
- Server binds
127.0.0.1by default — a coding agent has tool-execution power, so never expose it unauthenticated (BIND=0.0.0.0is opt-in for trusted networks only). /api/chat//api/keysrequirecontent-type: application/json+ same-origin (CSRF guard). OnlySERVABLEfiles are served.- Injection is refused when the pane is a shell (agent exited) or a TUI dialog is open — surface
health.dialogin your UI so the user can respond with/api/keys.
Full reference app (dashboard with ANA mode, context chips, docked chat, evolution tab): the repository root. Run it, then copy the parts you want.
Security
- Security scanPassed, 90 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingskills/ana/SKILL.md
Popularity
- Repository stars
- 73
- Repository forks
- 9
- 7-day trend score
- 27
Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/tykimos/agent-native-agent/ana)