@c4a/extract

中文文档
0.7.95发布于 2026/11/09MITTypeScriptES Module构建来源已验证近 30 天下载 5439

语言插件框架和上下文代码证据存储器运行程序

中文使用文档
文档目录9 节
  1. 在知识生产链中的职责
  2. 协议层
  3. 1. 语言插件协议
  4. 2. ExtractionResult v2
  5. 3. Repository Runner
  6. 4. 原始代码快照
  7. 编写新的语言插件
  8. 与 Code Indexer 的关系
  9. 开发

@c4a/extract

English

@c4a/extract 将代码仓库结构转化为 Context 知识工作流可以审核和解释的确定性 证据。它负责语言插件协议、仓库 Runner、原始代码快照契约、digest 生成和共用的 Tree-sitter 解析工具。

它不判断代码对产品或读者意味着什么,也不写入正式知识。语言插件只输出结构事实; Code Indexer Provider 将这些事实组织成当前 Indexer Result;Context 负责来源身份、 Candidate 状态和审核通过的知识。

在知识生产链中的职责

已确认的仓库边界
       ↓
语言插件 + Repository Runner
       ↓
版本化原始代码快照
       ↓
Indexer 事实 → 面向读者的 Candidate → 正式知识
  • 语言 package 实现 ExtractionPlugin 并返回 ExtractionResult v2。
  • Runner 加载一个或多个插件,扫描仓库模块,输出 progress、module-error 和 summary 事件,并可生成底层代码快照。
  • 选中的 Code Indexer Provider 通过受控 workset 调用 Runner。
  • Candidate 和运行快照留在 .tmp/context-runtime/;只有 Review apply/close 会写入正式 Markdown。

知识工作区用户通常通过已安装的 Agent 入口和选中的 Code Indexer Provider 使用 本包,不需要手工构造 Runner 输入。下面的协议主要面向解析器作者、Provider 作者 和 Context 维护者。

依赖: @c4a/core、web-tree-sitter、zod

协议层

1. 语言插件协议

语言 package 实现 protocol.ts 中的 ExtractionPlugin:

interface ExtractionPlugin {
  id: string;
  languages: string[];
  packageManagers: string[];
  manifestTypes?: ManifestInfo["type"][];
  canHandle(source: SourceInfo): boolean;
  detectEntries(manifest: ManifestInfo, fs: FileSystem): Promise<EntryDetectionResult>;
  extractSymbols(entries: EntryFile[], fs: FileSystem): Promise<ExtractionResult>;
  detectPatterns?(fs: FileSystem): Promise<PatternDetectionResult>;
}

关键约束:

  • 插件通过 FileSystem 读取,不直接访问 node:fs;
  • manifestTypes 声明哪些 manifest 可以传给 detectEntries();一个模块包含多种 manifest 时必须显式声明;
  • detectEntries() 返回稳定的 package 身份、类型、语言、可选版本和入口文件;
  • extractSymbols() 返回带稳定符号和关系的 ExtractionResult v2;
  • detectEntries() 先于 extractSymbols() 调用,插件可以在两步之间保留本次检测 的 package 上下文。

Indexer 执行通过 extractionResultToEvidenceAdapterResult() 将 coverage 完整的 ExtractionResult 转成 context.indexer.evidence-adapter-result/v1。调用方传入已解析的 package/export/version/digest、授权 source/module scope、input digest、precedence 和 owner role。 缺少逐文件 coverage 时转换直接失败;轻量或 enricher 输出不能贡献 file、LOC、symbol 或 protocol denominator。

2. ExtractionResult v2

每个插件返回:

{
  version: "2",
  meta: { extractedAt, pluginId, commitHash, language },
  package: { name, kind, language, version? },
  files: [{ path, language, lines }],
  symbols: SymbolInfo[],
  relations: RelationInfo[],
  coverage: {
    tier,
    capabilities,
    files: [{ path, disposition, diagnosticCodes }],
    diagnostics
  },
  stats: { files, lines, exportedSymbols, internalSymbols, relations }
}

SymbolInfo 保存符号身份、可见性、文件与行范围、成员、参数、返回类型、继承、 实现、Props、联合值和源码文档。RelationInfo 可以表达 imports、 imports_type、calls、extends、implements、param_type、 return_type、of_type、depends_on 和 contains 等结构关系。

3. Repository Runner

