GitHub 今日推荐|floorplan:AI 读代码自动画交互式架构地图

GitHub 今日推荐|floorplan:AI 读代码自动画交互式架构地图

一句话看懂

项目地址:github.com/haydenschmi...

floorplan 让 Claude 或 Codex 扫描代码库并生成可交互的架构地图,点击卡片查看文件、请求路径和近期修改。零依赖、Node 18+ 即可运行,内置健康检查发现五类 AI 生成代码的常见安全错误。

它解决什么问题

用 AI 写代码的开发者往往不读代码,直到出问题才回头找。传统架构图需要手动绘制,更新麻烦,很快过期。多仓库项目里前端调用后端端点时,手工追踪请求路径容易出错。

floorplan 用 AI 自动读取代码,生成交互式地图。地图按部分、文件、端点分层,点击卡片显示导入关系、HTTP 调用和最近修改原因。健康检查扫描五类常见安全配置错误:浏览器暴露密钥、Supabase 表无 RLS、Firebase 开放规则、可伪造 Stripe webhook、无认证端点。每次 AI 修改代码后更新地图,绿色高亮显示所有更改及理由。

核心概念速览

Floorplan 指代码库的可视化地图,显示部分(sections)、文件和端点。插件生成的交互式 HTML 文件就是 floorplan,可在浏览器中打开并点击探索。

Health check 指检查代码中常见安全配置错误的扫描脚本。插件运行时自动执行五类检查,识别密钥暴露、权限配置缺失等问题,并生成修复建议。检查不存储或显示密钥实际值,仅标记位置。

Blueprint 指尚未实现的系统计划图。从 PRD 或规格文档生成,在地图中用虚线标记预期架构。蓝图不是可执行代码,仅为架构预览。

Recent work 指最近修改的代码部分。地图中绿色高亮显示 AI 刚更改的卡片及原因,用于审查 AI 修改后的影响范围。

项目支持 12+ 编程语言和 20+ 框架,但主要针对 JavaScript,其他语言为 lighter support。地图服务器仅接受本机连接,生成的 floorplan 文件夹自动忽略 git 提交。

架构拆解

插件分为六个核心模块,按扫描、描述、解析、匹配、构建、展示的顺序工作。

extract.mjs 基于正则表达式提取各语言的导入、导出、路由和 HTTP 调用。针对不同语言编写独立的模式匹配逻辑。

resolve.mjs 解析导入说明符到文件系统路径或外部包名。处理相对路径、别名和 Node.js 模块解析规则。

routes.mjs 组合路由定义和挂载点,匹配前端调用与后端端点。处理嵌套路由和中间件,生成完整路径。

health.mjs 执行五类安全检查并生成修复建议。扫描代码中的密钥、权限配置和认证逻辑。

viewer.html 地图的前端交互界面主模板。渲染节点、边和层次结构,处理点击和展开逻辑。

扫描代码库文件时,scan.mjs 遍历文件并调用 extract.mjs 提取导入、路由、调用。describe.mjs 让 Claude 或 Codex 为每个文件生成纯英文描述。resolve.mjs 将导入说明符映射到实际文件。routes.mjs 连接前端调用与后端路由。build.mjs 生成节点、边和层次结构 JSON 并运行 health.mjs 安全检查。open.mjs 启动本地服务器并在浏览器中打开 viewer.html。

关键实现走读

extract.mjs 中的 extractCalls 函数从源码字面量提取 HTTP 调用和主机。

javascript 复制代码
function extractCalls(src, at, { skip } = {}) {
  const calls = [];
  const hosts = [];
  const lines = src.split('\n');
  let offset = 0;
  for (let i = 0; i < lines.length; i++) {
    const line = flattenTemplates(lines[i]);
    const lineStart = offset;
    offset += lines[i].length + 1;
    if (line.length > 500 || NAV_CONTEXT.test(line)) continue;
    if (skip && skip.test(line)) continue;
    const assigned = ASSIGN.exec(line)?.[1];
    const use = assigned ? variableUse(lines, i, assigned) : null;
    if (!HTTP_CONTEXT.test(line) && !use) continue;
    const method = (METHOD_CALL.exec(line)?.[1] || METHOD_OPT.exec(line)?.[1] || use?.method || '').toUpperCase() || null;
    for (const m of line.matchAll(STR_LITERAL)) {
      const n = normalizeCallLiteral(m[2]);
      if (!n) continue;
      const lineNo = at(lineStart);
      if (n.host && !IGNORED_HOST.test(n.host) &&!n.host.includes('${') && !n.host.includes('{')) hosts.push({ host: n.host, line: lineNo });
      if (n.path && !n.host) calls.push({ path: n.path, method, line: lineNo });
    }
  }
  return { calls, hosts };
}

