<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>开发工具 on 魔都水滴</title>
		<link>https://blog.margrop.net/tag/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/</link>
		<description>Recent content in 开发工具 on 魔都水滴</description>
		<generator>Hugo</generator>
		<language>zh-CN</language>
		
		
		
		
			<lastBuildDate>Sat, 27 Jun 2026 08:00:00 +0800</lastBuildDate>
		
			<atom:link href="https://blog.margrop.net/tag/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>Windows 终于有了原生 Linux 命令：微软 coreutils 让你告别 WSL、Cygwin 和 Git Bash</title>
				<link>https://blog.margrop.net/post/windows-native-linux-commands-microsoft-coreutils/</link>
				<pubDate>Sat, 27 Jun 2026 08:00:00 +0800</pubDate>
				<guid>https://blog.margrop.net/post/windows-native-linux-commands-microsoft-coreutils/</guid>
				<description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;先问一个问题：&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;你有没有过这种体验——在 Windows 终端里想用 &lt;code&gt;grep&lt;/code&gt; 过滤一下日志，结果 PowerShell 告诉你 &lt;code&gt;grep&lt;/code&gt; 不是内部命令；想用 &lt;code&gt;find&lt;/code&gt; 批量查找文件，结果 Windows 的 &lt;code&gt;find&lt;/code&gt; 和 Linux 的 &lt;code&gt;find&lt;/code&gt; 完全是两个东西；写了个跨平台脚本，到了 Windows 上就得全部重写？&lt;/p&gt;&#xA;&lt;p&gt;这不是你的问题，这是 Windows 和 Linux 命令行之间那道&amp;quot;柏林墙&amp;quot;的问题。&lt;/p&gt;&#xA;&lt;p&gt;好消息是，微软自己动手拆墙了。2025 年底，微软在 GitHub 上开源了 &lt;strong&gt;coreutils&lt;/strong&gt; 项目——一个原生 Windows 版本的 Linux 核心命令集。不需要 WSL，不需要 Cygwin，不需要 Git Bash，一条 &lt;code&gt;winget install&lt;/code&gt; 就能让你的 Windows 终端直接听懂 &lt;code&gt;ls&lt;/code&gt;、&lt;code&gt;grep&lt;/code&gt;、&lt;code&gt;sed&lt;/code&gt;、&lt;code&gt;awk&lt;/code&gt;。&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
			</item>
			<item>
				<title>Mac 应用打不开？别急着删：可能只是 Gatekeeper 不认这个未签名工具</title>
				<link>https://blog.margrop.net/post/macos-gatekeeper-unsigned-app-fix/</link>
				<pubDate>Mon, 01 Jun 2026 07:35:00 +0800</pubDate>
				<guid>https://blog.margrop.net/post/macos-gatekeeper-unsigned-app-fix/</guid>
				<description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;先说结论&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;如果一个 macOS 工具下载后双击打不开，提示“无法验证开发者”“已损坏，无法打开”或被系统直接拦住，不要第一时间把它理解成“程序坏了”。很多时候，真正的问题是两个条件叠在一起：这个 &lt;code&gt;.app&lt;/code&gt; 带着浏览器下载留下的 &lt;code&gt;com.apple.quarantine&lt;/code&gt; 隔离属性，同时它没有 Apple 能认可的可用签名。Gatekeeper 在首次打开时看到“来自网络 + 没有可信签名”，自然会把它拦下来。&lt;/p&gt;&#xA;&lt;p&gt;对明确知道来源、只在自己机器上使用的小工具，最小修复通常是：先验证隔离属性和签名状态，再对这个 app 做本地 ad-hoc 签名，最后移除它自己的 quarantine 属性。这里的关键不是“关闭 macOS 安全”，而是只处理一个具体 app，不动全局 Gatekeeper，也不把临时本地修复误认为正式分发签名。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;这篇文章来自一次真实的本地排障，但所有涉及个人机器、内网、下载来源、账号、路径细节的内容都已经脱敏。文中只使用 &lt;code&gt;/Applications/&amp;lt;App&amp;gt;.app&lt;/code&gt;、&lt;code&gt;&amp;lt;App&amp;gt;&lt;/code&gt;、&lt;code&gt;&amp;lt;Vendor&amp;gt;&lt;/code&gt; 这类占位符。重点不是公开某个私有环境，而是把这类 macOS 启动失败的判断路径整理出来，方便以后遇到类似问题时少走弯路。&lt;/p&gt;</description>
			</item>
			<item>
				<title>Claude Code 一升级就全模型 400：别急着换 Key，可能是网关没跟上新版协议</title>
				<link>https://blog.margrop.net/post/claude-code-invalid-message-role-system/</link>
				<pubDate>Fri, 29 May 2026 15:30:00 +0800</pubDate>
				<guid>https://blog.margrop.net/post/claude-code-invalid-message-role-system/</guid>
				<description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;先说结论&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;这次故障的表象非常吓人：Claude Code 更新之后，不管访问哪个模型，都会立刻报 &lt;code&gt;API Error: 400 invalid params, chat content has invalid message role: system (2013)&lt;/code&gt;。如果只看错误，很容易怀疑 API Key 失效、模型下线、余额不足、代理坏了、环境变量乱了，甚至怀疑所有模型同时挂掉。真正的根因不是这些，而是新版 Claude Code 发出的请求结构和某些 Anthropic-compatible 模型网关之间出现了兼容断层：网关把不该出现在 chat content 中的 &lt;code&gt;system&lt;/code&gt; role 当成非法消息拒绝了。&lt;/p&gt;&#xA;&lt;p&gt;最小可用修复也很朴素：先用最小 prompt 复现，再对相邻版本做二分式验证。最终确认 &lt;code&gt;2.1.150&lt;/code&gt; 能正常返回，&lt;code&gt;2.1.154&lt;/code&gt; 和 &lt;code&gt;2.1.156&lt;/code&gt; 会复现 400，于是把全局 Claude Code 固定回 &lt;code&gt;2.1.150&lt;/code&gt;。这不是“玄学回滚”，而是基于证据找到最后一个已知可用版本。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;这篇文章记录一次 Claude Code 本地环境排障。它不是一个复杂到需要改源码的问题，但很有代表性：AI Agent 工具链越来越依赖模型网关、兼容协议、环境变量、版本更新和本地 provider 切换；当其中一层发生协议细节变化时，终端里看到的却往往只是一句抽象的 400。&lt;/p&gt;&#xA;&lt;p&gt;为了避免泄露任何隐私信息，本文不会出现真实内网地址、真实用户名、真实 token、真实私有 provider 名称、真实本机路径或私有服务域名。所有配置片段都使用 &lt;code&gt;&amp;lt;PLACEHOLDER&amp;gt;&lt;/code&gt;、&lt;code&gt;&amp;lt;MODEL_GATEWAY&amp;gt;&lt;/code&gt;、&lt;code&gt;&amp;lt;MODEL_NAME&amp;gt;&lt;/code&gt; 等占位符表示。文章重点是分享排障方法，而不是公开某个具体环境。&lt;/p&gt;</description>
			</item>
			<item>
				<title>别等 Codex 额度归零才后悔：这个“重置雷达”能提前亮灯</title>
				<link>https://blog.margrop.net/post/codex-reset-radar-quota-reset-guide/</link>
				<pubDate>Sun, 24 May 2026 08:10:00 +0800</pubDate>
				<guid>https://blog.margrop.net/post/codex-reset-radar-quota-reset-guide/</guid>
				<description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;先说结论&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;最近 Codex 的额度重置变得比以前更值得关注：有时是常规周期，有时是服务故障后的补偿性重置，有时是限额消耗异常后的官方修复。对重度 Codex 用户来说，真正尴尬的不是“额度被重置”，而是“我明明还剩不少周额度，却在重置前没有及时用掉”。&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;Codex 重置雷达&lt;/code&gt; 做的事情很简单：把官方状态页、官方/社区公开动态、历史重置窗口和当前预测信号聚合起来，判断是否出现“即将或正在重置”的窗口。它不是魔法预测器，也不是 OpenAI 官方服务；它更像一个面向 Codex 用户的早期预警看板：当信号足够强时，提醒你赶紧把当前周期剩余的 Codex 周额度用在真正需要的任务上。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;本文只讨论公开信息、公开网页和公开状态信号，不包含任何私有账号、Token、真实业务系统、内网地址或个人使用数据。文中提到的“额度”“重置”“速蹬窗口”都是面向普通 Codex 用户的体验分析，不构成对 OpenAI 官方计费、订阅或服务策略的承诺。&lt;/p&gt;</description>
			</item>
			<item>
				<title>MCP 明明没配错，为什么一启动就挂？一次 Codex MCP 故障的完整拆解</title>
				<link>https://blog.margrop.net/post/codex-mcp-startup-swift-runtime-troubleshooting/</link>
				<pubDate>Sat, 23 May 2026 06:10:00 +0800</pubDate>
				<guid>https://blog.margrop.net/post/codex-mcp-startup-swift-runtime-troubleshooting/</guid>
				<description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;先说结论&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;这次故障最容易误判的地方，是表面错误写着 “MCP Client 启动失败”“MCP Server 握手失败”，于是人很自然会去怀疑 MCP 配置、插件开关、网络、Token、JSON 格式、stdio 协议，甚至怀疑 Codex 本身挂了。但真正的根因并不在 MCP 协议层：某个 MCP Server 对应的本地二进制在启动瞬间就被 macOS 动态链接器杀掉了，根本没有机会完成 &lt;code&gt;initialize&lt;/code&gt; 握手。Client 看到的只是连接提前关闭，Server 端真正留下的线索是 &lt;code&gt;dyld: Symbol not found&lt;/code&gt;，缺的是 Swift Concurrency runtime 里的一个符号。&lt;/p&gt;&#xA;&lt;p&gt;换句话说：MCP 没有来得及失败，Server 进程先死了。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;这篇文章记录一次很典型、也很容易绕远路的 Agent 工具链故障：Codex 里 MCP Client / MCP Server 启动异常。它不是一个“修改配置就好”的问题，而是一个从应用层错误一路追到本地二进制、动态链接器、Swift runtime 兼容性的排障过程。&lt;/p&gt;&#xA;&lt;p&gt;为了避免泄露任何隐私信息，本文不包含真实内网地址、真实用户名、真实会话 ID、真实本机绝对路径、Token、私有仓库地址或任何业务系统名称。文中路径都使用 &lt;code&gt;~&lt;/code&gt;、&lt;code&gt;&amp;lt;USER_HOME&amp;gt;&lt;/code&gt;、&lt;code&gt;&amp;lt;PLUGIN_DIR&amp;gt;&lt;/code&gt;、&lt;code&gt;&amp;lt;PROJECT&amp;gt;&lt;/code&gt; 等占位符表示；命令输出也只保留与判断根因有关的公开技术字段。&lt;/p&gt;</description>
			</item>
			<item>
				<title>Codex 0.130 后 /approvals 没了？别慌，权限开关都搬到启动参数了</title>
				<link>https://blog.margrop.net/post/codex-130-approval-flags/</link>
				<pubDate>Tue, 12 May 2026 18:50:00 +0800</pubDate>
				<guid>https://blog.margrop.net/post/codex-130-approval-flags/</guid>
				<description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;先说结论&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;如果你升级到 Codex 0.130.0（很多人会口头叫 Codex 0.130）之后，发现以前习惯在会话里用的 &lt;code&gt;/approvals&lt;/code&gt; 不见了，不要急着回退版本。现在更稳定的做法，是在启动 Codex 时就把权限策略说清楚：用 &lt;code&gt;--ask-for-approval&lt;/code&gt; 控制什么时候询问，用 &lt;code&gt;--sandbox&lt;/code&gt; 控制命令能操作哪些文件，确实处在外部隔离环境里时，再使用 &lt;code&gt;--dangerously-bypass-approvals-and-sandbox&lt;/code&gt; 一次性跳过确认和沙箱。这个长参数也可以直接写成 &lt;code&gt;--yolo&lt;/code&gt;，更方便记忆和输入，也更接近 Gemini 等工具里常见的命名习惯。&lt;/p&gt;&#xA;&lt;p&gt;换句话说，思路从“进会话后再临时切权限”，变成“启动前就选择运行档位”。这篇文章会把常用参数、推荐组合、风险边界和 shell alias 写法一次讲清楚。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;本文只讨论公开的 Codex CLI 参数和通用工作流，不包含任何真实主机、内网地址、用户名、Token、私有路径或业务项目名。所有命令都用 &lt;code&gt;&amp;lt;PROJECT&amp;gt;&lt;/code&gt;、&lt;code&gt;&amp;lt;TASK&amp;gt;&lt;/code&gt; 这类占位符表示，你可以按自己的环境替换。&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
