关于 kk-add
kk-add 是用于将用户提供的一条知识写入 Kenkeep 项目知识库的技能。它会先检查现有节点是否重叠,再起草并保存节点供审核。
主要功能
- 01向用户收集节点所需的七项信息
- 02检查现有节点是否重叠
- 03起草知识节点
- 04通过 Kenkeep CLI 写入节点
- 05支持可选的子 Agent 起草
适用场景
- 01记录项目特有的实践
- 02补充项目结构或概念的映射
- 03检查重复后捕获新知识
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ e0ipso/ kenkeep --skill kk-add安装后在 Claude Code 中输入/kk-add确认已加载。
详细介绍
kk-add
将一条知识记录到项目知识库中。你在本次会话中起草节点正文,并通过 node write 原语保存;审核者会审核磁盘上的文件。
向用户询问以下七项(不要自行编造):kind(practice 或 map)、title(≤ 80 个字符)、summary(≤ 140 个字符)、tags(逗号分隔)、body(完整 Markdown;若为 practice,需包含理由)、relates_to(逗号分隔的节点 id,可为空)、confidence(high/medium/low,默认为 high)。
调用前,浏览 .ai/kenkeep/ENTRY.md(已在上下文中),并在 nodes/ 中搜索是否有重叠的节点。如果存在,向用户提出可选择编辑该节点、完善候选节点标题,或放弃记录。若候选内容属于以下任一类型,请提出异议:一看即明的代码、历史记录、调试步骤、进行中的计划或任务内容,或通用编程知识。
确定项目根目录
使用随附的检测器确定仓库根目录(即包含 .ai/kenkeep 的目录),然后将打印出的路径作为以下所有命令的工作目录:
KK_REPO_ROOT=$(node .ai/kenkeep/scripts/kk-detect-root.mjs) || exit $?
cd "$KK_REPO_ROOT" || exit $?
pwd
记录节点
探测并选择是否委派子 Agent(隔离上下文)
按照共享附录 .ai/kenkeep/.config/prompts/sub-agent-delegation.md(探测、回退规则),决定是否将正文起草工作委派给子 Agent(以隔离上下文),或在当前会话中起草。这是一次单单元委派——没有并行任务,也没有并发上限;这样做的目的仅仅是避免 Agent 的推理过程出现在主会话记录中。
如果探测结果表明存在调度原语:
-
生成一个
runId,并准备日志/草稿目录:RUN_ID=$(uuidgen 2>/dev/null || date -u +"add-%Y%m%dT%H%M%SZ") mkdir -p .ai/kenkeep/_logs/kk-add DRAFT_PATH="$(pwd)/.ai/kenkeep/_logs/kk-add/${RUN_ID}__1.draft.json" LOG_PATH="$(pwd)/.ai/kenkeep/_logs/kk-add/${RUN_ID}.jsonl" printf '%s\n' "{\"event\":\"delegating\",\"runId\":\"${RUN_ID}\",\"draftPath\":\"${DRAFT_PATH}\"}" >> "$LOG_PATH" -
用一行话告诉用户:“正在通过子 Agent 起草此节点,以隔离上下文;如果你想查看 Agent 的完整推理过程,请参阅
.ai/kenkeep/_logs/kk-add/<runId>.jsonl。”将<runId>替换为实际的runId。 -
委派给一个且仅一个子 Agent 起草节点正文,并提供等效于以下内容的指示:
你正在为用户完善一个 kenkeep 节点正文。输入为:
kind=<kind>、title=<title>、summary=<summary>、tags=<tags>、relates_to=<relates_to>、confidence=<confidence>、body-draft=<body>。将正文完善为 1–4 个简短段落,使用现在时,并体现项目特性。不要编造理由;如果用户未提供理由,就省略。标题不得超过 80 个字符,摘要不得超过 140 个字符;仅为清晰起见进行完善。根据标题生成slug(小写,以连字符分隔,仅使用 ASCII 字符)。将完善后的节点作为 JSON 写入绝对路径<DRAFT_PATH>,且必须包含以下八个键:kind、slug、title、summary、tags、confidence、relates_to、body。成功后返回该路径。 -
子 Agent 返回后,由主会话(绝不能由子 Agent)读取
$DRAFT_PATH并验证 JSON(必须能解析,包含上述八个键,且不得超出长度限制),然后由主会话在同一会话中自行调用node write。成功时追加一行 JSONL:{"event":"drafted",...};失败时追加:{"event":"draft-invalid","reason":"..."}。验证失败时,不要中止——在本次调用中回退到下方的内联起草流程;无论如何,面向用户的摘要都保持不变。
如果没有可用的调度原语,则直接跳到下方的内联起草流程。
内联起草 + node write(默认和回退方案)
根据标题生成 slug(小写、以连字符分隔、仅 ASCII;例如,Use the rm analytics dispatcher → use-the-rm-analytics-dispatcher)。然后通过 stdin 将正文传给 node write(如果委派流程生成了有效草稿,则使用其 slug 和润色后的 body;否则根据用户提供的七个值直接起草):
npx --yes kenkeep@latest node write <kind> <slug> \
--title "<title>" --summary "<summary>" \
--tags "<tags>" --relates-to "<relates-to>" \
--confidence <high|medium|low> <<'EOF'
<body markdown>
EOF
node write 从 stdin 读取正文(heredoc 形式可避免多行 Markdown 出现转义)。成功时,它只输出解析后的节点 ID,并以 0 退出。架构验证失败时,它会以非零状态退出,并将错误输出到 stderr。
Slug 冲突行为。 如果磁盘上已存在使用拟定 slug 的节点,ensureUniqueId 会自动添加 -2、-3 等后缀,因此输出的 ID 可能与输入的 slug 不同。这不会导致失败——请将输出的 ID 原样告知用户,以便他们查看正确的文件。只有硬性架构错误(缺少 --title、--confidence 格式错误等)才会导致命令以非零状态退出。
命令返回后,向用户提供输出的 ID 及其文件路径(由于此技能未传入 --folder,文件位于根目录下的 nodes/<id>.md),并提醒他们审核该文件,然后选择接受(保留)或拒绝(rm)该文件。