CLAUDE.md@packages/context-cli · git:20261003.5165706 · 2026-10-03 · sha256 2d77df535e2a9539

CLAUDE.md@packages/context-cli git:20261003.5165706A

Immutable. This exact content never changes and is served at /api/v1/blob/2d77df535e2a9539.

# @c4a/context-cli

`@c4a/context-cli` 同时提供本地 `context` CLI 和 `context` plugin。本文件是包级开发准则;通用规则见仓库根 `CLAUDE.md`,开发与发布步骤见 `DEVELOPMENT.md`。

## 设计原则(一切决策的最高优先级)

原则分两层、同等优先级、任何 PR 同时过:

- **编码原则**讲“代码该怎么写” — 命名、抽象、fallback、协议收口、心智复杂度。
- **工作流与协议原则**讲“协议该长成什么样” — CLI vs Agent 职责、自愈、错误恢复、view 预算、序锁。

### 编码原则

- **不拟合数据**:不要把 fixture / 单条 case / 当前实测样本的形态当成 API 协议。决策依据是“长期类型 / 类别上的合理性”,不是“这次跑出来什么字段就把字段固化”。
- **长期合理**:选择能在未来 6-12 个月内仍然成立的设计,哪怕实现成本更高。今天省的 1 小时往往换 3 个版本之后的 1 周返工。
- **只维护当前协议**:移除明确退场的字段和流程;已发布接口的变更须评估消费者和迁移路径,不假定没有外部使用者。
- **一步到位**:发现问题就找根因改根因;不要“先打补丁、回头再说”。补丁会变成下一次审查的债务,且 99% 不会“回头”。
- **不要苟且于低成本方案**:低成本方案 ≠ 正确方案。“加一行 if 绕过这个 case”、“在 helper 外面再包一层兜底”、“先 grep 切一下” 都是典型反例。**真正的低成本是不重复修同一个问题**。
- **面向 Agent DX 友好**:默认输出 / 错误信息 / hint / 命令命名 / 参数语义,第一受众是 LLM agent,第二才是人类开发者。判断标准:**一个全新 agent 拿到这个输出,能不能在零外部上下文下做出正确的下一步动作**?做不到就回去改设计。
- **心智低是第一要务**:
  - 同义字段不要起多个名字(`sourceId` / `source_id` / `sourceID` 三选一,全仓一致)。
  - 同类命令不要有两个入口(`workspace write` 和 `compile draft --input` 干同一件事就废一个)。
  - 同一个概念不要在两个 view 里换形态。
  - 错误必须**显式说怎么修**,不能只说“出错了”。
  - 默认值是 agent 最常需要的形态,不是实现最简单的形态。

### 工作流与协议原则

- **CLI 负责流程,Agent 负责语义**:CLI 承担当前工作流、来源授权、安全写入和恢复;Agent 阅读材料、选择实际引用、规划和写作。生产侧事实账本、主体分类与挂载矩阵不再作为新实现的强制义务;不能以机械可判定为由继续增加内容门禁。
- **硬约束优先于提示词**:同一条规则不要在 skill checklist 和 CLI validate 里写两遍。能用 CLI hard gate / typed diagnostic 表达的全部下沉;skill 只保留入口说明、evidence boundary 和 next_action 跟随契约。
- **正文内容不由 CLI 评分或拦截**:措辞、JSX、模板语法示例、注释、标题、占位词、句式和篇幅不构成内容质量硬门禁。未填写的占位可在现有审核中提醒,但不硬阻塞、不要求信号消除回执。内容判断归 Agent/用户,CLI 只检查结构、真实引用和安全写入;模板程序解析与正文判断分开。
- **能自愈就自愈,该阻塞才阻塞**:不改变语义、可机械验证、可审计的修复直接自动应用并记录到 `auto_repaired[]`;需要语义判断、用户确认、可能改变知识内容时才返回 blocking question / review。
- **错误输出就是恢复入口**:任何拒绝必须带 typed `reason_code` + 最小诊断 + canonical `next_action.command` + `input_schema`。Agent 不从历史 prompt 反推下一步,stdout 里看到的就是修复路径。不允许 “出错了请重新读 skill” 这种 dead-end。
- **保持必要的安全边界**:验证实际引用的来源权限、区域定位、输入版本和写入冲突;不把字段存在或指纹一致当作语义正确的证明。退场的 facts/证据 ID/主体矩阵不能以另一组字段或隐藏规则重新引入。规划覆盖义务独立审查,不因事实账本退场而静默删除。
- **弱模型友好 ≠ prompt 膨胀**:弱指令遵循模型踩的机械错误(context_only 误用、summary 噪音、advisory 当 blocking、source_ref 拼写错误)应转化为 CLI envelope、typed diagnostic、safe default 和 patch-ready payload;不要继续往 skill 里塞 checklist / 陷阱表。
- **串行写入,并行读取**:提交结果、review apply、close、build 等写路径保持串行锁;只读材料按当前 Route 的授权范围读取。并行 Agent 不直接并发提交共享状态,由协调者统一提交,不能用 shell 循环并发写入。

