知识图谱统计Skill stats

这是一个用于展示知识图谱统计和健康指标的工具,能够让用户了解知识图谱的增长、健康状况和进展。关键词包括:知识图谱、统计、健康指标、增长分析。

NLP 0 次安装 0 次浏览 更新于 2/28/2026

运行时配置(第0步 — 在任何处理之前)

阅读这些文件以配置特定领域的操作:

  1. ops/derivation-manifest.md — 词汇映射

    • 使用 vocabulary.notes 作为笔记文件夹名称
    • 使用 vocabulary.note / vocabulary.note_plural 作为笔记类型引用
    • 使用 vocabulary.topic_map / vocabulary.topic_map_plural 作为MOC引用
    • 使用 vocabulary.inbox 作为收件箱文件夹名称
    • 使用 vocabulary.notes_collection 作为语义搜索集合名称
  2. ops/config.yaml — 处理深度,自动化设置

如果不存在派生文件,则使用通用术语(笔记,MOCs等)。


立即执行

目标:$ARGUMENTS

立即解析:

  • 如果目标包含 --share:在完整统计后输出紧凑的可分享格式
  • 如果目标为空:输出完整统计显示
  • 如果目标指定特定类别(例如,“健康”,“增长”,“管道”):仅显示该类别

现在开始。 收集指标并呈现它们。


哲学

使无形可见。

知识图谱悄然增长。没有指标,用户无法判断他们的系统是否健康,增长,停滞或分裂。/stats提供了一个快照,使增长有形 — 显示进展的数字,捕获问题的健康状况指标,以及揭示轨迹的趋势。

输出应让用户感到了解,而不是不知所措。指标是证据,不是判断。"12个孤儿"是一个事实。关于它应该做什么属于/graph或/{vocabulary.cmd_reflect}。


第1步:收集指标

收集所有指标。尽可能并行运行这些检查以最小化延迟。

1a. 知识图谱指标

NOTES_DIR="{vocabulary.notes}"

