| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
test: gate host-only behaviour and stop holding the file we replace The last four Windows reds — two of them the confirmed tier-2 items: - saved_config_roundtrips_language handed save() the path of a live NamedTempFile, so the atomic replace renamed over a file the test itself held open; Windows refuses that (os error 5). The store is not at fault: a probe over the same tempfile path shows the replace succeeding when nobody holds the target and failing the moment anyone does. The fixture now uses a tempdir path. - reqwest_aborts_whole_build_on_one_bad_root proves a rustls internal (from_der stores bytes, build() validates). The Windows build deliberately uses SChannel (native-tls) for *.atomgit.com, where from_der validates eagerly, so the premise is gone. Gated to the rustls backends; the user-facing backstop test runs on both. - Eight hook fixtures assert the *shell's* semantics (echo '{"…"}', ;, &&, >&2, exit 2); Windows runs hooks through cmd /C, where those write differently. Gated to unix, where that shell is. The plugin entry-point fixtures now name an interpreter the host resolves, and the rejection rules keep running everywhere. - install-version.py skipped on shutil.which("bash"), which on Windows finds the WSL launcher — present, but unable to run anything without a distribution. It now probes the shell it is about to use. Validation (Windows, serial): tui lib 1580/0, cli lib 299/0, cli bin 143/0, capabilities session 258/0, cc-hooks 56/0, permission_rules 20/0, config 318/0; install-version.py 6/6, install-version.ps1 7/7; gates/compile.sh green; fmt --check clean. Provider-URL: https://gitcode.com/atomgit_atomcode/atomcode Co-Authored-By: AtomCode (deepseek-flash) <noreply@atomgit.com> | 14 天前 | |
fix(acp): connect v2 http MCP, normalize resume cwd, order-pair replay results, harden smoke Follow-up fixes to the ACP v2 enhancement (881e7afd), from code review. - v2: client-injected HTTP MCP servers were advertised (mcp.http capability) but silently dropped into the ignored list — v1 connected them. Connect them in v2 too (mirrors the v1 arm) so the advertised capability is backed. - dispatch: session/resume compared cwd to the stored working_dir by exact PathBuf equality, wrongly rejecting a trailing slash / . segment / symlink spelling of the same dir. New cwd_matches: exact -> component-wise -> canonicalize. Deliberately no lexical case-folding (the storage bucket key case-folds only on Windows; folding elsewhere would admit a cwd stored in a different bucket). - replay: tool results were paired to calls by a single whole-snapshot map (last write wins), so duplicate/empty tool_call_ids from weak/gateway models misattributed output. Pair FIFO per id in conversation order instead. - replay/translate/v2/dispatch: rawInput dropped to null when persisted args were not valid JSON; pass the raw string through as a JSON string instead (shared raw_input_from_arguments helper). - sessions: an unknown slash command falling through to the kernel became the live session title; derive_title now skips command-shaped first lines (/word …) while still titling leading paths (/usr/bin/x …). - mcp: rename inverted absolute local to relative; fix stale "NOT connected" log to describe only the ignored remainder. - scripts/acp_smoke.py: bound the blocking readline() with a per-request watchdog (generation + lock guarded) so a wedged agent fails loudly instead of hanging forever, without a late timer killing a reused process. New/updated tests: v2 http connect, cwd_matches equivalence, FIFO duplicate-id pairing, raw_input passthrough, derive_title slash-skip. 82 acp unit + 13 e2e green; acp_smoke.py green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Provider-URL: https://gitcode.com/atomgit_atomcode/atomcode | 2 个月前 | |
fix(scripts): analyze_datalogs 适配当前 datalog 格式 + 输出请求级耗时 脚本此前解析的是废弃的老格式(**Step N**、**Stats:** N steps),对当前 datalog(### Turn N、 - tool、**Stats:** N turns, M tool calls)一律 total_steps=0 → 直接跳过,新加的 dur 数据无可用读取方。 - parse_datalog 重写到当前语法:Stats 认 turns/tool calls;step 由工具 调用 bullet 与 **Tool result** 块按执行顺序配对重建。 - 规则工具名改 snake_case(read_file/edit_file/write_file/bash/…),抗 模式规则(re-read/multi-edit/edit-failed/bash-read-file)重新生效。 - 新增 Timing 报告:抽每-round dur= 与每-tool dur=,报最慢 round/工具。 - _arg_path 解析 JSON args 取真实文件名(旧 rsplit 会取出 x"} 垃圾)。 仅改 dev 工具脚本;端到端跑当前格式样本自验证通过。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Provider-URL: https://gitcode.com/atomgit_atomcode/atomcode | 1 个月前 | |
refactor(tui): retire atomcode-tuix and verify command replacements Provider-URL: https://gitcode.com/atomgit_atomcode/atomcode | 19 天前 | |
fix(install): resolve fallback versions from the release manifest Provider-URL: https://gitcode.com/atomgit_atomcode/atomcode | 22 天前 | |
fix(install): resolve fallback versions from the release manifest Provider-URL: https://gitcode.com/atomgit_atomcode/atomcode | 22 天前 | |
fix(webui): embed the assets in debug too, and fail loudly when they are absent Four ways the frontend could go missing, none of which said so. **Debug builds did not embed at all.** rust-embed reads the folder off disk at runtime unless debug-embed is on, using the absolute path recorded at compile time. A debug binary was therefore bound to the checkout it was built in: move the tree and /webui starts serving 404, and the binary cannot be handed to anyone. Verified both ways — before, moving webui/dist aside broke a *running* server; now the same move changes nothing. Costs ~700 KB in the debug binary and means a frontend change needs a Rust rebuild; ATOMCODE_WEBUI_DEV=http://localhost:5173 remains the fast loop for frontend work and is unaffected. **The release scripts claimed a fallback that does not exist.** All five warned "using committed webui/dist" and carried on when npm was missing — but webui/dist is gitignored, so there is nothing committed to use. The result was a release whose UI is entirely absent, shipped on a warning nobody reads. Now fatal, with a third check that dist/index.html actually appeared: allow_missing means a half-failed frontend build would otherwise sail through as an empty UI. All three guards exercised. **webui bound a port and opened a browser before discovering it had nothing to serve.** It now checks up front and exits 1 without touching the port. **The 404 body said "webui not built"** and left the reader to work out what to do. It now names the two commands. Same text in both places, so the answer does not depend on where you hit it. webui assets are not embedded in this binary. Build the frontend first, then rebuild: cd webui && npm install && npm run build cargo build -p atomcode Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> | 2 个月前 | |
fix(webui): embed the assets in debug too, and fail loudly when they are absent Four ways the frontend could go missing, none of which said so. **Debug builds did not embed at all.** rust-embed reads the folder off disk at runtime unless debug-embed is on, using the absolute path recorded at compile time. A debug binary was therefore bound to the checkout it was built in: move the tree and /webui starts serving 404, and the binary cannot be handed to anyone. Verified both ways — before, moving webui/dist aside broke a *running* server; now the same move changes nothing. Costs ~700 KB in the debug binary and means a frontend change needs a Rust rebuild; ATOMCODE_WEBUI_DEV=http://localhost:5173 remains the fast loop for frontend work and is unaffected. **The release scripts claimed a fallback that does not exist.** All five warned "using committed webui/dist" and carried on when npm was missing — but webui/dist is gitignored, so there is nothing committed to use. The result was a release whose UI is entirely absent, shipped on a warning nobody reads. Now fatal, with a third check that dist/index.html actually appeared: allow_missing means a half-failed frontend build would otherwise sail through as an empty UI. All three guards exercised. **webui bound a port and opened a browser before discovering it had nothing to serve.** It now checks up front and exits 1 without touching the port. **The 404 body said "webui not built"** and left the reader to work out what to do. It now names the two commands. Same text in both places, so the answer does not depend on where you hit it. webui assets are not embedded in this binary. Build the frontend first, then rebuild: cd webui && npm install && npm run build cargo build -p atomcode Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> | 2 个月前 | |
fix(webui): embed the assets in debug too, and fail loudly when they are absent Four ways the frontend could go missing, none of which said so. **Debug builds did not embed at all.** rust-embed reads the folder off disk at runtime unless debug-embed is on, using the absolute path recorded at compile time. A debug binary was therefore bound to the checkout it was built in: move the tree and /webui starts serving 404, and the binary cannot be handed to anyone. Verified both ways — before, moving webui/dist aside broke a *running* server; now the same move changes nothing. Costs ~700 KB in the debug binary and means a frontend change needs a Rust rebuild; ATOMCODE_WEBUI_DEV=http://localhost:5173 remains the fast loop for frontend work and is unaffected. **The release scripts claimed a fallback that does not exist.** All five warned "using committed webui/dist" and carried on when npm was missing — but webui/dist is gitignored, so there is nothing committed to use. The result was a release whose UI is entirely absent, shipped on a warning nobody reads. Now fatal, with a third check that dist/index.html actually appeared: allow_missing means a half-failed frontend build would otherwise sail through as an empty UI. All three guards exercised. **webui bound a port and opened a browser before discovering it had nothing to serve.** It now checks up front and exits 1 without touching the port. **The 404 body said "webui not built"** and left the reader to work out what to do. It now names the two commands. Same text in both places, so the answer does not depend on where you hit it. webui assets are not embedded in this binary. Build the frontend first, then rebuild: cd webui && npm install && npm run build cargo build -p atomcode Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> | 2 个月前 | |
fix(webui): embed the assets in debug too, and fail loudly when they are absent Four ways the frontend could go missing, none of which said so. **Debug builds did not embed at all.** rust-embed reads the folder off disk at runtime unless debug-embed is on, using the absolute path recorded at compile time. A debug binary was therefore bound to the checkout it was built in: move the tree and /webui starts serving 404, and the binary cannot be handed to anyone. Verified both ways — before, moving webui/dist aside broke a *running* server; now the same move changes nothing. Costs ~700 KB in the debug binary and means a frontend change needs a Rust rebuild; ATOMCODE_WEBUI_DEV=http://localhost:5173 remains the fast loop for frontend work and is unaffected. **The release scripts claimed a fallback that does not exist.** All five warned "using committed webui/dist" and carried on when npm was missing — but webui/dist is gitignored, so there is nothing committed to use. The result was a release whose UI is entirely absent, shipped on a warning nobody reads. Now fatal, with a third check that dist/index.html actually appeared: allow_missing means a half-failed frontend build would otherwise sail through as an empty UI. All three guards exercised. **webui bound a port and opened a browser before discovering it had nothing to serve.** It now checks up front and exits 1 without touching the port. **The 404 body said "webui not built"** and left the reader to work out what to do. It now names the two commands. Same text in both places, so the answer does not depend on where you hit it. webui assets are not embedded in this binary. Build the frontend first, then rebuild: cd webui && npm install && npm run build cargo build -p atomcode Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> | 2 个月前 | |
chore(release): latest.json 加 commit 字段,让按 tag 锁版本者能自检版本滞后(反馈 E1) "chore: sync latest.json" 提交落在打 tag 之后,所以 checkout tag → 读 latest.json 拿到的 是上一版的 sha256。release.sh 生成 manifest 时加 "commit": <本次构建的 HEAD>,消费方把它和 自己 checkout 的 tag commit 一比就能发现滞后,而不是静默拿到错的 sha256。(彻底修需把 sync 提交挪到 tag 前,那是发布流程/人手环节,非本脚本能强制。) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Provider-URL: https://gitcode.com/atomgit_atomcode/atomcode | 1 个月前 | |
feat(harness): 请求仪表 —— 记下每个请求的形状,查 resume 用 ## 它回答什么 「resume 后进程到底发出了什么?」请求 = system prompt + derive_messages(日志), 两半都在这里可见;后半是日志的纯函数,所以一个与 live 不同的请求,只可能因为 **进程持有的日志**不同。events / max_seq 说那是哪份日志,逐消息哈希说它折出 了什么。两次 dump 一比,第一条变化的消息就是断裂点。 刻意做成旁路而不是日志事实:它是调试器械,不该进 session;而给 build_request_body 加诊断就变成改 wire 了。默认关闭(环境变量没设就直接返回)。 ## 环境变量名落在 model_source 第一版在 agent_loop.rs 里直接 std::env::var_os,被 reasoning_effort.rs::nothing_outside_the_source_module_reaches_the_environment 拦下——**那条闸门是对的**,而且它的文档正好写着「一个公共的 env 读取器就是当初 读取散落各处的逃生口,第一次就是被这么绕过去的」。照 web_search_provider() 的 成例加 request_dump_path(),调用点只消费、不解析。 ## 实测它抓到了什么 这就是那次验证用的器械,结论已并入会话:resume 后的请求与日志投影**逐字节 一致**——Assistant 92,825 字节、Tool 786,569 字节,与从日志重建的完全相同; reasoning 也逐条对上(如 rlen=27109)。所以客户端一个字节都没丢,resume 是保真的。 (过程里我自己犯过一次单位错误:Python 数字符、Rust 的 m.text.len() 数字节, 中文 3 字节/字符,一度误判「少了 144193 字符」。已用字节重算澄清。) ## 顺带 scripts/resume-probe.sh:一键跑这个实验。头部写明了那个真实的坑——**必须在 独立终端里跑**,不能从另一个 TUI 里起(两个全屏界面抢 tty,后起的 failed to mount: cannot take the terminal 然后立刻退出,目录建好、dump 全空,看起来像 脚本坏了)。 验证:nextest -p atomcode-harness -p atomcode-coding 858 passed / 8 skipped; 仪表在重构后仍可用(实测写出 dump);cargo fmt --all -- --check 退 0。 Co-Authored-By: AtomCode (deepseek-flash) <noreply@atomgit.com> | 1 个月前 | |
chore: add one-click dev environment setup script scripts/setup.sh 支持 macOS / Linux,自动安装系统依赖、rustup 工具链、 rustfmt/clippy,可选 --release 构建验证和 --cross 交叉编译 target。 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> | 7 个月前 | |
build: add macOS codesign + notarize for atomcode release binary New scripts/sign-macos.sh: - codesign with Developer ID (hardened runtime + RFC 3161 timestamp) - ditto-zip + notarytool submit --wait - skips atomcode-daemon per project decision (user-facing launcher only) - preflight checks: identity in keychain, notarytool profile valid - env overrides for identity, profile, and skip-notarize release.sh now calls sign-macos.sh on \$DIST before tar.gz packaging, so the released .tar.gz contains a signed + notarized atomcode binary. Skip via ATOMCODE_SKIP_SIGN=1. One-time setup required (per-machine): xcrun notarytool store-credentials atomcode-notary \\ --apple-id <email> --team-id T949H383MF \\ --password <app-specific-password> Limitations: tar.gz can't carry a stapled ticket, so Gatekeeper queries Apple online on first run. For offline-valid tickets, package into .dmg or .pkg and staple (future work). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> | 6 个月前 | |
fix(scripts): test-all.sh 构建失败文案分流 + 删冗余判定 + smoke 补部分失败场景 跟进 !787 code-review 的三个低优项: #1 文案分流:cargo 退出非 0 且 FAILED==0 时,旧文案一律写"no tests counted", 但 --workspace 下常见"crate A 测试全过、crate B 编译失败"——此时 PASSED>0, 报告里 "Passed: N" 与 "no tests counted" 自相矛盾。改为按 PASSED 分流:==0 才说 no tests counted;>0 说"N test(s) passed but the build/run did not fully complete"。 退出码两种都仍是 1(判定本就正确,只修误导文案)。 #2 删冗余:第二个 guard 的 || [ "$cargo_status" -ne 0 ] 是死条件——能走到这里且 cargo!=0 必然 FAILED>0(FAILED==0 的非 0 已被上一 guard 拦截),恒被 FAILED>0 覆盖。 收成 if [ "$FAILED" -gt 0 ],消掉"改上面 guard 就静默改行为"的隐患。 #6 smoke 补第 4 场景 partial_failure:fake cargo 先出 crate-a 的 test result: ok + "... ok" 行、再出 crate-b 的 error[...]、退出 101,断言退出码 1 且报告写 "build did not fully complete"——锁死 #1 的分流行为。 bash -n 语法过;smoke 4 场景全绿(compile/test/all-pass/partial)。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Provider-URL: https://gitcode.com/atomgit_atomcode/atomcode | 3 个月前 | |
refactor(tui): retire atomcode-tuix and verify command replacements Provider-URL: https://gitcode.com/atomgit_atomcode/atomcode | 19 天前 | |
fix(scripts): test-all.sh 构建失败文案分流 + 删冗余判定 + smoke 补部分失败场景 跟进 !787 code-review 的三个低优项: #1 文案分流:cargo 退出非 0 且 FAILED==0 时,旧文案一律写"no tests counted", 但 --workspace 下常见"crate A 测试全过、crate B 编译失败"——此时 PASSED>0, 报告里 "Passed: N" 与 "no tests counted" 自相矛盾。改为按 PASSED 分流:==0 才说 no tests counted;>0 说"N test(s) passed but the build/run did not fully complete"。 退出码两种都仍是 1(判定本就正确,只修误导文案)。 #2 删冗余:第二个 guard 的 || [ "$cargo_status" -ne 0 ] 是死条件——能走到这里且 cargo!=0 必然 FAILED>0(FAILED==0 的非 0 已被上一 guard 拦截),恒被 FAILED>0 覆盖。 收成 if [ "$FAILED" -gt 0 ],消掉"改上面 guard 就静默改行为"的隐患。 #6 smoke 补第 4 场景 partial_failure:fake cargo 先出 crate-a 的 test result: ok + "... ok" 行、再出 crate-b 的 error[...]、退出 101,断言退出码 1 且报告写 "build did not fully complete"——锁死 #1 的分流行为。 bash -n 语法过;smoke 4 场景全绿(compile/test/all-pass/partial)。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Provider-URL: https://gitcode.com/atomgit_atomcode/atomcode | 3 个月前 | |
feat(headless): 默认静默 + -v / --verbose — Claude Code -p style 干净输出 用户反馈:Claude Code 的 -p 模式输出只有最终回复,干净。AtomCode 之前虽然 把工具日志/tokens 摘要从 stdout 移到了 stderr,但终端默认会同时显示 stdout+stderr,视觉上仍然夹杂 [tool→ ...]、[tokens] ...、[done] ... 噪音。 新默认: | Event | 默认 | -v | |------------------------|-------|------| | TextDelta | stdout| stdout | | ToolCallStarted/Result | 静默 | stderr | | TokenUsage | 静默 | stderr | | TurnComplete 摘要 | 静默* | stderr | | WorkingDirChanged | 静默 | stderr | | SubAgentProgress | 静默 | stderr | | PhaseChange | 静默 | 静默 | | ApprovalNeeded | stderr| stderr | ← 安全信号必须可见 | Error | stderr| stderr | | TurnCancelled | stderr| stderr | (*) TurnComplete 在默认模式下仍补 stdout 末尾换行,只是省略 [done] 摘要 为何 -v 是 opt-in:用户常态使用 -p 都要"干净答案",verbose 是少数 debug 场景。把多数路径设为默认更符合最少惊讶原则。 改动: - crates/atomcode-cli/src/main.rs:Cli.verbose 字段;run_headless 增加 verbose 参数;6 处 eprintln 改 if verbose - scripts/test-headless.sh:T3 加 -v;新增 T3b 验证默认 stderr 全空 - docs/headless-pipe-plan.md:追加 §7 verbose addendum Live verify (--release,real provider): - atomcode -p "用一句话介绍这个项目" → exit 0, stdout: 314 字节最终回复, stderr: 0 字节 ✓ - atomcode -v -p "..." → exit 0, stdout: 同上, stderr: 7 行(tool× 4 + tokens + done)✓ 回归: - cargo test -p atomcode --bin atomcode 5/5 PASS - ./scripts/test-headless.sh T5/T5b PASS, T1/T2/T3/T3b/T4 SKIP(无 provider) - cargo build 0 warning / 0 error Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> | 6 个月前 | |
refactor: 统一 ATOMCODE_HOME 语义,废弃 ATOMCODE_HOME_OVERRIDE 此前 ATOMCODE_HOME 在工程内存在两套互不兼容的语义: - 语义 A(Config::config_dir):直接把 ATOMCODE_HOME 当 config 根, 即 ATOMCODE_HOME=/X 等价于 ~/.atomcode/;config.toml、history、 memory.md 等都按此路径解析。 - 语义 B(skill/plugin/setup/event_loop):把 ATOMCODE_HOME 当 $HOME 替身,再追加 .atomcode/,即 ATOMCODE_HOME=/X 解析为 /X/.atomcode/。 后果是设了 ATOMCODE_HOME=/X 的用户数据目录会被劈成两半(/X 和 /X/.atomcode 各放一部分),且 uninstall 走另一套独立的 ATOMCODE_HOME_OVERRIDE 变量,自定义过路径的用户运行 uninstall 找不到自己的数据。 本次统一到语义 A,所有目录解析都走 Config::config_dir(): - crates/atomcode-core/src/skill.rs: SkillRegistry::reload 不再 手动拼 .atomcode 子目录 - crates/atomcode-core/src/plugin/paths.rs: plugins_root() 同上 - crates/atomcode-core/src/setup/mod.rs: install_directory_skills_from_seeds 删除双分支逻辑 - crates/atomcode-tuix/src/event_loop/mod.rs: should_auto_show_setup 同上,顺手清理一处多余的重复闭合括号 - crates/atomcode-core/src/uninstall/paths.rs: atomcode_dir() 切到 Config::config_dir(),废弃独立的 ATOMCODE_HOME_OVERRIDE - scripts/uninstall.sh / uninstall.ps1: 同步从 ATOMCODE_HOME_OVERRIDE 改读 ATOMCODE_HOME 测试同步更新:uninstall_integration 把 env 从 ATOMCODE_HOME_OVERRIDE 换成 ATOMCODE_HOME 并去掉 .atomcode 子目录;skill 测试里两处期望路径 从 tmp/.atomcode/plugins 改为 tmp/plugins。 验证: - cargo check -p atomcode-core -p atomcode -p atomcode-tuix 通过 - 6 个 uninstall::paths + plugin::paths 单测通过 - 24 个 skill 单测全过 - plugin_integration 端到端测试通过(ATOMCODE_HOME=tmp 后能正确 扫到 tmp/plugins/.../skills/sk) - uninstall_integration 3 个测试通过 | 5 个月前 | |
refactor: retire atomcode-core crate Provider-URL: https://gitcode.com/atomgit_atomcode/atomcode | 3 个月前 |
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 14 天前 | ||
| 2 个月前 | ||
| 1 个月前 | ||
| 19 天前 | ||
| 22 天前 | ||
| 22 天前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 7 个月前 | ||
| 6 个月前 | ||
| 3 个月前 | ||
| 19 天前 | ||
| 3 个月前 | ||
| 6 个月前 | ||
| 5 个月前 | ||
| 3 个月前 |