| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
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 个月前 | |
feat(tuix): higher-res welcome mascot (13×6) + overflow-safe two-column layout Redraw the welcome cat from the reference art at CELLS_WIDE=13 (was 9): at 9 cells the two eyes merged into one central blob and the ears were flat; 13×6 (≈13×12 px, near-square in cells) resolves two pointed ears + two eyes with highlights. The reference had a solid background, so it was pre-processed by flood-filling the border background to transparency (enclosed eyes survive) before running scripts/gen_mascot.py (CELLS_WIDE bumped to 13, preprocessing documented). Layout: the welcome compose math is already parameterised on MASCOT_WIDTH, so wider/taller scales cleanly — EXCEPT the two-column tips threshold used a hardcoded min_right=24 that underestimated the widest tip, so two-column engaged before the tips fit and the emulator hard-wrapped them (worse with the wider mascot, but pre-existing). Derive min_right from the ACTUAL widest tip row so two-column only engages when the tips fit; below that, stack. Adds welcome_rows_never_exceed_width (no composed row exceeds the width, 50–120 cols). Refactor: extract the (top,bottom)→Cell half-block choice into a free mascot_cell() fn and test its four branches directly (transparent-top→▄ etc.), instead of relying on the current art happening to contain each pixel kind. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Provider-URL: https://gitcode.com/atomgit_atomcode/atomcode | 3 个月前 | |
chore: revert install scripts default version to v5.0.2 | 2 个月前 | |
chore: revert install scripts default version to v5.0.2 | 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 个月前 | |
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: 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> | 6 个月前 | |
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 个月前 | |
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 个月前 |
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 2 个月前 | ||
| 1 个月前 | ||
| 3 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 6 个月前 | ||
| 6 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 6 个月前 | ||
| 5 个月前 | ||
| 3 个月前 |