包暴露底层 NDJSON Runner c4a-extract-code。Code Indexer Provider 可以把它作为 实现细节调用;Agent 不应手工生成 stdin Payload。

Runner 输出一行一个 JSON 对象:

  • { "type": "progress", "phase": "scanning|parsing|uploading", ... }
  • { "type": "module_error", ... }
  • { "type": "summary", "extraction": ..., "snapshot": ... }
  • { "type": "error", "code": "runner-failed", "message": "..." }

Runner 不直接写 Context 工作区。它在 summary 中返回快照文件,由 Context runtime 校验后原子写入。

4. 原始代码快照

启用 snapshot 输入后,Runner 生成:

文件用途
source.yaml代码来源 manifest
manifest.json契约版本、工具链、数量、hash 和 dirty 状态
_meta.yaml兼容元数据和输入摘要
digests.jsonl每个模块的版本化 digest
source-files.jsonl来源到模块和 digest 的映射
packages.jsonlpackage 身份、类型、语言、模块路径和可选版本
symbols.jsonl扁平符号行,保留 package 和 module 字段
edges.jsonl带 package、module、version 和 hash 的代码关系

Context runtime 在投影前校验快照契约。正式代码知识中的 Section 使用由这些索引 派生的 source_ref,例如:

src-N#package:<package>@<hash>
src-N#symbol:<file>:<symbol>:<kind>@<hash>

Agent 将完整 source_ref 当作不透明 token 复制,不自行解析或改写。

编写新的语言插件

创建类似 @c4a/extract-python 的 package 并导出 ExtractionPlugin。至少需要:

  1. 识别语言 manifest;
  2. 返回稳定 package 名、类型、语言和可用版本;
  3. 一个 manifest 表达嵌套布局时返回 subPackages;
  4. 解析公开入口,以区分 exported 和 internal 符号;
  5. 输出稳定的符号名、kind、visibility、文件和行范围;
  6. 输出导入、调用、类型、继承或使用关系;
  7. 插件内部保持 module-relative 路径,由 Runner 加上 repo-relative 前缀;
  8. 在 Code Indexer Provider 的 Runner 配置中注册插件。

与 Code Indexer 的关系

@c4a/extract 位于 Code Indexer Provider 上游,不渲染正式知识。典型流程是:

  1. 用户确认代码来源边界;
  2. src/indexers.yaml 将来源范围和读者需求绑定到 Code Indexer Provider;
  3. 当前 Route 准备受控 workset,Provider 返回当前 Indexer Result;
  4. Context 生成待审 Candidate 和可恢复运行态;
  5. review apply 将批准内容写入正式知识;
  6. close、verify 和 build 完成本轮并生成知识包。

因此,更好的符号和关系会产生更可靠的 Candidate、来源引用和知识包,但业务分类继续由 Agent 与用户依据证据决定。

开发

bun run --filter @c4a/extract build
bun run --filter @c4a/extract typecheck
bun run --filter @c4a/extract test
bun run --filter @c4a/extract lint

版本与发布记录

@c4a/extract 共发布 112 个版本,首次发布于 2026/05/13;过去 12 个月发布了 112 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
0.7.95latest2026/11/09今天
0.7.942026/11/08今天
0.7.932026/11/08今天
0.7.922026/11/071 天前
0.7.912026/11/026 天前
0.7.902026/10/2811 天前

其他发布通道:alpha → 0.7.10-alpha.2,beta → 0.7.14-beta.1。

关于 @c4a/extract 的常见问题

@c4a/extract 是什么?

语言插件框架和上下文代码证据存储器运行程序

如何安装 @c4a/extract?

在项目目录运行 npm install @c4a/extract,或使用 pnpm add / yarn add / bun add。它还提供命令行工具 c4a-extract-code,可以用 npx c4a-extract-code 直接运行。

@c4a/extract 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@c4a/extract 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@c4a/extract 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=20。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@c4a/extract 可以商用吗?

@c4a/extract 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@c4a/extract 的下载量有多少?

根据 npm 官方下载统计,@c4a/extract 在 2026/10/09 – 2026/11/07 这 30 天内被下载 5,439 次,日均约 181 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@c4a/extract 还在维护吗?

最新版本 0.7.95 发布于 2026/11/09(今天);至今共发布 112 个版本,其中过去 12 个月发布了 112 个;首次发布于 2026/05/13。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。