做了什么: 逐行扫描源码,用正则匹配字符串字面量中的 HTTP 路径和主机名。跳过过长行和导航上下文,提取变量赋值和使用位置,识别 HTTP 方法(GET、POST 等)。过滤忽略主机和模板变量,返回调用列表和主机列表。

为什么这样写: HTTP 调用通常写在字符串字面量中,通过正则匹配比解析 AST 更快且覆盖多种写法。跟踪变量赋值和使用位置能识别 const url = '/api/users'; fetch(url) 这种间接调用。跳过过长行和导航上下文减少误报,模板变量过滤避免动态生成的路径干扰匹配。

没有它会怎样: 无法匹配前端调用与后端端点,地图只显示文件间导入关系,丢失请求追踪能力。间接调用和嵌套在中间件中的路由不会被发现。

routes.mjs 中的 resolveRoutes 函数跨文件组合嵌套路由挂载。

javascript 复制代码
export function resolveRoutes(files) {
  const mountsTo = new Map();
  for (const f of files) for (const mount of TEST_FILE.test(f.path) ? [] : f.mounts || []) {
    const t = mountTarget(f, mount);
    if (!t) continue;
    if (!mountsTo.has(t.file)) mountsTo.set(t.file, []);
    mountsTo.get(t.file).push({ from: f.path, v: t.v, prefix: mount.prefix, mw: mount.mw || [] });
  }
  const outerPrefixes = (file, v, seen = new Set()) => {
    const ms = (mountsTo.get(file) || []).filter((m) => v == null || m.v === '*' || m.v === v);
    if (!ms.length || seen.has(file)) return [''];
    const next = new Set(seen).add(file);
    const out = [];
    for (const m of ms) for (const p of m.from === file ? [''] : outerPrefixes(m.from, null, next)) out.push(joinPath(p, m.prefix));
    return [...new Set(out)];
  };

做了什么: 构建挂载关系映射表,记录每个文件被哪些文件以什么前缀挂载。递归查找外层前缀,处理嵌套挂载链,拼接完整路径。用 seen 集合防止循环引用,过滤测试文件。

为什么这样写: Express、Koa 等框架允许多层路由嵌套,app.use('/api', userRouter) 挂载后,userRouter.get('/profile') 的完整路径是 /api/profile。递归处理多层嵌套,去重避免重复路径。防止循环引用避免死循环,过滤测试文件减少干扰。

没有它会怎样: 嵌套路由只显示局部路径,前端调用 /api/users 无法匹配后端的 router.get('/users')。多仓库项目中跨仓库请求追踪失效,地图丢失核心价值。

动手上手

插件需要在 Claude Code 或 Codex 环境中安装使用。

从插件市场安装:

bash 复制代码
claude plugin marketplace add haydenschmitty/floorplan
claude plugin install floorplan@floorplan

在代码库根目录对 Claude 说:

kotlin 复制代码
Make me a floorplan of this app.

Claude 扫描代码后会在浏览器中打开地图。点击卡片查看文件细节,点击边查看导入或调用关系。健康检查结果显示在右侧面板,点击问题条目跳转到对应文件行号。

修改代码后更新地图:

sql 复制代码
Update the floorplan.

绿色高亮显示最近修改的文件和端点,Recent work 面板列出更改原因。

从 PRD 生成蓝图:

css 复制代码
I want to build an app that does X. Show me a blueprint.

Claude 生成虚线标记的计划图,显示预期架构。

应用场景

新成员加入项目时,打开地图从屏幕视图向下探索到文件和端点,快速了解代码组织和关键路径。地图质量取决于 AI 对代码的理解准确度,复杂业务逻辑可能需要人工补充说明。

AI 修改代码后审查影响范围,更新地图后 Recent work 面板高亮显示所有更改。需在 Claude Code 或 Codex 会话中使用,其他 IDE 或命令行工具不支持。

从 PRD 规划未实现系统,分享文档后请求蓝图,获得虚线标记的计划图。蓝图不是可执行代码,仅为架构预览,不能直接生成实现。

项目交付后快速生成架构图供文档或演示,地图导出为 HTML 文件可分享给团队。地图仅显示代码结构,不包含业务流程图或数据流图。

故障排查时定位特定业务流程(如 checkout)涉及的文件和调用链,点击边追踪请求路径。健康检查发现的五类问题不等同于完整安全审计,仅覆盖 AI 生成代码的常见错误。

独立分析

floorplan 适合用 AI 构建应用且不读代码的开发者。README 明确写道"For builders: understand the app you made, in your own words, without reading the code",目标用户是依赖 AI 生成代码、希望快速把握全局的开发者。区别于 Archify 在于面向理解已有应用而非绘制演示图,对比表显示 Floorplan 回答"How does the app I built actually work",Archify 回答"How do I show this clearly"。

与 Understand Anything 的区别在于粒度和场景。Understand Anything 生成函数级知识图谱,适合深入研究算法实现;Floorplan 聚焦文件和端点级地图,加跨仓库请求追踪,适合快速理解 Web 应用结构。

传统架构图工具需手动绘制,更新滞后。floorplan 由 AI 自动读取代码生成并保持更新,适合迭代频繁的项目。但生成的地图质量依赖 AI 对代码的理解准确度,复杂业务逻辑可能出现误报或漏报。

健康检查的五类问题覆盖 AI 生成代码的常见安全错误,但不等同于完整安全审计。检查不存储或显示密钥实际值,仅标记位置,适合快速发现配置错误,不能替代专业安全工具。

局限与风险

需 Claude 或 Codex API 访问权限,依赖外部 AI 服务。API 限额、网络中断或服务不可用时插件无法工作。

主要支持 JavaScript 项目,其他语言为 lighter support。Python、Go 等语言的导入解析和路由匹配可能不准确,需手动验证。

健康检查仅为检查非审计,Health 不存储或显示密钥实际值。五类问题覆盖常见配置错误,但无法发现逻辑漏洞、注入攻击或复杂权限绕过。

复杂多仓库布局可能需要额外配置。插件支持跨仓库请求追踪,但需在所有仓库中安装并手动指定关联关系。

地图质量取决于 AI 对代码的理解准确度。动态生成的路由、反射调用和复杂继承关系可能被遗漏或误判。生成的 floorplan 文件夹自动忽略 git 提交,团队成员需各自生成地图,无法共享统一版本。

结论卡片

floorplan 适合 AI 辅助编程的单体或少量关联仓库团队,需快速理解代码结构者。零依赖设计降低使用门槛,交互式地图和健康检查覆盖 AI 生成代码的常见问题。

不适合不使用 Claude/Codex、非 JavaScript 主栈、需完整安全审计的项目。其他语言支持有限,健康检查不能替代专业安全工具。

零依赖工具,适合 AI 时代快速架构可视化。当前版本 0.6.1,创建于 2026 年 10 月 27 日,Star 1716,当日新增 876。


项目地址:github.com/haydenschmi...

原文地址:tools.wflynn.cn/aitools/git...

关注公众号「YourTools」,每天推送 GitHub 趋势与开源工具速报:

相关推荐
Dovis(誓平步青云)1 小时前
拖动关键帧角色就抽动,动画编辑器怎样补齐中间状态
开发语言·前端·javascript·机器学习·编辑器
lpfasd1232 小时前
pywebview与Electron
前端·javascript·electron
行走的陀螺仪2 小时前
Claude Code 从入门到实战(一):安装、登录与第一个Vue项目
前端·javascript·vue.js
vipxieliang2 小时前
解构赋值与展开运算符:现代 JS 提效技巧
javascript
日日大王学编程2 小时前
开源Agent项目记忆设计决策对比
python·ai·langchain·开源·ai编程
2603_965896622 小时前
JavaScript 原型与原型链
开发语言·前端·javascript
晓得迷路了2 小时前
栗子前端技术周刊第 152 期 - Rspack 2.3、TypeScript 7.1 Beta、Bun 1.4.4...
前端·javascript·css
万物智能信息科技3 小时前
指纹识别传感器驱动开发—【万物智能之开源鸿蒙OpenHarmony系统实战开发系列教程】
驱动开发·华为·开源·harmonyos·鸿蒙