feat: v1->v2 migration rules, raw-HTTP support, and scan mode - #3
Open
dani1005 wants to merge 1 commit into
Open
feat: v1->v2 migration rules, raw-HTTP support, and scan mode#3dani1005 wants to merge 1 commit into
dani1005 wants to merge 1 commit into
Conversation
Adds the everos-cloud 0.4.x -> 1.x (v2 Memory API) migration to the existing v0->v1 skill, and extends it to cover callers that speak HTTP directly. Rules are split into two layers: - migration/http/v1-to-v2.md transport-level, language-agnostic, source of truth - migration/python/v1-to-v2.md maps the Python SDK surface onto those rules Previously only Python SDK users were detected at all: Step 1 grepped for evermemos|everos_cloud, which never matches a raw caller hitting api.evermind.ai. Detection now also matches /api/v1/memories and the EverOS env vars, so a Go/TS/curl caller is covered. SKILL.md changes: - Fix version detection. It keyed on a client.vN. prefix, which 1.x removed entirely (client.add(...)), so a migrated repo was misdetected and re-running the skill was not idempotent. Now keys on the dependency constraint plus bare facade verbs. - Add --scan mode: produce an impact report, edit nothing. - Add the blocker list that must always be flagged and never rewritten, and an impact-report template that leads with those blockers. Findings verified against the published 0.4.1/1.0.0/1.1.0 wheels, the v2 OpenAPI contract, and live prod calls (2026-09-04) — two of which contradict the current public migration guide: - 1.x does NOT read EVEROS_API_KEY (api_key is a required arg); the guide says it still does. - 1.x does NOT read EVER_OS_BASE_URL either. This one fails silently: a client that pointed at dev/test via the environment starts hitting production. Also undocumented: AsyncEverOS is gone, as are max_retries/http_client/ default_headers (0.4.x retried twice by default, 1.x does not retry). Marketplace renamed everos-plugins -> everos-tools. The GitHub repo rename is a separate manual step; docs.evermind.ai links need updating with it. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Adds the everos-cloud 0.4.x → 1.x (v2 Memory API) migration to the existing v0→v1 skill, and extends the skill to cover callers that speak HTTP directly instead of using the Python SDK.
Why the rules are split in two
migration/http/v1-to-v2.md(new, 17 rules)migration/python/v1-to-v2.md(new, 15 rules)This migration is fundamentally an API-level change, not just an SDK rename. A customer calling
/api/v1/memoriesfrom Go, TypeScript or curl hits every one of these breaking changes — and previously got zero help: Step 1 only greppedevermemos|everos_cloud, which never matches a raw caller. Detection now also matches/api/v1/memories,api.evermind.aiand the EverOS env vars.SKILL.md changes
client.vN.prefix — but 1.x removed that entirely (client.add(...), notclient.v1.memories.add(...)). A migrated repo was misdetected and re-running the skill was not idempotent. Now keys on the dependency constraint plus bare facade verbs.--scanmode — produce an impact report, edit nothing. Useful for deciding whether to migrate.Findings that contradict the current public migration guide
Verified against the published
0.4.1/1.0.0/1.1.0wheels on PyPI, the v2 OpenAPI contract, and live prod calls (2026-09-04):1.xdoes NOT readEVEROS_API_KEY.api_keyis a required argument; there is noos.environ/getenvreference anywhere inclient.py.sdk-migration-1x.mdxstates it "still readsEVEROS_API_KEYif omitted". This one fails loudly (TypeError), so it is the safe one.1.xdoes NOT readEVER_OS_BASE_URLeither — and this fails silently.0.4.xpicked it up from the environment;1.xonly honourshost=. A client that pointed at a dev or test gateway via the environment starts reading and writing production data after the upgrade, with no error. Flagged as the top-priority finding in the skill.AsyncEverOSis gone (no async client in 1.x at all), as aremax_retries/http_client/default_headers—0.4.xretried twice by default,1.xdoes not retry.The OpenAPI spec's own
AddInputexample uses"timestamp": 1700000000(seconds), which the API rejects with 422 — worth fixing separately in the spec.Capabilities with no v2 equivalent (flagged, never rewritten)
groupmemory (/memories/group,/groups,group_idfilters),/senders,/settings,AsyncEverOS,delete(memory_id=), andmemory_type="raw_message". The v2 contract has zero occurrences ofgroup. These decide whether a given customer's migration can complete at all, so the skill counts them and reports the counts first.Naming
Marketplace renamed
everos-plugins→everos-tools. The GitHub repo rename is a separate manual step (needs admin), anddocs.evermind.ai/api-reference/sdk-migrationinstall commands need updating with it.Testing
claude plugin validate .→ ✔ passes (same check as CI)examples/python/v2.py→py_compilecleanfetchcaller + group usage + seconds timestamps +AsyncEverOS+EVER_OS_BASE_URLpointed at test): detection, scan report, and rewrites all behaved as specified — including catchingMath.floor(Date.now()/1000)in the TS file.🤖 Generated with Claude Code