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.
Files changed (31) hide show
  1. {firmwareloop-0.0.11 → firmwareloop-0.0.12}/PKG-INFO +3 -3
  2. {firmwareloop-0.0.11 → firmwareloop-0.0.12}/README.md +2 -2
  3. {firmwareloop-0.0.11 → firmwareloop-0.0.12}/firmwareloop.egg-info/PKG-INFO +3 -3
  4. {firmwareloop-0.0.11 → firmwareloop-0.0.12}/pyproject.toml +1 -1
  5. {firmwareloop-0.0.11 → firmwareloop-0.0.12}/tools/__init__.py +1 -1
  6. {firmwareloop-0.0.11 → firmwareloop-0.0.12}/tools/fw_mcp_server.py +106 -10
  7. {firmwareloop-0.0.11 → firmwareloop-0.0.12}/tools/setup-agent-mcp.ps1 +59 -19
  8. {firmwareloop-0.0.11 → firmwareloop-0.0.12}/LICENSE +0 -0
  9. {firmwareloop-0.0.11 → firmwareloop-0.0.12}/firmwareloop.egg-info/SOURCES.txt +0 -0
  10. {firmwareloop-0.0.11 → firmwareloop-0.0.12}/firmwareloop.egg-info/dependency_links.txt +0 -0
  11. {firmwareloop-0.0.11 → firmwareloop-0.0.12}/firmwareloop.egg-info/entry_points.txt +0 -0
  12. {firmwareloop-0.0.11 → firmwareloop-0.0.12}/firmwareloop.egg-info/requires.txt +0 -0
  13. {firmwareloop-0.0.11 → firmwareloop-0.0.12}/firmwareloop.egg-info/top_level.txt +0 -0
  14. {firmwareloop-0.0.11 → firmwareloop-0.0.12}/setup.cfg +0 -0
  15. {firmwareloop-0.0.11 → firmwareloop-0.0.12}/tools/acceptance-scenario.ps1 +0 -0
  16. {firmwareloop-0.0.11 → firmwareloop-0.0.12}/tools/build.ps1 +0 -0
  17. {firmwareloop-0.0.11 → firmwareloop-0.0.12}/tools/can.ps1 +0 -0
  18. {firmwareloop-0.0.11 → firmwareloop-0.0.12}/tools/check-qoder-mcp.ps1 +0 -0
  19. {firmwareloop-0.0.11 → firmwareloop-0.0.12}/tools/common/build-backends.psm1 +0 -0
  20. {firmwareloop-0.0.11 → firmwareloop-0.0.12}/tools/common/fw.psm1 +0 -0
  21. {firmwareloop-0.0.11 → firmwareloop-0.0.12}/tools/common/uart_probe.py +0 -0
  22. {firmwareloop-0.0.11 → firmwareloop-0.0.12}/tools/doctor.ps1 +0 -0
  23. {firmwareloop-0.0.11 → firmwareloop-0.0.12}/tools/flash.ps1 +0 -0
  24. {firmwareloop-0.0.11 → firmwareloop-0.0.12}/tools/instrument_cli.py +0 -0
  25. {firmwareloop-0.0.11 → firmwareloop-0.0.12}/tools/lib/__init__.py +0 -0
  26. {firmwareloop-0.0.11 → firmwareloop-0.0.12}/tools/lib/instruments.py +0 -0
  27. {firmwareloop-0.0.11 → firmwareloop-0.0.12}/tools/logic_capture.ps1 +0 -0
  28. {firmwareloop-0.0.11 → firmwareloop-0.0.12}/tools/logic_decode.ps1 +0 -0
  29. {firmwareloop-0.0.11 → firmwareloop-0.0.12}/tools/reset.ps1 +0 -0
  30. {firmwareloop-0.0.11 → firmwareloop-0.0.12}/tools/test-backends.ps1 +0 -0
  31. {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.11
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.11)
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.11)
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.11)
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.11)
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.11
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.11)
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.11)
349
+ ## 能力验证状态(v0.0.12)
350
350
 
351
351
  > 状态定义:`Implemented`(已实现)/ `Simulator Validated`(模拟验证)/
352
352
  > `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.0.11"
7
+ version = "0.0.12"
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.0.11"
5
+ __version__ = "0.0.12"
@@ -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.11).
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.11"
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.11)")
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
- cmd = [PWSH_EXE, "-NoProfile", "-ExecutionPolicy", "Bypass", "-File", os.path.join(REPO_ROOT, "tools", "setup-agent-mcp.ps1")]
1322
- res = subprocess.run(cmd, cwd=REPO_ROOT)
1323
- return res.returncode
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.11)")
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.11)
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.11")
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.10).
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
- registration_commands = if ($qoderCmd) {
72
- @(
73
- "$($qoderCmd.Name) mcp add --global fwloop -- $fwCmdName",
74
- "$($qoderCmd.Name) mcp add --global agentic-hil -- $ahilCmdName"
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 配置与 Skills
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
- [System.IO.File]::WriteAllText($antigravityMcpConfigFile, $updatedJsonStr, [System.Text.Encoding]::UTF8)
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
- [System.IO.File]::WriteAllText($mcpJsonPath, $jsonContent, [System.Text.Encoding]::UTF8)
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
- Write-Host " - CLI: $($report.agents.qoder.registration_commands[0])"
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