### 反例 → 正例 对照

| 反模式(不要做) | 正例(应该做) |
|---|---|
| “blocks view 一次性吐 71 个 block,agent grep 切一下就行” | blocks view 默认 summary(by_heading + by_window),filter 后再展开详情 |
| “保留 `versionPolicy` 字段做别名,同时输出 `version_policy`” | 直接切 snake_case,别名彻底去掉 |
| “agent 再 finalize 一次会创建新 workflow 但 input_digests 为空——反正它会自己 abandon” | finalize on already-finalized workflow 显式 reject,hint 里给 abandon 命令 |
| “warning hint 里 `command` 放不可执行的 schema lookup,让 agent 自己找下一步” | `command` 必须是 agent 可以**直接执行**的下一步动作命令 |
| “skill checklist 写一遍 + CLI validate 写一遍,双保险” | 规则只在 CLI validate 里强制,skill 只引用 next_action |
| “weak-support 在 review 接受,在 apply 重新判一遍” | review 是 canonical gate,apply 用 ready artifact 直接执行,不二审 |
| “错误输出说 ‘invalid input’,让 agent 再 grep schema” | 错误带 `reason_code` + `valid_kinds` + canonical `next_action.command` |

任何 PR 走 fallback / 别名 / 双入口 / 把可机械判定规则丢回 skill,reviewer 必须问“长期形态是什么?为什么不一步到位?为什么不下沉到 CLI guard?”,回答不上来就回炉。

## 核心边界

- CLI 做机械事务:workspace 定位、文件 I/O、source registry/snapshot、文章与片段定位、package index、verify、approved structure projection、build inventory。
- Agent 做综合判断:来源选择、规划、写作、语义支持与冲突判断、用户问题翻译。
- CLI 不调用 LLM;Agent 不手写 `knowledge/` markdown。
- `sources/` / `knowledge/` / `dist/` / `.tmp/context-runtime/` 只能由当前 CLI 命令维护,不能用通用 workspace write 绕过协议。任务文件在成功交付后按工作区准备指引清理,不在 close 后立即清空。

## 工作流入口

| Slash command | Skill 链 | CLI 辅助 | 写入边界 |
|---|---|---|---|
| `/c4a:context` | thin Context shell | 运行 `context entry --format json`,按返回动作初始化、进入工作区或消费 `workflow.current` | 单一对话入口;入口解析器只处理 workspace bootstrap,底层 Graph 选择生命周期路线。 |
| `/c4a:context-plan` | 独立项目调研与分轮规划 Skill | 按需调用来源获取与导入工具 | 维护 Git 根目录 PLAN,单轮交接给既有生产工作流;不维护第二套 Graph、不增加 PLAN 格式或规模 CLI 门禁。 |

改 project workflow 协议时,同步更新 `context-workflow/` Provider、CLI
adapter、对应 plugin shell、SDK 手册和 Graph tests,并运行 `bun run build`
重新生成唯一 Provider Bundle 与 `dist/plugins`。

### V1 Agent 入口与写入契约

