printing-press-score

printing-press-score

热门

对生成的CLI进行Steinberger评分,并支持两个CLI的并排比较

4028Star
441Fork
更新于 2026/7/16
SKILL.md
readonly只读
name
printing-press-score
description

对生成的CLI进行Steinberger评分,并支持两个CLI的并排比较

version
0.1.0

/printing-press-score

对生成的CLI进行Steinberger评分。支持重新评分、按名称/路径评分以及比较两个CLI。

快速开始

/printing-press-score                              # 重新评分当前CLI
/printing-press-score notion-pp-cli-4              # 按名称评分
/printing-press-score ~/my-cli                     # 按路径评分
/printing-press-score notion-pp-cli-4 vs notion-pp-cli-2  # 比较两个CLI

前提条件

  • 已安装Go 1.26.5或更新版本
  • cli-printing-press二进制文件在PATH中(使用go install github.com/mvanhorn/cli-printing-press/v4/cmd/cli-printing-press@latest安装)

第0步:设置

在执行任何其他命令之前,运行设置合约以验证cli-printing-press二进制文件在PATH中,并初始化作用域变量:

<!-- PRESS_SETUP_CONTRACT_START -->

# min-binary-version: 4.0.0

# 首先推导作用域——本地构建检测需要
_scope_dir="$(git rev-parse --show-toplevel 2>/dev/null || echo "$PWD")"
_scope_dir="$(cd "$_scope_dir" && pwd -P)"

# 当从printing-press仓库内部运行时,优先使用本地构建。
_press_repo=false
if [ -x "$_scope_dir/cli-printing-press" ] && [ -d "$_scope_dir/cmd/cli-printing-press" ]; then
  _press_repo=true
  export PATH="$_scope_dir:$PATH"
  echo "使用本地构建: $_scope_dir/cli-printing-press"
elif ! command -v cli-printing-press >/dev/null 2>&1; then
  if [ -x "$HOME/go/bin/cli-printing-press" ]; then
    echo "cli-printing-press 在 ~/go/bin/cli-printing-press 找到,但不在PATH中。"
    echo "将GOPATH/bin添加到PATH:  export PATH=\"\$HOME/go/bin:\$PATH\""
  else
    echo "未找到 cli-printing-press 二进制文件。"
    echo "安装命令:  go install github.com/mvanhorn/cli-printing-press/v4/cmd/cli-printing-press@latest"
  fi
  return 1 2>/dev/null || exit 1
fi

# 解析并输出代理在后续每次 `cli-printing-press` 调用中必须使用的绝对路径。
# 上面的 `export PATH` 仅影响当前Bash工具调用;后续调用会打开新的shell,
# 裸 `cli-printing-press` 会针对用户的默认PATH解析,过时的全局版本可能静默覆盖本地构建。
# 代理捕获此标记,并在每次后续调用中替换为绝对路径。
if [ "$_press_repo" = "true" ]; then
  PRINTING_PRESS_BIN="$_scope_dir/cli-printing-press"
else
  PRINTING_PRESS_BIN="$(command -v cli-printing-press 2>/dev/null || true)"
fi
echo "PRINTING_PRESS_BIN=$PRINTING_PRESS_BIN"

PRESS_BASE="$(basename "$_scope_dir" | tr '[:upper:]' '[:lower:]' | sed -E 's/[^a-z0-9_-]/-/g; s/^-+//; s/-+$//')"
if [ -z "$PRESS_BASE" ]; then
  PRESS_BASE="workspace"
fi

PRESS_SCOPE="$PRESS_BASE-$(printf '%s' "$_scope_dir" | shasum -a 256 | cut -c1-8)"
PRESS_HOME="${PRINTING_PRESS_HOME:-$HOME/printing-press}"
PRESS_RUNSTATE="$PRESS_HOME/.runstate/$PRESS_SCOPE"
PRESS_LIBRARY="$PRESS_HOME/library"
PRESS_MANUSCRIPTS="$PRESS_HOME/manuscripts"
PRESS_CURRENT="$PRESS_RUNSTATE/current"

mkdir -p "$PRESS_RUNSTATE" "$PRESS_LIBRARY" "$PRESS_MANUSCRIPTS" "$PRESS_CURRENT"

<!-- PRESS_SETUP_CONTRACT_END -->

