持久化Julia REPL工具

AgentREPL是一个通过MCP协议为AI代理提供持久化Julia会话的工具,支持多会话隔离和热重载功能,显著减少Julia启动和包加载时间。

  • by samtalki
  • Julia
  • 本地部署
  • 7 星标
  • 更新于
在 GitHub 查看 samtalki/AgentREPL.jl

使用说明

代理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会话的最简单方法。有三件事使它与众不同:

  1. 零摩擦设置。 STDIO传输意味着Claude Code会自动生成和管理Julia进程。无需启动服务器,无需配置端口,无需监控进程。安装插件并开始编码。

  2. 工作流原生Revise.jl。 每个worker都会自动加载Revise.jl,并且一个非阻塞的PostToolUse钩子会提醒模型调用 revise 编辑后 .jl 文件,因此您很少手动重新加载代码。

  3. 真正的进程隔离。 每个会话都是一个单独的Malt.jl工作进程。您可以重新定义结构,终止崩溃的会话,并在没有交叉污染的情况下运行并行工作负载。 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评估最佳实践和绘图的自动触发技能
  • 一个非阻塞的钩子,提醒模型 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使用 多会话工作者子流程模型 通过 Malt.jl:

┌─────────────────────────────────────────────────────────┐
│ Claude Code                                             │
│   ↕ STDIO (MCP)                                        │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ AgentREPL MCP Server (Main Process)                 │ │
│ │   ↕ Malt.jl                                         │ │
│ │ ┌──────────────────┐  ┌──────────────────┐          │ │
│ │ │ Session "default" │  │ Session "testing" │  ...    │ │
│ │ │ (worker process)  │  │ (worker process)  │         │ │
│ │ └──────────────────┘  └──────────────────┘          │ │
│ └─────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘

Malt(Pluto.jl后面的worker库)将每个worker的stdout/stderr保存在 私有管道而不是主机的流,因此工作输出永远不会损坏 MCP JSON-RPC传输,共享主进程的stdout。

为什么是worker子流程?

  • reset 可以杀死并重生工人 真正的硬重置
  • 类型/结构重新定义工作(进程内重置不可能)
  • 每个会话都有独立的变量、包和项目环境
  • 激活的环境在重置后仍然存在
  • 第一次使用时,工人会懒散地出生,以避免STDIO冲突

提供的工具

eval

在持久会话中评估Julia代码。输出采用熟悉的REPL格式:

julia> x = 1 + 1

2
julia> x + 10

12

变量持续存在!多行代码也适用:

julia> function fib(n)
           n <= 1 && return n
           fib(n-1) + fib(n-2)
       end
       [fib(i) for i in 1:10]

[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

打印输出出现在结果之前:

julia> 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: loaded

activate

切换活动的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<1.12)或损坏状态。

除以下工具外的所有工具 log_viewer 和 session 接受可选 session 参数以针对特定会话。

资源

除了工具之外,AgentREPL还将当前会话的状态作为MCP资源公开,客户端可以将其拉入上下文(Claude Code将其显示为@-提及),而无需花费 eval 或 info 电话。每个都返回JSON:

URI 内容
agentrepl://sessions 与工人pid、项目、修订状态、年龄的所有会话
agentrepl://session/variables 当前会话中的用户定义变量(名称、类型、大小)
agentrepl://session/info Julia版本、项目、模块计数、修订状态、工作pid、设置注释
agentrepl://session/project 活跃的 Project.toml 以及是否a Manifest.toml 存在
agentrepl://session/log 最近的带外工作程序输出(生成时预编译、异步打印),以及在以下情况下的审核日志条目 JULIA_REPL_AUDIT_DIR 已设置

提示

AgentREPL附带了一些MCP提示——可重用的Julia工作流,Claude Code将其作为斜线命令显示。与插件技能不同,它们与MCP服务器本身一起提供,因此它们可以在没有插件的情况下工作:

提示 论点 它的作用
julia-dev-setup path 激活→ 实例化→ 添加修订→ 热重载开发循环
julia-benchmark code 预热评估,然后定时/隔离测量(BenchmarkTools,如果可用)
julia-debug-error code, error? 在隔离的eval中复制,读取stacktrace,检查类型,提出修复方案

配置

