运行时配置(第0步 — 在任何处理之前)
阅读这些文件以配置特定领域的操作:
-
ops/derivation-manifest.md— 词汇映射- 使用
vocabulary.notes作为笔记文件夹名称 - 使用
vocabulary.note/vocabulary.note_plural作为笔记类型引用 - 使用
vocabulary.topic_map/vocabulary.topic_map_plural作为MOC引用 - 使用
vocabulary.inbox作为收件箱文件夹名称 - 使用
vocabulary.notes_collection作为语义搜索集合名称
- 使用
-
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个文件:
- 使用更简单的启发式方法运行孤儿检测(只检查在任何MOC中的存在,而不是完整的反向链接扫描)
- 注释:“对于大型vault,指标近似。运行/graph health进行精确分析。”
平台特定的日期命令
macOS使用date -v-7d,Linux使用date -d '7 days ago'。脚本尝试两者。如果两者都不工作,报告增长指标为"?"而不是失败。