# 笔记计数(不包括MOCs)
TOTAL_FILES=$(ls -1 "$NOTES_DIR"/*.md 2>/dev/null | wc -l | tr -d ' ')
MOC_COUNT=$(grep -rl '^type: moc' "$NOTES_DIR"/*.md 2>/dev/null | wc -l | tr -d ' ')
NOTE_COUNT=$((TOTAL_FILES - MOC_COUNT))

# 连接计数(所有wiki链接跨笔记/)
LINK_COUNT=$(grep -ohP '\[\[[^\]]+\]\]' "$NOTES_DIR"/*.md 2>/dev/null | wc -l | tr -d ' ')

# 每个笔记的平均连接数
if [[ "$NOTE_COUNT" -gt 0 ]]; then
  AVG_LINKS=$(echo "scale=1; $LINK_COUNT / $NOTE_COUNT" | bc)
else
  AVG_LINKS="0"
fi

# 主题计数(主题:字段中的唯一值)
TOPIC_COUNT=$(grep -ohP '^\s*-\s*"\[\[([^\]]+)\]\]"' "$NOTES_DIR"/*.md 2>/dev/null | sort -u | wc -l | tr -d ' ')

# 链接密度
if [[ "$NOTE_COUNT" -gt 1 ]]; then
  POSSIBLE=$((NOTE_COUNT * (NOTE_COUNT - 1)))
  DENSITY=$(echo "scale=4; $LINK_COUNT / $POSSIBLE" | bc)
else
  DENSITY="N/A"
fi

1b. 健康指标

# 孤儿计数(零入站链接的笔记)
ORPHAN_COUNT=0
for f in "$NOTES_DIR"/*.md; do
  NAME=$(basename "$f" .md)
  grep -q '^type: moc' "$f" 2>/dev/null && continue
  INCOMING=$(grep -rl "\[\[$NAME\]\]" "$NOTES_DIR"/ 2>/dev/null | grep -v "$f" | wc -l | tr -d ' ')
  [[ "$INCOMING" -eq 0 ]] && ORPHAN_COUNT=$((ORPHAN_COUNT + 1))
done

# 悬挂链接计数
DANGLING_COUNT=$(grep -ohP '\[\[([^\]]+)\]\]' "$NOTES_DIR"/*.md 2>/dev/null | sort -u | while read -r link; do
  NAME=$(echo "$link" | sed 's/\[\[//;s/\]\]//')
  [[ ! -f "$NOTES_DIR/$NAME.md" ]] && echo "$NAME"
done | wc -l | tr -d ' ')

# 架构合规性(具有所需字段的笔记百分比:描述,主题)
MISSING_DESC=$(grep -rL '^description:' "$NOTES_DIR"/*.md 2>/dev/null | wc -l | tr -d ' ')
MISSING_TOPICS=$(grep -rL '^topics:' "$NOTES_DIR"/*.md 2>/dev/null | wc -l | tr -d ' ')
SCHEMA_ISSUES=$((MISSING_DESC + MISSING_TOPICS))
if [[ "$TOTAL_FILES" -gt 0 ]]; then
  # 具有BOTH所需字段的笔记
  COMPLIANT=$((TOTAL_FILES - MISSING_DESC))
  COMPLIANCE=$(echo "scale=0; $COMPLIANT * 100 / $TOTAL_FILES" | bc)
else
  COMPLIANCE="N/A"
fi

# MOC覆盖率
COVERED=0
for f in "$NOTES_DIR"/*.md; do
  NAME=$(basename "$f" .md)
  grep -q '^type: moc' "$f" 2>/dev/null && continue
  if grep -rl '^type: moc' "$NOTES_DIR"/*.md 2>/dev/null | xargs grep -l "\[\[$NAME\]\]" >/dev/null 2>&1; then
    COVERED=$((COVERED + 1))
  fi
done
if [[ "$NOTE_COUNT" -gt 0 ]]; then
  COVERAGE=$(echo "scale=0; $COVERED * 100 / $NOTE_COUNT" | bc)
else
  COVERAGE="N/A"
fi

1c. 管道指标

# 收件箱项目
INBOX_COUNT=$(find {vocabulary.inbox}/ -name "*.md" 2>/dev/null | wc -l | tr -d ' ')

# 队列待处理(检查YAML和JSON格式)
QUEUE_FILE=""
if [[ -f "ops/queue/queue.yaml" ]]; then
  QUEUE_FILE="ops/queue/queue.yaml"
  QUEUE_PENDING=$(grep -c 'status: pending' "$QUEUE_FILE" 2>/dev/null || echo 0)
  QUEUE_DONE=$(grep -c 'status: done' "$QUEUE_FILE" 2>/dev/null || echo 0)
elif [[ -f "ops/queue/queue.json" ]]; then
  QUEUE_FILE="ops/queue/queue.json"
  QUEUE_PENDING=$(grep -c '"status": "pending"' "$QUEUE_FILE" 2>/dev/null || echo 0)
  QUEUE_DONE=$(grep -c '"status": "done"' "$QUEUE_FILE" 2>/dev/null || echo 0)
else
  QUEUE_PENDING=0
  QUEUE_DONE=0
fi

# 处理比率(笔记与收件箱)
TOTAL_CONTENT=$((NOTE_COUNT + INBOX_COUNT))
if [[ "$TOTAL_CONTENT" -gt 0 ]]; then
  PROCESSED_PCT=$(echo "scale=0; $NOTE_COUNT * 100 / $TOTAL_CONTENT" | bc)
else
  PROCESSED_PCT="N/A"
fi

1d. 增长指标

# 本周增长(在过去7天内创建的笔记)
WEEK_AGO=$(date -v-7d +%Y-%m-%d 2>/dev/null || date -d '7 days ago' +%Y-%m-%d 2>/dev/null)
if [[ -n "$WEEK_AGO" ]]; then
  THIS_WEEK_NOTES=$(grep -rl "^created: " "$NOTES_DIR"/*.md 2>/dev/null | while read -r f; do
    CREATED=$(grep '^created:' "$f" | head -1 | awk '{print $2}')
    [[ "$CREATED" > "$WEEK_AGO" || "$CREATED" == "$WEEK_AGO" ]] && echo "$f"
  done | wc -l | tr -d ' ')
else
  THIS_WEEK_NOTES="?"
fi

# 本周连接(最近创建的笔记中的近似计数链接)
if [[ "$THIS_WEEK_NOTES" -gt 0 && -n "$WEEK_AGO" ]]; then
  THIS_WEEK_LINKS=$(grep -rl "^created: " "$NOTES_DIR"/*.md 2>/dev/null | while read -r f; do
    CREATED=$(grep '^created:' "$f" | head -1 | awk '{print $2}')
    [[ "$CREATED" > "$WEEK_AGO" || "$CREATED" == "$WEEK_AGO" ]] && grep -oP '\[\[[^\]]+\]\]' "$f" 2>/dev/null
  done | wc -l | tr -d ' ')
else
  THIS_WEEK_LINKS="?"
fi

1e. 系统指标

# 自我空间
if [[ -d "self/" ]]; then
  SELF_FILES=$(find self/ -name "*.md" 2>/dev/null | wc -l | tr -d ' ')
  SELF_STATUS="enabled ($SELF_FILES files)"
else
  SELF_STATUS="disabled"
fi

# 方法论笔记
METHODOLOGY_COUNT=$(ls -1 ops/methodology/*.md 2>/dev/null | wc -l | tr -d ' ')

# 待处理的观察
OBS_PENDING=$(grep -rl '^status: pending' ops/observations/ 2>/dev/null | wc -l | tr -d ' ')

# 待处理的紧张关系
TENSION_PENDING=$(grep -rl '^status: open\|^status: pending' ops/tensions/ 2>/dev/null | wc -l | tr -d ' ')

# 捕获的会话
SESSION_COUNT=$(ls -1 ops/sessions/*.md 2>/dev/null | wc -l | tr -d ' ')

将所有目录名称适应领域词汇。如果不存在目录,则跳过检查 — 报告"N/A"而不是错误。


第2步:格式化输出

完整输出(默认)

为处理过的指标生成一个进度条:

进度条计算:
  filled = PROCESSED_PCT / 5 (20个=字符中的填充数量)
  empty = 20 - filled
  bar = [===...   ] PCT%
--=={ stats }==--

  知识图谱
  ===============
  {vocabulary.note_plural}:  [NOTE_COUNT]
  连接:               [LINK_COUNT] (平均每篇[AVG_LINKS] {vocabulary.note})
  {vocabulary.topic_map_plural}:   [MOC_COUNT] (覆盖[COVERAGE]%的{vocabulary.note_plural})
  主题:                    [TOPIC_COUNT]

  健康
  ======
  孤儿:      [ORPHAN_COUNT]
  悬挂:     [DANGLING_COUNT]
  架构:       [COMPLIANCE]%合规

  管道
  ========
  处理过的:    [==============      ] [PROCESSED_PCT]%
  收件箱:        [INBOX_COUNT]项目
  队列:        [QUEUE_PENDING]待处理任务

  增长
  ======
  本周:    +[THIS_WEEK_NOTES] {vocabulary.note_plural}, +[THIS_WEEK_LINKS]连接
  图谱密度: [DENSITY]

  系统
  ======
  自我空间:      [SELF_STATUS]
  方法论:     [METHODOLOGY_COUNT]学习模式
  观察:    [OBS_PENDING]待处理
  紧张关系:        [TENSION_PENDING]开放
  会话:        [SESSION_COUNT]捕获

  由Ars Contexta v1.6生成

解释说明

在统计块之后,为任何显著发现添加简要解释:

条件 笔记
ORPHAN_COUNT > 0 “[N]孤儿{vocabulary.note_plural} — 运行/graph health获取详情”
DANGLING_COUNT > 0 “[N]悬挂链接 — 运行/graph health识别断开的链接”
COMPLIANCE < 90 “架构合规性低于90% — 一些{vocabulary.note_plural}缺少所需字段”
OBS_PENDING >= 10 “[N]待处理的观察 — 考虑运行/{vocabulary.rethink}”
TENSION_PENDING >= 5 “[N]开放的紧张关系 — 考虑运行/{vocabulary.rethink}”
DENSITY < 0.02 “图谱密度低 — 连接薄弱。运行/{vocabulary.cmd_reflect}加强网络”
PROCESSED_PCT < 50 “收件箱中的内容比{vocabulary.notes}/中的多 — 考虑处理积压”
THIS_WEEK_NOTES == 0 “本周无新{vocabulary.note_plural}”

只有在条件显著时才显示解释说明。健康的vault只显示统计数据,没有警告。


第3步:可分享格式(–share标志)

如果使用--share调用,输出一个紧凑的Markdown块,适合在社交媒体或文档中分享:

## 我的知识图谱

- **[NOTE_COUNT]** {vocabulary.note_plural}与**[LINK_COUNT]**连接(平均每篇[AVG_LINKS] {vocabulary.note})
- **[MOC_COUNT]** {vocabulary.topic_map_plural}覆盖[COVERAGE]%的{vocabulary.note_plural}
- 架构合规性:[COMPLIANCE]%
- 本周:+[THIS_WEEK_NOTES] {vocabulary.note_plural}, +[THIS_WEEK_LINKS]连接
- 图谱密度:[DENSITY]

*构建于[Ars Contexta](https://github.com/arscontexta) v1.6*

可分享格式:

  • 省略健康警告(分享时的正面框架)
  • 省略管道状态(内部细节)
  • 省略系统指标(内部细节)
  • 只包括增长积极的指标
  • 总是包括Ars Contexta归属行

第4步:趋势分析(当历史存在时)

如果之前的/stats运行记录在ops/stats-history.yaml(或类似)中,将当前指标与最后一次快照进行比较:

  趋势(与上次检查相比):
    {vocabulary.note_plural}: [N] (+[delta]自[date])
    连接:              [N] (+[delta])
    密度:                  [N] ([up/down/stable])
    孤儿:                  [N] ([improved/worsened/stable])

如果没有历史记录,跳过趋势分析。不要创建历史文件 — 这是/health的责任。


边缘情况

空Vault(0笔记)

优雅地显示零:

--=={ stats }==--

  你的知识图谱是新的。开始捕获以看到它增长。

  知识图谱
  ===============
  {vocabulary.note_plural}:  0
  连接:               0
  {vocabulary.topic_map_plural}:   0
  主题:                    0

  由Ars Contexta v1.6生成

对于空的vault,不要显示健康,管道,增长或系统部分 — 它们都将是零或N/A。

没有队列系统

完全跳过管道部分。不要显示错误。

没有自我空间

显示“disabled”作为自我空间行。不要显示错误。

没有ops/derivation-manifest.md

使用通用词汇(笔记,MOCs等)。所有指标的工作方式相同。

非常大的Vault(500+笔记)

孤儿和MOC覆盖检查可能对于大型vault来说会很慢。如果{vocabulary.notes}/有>200个文件:

  1. 使用更简单的启发式方法运行孤儿检测(只检查在任何MOC中的存在,而不是完整的反向链接扫描)
  2. 注释:“对于大型vault,指标近似。运行/graph health进行精确分析。”

平台特定的日期命令

macOS使用date -v-7d,Linux使用date -d '7 days ago'。脚本尝试两者。如果两者都不工作,报告增长指标为"?"而不是失败。