- 生产工作流入口是 `/c4a:context`;独立只读查询与来源归因入口是显式触发的 `/c4a:context-inspect-search`,不消费生产 Route 的写动作。不要为初始化或 `source` / `run` / `review` / `build` / `verify` / `status` 增加第二个公开 slash command 或 public skill。
- `context-plan` 是独立的项目调研、来源批量更新分析与分轮协调入口,不是 CLI primitive 的公开别名。规模分流、计划阅读批准、阶段交接与 PLAN 收尾由 Skill 负责;单轮生产继续由当前 Graph、Route 和既有门禁负责。
- `/c4a:context` 是对话式入口,不是同名 CLI primitive。它先运行只读 `context entry --format json`,只执行返回的 `next_action.command`;工作区就绪后把 `workflow.current` 当作当前步骤权威,完整读取 required 资源,并原样执行 Route 返回的命令。**不要新增或调用 `context continue`**。
- 用户在当前会话明确授权全托管后,优先执行 Route 返回的连续命令,保留其中的阅读回执等参数,不自行拼裸循环。连续执行仅推进唯一、immediate、非 read 命令,每步重新求值;遇到语义读取、配置、权限缺口或多命令时返回当前 Route。
- 普通模式与全托管模式复用同一 Gate,并完整保留普通模式的 Inspection 与 Resolution 能力。只在 Graph Gate 的 `delegated` 策略中声明全托管可跳过的冗余 inspection、可替换的对话 Resource,以及需要时由 authority 选择的专用 Resolution Action;不要在 Facts、TypeScript 或入口提示词中把 Authority 伪装成已完成业务事实。普通模式在工作区创建后和来源采集完成后通过 Route-selected dialogue 说明模式差异。
- Agent 不得只复述 Route 的机械命令。`availability=immediate` 时读取 required 资源后执行;`gate` 未解析时读取已提供的预览并向用户解释决定;`configuration` 存在时只修改指定项目文件。动作返回 workspace Route 后直接继续,只有配置修改或缺少 Route 才重新 status;phase-local `next_action` 不得替代 workspace Route。普通模式也允许 `run --until blocked-or-complete` 执行机械步骤,但不隐式取得 managed 权限。Review 明确批准后沿同一 Graph 自动收尾,遇到未授权的 Gate 或 Agent 内容任务仍停下。
- `missing-source` 不是自动探索信号。不要根据 cwd、父目录、monorepo 结构、package 名、`git remote` 自行决定 source;用户明确给出 source 名称/路径/ref 后,才运行 `context source add repo ...`。
- `needs-extract-phase` 表示 extract phase 尚未声明。不要扫描源仓库来替用户选 include/exclude;先问用户要摄取哪个已登记 source、哪些目录/包/符号范围,再按 `workflow.current.configuration` 编辑 `src/index.ts`。
- 底层 CLI 命令可以保留,但只作为 `/c4a:context` 驱动的机械动作。默认用户不需要知道命令清单。
- `context init` 生成的 workspace `AGENTS.md` 只放项目边界、SDK 手册位置、CLI-only workspace 规则,不承载长流程 prompt。

### Knowledge / OKF Profile

- Approved Markdown 头部维护 `title`、`type`、`description`、`timestamp`,按需保留真实 `resource` 和阅读标签。正文保留稳定片段 ID;文章身份、路径、知识分类、可见性和片段来源区域仅在 `knowledge/structure.yaml` 的 `articles` 中维护。导出由结构引用生成读者溯源,不能要求 Agent 再维护一份来源列表。构建清单记录发布路径到批准文章的映射,不得改写 `knowledge/`。
- PART1 重构不再要求 prose/structure knowledge 提取独立主体、填写 node_type 或主体 tags;文章知识分类仍保留,不以主体分类推导。
- Markdown 不写 `article_id`、`sources`、`source_refs`、`visibility` 或 `code_symbols`;片段标记为 `<!-- context:section id="..." -->` 和对应结束标记,不附证据属性。
- 实际引用由 `source_ref`、区域 `locator` 与工具计算的 `content_digest` 表达;每个输出片段最多 3 个位置,不是章节或文章的总上限。不维护独立事实/证据 ID 或逐绑定指纹。
- 当前 Indexer approved Markdown 不保存 `candidate_fingerprint`、Indexer digest 或 `code_origin`;
  current/stale 由本机 runtime 与批准页面的实际正文、来源共同判定。
- 不写 `schema` 字段。协议版本由工具/文档和 verify 约束,不是 approved MD 的 frontmatter 字段。
- `timestamp` 是内容或状态账本实际变化时间,不是 build/run 时间;无变化重跑不得刷新。
- kb package 根目录可以包含 `AGENTS.md` 和 `skills/`;OKF-compatible interchange surface 是 `dist/<name>/wikis/`、`guides/`、`rules/`、`feats/` 子树。默认模板必须包含可编辑的 `src/package-templates/kb/wikis/index.md`,并在生成的 workspace `AGENTS.md` 中提醒用户可定制该入口页。
- package templates 使用 Handlebars 渲染。默认 `wikis/index.md` 应利用 `knowledgeGroups`、`knowledgeItems`、`knowledgeTree` 等变量生成可导航的入口页;模板说明用 Handlebars 注释或 `context:template` HTML 注释,build 输出不得保留这些说明。
- `context build` / `context status` 必须把 kb 模板缺 `wikis/index.md`、模板渲染路径覆盖 copied knowledge 路径这类问题当成 workspace-state-invalid,不能让模板文件静默覆盖知识页。
- KB package 的 `wikis/`、`guides/`、`rules/`、`feats/` 是最终扁平根,不在根内重复 package name。旧工作区的 `distribution.knowledgeNamespace` 仅作为兼容输入读取,不影响输出路径或构建指纹。`skills/**/*.md` 模板优先使用 `{{wikisRoot}}` / `{{guidesRoot}}` / `{{rulesRoot}}` / `{{featsRoot}}`,以便引用随根目录契约统一变化。

### Agent 对话语言