运行设置合约后,从标准输出中捕获 PRINTING_PRESS_BIN=<abs-path> 行。此技能中后续的每个 cli-printing-press ... 调用都必须使用该绝对路径(替换值,而不是字面量 $PRINTING_PRESS_BIN 标记)——上面的 export PATH 仅影响其运行的单个Bash工具调用,后续调用会打开新的shell,裸 cli-printing-press 会针对用户的默认 PATH 解析,过时的全局版本可能覆盖本地构建。

捕获二进制路径后,检查二进制版本兼容性。从此技能的YAML前置元数据中读取 min-binary-version 字段。运行 <PRINTING_PRESS_BIN> version --json 并从输出中解析版本。使用语义化版本规则将其与 min-binary-version 进行比较。如果安装的二进制版本低于最低要求,立即停止并告知用户:“cli-printing-press 二进制 vX.Y.Z 低于最低要求的 vA.B.C。运行 go install github.com/mvanhorn/cli-printing-press/v4/cmd/cli-printing-press@latest 进行更新。”

当前运行状态从 $PRESS_RUNSTATE 解析。已发布的CLI从 $PRESS_LIBRARY 解析。存档的手稿从 $PRESS_MANUSCRIPTS 解析。

第1步:解析参数

读取用户在 /printing-press-score 后的输入。输入是自由格式的——解释意图,不强制语法。

需要去除的噪声词: compare, vs, versus, and, against, with, to

去除噪声词后,统计剩余标记的数量:

  • 0个标记 → 重新评分当前模式
  • 1个标记 → 评分单个模式
  • 2个标记 → 比较模式

第2步:解析CLI目录

对于每个CLI标识符,将其解析为目录路径:

如果标记包含 /.

将其视为路径(绝对或相对)。验证目录是否存在。

如果标记是纯名称

按顺序尝试以下位置:

  1. $PRESS_LIBRARY/<name>/ — 精确匹配
  2. $PRESS_LIBRARY/<name>-pp-cli/ — 带 -pp-cli 后缀
  3. 如果都不存在,使用Glob匹配 $PRESS_LIBRARY/<name>-pp-cli*
  4. 如果恰好有一个Glob匹配且是目录,则使用它
  5. 如果有多个Glob匹配,使用AskUserQuestion显示编号菜单

如果都不存在,扫描当前运行和存档状态:
6. 使用Glob查找 $PRESS_RUNSTATE/runs/*/state.json 文件
7. 读取每个文件,查找 output_dirworking_dir 值,其基名包含该名称
8. 如果找到且目录存在,则使用它

如果无法解析,报告错误:“找不到CLI '<name>'。请提供路径或检查名称。”

重新评分当前(0个标记)

  1. 使用Glob查找所有 $PRESS_CURRENT/*.json 文件
  2. 读取每个文件以获取 api_name, state_path, 和 working_dir
  3. 过滤出 working_dir 实际存在于磁盘上的文件
  4. 如果没有找到,使用Glob匹配 $PRESS_LIBRARY/*-pp-cli* 并使用这些目录
  5. 如果恰好有一个 → 自动使用它
  6. 如果有多个 → 使用AskUserQuestion显示编号菜单:
    找到多个CLI。要评分哪一个?
    1. stripe-pp-cli ($PRESS_LIBRARY/stripe-pp-cli)
    2. notion-pp-cli ($PRESS_LIBRARY/notion-pp-cli)
    3. linear-pp-cli ($PRESS_LIBRARY/linear-pp-cli)
    
  7. 如果没有找到 → 报告:“未找到生成的CLI。请提供名称或路径。”

第3步:查找Tier 2评分的Spec

对于每个解析的CLI目录,查找OpenAPI spec:

  1. 检查 <cli-dir>/spec.json — 管道在生成期间将YAML spec转换为JSON
  2. 如果未找到,扫描 $PRESS_RUNSTATE/runs/*/state.json 文件,查找匹配此CLI目录的文件。读取其 spec_path 字段。如果该文件存在于磁盘上,则使用它。
  3. 如果未找到spec,继续而不使用 --spec。告知用户:“未找到spec——spec派生的维度将被标记为N/A并从分母中排除。请提供spec路径以进行完整评分。”

第4步:运行评分卡

单个评分模式

运行评分卡命令:

cli-printing-press scorecard --dir <resolved-path> --json

如果找到了spec,添加 --spec <spec-path>

解析JSON输出。结构如下:

