Back to skills
SKILL.md
Frontend Index
BSecurity给本地前端项目建「页面 ↔ 接口」双向索引(.fe-index/):改接口前查影响哪些页面,接页面任务查用到哪些接口与组件。触发:"前端索引"、"页面接口映射"、"改这个接口影响哪些页面"、"哪个页面调了这个接口"。
- 2 stars
- 0 votes
- 0 copies
- 0 views
- Added November 9, 2026
Works with
Security analysis
88/100- Accesses sensitive system or user directories
Pro scans all 3 files and shows the line behind each finding
npx -y skills add HACK-WU/skills --skill frontend-index --agent claude-codeAre you the author of Frontend Index?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/hack-wu-frontend-index)---
name: frontend-index
description: 给本地前端项目建「页面 ↔ 接口」双向索引(.fe-index/):改接口前查影响哪些页面,接页面任务查用到哪些接口与组件。触发:"前端索引"、"页面接口映射"、"改这个接口影响哪些页面"、"哪个页面调了这个接口"。
---
# 前端页面接口索引(frontend-index)
## 概述
**目的**:把「前端页面 ↔ 后端接口」的双向定位,从"每次 grep 试探 + 逐条读文件收敛"变成"查表直达 `file:line`"。后端要改接口时先知道哪些页面在调(防漏改),接页面任务时先知道它用了哪些接口与组件(省搜索)。
**功能**:
- 扫描本地前端源码,提取**路由(页面)→ 接口调用 → 定义处**的完整链路(含 `file:line` 证据)
- 产出**双向映射**:`页面 → 接口/组件` 与 `接口 → 页面(直接调用 / 间接候选)`
- **一键重建**:重建由脚本完成(零依赖),AI 只做语义标注,成本不随项目规模线性上涨
- **新鲜度闸门**:索引记录生成时的 commit,查询前比对,过期先提示重建(代码映射失效是静默的,必须显式校验)
- **证据分级**:🟢 页面自身调用 | 🟡 直接依赖 | 🔵 间接候选(深度 ≥2)| `[待确认]` 动态 URL
- **约定探测 + 声明文件**:内置主流框架约定探测,探测结果可固化为 `.fe-index/config.json`,之后重建零猜测
- 双模式:**消费模式**(查已有索引,不跑脚本)与**建造模式**(采集建库)分离
**使用场景**:
- 后端要改 / 删某个接口,需要知道"哪些前端页面会受影响"
- 接到某个页面的任务,需要知道"这个页面调了哪些接口、依赖哪些组件、在哪看代码"
- 新会话接手前端项目,需要一份"页面地图"快速建立认知
- 用户说"给前端建个索引"、"页面接口映射"、"改这个接口影响哪些页面"、"哪个页面调了这个接口"、"前端索引"时
- 之前建过索引的项目再次被问起——**先查 `.fe-index/INDEX.md` 进消费模式**,而不是重跑扫描
---
## 定位
```
本地前端源码 → frontend-index(本 skill)→ .fe-index/(页面 ↔ 接口 双向路由表)
↓
改接口前:查"接口 → 页面" → 知道要改/要回归哪些页面
接页面任务:查"页面 → 接口/组件" → 直达 file:line
```
- **输入**:本地前端工程(含路由配置或页面目录)
- **输出**:`.fe-index/`(`INDEX.md` + `{slug}/index.md` + `pages/*.md` + `apis/*.md` + `meta.json`)
- **边界**:只索引不改码;只做 HTTP 接口(GraphQL / WebSocket / RPC 不提取);索引是**派生产物**,需一键重建
### 与邻接 skill 的分工(防重叠)
| 邻接 skill | 它回答的问题 | 本 skill 回答的问题 |
|---|---|---|
| `web-index` | **外部网站**的文档该看哪一页(抓 llms.txt / sitemap) | **本地前端代码**里页面与接口怎么对应(扫源码) |
| `backend-index` | **本地后端**的「模块 ↔ 目录/入口/依赖/数据表」(扫后端源码,模块级) | **本地前端**的「页面 ↔ 接口」(扫前端源码,页面级)。两者同族同根 `.fe-index/`:跨端 join(改后端接口 → 前端哪些页面)用后端 `index.md` 的「模块 → 挂载前缀」匹配本索引 `apis/*.md` 的接口路径,口径见 `backend-index/SKILL.md` 的「被其它 skill 集成」 |
| GitNexus MCP(`impact` / `api_impact` / `context`) | 符号级影响面(需要 CLI + 已建索引) | **页面级**视角、零依赖、产物是人可读的落盘表 |
| `code-survey` | 设计前一次性调研代码现状 | 一次性调研 → **可跨会话复用的落盘资产** |
| `relation-lookup` / `strong-relation` | 人工沉淀的跨模块强关联记录 | 从源码**自动提取**的页面↔接口映射 |
| `frontend-walkthrough` | 页面体验走查(点一遍看有什么问题) | 页面与接口的**静态对应关系** |
| `frontend-api-guide` | 从 API 设计文档生成前端集成指南(设计 → 文档) | 从**已有代码**反推页面与接口关系 |
**何时不使用本 skill**:只查一个页面/一个接口的瞬时问题 → 直接 `grep`;要看符号级调用链影响面且项目已装 GitNexus → 用 GitNexus;要看后端性能 → `performance-analysis`;要重新设计页面 → `ui-designer`。
> **与项目强制规则的关系**:后端侧"改 API handler / 路由 / 对外契约前查影响面"仍按项目规则走 GitNexus(如 `rules/gitnexus-mcp-rules.md` 的强制触发表);本 skill 只补**前端页面级**那一层,**不替代、也不弱化**既有强制规则。
---
## 核心原则
1. **路由表,不是链接清单**:每条映射必须有任务视角的落点(页面 → `file:line`、接口 → 调用页面),否则等于没索引。
2. **深度即置信度**(本 skill 的诚实性根基):调用点在**页面自身**(深度 0,🟢)才是"这个页面在用";在**直接依赖**内(深度 1,🟡)是强相关;在**依赖的依赖**里(深度 ≥2,🔵)只是**间接候选**。反向表必须分开列,禁止把候选混进"调用页面数"。
3. **不臆造**:URL 必须来自源码;动态拼接 / 运行时变量无法静态求值时标 `[待确认]` 并保留原始表达式,**不猜最终路径**。
4. **新鲜度必须显式校验**:代码每天都在变,过期索引会**静默给错答案**(比没有索引更糟)。查表前先比对 commit(`--check`),过期先重建。
5. **机器提取为主,AI 只补语义**:映射关系由脚本提取(确定性、可复跑);AI 只补分区、语义列、处理 `[待确认]` 与少量抽样。页面/路由名本身自带语义,不要重读每个页面。
6. **一键重建**:重建 = 一条命令 + 一次标注。若重建成本高到不愿跑,索引必然腐化。
7. **声明文件兜底通用性**:内置约定探测覆盖主流写法;探测不到时用 `.fe-index/config.json` 显式声明(框架无关靠这层,不靠无限猜测)。
8. **可见性由集成方负责**:`.fe-index/` 是隐藏目录,本 skill **不擅自往用户的 AGENTS.md / 规则里写钩子**;被其它 skill 集成时由调用方在自身流程声明"先查 `INDEX.md`"。
---
## 产物结构
> **落点一律在【项目根】**(`git rev-parse --show-toplevel`;非 git 仓库则逐级向上找 `.git`):即 `{项目根}/.fe-index/`。
> monorepo 里 `--root` 可以给应用子目录(如 `bkmonitor/webpack`),但**索引属于整个项目**——所有应用共用一个 `.fe-index/`。
```text
{项目根}/.fe-index/
.fe-index/
├── INDEX.md # 必存在:全项目登记表(一行一应用)—— 后续会话的发现入口
├── config.json # 可选:约定声明文件(AI 在阶段 1 探测后产出、用户确认,重建零猜测)
└── {slug}/
├── index.md # 必存在:元信息 + 新鲜度状态 + 怎么用 + 分区索引 + 高频直达
├── meta.json # 必存在:机器可读元信息(commit / 范围 / 统计),--check 依据
├── pages/{分区}.md # 页面 → 路由、文件、接口、组件(≤30 页时直接放 index.md)
└── apis/{分区}.md # 接口 → 页面(直接调用 / 间接候选)、定义位置
```
**两类文件,入库策略不同**(别一锅端):
| 类别 | 文件 | 是否入库 |
|------|------|----------|
| **声明(人写,AI 探测后固化)** | `config.json` | **建议入库**——它记录"这个项目的约定",不入库则每个会话/每个协作者都要重新探测 |
| **派生产物(脚本+标注生成)** | `meta.json` / `index.md` / `pages/` / `apis/` | 默认不入库(会随代码过期,入库前请加 `.gitignore` 或按团队约定) |
**`INDEX.md` 是这个机制的生命线**:隐藏目录不会被自动发现,每次建造都必须同步更新它。
```markdown
# 索引登记表(.fe-index/)
> 涉及下列应用的问题,先查对应条目所在的分区/映射表,再看代码
| 应用 | 类型 | slug | 根目录 | 规模 | commit | 生成日期 |
|------|------|------|--------|------|--------|----------|
| monitor-pc | frontend | monitor-pc | src/monitor-pc | 页面 116 · 接口 337 | 4f2a9c1 | 2026-10-13 |
| server-ai | backend | server-ai | `/root/xpert` | 模块 125 · 表 122 | 889e265c | 2026-10-13 |
**更新纪律**:只增改本应用那一行,**不动其他行**;同一仓库前后端各占一行(slug 不同,不合并)——`backend-index` 与本 skill 共用这份登记表,列结构一致。
**「根目录」列口径**(消费方按此解析):绝对路径直用;**相对路径以 `.fe-index/` 的上一级为基准**(便于跨机器与仓库整体搬迁)。查找登记表时若 `{root}` 下没有,逐级向上找 ≤3 层。
```
### meta.json 模板(`--check` 依赖,必写)
```json
{
"slug": "monitor-pc",
"root": "/abs/path/to/repo/webpack",
"scope": "src/monitor-pc",
"commit": "4f2a9c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f6071",
"generated": "2026-10-13",
"routes": 124,
"pages": 116,
"apis": 337,
"scanner": "scan_frontend.py v1.0.0"
}
```
> `scope` 支持字符串或数组;**多个范围必须写成数组**(`["packages/**", "apps/**"]`)——拼成一个字符串会让 git 匹配不到文件,`--check` 会错报"索引可用"(静默假阴性)。
### index.md 模板
```markdown
# {应用名} 前端接口索引
> 根目录:{root} · 范围(scope):{prefix} · slug:{slug}
> 生成:2026-10-13 @ commit 4f2a9c1 · 页面 116 · 接口 337 · **需一键重建**(快照制 + 新鲜度闸门)
## 怎么用
1. 查「接口 → 页面」定位影响面(直接调用优先,间接候选仅参考)
2. 查「页面 → 接口」拿到该页面要读的文件与依赖
3. 表是快照:`--check` 报过期时重跑脚本并重新标注
## 高频直达
| 我要… | 去哪一页 | 证据 |
|-------|----------|------|
| 改 grafana 面板列表接口,看哪些页面受影响 | [apis/grafana.md](./apis/grafana.md) | `rest/v2/grafana/dashboards` |
## 分区索引
| 分区 | 文件 | 页面数 | 覆盖内容 |
|------|------|--------|----------|
| grafana | [pages/grafana.md](./pages/grafana.md) | 8 | 面板、文件夹、快照 |
```
### pages/{分区}.md 与 apis/{分区}.md 模板
```markdown
# {分区}({应用名} · 页面 {N} 个)
| 路由 | 页面文件 | 用到的接口 | 直接依赖 |
|------|----------|------------|----------|
| `/grafana` | `pages/grafana/grafana.tsx` | GET `rest/v2/grafana/dashboards` 🟢 | `components/…`(深度1) |
```
```markdown
# {分区} 接口反查({应用名} · 接口 {N} 个)
| 方法 | 接口 | 直接调用页面 | 间接候选 | 定义位置 |
|------|------|--------------|----------|----------|
| GET | `rest/v2/grafana/dashboards` | `/grafana`、`/grafana/new` | 3 个(见备注) | `monitor-api/modules/grafana.js:12` |
```
**分区规则**:页面 ≤30 个不分区(直接放 `index.md`);>30 按路由一级段 / 页面目录一级拆分;接口按 URL 首个有意义路径段。分区名以扫描输出的「分区建议」为准,不自造。
---
## 工作流
**第一步先判模式**(必做):读 `.fe-index/INDEX.md`(不存在则视为首次建库;被集成时落点以调用方指定为准,见「被其它 skill 集成」)。
| 情况 | 模式 | 路径 |
|------|------|------|
| 目标应用**已在册**,本次是来问某个接口/页面 | **消费模式** | 见下,查到就走——**不重跑扫描** |
| 未收录,或用户明确要求建 / 重建 | **建造模式** | 走阶段 0 → 阶段 5 |
### 消费模式(查表 → 读码)
1. 读 `.fe-index/INDEX.md` → 拿到 slug
2. **新鲜度闸门**(轻量校验,只比对 commit,**不产出索引**):
`python3 {skill-dir}/scripts/scan_frontend.py --root {root} --check --index .fe-index/{slug}`
- 退出码 0:新鲜(含"提交前进但扫描范围内无变化")→ 直接查
- 退出码 6:**已过期** → 告知用户并给出重建命令(**先问是否重建**,不擅自重跑)
- 退出码 7:缺 `meta.json` → 视为"无新鲜度信息",按待重建处理并告知
- 退出码 3:git 不可用或记录的 commit 不可达 → 告知用户,按"新鲜度不可判"处理(不假装新鲜)
3. 读 `.fe-index/{slug}/index.md` → 命中分区后再读对应 `pages/*.md` 或 `apis/*.md`(只读命中的那一个)
4. 用 `Read` / `grep` 打开命中行的 `file:line` 确认现状(**索引是路标,源码是事实**)
5. 没命中才现场 `grep`;确认是常用页面/接口后可手动补一行(重跑会丢失,属可接受损耗)
> **消费模式不做提取扫描**(`--check` 只比 commit,属轻量校验);查表命中即止,不"顺便重建一下"。
### 建造模式总览
```text
阶段 0:准入判断 → 该不该建?(不该建就直说,走正常 grep)
阶段 1:约定探测 → 探测路由/接口层/别名 + 生成声明文件(唯一的用户确认点)
阶段 2:脚本提取 → 一次扫描拿到 路由 / 接口定义 / 调用点 / 正反映射
阶段 3:标注落盘 → 分区 + 语义列 + 处理 [待确认](成本闸门:读文件 ≤10 个)
阶段 4:写产物 → INDEX.md + index.md + pages/* + apis/* + meta.json
阶段 5:交付 → 输出结算 + 声明后续用法与重建方式
```
### 阶段 0:准入判断(AI 自主,不必问用户)
| 信号 | 判定 |
|------|------|
| 目标应用已在 `INDEX.md` 在册 | ➡️ **转消费模式**(用户要求重建除外) |
| 只问一个页面/一个接口的一次性问题 | ❌ 不建,直接 grep |
| 代码量极小(单页 demo、<10 个页面且无路由表) | ❌ 不建,直接读文件 |
| 项目用 GitNexus 且问题只需符号级影响面 | ⚠️ 告知用户可用 GitNexus;仍要页面级映射则建 |
| 同一应用本次已出现 ≥2 次跨文件定位,或用户说"后面会反复改接口" | ✅ 建 |
| 用户主动要求"建索引" | ✅ 建(仍会在阶段 1 确认范围) |
判定不建时,一句话说明理由后回到正常查阅流程,不产出任何文件。
### 阶段 1:约定探测(**唯一的用户确认点**;阶段 4 遇到同名 slug 时另有一次覆盖重建确认)
1. **先探测**(零配置可跑):
```bash
timeout 60s python3 {skill-dir}/scripts/scan_frontend.py --root {项目根} --dump-config
```
输出:框架信号、候选路由文件、候选 pagesDirs / apiDirs、别名、工作区包名。
2. **校正并生成声明文件** `.fe-index/config.json`(探测有遗漏时手改,尤其 `apiDirs` 与 `aliases`):
```json
{
"apps": [
{
"kind": "frontend",
"slug": "monitor-pc",
"root": "/root/bk-monitor/bkmonitor/webpack",
"include": ["src/**"],
"routes": ["src/**/router/**/*.ts"],
"pagesDirs": ["src/monitor-pc/pages"],
"apiDirs": ["src/monitor-api/modules"],
"aliases": {"@page": "src/monitor-pc/pages", "@api": "src/monitor-api"},
"requestObjects": [],
"maxDepth": 2
}
]
}
```
> `config.json` 与 `backend-index` **共用**:本 skill 只认 `kind=frontend`(缺省视为 frontend),后端只认 `kind=backend`——同仓库前后端各写一条,互不选中对方。
3. **与用户确认一次**:
```text
📇 前端索引 · 范围确认
━━━━━━━━━━━━━━━━━━━━
应用:{应用名}({根目录})
产出目录:.fe-index/{slug}/
路由来源:{routes}
接口层:{apiDirs}
归属深度:{maxDepth}(0 页面自身 / 1 直接依赖 / 2 含间接候选)
请确认范围?是否需要排除某些目录(如 mock / 旧版页面)?
```
**参数选择要点**:
- `--include` 限定扫描范围(monorepo 必须给,如 `src/**`),避免扫到构建产物
- `--routes` 用 glob(`**/` 按 gitignore 语义可匹配零层目录)
- `--api-dir` 指向**接口定义所在目录**(服务层 / API 模块),它决定"符号 → URL"能否解析
- `--max-depth`:`0` 只看页面自身调用(最准最窄);`1` 加直接依赖;`2`(默认)再加间接候选
- `--alias k=v`:别名探测遗漏时补(可重复)
### 阶段 2:脚本提取
```bash
timeout 300s python3 {skill-dir}/scripts/scan_frontend.py --root {根目录} \
--include 'src/**' --routes 'src/**/router/**/*.ts' \
--api-dir src/monitor-api/modules --pages-dir src/monitor-pc/pages \
--format json --out temp/fe-index-{slug}-scan.json
```
- `--format json` 便于 AI 结构化处理;`md` 供人读、`tsv` 供管道
- 中间产物落 `temp/`(不存在则先创建),**只增不删**,完成后告知用户位置
- **Python 运行方式**:项目有 venv 按其命令;否则优先 `uv run python`;uv 不存在时不擅自安装,退回 `python3`(本脚本零依赖)
**退出码处置**(完整表见 `reference.md`):
| 码 | 含义 | 处置 |
|----|------|------|
| 0 | 成功 | 进入阶段 3 |
| 2 | 未识别到路由 / 接口约定 | 回到阶段 1 校正声明文件(显式给 `--routes` / `--api-dir` / `--alias`) |
| 3 | 环境或 IO 错误(路径不存在、git 不可用) | 报告用户,修正路径后重跑 |
| 4 | 提取结果为空 | 检查 `--include` 是否过窄、深度是否为 0 |
| 5 | 入参非法(config 不是合法 JSON、`--max` 超上限、缺 `--index`) | **修正参数后重跑**,重试同一命令没有意义 |
| 6 | `--check` 判定索引过期 | 告知用户 + 给重建命令 |
| 7 | `--check` 时 `meta.json` 缺失 | 按"无新鲜度信息"处理,建议重建 |
> **退出码非 0 不得进入阶段 3**(尤其别把失败当"没条目"处理,否则会产出一份空索引却看起来正常)。
> **截断必须处理**:输出里出现 `stats.truncated`(如 `page_apis 2024→1000`)说明撞到了 `--max` 上限——**反向表会静默少列页面/接口**。此时必须提高 `--max`(硬上限 5000)或收窄 `--include` 后重跑,不得直接进入阶段 3。
### 阶段 3:标注(本 skill 的核心增值)
对扫描结果补齐**语义层**。**成本闸门:本阶段读文件不超过 10 个**。
1. **分区**:按输出的「分区建议」拆 `pages/{分区}.md` / `apis/{分区}.md`;≤30 页不分(直接进 `index.md`)
2. **接口列**:URL 保留源码形态(`rest/v2/report/report_list/`、`/api/membership/plans/:param`);动态部分标 `[待确认]`
3. **页面列**:用页面名/路由名直接写"我要…"(如"改 grafana 面板列表 → 看 `/grafana` 页"),**不重读页面文件**
4. **组件列**:取扫描输出的「页面 → 直接依赖」(深度 1),只列有导航价值的(页面级组件 / 工具模块),不列类型文件
5. **`[待确认]` 分诊**(三类,逐条给结论,不许留在原地):
- 常量可解析(`${this.apiUrl}` 随实例变化)→ 在表内写明"前缀来自实例配置,需看运行环境"
- 动态拼接(`` `/api/${type}/list` ``)→ 拆成"模板 + 变量来源",必要时读**那一个**文件确认
- 真不确定 → 如实保留 `[待确认]`,并在交付说明里列出条数
6. **反向表**:直接调用页面(🟢🟡)内联列出;间接候选(🔵)只写条数,不展开(避免"一张表 300 个页面")
> **本阶段禁止**:为了填满表格逐页读代码;把 🔵 候选写成"调用页面";把动态 URL 猜成确定路径。
### 阶段 4:落盘
1. 检查 `{项目根}/.fe-index/{slug}/` 是否已存在:**存在则先告知用户"将整应用覆盖重建"**(快照制无增量合并),确认再写
2. 写 `meta.json`(**必须**:commit 用 `git -C {root} rev-parse HEAD`;`scope` 填扫描范围)+ `index.md` + `pages/*.md` + `apis/*.md`
3. **同步更新 `.fe-index/INDEX.md`**(新增或覆盖该应用那一行)——缺这步,后续会话发现不了这份索引
4. 写入后自检:所有 URL / `file:line` 均来自阶段 2/3 的实际产出,无凭空拼写的路径
### 阶段 5:交付
```text
✅ 前端接口索引已生成
位置:.fe-index/{slug}/ (默认隐藏目录,不入库)
应用:{应用名}({根目录})
范围:{scope} · 页面 {N} · 接口 {M} · 生成于 commit {xxx}
| 文件 | 内容 |
|------|------|
| index.md | 高频直达 + 分区索引 |
| pages/{A}.md | {A 覆盖内容}({n} 页) |
| apis/{A}.md | {A 覆盖接口}({m} 个) |
⚠️ 派生产物:代码变了要重建(一条命令)
timeout 300s python3 {skill-dir}/scripts/scan_frontend.py --root {root} --out temp/fe-index-{slug}-scan.json
重建后重跑阶段 3-4(脚本负责映射,你只需补标注)
⚠️ 新鲜度自检:python3 {skill-dir}/scripts/scan_frontend.py --root {root} --check --index .fe-index/{slug}
(0 新鲜 / 6 过期 / 7 缺 meta.json)
⚠️ 隐藏目录不会被自动发现:独立使用时需项目在 AGENTS.md / 规则里加一行
"改前端接口相关代码前,先查 .fe-index/INDEX.md"(加不加由你决定,本 skill 不代劳);
被其它 skill 集成时,钩子由调用方在其流程中声明。
后续用法:先查索引定位页面/接口,再读源码确认;索引是路标,源码是事实。
```
**抽样校验(可选,建议首次建造时做)**:随机抽 5-10 条 🟢 行回源码核对(`via` 为 `import:` 的看调用点是否有该符号调用;`inject:` 的看是否有 `this.#svc.method(`)——**抽样不通过时不要交付**,先修正声明文件重跑。拿到 A 档取证能力时(按 `use_skill("browser-evidence")` 选后端),还可实测 2-3 个高频页面,比对实际网络请求与索引条目。
---
## 反模式
- ❌ **把源码读一遍来"理解页面用途"**:映射由脚本提取,AI 只补语义列;逐页阅读会让成本爆炸且得不到更准的表
- ❌ **把间接候选写成"调用页面"**:🔵 是"经依赖链相关",不是"这个页面在用"——混写会让反向表不可信
- ❌ **动态 URL 猜成确定路径**:`/api/${type}/list` 不许写成 `/api/order/list`;拿不准就 `[待确认]`
- ❌ **不写 meta.json 就交付**:没有 commit 就无法判断新鲜度,索引会静默过期
- ❌ **过期索引照用**:`--check` 报 6 还继续查表,等于用旧代码回答新问题
- ❌ **每次提问都重跑扫描**:建造成本 > 收益;消费模式就是为省这一步存在的
- ❌ **漏更新 `.fe-index/INDEX.md`**:索引藏在隐藏目录里,没有登记表谁也找不到它
- ❌ **把多个应用塞进同一个 slug**:monorepo 里 `apm` / `monitor-pc` 混在一起,反向表会互相污染
- ❌ **只索引不重建**:写完全量索引就当一劳永逸——代码一变,索引就从资产变成负债
---
## 行为边界
- **只索引,不改码**:不修改被扫描项目的任何文件;不提交、不写 .gitignore(是否入库由用户决定)
- **快照制 + 新鲜度闸门**:不生成自动刷新计划、不做增量合并;重建 = 重跑脚本 + 重标注(脚本重建成本为秒级)
- **只做 HTTP 接口**:`fetch` / `axios` / `http.*` / 自定义 request 工厂 / `inject` 服务方法;GraphQL、WebSocket、RPC 不提取(在报告里说明"未覆盖")
- **不猜运行时**:动态 URL、feature flag 条件调用、运行时菜单驱动路由 → 标 `[待确认]`,不推断
- **不改用户环境**:不装依赖、不改配置、不注册到任何需求管理系统
- **不替代源码阅读**:索引给"去哪看",最终结论必须落到源码确认
- **与 `web-index` 分工**:`web-index` 管外部**网站**的页面路由(`.web-index/`),本 skill 管本地**前端代码**的页面↔接口(`.fe-index/`)——两者产物互不冲突,落点不同
---
## 被其它 skill 集成(调用契约 · SSOT)
需要"页面 ↔ 接口"映射的 skill 按本节判定,**不要无脑建索引**:
| 情况 | 怎么用 |
|------|--------|
| 已在 `.fe-index/INDEX.md` 在册 | **消费模式**:先 `--check` 验新鲜度 → 查表 → 读源码。**不跑扫描** |
| 未收录且会反复用(跨阶段 / 跨会话) | 建造模式(阶段 0-5),落点默认 `.fe-index/` |
| 只问一次 | 什么都不建,直接 grep |
**判定规则本身不复制**——规则改了只改本文件。已知集成点(新增时在此加一行):
| 集成方 | 建议用法 | 状态 |
|--------|----------|------|
| **`index-lookup`(统一查询入口)** | 消费方**先调它**按代码路径判定该查前端还是后端索引(读同一张 `.fe-index/INDEX.md`),再按本 skill 的查询口径查表 | **推荐接入**:不要让每个消费方自己实现"选哪端"(口径会漂移)。已接入:`code-review` / `debug` / `product-manager` / `code-survey` / `code-change-impact` / `expert-team` |
| `frontend-walkthrough` | 阶段 1「入口穷举」先查索引拿页面清单与接口;阶段 1.5 缺陷推演用 `apis/*.md` 反查页面依赖的接口,直接充当"异步源"清单 | **已接入**(阶段 1 第 1 项、阶段 1.5 第 1 步) |
| `code-review` / `code-change-impact` | 改到前端接口调用时,用反向表确认影响页面 | **已接入**(code-review 阶段 2 / code-change-impact 3.0,经 `index-lookup`) |
| `e2e-testing` | 设计端到端旅程时用页面→接口表选关键路径 | **已接入**(阶段 1 选路径与终态校验点) |
> 上表**不声明"已接入"**:本 skill 的落盘映射需要目标项目先建一次索引,集成方需自行降级(无索引时按原流程 grep)。
---
## 更多资源
- 提取规则(框架约定探测、符号解析、常量求值、barrel 穿透)、脚本完整参数与退出码、已知局限、两个真实项目实测样例 → [reference.md](reference.md)
- 确定性扫描脚本(Python 3 标准库,零依赖)→ [scripts/scan_frontend.py](scripts/scan_frontend.py)
- 单元测试(34 项,pytest):位于**仓库根 `tests/frontend_index/`**(不在本 skill 目录内,仅完整仓库中可用;约定见 `tests/README.md`)——改脚本前后各跑一次 `python3 -m pytest tests -q`
Files in this skill
- SKILL.md
- reference.md
- scripts/scan_frontend.py
Attribution
Related skills
View all in development →Comments
Loading comments…
Newsletter
Get the weekly list of safe new skills, and the ones we pulled.