firmwareloop 0.0.11__tar.gz → 0.0.12__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.0.11 → firmwareloop-0.0.12}/PKG-INFO +3 -3
- {firmwareloop-0.0.11 → firmwareloop-0.0.12}/README.md +2 -2
- {firmwareloop-0.0.11 → firmwareloop-0.0.12}/firmwareloop.egg-info/PKG-INFO +3 -3
- {firmwareloop-0.0.11 → firmwareloop-0.0.12}/pyproject.toml +1 -1
- {firmwareloop-0.0.11 → firmwareloop-0.0.12}/tools/__init__.py +1 -1
- {firmwareloop-0.0.11 → firmwareloop-0.0.12}/tools/fw_mcp_server.py +106 -10
- {firmwareloop-0.0.11 → firmwareloop-0.0.12}/tools/setup-agent-mcp.ps1 +59 -19
- {firmwareloop-0.0.11 → firmwareloop-0.0.12}/LICENSE +0 -0
- {firmwareloop-0.0.11 → firmwareloop-0.0.12}/firmwareloop.egg-info/SOURCES.txt +0 -0
- {firmwareloop-0.0.11 → firmwareloop-0.0.12}/firmwareloop.egg-info/dependency_links.txt +0 -0
- {firmwareloop-0.0.11 → firmwareloop-0.0.12}/firmwareloop.egg-info/entry_points.txt +0 -0
- {firmwareloop-0.0.11 → firmwareloop-0.0.12}/firmwareloop.egg-info/requires.txt +0 -0
- {firmwareloop-0.0.11 → firmwareloop-0.0.12}/firmwareloop.egg-info/top_level.txt +0 -0
- {firmwareloop-0.0.11 → firmwareloop-0.0.12}/setup.cfg +0 -0
- {firmwareloop-0.0.11 → firmwareloop-0.0.12}/tools/acceptance-scenario.ps1 +0 -0
- {firmwareloop-0.0.11 → firmwareloop-0.0.12}/tools/build.ps1 +0 -0
- {firmwareloop-0.0.11 → firmwareloop-0.0.12}/tools/can.ps1 +0 -0
- {firmwareloop-0.0.11 → firmwareloop-0.0.12}/tools/check-qoder-mcp.ps1 +0 -0
- {firmwareloop-0.0.11 → firmwareloop-0.0.12}/tools/common/build-backends.psm1 +0 -0
- {firmwareloop-0.0.11 → firmwareloop-0.0.12}/tools/common/fw.psm1 +0 -0
- {firmwareloop-0.0.11 → firmwareloop-0.0.12}/tools/common/uart_probe.py +0 -0
- {firmwareloop-0.0.11 → firmwareloop-0.0.12}/tools/doctor.ps1 +0 -0
- {firmwareloop-0.0.11 → firmwareloop-0.0.12}/tools/flash.ps1 +0 -0
- {firmwareloop-0.0.11 → firmwareloop-0.0.12}/tools/instrument_cli.py +0 -0
- {firmwareloop-0.0.11 → firmwareloop-0.0.12}/tools/lib/__init__.py +0 -0
- {firmwareloop-0.0.11 → firmwareloop-0.0.12}/tools/lib/instruments.py +0 -0
- {firmwareloop-0.0.11 → firmwareloop-0.0.12}/tools/logic_capture.ps1 +0 -0
- {firmwareloop-0.0.11 → firmwareloop-0.0.12}/tools/logic_decode.ps1 +0 -0
- {firmwareloop-0.0.11 → firmwareloop-0.0.12}/tools/reset.ps1 +0 -0
- {firmwareloop-0.0.11 → firmwareloop-0.0.12}/tools/test-backends.ps1 +0 -0
- {firmwareloop-0.0.11 → firmwareloop-0.0.12}/tools/test.ps1 +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: firmwareloop
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.12
|
|
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
|
|
@@ -336,7 +336,7 @@ claude mcp remove --scope user agentic-hil
|
|
|
336
336
|
├── demo-firmware/ 示例固件(CMake;宿主编译模拟 MCU,闭环验证载体)
|
|
337
337
|
├── demo-make/ 示例固件(Make;构建测试载体)
|
|
338
338
|
├── docs/ DEPENDENCY_MATRIX / REUSE_PLAN / V0.0.2_GAP_VERIFICATION
|
|
339
|
-
├── pyproject.toml 标准 Python 包配置与 CLI 入口声明 (v0.0.
|
|
339
|
+
├── pyproject.toml 标准 Python 包配置与 CLI 入口声明 (v0.0.12)
|
|
340
340
|
├── .mcp.example.json 双层 MCP 配置模板(firmwareloop + agentic-hil)
|
|
341
341
|
├── AGENTS.md 通用智能体规范(Antigravity / Qoder / Cursor 等)
|
|
342
342
|
├── CLAUDE.md Claude Code CLI 指南
|
|
@@ -346,7 +346,7 @@ claude mcp remove --scope user agentic-hil
|
|
|
346
346
|
|
|
347
347
|
---
|
|
348
348
|
|
|
349
|
-
## 能力验证状态(v0.0.
|
|
349
|
+
## 能力验证状态(v0.0.12)
|
|
350
350
|
|
|
351
351
|
> 状态定义:`Implemented`(已实现)/ `Simulator Validated`(模拟验证)/
|
|
352
352
|
> `Real Hardware Validated`(真机验证)/ `Experimental` / `Not Implemented`
|
|
@@ -308,7 +308,7 @@ claude mcp remove --scope user agentic-hil
|
|
|
308
308
|
├── demo-firmware/ 示例固件(CMake;宿主编译模拟 MCU,闭环验证载体)
|
|
309
309
|
├── demo-make/ 示例固件(Make;构建测试载体)
|
|
310
310
|
├── docs/ DEPENDENCY_MATRIX / REUSE_PLAN / V0.0.2_GAP_VERIFICATION
|
|
311
|
-
├── pyproject.toml 标准 Python 包配置与 CLI 入口声明 (v0.0.
|
|
311
|
+
├── pyproject.toml 标准 Python 包配置与 CLI 入口声明 (v0.0.12)
|
|
312
312
|
├── .mcp.example.json 双层 MCP 配置模板(firmwareloop + agentic-hil)
|
|
313
313
|
├── AGENTS.md 通用智能体规范(Antigravity / Qoder / Cursor 等)
|
|
314
314
|
├── CLAUDE.md Claude Code CLI 指南
|
|
@@ -318,7 +318,7 @@ claude mcp remove --scope user agentic-hil
|
|
|
318
318
|
|
|
319
319
|
---
|
|
320
320
|
|
|
321
|
-
## 能力验证状态(v0.0.
|
|
321
|
+
## 能力验证状态(v0.0.12)
|
|
322
322
|
|
|
323
323
|
> 状态定义:`Implemented`(已实现)/ `Simulator Validated`(模拟验证)/
|
|
324
324
|
> `Real Hardware Validated`(真机验证)/ `Experimental` / `Not Implemented`
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: firmwareloop
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.12
|
|
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
|
|
@@ -336,7 +336,7 @@ claude mcp remove --scope user agentic-hil
|
|
|
336
336
|
├── demo-firmware/ 示例固件(CMake;宿主编译模拟 MCU,闭环验证载体)
|
|
337
337
|
├── demo-make/ 示例固件(Make;构建测试载体)
|
|
338
338
|
├── docs/ DEPENDENCY_MATRIX / REUSE_PLAN / V0.0.2_GAP_VERIFICATION
|
|
339
|
-
├── pyproject.toml 标准 Python 包配置与 CLI 入口声明 (v0.0.
|
|
339
|
+
├── pyproject.toml 标准 Python 包配置与 CLI 入口声明 (v0.0.12)
|
|
340
340
|
├── .mcp.example.json 双层 MCP 配置模板(firmwareloop + agentic-hil)
|
|
341
341
|
├── AGENTS.md 通用智能体规范(Antigravity / Qoder / Cursor 等)
|
|
342
342
|
├── CLAUDE.md Claude Code CLI 指南
|
|
@@ -346,7 +346,7 @@ claude mcp remove --scope user agentic-hil
|
|
|
346
346
|
|
|
347
347
|
---
|
|
348
348
|
|
|
349
|
-
## 能力验证状态(v0.0.
|
|
349
|
+
## 能力验证状态(v0.0.12)
|
|
350
350
|
|
|
351
351
|
> 状态定义:`Implemented`(已实现)/ `Simulator Validated`(模拟验证)/
|
|
352
352
|
> `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.0.
|
|
3
|
+
fw_mcp_server.py - FirmwareLoop High-Level Workflow & Device MCP Server (v0.0.12).
|
|
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
|
|
@@ -1160,7 +1160,7 @@ def process_request(req: Dict[str, Any]) -> Optional[Dict[str, Any]]:
|
|
|
1160
1160
|
},
|
|
1161
1161
|
"serverInfo": {
|
|
1162
1162
|
"name": "firmwareloop",
|
|
1163
|
-
"version": "0.0.
|
|
1163
|
+
"version": "0.0.12"
|
|
1164
1164
|
}
|
|
1165
1165
|
}
|
|
1166
1166
|
}
|
|
@@ -1252,7 +1252,7 @@ def process_request(req: Dict[str, Any]) -> Optional[Dict[str, Any]]:
|
|
|
1252
1252
|
def handle_cli_update() -> int:
|
|
1253
1253
|
"""Handle `firmwareloop update` command."""
|
|
1254
1254
|
print("============================================================")
|
|
1255
|
-
print(" FirmwareLoop Auto-Updater (v0.0.
|
|
1255
|
+
print(" FirmwareLoop Auto-Updater (v0.0.12)")
|
|
1256
1256
|
print("============================================================")
|
|
1257
1257
|
|
|
1258
1258
|
is_git_repo = os.path.exists(os.path.join(REPO_ROOT, ".git"))
|
|
@@ -1317,16 +1317,112 @@ def handle_cli_doctor() -> int:
|
|
|
1317
1317
|
|
|
1318
1318
|
|
|
1319
1319
|
def handle_cli_setup() -> int:
|
|
1320
|
-
"""Handle `firmwareloop setup` command."""
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1320
|
+
"""Handle `firmwareloop setup` command: simultaneously configure Antigravity CLI, Claude Code CLI, and Qoder IDE."""
|
|
1321
|
+
print("============================================================")
|
|
1322
|
+
print(" FirmwareLoop Multi-Agent Global Setup Helper (v0.0.12)")
|
|
1323
|
+
print("============================================================")
|
|
1324
|
+
print("")
|
|
1325
|
+
|
|
1326
|
+
user_home = os.path.expanduser("~")
|
|
1327
|
+
configured_agents = []
|
|
1328
|
+
|
|
1329
|
+
# 1. Google Antigravity / Gemini CLI
|
|
1330
|
+
print("[1] Google Antigravity / Gemini CLI:")
|
|
1331
|
+
ag_config_dir = os.path.join(user_home, ".gemini", "config")
|
|
1332
|
+
ag_mcp_file = os.path.join(ag_config_dir, "mcp_config.json")
|
|
1333
|
+
try:
|
|
1334
|
+
os.makedirs(ag_config_dir, exist_ok=True)
|
|
1335
|
+
ag_data = {}
|
|
1336
|
+
if os.path.exists(ag_mcp_file):
|
|
1337
|
+
try:
|
|
1338
|
+
with open(ag_mcp_file, "r", encoding="utf-8-sig") as f:
|
|
1339
|
+
ag_data = json.load(f)
|
|
1340
|
+
except Exception:
|
|
1341
|
+
ag_data = {}
|
|
1342
|
+
if "mcpServers" not in ag_data:
|
|
1343
|
+
ag_data["mcpServers"] = {}
|
|
1344
|
+
ag_data["mcpServers"]["firmwareloop"] = {"command": "fwloop"}
|
|
1345
|
+
ag_data["mcpServers"]["agentic-hil"] = {"command": "agentic-hil", "args": ["mcp-stdio"]}
|
|
1346
|
+
with open(ag_mcp_file, "w", encoding="utf-8") as f:
|
|
1347
|
+
json.dump(ag_data, f, indent=2)
|
|
1348
|
+
print(f" - Global MCP Config: [OK] Written to {ag_mcp_file}")
|
|
1349
|
+
configured_agents.append("Google Antigravity")
|
|
1350
|
+
except Exception as e:
|
|
1351
|
+
print(f" - Global MCP Config: [Warning] Could not write Antigravity config: {e}")
|
|
1352
|
+
|
|
1353
|
+
# 2. Claude Code CLI
|
|
1354
|
+
print("\n[2] Claude Code CLI:")
|
|
1355
|
+
claude_file = os.path.join(user_home, ".claude.json")
|
|
1356
|
+
try:
|
|
1357
|
+
claude_data = {}
|
|
1358
|
+
if os.path.exists(claude_file):
|
|
1359
|
+
try:
|
|
1360
|
+
with open(claude_file, "r", encoding="utf-8-sig") as f:
|
|
1361
|
+
claude_data = json.load(f)
|
|
1362
|
+
except Exception:
|
|
1363
|
+
claude_data = {}
|
|
1364
|
+
if "mcpServers" not in claude_data:
|
|
1365
|
+
claude_data["mcpServers"] = {}
|
|
1366
|
+
claude_data["mcpServers"]["fwloop"] = {"command": "fwloop"}
|
|
1367
|
+
claude_data["mcpServers"]["agentic-hil"] = {"command": "agentic-hil", "args": ["mcp-stdio"]}
|
|
1368
|
+
with open(claude_file, "w", encoding="utf-8") as f:
|
|
1369
|
+
json.dump(claude_data, f, indent=2)
|
|
1370
|
+
print(f" - Global MCP Config: [OK] Written to {claude_file}")
|
|
1371
|
+
configured_agents.append("Claude Code")
|
|
1372
|
+
except Exception as e:
|
|
1373
|
+
print(f" - Global MCP Config: [Warning] Could not update .claude.json: {e}")
|
|
1374
|
+
|
|
1375
|
+
# 3. Qoder IDE
|
|
1376
|
+
print("\n[3] Qoder IDE:")
|
|
1377
|
+
qoder_cmd = shutil.which("qoder.cmd") or shutil.which("qoder")
|
|
1378
|
+
if qoder_cmd:
|
|
1379
|
+
try:
|
|
1380
|
+
r1 = subprocess.run([qoder_cmd, "--add-mcp", json.dumps({"name": "firmwareloop", "command": "fwloop"})], shell=True, capture_output=True, text=True)
|
|
1381
|
+
r2 = subprocess.run([qoder_cmd, "--add-mcp", json.dumps({"name": "agentic-hil", "command": "agentic-hil", "args": ["mcp-stdio"]})], shell=True, capture_output=True, text=True)
|
|
1382
|
+
if r1.returncode == 0 and r2.returncode == 0:
|
|
1383
|
+
print(" - User Profile MCP: [OK] Automatically registered to Qoder User Profile")
|
|
1384
|
+
configured_agents.append("Qoder IDE")
|
|
1385
|
+
else:
|
|
1386
|
+
print(f" - User Profile MCP: [Notice] Qoder CLI output: {r1.stdout.strip()}")
|
|
1387
|
+
except Exception as e:
|
|
1388
|
+
print(f" - User Profile MCP: [Warning] Could not invoke qoder CLI: {e}")
|
|
1389
|
+
else:
|
|
1390
|
+
print(" - User Profile MCP: Qoder CLI not in PATH (Workspace .mcp.json supported)")
|
|
1391
|
+
|
|
1392
|
+
# 4. Global Skills Sync for Antigravity and Claude Code
|
|
1393
|
+
ag_skills_dir = os.path.join(user_home, ".gemini", "antigravity-cli", "skills")
|
|
1394
|
+
claude_skills_dir = os.path.join(user_home, ".claude", "skills")
|
|
1395
|
+
source_skills_dir = os.path.join(REPO_ROOT, "skills")
|
|
1396
|
+
skills_synced = 0
|
|
1397
|
+
if os.path.exists(source_skills_dir):
|
|
1398
|
+
for sk in ["firmwareloop", "fwloop-adapter"]:
|
|
1399
|
+
sk_src = os.path.join(source_skills_dir, sk, "SKILL.md")
|
|
1400
|
+
if os.path.exists(sk_src):
|
|
1401
|
+
try:
|
|
1402
|
+
ag_target = os.path.join(ag_skills_dir, sk)
|
|
1403
|
+
os.makedirs(ag_target, exist_ok=True)
|
|
1404
|
+
shutil.copyfile(sk_src, os.path.join(ag_target, "SKILL.md"))
|
|
1405
|
+
|
|
1406
|
+
cl_target = os.path.join(claude_skills_dir, sk)
|
|
1407
|
+
os.makedirs(cl_target, exist_ok=True)
|
|
1408
|
+
shutil.copyfile(sk_src, os.path.join(cl_target, "SKILL.md"))
|
|
1409
|
+
skills_synced += 1
|
|
1410
|
+
except Exception:
|
|
1411
|
+
pass
|
|
1412
|
+
|
|
1413
|
+
print(f"\n[4] Global Skills:")
|
|
1414
|
+
print(f" - Synchronized: [OK] {skills_synced} skills (firmwareloop, fwloop-adapter) to Antigravity & Claude Code")
|
|
1415
|
+
|
|
1416
|
+
print("\n============================================================")
|
|
1417
|
+
print(f"[+] All AI Coding Agents ({', '.join(configured_agents)}) are globally configured and ready!")
|
|
1418
|
+
print("============================================================")
|
|
1419
|
+
return 0
|
|
1324
1420
|
|
|
1325
1421
|
|
|
1326
1422
|
def handle_cli_init() -> int:
|
|
1327
1423
|
"""Handle `firmwareloop init` command."""
|
|
1328
1424
|
print("============================================================")
|
|
1329
|
-
print(" FirmwareLoop Multi-Agent Project Initializer (v0.0.
|
|
1425
|
+
print(" FirmwareLoop Multi-Agent Project Initializer (v0.0.12)")
|
|
1330
1426
|
print("============================================================")
|
|
1331
1427
|
cwd = os.getcwd()
|
|
1332
1428
|
print(f"[*] Initializing multi-agent guidelines & bench config in:\n {cwd}\n")
|
|
@@ -1347,7 +1443,7 @@ def handle_cli_init() -> int:
|
|
|
1347
1443
|
|
|
1348
1444
|
|
|
1349
1445
|
def print_cli_help() -> None:
|
|
1350
|
-
print("""FirmwareLoop (fwloop) — AI Agent Firmware Engineering & Lab Automation Platform (v0.0.
|
|
1446
|
+
print("""FirmwareLoop (fwloop) — AI Agent Firmware Engineering & Lab Automation Platform (v0.0.12)
|
|
1351
1447
|
|
|
1352
1448
|
Usage:
|
|
1353
1449
|
fwloop [command] (or: firmwareloop [command])
|
|
@@ -1378,7 +1474,7 @@ def main() -> None:
|
|
|
1378
1474
|
elif cmd in ["setup", "register"]:
|
|
1379
1475
|
sys.exit(handle_cli_setup())
|
|
1380
1476
|
elif cmd in ["version", "-v", "--version"]:
|
|
1381
|
-
print("FirmwareLoop v0.0.
|
|
1477
|
+
print("FirmwareLoop v0.0.12")
|
|
1382
1478
|
sys.exit(0)
|
|
1383
1479
|
elif cmd in ["help", "-h", "--help"]:
|
|
1384
1480
|
print_cli_help()
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<#
|
|
2
2
|
.SYNOPSIS
|
|
3
|
-
Dual-Tier MCP setup and registration helper (v0.0.
|
|
3
|
+
Dual-Tier MCP setup and registration helper (v0.0.12).
|
|
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
|
|
|
@@ -48,40 +48,74 @@ $report = [ordered]@{
|
|
|
48
48
|
agents = [ordered]@{}
|
|
49
49
|
}
|
|
50
50
|
|
|
51
|
-
# 1. Claude Code CLI
|
|
51
|
+
# 1. Claude Code CLI 全局 MCP 自动配置
|
|
52
52
|
$claudeCmd = Get-Command claude -ErrorAction SilentlyContinue
|
|
53
|
+
$claudeConfigUpdated = $false
|
|
54
|
+
$claudeConfigFile = Join-Path $env:USERPROFILE '.claude.json'
|
|
55
|
+
if (Test-Path -LiteralPath $claudeConfigFile) {
|
|
56
|
+
try {
|
|
57
|
+
$existingClaude = Get-Content -LiteralPath $claudeConfigFile -Raw -Encoding UTF8 | ConvertFrom-Json
|
|
58
|
+
if (-not $existingClaude.PSObject.Properties['mcpServers']) {
|
|
59
|
+
$existingClaude | Add-Member -MemberType NoteProperty -Name 'mcpServers' -Value ([pscustomobject]@{})
|
|
60
|
+
}
|
|
61
|
+
$existingClaude.mcpServers | Add-Member -MemberType NoteProperty -Name 'fwloop' -Value ([pscustomobject]@{ command = "fwloop" }) -Force
|
|
62
|
+
$existingClaude.mcpServers | Add-Member -MemberType NoteProperty -Name 'agentic-hil' -Value ([pscustomobject]@{ command = "agentic-hil"; args = @("mcp-stdio") }) -Force
|
|
63
|
+
$updatedClaudeStr = ConvertTo-Json -InputObject $existingClaude -Depth 20
|
|
64
|
+
$utf8NoBom = [System.Text.UTF8Encoding]::new($false)
|
|
65
|
+
[System.IO.File]::WriteAllText($claudeConfigFile, $updatedClaudeStr, $utf8NoBom)
|
|
66
|
+
$claudeConfigUpdated = $true
|
|
67
|
+
} catch {
|
|
68
|
+
# ignore non-fatal config write error
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
if ($claudeCmd -and -not $claudeConfigUpdated) {
|
|
72
|
+
try {
|
|
73
|
+
& $claudeCmd.Source mcp add --scope user fwloop -- fwloop | Out-Null
|
|
74
|
+
& $claudeCmd.Source mcp add --scope user agentic-hil -- agentic-hil mcp-stdio | Out-Null
|
|
75
|
+
$claudeConfigUpdated = $true
|
|
76
|
+
} catch {
|
|
77
|
+
# ignore non-fatal error
|
|
78
|
+
}
|
|
79
|
+
}
|
|
53
80
|
$report.agents.claude_code = [ordered]@{
|
|
54
81
|
detected = ($null -ne $claudeCmd)
|
|
55
82
|
path = if ($claudeCmd) { $claudeCmd.Source } else { $null }
|
|
83
|
+
configured = $claudeConfigUpdated
|
|
56
84
|
registration_commands = @(
|
|
57
85
|
"claude mcp add --scope user fwloop -- $fwCmdName",
|
|
58
86
|
"claude mcp add --scope user agentic-hil -- $ahilCmdName"
|
|
59
87
|
)
|
|
60
88
|
}
|
|
61
89
|
|
|
62
|
-
# 2. Qoder IDE / CLI
|
|
90
|
+
# 2. Qoder IDE / CLI 全局 User Profile MCP 自动配置
|
|
63
91
|
$qoderCmd = $null
|
|
64
|
-
foreach ($name in @('qoder', 'qodercli')) {
|
|
92
|
+
foreach ($name in @('qoder.cmd', 'qoder', 'qodercli')) {
|
|
65
93
|
$c = Get-Command $name -ErrorAction SilentlyContinue
|
|
66
94
|
if ($c) { $qoderCmd = $c; break }
|
|
67
95
|
}
|
|
96
|
+
$qoderConfigured = $false
|
|
97
|
+
if ($qoderCmd) {
|
|
98
|
+
try {
|
|
99
|
+
$fwJsonStr = '{"name":"firmwareloop","command":"fwloop"}'
|
|
100
|
+
$ahilJsonStr = '{"name":"agentic-hil","command":"agentic-hil","args":["mcp-stdio"]}'
|
|
101
|
+
& $qoderCmd.Source --add-mcp $fwJsonStr | Out-Null
|
|
102
|
+
& $qoderCmd.Source --add-mcp $ahilJsonStr | Out-Null
|
|
103
|
+
$qoderConfigured = $true
|
|
104
|
+
} catch {
|
|
105
|
+
# ignore non-fatal error
|
|
106
|
+
}
|
|
107
|
+
}
|
|
68
108
|
$report.agents.qoder = [ordered]@{
|
|
69
109
|
detected = ($null -ne $qoderCmd)
|
|
70
110
|
path = if ($qoderCmd) { $qoderCmd.Source } else { $null }
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
} else {
|
|
77
|
-
@(
|
|
78
|
-
"qoder.cmd mcp add --global fwloop -- $fwCmdName",
|
|
79
|
-
"qoder.cmd mcp add --global agentic-hil -- $ahilCmdName"
|
|
80
|
-
)
|
|
81
|
-
}
|
|
111
|
+
user_profile_configured = $qoderConfigured
|
|
112
|
+
registration_commands = @(
|
|
113
|
+
"qoder.cmd --add-mcp '{\`"name\`":\`"firmwareloop\`",\`"command\`":\`"fwloop\`"}'",
|
|
114
|
+
"qoder.cmd --add-mcp '{\`"name\`":\`"agentic-hil\`",\`"command\`":\`"agentic-hil\`",\`"args\`":[\`"mcp-stdio\`"]}'"
|
|
115
|
+
)
|
|
82
116
|
}
|
|
83
117
|
|
|
84
|
-
# 3. Antigravity CLI / Gemini 全局 MCP
|
|
118
|
+
# 3. Antigravity CLI / Gemini 全局 MCP 自动配置与 Skills
|
|
85
119
|
$antigravityConfigDir = Join-Path $env:USERPROFILE '.gemini\config'
|
|
86
120
|
$antigravityMcpConfigFile = Join-Path $antigravityConfigDir 'mcp_config.json'
|
|
87
121
|
$antigravityMcpUpdated = $false
|
|
@@ -98,7 +132,8 @@ if (Test-Path -LiteralPath $antigravityConfigDir) {
|
|
|
98
132
|
$existingJson.mcpServers | Add-Member -MemberType NoteProperty -Name 'firmwareloop' -Value ([pscustomobject]@{ command = "fwloop" }) -Force
|
|
99
133
|
$existingJson.mcpServers | Add-Member -MemberType NoteProperty -Name 'agentic-hil' -Value ([pscustomobject]@{ command = "agentic-hil"; args = @("mcp-stdio") }) -Force
|
|
100
134
|
$updatedJsonStr = ConvertTo-Json -InputObject $existingJson -Depth 10
|
|
101
|
-
|
|
135
|
+
$utf8NoBom = [System.Text.UTF8Encoding]::new($false)
|
|
136
|
+
[System.IO.File]::WriteAllText($antigravityMcpConfigFile, $updatedJsonStr, $utf8NoBom)
|
|
102
137
|
$antigravityMcpUpdated = $true
|
|
103
138
|
} catch {
|
|
104
139
|
# ignore non-fatal config write error
|
|
@@ -160,7 +195,8 @@ if ($WriteWorkspaceMcp) {
|
|
|
160
195
|
}
|
|
161
196
|
}
|
|
162
197
|
$jsonContent = ConvertTo-Json -InputObject $mcpConfig -Depth 10
|
|
163
|
-
|
|
198
|
+
$utf8NoBom = [System.Text.UTF8Encoding]::new($false)
|
|
199
|
+
[System.IO.File]::WriteAllText($mcpJsonPath, $jsonContent, $utf8NoBom)
|
|
164
200
|
$report.workspace_mcp_written = $mcpJsonPath
|
|
165
201
|
}
|
|
166
202
|
|
|
@@ -186,7 +222,11 @@ if ($Json) {
|
|
|
186
222
|
Write-Host " $($report.agents.claude_code.registration_commands[1])"
|
|
187
223
|
Write-Host ""
|
|
188
224
|
Write-Host "[3] Qoder IDE:" -ForegroundColor Yellow
|
|
189
|
-
|
|
225
|
+
if ($qoderConfigured) {
|
|
226
|
+
Write-Host " - User Profile MCP: [OK] Automatically registered to Qoder User Profile" -ForegroundColor Green
|
|
227
|
+
} else {
|
|
228
|
+
Write-Host " - User Profile MCP: Run $($report.agents.qoder.registration_commands[0])"
|
|
229
|
+
}
|
|
190
230
|
Write-Host " - Workspace: Project root '.mcp.json' is automatically detected"
|
|
191
231
|
Write-Host ""
|
|
192
232
|
Write-Host "============================================================" -ForegroundColor Cyan
|
|
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
|