环境/项目管理

设置Julia环境有三种方法:

1.运行时(推荐):使用 activate 动态切换环境:

activate(path="/path/to/your/project")
pkg(action="instantiate")

2.通过环境变量:设置 JULIA_REPL_PROJECT 开始前:

JULIA_REPL_PROJECT=/path/to/your/project claude mcp add julia-repl -- julia --project=/path/to/AgentREPL.jl -e "using AgentREPL; AgentREPL.start_server()"

3.代码中:直接传递到服务器:

AgentREPL.start_server(project_dir="/path/to/your/project")

激活的环境持续存在 reset 电话。

选择Julia MCP服务器

AgentREPL Kaimon.jl MCPRepl.jl
传输 STDIO HTTP(+ZMQ) HTTP
网络端口 无 2828 3000
从克劳德代码自动启动 是 否 否
依赖关系 6(3个标准库) 30+ 很少
会话隔离 进程级(Malt.jl) 通过门 共享REPL
Revise.jl集成 自动加载+修改微调(挂钩+技能) 手动 否
真正的硬重置(类型redef) 是 不适用 否
调试(断点、步进) 否 是(VS代码) 否
语义代码搜索 否 是(Qdrant) 否
内省工具 否(使用 eval) 是(专用) 否
TUI仪表板 否 是 否
自定义工具注册 否 是(GateTool) 否
插件生态系统(技能/挂钩) 是 否 否
注册表符合条件 是 否 否

如果满足以下条件,请选择代理REPL 你想要一个零配置的Julia REPL,当Claude Code需要时自动启动。没有端口,自动Revise.jl热重载,多会话隔离。您重视简单性和安全性,而不是功能广度。

选择 Kaimon.jl 如果 您需要一个包含35多种工具的全面Julia开发环境:调试、语义代码搜索、宏扩展、代码IR检查和终端仪表板。您可以轻松管理HTTP服务器启动和更大的依赖树。

选择 MCPRepl.jl 如果 你想要一个共享的REPL,在那里你和AI代理可以实时看到彼此的命令。

AgentREPL故意不包括调试、语义搜索、自省工具、TUI或自定义工具注册。如果你需要这些,Kaimon.jl可以提供。代理商REPL的权衡是 eval 加上Julia的内在内省(例如。, @code_typed, methodswith, supertypes --所有可通过以下方式调用 eval)使用较少的移动部件覆盖大多数代理工作流。

相关工具

Claude代码插件

这 claude-plugin/ 目录中包含一个即用型Claude Code插件。

自动配置MCP服务器

无需手动运行 claude mcp add该插件自动配置Julia MCP服务器。

技能

用户调用:

技能 描述
/julia:julia-reset 杀死并重生Julia worker(硬重置)
/julia:julia-info 显示会话信息
/julia:julia-pkg <action> [packages] 包管理
/julia:julia-activate <path> 激活项目/环境
/julia:julia-log <mode> 控制日志查看器
/julia:julia-session <action> [name] 管理多个会话
/julia:julia-revise [action] [path] 热重载代码更改
/julia:julia-develop [path] 设置开发工作流程

自动触发: julia-evaluation (REPL使用的最佳实践)和 julia-plot (UnicodePlots绘图指南)。

钩子

  • PostTool使用(写入/编辑):无阻塞 type: command 提醒模特打电话的钩子 revise 编辑后 .jl 文件,因此会话热重新加载而不会丢失状态。eval和绘图扩展指南之前的显示代码存在于 julia-evaluation 和 julia-plot 技能。

安装

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              # Malt worker lifecycle
  revise.jl              # Revise.jl integration (revise, track, includet, status)
  packages.jl            # Pkg actions, project activation
  logging.jl             # Log viewer + persistent audit logging
  attach.jl              # Interactive shared REPL (Unix socket + tmux client)
  tools.jl               # MCP tool definitions (8 tools)
  resources.jl           # MCP resources (session variables, info, project, log)
  server.jl              # start_server function

关键部件:

组件 文件 描述
SessionState types.jl 每个会话状态:工作句柄、项目路径、修订状态
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 关于以下方面的指导方针:

  • 建立开发环境
  • 代码风格和文档标准
  • 拉取请求流程
  • 添加新功能

致谢