firmwareloop 0.1.4__tar.gz → 0.1.5__tar.gz
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.
- {firmwareloop-0.1.4 → firmwareloop-0.1.5}/PKG-INFO +24 -3
- {firmwareloop-0.1.4 → firmwareloop-0.1.5}/README.md +23 -2
- {firmwareloop-0.1.4 → firmwareloop-0.1.5}/firmwareloop.egg-info/PKG-INFO +24 -3
- {firmwareloop-0.1.4 → firmwareloop-0.1.5}/pyproject.toml +1 -1
- {firmwareloop-0.1.4 → firmwareloop-0.1.5}/tools/__init__.py +1 -1
- {firmwareloop-0.1.4 → firmwareloop-0.1.5}/tools/fw_mcp_server.py +107 -7
- {firmwareloop-0.1.4 → firmwareloop-0.1.5}/tools/ndtdbg_cli.py +7 -1
- {firmwareloop-0.1.4 → firmwareloop-0.1.5}/tools/setup-agent-mcp.ps1 +2 -2
- {firmwareloop-0.1.4 → firmwareloop-0.1.5}/LICENSE +0 -0
- {firmwareloop-0.1.4 → firmwareloop-0.1.5}/firmwareloop.egg-info/SOURCES.txt +0 -0
- {firmwareloop-0.1.4 → firmwareloop-0.1.5}/firmwareloop.egg-info/dependency_links.txt +0 -0
- {firmwareloop-0.1.4 → firmwareloop-0.1.5}/firmwareloop.egg-info/entry_points.txt +0 -0
- {firmwareloop-0.1.4 → firmwareloop-0.1.5}/firmwareloop.egg-info/requires.txt +0 -0
- {firmwareloop-0.1.4 → firmwareloop-0.1.5}/firmwareloop.egg-info/top_level.txt +0 -0
- {firmwareloop-0.1.4 → firmwareloop-0.1.5}/setup.cfg +0 -0
- {firmwareloop-0.1.4 → firmwareloop-0.1.5}/tools/acceptance-scenario.ps1 +0 -0
- {firmwareloop-0.1.4 → firmwareloop-0.1.5}/tools/build.ps1 +0 -0
- {firmwareloop-0.1.4 → firmwareloop-0.1.5}/tools/can.ps1 +0 -0
- {firmwareloop-0.1.4 → firmwareloop-0.1.5}/tools/check-qoder-mcp.ps1 +0 -0
- {firmwareloop-0.1.4 → firmwareloop-0.1.5}/tools/common/build-backends.psm1 +0 -0
- {firmwareloop-0.1.4 → firmwareloop-0.1.5}/tools/common/fw.psm1 +0 -0
- {firmwareloop-0.1.4 → firmwareloop-0.1.5}/tools/common/uart_probe.py +0 -0
- {firmwareloop-0.1.4 → firmwareloop-0.1.5}/tools/doctor.ps1 +0 -0
- {firmwareloop-0.1.4 → firmwareloop-0.1.5}/tools/flash.ps1 +0 -0
- {firmwareloop-0.1.4 → firmwareloop-0.1.5}/tools/instrument_cli.py +0 -0
- {firmwareloop-0.1.4 → firmwareloop-0.1.5}/tools/lib/__init__.py +0 -0
- {firmwareloop-0.1.4 → firmwareloop-0.1.5}/tools/lib/instruments.py +0 -0
- {firmwareloop-0.1.4 → firmwareloop-0.1.5}/tools/lib/ndtdbg.py +0 -0
- {firmwareloop-0.1.4 → firmwareloop-0.1.5}/tools/logic_capture.ps1 +0 -0
- {firmwareloop-0.1.4 → firmwareloop-0.1.5}/tools/logic_decode.ps1 +0 -0
- {firmwareloop-0.1.4 → firmwareloop-0.1.5}/tools/ndtdbg_bridge.ps1 +0 -0
- {firmwareloop-0.1.4 → firmwareloop-0.1.5}/tools/reset.ps1 +0 -0
- {firmwareloop-0.1.4 → firmwareloop-0.1.5}/tools/sigrok_csv_to_fwloop.py +0 -0
- {firmwareloop-0.1.4 → firmwareloop-0.1.5}/tools/test-backends.ps1 +0 -0
- {firmwareloop-0.1.4 → firmwareloop-0.1.5}/tools/test.ps1 +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: firmwareloop
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.5
|
|
4
4
|
Summary: AI Agent Firmware Development and Lab Automation Platform (Dual-Tier MCP Server)
|
|
5
5
|
Author-email: WeilinZhang <19523330249@163.com>
|
|
6
6
|
License: MIT
|
|
@@ -119,6 +119,27 @@ uv tool install agentic-hil
|
|
|
119
119
|
|
|
120
120
|
---
|
|
121
121
|
|
|
122
|
+
### 可选:接入 NdtBox 调试盒(公司内部 USB→IIC 调试工具)
|
|
123
|
+
|
|
124
|
+
如需用 Agent 直接操作 NdtBox(固件寄存器读写 / 数据采集 / 逻辑分析仪协议验证),安装后执行一次:
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
# 1) 全局注册各 AI Agent(Antigravity / Claude Code / Qoder),并生成机器级配置模板
|
|
128
|
+
fwloop setup
|
|
129
|
+
|
|
130
|
+
# 2) 指向你的 NdtDebugTool 分发包【根目录】——命令自动定位其 lib/(含 USBIOX.DLL)并写入配置
|
|
131
|
+
fwloop ndtdebugtool "C:/Users/weilin.zhang/Desktop/zwl/NdtDebugTool-v1.0.19"
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
> 完成以上两步后,Agent 侧即可直接调用 NdtBox 相关工具:
|
|
135
|
+
> `fw_ndtdbg_status`(版本/连通性/模组通断)、`fw_ndtdbg_measure`(数据轮询采集)、
|
|
136
|
+
> `fw_ndtdbg_read_reg` / `fw_ndtdbg_write_reg`(任意寄存器读写,写需 `write_allowed` + `confirm` 双门控)、
|
|
137
|
+
> `fw_ndtdbg_capture_seq`(寄存器序列 + Saleae 波形同窗口取证)。
|
|
138
|
+
> 前置硬件要求:NdtBox 已装 CH341 驱动;如需 Saleae 波形证据,另装 sigrok-cli 并配置
|
|
139
|
+
> `libusb-win32` 驱动(详见 `docs/` 交付说明)。测试时请退出 STDataCollection.exe 上位机(USB 独占)。
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
122
143
|
### 第二步:全局注册到各大 AI Agent
|
|
123
144
|
|
|
124
145
|
按你日常使用的 Agent 执行对应的注册命令(全电脑仅需配置一次):
|
|
@@ -338,7 +359,7 @@ claude mcp remove --scope user agentic-hil
|
|
|
338
359
|
├── demo-firmware/ 示例固件(CMake;宿主编译模拟 MCU,闭环验证载体)
|
|
339
360
|
├── demo-make/ 示例固件(Make;构建测试载体)
|
|
340
361
|
├── docs/ DEPENDENCY_MATRIX / REUSE_PLAN / V0.0.2_GAP_VERIFICATION
|
|
341
|
-
├── pyproject.toml 标准 Python 包配置与 CLI 入口声明 (v0.1.
|
|
362
|
+
├── pyproject.toml 标准 Python 包配置与 CLI 入口声明 (v0.1.5)
|
|
342
363
|
├── .mcp.example.json 双层 MCP 配置模板(firmwareloop + agentic-hil)
|
|
343
364
|
├── AGENTS.md 通用智能体规范(Antigravity / Qoder / Cursor 等)
|
|
344
365
|
├── CLAUDE.md Claude Code CLI 指南
|
|
@@ -348,7 +369,7 @@ claude mcp remove --scope user agentic-hil
|
|
|
348
369
|
|
|
349
370
|
---
|
|
350
371
|
|
|
351
|
-
## 能力验证状态(v0.1.
|
|
372
|
+
## 能力验证状态(v0.1.5)
|
|
352
373
|
|
|
353
374
|
> 状态定义:`Implemented`(已实现)/ `Simulator Validated`(模拟验证)/
|
|
354
375
|
> `Real Hardware Validated`(真机验证)/ `Experimental` / `Not Implemented`
|
|
@@ -91,6 +91,27 @@ uv tool install agentic-hil
|
|
|
91
91
|
|
|
92
92
|
---
|
|
93
93
|
|
|
94
|
+
### 可选:接入 NdtBox 调试盒(公司内部 USB→IIC 调试工具)
|
|
95
|
+
|
|
96
|
+
如需用 Agent 直接操作 NdtBox(固件寄存器读写 / 数据采集 / 逻辑分析仪协议验证),安装后执行一次:
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
# 1) 全局注册各 AI Agent(Antigravity / Claude Code / Qoder),并生成机器级配置模板
|
|
100
|
+
fwloop setup
|
|
101
|
+
|
|
102
|
+
# 2) 指向你的 NdtDebugTool 分发包【根目录】——命令自动定位其 lib/(含 USBIOX.DLL)并写入配置
|
|
103
|
+
fwloop ndtdebugtool "C:/Users/weilin.zhang/Desktop/zwl/NdtDebugTool-v1.0.19"
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
> 完成以上两步后,Agent 侧即可直接调用 NdtBox 相关工具:
|
|
107
|
+
> `fw_ndtdbg_status`(版本/连通性/模组通断)、`fw_ndtdbg_measure`(数据轮询采集)、
|
|
108
|
+
> `fw_ndtdbg_read_reg` / `fw_ndtdbg_write_reg`(任意寄存器读写,写需 `write_allowed` + `confirm` 双门控)、
|
|
109
|
+
> `fw_ndtdbg_capture_seq`(寄存器序列 + Saleae 波形同窗口取证)。
|
|
110
|
+
> 前置硬件要求:NdtBox 已装 CH341 驱动;如需 Saleae 波形证据,另装 sigrok-cli 并配置
|
|
111
|
+
> `libusb-win32` 驱动(详见 `docs/` 交付说明)。测试时请退出 STDataCollection.exe 上位机(USB 独占)。
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
94
115
|
### 第二步:全局注册到各大 AI Agent
|
|
95
116
|
|
|
96
117
|
按你日常使用的 Agent 执行对应的注册命令(全电脑仅需配置一次):
|
|
@@ -310,7 +331,7 @@ claude mcp remove --scope user agentic-hil
|
|
|
310
331
|
├── demo-firmware/ 示例固件(CMake;宿主编译模拟 MCU,闭环验证载体)
|
|
311
332
|
├── demo-make/ 示例固件(Make;构建测试载体)
|
|
312
333
|
├── docs/ DEPENDENCY_MATRIX / REUSE_PLAN / V0.0.2_GAP_VERIFICATION
|
|
313
|
-
├── pyproject.toml 标准 Python 包配置与 CLI 入口声明 (v0.1.
|
|
334
|
+
├── pyproject.toml 标准 Python 包配置与 CLI 入口声明 (v0.1.5)
|
|
314
335
|
├── .mcp.example.json 双层 MCP 配置模板(firmwareloop + agentic-hil)
|
|
315
336
|
├── AGENTS.md 通用智能体规范(Antigravity / Qoder / Cursor 等)
|
|
316
337
|
├── CLAUDE.md Claude Code CLI 指南
|
|
@@ -320,7 +341,7 @@ claude mcp remove --scope user agentic-hil
|
|
|
320
341
|
|
|
321
342
|
---
|
|
322
343
|
|
|
323
|
-
## 能力验证状态(v0.1.
|
|
344
|
+
## 能力验证状态(v0.1.5)
|
|
324
345
|
|
|
325
346
|
> 状态定义:`Implemented`(已实现)/ `Simulator Validated`(模拟验证)/
|
|
326
347
|
> `Real Hardware Validated`(真机验证)/ `Experimental` / `Not Implemented`
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: firmwareloop
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.5
|
|
4
4
|
Summary: AI Agent Firmware Development and Lab Automation Platform (Dual-Tier MCP Server)
|
|
5
5
|
Author-email: WeilinZhang <19523330249@163.com>
|
|
6
6
|
License: MIT
|
|
@@ -119,6 +119,27 @@ uv tool install agentic-hil
|
|
|
119
119
|
|
|
120
120
|
---
|
|
121
121
|
|
|
122
|
+
### 可选:接入 NdtBox 调试盒(公司内部 USB→IIC 调试工具)
|
|
123
|
+
|
|
124
|
+
如需用 Agent 直接操作 NdtBox(固件寄存器读写 / 数据采集 / 逻辑分析仪协议验证),安装后执行一次:
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
# 1) 全局注册各 AI Agent(Antigravity / Claude Code / Qoder),并生成机器级配置模板
|
|
128
|
+
fwloop setup
|
|
129
|
+
|
|
130
|
+
# 2) 指向你的 NdtDebugTool 分发包【根目录】——命令自动定位其 lib/(含 USBIOX.DLL)并写入配置
|
|
131
|
+
fwloop ndtdebugtool "C:/Users/weilin.zhang/Desktop/zwl/NdtDebugTool-v1.0.19"
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
> 完成以上两步后,Agent 侧即可直接调用 NdtBox 相关工具:
|
|
135
|
+
> `fw_ndtdbg_status`(版本/连通性/模组通断)、`fw_ndtdbg_measure`(数据轮询采集)、
|
|
136
|
+
> `fw_ndtdbg_read_reg` / `fw_ndtdbg_write_reg`(任意寄存器读写,写需 `write_allowed` + `confirm` 双门控)、
|
|
137
|
+
> `fw_ndtdbg_capture_seq`(寄存器序列 + Saleae 波形同窗口取证)。
|
|
138
|
+
> 前置硬件要求:NdtBox 已装 CH341 驱动;如需 Saleae 波形证据,另装 sigrok-cli 并配置
|
|
139
|
+
> `libusb-win32` 驱动(详见 `docs/` 交付说明)。测试时请退出 STDataCollection.exe 上位机(USB 独占)。
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
122
143
|
### 第二步:全局注册到各大 AI Agent
|
|
123
144
|
|
|
124
145
|
按你日常使用的 Agent 执行对应的注册命令(全电脑仅需配置一次):
|
|
@@ -338,7 +359,7 @@ claude mcp remove --scope user agentic-hil
|
|
|
338
359
|
├── demo-firmware/ 示例固件(CMake;宿主编译模拟 MCU,闭环验证载体)
|
|
339
360
|
├── demo-make/ 示例固件(Make;构建测试载体)
|
|
340
361
|
├── docs/ DEPENDENCY_MATRIX / REUSE_PLAN / V0.0.2_GAP_VERIFICATION
|
|
341
|
-
├── pyproject.toml 标准 Python 包配置与 CLI 入口声明 (v0.1.
|
|
362
|
+
├── pyproject.toml 标准 Python 包配置与 CLI 入口声明 (v0.1.5)
|
|
342
363
|
├── .mcp.example.json 双层 MCP 配置模板(firmwareloop + agentic-hil)
|
|
343
364
|
├── AGENTS.md 通用智能体规范(Antigravity / Qoder / Cursor 等)
|
|
344
365
|
├── CLAUDE.md Claude Code CLI 指南
|
|
@@ -348,7 +369,7 @@ claude mcp remove --scope user agentic-hil
|
|
|
348
369
|
|
|
349
370
|
---
|
|
350
371
|
|
|
351
|
-
## 能力验证状态(v0.1.
|
|
372
|
+
## 能力验证状态(v0.1.5)
|
|
352
373
|
|
|
353
374
|
> 状态定义:`Implemented`(已实现)/ `Simulator Validated`(模拟验证)/
|
|
354
375
|
> `Real Hardware Validated`(真机验证)/ `Experimental` / `Not Implemented`
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
2
|
"""
|
|
3
|
-
fw_mcp_server.py - FirmwareLoop High-Level Workflow & Device MCP Server (v0.1.
|
|
3
|
+
fw_mcp_server.py - FirmwareLoop High-Level Workflow & Device MCP Server (v0.1.5).
|
|
4
4
|
|
|
5
5
|
Exposes high-level firmware engineering and hardware management tools to AI Coding
|
|
6
6
|
Agents (Antigravity CLI, Claude Code CLI, Qoder IDE, Cursor) via the Model Context
|
|
@@ -1433,7 +1433,7 @@ def process_request(req: Dict[str, Any]) -> Optional[Dict[str, Any]]:
|
|
|
1433
1433
|
},
|
|
1434
1434
|
"serverInfo": {
|
|
1435
1435
|
"name": "firmwareloop",
|
|
1436
|
-
"version": "0.1.
|
|
1436
|
+
"version": "0.1.5"
|
|
1437
1437
|
}
|
|
1438
1438
|
}
|
|
1439
1439
|
}
|
|
@@ -1525,7 +1525,7 @@ def process_request(req: Dict[str, Any]) -> Optional[Dict[str, Any]]:
|
|
|
1525
1525
|
def handle_cli_update() -> int:
|
|
1526
1526
|
"""Handle `firmwareloop update` command."""
|
|
1527
1527
|
print("============================================================")
|
|
1528
|
-
print(" FirmwareLoop Auto-Updater (v0.1.
|
|
1528
|
+
print(" FirmwareLoop Auto-Updater (v0.1.5)")
|
|
1529
1529
|
print("============================================================")
|
|
1530
1530
|
|
|
1531
1531
|
is_git_repo = os.path.exists(os.path.join(REPO_ROOT, ".git"))
|
|
@@ -1674,10 +1674,95 @@ def configure_qoder_user_mcp(user_home: str) -> List[Dict[str, Any]]:
|
|
|
1674
1674
|
return results
|
|
1675
1675
|
|
|
1676
1676
|
|
|
1677
|
+
def resolve_ndtdebugtool_lib(tool_root: str) -> str:
|
|
1678
|
+
"""Resolve the NdtDebugTool lib directory (must contain USBIOX.DLL)."""
|
|
1679
|
+
if not tool_root or not os.path.isdir(tool_root):
|
|
1680
|
+
raise ValueError(f"NdtDebugTool 根目录不存在: {tool_root}")
|
|
1681
|
+
lib_cand = os.path.join(tool_root, "lib")
|
|
1682
|
+
if not os.path.isdir(lib_cand):
|
|
1683
|
+
raise ValueError(f"NdtDebugTool 目录缺少 lib 子目录: {tool_root}")
|
|
1684
|
+
dll_file = os.path.join(lib_cand, "USBIOX.DLL")
|
|
1685
|
+
if not os.path.isfile(dll_file):
|
|
1686
|
+
raise ValueError(f"lib 目录不含 USBIOX.DLL: {lib_cand}")
|
|
1687
|
+
return lib_cand
|
|
1688
|
+
|
|
1689
|
+
|
|
1690
|
+
def handle_cli_ndtdebugtool(tool_root: str) -> int:
|
|
1691
|
+
"""Handle `firmwareloop ndtdebugtool <NdtDebugTool 根目录>`: resolve its lib/ and
|
|
1692
|
+
write ndtdbg.dll_dir into the global %APPDATA%\\FirmwareLoop\\lab.yaml."""
|
|
1693
|
+
try:
|
|
1694
|
+
lib_dir = resolve_ndtdebugtool_lib(tool_root)
|
|
1695
|
+
except ValueError as exc:
|
|
1696
|
+
print(f" {exc}")
|
|
1697
|
+
return 1
|
|
1698
|
+
path = set_ndtdbg_dlldir(lib_dir)
|
|
1699
|
+
print(f" NdtBox dtbg 目录 : {tool_root}")
|
|
1700
|
+
print(f" ndtdbg.dll_dir -> {lib_dir}")
|
|
1701
|
+
print(f" 已写入: {path}")
|
|
1702
|
+
print(" 全局安装的 fwloop 工具将自动读取此配置; 无需再配 FW_LAB_CONFIG")
|
|
1703
|
+
return 0
|
|
1704
|
+
|
|
1705
|
+
|
|
1706
|
+
def global_lab_path() -> str:
|
|
1707
|
+
appdata = os.environ.get("APPDATA", "")
|
|
1708
|
+
return os.path.join(appdata, "FirmwareLoop", "lab.yaml") if appdata else ""
|
|
1709
|
+
|
|
1710
|
+
|
|
1711
|
+
GLOBAL_LAB_TEMPLATE = """# FirmwareLoop 机器级全局配置 (由 fwloop setup 生成, %APPDATA%\\FirmwareLoop\\lab.yaml)
|
|
1712
|
+
# 供全局安装的 fwloop 工具读取; 与工程目录 lab/lab.yaml 相互独立。
|
|
1713
|
+
# 修改后重启 Qoder/Agent 内 MCP 服务生效。
|
|
1714
|
+
|
|
1715
|
+
ndtdbg:
|
|
1716
|
+
# NdtDebugTool 分发包的 lib 目录 (含 USBIOX.DLL); 可用: fwloop dlldir "C:/path/to/NdtDebugTool/lib"
|
|
1717
|
+
dll_dir: ""
|
|
1718
|
+
chip_type: 0 # 0=芯海Fxx 1=ST 2=Maxim 3=AW 4=芯海M68 (本期仅 0)
|
|
1719
|
+
slave_addr: "0xA0"
|
|
1720
|
+
iic_speed: 1 # 0=20kHz 1=100kHz
|
|
1721
|
+
timeout_ms: 60000
|
|
1722
|
+
write_allowed: false # write-reg 需 CLI --confirm 双确认; 保持 false 即永不写
|
|
1723
|
+
"""
|
|
1724
|
+
|
|
1725
|
+
|
|
1726
|
+
def ensure_global_lab_yaml() -> str:
|
|
1727
|
+
"""Create the machine-level lab.yaml on first `fwloop setup`; idempotent (never overwrite)."""
|
|
1728
|
+
path = global_lab_path()
|
|
1729
|
+
if path and not os.path.exists(path):
|
|
1730
|
+
os.makedirs(os.path.dirname(path), exist_ok=True)
|
|
1731
|
+
with open(path, "w", encoding="utf-8") as f:
|
|
1732
|
+
f.write(GLOBAL_LAB_TEMPLATE)
|
|
1733
|
+
return path
|
|
1734
|
+
|
|
1735
|
+
|
|
1736
|
+
def set_ndtdbg_dlldir(dll_path: str) -> str:
|
|
1737
|
+
"""Merge ndtdbg.dll_dir into the global lab.yaml (create template if missing)."""
|
|
1738
|
+
path = ensure_global_lab_yaml()
|
|
1739
|
+
data: Dict[str, Any] = {}
|
|
1740
|
+
try:
|
|
1741
|
+
if os.path.exists(path):
|
|
1742
|
+
with open(path, "r", encoding="utf-8-sig") as f:
|
|
1743
|
+
loaded = yaml.safe_load(f) if yaml is not None else json.load(f)
|
|
1744
|
+
if isinstance(loaded, dict):
|
|
1745
|
+
data = loaded
|
|
1746
|
+
except Exception:
|
|
1747
|
+
data = {}
|
|
1748
|
+
ndtdbg = data.get("ndtdbg")
|
|
1749
|
+
if not isinstance(ndtdbg, dict):
|
|
1750
|
+
ndtdbg = {}
|
|
1751
|
+
ndtdbg["dll_dir"] = dll_path
|
|
1752
|
+
data["ndtdbg"] = ndtdbg
|
|
1753
|
+
os.makedirs(os.path.dirname(path), exist_ok=True)
|
|
1754
|
+
with open(path, "w", encoding="utf-8") as f:
|
|
1755
|
+
if yaml is not None:
|
|
1756
|
+
f.write(yaml.safe_dump(data, allow_unicode=True, sort_keys=False))
|
|
1757
|
+
else:
|
|
1758
|
+
f.write(json.dumps(data, ensure_ascii=False, indent=2) + "\n")
|
|
1759
|
+
return path
|
|
1760
|
+
|
|
1761
|
+
|
|
1677
1762
|
def handle_cli_setup() -> int:
|
|
1678
1763
|
"""Handle `firmwareloop setup` command: simultaneously configure Antigravity CLI, Claude Code CLI, and Qoder IDE."""
|
|
1679
1764
|
print("============================================================")
|
|
1680
|
-
print(" FirmwareLoop Multi-Agent Global Setup Helper (v0.1.
|
|
1765
|
+
print(" FirmwareLoop Multi-Agent Global Setup Helper (v0.1.5)")
|
|
1681
1766
|
print("============================================================")
|
|
1682
1767
|
print("")
|
|
1683
1768
|
|
|
@@ -1773,6 +1858,14 @@ def handle_cli_setup() -> int:
|
|
|
1773
1858
|
print(f"\n[4] Global Skills:")
|
|
1774
1859
|
print(f" - Synchronized: [OK] {skills_synced} skills (firmwareloop, fwloop-adapter) to Antigravity & Claude Code")
|
|
1775
1860
|
|
|
1861
|
+
# 5. Machine-level global lab.yaml (ndtdbg config for the globally installed tool)
|
|
1862
|
+
global_cfg = ensure_global_lab_yaml()
|
|
1863
|
+
if global_cfg:
|
|
1864
|
+
exists = " [已存在, 未覆盖]" if os.path.isfile(global_cfg) else " [已创建]"
|
|
1865
|
+
print("\n[5] NdtBox 全局配置:")
|
|
1866
|
+
print(f" - {global_cfg}{exists}")
|
|
1867
|
+
print(" - 若未配置, 请运行: fwloop ndtdebugtool \"<NdtDebugTool 根目录>\"")
|
|
1868
|
+
|
|
1776
1869
|
print("\n============================================================")
|
|
1777
1870
|
print(f"[+] All AI Coding Agents ({', '.join(configured_agents)}) are globally configured and ready!")
|
|
1778
1871
|
print("============================================================")
|
|
@@ -1782,7 +1875,7 @@ def handle_cli_setup() -> int:
|
|
|
1782
1875
|
def handle_cli_init() -> int:
|
|
1783
1876
|
"""Handle `firmwareloop init` command."""
|
|
1784
1877
|
print("============================================================")
|
|
1785
|
-
print(" FirmwareLoop Multi-Agent Project Initializer (v0.1.
|
|
1878
|
+
print(" FirmwareLoop Multi-Agent Project Initializer (v0.1.5)")
|
|
1786
1879
|
print("============================================================")
|
|
1787
1880
|
cwd = os.getcwd()
|
|
1788
1881
|
print(f"[*] Initializing multi-agent guidelines & bench config in:\n {cwd}\n")
|
|
@@ -1803,7 +1896,7 @@ def handle_cli_init() -> int:
|
|
|
1803
1896
|
|
|
1804
1897
|
|
|
1805
1898
|
def print_cli_help() -> None:
|
|
1806
|
-
print("""FirmwareLoop (fwloop) — AI Agent Firmware Engineering & Lab Automation Platform (v0.1.
|
|
1899
|
+
print("""FirmwareLoop (fwloop) — AI Agent Firmware Engineering & Lab Automation Platform (v0.1.5)
|
|
1807
1900
|
|
|
1808
1901
|
Usage:
|
|
1809
1902
|
fwloop [command] (or: firmwareloop [command])
|
|
@@ -1833,8 +1926,15 @@ def main() -> None:
|
|
|
1833
1926
|
sys.exit(handle_cli_doctor())
|
|
1834
1927
|
elif cmd in ["setup", "register"]:
|
|
1835
1928
|
sys.exit(handle_cli_setup())
|
|
1929
|
+
elif cmd in ["ndtdebugtool", "dlldir"]:
|
|
1930
|
+
if len(args) < 2:
|
|
1931
|
+
print("usage: fwloop ndtdebugtool <NdtDebugTool 根目录>")
|
|
1932
|
+
print("example: fwloop ndtdebugtool \"C:/Users/you/NdtDebugTool-v1.0.19\"")
|
|
1933
|
+
print("(自动定位其 lib/ 并写入全局配置; 兼容旧名 fwloop dlldir <lib 目录>)")
|
|
1934
|
+
sys.exit(2)
|
|
1935
|
+
sys.exit(handle_cli_ndtdebugtool(args[1]))
|
|
1836
1936
|
elif cmd in ["version", "-v", "--version"]:
|
|
1837
|
-
print("FirmwareLoop v0.1.
|
|
1937
|
+
print("FirmwareLoop v0.1.5")
|
|
1838
1938
|
sys.exit(0)
|
|
1839
1939
|
elif cmd in ["help", "-h", "--help"]:
|
|
1840
1940
|
print_cli_help()
|
|
@@ -46,7 +46,13 @@ def ok(action: str, data: dict, log: str = None) -> None:
|
|
|
46
46
|
# --------------------------------------------------------------------------- config
|
|
47
47
|
|
|
48
48
|
def load_config(explicit: str | None) -> dict:
|
|
49
|
-
|
|
49
|
+
cands = [explicit, os.environ.get("FW_LAB_CONFIG")]
|
|
50
|
+
# 机器级全局配置 (fwloop setup 生成, fwloop dlldir 写值)
|
|
51
|
+
appdata = os.environ.get("APPDATA")
|
|
52
|
+
if appdata:
|
|
53
|
+
cands.append(os.path.join(appdata, "FirmwareLoop", "lab.yaml"))
|
|
54
|
+
cands += [DEFAULT_CONFIG, FALLBACK_CONFIG]
|
|
55
|
+
for cand in cands:
|
|
50
56
|
if cand and os.path.isfile(cand):
|
|
51
57
|
try:
|
|
52
58
|
with open(cand, encoding="utf-8") as fh:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<#
|
|
2
2
|
.SYNOPSIS
|
|
3
|
-
Dual-Tier MCP setup and registration helper (v0.1.
|
|
3
|
+
Dual-Tier MCP setup and registration helper (v0.1.5).
|
|
4
4
|
Inspects installed AI coding agents (Qoder, Claude Code, Antigravity, Cursor)
|
|
5
5
|
and configures global MCP / skills or prints exact registration commands.
|
|
6
6
|
|
|
@@ -242,7 +242,7 @@ if ($Json) {
|
|
|
242
242
|
Write-FwJson ([pscustomobject]$report)
|
|
243
243
|
} else {
|
|
244
244
|
Write-Host "============================================================" -ForegroundColor Cyan
|
|
245
|
-
Write-Host " FirmwareLoop Dual-Tier MCP & Agent Setup Helper (v0.1.
|
|
245
|
+
Write-Host " FirmwareLoop Dual-Tier MCP & Agent Setup Helper (v0.1.5)" -ForegroundColor Green
|
|
246
246
|
Write-Host "============================================================" -ForegroundColor Cyan
|
|
247
247
|
Write-Host ""
|
|
248
248
|
Write-Host "[1] Google Antigravity / Gemini CLI:" -ForegroundColor Yellow
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|