- `plugin/commands/*.md` 和 SDK Agent guide 必须明确:Agent 面向用户的解释、提问、确认和总结使用**用户当前对话语言**。
- CLI 命令、flags、路径、package/source/phase/candidate id、status enum、JSONL payload key、`source_ref` 等协议文本保持英文/原样,不得翻译。
- CLI 默认 text 输出可以继续使用英文稳定标签,但 slash command / skill 不应把英文 stdout 大段原样转发给用户;应读取 stdout 作为证据,再用用户语言说明状态和下一步。
- shipped docs 本身可以是英文,但其中的英文句子是语义模板,不是中文对话里要逐字复制的用户回复。

### Agent 对话 UX(必须遵守)

面向用户的提问不是参数收集表。每个 human gate 必须先解释“用户正在做什么决策、这个决策影响什么、有哪些常见选择”,再给必要的命令或实现细节。禁止用内部 API / 配置项 / 默认值作为开场问题。

必须遵守:

- **有限选项必须用 askUser 形态**。当 human gate 是明确的二选一或少量选项(如“按原文档生成草稿” vs “语义整理候选”、“Agent 知识包” vs “LLM 文本包”、“创建替换候选” vs “确认现有内容仍有效”)时,优先使用宿主原生多选工具:Claude Code `AskUserQuestion`、Codex 当前暴露的 user-input 工具(例如 `request_user_input`)、Cursor Plan Mode `AskQuestion`;不可用时才退回 Markdown `A/B/C` 选项。每个选项必须带一句影响说明,不要只发自由文本问题让用户猜有哪些分支。选项标签必须是用户能理解的语义,不要用 SDK API 名作为选项;API 名只在用户要求实现细节、编辑 `src/index.ts` 总结或精确命令说明中出现。
- **先讲产品语义,后讲实现细节**。例如先说“选择知识来源边界会影响 `knowledge/` 目录、`source_ref` 前缀和 `dist/<name>-kb` 这类包名”,再说需要登记 repo source;不要先问“source name 是什么”。monorepo/subspace 场景中,日期只组织 source 批次并进入 phase id/source_ref;稳定知识路径使用模块名,如 `knowledge/codeindex/<module>/...`,因此抽取前仍要确认具体 package/subdirectory 边界。
- **避免裸露内部协议名**。Provider handler、phase id、payload schema 等只在代码修改总结、精确命令、或用户要求细节时出现。默认对话应说“读取已登记来源并生成待审知识;审阅通过后才写入 `knowledge/`”。
- **每个确认问题都要说明影响面**。source 边界影响输出路径和引用前缀;抽取范围影响哪些文件/符号会进入草稿;review 影响哪些候选会变成 approved Markdown;package 选择影响 `dist/` 输出结构和 Agent 消费方式。
- **不要把 CLI placeholder 原样转成用户问题**。看到 `<name>` / `<repo-or-subdir>` / `<phase-id>` / `<collection>` 时,先翻译成用户决策,并给 1-2 个基于当前上下文的候选示例。只有用户确认后才执行命令。
- **不要把“默认范围”讲成黑盒**。默认提取必须解释为具体范围:选定 source 内的 `src/**/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}`、导出符号、draft candidates、先 dry-run 展示数量和 `knowledgeTree`,再真实抽取。
- **不要替用户做语义决策**。可以执行安全机械命令;不能自行决定 source 边界、抽取 include/exclude、review approve/reject、package 类型、远程 clone/checkout。
- **输出要短,但不能省掉决策含义**。报告格式优先是:已完成什么、当前状态、下一步需要用户决定什么、该决定的影响。

Human-gate 话术的权威来源是当前 Provider Graph 选中的
`context-workflow/resources/dialogue/*.md`;SDK
`node_modules/@c4a/context/docs/guides/agent-dialogue.md` 只介绍稳定原则和发现方式。
修改门禁语义时必须更新 Graph 资源引用、可达性测试和必要的 SDK 概览。

### 当前生产覆盖进度

- 按 Route 发放的阶段和批次目录工作,读取当前任务说明及文件提交 schema;
  协调者通过 `context action complete-current` 提交已完成子集,不并发写共享状态。
- 完成以当前任务接收和阶段范围结算为准,不要求 Partition 逐成员账本、
  Provider 主生产者绑定或技能版本/摘要核对。首篇完成不代表其余任务完成。
- 重复或无读者价值的材料可以由 Agent 判断排除;明确排除保存到长期需求,
  候选、计划和接收记录仅在 `.tmp`。清理临时区后全新生产,不兼容旧过程。

### 命名边界(必须遵守)

- **生产 Slash command**:`/c4a:context`。另有显式查询 `context-inspect-search` 与定制技能 `context-indexer-create`,不作为第二个生产入口。
- **CLI primitive**:`context <subcommand> ...`(如 `context status`,
  `context run ...`, `context close`)。Slash command / skill 内部调用。
