@haaaiawd/anws 1.2.5 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +208 -172
- package/bin/cli.js +22 -9
- package/lib/adapters/index.js +157 -0
- package/lib/agents.js +136 -1
- package/lib/changelog.js +187 -0
- package/lib/copy.js +72 -1
- package/lib/diff.js +270 -0
- package/lib/init.js +143 -125
- package/lib/install-state.js +195 -0
- package/lib/manifest.js +184 -42
- package/lib/output.js +185 -13
- package/lib/prompt.js +284 -0
- package/lib/resources/index.js +27 -0
- package/lib/update.js +291 -83
- package/package.json +10 -6
- package/templates/.agents/skills/concept-modeler/SKILL.md +176 -0
- package/templates/{.agent → .agents}/skills/design-reviewer/SKILL.md +6 -6
- package/templates/.agents/skills/nexus-mapper/SKILL.md +306 -0
- package/templates/.agents/skills/nexus-mapper/references/language-customization.md +164 -0
- package/templates/.agents/skills/nexus-mapper/references/output-schema.md +298 -0
- package/templates/.agents/skills/nexus-mapper/references/probe-protocol.md +246 -0
- package/templates/.agents/skills/nexus-mapper/scripts/extract_ast.py +706 -0
- package/templates/.agents/skills/nexus-mapper/scripts/git_detective.py +194 -0
- package/templates/.agents/skills/nexus-mapper/scripts/languages.json +127 -0
- package/templates/.agents/skills/nexus-mapper/scripts/query_graph.py +556 -0
- package/templates/.agents/skills/nexus-mapper/scripts/requirements.txt +6 -0
- package/templates/{.agent → .agents}/skills/report-template/SKILL.md +11 -14
- package/templates/.agents/skills/report-template/references/REPORT_TEMPLATE.md +100 -0
- package/templates/{.agent → .agents}/skills/runtime-inspector/SKILL.md +1 -1
- package/templates/.agents/skills/sequential-thinking/SKILL.md +166 -0
- package/templates/.agents/skills/spec-writer/SKILL.md +108 -0
- package/templates/{.agent → .agents}/skills/spec-writer/references/prd_template.md +1 -1
- package/templates/{.agent → .agents}/skills/system-architect/SKILL.md +3 -3
- package/templates/.agents/skills/system-architect/references/rfc_template.md +59 -0
- package/templates/{.agent → .agents}/skills/system-designer/SKILL.md +6 -6
- package/templates/{.agent → .agents}/skills/system-designer/references/system-design-template.md +75 -25
- package/templates/{.agent → .agents}/skills/task-planner/SKILL.md +1 -1
- package/templates/.agents/skills/task-planner/references/TASK_TEMPLATE.md +144 -0
- package/templates/{.agent → .agents}/skills/task-reviewer/SKILL.md +4 -3
- package/templates/{.agent → .agents}/skills/tech-evaluator/SKILL.md +2 -2
- package/templates/{.agent → .agents}/skills/tech-evaluator/references/ADR_TEMPLATE.md +10 -0
- package/templates/{.agent → .agents}/workflows/blueprint.md +32 -27
- package/templates/{.agent → .agents}/workflows/challenge.md +21 -15
- package/templates/{.agent → .agents}/workflows/change.md +23 -14
- package/templates/{.agent → .agents}/workflows/craft.md +8 -19
- package/templates/{.agent → .agents}/workflows/design-system.md +81 -54
- package/templates/{.agent → .agents}/workflows/explore.md +6 -19
- package/templates/{.agent → .agents}/workflows/forge.md +30 -32
- package/templates/{.agent → .agents}/workflows/genesis.md +68 -56
- package/templates/.agents/workflows/probe.md +168 -0
- package/templates/{.agent → .agents}/workflows/quickstart.md +7 -12
- package/templates/.agents/workflows/upgrade.md +192 -0
- package/templates/AGENTS.md +66 -45
- package/templates/.agent/skills/build-inspector/SKILL.md +0 -83
- package/templates/.agent/skills/complexity-guard/SKILL.md +0 -71
- package/templates/.agent/skills/complexity-guard/references/anti_patterns.md +0 -21
- package/templates/.agent/skills/concept-modeler/SKILL.md +0 -112
- package/templates/.agent/skills/concept-modeler/prompts/GLOSSARY_PROMPT.md +0 -40
- package/templates/.agent/skills/concept-modeler/references/ENTITY_EXTRACTION_PROMPT.md +0 -299
- package/templates/.agent/skills/concept-modeler/scripts/glossary_gen.py +0 -66
- package/templates/.agent/skills/git-forensics/SKILL.md +0 -74
- package/templates/.agent/skills/git-forensics/references/ANALYSIS_METHODOLOGY.md +0 -193
- package/templates/.agent/skills/git-forensics/scripts/__pycache__/git_forensics.cpython-313.pyc +0 -0
- package/templates/.agent/skills/git-forensics/scripts/git_forensics.py +0 -615
- package/templates/.agent/skills/git-forensics/scripts/git_hotspots.py +0 -118
- package/templates/.agent/skills/report-template/references/REPORT_TEMPLATE.md +0 -100
- package/templates/.agent/skills/spec-writer/SKILL.md +0 -108
- package/templates/.agent/skills/system-architect/references/rfc_template.md +0 -59
- package/templates/.agent/skills/task-planner/references/TASK_TEMPLATE.md +0 -144
- package/templates/.agent/workflows/scout.md +0 -139
- /package/templates/{.agent → .agents}/skills/system-designer/references/system-design-detail-template.md +0 -0
|
@@ -15,7 +15,7 @@ description: 使用三维框架(系统设计、运行模拟、工程实现)
|
|
|
15
15
|
## ⚡ 任务目标
|
|
16
16
|
|
|
17
17
|
1. **加载文档 (必须)**: 读取 `02_ARCHITECTURE_OVERVIEW.md`、所有 `04_SYSTEM_DESIGN/*.md` 以及所有 `03_ADR/*.md`。
|
|
18
|
-
2. **深度理解**: 使用 `
|
|
18
|
+
2. **深度理解**: 使用 `sequential-thinking` skill(3-5 个 thought)在批判之前先理解设计意图。
|
|
19
19
|
3. **Pre-Mortem**: 想象项目在 6 个月后失败了——倒推根因。
|
|
20
20
|
4. **三维审查**: 系统性执行全部 3 个维度。
|
|
21
21
|
5. **假设验证**: 识别隐藏假设并尝试证伪。
|
|
@@ -45,7 +45,7 @@ description: 使用三维框架(系统设计、运行模拟、工程实现)
|
|
|
45
45
|
| SD-5 | **状态管理** | 系统状态转换是否清晰定义?边缘状态是否处理? |
|
|
46
46
|
| SD-6 | **数据模型完整性** | 实体关系是否跨文档一致?是否存在孤儿实体? |
|
|
47
47
|
|
|
48
|
-
**思考提示**(配合 `
|
|
48
|
+
**思考提示**(配合 `sequential-thinking` 使用):
|
|
49
49
|
1. "这个架构背后的核心假设是什么?"
|
|
50
50
|
2. "如果假设 X 不成立,什么会崩?"
|
|
51
51
|
3. "系统边界定义是否存在歧义?"
|
|
@@ -57,7 +57,7 @@ description: 使用三维框架(系统设计、运行模拟、工程实现)
|
|
|
57
57
|
|
|
58
58
|
**目标**: 在脑中"运行"系统,发现时序、状态和并发问题。
|
|
59
59
|
|
|
60
|
-
> 本维度**必须**使用 `
|
|
60
|
+
> 本维度**必须**使用 `sequential-thinking` skill(3-5 个 thought)。运行时问题藏在序列中。
|
|
61
61
|
|
|
62
62
|
| # | 检查项 | 关注要点 |
|
|
63
63
|
|---|--------|---------|
|
|
@@ -80,7 +80,7 @@ description: 使用三维框架(系统设计、运行模拟、工程实现)
|
|
|
80
80
|
|
|
81
81
|
**目标**: 验证设计可构建、可测试、可维护。
|
|
82
82
|
|
|
83
|
-
> 本维度**必须**使用 `
|
|
83
|
+
> 本维度**必须**使用 `sequential-thinking` skill(3-5 个 thought)。
|
|
84
84
|
|
|
85
85
|
| # | 检查项 | 关注要点 |
|
|
86
86
|
|---|--------|---------|
|
|
@@ -138,7 +138,7 @@ description: 使用三维框架(系统设计、运行模拟、工程实现)
|
|
|
138
138
|
|
|
139
139
|
**证据**:
|
|
140
140
|
- 文档分析: [来自 PRD/Architecture/ADR 的具体内容]
|
|
141
|
-
- 推理链: [基于
|
|
141
|
+
- 推理链: [基于 `sequential-thinking` 的分析]
|
|
142
142
|
- 类比: [其他系统中的类似已知失败,如适用]
|
|
143
143
|
|
|
144
144
|
**影响**:
|
|
@@ -156,6 +156,6 @@ description: 使用三维框架(系统设计、运行模拟、工程实现)
|
|
|
156
156
|
- [ ] 每条发现有具体文档引用(不是笼统的"架构文档")
|
|
157
157
|
- [ ] 每条发现有明确的影响说明
|
|
158
158
|
- [ ] 没有纯猜测性的发现(缺乏推理链条)
|
|
159
|
-
- [ ] Critical/High 发现经过 `
|
|
159
|
+
- [ ] Critical/High 发现经过 `sequential-thinking` 验证
|
|
160
160
|
- [ ] ADR 中已记录的权衡被尊重(没有在无新证据的情况下重复质疑)
|
|
161
161
|
- [ ] 发现可操作(审查者能根据建议进行修复)
|
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: nexus-mapper
|
|
3
|
+
description: "Generate a persistent .nexus-map/ knowledge base that lets any AI session instantly understand a codebase's architecture, systems, dependencies, and change hotspots. Use when starting work on an unfamiliar repository, onboarding with AI-assisted context, preparing for a major refactoring initiative, or enabling reliable cold-start AI sessions across a team. Produces INDEX.md, systems.md, concept_model.json, git_forensics.md and more. Requires shell execution and Python 3.10+. For ad-hoc file queries or instant impact analysis during active development, use nexus-query instead."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# nexus-mapper — AI 项目探测协议
|
|
7
|
+
|
|
8
|
+
本 Skill 指导 AI Agent 使用 **PROBE 五阶段协议**,对任意本地 Git 仓库执行系统性探测,产出 `.nexus-map/` 分层知识库。
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## 何时调用 / 何时不调用
|
|
13
|
+
|
|
14
|
+
| 场景 | 调用 |
|
|
15
|
+
| ------------------------------------------------------------------- | :---: |
|
|
16
|
+
| 用户提供本地 repo 路径,希望 AI 理解其架构 | 是 |
|
|
17
|
+
| 需要生成 `.nexus-map/INDEX.md` 供后续 AI 会话冷启动 | 是 |
|
|
18
|
+
| 用户说「帮我分析项目」「建立项目知识库」「让 AI 了解这个仓库」 | 是 |
|
|
19
|
+
| 运行环境无 shell 执行能力(纯 API 调用模式,无 `run_command` 工具) | 否 |
|
|
20
|
+
| 宿主机无本地 Python 3.10+ | 否 |
|
|
21
|
+
| 目标仓库无任何已知语言源文件(`.py/.ts/.java/.go/.rs/.cpp` 等均无) | 否 |
|
|
22
|
+
| 用户只想查询某个特定文件/函数 → 直接用 `view_file` / `grep_search` | 否 |
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## 前提检查
|
|
27
|
+
|
|
28
|
+
缺失项要显式告知用户;需要降级等时及时提醒用户,经过同意才能继续。
|
|
29
|
+
|
|
30
|
+
| 前提 | 检查方式 |
|
|
31
|
+
| ----------------- | --------------------------------------- |
|
|
32
|
+
| 目标路径存在 | `$repo_path` 可访问 |
|
|
33
|
+
| Python 3.10+ | `python --version` >= 3.10 |
|
|
34
|
+
| 脚本依赖已安装 | `python -c "import tree_sitter"` 无报错 |
|
|
35
|
+
| 有 shell 执行能力 | Agent 环境支持 `run_command` 工具调用 |
|
|
36
|
+
|
|
37
|
+
`git` 历史是加分项,不是硬阻塞项。没有 `.git` 或历史过少时,跳过热点分析,并在输出中明确记录这是一次降级探测。
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## 输入契约
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
repo_path: 目标仓库的本地绝对路径(必填)
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
**语言支持**:自动按文件扩展名 dispatch,语言配置(扩展名映射 + Tree-sitter 查询)存储在 `scripts/languages.json`。当前已接入 Python/JavaScript/TypeScript/TSX/Bash/Java/Go/Rust/C#/C/C++/Kotlin/Ruby/Swift/Scala/PHP/Lua/Elixir/GDScript/Dart/Haskell/Clojure/SQL/Proto/Solidity/Vue/Svelte/R/Perl 等 30+ 语言。
|
|
48
|
+
|
|
49
|
+
**非标准语言**:若仓库含有内置未支持的语言,通过命令行参数动态补充(详见 `references/05-language-customization.md`):
|
|
50
|
+
- `--add-extension .templ=templ` 添加新文件扩展名映射
|
|
51
|
+
- `--add-query templ struct "(component_declaration ...)"` 添加结构查询
|
|
52
|
+
- `--language-config <JSON_FILE>` 复杂配置时使用 JSON 文件
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## 输出格式
|
|
57
|
+
|
|
58
|
+
执行完成后,目标仓库根目录下将产出:
|
|
59
|
+
|
|
60
|
+
```text
|
|
61
|
+
.nexus-map/
|
|
62
|
+
├── INDEX.md ← AI 冷启动主入口(< 2000 tokens)
|
|
63
|
+
├── arch/
|
|
64
|
+
│ ├── systems.md ← 系统边界 + 代码位置
|
|
65
|
+
│ ├── dependencies.md ← Mermaid 依赖图 + 时序图
|
|
66
|
+
│ └── test_coverage.md ← 静态测试面:测试文件、覆盖到的核心模块、证据缺口
|
|
67
|
+
├── concepts/
|
|
68
|
+
│ ├── concept_model.json ← Schema V1 机器可读图谱
|
|
69
|
+
│ └── domains.md ← 核心领域概念说明
|
|
70
|
+
├── hotspots/
|
|
71
|
+
│ └── git_forensics.md ← Git 热点 + 耦合对分析
|
|
72
|
+
└── raw/
|
|
73
|
+
├── ast_nodes.json ← Tree-sitter 解析原始数据
|
|
74
|
+
├── git_stats.json ← Git 热点与耦合数据
|
|
75
|
+
└── file_tree.txt ← 过滤后的文件树
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
所有生成的 Markdown 文件必须带一个简短头部,至少包含:`generated_by`、`verified_at`、`provenance`。
|
|
79
|
+
|
|
80
|
+
`concept_model.json` 的人类可读名称字段统一使用 `label`,不要添加 `title`。
|
|
81
|
+
|
|
82
|
+
如果 PROFILE 阶段发现语言覆盖降级或人工推断,`provenance` 必须明确标注。
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## PROBE 阶段门控
|
|
87
|
+
|
|
88
|
+
> [!IMPORTANT]
|
|
89
|
+
> **进入每个阶段前必须先读对应 reference,不得跳过。**
|
|
90
|
+
> 各阶段详细步骤、完成检查清单与边界场景处理均在 reference 中定义。
|
|
91
|
+
|
|
92
|
+
```
|
|
93
|
+
[Skill 激活时] → read references/probe-protocol.md (阶段步骤蓝图,含边界场景与三维度质疑框架)
|
|
94
|
+
[EMIT 前] → read references/output-schema.md (Schema 校验规范)
|
|
95
|
+
[非标准语言时] → read references/language-customization.md(按需,非门控)
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## 执行守则
|
|
101
|
+
|
|
102
|
+
### 守则1: OBJECT 拒绝形式主义
|
|
103
|
+
|
|
104
|
+
OBJECT 的存在意义是打破 REASON 的幸存者偏差。大量工程事实隐藏在目录命名和 git 热点背后,第一直觉几乎总是错的。
|
|
105
|
+
|
|
106
|
+
不合格质疑(禁止提交):
|
|
107
|
+
```
|
|
108
|
+
Q1: 我对系统结构的把握还不够扎实
|
|
109
|
+
Q2: xxx 目录的职责暂时没有直接证据
|
|
110
|
+
```
|
|
111
|
+
问题不在措辞,而在于没有证据线索,也无法在 BENCHMARK 阶段验证。
|
|
112
|
+
|
|
113
|
+
合格质疑格式:
|
|
114
|
+
```
|
|
115
|
+
Q1: git_stats 显示 tasks/analysis_tasks.py 变更 21 次(high risk),
|
|
116
|
+
但 HYPOTHESIS 认为编排入口是 evolution/detective_loop.py。
|
|
117
|
+
矛盾:若 detective_loop 是入口,为何 analysis_tasks 热度更高?
|
|
118
|
+
证据线索: git_stats.json hotspots[0].path
|
|
119
|
+
验证计划: view tasks/analysis_tasks.py 的 class 定义 + import 树
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
### 守则2: implemented 节点必须有真实 code_path
|
|
125
|
+
|
|
126
|
+
> [!IMPORTANT]
|
|
127
|
+
> 写入 `concept_model.json` 前,必须先区分节点是 `implemented`、`planned` 还是 `inferred`。
|
|
128
|
+
> 只有 `implemented` 节点允许写入 `code_path`,且必须亲手验证存在。
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
# BENCHMARK 阶段验证方式
|
|
132
|
+
ls $repo_path/src/nexus/application/weaving/ # 目录存在 → 节点有效
|
|
133
|
+
ls $repo_path/src/nexus/application/nonexist/ # [!ERROR] → 修正或删除此节点
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
对于 `planned` 或 `inferred` 节点,使用:
|
|
137
|
+
|
|
138
|
+
```json
|
|
139
|
+
{
|
|
140
|
+
"implementation_status": "planned",
|
|
141
|
+
"code_path": null,
|
|
142
|
+
"evidence_path": "docs/architecture.md",
|
|
143
|
+
"evidence_gap": "仓库中未发现 src/agents/monarch/,仅在设计文档中出现"
|
|
144
|
+
}
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
禁止:用勉强相关的文件冒充 `code_path`、把状态塞进路径字段(如 `code_path: "PLANNED"`)。
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
### 守则3: EMIT 原子性
|
|
152
|
+
|
|
153
|
+
先全部写入 `.nexus-map/.tmp/`,全部成功后整体移动到正式目录,删除 `.tmp/`。
|
|
154
|
+
目的:中途失败不留半成品。下次执行检测到 `.tmp/` 存在 → 清理后重新生成。
|
|
155
|
+
|
|
156
|
+
幂等性规则:
|
|
157
|
+
|
|
158
|
+
| 状态 | 处理方式 |
|
|
159
|
+
| ------------------------------------ | ------------------------------------------ |
|
|
160
|
+
| `.nexus-map/` 不存在 | 直接继续 |
|
|
161
|
+
| `.nexus-map/` 存在且 `INDEX.md` 有效 | 询问用户:「是否覆盖?[y/n]」 |
|
|
162
|
+
| `.nexus-map/` 存在但文件不完整 | 「检测到未完成分析,将重新生成」,直接继续 |
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
166
|
+
### 守则4: INDEX.md 的角色——冷启动路由器,而非静态字典
|
|
167
|
+
|
|
168
|
+
`INDEX.md` 的读者是**从未见过这个仓库的 AI**。两个硬约束:
|
|
169
|
+
- **< 2000 tokens** — 超过就重写,不是截断
|
|
170
|
+
- **结论必须具体** — 证据不足时明确写出 `evidence gap` 或 `unknown`,并说明缺了什么证据
|
|
171
|
+
|
|
172
|
+
写完后执行 token 估算:行数 × 平均 30 tokens/行 = 粗估值。
|
|
173
|
+
|
|
174
|
+
**INDEX.md 必须包含的强制路由块(Hard-Trigger Block)**——生成时把这段结构写入文件末尾:
|
|
175
|
+
|
|
176
|
+
```markdown
|
|
177
|
+
## [操作指南] 强制执行步骤
|
|
178
|
+
|
|
179
|
+
> 本节是对所有读取本文件的 AI 发出的硬性操作指令,不是建议。
|
|
180
|
+
|
|
181
|
+
### 步骤1 — 必须先读完以下所有文件(顺序不限)
|
|
182
|
+
|
|
183
|
+
读完本文件后,在执行任何任务之前,必须依次 read 以下文件完整内容:
|
|
184
|
+
|
|
185
|
+
- `.nexus-map/arch/systems.md` — 系统边界与代码位置
|
|
186
|
+
- `.nexus-map/arch/dependencies.md` — 系统间依赖关系与 Mermaid 图
|
|
187
|
+
- `.nexus-map/arch/test_coverage.md` — 测试面与证据缺口
|
|
188
|
+
- `.nexus-map/hotspots/git_forensics.md` — Git 热点与耦合风险
|
|
189
|
+
- `.nexus-map/concepts/domains.md` — 核心领域概念
|
|
190
|
+
|
|
191
|
+
> 这些文件均为高密度摘要,总量通常 < 5000 tokens,是必要的上下文成本。
|
|
192
|
+
> 不得以"任务简单"或"只改一个文件"为由跳过。
|
|
193
|
+
|
|
194
|
+
### 步骤2 — 按任务类型追加操作(步骤1 完成后执行)
|
|
195
|
+
|
|
196
|
+
- 若任务涉及**接口修改、新增跨模块调用、删除/重命名公共函数**:
|
|
197
|
+
→ 必须运行 `query_graph.py --impact <目标文件>` 确认影响半径后再写代码。
|
|
198
|
+
- 若任务需要**判断某文件被谁引用**:
|
|
199
|
+
→ 运行 `query_graph.py --who-imports <模块名>`。
|
|
200
|
+
- 若仓库结构已发生重大变化(新增系统、重构模块边界):
|
|
201
|
+
→ 任务完成后评估是否需要重新运行 nexus-mapper 更新知识库。
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
---
|
|
205
|
+
|
|
206
|
+
### 守则5: 最小执行面与敏感信息保护
|
|
207
|
+
|
|
208
|
+
> [!IMPORTANT]
|
|
209
|
+
> 默认只运行本 Skill 自带脚本和必要的只读检查。不要因为"想更懂仓库"就执行目标仓库里的构建脚本、测试脚本或自定义命令。
|
|
210
|
+
|
|
211
|
+
- 默认允许:`extract_ast.py`、`git_detective.py`、目录遍历、文本搜索、只读文件查看
|
|
212
|
+
- 默认禁止:执行目标仓库的 `npm install`、`pnpm dev`、`python main.py`、`docker compose up` 等,除非用户明确要求
|
|
213
|
+
- 遇到 `.env`、密钥文件、凭据配置时:只记录其存在和用途,不抄出具体值
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
### 守则6: 降级与人工推断必须显式可见
|
|
218
|
+
|
|
219
|
+
> [!IMPORTANT]
|
|
220
|
+
> 如果 AST 覆盖不完整,或者某部分来自人工阅读而非脚本产出,必须在最终文件中显式标注 provenance。
|
|
221
|
+
|
|
222
|
+
- `dependencies.md` 中凡是非 AST 直接支持的依赖关系,必须标注 `inferred from file tree/manual inspection`
|
|
223
|
+
- `domains.md`、`systems.md`、`INDEX.md` 如果涉及未支持语言区域,必须说明 `unsupported language downgrade`
|
|
224
|
+
- 若写入进度快照、Sprint 状态,必须附 `verified_at`,避免过期信息伪装成当前事实
|
|
225
|
+
|
|
226
|
+
---
|
|
227
|
+
|
|
228
|
+
## 不确定性表达规范
|
|
229
|
+
|
|
230
|
+
避免只写:待确认 · 可能是 · 疑似 · 也许 · 待定 · 暂不清楚 · pending · maybe · possibly · TBD
|
|
231
|
+
|
|
232
|
+
如果证据不足,按以下格式写:
|
|
233
|
+
- `unknown: 未发现直接证据表明 api/ 是主入口,当前仅能确认 cli.py 被 README 引用`
|
|
234
|
+
- `evidence gap: 仓库没有 git 历史,因此 hotspots 部分跳过`
|
|
235
|
+
|
|
236
|
+
允许诚实地写不确定,但必须解释不确定来自哪一条缺失证据。
|
|
237
|
+
|
|
238
|
+
---
|
|
239
|
+
|
|
240
|
+
## 脚本工具链
|
|
241
|
+
|
|
242
|
+
```bash
|
|
243
|
+
# 设置 SKILL_DIR(根据实际安装路径)
|
|
244
|
+
# 场景 A: 作为 .agent/skills 安装
|
|
245
|
+
SKILL_DIR=".agent/skills/nexus-mapper"
|
|
246
|
+
# 场景 B: 独立 repo(开发/调试时)
|
|
247
|
+
SKILL_DIR="/path/to/nexus-mapper"
|
|
248
|
+
|
|
249
|
+
# PROFILE 阶段 — 基础用法
|
|
250
|
+
python $SKILL_DIR/scripts/extract_ast.py <repo_path> [--max-nodes 500] \
|
|
251
|
+
--file-tree-out <repo_path>/.nexus-map/raw/file_tree.txt \
|
|
252
|
+
> <repo_path>/.nexus-map/raw/ast_nodes.json
|
|
253
|
+
|
|
254
|
+
# 补充非标准语言支持
|
|
255
|
+
python $SKILL_DIR/scripts/extract_ast.py <repo_path> [--max-nodes 500] \
|
|
256
|
+
--add-extension .templ=templ \
|
|
257
|
+
--add-query templ struct "(component_declaration name: (identifier) @class.name) @class.def" \
|
|
258
|
+
> <repo_path>/.nexus-map/raw/ast_nodes.json
|
|
259
|
+
|
|
260
|
+
# 复杂配置:使用 JSON 配置文件
|
|
261
|
+
python $SKILL_DIR/scripts/extract_ast.py <repo_path> [--max-nodes 500] \
|
|
262
|
+
--language-config /custom/path/to/language-config.json \
|
|
263
|
+
> <repo_path>/.nexus-map/raw/ast_nodes.json
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
**依赖安装(首次使用)**:
|
|
267
|
+
```bash
|
|
268
|
+
pip install -r $SKILL_DIR/scripts/requirements.txt
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
---
|
|
272
|
+
|
|
273
|
+
## 持久化记忆规则(写入宿主 AGENTS.md)
|
|
274
|
+
|
|
275
|
+
建议把以下规则写入仓库的 `AGENTS.md`、`CLAUDE.md` 或同类持久记忆文件,使知识库在长期对话中保持活跃:
|
|
276
|
+
|
|
277
|
+
```md
|
|
278
|
+
如果仓库中存在 .nexus-map/INDEX.md,先阅读它,然后在执行任务前读完其路由块中列出的所有文件。
|
|
279
|
+
|
|
280
|
+
如果 .nexus-map/ 不存在,且当前任务涉及跨模块修改或接口变更,先向用户提议运行 nexus-mapper;若用户需立即开始,至少先运行 query_graph.py --summary 建立结构感知。
|
|
281
|
+
|
|
282
|
+
当任务改变了项目的结构认知(系统边界、入口、依赖关系),在交付前评估是否需要更新 .nexus-map。
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
---
|
|
286
|
+
|
|
287
|
+
## 按需查询工具(PROBE 辅助)
|
|
288
|
+
|
|
289
|
+
`scripts/query_graph.py` 读取 `raw/ast_nodes.json`,零额外依赖(纯 Python 标准库)。
|
|
290
|
+
|
|
291
|
+
```bash
|
|
292
|
+
python $SKILL_DIR/scripts/query_graph.py <ast_nodes.json> --file <path> # 文件骨架
|
|
293
|
+
python $SKILL_DIR/scripts/query_graph.py <ast_nodes.json> --who-imports <mod> # 反向依赖
|
|
294
|
+
python $SKILL_DIR/scripts/query_graph.py <ast_nodes.json> --impact <path> # 影响半径
|
|
295
|
+
python $SKILL_DIR/scripts/query_graph.py <ast_nodes.json> --impact <path> --git-stats <git_stats.json>
|
|
296
|
+
python $SKILL_DIR/scripts/query_graph.py <ast_nodes.json> --hub-analysis # 核心节点
|
|
297
|
+
python $SKILL_DIR/scripts/query_graph.py <ast_nodes.json> --summary # 目录聚合
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
| 阶段 | 推荐查询 | 用途 |
|
|
301
|
+
| ------ | ---------------------- | -------------------------------------------- |
|
|
302
|
+
| REASON | `--hub-analysis` | 数据验证核心系统假说,不靠目录名猜测 |
|
|
303
|
+
| OBJECT | `--impact --git-stats` | 验证边界假设,查看真实上下游依赖 |
|
|
304
|
+
| EMIT | `--summary`, `--file` | 生成 systems.md / dependencies.md 的数据支撑 |
|
|
305
|
+
|
|
306
|
+
各查询模式的核心价值:`--hub-analysis` 用于 REASON 期验证架构假说;`--impact --git-stats` 用于 OBJECT 期量化边界风险;`--summary` 与 `--file` 用于 EMIT 期生成精确数据支撑。
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
# 为 nexus-mapper 补充语言支持
|
|
2
|
+
|
|
3
|
+
> 本文件不是阶段门控文件。当内置语言覆盖不足时,后续 agent 应优先参考本文件,通过命令行参数补充支持;只有在配置较复杂时,才使用显式 JSON 配置文件。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 目标
|
|
8
|
+
|
|
9
|
+
当前脚本的默认模型是:
|
|
10
|
+
|
|
11
|
+
1. 先使用内置扩展名映射和内置 Tree-sitter query
|
|
12
|
+
2. 若内置覆盖不足,再由 agent 通过命令行补充语言支持
|
|
13
|
+
3. 若命令行参数过多或 query 过长,再退回到 `--language-config <JSON_FILE>`
|
|
14
|
+
|
|
15
|
+
这意味着:
|
|
16
|
+
- 不要求仓库内必须存在固定路径的语言配置文件
|
|
17
|
+
- 不建议为了单个仓库的单次分析先改核心脚本
|
|
18
|
+
- 新接手的 agent 可以在一次命令中直接把额外语言接入分析流程
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## 优先方案:命令行补充
|
|
23
|
+
|
|
24
|
+
### 适用场景
|
|
25
|
+
|
|
26
|
+
满足以下条件时,优先用命令行:
|
|
27
|
+
|
|
28
|
+
- 仓库里出现了内置未覆盖的扩展名
|
|
29
|
+
- 只需要补 1 到 3 个语言映射
|
|
30
|
+
- query 较短,适合直接写在命令行中
|
|
31
|
+
|
|
32
|
+
### 步骤 1:确认语言名
|
|
33
|
+
|
|
34
|
+
先确认 `tree-sitter-language-pack` 或当前环境可识别的语言名。例如:
|
|
35
|
+
|
|
36
|
+
- `.templ` -> `templ`
|
|
37
|
+
- `.hbs` -> `handlebars`
|
|
38
|
+
- `.rego` -> `rego`
|
|
39
|
+
|
|
40
|
+
如果语言名不确定,先查官方 grammar 名称;不要猜测一个语言名直接写入最终结论。
|
|
41
|
+
|
|
42
|
+
### 步骤 2:补扩展名映射
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
python extract_ast.py <repo_path> \
|
|
46
|
+
--add-extension .templ=templ \
|
|
47
|
+
--add-extension .hbs=handlebars
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
这会把原本不认识的扩展名纳入语言分发流程。
|
|
51
|
+
|
|
52
|
+
### 步骤 3:按需补 query
|
|
53
|
+
|
|
54
|
+
如果只需要 Module 级覆盖,可以到此为止。
|
|
55
|
+
|
|
56
|
+
如果需要类/函数级结构,继续追加 `--add-query`:
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
python extract_ast.py <repo_path> \
|
|
60
|
+
--add-extension .templ=templ \
|
|
61
|
+
--add-query templ struct "(component_declaration name: (identifier) @class.name) @class.def"
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
参数格式:
|
|
65
|
+
|
|
66
|
+
```text
|
|
67
|
+
--add-query <LANG> <TYPE> <QUERY_STRING>
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
其中:
|
|
71
|
+
- `<LANG>`:语言名,例如 `templ`
|
|
72
|
+
- `<TYPE>`:`struct` 或 `imports`
|
|
73
|
+
- `<QUERY_STRING>`:Tree-sitter query 字符串
|
|
74
|
+
|
|
75
|
+
capture 命名必须继续遵守现有约定:
|
|
76
|
+
- 类:`@class.def` / `@class.name`
|
|
77
|
+
- 函数:`@func.def` / `@func.name`
|
|
78
|
+
- 导入:`@mod`
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## 备选方案:显式 JSON 配置文件
|
|
83
|
+
|
|
84
|
+
当下面任一情况成立时,可使用 `--language-config`:
|
|
85
|
+
|
|
86
|
+
- 需要补多个语言,命令行已经过长
|
|
87
|
+
- query 很复杂,不适合内联在 shell 命令里
|
|
88
|
+
- 希望把一次分析所需的扩展映射和 query 集中保存
|
|
89
|
+
|
|
90
|
+
示例:
|
|
91
|
+
|
|
92
|
+
```json
|
|
93
|
+
{
|
|
94
|
+
"extensions": {
|
|
95
|
+
".templ": "templ",
|
|
96
|
+
".hbs": "handlebars"
|
|
97
|
+
},
|
|
98
|
+
"queries": {
|
|
99
|
+
"templ": {
|
|
100
|
+
"struct": "(component_declaration name: (identifier) @class.name) @class.def",
|
|
101
|
+
"imports": ""
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
"unsupported_extensions": {
|
|
105
|
+
".legacydsl": "legacydsl"
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
执行方式:
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
python extract_ast.py <repo_path> --language-config /custom/path/to/language-config.json
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
说明:
|
|
117
|
+
- `extensions`:扩展名到语言名的映射
|
|
118
|
+
- `queries`:自定义 `struct` / `imports` query
|
|
119
|
+
- `unsupported_extensions`:显式声明当前仍不支持的扩展名,避免静默跳过
|
|
120
|
+
|
|
121
|
+
这里的 JSON 文件是一次分析的显式输入,不要求固定放在仓库某个默认位置。
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## 覆盖诚实度规则
|
|
126
|
+
|
|
127
|
+
不管是命令行还是显式 JSON,新增语言都必须遵守同一套分层标准:
|
|
128
|
+
|
|
129
|
+
1. `structural coverage`
|
|
130
|
+
条件:parser 可加载,且存在 `struct` query
|
|
131
|
+
|
|
132
|
+
2. `module-only coverage`
|
|
133
|
+
条件:parser 可加载,但没有 `struct` query
|
|
134
|
+
|
|
135
|
+
3. `configured-but-unavailable`
|
|
136
|
+
条件:agent 明确要求支持该语言,但当前环境无法加载 parser
|
|
137
|
+
|
|
138
|
+
4. `unsupported`
|
|
139
|
+
条件:该语言仍未纳入本次 AST 流程,或被显式标记为未支持
|
|
140
|
+
|
|
141
|
+
禁止:
|
|
142
|
+
- 把 `configured-but-unavailable` 写成 `module-only`
|
|
143
|
+
- 把 `unsupported` 伪装成“仓库里没出现”
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
## 推荐决策顺序
|
|
148
|
+
|
|
149
|
+
当后续 agent 遇到一个未覆盖语言时,按以下顺序处理:
|
|
150
|
+
|
|
151
|
+
1. 先确认当前仓库里是否真的存在该扩展名文件
|
|
152
|
+
2. 再确认当前环境能否加载对应 parser
|
|
153
|
+
3. 若能加载:优先用 `--add-extension`;需要结构节点时再补 `--add-query`
|
|
154
|
+
4. 若命令太长:改用 `--language-config`
|
|
155
|
+
5. 若 parser 不能加载:保留 `configured-but-unavailable`,不要伪造结果
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
## 设计原则
|
|
160
|
+
|
|
161
|
+
- 内置语言优先,命令行补充其次,显式 JSON 最后
|
|
162
|
+
- 对单次分析,优先使用最小额外输入,不要先改核心脚本
|
|
163
|
+
- 自定义 query 是正式输入,不是旁路 hack
|
|
164
|
+
- 所有新增语言都必须遵守同一套 metadata 和 provenance 规则
|