ferdinandobons/LogicChart

GitHub: ferdinandobons/LogicChart

LogicChart 是一款本地优先的确定性静态分析工具,可将 10 种语言的代码控制流转换为供人类和 AI Agent 导航的交互式决策流程图,帮助开发者在代码审查中发现遗漏分支和状态处理问题。

Stars: 1 | Forks: 0

# LogicChart **本地优先的静态分析工具,可将代码转换为供人类和编码 Agent 导航的决策流程图。具有确定性,支持 10 种语言,无需 API key。** ![在 AI 出现之前,你通过手动编写代码来构建并理解它;有了 AI 之后,没人知道它是如何运行的;而有了 AI 加 LogicChart,你又能重新理解它了。](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/5920095161224102.svg) 在 AI 时代,你很容易迷失对自己代码实际功能的掌控。你快速发布代码,结果却变得 不确定它是如何运行的,或者各部分是如何组合的,直到最后真的没人了解它。LogicChart 会将代码 重新转换为一张可导航的决策图谱,这样你就可以直观地查看它、对其进行推理,找出需要 修改的地方或漏洞所在。 它会读取你的源代码(绝不运行它),并将分支逻辑转换为清晰、可点击的流程图:包括 `if` / `switch` / `match` 路径、错误处理,以及将各个部分连接起来的调用。它是确定性的且完全离线的:相同的代码始终会得出相同的结果。 一个模型可以涵盖**单个函数、系统的某个部分(`backend/`、`frontend/`、 `edge/`),甚至是整个代码库**,并且你可以在它们之间自由缩放。它会以机器可读的模型、可审查的流程图和交互式查看器的形式提交到 git 中,无论是人类还是 编码 Agent 都能使用。每一项发现都标注了置信度(`VERIFIED`、`INFERRED` 或 `POTENTIAL_GAP`),因此绝不会把猜测粉饰成事实。 ## 30秒内看懂它 这个 Next.js route handler 对 `user.status` 进行了 switch 判断,但漏掉了 `UserStatus` enum 中声明的一个 case: ``` switch (user.status) { // user.status: UserStatus { ACTIVE, SUSPENDED, DELETED } case UserStatus.ACTIVE: return Response.json(user); case UserStatus.SUSPENDED: return new Response("Blocked", { status: 403 }); // no default, and DELETED is never handled } ``` `logicchart analyze` 会将这行内容写入提交的报告中,指出确切缺失的 成员,并标明它是如何知道的: ``` - **WARNING · INFERRED · enum_exhaustiveness** Declared UserStatus members not handled for user.status: UserStatus.DELETED ``` `INFERRED` 意味着这是基于声明的 enum 进行的确定性启发式判断,而不是猜测。这是在捆绑的 demo(包含 10 种语言、3 个 scope 的代码库)中**唯一**的发现。该模型在规模扩大时依然保持精确。你可以在 [`examples/demo`](examples/demo) 上自己运行试试。 ## 它的优势 在代码审查和重构时,无论是针对单个函数还是整个 repo 的任何范围: - **在代码审查前捕获缺失的 case**:没有 fallback 的 `switch` / `match` / `if` 链。 - **检查同级流程间的状态处理是否一致**:某个 route 处理了一个状态,而另一个却默默丢弃了,甚至跨越了不同文件和语言。 - **查看变更影响**:从你准备编辑的服务中可以到达哪些 entry point。 - **从单一模型中推理整个代码库或某个宏观部分**(backend、frontend 或 edge)。 - **为编码 Agent 提供确定性的控制流图谱**,这样它们就可以直接查询,而无需重新阅读文件。 ## 安装 LogicChart 尚未发布到 PyPI。你可以使用 [uv](https://docs.astral.sh/uv/) 从源码安装它: ``` git clone https://github.com/ferdinandobons/LogicChart.git logicchart cd logicchart uv tool install . # the `logicchart` command, available everywhere # uv tool install '.[mcp]' # 包含可选的 MCP 服务器 ``` 用于开发(无需全局安装即可运行): ``` uv sync --extra dev --extra mcp uv run logicchart --help # prefix commands with `uv run` ``` ## 快速开始 进入你想要分析的项目: ``` logicchart analyze --full logicchart view ``` 不需要 `init` 步骤。LogicChart 具有实用的默认配置,除非你指定其他路径,否则它将分析当前目录(`.`)。只有在你需要自定义 root、排除项、scope、entrypoint、输出目录或 gated detector 时,才添加配置。 你会在 `logicchart-out/` 目录下获得三个文件: | 文件 | 用途 | |---|---| | `logic-flow.json` | 规范模型,由 CLI 和 MCP 使用;**请提交它** | | `logic-flow.md` | 可审查的 Mermaid 流程图 + 发现列表;**请提交它** | | `logic-flow.html` | 可导航的本地查看器(目录树 + 原地展开画布 + 源码/发现);会自动重新生成,建议 git 忽略 | 在 Markdown 报告中,`VERIFIED` / `INFERRED` 发现位于主体部分,而 `POTENTIAL_GAP` 审查候选项被折叠在可展开的区块下(`--include-gaps` 会展开它)。无法解析的文件会被跳过并记录在报告中,绝不会导致运行中止。 ## 命令 每个命令都将项目路径作为位置参数(默认为 `.`)。以下示例 针对捆绑的 [`examples/demo`](examples/demo) 运行。 ### `analyze`:构建模型 ``` logicchart analyze examples/demo --full ``` ``` Analyzed 14 files: 25 flows, 1 finding. Incremental cache: 0 hits, 14 changed, 0 deleted. Wrote .../logic-flow.json Wrote .../logic-flow.md Wrote .../logic-flow.html ``` `--full` 会忽略增量缓存;`--no-html` 会跳过查看器;`--include-gaps` 会展开 Markdown 中仅供审查的发现项。当你需要公开示例 artifact、用于 LogicChart 自身内部结构测试的 dogfood 图谱,或者是写入到单独输出目录的全检出图谱时,请使用 `--profile demo`、`--profile self` 或 `--profile project`。 ### `update`:增量刷新 ``` logicchart update examples/demo ``` 仅重新分析内容发生变化的文件(基于内容哈希的缓存),然后重写 JSON 和 Markdown。在进行重大更改后,请提交这两个文件。 ### `query`:向模型提问 ``` logicchart query "where is suspended user status handled?" --path examples/demo ``` ``` 1. POST [route] frontend/app/api/users/route.ts:4 score=19 · `user` appears in a decision or action; `user` appears in a review finding; `status` appears in a decision or action 2. statusLabel [function] frontend/lib/status.js:3 score=13 · `suspended` appears in a decision or action; `status` matches the flow identity; `status` appears in a decision or action ``` 对与行为、状态或决策最相关的流程进行排名。添加 `--json` 可获得 机器可读的输出。查询排名使用流程标识、路径/scope/语言结构、 决策元数据和发现文本,因此 Agent 风格的问题可以超越单纯的 标签进行精准定位。使用 `--scope`、`--language` 或 `--finding-kind` 进行限制: ``` logicchart query "order status" --path examples/demo --scope backend logicchart query "enum exhaustiveness" --path examples/demo --finding-kind enum_exhaustiveness ``` ### `impact`:变更会影响什么? ``` logicchart impact backend/users.py --path examples/demo ``` ``` Changed files: 1 Directly impacted flows: 3 Transitively impacted flows: 0 Related review findings: 0 Direct impact: - Repository.fetch (backend/users.py:9) - get_user (backend/users.py:23) - load_user (backend/users.py:32) ``` 如果没有提供文件参数,它会使用 `git diff` 来推断发生了什么变化。`--scope ` 会将 影响集限制在一个宏观部分。 ### `view`:可导航的代码库查看器 ``` logicchart view examples/demo ``` 渲染 `logic-flow.html` 并在 `http://127.0.0.1:8765/logic-flow.html` 提供服务:这是整个 代码库的可导航模型。左侧栏是目录树;中间是一个**原地展开画布** (scope 超级节点会原地展开为一个 scope 的流程,而流程会原地展开为其决策 图);右侧栏显示所选流程的**源码**及其**逻辑 错误**。左侧栏包含流程搜索和语言过滤;错误面板包含 一个按优先级排序的审查队列。选择一个块、一行源码、一个树状文件或一个发现项 都会高亮其他相关项,并且全屏切换功能可以最大化画布。添加 `--render-only` 可在 不提供服务的情况下直接生成 HTML。 ![LogicChart 交互式查看器显示代码库树、可展开画布、选定的流程以及同步的源码/发现面板。](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/6b1f969994224108.png) ### `validate`:检查 artifact 合约 ``` logicchart validate logicchart validate --check-sync ``` 根据捆绑的 schema 和当前的分析器注册表验证 `logic-flow.json`。 `--check-sync` 会重新分析源代码,如果提交的模型已过期,则会失败。 ### `doctor`:检查活动安装 ``` logicchart doctor ``` 检查你正在运行的 `logicchart` 命令是否能导入每一个 runtime parser 依赖。这可以捕获依赖项更改后过时的可编辑安装,并打印出适用于 当前 Python 解释器的修复命令。 ### `init` / `install` / `mcp` 这些命令是可选的。当你需要项目配置、持久的 Agent 指令或 MCP 集成时,请在首次成功分析后使用它们。 ``` logicchart init logicchart install logicchart mcp . ``` ## 整个代码库与 scope 一个模型就可以容纳整个多语言 repo。只需声明一次宏观部分,每个命令 (以及查看器)就可以被限制在其中一个部分中: ``` [logicchart.scopes] backend = ["backend/**", "services/**"] frontend = ["frontend/**", "web/**"] edge = ["edge/**", "workers/**"] ``` 如果没有 `[logicchart.scopes]` 块,顶层目录就是推断出的 scope,因此代码库 开箱即用地被划分为 backend/frontend/edge 风格的各个部分。向 `query` 和 `impact` 传递 `--scope `,并在查看器中使用 scope 和语言过滤器,即可 一次专注于一个部分或整个系统。每个流程都会记录它所属的 scope,并且 Markdown 头部 会汇总细分情况(例如 `backend (16) · edge (3) · frontend (6)`)。 ## 支持的代码 **语言:10 种支持控制流。** 控制流(函数、 方法、`if` / `else`、`switch` / `match`、异常、返回,以及连接 流程的内部调用)是从以下内容中提取的: | | | |---|---| | **Python** (`.py`) | 完整的 AST 分析器 | | **TypeScript / TSX** (`.ts`, `.tsx`) 和 **JavaScript** (`.js`, `.jsx`, `.mjs`, `.cjs`) | tree-sitter 分析器 | | **Go** (`.go`)、**Java** (`.java`)、**C#** (`.cs`)、**PHP** (`.php`)、**C** (`.c`, `.h`)、**Rust** (`.rs`)、**Ruby** (`.rb`) | 配置驱动的 tree-sitter 引擎 | 一种新的控制流语言只需要一个小的 *profile*(语法词汇表 + 少量提取器),而不是 一个定制分析器,因此无需 fork 流水线即可扩展覆盖范围。语言特定的 正确性得到了尊重:例如,Rust 的 `match` 在编译时是穷尽的,因此它永远不会被 标记为缺少 `default`。 **感知框架的 entry point:** - FastAPI 路由 - Next.js route handler、middleware、server action、page 和 layout - 浅层 React 组件、hook 和 event handler - 公开/导出的函数、包级函数和方法、CLI 命令和测试 **局限性(设计使然):** LogicChart 不会运行你的代码、追踪 runtime 行为、执行 完整的符号执行,或重建深层的 React 状态。“浅层” React 意味着它会读取组件及其 hook 的结构,而不是它们在多次重新渲染时渲染的内容;请将这些 发现视为审查候选项。它映射的是每个 entry point 自身的控制流以及连接 流程的内部调用,而不是任意深度的调用链。 ## 证据级别 - `VERIFIED`:直接从语法或框架约定中提取。 - `INFERRED`:由可解释的确定性启发式方法生成。 - `POTENTIAL_GAP`:审查候选项,绝不自动视为 bug。 ## 发现类型 单流程(针对单个流程进行推理): - `missing_branch`:基于类似状态主体的 `match` / `switch` 或 `if` / `elif` 链,没有显式 `else` / `default`。 - `dead_code`:在每个路径都已经返回或抛出异常的节点之后的代码。 - `broad_except_swallow`:默默丢弃错误的异常处理器:空主体或仅记录日志,没有重新抛出或错误返回。 - `no_op_branch`:具有空主体的显式 `if` 分支。 - `asymmetric_return`:大多数 case 都返回/抛出异常,但其中一个发生落空(可能缺少返回值)的 dispatch。 - `dead_guard`:对模块级布尔常量的真值守卫,因此某个分支永远是 dead code。 跨流程(比较同级流程): - `inconsistent_case_handling`:大多数在相同主体和 enum/union 上分支的同级流程都处理了某个值,但此流程在没有显式 default 的情况下忽略了它。 - `enum_exhaustiveness`:某个流程对声明的 enum 进行 dispatch(处理了几个成员),但在没有显式 default 的情况下省略了其他声明的成员。 - `outcome_inconsistency`:相同的 `subject == value` 条件在这里产生了与大多数同级流程(例如抛出 410)不同的结果(例如抛出 404)。 - `logging_asymmetry`:同级流程在拒绝(抛出异常)时会进行记录/警告的守卫,在这里却被默默处理了。 - `auth_divergence`(受控,通过 `gated_detectors` 选择启用):跳过了与其同文件伙伴执行的授权检查的 entry point。Middleware/DI 可以在无形中进行授权,因此它是一个审查候选项。 ## 配置 LogicChart 无需配置文件即可工作。只有在默认设置不够用时才运行 `logicchart init`;它会创建: ``` [logicchart] source_roots = ["."] exclude = [] include_public_functions = true max_call_depth = 4 output_dir = "logicchart-out" self_exclude = true gated_detectors = false [logicchart.entrypoints] include = [] exclude = [] # 代码库中已命名的 macro-parts(否则以顶级目录为 scope): # [logicchart.scopes] # backend = ["backend/**", "services/**"] # frontend = ["frontend/**", "web/**"] # edge = ["edge/**", "workers/**"] ``` `gated_detectors`(默认为 `false`)启用了可选的审查层检测器,例如 `auth_divergence`,这些检测器更容易出现误报(middleware/DI 可以在无形中 进行授权),因此除非你手动开启,否则它们是关闭的。 `self_exclude`(默认为 `true`)将 LogicChart 自身安装的包(以及当你 分析其源码检出时,它的 `tests/`)排除在生成的模型之外,因此 artifact 绝不会因为工具扫描其自身内部结构受到污染。 对于不应分析的生成文件或目录,请使用 `.logicchartignore`。 内置 profile 是叠加在配置和忽略规则之上的快捷方式: | Profile | 源码 root | 输出目录 | 用途 | |---|---|---|---| | `demo` | `examples` | `logicchart-out/` | 公开演示 artifact | | `self` | `src/logicchart` | `logicchart-out/self/` | LogicChart 内部结构的 dogfood 图谱 | | `project` | `src`, `tests`, `examples` | `logicchart-out/project/` | 面向 Agent 的全检出图谱 | ## 高级:Agent 与 MCP ### Agent 指令 安装持久的指令,告诉编码 Agent 去查阅和刷新 LogicChart: ``` logicchart install logicchart install --mcp-config codex # optional: also write project-scoped MCP config ``` 这会更新受支持的项目级文件: - `AGENTS.md` (用于 Codex) - `CLAUDE.md` (用于 Claude Code) - `GEMINI.md` (用于 Gemini CLI) - `.cursor/rules/logicchart.mdc` (用于 Cursor) 使用 `--platform codex`、`claude`、`gemini` 或 `cursor` 仅安装一个目标。 当你还希望为支持它的客户端生成项目作用域内的 MCP 配置时,请使用 `--mcp-config codex`、`claude`、`cursor` 或 `all`。 ### MCP 服务器 安装可选的 MCP 依赖(从源码检出安装,因为 LogicChart 尚未发布到 PyPI): ``` uv tool install '.[mcp]' # or, for development: uv sync --extra mcp ``` 在被分析的项目中启动 stdio 服务器: ``` logicchart mcp . ``` `logicchart install --mcp-config ...` 可以为受支持的客户端生成此配置。底层的 stdio 结构如下: ``` { "mcpServers": { "logicchart": { "command": "logicchart", "args": ["mcp", "/absolute/path/to/project"] } } } ``` 可用工具: - `logicchart_summary`:按类型/严重程度/证据划分的 flow/entrypoint 计数和发现 - `list_flows` - `get_flow` - `query_logic` - `get_findings` - `explain_finding_chain`:一项发现背后的确定性证据链 - `where_state_handled`:在域/值命名空间上分支的每个流程及其涵盖的值 - `find_decision_nodes`:对决策节点进行结构化搜索(域/主体/缺失回退) - `analyze_impact` - `review_queue`:针对当前 scope 或整个模型的优先级发现 - `context_pack`:用于 Agent 轮次的紧凑摘要 + 查询 + 影响 + 审查上下文 - `validate_artifacts` - `update_logicchart` 每个查询/列表工具都接受一个 `token_budget` 上限,以便 Agent 可以限制 单次调用返回的上下文量。 ## Roadmap 计划中的未来演进,对于早期独立维护的项目来说可能为时过早,但一旦 有团队真正开始使用 LogicChart,它们就是顺理成章的下一步: - **CI diff 门禁**:比较两个 `logic-flow.json` 快照,并在发现项 新出现时拒绝 pull request(带有用于代码扫描的 SARIF 输出)。 - **Git 自动同步 hook**:托管的 post-commit 和 post-checkout hook(加上 `logic-flow.json` 的 union merge 驱动程序),可自动保持提交模型的最新状态。 ## 开发 ``` uv run ruff check . uv run ruff format --check . uv run mypy uv run pytest --cov ``` 规范的 artifact 格式由 [schema/logic-flow.schema.json](schema/logic-flow.schema.json) 记录。 ## 许可证 Apache License 2.0。请参阅 [LICENSE](LICENSE)。 LogicChart 由 Ferdinando Bonsegna 创建。如果你使用、fork 或基于它进行构建, 请保持 [`NOTICE`](NOTICE) 文件完整,并附上返回此 仓库的链接以注明项目来源。
标签:AI辅助编程, JS文件枚举, SOC Prime, 云安全监控, 代码可视化, 代码理解, 可视化界面, 开发工具, 数据可视化, 日志审计, 逆向工具, 静态分析