代理REPL.jl
通过MCP(模型上下文协议)为AI代理持久化Julia REPL。支持多个独立会话和Revise.jl热重载。
问题: Julia的“Time to First X”(TTFX)问题严重影响了AI代理的工作流程。每 julia -e "..." 调用需要1-2s的启动+包加载+JIT编译。像Claude Code这样的AI代理每个命令都会生成新的Julia进程,浪费了几分钟的计算时间。
解决方案: AgentREPL通过MCP STDIO传输提供持久的Julia会话。Julia进程仍然有效,因此您只需支付一次TTFX成本。
为什么选择AgentREPL?
AgentREPL是为Claude Code提供持久Julia会话的最简单方法。有三件事使它与众不同:
- 零摩擦设置。 STDIO传输意味着Claude Code会自动生成和管理Julia进程。无需启动服务器,无需配置端口,无需监控进程。安装插件并开始编码。
- 工作流原生Revise.jl。 每个工人都会自动加载Revise.jl。插件的PostToolUse钩子会自动调用
revise编辑后.jl文件夹。您永远不会手动重新加载代码。
- 真正的进程隔离。 每个会话都是一个单独的Distributed.jl worker。您可以重新定义结构,终止崩溃的会话,并在没有交叉污染的情况下运行并行工作负载。
reset按照它所说的去做——包括类型定义在内的完全状态擦除。
AgentREPL不是Julia IDE的替代品。它有8个工具,而不是35个。它没有调试、语义搜索或仪表板。如果你需要这些,请查看 比较部分 在......下面AgentREPL的方法是 eval 加上Julia现有的自省功能(您可以直接通过以下方式调用 eval)以最小的复杂性覆盖大多数代理工作流。
安装
using Pkg
Pkg.add(url="https://github.com/samtalki/AgentREPL.jl")或用于开发:
Pkg.dev("https://github.com/samtalki/AgentREPL.jl")快速开始
选项A:使用插件(推荐)
使用AgentREPL最简单的方法是通过附带的Claude Code插件:
claude /plugin add samtalki/AgentREPL.jl这提供了:
- 自动配置MCP服务器(无需手动设置)
- 8项技能:
/julia-reset,/julia-info,/julia-pkg,/julia-activate,/julia-log,/julia-session,/julia-revise,/julia-develop - Julia评估最佳实践和语言专业知识的自动触发技能
- Hooks:之前的代码显示验证
eval,自动revise之后.jl文件编辑
选项B:手动MCP配置
claude mcp add julia-repl -- julia --project=/path/to/AgentREPL.jl /path/to/AgentREPL.jl/bin/julia-repl-server使用代理REPL
启动新的Claude Code会话。当Claude需要时,Julia MCP服务器将自动启动。
让Claude运行Julia代码:
“计算Julia中的前10个斐波那契数”
克劳德将使用 eval 工具和显示REPL样式输出:
julia> [fibonacci(i) for i in 1:10]
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]JIT编译的第一次调用可能需要几秒钟;后续呼叫是即时的。
建筑
AgentREPL使用 多会话工作者子流程模型 通过Distributed.jl:
┌─────────────────────────────────────────────────────────┐
│ Claude Code │
│ ↕ STDIO (MCP) │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ AgentREPL MCP Server (Main Process) │ │
│ │ ↕ Distributed.jl │ │
│ │ ┌──────────────────┐ ┌──────────────────┐ │ │
│ │ │ Session "default" │ │ Session "testing" │ ... │ │
│ │ │ (Worker 2) │ │ (Worker 3) │ │ │
│ │ └──────────────────┘ └──────────────────┘ │ │
│ └─────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘为什么是worker子流程?
reset可以杀死并重生工人 真正的硬重置- 类型/结构重新定义工作(进程内重置不可能)
- 每个会话都有独立的变量、包和项目环境
- 激活的环境在重置后仍然存在
- 第一次使用时,工人会懒散地出生,以避免STDIO冲突
提供的工具
eval
在持久会话中评估Julia代码。输出采用熟悉的REPL格式:
julia> x = 1 + 1
2julia> x + 10
12变量持续存在!多行代码也适用:
julia> function fib(n)
n println("Computing..."); 42
Computing...
42截断堆栈跟踪会捕获错误:
julia> undefined_var
UndefVarError: `undefined_var` not defined
Stacktrace:
[1] top-level scope
... (truncated)特征:
- 变量和函数在调用中保持不变
- 一旦装载,包裹就会保持装载状态
- 返回值和打印输出都被捕获
- 错误被捕获并通过回溯报告
reset
硬重置:杀死工人进程并产生一个新的进程。
Session reset complete.
- Old worker (ID: 2) terminated
- New worker (ID: 3) spawned
- All variables, functions, and types cleared
- Packages will need to be reloaded with `using`这使得:
- 清除所有变量
- 卸载所有包裹
- 重新定义类型/结构 (软重置不可能)
- 从全新的朱莉娅州开始
激活的环境在重置后仍然存在。
info
获取会话信息,包括工作进程ID。
Julia Version: 1.12.2
Active Project: /home/user/MyProject
User Variables: x, fib, data
Loaded Modules: 42
Worker ID: 3
Session: default
Revise.jl: loadedactivate
切换活动的Julia项目/环境。
activate(path=".")
# Activated project: /home/user/MyProject
# Use `pkg(action="instantiate")` to install dependencies if needed.
activate(path="/path/to/OtherProject")
# Activated project: /path/to/OtherProject
activate(path="@v1.10")
# Activated shared environment: @v1.10激活后,安装依赖项:
pkg(action="instantiate")pkg
在当前环境中管理Julia包。
pkg(action="status")
# Package Status:
# Project MyProject v0.1.0
# Status `~/MyProject/Project.toml`
# [682c06a0] JSON3 v1.14.0
# [a93c6f00] DataFrames v1.6.1
pkg(action="add", packages="CSV, HTTP")
# Package add complete.
pkg(action="test")
# Test Summary: | Pass Total
# MyProject | 42 42
pkg(action="develop", packages="./MyLocalPackage")
# Development mode: MyLocalPackage -> ~/MyLocalPackage
pkg(action="free", packages="MyLocalPackage")
# Freed MyLocalPackage from development mode行动:
| 操作 | 描述 | 所需包 |
|---|---|---|
add | 安装软件包 | 是 |
rm | 删除包 | 是 |
status | 显示已安装的软件包 | 否 |
update | 更新包(如果未指定,则全部更新) | 否 |
instantiate | 从Project.toml/Manifest.toml安装 | 否 |
resolve | 解析依赖关系图 | 否 |
test | 运行测试(如果未指定,则为当前项目) | 否 |
develop | 使用本地代码而不是注册表 | 是 |
free | 返回注册表版本 | 是 |
这 packages 参数接受空格或逗号分隔的名称。
log_viewer
打开一个实时显示Julia输出的终端。
log_viewer(mode="auto")
# Log viewer enabled.
# Log file: ~/.julia/logs/repl.log
# A terminal window should have opened.
log_viewer(mode="tmux")
# tmux session 'julia-repl' created. Attach with: tmux attach -t julia-repl
log_viewer(mode="file")
# Log file: ~/.julia/logs/repl.log
# Run manually: tail -f ~/.julia/logs/repl.log
log_viewer(mode="off")
# Log viewer disabled.对于实时查看打印输出很有用,特别是对于长时间运行的计算。
session
管理多个命名的Julia REPL会话。每个会话都有自己的具有隔离状态的工作进程。
session(action="create", name="analysis")
# Session 'analysis' created and set as current.
# Worker will spawn on first eval.
session(action="list")
# Sessions:
# * default — worker 2, /home/user/MyProject, Revise (5.2min)
# analysis — not spawned, default env, no Revise (0.1min)
session(action="switch", name="analysis")
# Switched to session 'analysis'.
session(action="destroy", name="analysis")
# Session 'analysis' destroyed.行动:
| 操作 | 描述 | 名称必填 |
|---|---|---|
create | 创建新的命名会话 | 是 |
switch | 切换活动会话 | 是 |
list | 显示所有状态为 | 否的会话 |
destroy | 杀死会话的worker并将其删除 | 是 |
revise
使用Revise.jl热重新加载Julia代码更改--不需要重新启动会话。
revise(action="revise")
# Revise completed — all tracked changes reloaded.
revise(action="track", path="src/myfile.jl")
# Now tracking src/myfile.jl — changes will auto-reload on next revise().
revise(action="includet", path="scripts/analysis.jl")
# Included scripts/analysis.jl with Revise tracking.
revise(action="status")
# Revise.jl Status (session: default):
# Watched packages: MyPackage
# Tracked files: 3 files
# - src/core.jl
# - src/utils.jl
# - scripts/analysis.jl行动:
| 操作 | 描述 | 需要路径 |
|---|---|---|
revise | 触发Revise.review()以获取所有文件更改 | 否 |
track | 开始跟踪文件(自动检测到更改) | 是 |
includet | 包含带有修订跟踪的文件 | 是 |
status | 显示Revise当前正在跟踪的内容 | 否 |
使用 revise 编辑后 .jl 文件夹。使用 reset 仅适用于结构布局更改(Julia\ [packages] |包管理| | /julia:julia-activate |激活项目/环境| | /julia:julia-log |控制日志查看器| | /julia:julia-session [name] |管理多个会话| | /julia:julia-revise [action] [path] |热重载代码更改| | /julia:julia-develop [path]` |设置开发工作流程|
自动触发: julia-evaluation (REPL使用的最佳实践)和 julia-language (深厚的Julia专业知识:类型、调度、元编程、性能)。
钩子
- 预工具使用(eval):在调用eval之前,验证Julia代码是否以可读格式显示
- PostTool使用(写入/编辑):自动呼叫
revise编辑后.jl要热重新加载的文件更改
安装
claude /plugin add samtalki/AgentREPL.jl或者为了当地发展:
claude --plugin-dir /path/to/AgentREPL.jl/claude-plugin看 claude插件/README.md 了解详情。
安全
看 安全.md 出于详细的安全考虑。
太长,读不下去了:
- STDIO传输=无网络攻击面
- 代码以用户权限运行
- 当Claude会话结束时,进程终止
- 没有针对恶意代码的保护(AI决定运行什么)
发展
运行测试
julia --project=. -e "using Pkg; Pkg.test()"本地测试
using AgentREPL
AgentREPL.start_server() # Blocks, waiting for MCP messages on stdin看 贡献.md 详细的贡献指南。
API 参考
导出的函数
start_server(; project_dir=nothing)
使用STDIO传输启动AgentREPL MCP服务器。
论据:
project_dir::Union{String,Nothing}:要在worker上激活的Julia项目的可选路径
例子:
using AgentREPL
AgentREPL.start_server(project_dir="/path/to/myproject")环境变量
| 变量 | 描述 | 默认值 |
|---|---|---|
JULIA_REPL_PROJECT | 启动时激活Julia项目的路径 | 无 |
JULIA_REPL_VIEWER | 日志查看器模式: auto, tmux, file, none | none |
JULIA_REPL_LOG | 日志文件的路径 | ~/.julia/logs/repl.log |
JULIA_REPL_HIGHLIGHT | 启用/禁用语法突出显示 | true |
JULIA_REPL_OUTPUT_FORMAT | 输出格式: ansi, markdown, plain | ansi |
内部架构
对于扩展AgentREPL的开发人员:
文件结构:
src/
AgentREPL.jl # Main module (imports, includes, exports)
types.jl # State structs (SessionState, SessionRegistry, LogViewerState, HighlightConfig)
highlighting.jl # Julia syntax highlighting (JuliaSyntaxHighlighting.jl)
formatting.jl # Result formatting, stacktrace truncation
sessions.jl # Multi-session lifecycle (create, switch, list, destroy)
worker.jl # Distributed worker lifecycle
revise.jl # Revise.jl integration (revise, track, includet, status)
packages.jl # Pkg actions, project activation
logging.jl # Log viewer functionality
tools.jl # MCP tool definitions (8 tools)
server.jl # start_server function关键部件:
| 组件 | 文件 | 描述 |
|---|---|---|
SessionState | types.jl | 每个会话状态:工作进程ID、项目路径、修订状态 |
SessionRegistry | types.jl | 包含当前会话跟踪的所有会话的注册表 |
LogViewerState | types.jl | 可选日志查看器终端状态 |
HighlightConfig | types.jl | 语法高亮显示配置 |
ensure_worker!(session) | worker.jl | 确保会话中存在worker |
capture_eval_on_worker(code; session_name) | worker.jl | 使用输出捕获来评估代码 |
reset_worker!(session) | worker.jl | 杀死并重新分配会话的worker |
resolve_session(name) | sessions.jl | 将可选会话名称解析为SessionState |
revise_on_worker!(session) | revise.jl | 在worker上触发revise.review() |
activate_project_on_worker!(path; session_name) | packages.jl | 切换工作环境 |
所有函数都可以通过以下方式访问文档字符串 ?function_name Julia REPL。
更新日志
看 更改日志.md 查看版本历史和发行说明。
许可证
Apache许可证2.0-请参阅 许可证 了解详情。
贡献
欢迎投稿!看 贡献.md 关于以下方面的指导方针:
- 建立开发环境
- 代码风格和文档标准
- 拉取请求流程
- 添加新功能
致谢
- 模型上下文协议.jl -MCP框架
- MCPRepl.jl -灵感和现有技术
- Kaimon.jl -全面的Julia代理工具包
- REPLicant.jl -替代方法
- 现代Julia工作流 -最佳实践指南
