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.
Files changed (35) hide show
  1. {firmwareloop-0.1.4 → firmwareloop-0.1.5}/PKG-INFO +24 -3
  2. {firmwareloop-0.1.4 → firmwareloop-0.1.5}/README.md +23 -2
  3. {firmwareloop-0.1.4 → firmwareloop-0.1.5}/firmwareloop.egg-info/PKG-INFO +24 -3
  4. {firmwareloop-0.1.4 → firmwareloop-0.1.5}/pyproject.toml +1 -1
  5. {firmwareloop-0.1.4 → firmwareloop-0.1.5}/tools/__init__.py +1 -1
  6. {firmwareloop-0.1.4 → firmwareloop-0.1.5}/tools/fw_mcp_server.py +107 -7
  7. {firmwareloop-0.1.4 → firmwareloop-0.1.5}/tools/ndtdbg_cli.py +7 -1
  8. {firmwareloop-0.1.4 → firmwareloop-0.1.5}/tools/setup-agent-mcp.ps1 +2 -2
  9. {firmwareloop-0.1.4 → firmwareloop-0.1.5}/LICENSE +0 -0
  10. {firmwareloop-0.1.4 → firmwareloop-0.1.5}/firmwareloop.egg-info/SOURCES.txt +0 -0
  11. {firmwareloop-0.1.4 → firmwareloop-0.1.5}/firmwareloop.egg-info/dependency_links.txt +0 -0
  12. {firmwareloop-0.1.4 → firmwareloop-0.1.5}/firmwareloop.egg-info/entry_points.txt +0 -0
  13. {firmwareloop-0.1.4 → firmwareloop-0.1.5}/firmwareloop.egg-info/requires.txt +0 -0
  14. {firmwareloop-0.1.4 → firmwareloop-0.1.5}/firmwareloop.egg-info/top_level.txt +0 -0
  15. {firmwareloop-0.1.4 → firmwareloop-0.1.5}/setup.cfg +0 -0
  16. {firmwareloop-0.1.4 → firmwareloop-0.1.5}/tools/acceptance-scenario.ps1 +0 -0
  17. {firmwareloop-0.1.4 → firmwareloop-0.1.5}/tools/build.ps1 +0 -0
  18. {firmwareloop-0.1.4 → firmwareloop-0.1.5}/tools/can.ps1 +0 -0
  19. {firmwareloop-0.1.4 → firmwareloop-0.1.5}/tools/check-qoder-mcp.ps1 +0 -0
  20. {firmwareloop-0.1.4 → firmwareloop-0.1.5}/tools/common/build-backends.psm1 +0 -0
  21. {firmwareloop-0.1.4 → firmwareloop-0.1.5}/tools/common/fw.psm1 +0 -0
  22. {firmwareloop-0.1.4 → firmwareloop-0.1.5}/tools/common/uart_probe.py +0 -0
  23. {firmwareloop-0.1.4 → firmwareloop-0.1.5}/tools/doctor.ps1 +0 -0
  24. {firmwareloop-0.1.4 → firmwareloop-0.1.5}/tools/flash.ps1 +0 -0
  25. {firmwareloop-0.1.4 → firmwareloop-0.1.5}/tools/instrument_cli.py +0 -0
  26. {firmwareloop-0.1.4 → firmwareloop-0.1.5}/tools/lib/__init__.py +0 -0
  27. {firmwareloop-0.1.4 → firmwareloop-0.1.5}/tools/lib/instruments.py +0 -0
  28. {firmwareloop-0.1.4 → firmwareloop-0.1.5}/tools/lib/ndtdbg.py +0 -0
  29. {firmwareloop-0.1.4 → firmwareloop-0.1.5}/tools/logic_capture.ps1 +0 -0
  30. {firmwareloop-0.1.4 → firmwareloop-0.1.5}/tools/logic_decode.ps1 +0 -0
  31. {firmwareloop-0.1.4 → firmwareloop-0.1.5}/tools/ndtdbg_bridge.ps1 +0 -0
  32. {firmwareloop-0.1.4 → firmwareloop-0.1.5}/tools/reset.ps1 +0 -0
  33. {firmwareloop-0.1.4 → firmwareloop-0.1.5}/tools/sigrok_csv_to_fwloop.py +0 -0
  34. {firmwareloop-0.1.4 → firmwareloop-0.1.5}/tools/test-backends.ps1 +0 -0
  35. {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.4
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.4)
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.4)
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.4)
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.4)
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.4
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.4)
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.4)
372
+ ## 能力验证状态(v0.1.5)
352
373
 
353
374
  > 状态定义:`Implemented`(已实现)/ `Simulator Validated`(模拟验证)/
354
375
  > `Real Hardware Validated`(真机验证)/ `Experimental` / `Not Implemented`
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "firmwareloop"
7
- version = "0.1.4"
7
+ version = "0.1.5"
8
8
  description = "AI Agent Firmware Development and Lab Automation Platform (Dual-Tier MCP Server)"
9
9
  readme = "README.md"
10
10
  authors = [
@@ -2,4 +2,4 @@
2
2
  FirmwareLoop - AI Agent Firmware Development and Lab Automation Platform.
3
3
  """
4
4
 
5
- __version__ = "0.1.4"
5
+ __version__ = "0.1.5"
@@ -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.4).
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.4"
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.4)")
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.4)")
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.4)")
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.4)
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.4")
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
- for cand in (explicit, os.environ.get("FW_LAB_CONFIG"), DEFAULT_CONFIG, FALLBACK_CONFIG):
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.4).
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.4)" -ForegroundColor Green
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