FEATURED · 精选文章

graphify Droid 技能实战:/graphify add 抓取 URL 入图与 --watch 目录监控自动更新

发布时间 / 2026/9/7 7:36:44
来源 / 创域科博编辑部
栏目 / 资讯中心
graphify Droid 技能实战:/graphify add 抓取 URL 入图与 --watch 目录监控自动更新 graphify Droid 技能实战/graphify add 抓取 URL 入图与 --watch 目录监控自动更新【免费下载链接】graphifyTurn any codebase, with its docs, SQL schemas, configs, and PDFs, into a queryable knowledge graph. A /graphify skill for Claude Code, Cursor, Codex, and Gemini CLI: local deterministic AST parsing, every edge explained, no vector store.项目地址: https://gitcode.com/GitHub_Trending/graph/graphify本文围绕 graphify 的 Droid 技能参考文档 add-watch.md 展开讲解两个不属默认构建流程、但决定知识图谱能否保持新鲜的能力用/graphify add url把网页、推文、论文、PDF、图片甚至视频抓取进语料库并合并进图以及用--watch启动后台监控器在文件变化时自动重建图。读完后你可以直接复现完整的入图命令理解各类 URL 的自动检测与保存格式并掌握 watch 的防抖机制、代码/文档双路径更新策略及其底层实现细节。两个能力的定位均不在默认构建流程中参考文档开篇即给出触发条件只有当用户执行了/graphify add url或传入了--watch时才加载本文档。两者都不参与 graphify 的默认构建extract→build→cluster→report主链路而是两条增量入口/graphify add是一条写入路径把外部 URL 的内容拉进./raw语料目录再触发--update流水线把新文件合并进既有图--watch是一个常驻进程在后台观察目录代码文件变化时立即无 LLM 重建文档/图片变化时落一个needs_update标志提示人工执行语义更新。这种默认构建 两条增量通道的拆分让图谱既能在一次性构建后长期有效又能低成本地跟随语料演化。/graphify add抓取 URL 并入图标准操作流程文档给出的执行模板是URL、AUTHOR、CONTRIBUTOR为占位符按实际情况替换$(cat graphify-out/.graphify_python) -c import sys from graphify.ingest import ingest from pathlib import Path try: out ingest(URL, Path(./raw), authorAUTHOR, contributorCONTRIBUTOR) print(fSaved to {out}) except ValueError as e: print(ferror: {e}, filesys.stderr) sys.exit(1) except RuntimeError as e: print(ferror: {e}, filesys.stderr) sys.exit(1) 命令使用graphify-out/.graphify_python中记录的 Python 解释器来运行保证依赖环境一致。三个占位符的说明占位符含义缺省行为URL要抓取的目标地址必改—AUTHOR作者名写入文件 frontmatter不传则省略CONTRIBUTOR团队图场景下的贡献者名不传时回退到author再回退到unknown文档同时明确了两条纪律命令以错误退出时必须把错误原因告知用户不得静默继续保存成功后自动在./raw上运行--update流水线把新文件合并进既有图。ingest()本身抛出的是ValueErrorURL 校验失败与RuntimeError网络抓取失败这正是模板中两个except分支的由来。CLI 侧同样提供入口graphify add url [--author Name] [--contributor Name] [--dir ./raw]见 cli.py 中cmd add分支与技能模板等价。自动检测的 URL 类型与保存格式ingest()会按_detect_url_type()自动分类 URL 并走对应分支实现见 ingest.pyYouTube / 任意视频 URL→ 通过 yt-dlp 下载音频存为yt_sha1前12位.ext音频文件如.m4a在下次运行时由 faster-whisper 转写为.txt。需要安装视频扩展pip install graphifyy[video]该 extra 对应faster-whisper要求 Python ≥ 3.11与yt-dlp见 pyproject.toml 的[project.optional-dependencies]Twitter/X→ 通过 oEmbed 接口抓取保存为带推文正文与作者的.md若 oEmbed 失败则降级保存 URL 存根arXiv→ 抓取摘要页保存为含标题、作者、arXiv ID 与摘要的.md文件名形如arxiv_2401_12345.mdPDF路径以.pdf结尾→ 直接二进制下载为.pdf图片.png/.jpg/.webp等→ 直接下载下次运行时由 Claude vision 提取内容任意网页→ HTML 转 markdown 保存为.md正文截断到 12000 字符。所有文本型产物都带 YAML frontmattersource_url、type、author/paper_authors、captured_at、contributor这是后续 extractor 读取为节点元数据的约定。目标重名时会自动追加_1、_2计数器避免覆盖。安全层SSRF 防护与体积上限/graphify add本质是代理抓取因此安全处理相当严格实现见 security.pyURL 校验validate_url()只放行http/https方案阻断file://、ftp://、data:等并对解析出的 IP 做私有/保留/环回/链路本地/CGN100.64.0.0/10区段检查屏蔽云元数据端点如metadata.google.internal防止云环境 SSRF防 DNS-rebind不 monkey-patch 全局 DNS而是子类化 HTTP 连接——每次连接只解析一次 DNS 并校验 IP 后直连该 IP杜绝校验与连接之间换 IP的时间差攻击重定向再校验_NoFileRedirectHandler对每个重定向目标重新执行validate_url防止开放重定向到file://或内网体积上限二进制下载硬上限 50 MB_MAX_FETCH_BYTESHTML/文本 10 MB_MAX_TEXT_BYTES流式读取超限即中止YAML 注入防护抓取到的页面标题等外部字符串在写入 frontmatter 前经_yaml_str()转义含\t、\0、U2028/U2029 等 YAML 行终止字符避免恶意页面标题逃逸出双引号标量注入兄弟键。视频下载路径transcribe.py 的download_audio()在 yt-dlp 运行前同样先调用validate_url(url)做前置校验并保持缓存——同一 URL 重复 add 会命中已有音频文件。--watch后台监控目录自动更新启动命令与行为矩阵文档给出的启动方式为$(cat graphify-out/.graphify_python) -m graphify.watch INPUT_PATH --debounce 3INPUT_PATH换成要监控的目录--debounce默认 3 秒。行为取决于变化的是什么变化类型行为是否需要 LLM仅代码文件.py、.ts、.go等立即重跑 AST 抽取 重建 聚类graph.json与GRAPH_REPORT.md自动更新否文档、论文或图片写入graphify-out/needs_update标志文件并打印通知提示执行/graphify --update是语义重抽取任意被监控文件被删除同样立即重建驱逐不需要 LLM全量语料对账会把源文件消失的节点剔除否防抖默认 3 秒等文件活动停止后才触发避免一波并行 agent 写入导致每个文件都触发一次重建。CtrlC 停止。对于 agent 工作流文档建议把--watch跑在后台终端中agent 各波次之间的代码改动会被自动拾取但如果 agent 同时还在写文档或笔记那些波次之后仍需手动/graphify --update。watch 的实现要点graphify/watch.pywatch.py 中watch()的实现与文档描述一一对应并补充了几个文档未展开的细节观察器选型基于watchdogmacOS 上刻意使用PollingObserverFSEvents 在部分编辑器下会漏掉快速保存其他平台用默认ObserverLinux inotify只读事件过滤_is_read_only_event()丢弃opened/closed_no_write事件——否则 inotify 会把观察者自己读文件也算成变化导致 watcher 自我触发、空烧 CPU忽略规则前置短路.graphifyignore模式在启动时加载一次而不是每个事件重解析.graphifyignore匹配、扩展名不在_WATCHED_EXTENSIONS、路径含.开头的段、路径含graphify-out任一命中即丢弃事件防抖批处理主循环每 0.5 秒检查一次距最后一次事件达到 debounce 秒后把累计的变更集作为一个 batch 处理——batch 含代码文件就调_rebuild_code()batch 含仍存活的非代码文件就调_notify_only()写标志。needs_update标志可由graphify check-updatecheck_update()在任意时刻检查它对 cron 友好恒返回 True。重建路径的并发与防回退机制_rebuild_code()是代码变化立即重建的执行体源码中有几个值得注意的工程细节每仓库建议锁_rebuild_lock()用fcntl.flock对graphify-out/.rebuild.lock加非阻塞锁持锁期间文件内含持锁 PID进程被杀时锁自动释放无残留清理。并发 hook 抢不到锁时其变更集先追加到.pending_changes_queue_pending()持锁方在重建前后 drain 合并最多 20 轮防止提交风暴活锁——这样多个仓库并发的 post-commit hook 不会互相丢改动增量抽取的解析上下文增量重建只解析变更文件跨文件 resolver 看不到未变更文件中的被调符号实现会把持久化图中未重抽取文件的 AST 节点含_callable标记与contains/method边作为只读上下文传入extract()让calls边不因增量而消失收缩守卫_check_shrink()若新图节点数少于旧图且无法用本次重抽取/删除的源文件解释则拒绝写入并提示可用--force覆盖——目的是拦截抽取分块失败导致的静默缩水fail-closed 对账已有graph.json读不出来超GRAPHIFY_MAX_GRAPH_BYTES上限或 JSON 损坏时拒绝覆盖——只是读失败不等于允许改写文件仍在磁盘上但被排除规则命中的节点仅在存在活着的忽略规则正证据时才驱逐.graphifyignore/持久化--exclude每次重建都生效.gitignore规则仅在全量重建时生效无变化快路径候选图与现有图做规范化拓扑比较若拓扑相同则不重写核心产物仅按需补建graph.html_reconcile_graph_html()并打印 No code-graph topology changes detected。这些机制保证了文档承诺的graph.json和GRAPH_REPORT.md自动更新是原子且防回退的写入走 tmp 文件 replace崩溃不会留下截断的 graph.json。相关资源文档主体graphify/skills/droid/references/add-watch.md核心实现graphify/ingest.pyURL 抓取与保存、graphify/watch.py监控与重建、graphify/security.pySSRF 防护、graphify/transcribe.py音频下载与转写其他 agent 平台的同名参考文档内容一致graphify/skills/claude/references/add-watch.md、graphify/skills/codex/references/add-watch.md 等相关测试tests/test_ingest.py、tests/test_watch.py、tests/test_watch_manifest_location.py【免费下载链接】graphifyTurn any codebase, with its docs, SQL schemas, configs, and PDFs, into a queryable knowledge graph. A /graphify skill for Claude Code, Cursor, Codex, and Gemini CLI: local deterministic AST parsing, every edge explained, no vector store.项目地址: https://gitcode.com/GitHub_Trending/graph/graphify创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