- **Cursor command entry**:全局命令名 `c4a-context`,由 `build:plugin` 从根级 Context Skill 生成到 `dist/plugins/cursor/commands/`。
- **Public skill — Codex**(plugin namespace via `.codex-plugin/plugin.json`):裸 slug `context`,由 plugin namespace 暴露为 `c4a:context`。源 `dist/plugins/codex/skills/context/`,frontmatter `name: context`。
- **Standalone Provider skills**:`context-code-indexer` 与 `context-markdown-indexer` 由同一根级 source 直接投影,不获得 plugin namespace,只能经 Indexer lifecycle 激活。
- 不发布生命周期阶段型 Skill。来源、采集、对齐、编译、审核和构建能力由 `workflow.current.resources` 动态选择;宿主入口始终由根级 `skills/context/SKILL.md` 生成。
- 禁止把底层 CLI primitive 写成公开 Agent 命令,例如 `/context:source`、`/context:run`、`/context:review`、`/context:build`、`/context:verify`、`/context:status`。描述时写“continue will run `context status` and may call `context run ...`”。
- **Workflow resource** 是当前 Route 选择的文件或 Context View,不是 Skill 之间的静态引用。Agent 只消费 `workflow.current.resources.required/recommended` 返回的 `path` 或 `command`,不拼接插件安装路径。

## CLI 输出协议

成功 / no-op 摘要统一用 `formatFeedback(block)`:

```text
<symbol> <action> <subject>: <headline>
  <quantified body line>
  <key params echoed>
  next: <hint>
```

- `<symbol>`:`✓` 成功 / `·` no-op / `⚠` 部分成功 / `✗` 失败。
- 副作用必须量化,关键参数要回显。
- `next:` 仅用于普通命令的人类可读反馈,不是 workspace 路由协议。Project workflow 的唯一推进依据是 `context status` 返回的 `workflow.current.commands`、`configuration`、`gate` 和 `resources`;无法推进时必须给出结构化 reason/diagnostic code。
- payload-style 输出(`compile context` / `extract` / `mdrive *`)保持纯 JSON/YAML/text,不包 feedback wrapper。

### 错误抛出边界

- **必须用 `ContextError`**:命令入口校验(`commands/*.ts` / `cli.ts`)、`project/` 中的 source/run/review/close/build/verify 业务校验、`lib/` 中的用户输入解析。这些失败需要 exit code(`UserError` / `WorkspaceStateError` / `ExternalToolError` / `UserAbort`)+ `ErrorCategory` 让 `handleCliFailure` 统一渲染。
- **可保留 plain `Error`**:内部不变量 / unreachable 断言、parser 内部 invariant、`__tests__/` 测试代码、纯私有工具函数。
- 判断标准:用户跑出这个错时是否需要看到 exit code + 分类提示 + 可操作下一步?需要就转,不需要就别动。不要为了“统计纯净”机械迁移。

### Schema 输出格式

`--schema` 是 agent 和用户发现输入契约的统一入口,所有 schema discovery 命令支持同一组格式:

- `--format text`:默认人类可读,内容用 YAML 形态展示。
- `--format yaml`:显式 YAML,用于 agent draft/review 减少格式转换。
- `--format json`:机器消费,pretty JSON。

实现规则:

- schema command 用共享 `schemaOutputFormat()` / `writeSchemaOutput()`,不在各 command 里手写 `format === "json" ? ... : YAML.stringify(...)`。
- 不支持的 format 错误必须写出 `expected text, json, or yaml`。
- 普通 command 输出格式面不能因 schema 支持 YAML 而扩大;先分流 `--schema`,再对业务 action 走 `outputFormat()`。
- schema 输出属于 payload-style,不包 `formatFeedback()`、不打印 `next:`、不混散文。
- 新增 schema command 同步补测试:至少覆盖 `--format yaml` 可用、非法 format 错误信息。

### Feedback Body 渲染

`formatFeedback({ body })` 走 `text` 输出时 body 给 LLM 转述 + terminal 用户直读双消费。**body 用 markdown 渲染**,不用 `key=val, key=val` dump 风格。JSON `--format json` 路径不动 — 那是机器契约。

block 标题用 `**Label**:` 或 `**Label** (meta):`,统一英文(中文标签是 shipped doc 禁忌):

- `**Outputs**:` / `**Notes**:` / `**Hints**:` / `**Warnings**:`
- `**Actions** (3 total):` / `**Coverage warnings** (progress signal — address before review/apply):`

格式细节:

- 路径用反引号 + `→`:`- align state → \`<absolute-path>\``。`.cache/align/align.md` 这类 user-reviewable 输出必须在 `**Outputs**` 块显式列出。
- 段落用空字符串行分隔(`formatFeedback` 保留 `""`,drop `false`/`null`/`undefined`)。
- 文章导航使用阅读标题与知识分类,不恢复主体类型分组。
- **零值策略**:头部行字段总是显示(保持总览结构稳定);子块(Special outcomes / Needs decision / Semantic outcomes)仅在 > 0 时整块显示;**例外**:给 agent “审查没意外触发”的字段(如 compile draft 的 update/supersede/deprecate 计数)总是显示。
- headline ≤ 3 个核心数字 + 最终状态(`${applied} applied · ${skipped} skipped · verify ok`)。

