docs: 刷新全量文档;修复 executor 成功/失败状态判断;添加三专项独立项目

文档刷新:
- CLAUDE.md/README.md/DEVELOP.md/RELEASE.md 同步 org v2 架构
  (Boss/GroupLeader/SeniorDev/Ops 组织层、EventBus/DailyReport/OpsHub/
   AgentScorer/VersionPipeline 工具层、nrf-dev/esp32-dev/market-* 新角色)
- 清除所有 /data/rockchip 路径引用 → /data/company(源码+测试+前端)
- 保留 "Rockchip" 芯片厂商名作为技术描述(hw_engineer/algo_vision 等)
- docs/plans/ 历史文档保持原样(反映当时路径状态)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-10 08:58:39 +08:00
co-authored by Claude Opus 4.6
parent df59fc0c83
commit bbea70dc9c
9 changed files with 317 additions and 320 deletions
+101 -60
View File
@@ -4,20 +4,20 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
## 项目概述
NMFS Agents:基于 Claude CLI 的 AI 项目自动化维护与调研系统。支持代码修复、板端测试、成熟度评估、架构整合、市场洞察与基础技术调研,运行在 RK3588 NPU 开发平台
NMFS Agents:基于 Claude CLI 的 AI 多角色自动化系统。通过 30+ Agent 协作完成代码修复、板端测试、成熟度评估、架构整合、市场洞察与基础技术调研,支持 RK3588/RK3566 NPU 开发平台及 nRF54L15/ESP32S3 扩展平台
## 目录约定
```
src/ # 包源码(Python 包)
tests/ # pytest 单元测试
src/ # 包源码(Python 包 nmfs_agents
tests/ # pytest 单元测试314+
scripts/ # 工具脚本(run.py CLI 入口、start_daemon.sh 等)
configs/ # projects.yaml / agents.yaml / devices.yaml
configs/ # projects.yaml / agents.yaml / devices.yaml / org.yaml
data/ # 运行时数据(tasks.db / insight_tasks.db / base_opt_tasks.db / task_logs/
logs/ # daemon 日志(daemon_*.log, daemon.pid
tmp/ # 临时文件,使用后删除
venv/ # Python 虚拟环境(不入仓)
dashboard/ # React 前端源码
dashboard/ # React 前端源码Vite + Tailwind
README.md # 快速开始
DEVELOP.md # 开发指南
RELEASE.md # 发布记录
@@ -26,14 +26,14 @@ RELEASE.md # 发布记录
## 环境
```bash
# 创建虚拟环境(Python 3.10,兼容 rknn-toolkit2
# 创建虚拟环境(Python 3.10
python3.10 -m venv venv && source venv/bin/activate
pip install -e ".[dev]"
```
- **x86 开发机**rknn-toolkit2 2.3.2ONNX→RKNN 转换、仿真),Python 3.10
- **x86 开发机**Python 3.10rknn-toolkit2 2.3.2ONNX→RKNN 转换
- **rk3566 设备**(算法默认):orangepi@192.168.123.183OrangePi
- **rk3588 设备**(高性能):pi@192.168.123.181NanoPC-T6
- **rk3588 设备**(高性能):pi@192.168.123.137NanoPC-T6
## 认证
@@ -44,27 +44,13 @@ Agent 以子进程调用 `claude --print`,优先使用 CLI OAuth`claude log
## 常用命令
```bash
# 环境激活
source venv/bin/activate
# 运行测试
pytest tests/ -q
# 后台启动调度器
bash scripts/start_daemon.sh
# 监控状态
bash scripts/watch_daemon.sh
python scripts/run.py status
# 扫描预览(不执行)
python scripts/run.py scan
# 执行下一个任务(须在普通终端执行)
python scripts/run.py run-next
# 查看任务队列
sqlite3 data/tasks.db "SELECT id,project,agent_role,title,status FROM tasks ORDER BY id DESC LIMIT 10;"
pytest tests/ -q # 运行测试
bash scripts/start_daemon.sh # 后台启动调度器
bash scripts/watch_daemon.sh # 监控状态
python scripts/run.py status # 查看任务状态
python scripts/run.py scan # 扫描预览(不执行)
python scripts/run.py run-next # 执行下一个任务(须在普通终端)
```
## 项目结构
@@ -78,8 +64,11 @@ src/nmfs_agents/
│ ├── productizer.py # Productizer Agent(成熟度评分,规则引擎)
│ ├── architect.py # Architect Agent(跨项目分析)
│ ├── manager.py # Manager Agent(顶层协调)
│ ├── planner.py # Planner Agent市场洞察规划)
│ ├── market_pm.py # MarketPm Agent(市场分析)
│ ├── planner.py # Planner Agent差距分析规划)
│ ├── market_pm.py # MarketPm Agent(市场分析基类
│ ├── market_sport.py # MarketSport Agent(运动健康市场)
│ ├── market_elder.py # MarketElder Agent(适老辅助市场)
│ ├── market_safety.py # MarketSafety AgentAI安全市场)
│ ├── vision_analyst.py # VisionAnalyst Agent(视觉分析)
│ ├── media_producer.py # MediaProducer Agent(内容生产)
│ ├── rtp_researcher.py # RTP/RTCP 调研
@@ -94,12 +83,19 @@ src/nmfs_agents/
│ ├── base_validator.py # 基础架构验证
│ ├── algo_antishake.py # 防抖算法专项
│ ├── algo_position.py # 定位算法专项
── algo_nav.py # 导航算法专项
── algo_nav.py # 导航算法专项
│ ├── algo_vision.py # 视觉算法组基类
│ ├── nrf_dev.py # nRF54L15 平台开发(运动健康)
│ ├── esp32_dev.py # ESP32S3 平台开发(适老辅助)
│ ├── boss.py # Boss Agent(战略决策)
│ ├── group_leader.py # GroupLeader Agent(部门长)
│ ├── senior_dev.py # SeniorDev Agent(高级研发)
│ └── ops.py # Ops Agent(巡检)+ OpsHub(事件消费)
├── core/
│ ├── scanner.py # 项目扫描器(README/TODO/CLAUDE.md
│ ├── queue.py # SQLite 任务队列(原子 dequeue6 种状态)
│ ├── executor.py # asyncio 并发调度(semaphore 限流,agent_role 路由)
│ ├── scheduler.py # APScheduler 定时入口(多队列)
│ ├── scheduler.py # APScheduler 定时入口(多队列 + EventBus
│ └── watchdog.py # 超时检测 + 优先级防饥饿
└── tools/
├── feishu.py # 飞书通知
@@ -110,11 +106,33 @@ src/nmfs_agents/
├── arch_version.py # 架构优化版本管理(snapshot/promote/rollback
├── project_discovery.py # 非硬编码项目发现
├── project_memory.py # 项目记忆(goals/facts/history SQLite
── env_collector.py # 板端环境信息采集
configs/ # projects.yaml / agents.yaml / devices.yaml
data/tasks.db # project_delivery 队列(运行时生成
data/base_opt_tasks.db # base_opt 队列
data/insight_tasks.db # insight 队列
── env_collector.py # 板端环境信息采集
├── event_bus.py # Redis Streams 事件总线(5 consumer groups
├── daily_report.py # 日报系统(append-only SQLite + Boss 决策视图
├── agent_score.py # Agent 评分系统(4 维度:完成/质量/自主/协作)
├── version_pipeline.py # 并行版本流水线(反幻觉门控)
└── knowledge_base.py # 知识库(组织架构 + 项目 facts 聚合)
```
## 组织架构(org v2
```
Boss(战略决策,周报)
├── 基础技术部(os-base-leader
│ ├── base-architect / base-validator / hw-engineer
│ ├── os-engineer / dev-kernel / dev-lowlevel / system-tester
│ ├── 算法组:algo-antishake / algo-position / algo-nav
│ ├── 调研组:rtp-researcher / net-researcher / kernel-analyzer
│ └── 平台扩展:nrf-dev / esp32-dev
├── 市场洞察部(market-leader
│ ├── market-pm(通用)
│ └── market-sport / market-elder / market-safety(专项)
├── 项目交付部
│ ├── architect / developer / tester
│ └── planner / productizer / vision-analyst / media-producer
└── Ops(独立运营,星形枢纽)
├── OpsAgent:每日巡检(AI 推理)
└── OpsHub:事件消费 → 日报写入(纯逻辑,快)
```
## Agent 角色路由
@@ -136,15 +154,20 @@ data/insight_tasks.db # insight 队列
| `algo-position` | AlgoPositionAgent | R | W | 定位算法专项 |
| `algo-nav` | AlgoNavAgent | R | W | 导航算法专项 |
### 基础技术组补充project_delivery 队列,技术专项
### 调研专项project_delivery 队列,`__research__.*` 记忆域
> 属于基础技术组的架构师/高级研发,有独立的专项记忆域(`__research__.*`
| agent_role | Agent 类 | 记忆域 | 用途 |
|-----------|---------|------|------|
| `rtp-researcher` | RtpResearcherAgent | `__research__.rtp.*` | RTP/RTCP 协议调研 |
| `net-researcher` | NetResearcherAgent | `__research__.net.*` | 网络栈优化调研 |
| `kernel-analyzer` | KernelAnalyzerAgent | `__research__.kernel.*` | 内核调度分析 |
| agent_role | Agent 类 | goals | facts | 记忆域 | 用途 |
|-----------|---------|:---:|:---:|------|------|
| `rtp-researcher` | RtpResearcherAgent | R | W | `__research__.rtp.*` | RTP/RTCP 协议调研 |
| `net-researcher` | NetResearcherAgent | R | W | `__research__.net.*` | 网络栈优化调研 |
| `kernel-analyzer` | KernelAnalyzerAgent | R | W | `__research__.kernel.*` | 内核调度分析 |
### 平台扩展(project_delivery 队列)
| agent_role | Agent 类 | 用途 |
|-----------|---------|------|
| `nrf-dev` | NrfDevAgent | nRF54L15 / BLE 5.4 / Zephyr(运动健康) |
| `esp32-dev` | Esp32DevAgent | ESP32S3 / mmWave(适老辅助) |
### 项目交付组(project_delivery 队列)
@@ -152,22 +175,47 @@ data/insight_tasks.db # insight 队列
|-----------|---------|:---:|:---:|------|
| `architect` | ArchitectAgent | W | W | 跨项目架构分析 |
| `developer` | DeveloperAgent | R | R | 代码修复/重构(默认) |
| `dev-refactor` | DeveloperAgent | R | R | 重构专项 |
| `dev-embedded` | DeveloperAgent | R | R | 嵌入式固件 |
| `tester` | TesterAgent | R | R | 本地+板端测试 |
| `market-pm` | MarketPmAgent | R | W | 市场分析(兼 insight|
### 产品洞察组(insight 队列)
| agent_role | Agent 类 | goals | facts | 用途 |
|-----------|---------|:---:|:---:|------|
| `planner` | PlannerAgent | R | W | 差距分析,洞察任务规划 |
| `productizer` | ProductizerAgent | W | W | 成熟度评估(100分制) |
| `vision-analyst` | VisionAnalystAgent | R | W | 视觉效果分析 |
| `media-producer` | MediaProducerAgent | R | R | 技术内容生产 |
| agent_role | Agent 类 | 用途 |
|-----------|---------|------|
| `planner` | PlannerAgent | 差距分析,洞察任务规划 |
| `productizer` | ProductizerAgent | 成熟度评估(100分制) |
| `vision-analyst` | VisionAnalystAgent | 视觉效果分析 |
| `media-producer` | MediaProducerAgent | 技术内容生产 |
### 市场专项(insight 队列)
| agent_role | Agent 类 | 记忆域 | 用途 |
|-----------|---------|------|------|
| `market-pm` | MarketPmAgent | `__market__.*` | 市场分析(通用) |
| `market-sport` | MarketSportAgent | `__market__.sport.*` | 运动健康市场 |
| `market-elder` | MarketElderAgent | `__market__.elder.*` | 适老辅助市场 |
| `market-safety` | MarketSafetyAgent | `__market__.safety.*` | AI 安全市场 |
### 组织管理层
| agent_role | Agent 类 | 用途 |
|-----------|---------|------|
| `boss` | BossAgent | 战略决策,周报 |
| `os-base-leader` | GroupLeaderAgent | 基础技术部部门长 |
| `vision-algo-leader` | GroupLeaderAgent | 视觉算法组组长 |
| `senior-dev` | SeniorDevAgent | 高级研发(跨组支援) |
| `ops` | OpsAgent | 项目健康巡检 + 文档维护 |
> W=可写 R=只读 | goals/facts 写权限受 `WRITE_ROLES` 常量约束(project_memory.py
## 事件总线与日报
- **EventBus**`tools/event_bus.py`):Redis Streamsexecutor 任务完成/失败自动发布事件
- **Consumer Groups**ops-hub / leader-os-base / leader-vision-algo / leader-market / boss
- **OpsHub**`agents/ops.py`):消费事件 → 写入 DailyReport,重大事件广播 leader
- **DailyReport**`tools/daily_report.py`):append-only SQLite,时间线 + Boss 决策视图
- **AgentScorer**`tools/agent_score.py`):4 维评分(完成度 40% + 质量 30% + 自主性 20% + 协作 10%
- **VersionPipeline**`tools/version_pipeline.py`):反幻觉门控,dev agent 只能 start_testingtester 才能 mark_done/mark_failed
## 编码规范
- `from __future__ import annotations`(保持跨版本兼容)
@@ -175,10 +223,3 @@ data/insight_tasks.db # insight 队列
- 日志使用 `logging` 模块,不使用 `print`
- 命名:类 `PascalCase`,函数/变量 `snake_case`,常量 `UPPER_CASE`
- 测试放 `tests/`,调试 demo 放 `tmp/` 并确认后删除
## RK3588 关键技术
- NPU 三核并行:`core_mask=RKNNLite.NPU_CORE_ALL`(可提升 1.3~1.9x
- RKNN INT8 量化:rknn-toolkit2 对 onnx 版本有限制(需 < 1.17),安装顺序先 rknn-toolkit2 再 onnx
- 平台检测:通过 CPU 架构和设备树自动判断,推理引擎据此选 Toolkit2 或 Lite2
- 可复用推理模块:`/data/rockchip/yolo`(目标检测)、`/data/rockchip/mediapipe`(关键点)、`/data/rockchip/embedding`(向量检索)
+83 -138
View File
@@ -36,29 +36,25 @@ DeveloperAgent.run(task)
"<任务描述>"
],
cwd="<项目路径>",
env={CLAUDECODE 已清除}, # 允许在 Claude Code 会话中嵌套运行
env={CLAUDECODE 已清除},
)
```
**confirm 模式审批机制**:通过 claude-wx hook 基础设施实现,每个 Write/Edit/Bash 工具调用前均发飞书卡片请求审批,而非任务级一次性审批。环境变量 `CLAUDE_WX_AGENT_MODE=default` 触发此行为。
### 任务队列状态机
```
pending → running → done
→ failed
→ waiting_approval → done(审批通过后 callback 触发)
→ failed(审批拒绝)
→ vetoed → pending(否决后重入队,带否决原因)
→ waiting_approval → done / failed / vetoed → pending
```
### 多队列架构
```
scheduler.py
├─> project_delivery 队列(tasks.db ─> 项目开发/研究类任务
├─> project_delivery 队列(tasks.db ─> 项目开发/研究/管理类任务
├─> base_opt 队列(base_opt_tasks.db ─> 算法/硬件优化类任务
└─> insight 队列(insight_tasks.db ─> 洞察/分析类任务
└─> insight 队列(insight_tasks.db ─> 洞察/分析/市场类任务
```
每个队列独立的 `role_filter` 确保任务只被有资格的 Agent 执行。
@@ -70,9 +66,30 @@ Scanner.scan_all() # 扫描 README/TODO/CLAUDE.md
└─> TaskQueue.enqueue() # SQLiteBEGIN EXCLUSIVE 原子操作,去重
└─> Executor.run_all_pending() # asyncio Semaphore 限流并发
├─> _make_agent(role) # 按 agent_role 路由到对应 Agent
├─> EventBus.publish_task_done/failed() # Redis Streams 事件广播
└─> FeishuNotifier.send_task_result()
```
### EventBus 事件流
```
Executor 任务完成/失败
└─> EventBus.publish() → Redis Stream "nmfs:events"
├─> ops-hub → OpsHub → DailyReport 写入
├─> leader-os-base → 基础技术部部门长
├─> leader-vision-algo → 视觉算法组组长
├─> leader-market → 市场洞察部
└─> boss → Boss 战略决策
```
### 反幻觉门控(VersionPipeline
```
Dev Agent 开发完毕 → vp.start_testing() ← Dev 只能到这一步
TesterAgent 测试 → vp.mark_done() ← 只有 Tester 能标记完成
→ vp.mark_failed() ← 只有 Tester 能标记失败
```
## Web Dashboard
Dashboard 是首选操作入口,访问地址:`http://localhost:9080`Docker 环境同端口)。
@@ -81,50 +98,21 @@ Dashboard 是首选操作入口,访问地址:`http://localhost:9080`Docke
| 标签页 | 功能 |
|--------|------|
| 看板(Kanban) | 按项目查看任务状态(待处理/运行中/完成/失败),可拖拽调整优先级 |
| 洞察(Insight) | 市场目标卡片(运动/适老/AI安全)+ 基础技术调研展示 + 历史记录 |
| 配置(Config) | 查看/编辑全局和项目级 CLAUDE.md / README.md,触发 CLAUDE.md 刷新 |
### 常见操作
**提交开发需求**(点击右上角「提交需求」):
- 选择项目 → 选择类型(修复问题/新功能/代码审查等)→ 填写描述 → 提交
- 提交后自动路由到 `project_delivery` 队列
**发起技术攻关**
- 需求类型选「技术攻关」→ 选择角色(RTP/网络栈/内核调度/OS/硬件)→ 填写描述 → 提交
- 自动路由到 `base_opt` 队列;调研结论写入 `__research__.*`,洞察页自动展示
**触发市场洞察**(洞察页):
- 点击目标卡片的「触发洞察」按钮 → insight 队列入队 → market-pm 执行
- 调研结论写入 `__market__.{goal}.*`,目标卡片下次刷新时自动更新
**刷新项目指导**(配置页,选中项目后可见):
- 点击「🔄 刷新项目指导」→ 创建 `architect` 任务 → Agent 综合调研结论自动重写 CLAUDE.md
| 看板(Kanban) | 按项目查看任务状态,可拖拽调整优先级 |
| 洞察(Insight) | 市场目标卡片(运动/适老/AI安全)+ 基础技术调研 |
| 日报(Daily) | 时间线视图(全部事件)+ Boss 决策视图(组织健康 + 待决策) |
| 配置(Config | 查看/编辑 CLAUDE.md / README.md,触发 CLAUDE.md 刷新 |
## 常用命令
```bash
# 查看任务状态(多队列)
python scripts/run.py status
# 后台启动调度器
bash scripts/start_daemon.sh
# 监控日志
bash scripts/watch_daemon.sh
# 预览扫描结果(只打印,不入队)
python scripts/run.py scan
# 执行队列中下一个任务(须在普通终端执行)
python scripts/run.py run-next
# 入队三专项调研任务(须在普通终端执行)
python scripts/run.py research
# 全量测试
pytest tests/ -q
python scripts/run.py status # 查看任务状态(多队列)
bash scripts/start_daemon.sh # 后台启动调度器
bash scripts/watch_daemon.sh # 监控日志
python scripts/run.py scan # 预览扫描结果
python scripts/run.py run-next # 执行下一个任务(须在普通终端)
python scripts/run.py research # 入队三专项调研(须在普通终端)
pytest tests/ -q # 全量测试
```
## 调试
@@ -132,13 +120,8 @@ pytest tests/ -q
### 查看任务队列
```bash
# project_delivery 队列
sqlite3 data/tasks.db "SELECT id,project,agent_role,title,status FROM tasks ORDER BY id DESC LIMIT 20;"
# base_opt 队列
sqlite3 data/base_opt_tasks.db "SELECT id,project,agent_role,title,status FROM tasks ORDER BY id DESC LIMIT 10;"
# insight 队列
sqlite3 data/insight_tasks.db "SELECT id,project,agent_role,title,status FROM tasks ORDER BY id DESC LIMIT 10;"
```
@@ -169,27 +152,19 @@ EOF
|------|---------|--------|
| `README.md``## 已知问题` | 每一行问题 → `fix_bug` 任务 | 2 |
| `.py` 文件中的 `TODO/FIXME/HACK` | 注释 → `code_review` 任务 | 4 |
| `CLAUDE.md` 含 ❌/⚠ 的行 | 约束违反 → `fix_bug` 任务 | 2 |
| `projects.yaml` description 关键词 | 待修复/零检出 → `fix_bug`FPS偏低 → `improve_perf` | 2/3 |
| `CLAUDE.md``❌/⚠` 的行 | 约束违反 → `fix_bug` 任务 | 2 |
| 兜底 | 每个项目固定生成定期代码巡检 | 5 |
自动跳过:`venv`, `.venv`, `.git`, `__pycache__`, `node_modules`, `build`, `dist`
### 架构优化版本管理
```
arch_optimize 任务入队
└─> ArchitectAgent._optimize()
├─ ArchVersion.snapshot() # 备份当前 .py 文件
├─ claude --dangerously-skip-permissions # 应用架构改动
├─ pytest tests/ -q # 验证测试
├─ 通过 → ArchVersion.promote() # 晋升
└─ 失败 → ArchVersion.rollback() # 恢复备份
```
```bash
python scripts/run.py arch-versions yolo # 查看版本历史
python scripts/run.py arch-restore yolo v001 # 手动恢复
├─ ArchVersion.snapshot()
├─ claude --dangerously-skip-permissions
├─ pytest tests/ -q
├─ 通过 → ArchVersion.promote()
└─ 失败 → ArchVersion.rollback()
```
## 添加新项目
@@ -201,7 +176,6 @@ projects:
my-project:
path: /data/company/my-project # 省略则从 scan_dirs 自动发现
mode: auto # auto | confirm | report
description: "项目描述,含待修复/FPS偏低等关键词可自动生成任务"
```
## 添加新 Agent
@@ -216,52 +190,53 @@ projects:
### configs/projects.yaml
```yaml
scan_dirs: # 自动扫描目录(发现项目)
scan_dirs:
- /data/company
exclude_projects: # 跳过的目录名(防止噪音)
- /data/company/algo-base
exclude_projects:
- rknn-toolkit2
projects: # 显式配置(可覆盖自动发现的项目)
- agents
projects:
my-project:
path: /data/company/my-project
mode: confirm
description: "项目描述"
```
### configs/agents.yaml
```yaml
scheduler:
interval_hours: 1 # 扫描间隔
max_concurrent: 3 # 全局最大并发
interval_hours: 1
max_concurrent: 3
queues:
project_delivery:
db: data/tasks.db
max_concurrent: 3
scan_interval_hours: 1
roles: # 仅执行此列表中角色的任务
- developer
- architect
roles: [developer, architect, tester, rtp-researcher, ...]
base_opt:
db: data/base_opt_tasks.db
max_concurrent: 2
roles: [algo-antishake, algo-position, ...]
insight:
db: data/insight_tasks.db
max_concurrent: 2
roles: [planner, productizer, market-pm, ...]
```
### configs/devices.yaml
```yaml
devices:
rk3566: # 算法默认验证设备
type: linux
connect: ssh
rk3566:
host: 192.168.123.183
user: orangepi
password: "orangepi"
workspace: /home/orangepi/Desktop
rk3588: # 高性能验证设备
type: linux
connect: ssh
host: 192.168.123.181
rk3588:
host: 192.168.123.137
user: pi
password: "123123"
password: "pi"
workspace: /home/pi/Desktop
pre_cmd: "clashon && clashproxy on"
```
## 环境变量
@@ -270,48 +245,34 @@ devices:
|------|------|------|
| `ANTHROPIC_API_KEY` | Claude API 密钥(已 `claude login` 则不需要) | 否 |
| `FEISHU_WEBHOOK_URL` | 飞书 Webhook,任务结果通知 | 否 |
| `FEISHU_BOT_TOKEN` | 飞书 Bot Tokenconfirm 模式 hook 审批需要 | 否 |
| `DB_PATH` | 任务数据库路径(默认 `data/tasks.db` | 否 |
| `DASHBOARD_PORT` | Dashboard 端口(默认 8080 | 否 |
## API 端点参考
Dashboard 后端 FastAPI,主要端点:
| 方法 | 路径 | 说明 |
|------|------|------|
| GET | `/api/tasks` | 获取任务列表(支持 `?project=` 过滤) |
| POST | `/api/tasks` | 创建任务(`queue` 字段路由到不同数据库 |
| GET | `/api/tasks` | 获取任务列表 |
| POST | `/api/tasks` | 创建任务(`queue` 字段路由) |
| PATCH | `/api/tasks/{id}` | 更新优先级 |
| POST | `/api/tasks/{id}/retry` | 重试失败任务 |
| POST | `/api/tasks/{id}/cancel` | 取消任务 |
| POST | `/api/tasks/{id}/approve` | 审批 waiting_approval 任务 |
| POST | `/api/tasks/{id}/reject` | 拒绝任务(附原因) |
| GET | `/api/projects` | 获取项目列表 |
| POST | `/api/projects/import` | 导入新项目 |
| DELETE | `/api/projects/{name}` | 删除项目 |
| GET | `/api/projects/{name}/config` | 获取项目 CLAUDE.md / README.md |
| PUT | `/api/projects/{name}/config/{type}` | 保存配置文件(`claude`/`readme` |
| POST | `/api/projects/{name}/refresh-claude-md` | 触发 architect 更新 CLAUDE.md |
| GET | `/api/config/global` | 获取全局 CLAUDE.md |
| PUT | `/api/config/global` | 保存全局 CLAUDE.md |
| GET | `/api/market/facts` | 获取市场洞察 facts`__market__.*` |
| POST | `/api/market/trigger/{goal}` | 触发市场洞察任务 |
| GET | `/api/market/history` | 获取洞察任务历史 |
| GET | `/api/research/facts` | 获取三专项调研 facts`__research__.*` |
| GET | `/api/executor/status` | 执行器状态 |
| POST | `/api/executor/start` | 启动执行器 |
| POST | `/api/executor/stop` | 停止执行器 |
| GET | `/api/market/facts` | 市场洞察 facts |
| POST | `/api/market/trigger/{goal}` | 触发市场洞察 |
| GET | `/api/research/facts` | 三专项调研 facts |
| GET | `/api/daily/timeline` | 日报时间线 |
| GET | `/api/daily/boss` | Boss 决策视图 |
| GET | `/api/daily/dates` | 可用日期列表 |
| GET | `/api/daily/scores` | Agent 评分 |
### 队列路由规则
`POST /api/tasks``queue` 字段:
### 队列路由
| queue 值 | 路由到 | 典型 agent_role |
|----------|--------|-----------------|
| `project_delivery`(默认)| `data/tasks.db` | developer / architect |
| `base_opt` | `data/base_opt_tasks.db` | rtp-researcher / kernel-analyzer / hw-engineer |
| `insight` | `data/insight_tasks.db` | market-pm / planner / productizer |
| `project_delivery`(默认)| `data/tasks.db` | developer / architect / boss / ops |
| `base_opt` | `data/base_opt_tasks.db` | algo-* / hw-engineer / os-engineer |
| `insight` | `data/insight_tasks.db` | market-* / planner / productizer |
## 项目记忆系统
@@ -320,34 +281,18 @@ Dashboard 后端 FastAPI,主要端点:
| 层 | 读写规则 |
|----|---------|
| goals(目标) | 仅 productizer/architect 可写 |
| facts(事实) | 任意 agentarchitect 通过 `[记忆]` 标签写入 |
| facts(事实) | 任意 agent;通过 `[记忆]` 标签写入 |
| history(历史) | executor 每次任务完成/失败后自动写入 |
### 特殊 facts 命名约定
| key 前缀 | 写入者 | 用途 | Dashboard 展示位置 |
|----------|--------|------|-------------------|
| `__research__.rtp.*` | rtp-researcher | RTP/RTCP 调研结论 | 洞察页"基础技术调研" |
| `__research__.net.*` | net-researcher | 网络栈调优结论 | 洞察页"基础技术调研" |
| `__research__.kernel.*` | kernel-analyzer | 内核调度分析结论 | 洞察页"基础技术调研" |
| `__market__.{goal}.*` | market-pm | 市场洞察结论(goal=运动/适老/AI安全) | 洞察页目标卡片 |
| `__env__.*` | env-collector | 板端硬件/软件环境信息 | Agent 系统提示 |
```bash
python scripts/run.py goals # 查看项目长期目标
python scripts/run.py facts # 查看项目知识事实
python scripts/run.py set-fact embedding api_port "8000"
```
## Claude-WX 集成
| Agent 模式 | CLAUDE_WX_AGENT_MODE | 飞书行为 |
|-----------|---------------------|---------|
| `auto` | `trust` | 工具执行通知,不阻塞 |
| `confirm` | `default` | 每个 Write/Edit/Bash 需飞书逐一审批 |
| `report` | `silent` | 静默,只读工具无需通知 |
配置 `agents.yaml` 中的 `claude_wx_url` 后,Executor 在任务开始/结束时调用 `/agent/task-start``/agent/task-end` 更新飞书调度中心。
| key 前缀 | 写入者 | Dashboard 展示 |
|----------|--------|---------------|
| `__research__.rtp.*` | rtp-researcher | 洞察页"基础技术调研" |
| `__research__.net.*` | net-researcher | 洞察页"基础技术调研" |
| `__research__.kernel.*` | kernel-analyzer | 洞察页"基础技术调研" |
| `__market__.{goal}.*` | market-* | 洞察页目标卡片 |
| `__env__.*` | env-collector | Agent 系统提示 |
## Watchdog
+78 -79
View File
@@ -1,14 +1,14 @@
# NMFS Agents
基于 Claude CLI 的 AI 项目自动化维护与调研系统,运行在 RK3588 NPU 开发平台上。
支持代码修复、板端测试、成熟度评估、架构整合、市场洞察与基础技术调研。
基于 Claude CLI 的 AI 多角色自动化系统。30+ Agent 协作完成代码修复、板端测试、
成熟度评估、架构整合、市场洞察与基础技术调研。
## 组织架构
```
AI 自动化平台
Boss(战略决策,周报)
├── 基础技术组(base_opt + project_delivery 队列
├── 基础技术部(os-base-leader
│ ├── 架构设计 base-architect — 平台架构整合,跨组技术决策
│ ├── 架构验证 base-validator — 基准测试,架构方案验证
│ ├── 硬件工程 hw-engineer — 硬件选型,功耗/算力权衡
@@ -18,68 +18,72 @@ AI 自动化平台
│ ├── 系统测试 system-tester — 集成测试,端到端验证
│ ├── 算法专项
│ │ ├── algo-antishake 防抖算法(IMU/滤波/卡尔曼)
│ │ ├── algo-position 定位算法(GNSS/视觉里程计
│ │ ├── algo-position 定位算法(UWB/BLE/视觉
│ │ └── algo-nav 导航算法(路径规划/避障)
── 技术专项(架构师/高级研发,有独立专项记忆
├── rtp-researcher — RTP/RTCP 实时传输协议__research__.rtp.*
├── net-researcher — 网络栈优化调研(__research__.net.*
└── kernel-analyzer — 内核调度分析__research__.kernel.*
── 技术调研(有独立专项记忆 __research__.*
├── rtp-researcher — RTP/RTCP 实时传输协议
├── net-researcher — 网络栈优化
└── kernel-analyzer — 内核调度分析
│ └── 平台扩展
│ ├── nrf-dev — nRF54L15 / BLE 5.4 / Zephyr(运动健康)
│ └── esp32-dev — ESP32S3 / mmWave(适老辅助)
├── 项目交付组(project_delivery 队列,1h 扫描
│ ├── architect — 跨项目架构分析,技术债识别
│ ├── developer — 代码修复/重构(含 dev-refactor/dev-embedded
── tester 本地 pytest + 板端 SSH 测试
├── 市场洞察部(market-leader
│ ├── market-pm — 市场分析(通用)
│ ├── market-sport — 运动健康专项
── market-elder适老辅助专项
│ └── market-safety — AI 安全专项
── 产品洞察组(insight 队列,6h 扫描)
├── planner — 差距分析,洞察任务规划
├── productizer — 成熟度评估(100分制,规则引擎)
├── market-pm — 市场分析,竞品调研,众筹追踪
├── vision-analyst — 视觉效果分析,截图回归
── media-producer — 技术内容生产
── 项目交付部
├── architect — 跨项目架构分析
├── developer — 代码修复/重构
├── tester — 本地 pytest + 板端 SSH 测试
├── planner — 差距分析,洞察任务规划
── productizer 成熟度评估(100分制)
│ ├── vision-analyst — 视觉效果分析
│ └── media-producer — 技术内容生产
└── Ops(独立运营,星形枢纽)
├── OpsAgent — 每日巡检,项目健康评分
└── OpsHub — EventBus 事件消费 → 日报写入
```
## 人员矩阵
| 角色 | 所属组 | 队列 | memory goals | memory facts | 设备访问 | 主要项目 |
|------|--------|------|:---:|:---:|:---:|------|
| base-architect | 基础技术 | base_opt | W | W | ─ | 跨平台架构 |
| base-validator | 基础技术 | base_opt | R | W | rk3566/rk3588 | 算法验证 |
| hw-engineer | 基础技术 | base_opt | R | W | ─ | 硬件设计 |
| os-engineer | 基础技术 | base_opt | R | W | rk3566/rk3588 | OS 调优 |
| dev-kernel | 基础技术 | base_opt | R | W | rk3566/rk3588 | 内核驱动 |
| dev-lowlevel | 基础技术 | base_opt | R | W | rk3566/rk3588 | 嵌入式固件 |
| system-tester | 基础技术 | base_opt | R | W | rk3566/rk3588 | 集成测试 |
| algo-antishake | 基础技术 | base_opt | R | W | rk3566(默认)| algo-base |
| algo-position | 基础技术 | base_opt | R | W | rk3566(默认)| algo-base |
| algo-nav | 基础技术 | base_opt | R | W | rk3566(默认)| algo-base |
| rtp-researcher | 基础技术 | project_delivery | R | W | ─ | rtp-research |
| net-researcher | 基础技术 | project_delivery | R | W | ─ | net-research |
| kernel-analyzer | 基础技术 | project_delivery | R | W | ─ | kernel-analysis |
| architect | 项目交付 | project_delivery | W | W | ─ | 全项目 |
| developer | 项目交付 | project_delivery | R | R | ─ | 全项目 |
| tester | 项目交付 | project_delivery | R | R | rk3566/rk3588 | 全项目 |
| planner | 产品洞察 | insight | R | W | ─ | insight |
| productizer | 产品洞察 | insight | W | W | ─ | 全项目 |
| market-pm | 产品洞察 | insight | R | W | ─ | 市场调研 |
| vision-analyst | 产品洞察 | insight | R | W | rk3566/rk3588 | 视觉验证 |
| media-producer | 产品洞察 | insight | R | R | ─ | 内容输出 |
| 角色 | 所属组 | 队列 | memory | 设备 |
|------|--------|------|:---:|:---:|
| base-architect | 基础技术 | base_opt | W/W | ─ |
| base-validator | 基础技术 | base_opt | R/W | rk3566/rk3588 |
| hw-engineer | 基础技术 | base_opt | R/W | ─ |
| os-engineer | 基础技术 | base_opt | R/W | rk3566/rk3588 |
| dev-kernel | 基础技术 | base_opt | R/W | rk3566/rk3588 |
| dev-lowlevel | 基础技术 | base_opt | R/W | rk3566/rk3588 |
| system-tester | 基础技术 | base_opt | R/W | rk3566/rk3588 |
| algo-antishake | 基础技术 | base_opt | R/W | rk3566 |
| algo-position | 基础技术 | base_opt | R/W | rk3566 |
| algo-nav | 基础技术 | base_opt | R/W | rk3566 |
| rtp-researcher | 基础技术 | project_delivery | R/W | ─ |
| net-researcher | 基础技术 | project_delivery | R/W | ─ |
| kernel-analyzer | 基础技术 | project_delivery | R/W | ─ |
| nrf-dev | 基础技术 | project_delivery | R/W | ─ |
| esp32-dev | 基础技术 | project_delivery | R/W | ─ |
| architect | 项目交付 | project_delivery | W/W | ─ |
| developer | 项目交付 | project_delivery | R/R | ─ |
| tester | 项目交付 | project_delivery | R/R | rk3566/rk3588 |
| planner | 产品洞察 | insight | R/W | ─ |
| productizer | 产品洞察 | insight | W/W | ─ |
| market-pm | 市场洞察 | insight | R/W | ─ |
| market-sport | 市场洞察 | insight | R/W | ─ |
| market-elder | 市场洞察 | insight | R/W | ─ |
| market-safety | 市场洞察 | insight | R/W | ─ |
| vision-analyst | 产品洞察 | insight | R/W | rk3566/rk3588 |
| media-producer | 产品洞察 | insight | R/R | ─ |
| boss | 管理层 | project_delivery | R/W | ─ |
| os-base-leader | 管理层 | project_delivery | R/W | ─ |
| senior-dev | 管理层 | project_delivery | R/W | ─ |
| ops | 独立运营 | project_delivery | R/W | ─ |
> W=可写 R=只读 ─=不访问 | 设备rk3566=192.168.123.183rk3588=192.168.123.181
## 托管项目
| 项目 | 路径 | 模式 | 主要负责组 |
|------|------|------|-----------|
| yolo | /data/company/yolo | confirm | 项目交付 |
| mediapipe | /data/company/mediapipe | auto | 项目交付 |
| embedding | /data/company/embedding | report | 项目交付 |
| info-privacy | /data/company/info-privacy | confirm | 项目交付 |
| logodetect-x86 | /data/company/logodetect-x86 | auto | 项目交付 |
| rtp-research | /data/company/os-base/rtp-research | auto | 调研 |
| net-research | /data/company/os-base/net-research | auto | 调研 |
| kernel-analysis | /data/company/os-base/kernel-analysis | auto | 调研 |
| claude-wx | /data/company/claude-wx | auto | 项目交付 |
| ui-tars | /data/company/ui-tars | auto | 基础技术 |
> memory 格式:goals/factsW=可写 R=只读| 设备:rk3566=192.168.123.183rk3588=192.168.123.137
## 快速开始
@@ -93,33 +97,28 @@ python scripts/run.py status # 查看任务状态
## 工作原理
系统有两条触发路径,均汇入同一个三队列执行引擎:
```
┌─ Web Dashboard主操作入口,http://localhost:9080)────────────────────────┐
│ 提交需求(修复/重构/文档) → project_delivery 队列 → developer/architect│
│ 技术攻关RTP/网络/内核) → base_opt 队列 → 专项研究 Agent │
│ 触发市场洞察 → insight 队列 → market-pm/planner │
刷新项目指导(CLAUDE.md → project_delivery 队列 → architect 分析写入
└────────────────────────────────────────────────────────────────────────────
┌─ Web Dashboardhttp://localhost:9080)──────────────────────────────────
│ 提交需求 → project_delivery 队列 → developer/architect
│ 技术攻关 → base_opt 队列 → 专项研究 Agent
│ 触发市场洞察 → insight 队列 → market-*/planner
查看日报 → /api/daily/* → 时间线 + Boss 决策视图
└──────────────────────────────────────────────────────────────────────────┘
┌─ APScheduler(定时自动)───────────────────────────────────────────────────
│ Scanner 扫描 README/TODO/CLAUDE.md → 自动入对应队列(1h/6h 间隔)
└────────────────────────────────────────────────────────────────────────────
┌─ APScheduler(定时自动)────────────────────────────────────────────────┐
│ Scanner 扫描 → 自动入对应队列 | Boss 周报 | Ops 巡检 | 调研/算法轮次
└──────────────────────────────────────────────────────────────────────────┘
↓ 三队列并发执行
↓ 三队列并发执行 + EventBus 事件广播
project_deliverytasks.db ─> developer / architect / tester
base_optbase_opt_tasks.db ─> 算法专项 / 调研 / 硬件优化 Agent
insightinsight_tasks.db ─> market-pm / planner / productizer
project_deliverytasks.db ─> developer / architect / tester / boss / ops
base_optbase_opt_tasks.db ─> 算法 / 调研 / 硬件优化 Agent
insightinsight_tasks.db ─> market-* / planner / productizer
调研结论写入 ProjectMemory
EventBusRedis Streams)→ OpsHub → DailyReport
__research__.rtp.* / __research__.net.* / __research__.kernel.*
└─> Dashboard"基础技术调研"区块自动展示
__market__.{goal}.*(运动 / 适老 / AI安全)
└─> Dashboard"市场洞察"目标卡片自动更新
任务完成/失败 → publish_task_done/failed → 5 consumer groups 消费
Ops 日报自动聚合 → Dashboard 日报 Tab 展示
```
## 执行模式
+45 -33
View File
@@ -1,52 +1,69 @@
# Release Notes
## v0.6.02026-03-10
### 新增
- **组织架构 v2**Boss / GroupLeader / SeniorDev / Ops 四层管理,org.yaml 配置
- **EventBus**Redis Streams 事件总线,5 consumer groupsops-hub/leader-*/boss
- **OpsHub**:事件消费星形枢纽,纯逻辑快速消费 → DailyReport 写入
- **DailyReport**append-only 日报(时间线 + Boss 决策视图),Dashboard 日报 Tab
- **AgentScorer**4 维 Agent 评分(完成度 40% + 质量 30% + 自主性 20% + 协作 10%
- **VersionPipeline 反幻觉门控**dev agent 只能 start_testingtester 才能 mark_done/mark_failed
- **平台扩展 Agent**NrfDevAgentnRF54L15/BLE/Zephyr)、Esp32DevAgentESP32S3/mmWave
- **市场专项化**MarketSportAgent / MarketElderAgent / MarketSafetyAgent 三专项拆分
- **Executor EventBus 集成**:任务完成/失败/崩溃自动发布事件
- **Scheduler EventBus 注入**Redis 可用时自动创建 EventBus,不可用时降级
- **KnowledgeBase**:组织架构 + 项目 facts 聚合,Boss/Leader 上下文注入
- **Dashboard Markdown 渲染修复**react-markdown + remark-gfm 替代 `<pre>` 标签
### 修复
- Executor 崩溃路径缺少 EventBus 事件发布
- OpsHub 类型注解缺失
- `import redis` 从函数体移至文件顶部(try/except 保护)
## v0.5.02026-03-09
### 新增
- **三专项独立项目**rtp-research / net-research / kernel-analysis 从 os-base 拆分为独立项目,各有独立工作目录
- **executor 修复**agent 返回 `status="failed"` 时正确调用 `mark_failed()`,不再错误标记为完成
- **task_logs 权限修复**chown 解决 daemon 以 qiurui 运行但目录 root 所有导致的 Permission denied
- **三专项独立项目**rtp-research / net-research / kernel-analysis 独立工作目录
- **executor 修复**agent 返回 `status="failed"` 时正确调用 `mark_failed()`
- **task_logs 权限修复**chown 解决 Permission denied
## v0.4.02026-03-09
### 新增
- **多队列调度**project_delivery / base_opt / insight 三队列独立 DB、独立并发、独立扫描间隔
- **Dashboard Web UI**FastAPI + React 看板,WebSocket 实时推送,支持 KanbanBoard / InsightView / ConfigView / VisualView
- **市场洞察(InsightView**planner/productizer/vision-analyst/media-producer 角色,前端触发
- **多队列调度**project_delivery / base_opt / insight 三队列独立 DB
- **Dashboard Web UI**FastAPI + React 看板,WebSocket 实时推送
- **市场洞察(InsightView**planner/productizer/vision-analyst/media-producer
- **三专项 Agent**RtpResearcherAgent / NetResearcherAgent / KernelAnalyzerAgent
- **Dashboard Docker 部署**`nmfs-agents-dashboard:latest`,端口 9080
- **rk3566 设备接入**:算法任务默认用 rk3566192.168.123.183验证,rk3588 作为高性能备选
- **rk3566 设备接入**:算法任务默认用 rk3566192.168.123.183
### 修复
- confirm 模式改为 hook 级审批(claude-wx,移除 task-level 审批卡
- visual_tester pip install 后 sys.path 未更新导致 Visual 标签 404
- confirm 模式改为 hook 级审批(claude-wx
- visual_tester sys.path 未更新导致 Visual 标签 404
## v0.3.02026-03-07
### 新增
- **Watchdog**core/watchdog.py60s 间隔检查,running 超 2h → failedpending 超 2h 提升优先级
- **Task 字段扩展**initiator(任务发起人)、discussion(沟通纪要)
- **Dashboard 会议纪要风格**TaskDetail 参与人区 / 沟通纪要区 / 时间线
- **TaskCard 重设计**P1-P5 优先级徽章 + 类型标签 + 发起人→执行者链 + 计时
- **claude-wx 集成**DeveloperAgent 自动注入 CLAUDE_WX_AGENT_MODE / CLAUDE_WX_AGENT,调度中心 task-start/end 事件
- **Watchdog**60s 间隔检查,running 超 2h → failedpending 超 2h 提升优先级
- **Task 字段扩展**initiator / discussion
- **claude-wx 集成**DeveloperAgent 自动注入 CLAUDE_WX_AGENT_MODE
### 修复
- `queue.py mark_vetoed()`retry_count 从 SQLite 读取后类型为字符串,修复 int() 转换
- `queue.py mark_vetoed()`retry_count 类型转换修复
## v0.2.02026-03-05
### 新增
- **ProjectMemory**SQLite 三层记忆(goals/facts/historyarchitect 写目标/事实,executor 写历史
- **EnvCollector**SSH 采集板端模型/包/磁盘信息,注入 Agent 上下文
- **ArchVersion**架构优化快照 → 测试 → promote/rollback 循环
- **ProjectDiscovery**:非硬编码项目发现,扫描父目录或单项目目录
- **os-base 虚拟项目**:基础技术组 RTP/网络/内核调研,任务由调度器直接入队
- **exclude_projects**projects.yaml 支持黑名单,防止大型 SDK 产生噪音
- **algo-base 迁移**:算法专项项目迁移至 /data/company/algo-base
- **ProjectMemory**SQLite 三层记忆(goals/facts/history
- **EnvCollector**SSH 采集板端环境信息
- **ArchVersion**:快照 → 测试 → promote/rollback
- **ProjectDiscovery**:非硬编码项目发现
- **exclude_projects**projects.yaml 黑名单
### 修复
- paramiko lazy init`_get_client()` 延迟创建 client,解决 SOCKS 代理兼容问题
- asyncio 兼容:改用 `get_running_loop().run_in_executor()`
- paramiko lazy initSOCKS 代理兼容
- asyncio `get_running_loop().run_in_executor()`
## v0.1.02026-02-27
@@ -54,18 +71,13 @@
- **多角色 Agent 体系**Developer / Tester / Productizer / Architect / Manager
- **Claude CLI 驱动**`claude --print` 子进程,CLI OAuth 认证
- **三种执行模式**auto / confirm / report
- **SQLite 任务队列**:原子 dequeueBEGIN EXCLUSIVE,优先级排序,去重
- **APScheduler 定时调度**:每小时扫描 + asyncio Semaphore 并发
- **飞书集成**Webhook 通知 + HTTP Callback Server
- **SSH Device Agent**rsync 同步 + 板端 pytest 验证
### 托管项目(初始)
yoloconfirm)、mediapipeauto)、embeddingreport)、info-privacyconfirm)、logodetect-x86auto
- **SQLite 任务队列**:原子 dequeue,优先级排序,去重
- **APScheduler 定时调度**
- **飞书集成** + **SSH Device Agent**
### 发布检查清单
- [ ] `pytest tests/ -q` 全部通过
- [ ] `claude --version` 可用,已通过 `claude login` 认证
- [ ] `configs/agents.yaml` model 字段正确
- [ ] 设备连通性:`ssh orangepi@192.168.123.183 echo ok` / `ssh pi@192.168.123.181 echo ok`
- [ ] 飞书 Webhook 有效(可选)
- [ ] 设备连通性:`ssh orangepi@192.168.123.183 echo ok`
@@ -117,7 +117,7 @@ export function ImportProjectModal({ onClose }: Props) {
value={form.path}
onChange={e => handlePathChange(e.target.value)}
className={inputCls}
placeholder="/data/rockchip/my-project"
placeholder="/data/company/my-project"
/>
</Row>
<Row label="项目名称">
+3 -3
View File
@@ -3,8 +3,8 @@
24小时项目自动化运行测试 - 基于 Playwright 浏览器自动化
用法:
python scripts/test_24h.py --hours 24 --project /data/rockchip/logodetect-x86
python scripts/test_24h.py --hours 1 --project /data/rockchip/logodetect-x86 --dry-run
python scripts/test_24h.py --hours 24 --project /data/company/algo-base/logodetect-x86
python scripts/test_24h.py --hours 1 --project /data/company/algo-base/logodetect-x86 --dry-run
"""
from __future__ import annotations
@@ -318,7 +318,7 @@ def generate_report(
def main() -> None:
parser = argparse.ArgumentParser(description="24h 项目自动化运行测试")
parser.add_argument("--project", default="/data/rockchip/logodetect-x86",
parser.add_argument("--project", default="/data/company/algo-base/logodetect-x86",
help="项目目录路径")
parser.add_argument("--linked", default="/data/test-platform/logo-collect",
help="关联项目路径(用于集成任务)")
+2 -2
View File
@@ -39,9 +39,9 @@ class ProjectDiscovery:
"""Discover Claude-managed projects under a directory tree.
Supports two usage patterns:
- Parent directory (e.g. /data/rockchip): scans subdirectories,
- Parent directory (e.g. /data/company): scans subdirectories,
returns all subdirs that look like Claude projects.
- Single project dir (e.g. /data/rockchip/yolo): returns that project
- Single project dir (e.g. /data/company/yolo): returns that project
directly, ignoring subdirectories.
Embedded vs host detection uses keyword heuristics on CLAUDE.md,
+2 -2
View File
@@ -7,7 +7,7 @@ from nmfs_agents.config import load_config, AgentsConfig
def _write_base_yamls(tmp_path: Path, projects_extra: str = "") -> None:
(tmp_path / "projects.yaml").write_text(
"projects:\n yolo:\n path: /data/rockchip/yolo\n mode: confirm\n"
"projects:\n yolo:\n path: /data/company/yolo\n mode: confirm\n"
+ projects_extra
)
(tmp_path / "agents.yaml").write_text(
@@ -26,7 +26,7 @@ def test_load_config_returns_typed_config(tmp_path):
cfg = load_config(tmp_path)
assert "yolo" in cfg.projects
assert cfg.projects["yolo"].mode == "confirm"
assert cfg.projects["yolo"].path == Path("/data/rockchip/yolo")
assert cfg.projects["yolo"].path == Path("/data/company/yolo")
assert cfg.scheduler.interval_hours == 1
assert cfg.claude.model == "claude-sonnet-4-6"
assert "rk3588" in cfg.devices
+2 -2
View File
@@ -10,14 +10,14 @@ from nmfs_agents.tools.project_memory import ProjectMemory
def test_collect_local_env_vars(tmp_path):
"""collect_local 应收集含 MODEL/RKNN/ONNX 关键词的环境变量。"""
env = {
"RKNN_MODEL_PATH": "/data/rockchip/models",
"RKNN_MODEL_PATH": "/data/company/models",
"HOME": "/home/pi",
"ONNX_WEIGHT_DIR": "/data/weights",
}
with patch.dict(os.environ, env, clear=True):
col = EnvCollector()
facts = col.collect_local(scan_dirs=[])
assert facts.get("local.envvar.RKNN_MODEL_PATH") == "/data/rockchip/models"
assert facts.get("local.envvar.RKNN_MODEL_PATH") == "/data/company/models"
assert facts.get("local.envvar.ONNX_WEIGHT_DIR") == "/data/weights"
assert "local.envvar.HOME" not in facts