From doc-smith
Generates and updates structured documentation from project data sources into a git-managed .aigne/doc-smith/ workspace with YAML schemas and HTML output. Use for creating, generating, updating, or modifying docs.
npx claudepluginhub aigne-io/doc-smith-skills --plugin doc-smithThis skill uses the workspace's default tool permissions.
从工作区数据源生成和更新结构化文档。所有输出创建在 `.aigne/doc-smith/` workspace 中。
Generates documentation for codebases—from file references and feature guides to full sites. Detects and adapts to frameworks like Fumadocs, Nextra, Docusaurus.
Creates new Angular apps using Angular CLI with flags for routing, SSR, SCSS, prefixes, and AI config. Follows best practices for modern TypeScript/Angular development. Use when starting Angular projects.
Executes ctx7 CLI to fetch up-to-date library documentation, manage AI coding skills (install/search/generate/remove/suggest), and configure Context7 MCP. Useful for current API refs, skill handling, or agent setup.
Share bugs, ideas, or general feedback.
从工作区数据源生成和更新结构化文档。所有输出创建在 .aigne/doc-smith/ workspace 中。
以下约束在任何操作中都必须满足。
.aigne/doc-smith/ 下执行mkdir -p .aigne/doc-smith/{intent,planning,docs,assets,cache}cd .aigne/doc-smith && git initconfig.yaml schema:
workspaceVersion: "1.0"
createdAt: "2025-01-13T10:00:00Z" # ISO 8601
projectName: "my-project"
projectDesc: "项目描述"
locale: "zh" # 输出语言代码,初始化时必须向用户确认
projectLogo: ""
translateLanguages: []
sources:
- type: local-path
path: "../../" # 相对于 workspace
url: "" # 可选: git remote URL
branch: "" # 可选: 当前分支
commit: "" # 可选: 当前 commit
locale 确认规则:初始化 workspace 时,若用户未明确指定语言,必须用 AskUserQuestion 确认输出语言(如 zh、en、ja),不得默认写入。
document-structure.yaml 必须符合下方 schema/doc-smith-check --structurenode skills/doc-smith-build/scripts/build.mjs --nav --workspace .aigne/doc-smith --output .aigne/doc-smith/distdocument-structure.yaml schema:
project:
title: "项目名称"
description: "项目概述"
documents:
- title: "文档标题"
description: "简要摘要"
path: "/filename" # 必须以 / 开头
sourcePaths: ["src/main.py"] # 源文件路径(无 workspace: 前缀)
icon: "lucide:book-open" # 仅顶层文档必需
children: # 可选:嵌套文档
- title: "子文档"
description: "详细信息"
path: "/section/nested"
sourcePaths: ["src/utils.py"]
docs/{path}/.meta.yaml(kind: doc, source, default)dist/{lang}/docs/{path}.htmldocs/ 目录中不得残留 .md 文件(构建后删除)/overview/doc-gen),build.mjs 自动转换为相对 HTML 路径/assets/xxx 绝对路径格式(build.mjs 自动转换为相对路径)Task 使用后台执行模式(run_in_background: true),执行日志不会回流到主 agent 上下文。主 agent 通过信号文件(.status)获取结果。
实践规则:
ls/Glob)评估项目规模,再决定结构规划方式:
Task 类型:
document-structure.yaml 草稿分发规则:
run_in_background: true,避免执行日志回流到主 agent 上下文Glob: **/*.{png,jpg,jpeg,gif,svg,mp4,webp}(排除 .aigne/ 和 node_modules/),将结果作为 mediaFiles 传递给每个 Task信号文件机制:
.aigne/doc-smith/cache/task-status/ 写入 {slug}.status 文件/ 前缀后以 - 替换 /(如 /api/overview → api-overview)/overview: 成功 | HTML ✓ | .meta.yaml ✓).status 文件判断 Task 是否完成(见"批次执行流程")/doc-smith-check --structure 通过/doc-smith-check --content 通过dist/ 目录包含所有文档的 HTMLnav.js 包含所有文档条目.aigne/doc-smith/ 目录下)| 场景 | 判断条件 | 行为 |
|---|---|---|
| 首次生成 | docs/ 不存在或用户明确要求 | 完整流程:意图 → 结构 → 生成 |
| 修改已有文档 | docs/ 已存在 | AI 理解修改请求,直接修改,满足约束即可 |
修改场景不需要 changeset/PATCH 机制。用户用自然语言描述修改需求,AI 执行并满足约束。
文件:.aigne/doc-smith/intent/user-intent.md
基于项目 README 和目录结构(ls/Glob)推断目标用户、使用场景、文档侧重点。生成后用 AskUserQuestion 确认。
# 用户意图
## 目标用户
[主要受众是谁]
## 使用场景
- [场景 1]
- [场景 2]
## 文档侧重点
本文档采用**[文档类型]**的形式:
- [侧重点 1]
- [侧重点 2]
主 agent 生成 user-intent.md 并经用户确认后,根据项目规模选择结构规划方式:
document-structure.yamldocument-structure.yaml 草稿,Task 返回文件路径 + 结构摘要(≤ 10 行)生成后用 AskUserQuestion 向用户确认,展示文档总数、层次、每个文档的标题和描述。
node skills/doc-smith-build/scripts/build.mjs \
--nav --workspace .aigne/doc-smith --output .aigne/doc-smith/dist
在分发内容生成 Task 之前,主 agent 执行一次图片后端检测,确定可用后端。后台 Task 无法与用户交互,因此必须在前台完成检测。
检测逻辑与 doc-smith-images 的「后端检测」部分相同:
GEMINI_API_KEY 是否已设置 → 选定 gemini-sdkafs-cli检测结果记为 {IMAGE_BACKEND}(值为 gemini-sdk、afs-cli 或 skip),传入每个 Task 的 prompt 模板。只有用户明确选择跳过时才可设为 skip。
若 {IMAGE_BACKEND} 为 gemini-sdk,还需确保依赖已安装:
ls <skill-directory>/scripts/node_modules/@google/genai 2>/dev/null || (cd <skill-directory>/scripts && npm install)
每篇文档使用单独的 Task tool 生成(≤ 5 篇并行,> 5 篇分批)。必须使用 run_in_background: true 分发 Task。必须使用以下模板构造 Task prompt,不得自行概括 content.md 内容:
你是文档内容生成代理。请先用 Read 工具读取 {CONTENT_MD_PATH} 作为你的完整工作流程,然后严格按照其中的步骤执行。
参数:
- 文档路径:{docPath}
- workspace:{WORKSPACE_PATH}
- 可链接文档列表:{LINKABLE_DOCS}
- mediaFiles:{MEDIA_FILES}
- 用户意图摘要:{INTENT_SUMMARY}
- 状态文件路径:{STATUS_FILE_PATH}
- 图片后端:{IMAGE_BACKEND}
关键工具说明:
- 使用 Skill 工具调用 /doc-smith-images 生成图片(步骤 5.5),必须传入 --backend {IMAGE_BACKEND}
- 使用 Skill 工具调用 /doc-smith-check 校验文档(步骤 7)
完成检查清单(必须在写入状态文件前逐项确认):
□ 步骤 5 图片使用:文档中已按需添加图片引用
□ 步骤 5.5 图片生成:已扫描并处理所有 /assets/{key}/images/ 引用
□ 步骤 6.5 HTML 构建:已执行 build.mjs --doc 并确认 HTML 生成
□ 步骤 7 校验:已调用 /doc-smith-check --content --path {docPath}
□ 状态文件:已将 1 行摘要写入 {STATUS_FILE_PATH}
模板变量说明:
{CONTENT_MD_PATH}:references/content.md 的绝对路径{WORKSPACE_PATH}:.aigne/doc-smith 的绝对路径{docPath}:文档路径,如 /overview{LINKABLE_DOCS}:所有文档路径列表(从 document-structure.yaml 提取){MEDIA_FILES}:媒体资源扫描结果{INTENT_SUMMARY}:user-intent.md 的 2-3 句话摘要{STATUS_FILE_PATH}:.aigne/doc-smith/cache/task-status/{slug}.status{IMAGE_BACKEND}:图片后端检测结果(gemini-sdk、afs-cli 或 skip)分发第一个 Task 前:
rm -rf .aigne/doc-smith/cache/task-status && mkdir -p .aigne/doc-smith/cache/task-status(重建目录,清空旧状态)每个 Task 使用 run_in_background: true 分发。批次内所有 Task 同时启动。
每 15 秒检查 .status 文件数量:
find .aigne/doc-smith/cache/task-status -name '*.status' | wc -l
.status 文件find .aigne/doc-smith/cache/task-status -name '*.status' -exec cat {} +
每个文件 1 行,所有文档摘要汇总后通常不超过 20 行。
.status 内容以"失败"开头 → 记录失败原因,不阻塞后续批次.status → 标记为超时,在最终报告中提示用户重试构建完成后,读取 dist/ 中生成的 HTML 文件(每种语言各抽查 1-2 个页面),检查输出是否符合预期。如有问题直接修改 HTML 文件修复。
cd .aigne/doc-smith && git add . && git commit -m "docsmith: xxx"
所有文档生成并校验通过后,向用户展示生成摘要,并提示:
文档已生成完毕,可使用
/doc-smith-publish将文档发布到线上预览。
.aigne/doc-smith/
├── config.yaml
├── intent/user-intent.md
├── planning/document-structure.yaml
├── docs/{path}/.meta.yaml
├── dist/
│ ├── index.html
│ ├── {lang}/docs/{path}.html
│ └── assets/nav.js, docsmith.css, theme.css
├── assets/{key}/.meta.yaml, images/{lang}.png
├── glossary.yaml # 可选
└── cache/
├── translation-cache.yaml # 发布用
└── task-status/{slug}.status # Task 完成信号文件