不要:`headline: applied=N, skipped=N, ledger=N, verify ok` 这种多字段塞 headline;不要 `merged=N, superseded=N, kept_separate=N` 这种 `key=val` dump;不要中文标签。

改造 feedback 的不变量:

- JSON `--format json` 路径不动。
- headline 核心 token 保留(`verify ok` / `review ready` / `close ready` / `build complete` 等可能被测试 grep 的状态词)。
- 所有原字段在 body 中至少出现一次(允许换表达 + 换位置,不允许丢弃)。
- 普通命令已有的 `next:` 不动;project workflow 不从它推导 Route。`workflow.current` 的选择与 body 渲染解耦。
- 同步更新依赖原输出子串的测试断言:先 `grep -rn "<原子串>" src/__tests__/`,跟 helper 改动一起提交。

参考实现:`src/project/statusRender.ts`、`src/project/run.ts`、`src/project/review.ts`、`src/project/verify.ts`、`src/project/packageBuilder.ts`。

### Agent-facing 视图与 hint

**Hint 静态 vs 动态分工**:

- 静态 command / skill 只写流程顺序、权限边界、用户确认责任、schema/protocol 发现入口、不可违反的不变量。
- 动态分支建议由 CLI 在 envelope 里给:schema 错误、缺失 decisions、raw/source_ref 指针错误、cache stale、no-op、可拆分 evidence block、stale prepare、workflow lock。
- JSON/YAML 输出用 `next_action` / `allowed_actions[]` / `views[]` / `diagnostics.warnings[]` / `diagnostics.auto_repaired[]` / `issues[].expected_shape` / `questions[]` / raw/source_ref diagnostics 承载提示,不另往 stderr/stdout 拼散文。
- text/feedback 输出只给当前结果的下一步,不复述整条 workflow。
- 增加 CLI guidance 后,若 command/skill 已有重复长分支说明,优先收短静态文案;envelope/diagnostics 是 single source of truth。
- 不把长规则复制进 CLI hint 或薄 Skill;hint 只回答“这次为什么不能继续 / 下一步做什么”。完整规则不能被删减,必须作为当前 Route 选择的 Graph resource 或 Context View 供 Agent 读取。

**长列表查询与预算**:

- 长列表 workflow payload 必须走语义 view + token/stdout budget 机制。过滤参数只收窄同一语义视图,不创建新的工作流协议。Agent 不依赖 host stdout 截断、`tool-results/**`、`jq/head/tail/sed/cat`、脚本切片。
- 预算窗口 view 必须暴露预算、已展示、总量、遗漏、截断、选择策略、稳定 item id、下一页或下一步探索信息。citation-eligible 主体和背景上下文要分桶输出,避免 Agent 把 supporting/context-only 当成可引用事实。
- 高频 payload 的默认阅读路线由 CLI 在 envelope / route plan 中选择。不要在静态文档或 hint 中把多个 detail views 组织成 checklist;detail view 只能作为 CLI-returned drilldown、fallback、debug 或局部展开入口。
- 原文类大 payload 要优先提供接近原文的预算安全表示,同时保留结构化 detail view 作为局部定位和诊断。不要新增同义的 summary/detail/full-text 平行协议;同一概念只能有一个默认入口。
- Agent-facing view 展开预算要暴露规模信号并在超预算时折叠到 narrow/batch hint。任何 `unwrap` 只移除 workflow metadata,不代表绕过该 view 的预算窗口。

**Phase operational rules**:

- Document work is status-driven: capture writes source snapshots, the current
  Indexer route produces semantic structure and reader-ready Candidates,
  review/apply writes approved Markdown, close derives
  `knowledge/structure.yaml`, and build writes packages.
- `context status --format json` `workflow.current` is the only workspace Route
  authority. A phase `next_action` can continue that operation but cannot
  replace the workspace Route. Do not invent lifecycle commands from unlisted
  surfaces or bypass a human gate by editing workspace files.
- `source_ref` is the source-bound evidence contract, not a prose-quality
  shortcut. Fenced code/config/command blocks can be active example knowledge;
  CLI verifies traceability and structure, while the Agent judges semantic
  faithfulness through current evidence views.
- Citation diagnostics distinguish structural framing from cleanup. Advisory
  cleanup must not trigger content rewrites unless the user requests cleanup or
  the current route marks it blocking.
- Lifecycle changes must be represented by current status guidance and current
  review/apply payloads. If a new lifecycle operation is needed, add a current
  phase or human gate first; do not revive retired workflow surfaces. Do not
  delete `sources/`, `knowledge/`, `dist/`, or `.tmp` to simulate
  a lifecycle command.

