| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
fix(ci): stop the frozen-CHANGELOG check firing on a merged branch (#525) * fix(ci): stop the frozen-CHANGELOG check firing on a merged branch The check diffed line ranges since the merge base, so any branch that merged `main` after a release saw the new `## [X.Y.Z]` section as lines it had touched — even though the section arrived through the merge. It fired on #508 within a day of being added. It now compares the released half of the file against the base branch directly, which is the question it was always asking: does this branch's copy of an already-released section differ from the base's? A section the base has and the branch does not is a stale branch, not a rewrite, and is allowed. Two pipelines also exited 141 under `pipefail`: `head -1` and `grep -q` both close the pipe on completion, and the resulting SIGPIPE counted as failure. The second made the check announce "HEAD predates <release>" on a branch that contained it. Both replaced with parameter expansion. Controlled both ways rather than assumed: run against 4844020, where #517's entry genuinely sat inside the released [1.33.0], it still fails and names the lines; run against a branch that merged main post-release, it passes. * fix(changelog): move this branch's entry out of the released 1.35.0 section The branch predates v1.35.0. Merging main brought the release heading down over an entry that was written under [Unreleased], so the bullet ended up inside a tagged section. Relocated, not rewritten: [1.35.0] keeps exactly the two entries that shipped in it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5 <noreply@anthropic.com> | 14 天前 | |
ci: reject duplicate CHANGELOG section headings `bin/release` copies `## [Unreleased]` into the new version section verbatim, so a repeated `### ` heading there ships release notes with the entries split across two identical headings. It is valid Markdown and invisible in review, which is why it kept happening — I introduced one merging #429, fixed it in #436, then reintroduced it in #439 and caught it only when `bin/release` produced a visibly wrong 1.29.0 section. The check found the same defect in four already-released sections (1.19.0, 1.13.0, 1.4.0, 1.1.1), so this predates today by months. Those are folded here so the check can be enforced repo-wide instead of carrying an exemption list. The fold is deliberately minimal: duplicate headings are merged into their first occurrence and section order is left exactly as it was, rather than re-sorting into Keep a Changelog order. Verified by comparing every non-heading line before and after — the only delta is the five blank lines that separated the five removed headings. No entry text moved between versions, no entry altered, all 92 version headings intact. Fails loudly rather than merging automatically, so the second author sees the collision instead of having it silently resolved. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> | 23 天前 | |
feat(cli): add `ai-memory rename-workstream` for checkout-local renames (#538) Workstream names were fixed at `run --new` time and had no correction path, so a typo outlived the work it labelled and the only escape was starting a new workstream and abandoning the ledger attached to the old one. The rename selects by current name or by the stable id `workstreams` prints, resolving the same (workspace, project, repository, worktree) identity `run` selects with. Both selectors repeat the checkout predicate: `workstreams.id` is globally unique, so without it a caller holding an id from another checkout could retitle a workstream their request never named. An id outside the resolved scope reads as absent rather than renamable. It is metadata only. `workstream_events`, `managed_runs`, and `workstream_native_sessions` all key on `workstreams.id`, so the rename is a single-row update with nothing to cascade, and `selected_at` and `updated_at` are deliberately left untouched — relabelling is not activity. Neither the discovery listing order nor the workstream a bare `ai-memory run` resumes moves as a side effect of fixing a typo. The destination is validated exactly like a `--new` name and refused with a named conflict when another workstream in the same checkout already holds it, turning the UNIQUE constraint into a typed error instead of a bare SQLite failure. Renaming a workstream to the name it already has writes nothing and is not an error. The new `/workstream/rename` route requires NormalWrite rather than the NormalRead its sibling discovery read uses, and resolves scope through `lookup_existing_scope` so a rename never creates the workspace or project it names. The Docker shell wrapper routes the command through its native host client alongside `run`, `show`, `continue`, and `workstreams`, since repository identity is a host resource the helper container cannot see. Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com> Co-authored-by: AkitaOnRails <fabioakita@gmail.com> | 11 天前 | |
fix(build): pin test-support dep version and restore installer exec bit Maintainer follow-up to #645. The workspace 'ai-memory-test-support' dependency was declared path-only, which cargo-deny reads as a wildcard requirement and rejects (deny.toml wildcards=deny) — pin it to 2.0.3 like every sibling. Also restore the executable bit on scripts/install-git-hooks.sh, which CONTRIBUTING and the script header document invoking directly. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MDbhmszrjG9s5MrPrTuNtm | 7 天前 | |
feat(opencode2): add first-party OpenCode 2.0 beta support MCP (mcp.servers + oauth:false), dependency-free plugin shape (ai-memory-opencode2.ts), managed run opencode2, v2 transcript adapter (session_v2/session_message), acceptance case, docs, changelog. Shares v1's config dir, session store, and agent kind; no migration. Verified live against beta-18999. | 8 天前 | |
Merge main into release/2.1: pick up the 2.0.4 fix batch Forward-merge of the nine PRs that landed on main (the 2.0.4 batch: #642 auth stale-bearer, #646/#640 LoginLimiter, #644 Cursor attribution, #650/#647 reindex manifest, #638 MCP routing, #652 CI docs, #645 dev-loop/build) into the 2.1 feature train, so release/2.1 carries every fix before 2.1.0 is cut. Conflicts resolved: - crates/ai-memory-wiki/src/wiki.rs: 2.1's per-page write lock (page_locks, #607) and main's manifested_scopes memo (#650) are independent additions to the same struct/imports/constructor — kept both; imports merged to {HashMap, HashSet}. - CHANGELOG.md: [Unreleased] now carries 2.1's ### Added features above main's ### Changed + ### Fixed (the 2.0.4 fixes), Keep-a-Changelog order, single [2.0.3] section preserved. - crates/ai-memory-llm/tests/extra_headers_on_the_wire.rs (2.1's #606 test) relocated into tests/suite/ and declared in mod.rs to satisfy #645's one-test-binary-per-crate harness convention (caught by the repo_layout guard). fmt, clippy -D warnings, llm harness, and the repo_layout guard all green. | 7 天前 | |
perf(dev): a self-contained build and a two-tier test loop on every platform The edit-to-result loop was ~380s for the workspace on macOS and needed an environment variable on every command. This makes `cargo t` the whole story on macOS, Linux, and Windows, with numbers measured along the way. Build - `[profile.dev]` keeps only line tables (full debuginfo put ~190 MB of DWARF in each test binary and made the build linker-bound); dependencies build at opt-level 1 with no debuginfo; proc macros and build scripts at opt-level 3, since they are run once per dependent crate. - Test binaries: 78 to 11 in the everyday loop (13 under `--workspace`). Each one is a link and, on macOS (Gatekeeper) and Windows (Defender), a first-run malware scan of the whole file, paid serially by nextest's list phase before the first test starts. Integration tests now live in `tests/suite/` and compile into their crate's own test harness (`mod.rs`, included from `src/lib.rs` under `#[cfg(test)]`, with `extern crate self` so they keep addressing the public API by crate name). Only the CLI keeps a separate `suite` target, because its tests run the built executable. The evals harness leaves `default-members`, so a bare `cargo t` skips its two binaries while `--workspace` (CI, the hook, `cargo tf`) still builds them. A repo-layout test fails on an undeclared suite file, a stray top-level `tests/*.rs`, or a `mod.rs` that `lib.rs` never includes. - `ai-memory-cli` gains a lib target; `main.rs` is a shim. 806 tests that lived in the bin are reachable, and `--lib` runs skip the 127 MB binary. - The web crate's vendored `static/tailwind.css` is the default on every build, so nothing needs `TAILWIND_SKIP=1` any more: every release, Docker, and CI path already used the vendored file, and the download branch only ever ran for developers who forgot the flag (and then rewrote the source tree as a side effect). `TAILWIND_BUILD=1 cargo build -p ai-memory-web` regenerates it explicitly. CI runs that on Linux and fails if the committed file is stale, a check that did not exist before; the committed file reproduces byte for byte today. - `tokenizers` aligned on one version instead of the 0.21 pin plus the 0.22 candle pulled in. Test tiers - `.config/nextest.toml`: the `default` profile skips any test whose module path has a segment starting with `slow` or `stress` (`packaging::slow::*` drives real wrapper scripts and fake container engines at 10-20s each; `stress_*` modules hammer concurrency), reports every failure in one run, and marks anything over 5s in its summary so a new slow test is visible the day it lands. `full` runs everything. `ci` keeps its retries and writes JUnit. - `.cargo/config.toml` holds two aliases and nothing else: `cargo t` (default members) and `cargo tf` (`--workspace -P full`). `cargo t -p <crate>` builds just that crate. Neither passes `--all-targets`: there are no examples or benches, and it only added harnesses for two `test = false` targets. - `scripts/install-git-hooks.sh` installs an opt-in pre-push hook that runs the full tier, touching only its own marked block. Two independent things run the skipped tier: that hook, and CI, which uses `cargo test` and never reads the nextest config. Slow tests fixed rather than tiered - `project_observations` in the consolidator trimmed an over-budget projection one observation at a time, re-rendering the whole text and re-scoring every remaining candidate after each removal. Each score scans the body, so 256 observations of 4k chars cost ~65k body scans per prompt: 14s in production consolidation, exactly as in the unit test. Scores and per-block sizes are now computed once and the prune subtracts; output is unchanged and pinned by the existing tests. 13.9s to 0.18s. - Windows takes ~2s to refuse a loopback connect, so every hook test that posted to a closed port paid 2s per request. `dead_http_endpoint()` in the new `ai-memory-test-support` crate accepts and closes instead, with a fallback to the closed port where binding is denied. devin hook tests: 4.2s to 0.15s each. - The store unit fixture opened a file-backed SQLite with the default rollback journal and synchronous=FULL, so ~120 parallel fixtures fsynced every transaction. journal_mode=MEMORY + synchronous=OFF: 242s to 89s of test time, p90 1.6s to 0.5s. - Windows-only tests resolve `powershell.exe` or `pwsh.exe` once per process and the auto-improve eval fixtures are `.ps1` scripts instead of cmd.exe batch files; a post-bind settle sleep is gone; the two unpinned multi-thread tokio tests pin `worker_threads = 4`. The four copies of the PowerShell resolver and the mcp suite's duplicated `post`/`get` helpers are now one each. Not done, with the numbers in AGENTS.md: nextest vs in-process libtest is a wash per crate and a rout for the workspace (20s vs 309s); the `local-embeddings` default feature costs ~50s of cold build and ~27 MB per binary but under a second per relink, so it stays a product default. Measured: workspace loop ~380s to ~150s on macOS; on a 32-thread Windows box the warm everyday run is 20s of test time across 2919 tests in 11 binaries, and the rebuild after a core edit is 13s of cargo with lld plus the first-run scans. | 7 天前 |