{
  "api_name": "...",
  "steinberger": {
    "output_modes": 8,
    "auth": 7,
    "error_handling": 6,
    "terminal_ux": 9,
    "readme": 5,
    "doctor": 10,
    "agent_native": 7,
    "local_cache": 4,
    "breadth": 7,
    "vision": 6,
    "workflows": 3,
    "insight": 5,
    "path_validity": 0,
    "auth_protocol": 0,
    "data_pipeline_integrity": 7,
    "sync_correctness": 6,
    "type_fidelity": 4,
    "dead_code": 3,
    "total": 72,
    "percentage": 72
  },
  "overall_grade": "B",
  "gap_report": ["..."],
  "unscored_dimensions": ["path_validity", "auth_protocol"]
}

如果存在 unscored_dimensions,这些维度应渲染为 N/A,而不是 0/x,并且应描述为从分母中排除,而不是可修复的CLI缺陷。为了向后兼容,JSON仍然将数字字段编码为 0;消费者必须使用 unscored_dimensions 来区分 N/A 和真正的零。

学习循环的加分是静态行为性的,而非基于存在性:评分卡对根命令上的 teach/recall/learnings 注册以及非空实体查找种子(或spec记录的no-entities转义)进行加分。学习循环默认开启,因此 internal/learn/ 存在不获得任何加分;在解释学习差距时,指向缺失的种子或未注册的命令,而不是缺失的文件。执行证明(验证矩阵,learnings stats)属于验证和dogfood;评分卡不运行任何二进制文件。

比较模式

使用两个并行的Bash工具调用同时运行两个评分卡命令:

# 调用1:
cli-printing-press scorecard --dir <path1> --spec <spec1> --json

# 调用2:
cli-printing-press scorecard --dir <path2> --spec <spec2> --json

解析两个JSON输出。

第5步:渲染输出

单个评分表格

渲染一个丰富的Markdown表格。注意:Tier 1维度满分均为10分。Tier 2维度满分均为10分,但TypeFidelity和DeadCode为5分。

Scorecard: <api_name>

基础设施(Tier 1)
| 维度          | 分数 |
|---------------|------|
| Output Modes  | 8/10 |
| Auth          | 7/10 |
| Error Handling| 6/10 |
| Terminal UX   | 9/10 |
| README        | 5/10 |
| Doctor        | 10/10|
| Agent Native  | 7/10 |
| Local Cache   | 4/10 |
| Breadth       | 7/10 |
| Vision        | 6/10 |
| Workflows     | 3/10 |
| Insight       | 5/10 |

领域正确性(Tier 2)
| 维度                    | 分数 |
|-------------------------|------|
| Path Validity           | 9/10 |
| Auth Protocol           | 8/10 |
| Data Pipeline Integrity | 7/10 |
| Sync Correctness        | 6/10 |
| Type Fidelity           | 4/5  |
| Dead Code               | 3/5  |

**总分:72/100 — 等级 B**

如果 gap_report 非空,列出差距:

差距:
- <差距1>
- <差距2>

如果 unscored_dimensions 非空,在表格后添加注释:

注意:path_validity, auth_protocol 未评分,已从分母中排除。请提供spec路径以进行完整评分。

比较表格

渲染一个并排表格,包含差值列。显示第一个CLI名称和第二个CLI名称作为列标题。计算差值为(CLI 1分数 - CLI 2分数)。正数显示 +N,负数显示 -N,零显示

评分卡比较:<name1> vs <name2>

基础设施(Tier 1)
| 维度          | <name1> | <name2> | 差值 |
|---------------|---------|---------|------|
| Output Modes  | 8/10    | 5/10    | +3   |
| Auth          | 7/10    | 7/10    | —    |
| ...           |         |         |      |

领域正确性(Tier 2)
| 维度                    | <name1> | <name2> | 差值 |
|-------------------------|---------|---------|------|
| Path Validity           | 9/10    | 6/10    | +3   |
| ...                     |         |         |      |

| **总分**  | **72/100 (B)** | **56/100 (C)** | **+16** |

错误处理

  • 如果cli-printing-press二进制文件不在PATH中 → 显示安装说明:go install github.com/mvanhorn/cli-printing-press/v4/cmd/cli-printing-press@latest
  • 如果评分卡命令失败 → 报告错误并附带完整的标准错误输出
  • 如果CLI目录不存在 → 报告哪个名称无法解析
  • 如果JSON解析失败 → 显示原始输出并报告解析错误