**Schema / error / 稳定性**:

- 任何 enum 值都要在 schema 输出中有示例或合法值列表;任何 `invalid-*` 错误在顶层 envelope/diagnostics 暴露 `valid_*[]` / `available_*[]`,Agent 不靠猜字段重试。cutover 期同步 `agent_hints[]` 时内容必须与 envelope 一致。
- Prompt/cache-stable 输出:必要且不变的指令与 schema 放前段,当前任务的材料和问题放后段;不重复携带已退场的主体矩阵或事实账本。CLI JSON 字段顺序稳定,不为刷新输出制造时间戳或随机 ID;授权材料位置与命令所需路径按现有 Route 交付。
- Knowledge 本身就是 lookup registry。不新增动态 registry 文件;Agent 通过
  当前 status、任务材料、approved `knowledge/structure.yaml`、OKF
  indexes、build inventory 和生成包里的 `knowledge-query` skill 获取
  相关知识文章及其来源区域。lookup 输出可带知识分类和排序,
  不带存储路径或临时时间戳。

## Workspace / Source / Cache

### Workspace 规则

- 项目工作区包含 `src/index.ts`、`sources/`、`knowledge/`、`dist/` 与 `.tmp/context-runtime/`;相对路径以该工作区为根。
- 源码读取范围来自登记的 source/module 配置,不从调用进程的 cwd 推断来源。
- `context status` 是 local-only,只在 workspace root 运行,不从子目录定位 workspace。

### Source Ref 行号

- 引用以当前来源材料的文件路径与区域 locator 定位,由工具计算 `content_digest`;不恢复旧 align binding 或 `mentions[].line` 协议。

### Cache Maintenance

`context clean-cache` 仅清理带 `.orphaned_at` 标记的 Claude plugin 版本缓存;`--dry-run` 只报告,不删除。Context 工作区状态与知识生命周期不依赖该缓存。

## 模块职责

- `project/run.ts` 只执行 capture 和明确声明的非知识 `customPhase`;知识生产由当前 Graph 与 `project/production*.ts` 的阶段协议负责。
- `project/indexerParser*.ts` 负责 parser 计划、受控执行和结果导入;不得直接写 approved Markdown。
- `project/productionSubmission.ts` 按固定文件接收任务,将候选和任务回执同事务写入临时区;正式修订走当前维护入口,不绕过审核直接写正式文章。
- `project/review*.ts` 负责 current Candidate HTML、用户决策和原子 apply;`project/close.ts` 负责 approved `knowledge/structure.yaml` projection 与 final verify gate。
- 800 行限制是**事后体检**(详见根 `CLAUDE.md` §代码规模规则):实现过程禁止主动探测当前行数,正常完成功能;**每个阶段结束后**才统一检查实际超 800 的文件并走分拆流程。拆分时默认目标 ≤600 行,内聚顶住才接受 600-800。

## Plugin / Shipped Docs

`plugin/` 和 `templates/` 下的 md 文件随 npm tarball / plugin build 分发到用户工作区或 agent plugin 注册表,属于 shipped docs。按用户可见文档处理,不写开发复盘、内部路径、当前版本实现细节。

### 分发路径

仓库根 `plugins/context/` 是唯一人工维护的 plugin source。`build` / `build:plugin`
同时生成 `dist/plugins/{claude,codex,cursor,skills}/`、根级 marketplace 和只读
`plugins/context/repo-install/`。`dist/plugins` 随 npm 包发布;`repo-install` 支持
无需安装阶段 build 的 Git marketplace 安装。

| Source(手改) | Build 产物(只读) | 消费者 |
|---|---|---|
| `../../plugins/context/skills/context/SKILL.md` | Claude/Cursor command adapter 与 Codex/standalone Context Skill | Agent 用户入口 |
| `../../plugins/context/skills/context-*-indexer/` | npm/Git 顶层 `skills/` 中的 Provider Skills | Context Indexer lifecycle |
| `context-workflow/` | `dist/providers/context/` | 唯一 Graph、Procedure、Diagnostic、语义规则和动态 View 定义 |
| `../../plugins/context/assets/` | npm 与 Git 宿主投影资产 | plugin 品牌资产 |
| `../../plugins/context/.{claude,codex,cursor}-plugin/plugin.json.template` | npm 与 Git 投影 manifest | 构建时替换 `__VERSION__` |

构建不变量:

