返回市场
实时书工具

实时书工具

作者:thmsmlr109 星标更新:2025-04-25

项目介绍

LivebookTools

Livebook Tools 是一个 CLI 工具,旨在让您在处理 .livemd 文件时拥有超能力。 其主要功能包括:

  • BYOE(自带编辑器) - 将您的 .livemd 文件同步到打开的 Livebook 会话中,以便您可以在 AI 驱动的代码编辑器(如 Cursor)中编辑它们。
  • MCP 服务器 - 一个简单的模型上下文协议服务器,用于连接 AI 编码代理到您的 Livebook 会话。更多内容见下文。
  • 从 CLI 运行 Livebooks - 将您的 .livemd 文件转换为 Elixir 脚本,并像运行 .exs 脚本一样从上到下执行它们。如果您想将 livebook 转换为 cron 作业,这非常有用。

安装

Livebook Tools 是一个 Elixir escript。 要安装它,您可以使用 mix escript.install 命令。

mix escript.install github thmsmlr/livebook_tools

安装后,请确保 escript 目录在您的路径中。

# 对于普通 Elixir 用户
export PATH="$HOME/.mix/escripts:$PATH"

# 对于 asdf Elixir 用户
for escripts_dir in $(find "${ASDF_DATA_DIR:-$HOME/.asdf}/installs/elixir" -type d -name "escripts" 2>/dev/null); do
  export PATH="$escripts_dir:$PATH"
done

运行 Livebook

为了让 Livebook 工具正常工作,它需要能够通过分布式 Elixir 连接到正在运行的 Livebook 服务器。 这取决于您如何运行 Livebook。 最简单的方式是,在您的 ~/.bashrc~/.zshrc 文件中添加两个环境变量。

export LIVEBOOK_NODE="livebook@127.0.0.1"
export LIVEBOOK_COOKIE="secret"

然后,当您运行 Livebook 工具或 Livebook 时,这两个程序都会发现这些值并确保它们可以互相连接。 如果您使用的是 Livebook Desktop,则可能还需要将这些值添加到 ~/.livebookdesktop.sh 文件中。 有关 Livebook Desktop 的更多信息,请参阅 Livebook HexDocs

设置 MCP 服务器

MCP 服务器是一个简单的 模型上下文协议 服务器,允许您将 AI 编码代理连接到您的 Livebook 会话。 我亲自测试了与 Cursor 的实现,尽管它应该适用于支持 MCP 协议的任何 AI 代码编辑器。 MCP 服务器通过 STDIO 运行,因此您只需告诉 Cursor 通过命令连接,它就会自动发现工具并将其连接到其编码代理。 有关 MCP 如何与 Cursor 一起工作的更多信息,请参阅 Cursor MCP 文档

Cursor 创建 MCP 服务器 Cursor MCP  服务器已连接

实用技巧

有时您希望自定义代码的运行方式,无论是通过 Livebook 还是通过命令行使用 livebook_tools run <file>。 有一些简单的代码片段可以帮助您检测是否在 livebook 中运行还是在命令行中运行,

# 检测是否在 livebook 中运行
is_livebook = !String.ends_with?(__ENV__.file, ".exs")

# 如果在 livebook 中运行,argv 并没有实际意义,所以我们返回一个空列表
argv = if is_livebook, do: [], else: System.argv()

# 解析命令行参数
# 我们将使用 OptionParser 来处理标志和位置参数
{parsed_opts, positional_args, invalid_opts} =
  OptionParser.parse(
    argv,
    strict: [
      dry_run: :boolean,
      limit: :integer
    ],
    aliases: [
      d: :dry_run,
      l: :limit
    ]
  )

# 提取选项,默认值,在 livebook 中它将仅使用默认值
dry_run = Keyword.get(parsed_opts, :dry_run, false)
limit = Keyword.get(parsed_opts, :limit, 10)