From 52b06cb75af9826b3e17fe62f8746d091ef4433d Mon Sep 17 00:00:00 2001 From: CodeGraph Test Date: Sun, 4 Oct 2026 01:52:50 +0800 Subject: [PATCH] docs: show the browser viewer and the community channels MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - READMEs (both languages): a viewer capture under the header, a "Visual (preview)" point, a Browser viewer section with the Flow and Map views, a Community section with GitHub Issues and the WeChat Official Account 六月水蓝, and the website in the documentation list. docs-check now requires the two new sections in both mirrors. - Website: a community page in both languages and the Official Account's QR code on both home pages (public/community/, the same image as the pt-tools and Voltip sites). - Quick start: step 5 shows the real output of search, callers, callees and impact, now that the kind column is padded (#314). --- README.md | 49 ++++++++++- docs/readme/README.zh-CN.md | 45 +++++++++- docs/site/README.md | 6 +- docs/site/en/guide/quick-start.md | 78 ++++++++++++++++-- docs/site/en/index.md | 8 +- docs/site/en/reference/community.md | 18 ++++ docs/site/guide/quick-start.md | 77 +++++++++++++++-- docs/site/index.md | 6 +- .../community/wechat-official-account.jpg | Bin 0 -> 26741 bytes docs/site/reference/community.md | 17 ++++ scripts/docs-check.py | 4 +- 11 files changed, 286 insertions(+), 22 deletions(-) create mode 100644 docs/site/en/reference/community.md create mode 100644 docs/site/public/community/wechat-official-account.jpg create mode 100644 docs/site/reference/community.md diff --git a/README.md b/README.md index 136f829..2d2abd6 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,12 @@ native binary. No AI or vector runtime inside the indexer. [English](README.md) · [简体中文](docs/readme/README.zh-CN.md) · [Website](https://firlab.app/codegraph/en/) · [Documentation](docs/README.md) · -[Contributing](CONTRIBUTING.md) +[Browser viewer](#browser-viewer) · [Community](#community) · [Contributing](CONTRIBUTING.md) + + + + The CodeGraph browser viewer showing the method IndexPaths::resolve: its callers on the left, its source with every call marked in the middle, and the functions it calls on the right. + @@ -31,6 +36,9 @@ LLM to rediscover structure through repeated text searches. exploration use one indexed representation. - **Agent-ready:** an MCP server exposes the same graph and verbatim source used by the CLI. +- **Visual (preview):** a local browser viewer reads the same index: a symbol's + callers, source and callees side by side, call paths, an architecture map, type + hierarchies and the code nothing reaches. - **Local-first:** the index lives under the project; the shared daemon and HTTP transport are local processes. - **Broad language coverage:** grammar-backed languages, embedded/template files, @@ -246,6 +254,35 @@ Full target and configuration matrices: [`docs/cli.md`](docs/cli.md), [`docs/mcp.md`](docs/mcp.md), and [`editors/zed/README.md`](editors/zed/README.md). +## Browser viewer + +`codegraph ui` opens a local, read-only reader of the index in your browser. It is a +preview, refused unless `CODEGRAPH_UI=1` is set: + +```bash +CODEGRAPH_UI=1 codegraph ui # the indexed project you are in +CODEGRAPH_UI=1 codegraph ui --read-only # also refuse saving trails +``` + +It binds `127.0.0.1` only, never builds or changes the index, and writes nothing but +the trails you choose to save under `.codegraph/ui/trails/`. It has a dark and a light +theme and follows the system's until you pick one. + + + + + + + + + + +
The Flow view: the call path from cmd_explore to explore_file_header, each hop with the code that makes the call.The Map view: this repository's crates and the dependencies between them, foundations at the bottom.
Flow: the call path from one function to anotherMap: modules and the dependencies between them
+ +A tour of every view is on the website: +[the browser viewer](https://firlab.app/codegraph/en/guide/viewer). The reference is +[`docs/ui.md`](docs/ui.md). + ## Determinism and safety The compatibility contract includes stable node IDs, canonical golden artifacts, @@ -291,6 +328,8 @@ make check ## Documentation +- [firlab.app/codegraph](https://firlab.app/codegraph/en/) — the website: guide, quick + start and a tour of the viewer ([简体中文](https://firlab.app/codegraph/)) - [`docs/README.md`](docs/README.md) — documentation map - [`docs/architecture.md`](docs/architecture.md) — workspace and runtime design - [`docs/cli.md`](docs/cli.md) — complete command reference @@ -301,6 +340,14 @@ make check - [`docs/upstream-sync/UPSTREAM.md`](docs/upstream-sync/UPSTREAM.md) — upstream ledger - [`docs/troubleshooting.md`](docs/troubleshooting.md) — diagnostic workflow +## Community + +- Questions, bug reports and feature requests: + [GitHub Issues](https://github.com/sunerpy/codegraph-rust/issues). +- WeChat: the Official Account 六月水蓝. + +QR code of the WeChat Official Account 六月水蓝 + ## License MIT — see [`LICENSE-MIT`](LICENSE-MIT). diff --git a/docs/readme/README.zh-CN.md b/docs/readme/README.zh-CN.md index 034f1a0..30514d0 100644 --- a/docs/readme/README.zh-CN.md +++ b/docs/readme/README.zh-CN.md @@ -14,7 +14,12 @@ [English](../../README.md) · [简体中文](README.zh-CN.md) · [网站](https://firlab.app/codegraph/) · [文档](../README.md) · -[参与贡献](../../CONTRIBUTING.md) +[浏览器查看器](#浏览器查看器) · [交流与反馈](#交流与反馈) · [参与贡献](../../CONTRIBUTING.md) + + + + CodeGraph 浏览器查看器中的方法 IndexPaths::resolve:左侧是调用方,中间是标出每处调用的源码,右侧是它调用的函数。 + @@ -27,6 +32,8 @@ CodeGraph 把源码树转换成本地知识图谱:符号成为节点,调用 canonical 图谱输出。 - **源码感知:** search、callers/callees、impact、文件源码和多文件探索共享同一索引。 - **代理友好:** MCP 服务器暴露与 CLI 相同的图谱和逐字源码。 +- **可视化(预览):** 本地浏览器查看器读取同一份索引:并排显示一个符号的调用方、 + 源码和被调用方,以及调用路径、架构图、类型层级和没有代码到达的符号。 - **本地优先:** 索引位于项目内;共享 daemon 和 HTTP transport 都是本地进程。 - **广泛语言覆盖:** grammar、嵌入式/模板文件以及 Godot、Tauri、JS 生态框架 关系使用同一 schema。 @@ -225,6 +232,33 @@ codegraph skill update --dry-run --diff [`docs/mcp.md`](../mcp.md) 与 [`editors/zed/README.md`](../../editors/zed/README.md)。 +## 浏览器查看器 + +`codegraph ui` 在浏览器中以只读方式打开项目的索引。它目前是预览功能,未设置 +`CODEGRAPH_UI=1` 时会被拒绝: + +```bash +CODEGRAPH_UI=1 codegraph ui # 当前所在的已建立索引的项目 +CODEGRAPH_UI=1 codegraph ui --read-only # 同时拒绝保存 Trail +``` + +它只监听 `127.0.0.1`,从不建立或修改索引,唯一写入的是你主动保存在 +`.codegraph/ui/trails/` 下的 Trail。它有深色和浅色两种主题,在你选择之前跟随系统设置。 + + + + + + + + + + +
Flow 视图:从 cmd_explore 到 explore_file_header 的调用路径,每一跳附有发出调用的代码。Map 视图:本仓库的各个 crate 及其依赖关系,底层模块位于下方。
Flow:从一个函数到另一个函数的调用路径Map:模块及其依赖关系
+ +网站上有每个视图的介绍:[浏览器查看器](https://firlab.app/codegraph/guide/viewer)。参考文档见 +[`docs/ui.md`](../ui.md)。 + ## 确定性与安全边界 兼容性契约包括稳定 node ID、canonical golden artifact、SQLite schema parity、 @@ -263,6 +297,8 @@ canonical agent 契约 [`AGENTS.md`](../../AGENTS.md)。 ## 文档 +- [firlab.app/codegraph](https://firlab.app/codegraph/) — 网站:指南、快速开始和查看器介绍 + ([English](https://firlab.app/codegraph/en/)) - [`docs/README.md`](../README.md) — 文档地图 - [`docs/architecture.md`](../architecture.md) — workspace 与运行时设计 - [`docs/cli.md`](../cli.md) — 完整命令参考 @@ -273,6 +309,13 @@ canonical agent 契约 [`AGENTS.md`](../../AGENTS.md)。 - [`docs/upstream-sync/UPSTREAM.md`](../upstream-sync/UPSTREAM.md) — 上游台账 - [`docs/troubleshooting.md`](../troubleshooting.md) — 诊断流程 +## 交流与反馈 + +- 提问、问题报告和功能建议:[GitHub Issues](https://github.com/sunerpy/codegraph-rust/issues)。 +- 微信:公众号「六月水蓝」。 + +微信公众号「六月水蓝」的二维码 + ## 许可证 MIT,详见 [`LICENSE-MIT`](../../LICENSE-MIT)。 diff --git a/docs/site/README.md b/docs/site/README.md index fa0095e..7da2749 100644 --- a/docs/site/README.md +++ b/docs/site/README.md @@ -18,7 +18,7 @@ Site paths below are relative to `https://firlab.app/codegraph/`. | `guide/`, `reference/faq.md`, `privacy.md`, `developers.md` and the same paths under `en/` | the user guide | | `../cli.md`, `../mcp.md`, `../ui.md`, `../languages.md`, `../godot.md`, `../troubleshooting.md` | `/en/reference/`, as they are; `/reference/` is a generated Chinese pointer | | `../architecture.md`, `../data-model.md`, `../equivalence.md`, `../grammar-manifest.md`, `../embedded-extraction.md`, `../benchmark.md`, `../benchmark-results.md` | `/en/dev/`, with a generated Chinese pointer at `/dev/` | -| `public/` | the site root (`/codegraph-logo.svg`, `/screens/*.webp`) | +| `public/` | the site root (`/codegraph-logo.svg`, `/screens/*.webp`, `/community/*`) | | `tools/`, this file | not published | The canonical references stay English, as `docs/AGENTS.md` asks. The site publishes them unchanged and gives each a @@ -85,6 +85,7 @@ Pages may use these components and no others; the sync rejects any other tag. | ----------------------------------------------------------------------------------- | --------------------------------------------------------- | | `` | release state, shown as text | | `` | a screenshot; `dark` is the same screen in the dark theme | +| `` | a QR code on a white plate in both themes | | `` | VitePress's own badge | | `HomeIndex`, `HomeSteps`, `SplitBlock`, `HomePlatforms`, `HomePrivacy`, `HomeScope` | the home pages only; they render the `home:` frontmatter | @@ -137,6 +138,9 @@ light and the dark theme, and waits until the view has finished loading. It stop `CODEGRAPH_SCREENS_COMMIT` changes the corpus commit and `CODEGRAPH_SCREENS_PORT` the port. +`public/community/wechat-official-account.jpg` is the WeChat Official Account's QR code, the same image the pt-tools +and Voltip sites show. The sync stops when a page names a `/screens/` or `/community/` file that does not exist. + Look at every image before committing it. Capture again when the viewer's text or layout changes, and update the `width`/`height` in both home pages and in the `` tags if the size changes. diff --git a/docs/site/en/guide/quick-start.md b/docs/site/en/guide/quick-start.md index 214fe6e..0198053 100644 --- a/docs/site/en/guide/quick-start.md +++ b/docs/site/en/guide/quick-start.md @@ -198,12 +198,78 @@ the command line's view of `codegraph_explore`, the tool coding agents call most ## 5. Follow calls and changes -| Command | Lists | -| -------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- | -| `codegraph search applyDiscount -p .` | the symbols whose name matches, best match first, with their location and signature | -| `codegraph callers applyDiscount -p .` | what calls or imports it: here `checkout` and the file `checkout.ts` | -| `codegraph callees checkout -p .` | what it calls: `applyDiscount`, `subtotal`, `tax`, and the `Cart` type it uses | -| `codegraph impact applyDiscount -p .` | everything a change would reach, through callers of callers, grouped by file: here `checkout`, `checkout.ts` and `main.ts` | +`search` finds symbols by name, best match first. `callers` and `callees` follow the calls one step, and `impact` +follows callers of callers to everything a change would reach, grouped by file: + +::: code-group + +```text [search] +$ codegraph search applyDiscount -p . + +Search Results for "applyDiscount": + +function applyDiscount + src/pricing.ts:3 + (amount: number, code?: string): number + +import ./pricing + src/checkout.ts:2 + import { applyDiscount, tax } from "./pricing"; +``` + +```text [callers] +$ codegraph callers applyDiscount -p . + +Callers of "applyDiscount" (2): + +applyDiscount (function) - src/pricing.ts:3 + +function checkout + src/checkout.ts:4 + +file checkout.ts [imports] + src/checkout.ts:1 +``` + +```text [callees] +$ codegraph callees checkout -p . + +Callees of "checkout" (4): + +checkout (function) - src/checkout.ts:4 + +function applyDiscount + src/pricing.ts:3 + +method subtotal + src/cart.ts:14 + +function tax + src/pricing.ts:8 + +class Cart [references] + src/cart.ts:7 +``` + +```text [impact] +$ codegraph impact applyDiscount -p . + +Impact of changing "applyDiscount" - 4 affected symbols: + +applyDiscount (function) - src/pricing.ts:3 + +src/checkout.ts + function checkout:4 + file checkout.ts:1 + +src/main.ts + file main.ts:1 + +src/pricing.ts + function applyDiscount:3 +``` + +::: Each of them takes `--json` for scripts. diff --git a/docs/site/en/index.md b/docs/site/en/index.md index 5d82e27..ee4dad4 100644 --- a/docs/site/en/index.md +++ b/docs/site/en/index.md @@ -277,7 +277,9 @@ The scripts check every archive against the release's `SHA256SUMS` before instal -## Feedback +## Community and feedback -Bug reports and feature requests go to [GitHub Issues](https://github.com/sunerpy/codegraph-rust/issues). CodeGraph is -MIT-licensed. +Bug reports and feature requests go to [GitHub Issues](https://github.com/sunerpy/codegraph-rust/issues). Scan the code +with WeChat to follow the Official Account 六月水蓝. CodeGraph is MIT-licensed. + + diff --git a/docs/site/en/reference/community.md b/docs/site/en/reference/community.md new file mode 100644 index 0000000..c296c1d --- /dev/null +++ b/docs/site/en/reference/community.md @@ -0,0 +1,18 @@ +--- +description: Where to ask questions, report problems and follow news about CodeGraph. +--- + +# Community + +This page lists where to ask questions, report problems and follow news about CodeGraph. + +## Problems and suggestions + +Report bugs and request features in [GitHub Issues](https://github.com/sunerpy/codegraph-rust/issues). Include the +output of `codegraph --version` and the steps that reproduce the problem. + +## WeChat + +Scan the code with WeChat to follow the Official Account 六月水蓝. + + diff --git a/docs/site/guide/quick-start.md b/docs/site/guide/quick-start.md index cf6cf7a..6136d2d 100644 --- a/docs/site/guide/quick-start.md +++ b/docs/site/guide/quick-start.md @@ -189,12 +189,77 @@ Found 10 symbols across 4 files. ## 5. 跟踪调用和改动 -| 命令 | 列出 | -| -------------------------------------- | ----------------------------------------------------------------------------------------------------------- | -| `codegraph search applyDiscount -p .` | 名称匹配的符号,最匹配的排在最前,附带位置和签名 | -| `codegraph callers applyDiscount -p .` | 调用或导入它的代码:这里是 `checkout` 和文件 `checkout.ts` | -| `codegraph callees checkout -p .` | 它调用的代码:`applyDiscount`、`subtotal`、`tax`,以及它用到的类型 `Cart` | -| `codegraph impact applyDiscount -p .` | 改动它会影响的全部代码,沿调用方的调用方逐层展开,按文件分组:这里是 `checkout`、`checkout.ts` 和 `main.ts` | +`search` 按名称查找符号,最匹配的排在最前。`callers` 和 `callees` 沿调用关系前进一步;`impact` 沿调用方的调用方逐层展开,列出改动会影响的全部代码,并按文件分组: + +::: code-group + +```text [search] +$ codegraph search applyDiscount -p . + +Search Results for "applyDiscount": + +function applyDiscount + src/pricing.ts:3 + (amount: number, code?: string): number + +import ./pricing + src/checkout.ts:2 + import { applyDiscount, tax } from "./pricing"; +``` + +```text [callers] +$ codegraph callers applyDiscount -p . + +Callers of "applyDiscount" (2): + +applyDiscount (function) - src/pricing.ts:3 + +function checkout + src/checkout.ts:4 + +file checkout.ts [imports] + src/checkout.ts:1 +``` + +```text [callees] +$ codegraph callees checkout -p . + +Callees of "checkout" (4): + +checkout (function) - src/checkout.ts:4 + +function applyDiscount + src/pricing.ts:3 + +method subtotal + src/cart.ts:14 + +function tax + src/pricing.ts:8 + +class Cart [references] + src/cart.ts:7 +``` + +```text [impact] +$ codegraph impact applyDiscount -p . + +Impact of changing "applyDiscount" - 4 affected symbols: + +applyDiscount (function) - src/pricing.ts:3 + +src/checkout.ts + function checkout:4 + file checkout.ts:1 + +src/main.ts + file main.ts:1 + +src/pricing.ts + function applyDiscount:3 +``` + +::: 这些命令都支持 `--json`,供脚本使用。 diff --git a/docs/site/index.md b/docs/site/index.md index 13c1fd5..3fdcd14 100644 --- a/docs/site/index.md +++ b/docs/site/index.md @@ -270,6 +270,8 @@ cargo install --locked --git https://github.com/sunerpy/codegraph-rust codegraph -## 反馈 +## 交流与反馈 -问题报告和功能建议请提交到 [GitHub Issues](https://github.com/sunerpy/codegraph-rust/issues)。CodeGraph 以 MIT 许可发布。 +问题报告和功能建议请提交到 [GitHub Issues](https://github.com/sunerpy/codegraph-rust/issues)。使用微信扫码,可以关注公众号「六月水蓝」。CodeGraph 以 MIT 许可发布。 + + diff --git a/docs/site/public/community/wechat-official-account.jpg b/docs/site/public/community/wechat-official-account.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a7aaabb59d566360fbeff9b6fdae26c6b4a1ba05 GIT binary patch literal 26741 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 z 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 cJ{<|u^9bYbJz diff --git a/scripts/docs-check.py b/scripts/docs-check.py index da04a74..3b13d6d 100755 --- a/scripts/docs-check.py +++ b/scripts/docs-check.py @@ -170,11 +170,11 @@ def main() -> int: require_headings( "README.md", - ["Why CodeGraph", "Install", "Quickstart", "CLI", "MCP", "Agents and IDEs", "Performance", "Development", "License"], + ["Why CodeGraph", "Install", "Quickstart", "CLI", "MCP", "Agents and IDEs", "Browser viewer", "Performance", "Development", "Community", "License"], ) require_headings( "docs/readme/README.zh-CN.md", - ["为什么选择 CodeGraph", "安装", "快速上手", "CLI", "MCP", "Agents 与 IDE", "性能", "开发", "许可证"], + ["为什么选择 CodeGraph", "安装", "快速上手", "CLI", "MCP", "Agents 与 IDE", "浏览器查看器", "性能", "开发", "交流与反馈", "许可证"], ) english = read("README.md")