| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
ci(plugins): validate, launcher tests, sandboxed e2e, release stamping (#1166) - .github/workflows/plugins.yml (path-filtered, contents: read, pinned action SHAs): `claude plugin validate --strict` on the catalog and the Claude Code plugin with a pinned Claude Code CLI; shellcheck plus tests/hooks/test_plugin_launcher.sh; a credential-free sandboxed `claude -p` that fires the plugin's hooks into a scratch server, and a Codex install whose trusted plugin hooks fire with the model provider on a closed port. - tests/hooks/test_plugin_launcher.sh covers the launcher alone: the missing-binary path (guidance on session-start only, stdin drained, exit 0), option precedence, PATH and ~/.local/bin discovery, `hook` first for the Docker wrapper, the foreign-harness guard, and a cost bound. - bin/release re-renders the plugins after the version bump so the tag's catalogs point at the tag itself; release.yml's validate-version checks every plugin version and catalog ref against the tag, and github-release attaches ai-memory-claude-plugin.zip and its .sha256 for the desktop app's plugin upload. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MDbhmszrjG9s5MrPrTuNtm | 14 天前 | |
feat(plugins): Claude Code and Codex marketplace plugins (#1166) Ship ai-memory as marketplace plugins generated from the sources install-hooks and install-skills already use. `ai-memory render-plugins` (hidden) writes plugins/claude-code, plugins/codex and the catalogs (.claude-plugin/marketplace.json, .agents/plugins/marketplace.json), each pinned to the v<version> tag. A CLI suite test fails when the committed tree differs from the renderer. Each plugin holds manifests, the six routing skills, a status skill, an MCP entry running mcp-bridge, and one POSIX launcher that hands every event to the installed binary's native `ai-memory hook`. The launcher has no capture logic; without a binary it drains stdin, prints guidance on session-start only, and exits 0. Binary changes for the plugin front door: - hook: a plugin-launched event (AI_MEMORY_HOOK_ORIGIN=<agent>-plugin) is dropped when a Claude settings-file ai-memory hook delivers the same event, so settings hooks win and nothing is captured twice; a session with no project folder is not captured through the plugin; - hook and mcp-bridge: an empty --server-url means the configured server, so the plugin's unset option never overrides config.toml; hook's --server-url may now be omitted. Codex 0.162.1 discovers plugin hooks only with a native .codex-plugin/plugin.json manifest (an Agent Plugins root plugin.json installs but loads no hooks), so the Codex plugin uses that layout. Tests re-prove capture policy (ignore_paths, allowlist), marker and servers.toml routing, de-duplication and the missing-binary path through the launcher and the real binary; each fails with its guard removed. tests/e2e/{claude,codex}_plugin_smoke.py drive the real CLIs in scratch config dirs without credentials. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MDbhmszrjG9s5MrPrTuNtm | 14 天前 | |
test(relay): expect the dropped_invalid receipt outcome in the external smoke The relay's receipt vocabulary gained dropped_invalid in the main forward merge; the smoke's fixed key set still listed nine. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MDbhmszrjG9s5MrPrTuNtm | 24 天前 | |
fix(gemini): do not send thinkingConfig to gemini-3.5-flash-lite `default_thinking_config_for` matches on substrings, so `contains("gemini-3.5-flash")` also caught `gemini-3.5-flash-lite`. Verified against the live API: gemini-3.5-flash + thinkingBudget:0 -> 200 gemini-2.5-flash-lite + thinkingBudget:0 -> 200 gemini-3.5-flash-lite + thinkingBudget:0 -> 400 invalid argument gemini-3.5-flash-lite field omitted -> 200 So every call on 3.5-flash-lite would have failed. 2.5 is deliberately left alone — narrowing it too would re-enable its default thinking and let hidden thought tokens truncate strict JSON, which is why this function exists. The e2e handoff smoke test set MODEL_B to gemini-3.5-flash-lite while its `gemini_call` helper hardcodes thinkingBudget=0, so that test would have failed at the session-2 call. MODEL_B stays 2.5-flash-lite. Adds a regression test asserting 3.5-lite omits the field and 2.5-lite still sends it; it fails on the original predicate and passes here. Also corrects the retirement date in the changelog entry: the Gemini API table lists October 16 2026, not the October 20 Vertex/Agent Platform date, and ai-memory talks to the Gemini API. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> | 2 个月前 | |
test(relay): expose bounded safe markers for smoke failures The PR1056 Windows smoke only reported flush-concurrent-03 exited 2; its captured stderr stayed in an unpublished temporary command log. Report recognized stderr markers and bounded HTTP/OS codes in the existing failure summary, without echoing free text, stdout, paths, credentials, or payloads and without uploading whole logs. Add Linux-tested synthetic subprocess regressions for failure details, sensitive output omission, bounds, empty stderr and unchanged success/ expected-failure handling. Two assertions failed before the change; all four tests pass after it. This is diagnostic-only follow-up for PR1056, not a claim about the Windows failure's cause. Keep the SQLite queue-opening fix isolated in PR1060. No relay implementation, workflow policy or label changes. | 25 天前 |
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 14 天前 | ||
| 14 天前 | ||
| 24 天前 | ||
| 2 个月前 | ||
| 25 天前 |