Skip to main content

固定流程脚本 TUI 与无头执行

Project description

clak

固定流程脚本 TUI 与无头执行(StepList + ScriptSession)。

CLAK = Command-Line Automation Kit。

能力

  • history / slash 菜单 / 多行输入 / context / ask(单选、多选、过滤)
  • / 补全
  • 脚本:/pack-game-res(版本 + 打包目标)、/select-server(目标服务器)
  • 无头:clak exec /pack-game-res --use-defaults--set field=value

目录结构

src/clak/
├── cli.py                          # argparse 入口
├── runtime/                        # 脚本运行时(与 UI 解耦)
│   ├── step_list.py                # 步骤执行器
│   ├── session.py                  # 会话 + ask 网关
│   ├── params.py                   # 无头 --set 参数
│   ├── headless.py                 # 无头执行入口
│   ├── slash.py                    # SlashEngine 分发
│   └── ask/                        # ask 协议(request/answer)
├── commands/                       # 纯 slash 命令
│   ├── types.py                    # SlashCommand / ScriptEntry / SlashEntry
│   ├── _registry.py                # 聚合 builtin + 脚本
│   └── version/status/clear/quit.py
├── scripts/                        # 业务脚本(自动发现)
│   ├── _registry.py                # @script 装饰器 + 扫描注册
│   └── pack_game_res/select_server.py
└── tui/                            # 渲染层
    ├── app.py / state.py / event.py / theme.py / screen.py
    └── views/                      # 渲染单元平铺

依赖链单向:tui → runtime/slash → commands/_registry → scripts/_registry → runtime(数据结构)。

安装与运行

需要 Python ≥ 3.10。依赖 textual + wcwidth

用 uv

uv sync
uv run clak                          # 打开 TUI
uv run clak exec /version             # 无头执行
uv run clak exec /pack-game-res --set version=1.0 --set targets=base,cn

不用 uv(pip + python)

pip install -e .                         # 装依赖 + 入口命令
python -m clak                        # 打开 TUI
python -m clak exec /version
python -m clak exec /pack-game-res --use-defaults

若依赖已装(pip install textual wcwidth),可直接跑无需安装:

python3 -m clak                       # 直接运行
python3 -m clak exec /version
python3 -m pytest                        # 跑测试

入口命令:clak(pip install 后可用)。PyPI 包名为 esclak(绕开 clack 相似性),import 名为 clakfrom clak... import)。

pip install esclak                            # 装包,得到 clak 命令

构建单文件二进制(组内分发)

无需 Python 环境即可分发,用 pyinstaller 打成单文件:

./build.sh                               # 产出上级目录的 clak 二进制

部署到游戏代码仓库时,目录约定:

tools/
├── clak_src/                            # clak 源码(入库)
│   ├── build.sh
│   └── src/...
└── clak                                 # 构建产物(gitignore,不入库)

组员拉代码后,在 tools/clak_src/ 执行 ./build.sh 即生成 tools/clak,直接 ./tools/clak 使用。

跨平台需分别构建:macOS 上构建得到 macOS 二进制,Linux 同理。onefile 模式首次启动会解压到临时目录,约慢几百毫秒。

无头执行

clak exec /<script> [--set field=value ...] [--use-defaults]
  • --set version=1.0:传入脚本参数(可重复)
  • --use-defaults:未 --set 的 ask 字段用 AskRequest.default,无交互批量执行
  • 缺参且未开 --use-defaults 时报错退出码 2

扩展脚本

src/clak/scripts/ 新建模块,用 @script 装饰器注册,启动时自动扫描,无需改框架任何文件

# scripts/my_script.py
from clak.runtime.ask import AskChoice, AskMode, AskRequest
from clak.runtime.session import ScriptSession
from clak.scripts import script


@script("/my-script", "我的脚本说明")
def run(session: ScriptSession) -> None:
    state = {"name": ""}

    def step_ask_name() -> int:
        def on_answer(answer) -> None:
            state["name"] = answer.primary
            session.log(f"已选: {state['name']}")

        return session.ask_step(
            AskRequest(
                field_id="name",
                prompt="选择名称",
                default="default",
                choices=(AskChoice(label="默认", value="default"),),
            ),
            on_answer,
        )

    def step_done() -> int:
        session.log(f"my-script: 完成 ({state['name']})")
        return 0

    step_list = session.step_list
    session.bind_step_end()
    step_list.clear()
    step_list.add(True, step_ask_name, "ask_name")
    step_list.add(True, step_done, "done")
    session.run()

加完即可用:clak exec /my-script --set name=default

扩展 slash 命令(非脚本)

src/clak/commands/ 新建模块,定义 COMMAND = SlashCommand(...),加入 commands/_registry.py_BUILTINS

测试

python -m pytest                    # 或 uv run pytest

测试覆盖:reducer、headless、pack_game_res、select_server、ask(view/multi/navigation)、view_lifecycle、tui_script、exec_list、key_from_textual。

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

esclak-0.0.5.tar.gz (22.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

esclak-0.0.5-py3-none-any.whl (35.2 kB view details)

Uploaded Python 3

File details

Details for the file esclak-0.0.5.tar.gz.

File metadata

  • Download URL: esclak-0.0.5.tar.gz
  • Upload date:
  • Size: 22.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.4

File hashes

Hashes for esclak-0.0.5.tar.gz
Algorithm Hash digest
SHA256 ddd61a4fb36450748841a3a06c939300124204b8053430ebd00cce6b442dcb5a
MD5 c3f27432d0c36dcc017799168b4729ca
BLAKE2b-256 b1ec0e7f068331084c84197545655efb1190fc0a771121ff6e4ae6961e25cb5e

See more details on using hashes here.

File details

Details for the file esclak-0.0.5-py3-none-any.whl.

File metadata

  • Download URL: esclak-0.0.5-py3-none-any.whl
  • Upload date:
  • Size: 35.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.4

File hashes

Hashes for esclak-0.0.5-py3-none-any.whl
Algorithm Hash digest
SHA256 7436eec229e5117832a4b7d9c4c69b6c2acae038349f1cd7fb827d5934bbc9e1
MD5 73ab9860fb4011c9cf8fa4d5b5cddbd1
BLAKE2b-256 7e93340427bb3c9fd50a52f9540ee2f23d6157345977954b37daabb52563b16e

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page