- Claude/Cursor commands 发布生产、项目规划与显式查询入口,并提供 Indexer 创建 Skill。项目规划 command 转交完整 `context-plan` Skill,保留其参考文件和模板。
- `dist/plugins/codex/skills/` 包含 `context`、`context-plan`、`context-inspect-search`、`context-repo-content` 和 `context-indexer-create`;宿主 plugin root 不内嵌 lifecycle Provider。`context-repo-content` 独立编辑/登记同仓原文,不启动知识生产。
- `dist/plugins/skills/` 直接投影根级全部 Skills;安装器把其中 lifecycle Provider 原子复制到 `~/.agents/skills` 和 `~/.claude/skills`,而不是复制进 Host plugin root。
- `dist/plugins/{claude,codex,cursor}/` 各带 generated guard(`CLAUDE.md` 或 `AGENTS.md` + `.generated`);看到 guard 不要编辑 build 产物。`dist/plugins/skills/` 顶层 README 统一说明。
- 生命周期规则、长诊断、Schema 发现说明和语义规则统一住在
  `context-workflow/` Route resources 或 CLI 动态 View,不复制到入口文档。
- npm tarball(`@c4a/context-cli`)包含 CLI + `dist/plugins`;一次 `context plugin install` 同时安装 Host 主入口和无命名空间 Provider Skills,并支持 Claude、Codex、Cursor。根级 marketplace 另行指向 `repo-install`。

### Shipped Docs 写作禁忌

- 不硬编码版本叙事:避免 `v0.5.x` / `in this version` / `pre-fix` 这类会漂移说法。
- 不泄漏中文错误字符串:描述为稳定 category 或英文行为(如 `workspace-not-found error`)。
- 不引用 monorepo-only 路径、源码文件、函数名、实现细节(如 `packages/context-cli/src/...`、`runWithPrelude`)。
- 不写审查过程用语:`review finding` / `regression guard` / `temporary hack`。
- 文档只写当前命令形态:status-driven flow 用 `context status`,
  `context run <phase-id>`, `context review html/apply`, `context close`,
  `context verify`, and `context build`。语义用户问题不能被 `--yes` 或
  delegated execution 跳过。

### Skill 文档结构

Context Skill 是薄入口,不再用 L1/L2/L3 层级承载生命周期正文。它只保留:

1. 能力用途与适用边界;
2. `context entry --format json` 启动方式;
3. `workflow.current`、required/recommended resources 的消费循环;
4. revision、authority、gate、configuration 和重新求值规则;
5. 少量不允许绕过 Context CLI 的安全边界。

超过这个范围的 Procedure、Schema 说明、Diagnostic 恢复手册、语义判断
规则和动态工作区上下文必须进入 `context-workflow/resources/`,并由需要
它的 Graph 节点选择。按需加载只改变读取时机,不能删减经过验证的长篇
内容。

### Slash Command 结构

`plugin/commands/*.md` 不是 skill,不套 skill 骨架。默认 ≤ 30 行;超出时要么因为命令本身就是协议,要么因为多模式命令必须 inline 路由,否则下沉到 skill reference。

标准骨架:

```markdown
---
description: "<one-line description shown in command completion>"
argument-hint: "<argument shape>"
allowed-tools: Bash(context:*)
---

## Your Task

<1-2 paragraphs describing what the agent should do.>

- <routing rule, if needed>
- <error handling rule, if needed>

Use the packaged Context shell and follow `workflow.current`.
```

硬规则:

- frontmatter 三字段齐全(`description` / `argument-hint` / `allowed-tools`);缺字段时 runtime 可能静默丢命令。
- `allowed-tools` 按最小权限列;纯 CLI 代理命令通常只需 `Bash(context:*)`。
- `context` 生产 command 只说明如何消费 `context entry` 和 `workflow.current`。不要在 command 中复制分支流程,也不要重新引入 init / align / compile / drop / query 等公开 slash command。
- command md 不写 `${CLAUDE_PLUGIN_ROOT}/skills/...`,只指向打包后的 Context shell。
- command md 只负责流程入口;schema 和来源区域规则通过当前 Graph resource 或 CLI View 发现,不再要求主体挂载矩阵。

### Aspect README 结构

`templates/aspects/<name>/README.md` 进入用户 workspace 长期存在:

- 只写 target、schema、notes 三段。
- 不写固定版本号、monorepo 路径、源码函数名。
- 不描述未上线实现细节;规划中能力只写用户可理解的边界。

## 测试与构建

- 子进程测试出现空输出时保存退出码和日志排查,不用空输出自动跳过断言;真实 Node 发行物测试按仓库验证范围执行。
- `bun run build` 走 `packages/build.ts`,context-cli build 还会跑 `scripts/build-plugin.ts` 从根级 `plugins/context/` 生成到 `dist/plugins/`。
- 依赖 `@c4a/extract` 的包自动复制 `tree-sitter*.wasm` 到 `dist/wasm/`,不手工维护 dist wasm。
- `postinstall.mjs` 是 hint-only:plugin install 后 `context` 不在 PATH 时只打印安装提示,不自动全局安装。