hermes-agent/tests/skills
briandevans 8a9ab8b56b fix(cli): stop shredding an existing MEMORY.md on hermes import-agent
memories/MEMORY.md is the "§"-delimited store written by MemoryStore, not a
markdown document. parse_existing_memory_entries() fell back to
extract_markdown_entries() -- the *source* parser for CLAUDE.md / AGENTS.md --
whenever the destination held no delimiter, which is exactly the case for a
single-entry store or one that was hand-edited or shell-appended. That
extractor skips fenced code blocks, skips table rows, splits a block into one
entry per bullet and reflows paragraphs. The shredded result was then written
straight back over the user's store and reported as "Imported", with no backup
to recover from.

Parse the destination the way MemoryStore._parse_entries does: split on
ENTRY_DELIMITER only, so a store with no delimiter is one intact entry.
extract_markdown_entries() is unchanged and still used on the sources, where
it is correct.

Also restore the safety net the port dropped. The openclaw migration script
this module was ported from calls maybe_backup(destination) before rewriting a
memory store; the port did not. Snapshot the store to <name>.bak.<unix_ts>
(same naming as MemoryStore._backup_drifted_file), refuse to rewrite when the
snapshot fails, and write via temp file + atomic rename so an interrupted
import cannot leave a truncated store and a symlinked MEMORY.md stays a
symlink.

The identical fallback lives in openclaw_to_hermes.py, where it is reached
from migrate_memory() (memories/MEMORY.md and memories/USER.md) and
migrate_daily_memory(); fixed there too.
2026-07-29 16:49:07 +05:30
..
test_cloudflare_temporary_deploy_skill.py feat(skills): add cloudflare-temporary-deploy optional skill (#50849) 2026-06-22 12:14:30 -07:00
test_darwinian_evolver_skill.py feat(skill): darwinian-evolver optional skill 2026-05-15 21:56:07 -07:00
test_fetch_transcript.py
test_github_credential_token.py fix(skills): parse stored GitHub credentials without scanner false positives 2026-07-26 20:59:26 -07:00
test_google_workspace_api.py fix(google-workspace): handle Gmail header casing case-insensitively 2026-05-30 02:38:18 -07:00
test_google_workspace_credential_files.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
test_hyperliquid_skill.py
test_mcp_oauth_remote_gateway_skill.py chore(skills/mcp-oauth-remote-gateway): move to optional-skills + modernize 2026-07-16 01:28:32 -07:00
test_memento_cards.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
test_office_document_skills.py fix(skills): read OOXML parts as bytes and form JSON as UTF-8 in office skill scripts 2026-07-24 17:10:39 -07:00
test_openclaw_migration.py fix(cli): stop shredding an existing MEMORY.md on hermes import-agent 2026-07-29 16:49:07 +05:30
test_openclaw_migration_hardening.py
test_pinecone_research_skill.py fix(skills): rename pinecone-research, shorten descriptions, add scripts + tests 2026-07-23 21:06:33 -07:00
test_telephony_skill.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
test_tldraw_offline_skill.py feat(skills): add tldraw-offline agent scripting skill 2026-07-23 08:07:00 -07:00
test_unbroker_skill.py blocked-tail pass: blind opt-out default, email fallback, peopleconnect delete-wipes-suppression 2026-07-03 15:21:04 -04:00
test_xurl_article_ingestion_docs.py fix(skills): document xurl X Article ingestion 2026-06-03 15:11:57 -07:00
test_xurl_x_search_routing.py fix(skills): keep xurl SKILL self-contained; move x_search routing to gated surfaces 2026-07-23 21:06:47 -07:00
test_youtube_quiz.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00