





















在 AI 辅助开发成为常态的今天,一个持续出现的工程问题是:AI 缺少项目上下文。
我为此做了一个工具:files-introduction-for-ai,并把它改造成可发布的 npm CLI —— ai-file-indexer。
这篇文章会从技术实现的角度,讲清楚它的设计取舍、核心流程和工程细节。
很多团队都遇到过这些问题:
目标很明确:把“给 AI 解释项目”从一次性对话,变成可持续、可自动化的工程资产。
这个 CLI 的核心职责可以拆成三块:
package.json scripts命令入口设计为:
ai-file-indexer initai-file-indexer index --full|--incremental [--stage-output]ai-file-indexer hooks setupinit)初始化的目标是:把接入成本降到最低。
执行逻辑:
templates/ 目录复制配置模板到目标项目根目录:
.ai-indexer.config.json(索引配置).githooks/pre-commit(提交前触发索引的脚本).githooks/pre-commit 可执行(chmod 0o755)package.json,若不存在则创建一个最小骨架package.json.scripts 中补齐以下命令(若已存在则跳过):
ai:index:full:全量索引ai:index:incremental:增量索引ai:hooks:setup:设置 Git hooks 路径设计取舍:
package.json scripts 采用“upsert”而非“覆盖”,保证不破坏已有脚本index)索引是整个工具的核心,流程较长,这里拆开讲。
.ai-indexer.config.json--full:全量模式--incremental:增量模式(默认)--stage-output:将索引产物自动加入暂存区根据模式选择文件来源:
git ls-files,获取所有被 git 跟踪的文件git diff --cached --name-only --diff-filter=ACMR,获取当前 staged 的变更文件过滤逻辑:
includeExtensions 白名单中excludeGlobs 中的任意排除规则(如 node_modules/、dist/)设计取舍:
git ls-files 而非文件系统遍历,避免扫描到未被跟踪的临时文件对每个目标文件,提取以下信息:
function\s+([a-zA-Z_$][\w$]*)\s*\(、const\s+([a-zA-Z_$][\w$]*)\s*=\s*\([^)]*\)\s*=> 等^def\s+([a-zA-Z_][\w]*)\s*\((public|protected|private)?\s*(static\s+)?[\w<>\[\]]+\s+([a-zA-Z_][\w]*)\s*\([^)]*\)\s*\{func\s+(\([^)]+\)\s+)?([A-Za-z_][\w]*)\s*\(import\s+.+?from\s+['\"]([^'\"]+)['\"]、require\(['\"]([^'\"]+)['\"]\)^import\s+([\w.]+)、^from\s+([\w.]+)\s+import\s+import\s+"([^"]+)"、import\s*\(([^)]+)\)^import\s+([\w.*]+);设计取舍:
调用大模型生成结构化摘要:
QWEN_API_KEY(若未设置则走兜底逻辑)maxFileCharsForLlm 字符(默认 8000),控制 token 成本summary:1-3 句,描述文件整体职责purpose:一句话描述业务功能methodNotes:数组,按函数名给出简短说明(每项 ≤ 40 字)baseUrl 和 model)设计取舍:
对每个文件,生成一条记录:
{
"path": "src/index.js",
"language": "JavaScript",
"summary": "...",
"purpose": "...",
"functions": ["init", "runIndexer"],
"methodNotes": ["init: 初始化配置", "runIndexer: 执行索引"],
"dependencies": ["fs", "path"]
}
然后生成两层索引:
file-index.json 和 file-index.mdmodule-index.json 和 module-index.md设计取舍:
若指定 --stage-output,调用 git add 将所有索引产物加入暂存区。
设计取舍:
hooks setup)设置 Git 使用 .githooks 目录作为 hooks 路径:
git rev-parse --is-inside-work-tree).githooks/pre-commit 是否存在git config core.hooksPath .githooks设计取舍:
.githooks 而非 .git/hooks,原因:
.githooks 可以被 git 跟踪,便于团队共享.ai-indexer.config.json 的核心字段:
includeExtensions:纳入索引的文件类型excludeGlobs:忽略目录(如 node_modules、dist)outputDir:索引产物输出目录(默认 .ai/)jsonOutput、mdOutput、moduleMdOutput、moduleJsonOutput:各类输出文件名llm.provider、llm.baseUrl、llm.model:LLM 配置maxFileCharsForLlm:控制输入 token 成本设计取舍:
从“脚本”升级为“CLI”的核心收益:
当前实现的一些已知限制:
后续迭代方向:
@babel/parser、esprima)提升抽取准确性ai-file-indexer 本质上是在做一件事:
把“给 AI 解释项目”从一次性对话,变成可持续、可自动化的工程资产。
从技术角度看,它是一个典型的“工程化工具”:通过配置化、模块化、可扩展的设计,把一个重复性动作标准化,并集成到现有开发流程中。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。