[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6MF46AP2FVB7MS07CWZCCGF":3,"skill-same:01M6MF46AP2FVB7MS07CWZCCGF":86},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":44,"linkOnly":45,"markdownContent":46,"markdownBody":47,"frontMatter":48,"refName":65,"commitSha":66,"skillDirectory":67,"forksCount":68,"repositoryHtmlUrl":69,"repositoryHomepageUrl":6,"ownerHtmlUrl":70,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":71,"install":72,"resources":85},"01M6MF46AP2FVB7MS07CWZCCGF","memento-flashcards",null,"Spaced-repetition flashcard system. Create cards from facts or text, chat with flashcards using free-text answers graded by the agent, generate quizzes from YouTube transcripts, review due cards with adaptive scheduling, and export\u002Fimport decks as CSV.","ibragimov-oasis\u002Fvibe-coder","ibragimov-oasis","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F240665573?v=4","01M6DF78Y45R8228FHAZ7G6JXM","IBRAGIMOV MUKHAMMADJON","01M6K5ZYR8TDPAFG4R6693E2A6",3,"MIT","https:\u002F\u002Fgithub.com\u002Fibragimov-oasis\u002Fvibe-coder\u002Fblob\u002Fmain\u002Fvc-kit\u002Fcontent\u002FCOMBINED\u002FCOMBINED\u002FREPO_DOCS\u002F02-hermes-agent\u002Foptional-skills\u002Fproductivity\u002Fmemento-flashcards\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000039","教师与教育","PROFESSION","适用职业",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43],"memento flashcards","flashcards","chat","adaptive","facts","with","flashcard","import","quiz","free","as","review","spaced-repetition","scheduling","text","system","learning","csv","create","linux","2026-11-10 10:12:30",false,"---\nname: memento-flashcards\ndescription: >-\n  Spaced-repetition flashcard system. Create cards from facts or text,\n  chat with flashcards using free-text answers graded by the agent,\n  generate quizzes from YouTube transcripts, review due cards with\n  adaptive scheduling, and export\u002Fimport decks as CSV.\nversion: 1.0.0\nauthor: Memento AI\nlicense: MIT\nplatforms: [macos, linux]\nmetadata:\n  hermes:\n    tags: [Education, Flashcards, Spaced Repetition, Learning, Quiz, YouTube]\n    requires_toolsets: [terminal]\n    category: productivity\n---\n\n# Memento Flashcards — Spaced-Repetition Flashcard Skill\n\n## Overview\n\nMemento gives you a local, file-based flashcard system with spaced-repetition scheduling.\nUsers can chat with their flashcards by answering in free text and having the agent grade the response before scheduling the next review.\nUse it whenever the user wants to:\n\n- **Remember a fact** — turn any statement into a Q\u002FA flashcard\n- **Study with spaced repetition** — review due cards with adaptive intervals and agent-graded free-text answers\n- **Quiz from a YouTube video** — fetch a transcript and generate a 5-question quiz\n- **Manage decks** — organise cards into collections, export\u002Fimport CSV\n\nAll card data lives in a single JSON file. No external API keys are required — you (the agent) generate flashcard content and quiz questions directly.\n\nUser-facing response style for Memento Flashcards:\n- Use plain text only. Do not use Markdown formatting in replies to the user.\n- Keep review and quiz feedback brief and neutral. Avoid extra praise, pep, or long explanations.\n\n## When to Use\n\nUse this skill when the user wants to:\n- Save facts as flashcards for later review\n- Review due cards with spaced repetition\n- Generate a quiz from a YouTube video transcript\n- Import, export, inspect, or delete flashcard data\n\nDo not use this skill for general Q&A, coding help, or non-memory tasks.\n\n## Quick Reference\n\n| User intent | Action |\n|---|---|\n| \"Remember that X\" \u002F \"save this as a flashcard\" | Generate a Q\u002FA card, call `memento_cards.py add` |\n| Sends a fact without mentioning flashcards | Ask \"Want me to save this as a Memento flashcard?\" — only create if confirmed |\n| \"Create a flashcard\" | Ask for Q, A, collection; call `memento_cards.py add` |\n| \"Review my cards\" | Call `memento_cards.py due`, present cards one-by-one |\n| \"Quiz me on [YouTube URL]\" | Call `youtube_quiz.py fetch VIDEO_ID`, generate 5 questions, call `memento_cards.py add-quiz` |\n| \"Export my cards\" | Call `memento_cards.py export --output PATH` |\n| \"Import cards from CSV\" | Call `memento_cards.py import --file PATH --collection NAME` |\n| \"Show my stats\" | Call `memento_cards.py stats` |\n| \"Delete a card\" | Call `memento_cards.py delete --id ID` |\n| \"Delete a collection\" | Call `memento_cards.py delete-collection --collection NAME` |\n\n## Card Storage\n\nCards are stored in a JSON file at:\n\n```\n~\u002F.hermes\u002Fskills\u002Fproductivity\u002Fmemento-flashcards\u002Fdata\u002Fcards.json\n```\n\n**Never edit this file directly.** Always use `memento_cards.py` subcommands. The script handles atomic writes (write to temp file, then rename) to prevent corruption.\n\nThe file is created automatically on first use.\n\n## Procedure\n\n### Creating Cards from Facts\n\n### Activation Rules\n\nNot every factual statement should become a flashcard. Use this three-tier check:\n\n1. **Explicit intent** — the user mentions \"memento\", \"flashcard\", \"remember this\", \"save this card\", \"add a card\", or similar phrasing that clearly requests a flashcard → **create the card directly**, no confirmation needed.\n2. **Implicit intent** — the user sends a factual statement without mentioning flashcards (e.g. \"The speed of light is 299,792 km\u002Fs\") → **ask first**: \"Want me to save this as a Memento flashcard?\" Only create the card if the user confirms.\n3. **No intent** — the message is a coding task, a question, instructions, normal conversation, or anything that is clearly not a fact to memorize → **do NOT activate this skill at all**. Let other skills or default behavior handle it.\n\nWhen activation is confirmed (tier 1 directly, tier 2 after confirmation), generate a flashcard:\n\n**Step 1:** Turn the statement into a Q\u002FA pair. Use this format internally:\n\n```\nTurn the factual statement into a front-back pair.\nReturn exactly two lines:\nQ: \u003Cquestion text>\nA: \u003Canswer text>\n\nStatement: \"{statement}\"\n```\n\nRules:\n- The question should test recall of the key fact\n- The answer should be concise and direct\n\n**Step 2:** Call the script to store the card:\n\n```bash\npython3 ~\u002F.hermes\u002Fskills\u002Fproductivity\u002Fmemento-flashcards\u002Fscripts\u002Fmemento_cards.py add \\\n  --question \"What year did World War 2 end?\" \\\n  --answer \"1945\" \\\n  --collection \"History\"\n```\n\nIf the user doesn't specify a collection, use `\"General\"` as the default.\n\nThe script outputs JSON confirming the created card.\n\n### Manual Card Creation\n\nWhen the user explicitly asks to create a flashcard, ask them for:\n1. The question (front of card)\n2. The answer (back of card)\n3. The collection name (optional — default to `\"General\"`)\n\nThen call `memento_cards.py add` as above.\n\n### Reviewing Due Cards\n\nWhen the user wants to review, fetch all due cards:\n\n```bash\npython3 ~\u002F.hermes\u002Fskills\u002Fproductivity\u002Fmemento-flashcards\u002Fscripts\u002Fmemento_cards.py due\n```\n\nThis returns a JSON array of cards where `next_review_at \u003C= now`. If a collection filter is needed:\n\n```bash\npython3 ~\u002F.hermes\u002Fskills\u002Fproductivity\u002Fmemento-flashcards\u002Fscripts\u002Fmemento_cards.py due --collection \"History\"\n```\n\n**Review flow (free-text grading):**\n\nHere is an example of the EXACT interaction pattern you must follow. The user answers, you grade them, tell them the correct answer, then rate the card.\n\n**Example interaction:**\n\n> **Agent:** What year did the Berlin Wall fall?\n>\n> **User:** 1991\n>\n> **Agent:** Not quite. The Berlin Wall fell in 1989. Next review is tomorrow.\n> *(agent calls: memento_cards.py rate --id ABC --rating hard --user-answer \"1991\")*\n>\n> Next question: Who was the first person to walk on the moon?\n\n**The rules:**\n\n1. Show only the question. Wait for the user to answer.\n2. After receiving their answer, compare it to the expected answer and grade it:\n   - **correct** → user got the key fact right (even if worded differently)\n   - **partial** → right track but missing the core detail\n   - **incorrect** → wrong or off-topic\n3. **You MUST tell the user the correct answer and how they did.** Keep it short and plain-text. Use this format:\n   - correct: \"Correct. Answer: {answer}. Next review in 7 days.\"\n   - partial: \"Close. Answer: {answer}. {what they missed}. Next review in 3 days.\"\n   - incorrect: \"Not quite. Answer: {answer}. Next review tomorrow.\"\n4. Then call the rate command: correct→easy, partial→good, incorrect→hard.\n5. Then show the next question.\n\n```bash\npython3 ~\u002F.hermes\u002Fskills\u002Fproductivity\u002Fmemento-flashcards\u002Fscripts\u002Fmemento_cards.py rate \\\n  --id CARD_ID --rating easy --user-answer \"what the user said\"\n```\n\n**Never skip step 3.** The user must always see the correct answer and feedback before you move on.\n\nIf no cards are due, tell the user: \"No cards due for review right now. Check back later!\"\n\n**Retire override:** At any point the user can say \"retire this card\" to permanently remove it from reviews. Use `--rating retire` for this.\n\n### Spaced Repetition Algorithm\n\nThe rating determines the next review interval:\n\n| Rating | Interval | ease_streak | Status change |\n|---|---|---|---|\n| **hard** | +1 day | reset to 0 | stays learning |\n| **good** | +3 days | reset to 0 | stays learning |\n| **easy** | +7 days | +1 | if ease_streak >= 3 → retired |\n| **retire** | permanent | reset to 0 | → retired |\n\n- **learning**: card is actively in rotation\n- **retired**: card won't appear in reviews (user has mastered it or manually retired it)\n- Three consecutive \"easy\" ratings automatically retire a card\n\n### YouTube Quiz Generation\n\nWhen the user sends a YouTube URL and wants a quiz:\n\n**Step 1:** Extract the video ID from the URL (e.g. `dQw4w9WgXcQ` from `https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=dQw4w9WgXcQ`).\n\n**Step 2:** Fetch the transcript:\n\n```bash\npython3 ~\u002F.hermes\u002Fskills\u002Fproductivity\u002Fmemento-flashcards\u002Fscripts\u002Fyoutube_quiz.py fetch VIDEO_ID\n```\n\nThis returns `{\"title\": \"...\", \"transcript\": \"...\"}` or an error.\n\nIf the script reports `missing_dependency`, tell the user to install it:\n```bash\npip install youtube-transcript-api\n```\n\n**Step 3:** Generate 5 quiz questions from the transcript. Use these rules:\n\n```\nYou are creating a 5-question quiz for a podcast episode.\nReturn ONLY a JSON array with exactly 5 objects.\nEach object must contain keys 'question' and 'answer'.\n\nSelection criteria:\n- Prioritize important, surprising, or foundational facts.\n- Skip filler, obvious details, and facts that require heavy context.\n- Never return true\u002Ffalse questions.\n- Never ask only for a date.\n\nQuestion rules:\n- Each question must test exactly one discrete fact.\n- Use clear, unambiguous wording.\n- Prefer What, Who, How many, Which.\n- Avoid open-ended Describe or Explain prompts.\n\nAnswer rules:\n- Each answer must be under 240 characters.\n- Lead with the answer itself, not preamble.\n- Add only minimal clarifying detail if needed.\n```\n\nUse the first 15,000 characters of the transcript as context. Generate the questions yourself (you are the LLM).\n\n**Step 4:** Validate the output is valid JSON with exactly 5 items, each having non-empty `question` and `answer` strings. If validation fails, retry once.\n\n**Step 5:** Store quiz cards:\n\n```bash\npython3 ~\u002F.hermes\u002Fskills\u002Fproductivity\u002Fmemento-flashcards\u002Fscripts\u002Fmemento_cards.py add-quiz \\\n  --video-id \"VIDEO_ID\" \\\n  --questions '[{\"question\":\"...\",\"answer\":\"...\"},...]' \\\n  --collection \"Quiz - Episode Title\"\n```\n\nThe script deduplicates by `video_id` — if cards for that video already exist, it skips creation and reports the existing cards.\n\n**Step 6:** Present questions one-by-one using the same free-text grading flow:\n1. Show \"Question 1\u002F5: ...\" and wait for the user's answer. Never include the answer or any hint about revealing it.\n2. Wait for the user to answer in their own words\n3. Grade their answer using the grading prompt (see \"Reviewing Due Cards\" section)\n4. **IMPORTANT: You MUST reply to the user with feedback before doing anything else.** Show the grade, the correct answer, and when the card is next due. Do NOT silently skip to the next question. Keep it short and plain-text. Example: \"Not quite. Answer: {answer}. Next review tomorrow.\"\n5. **After showing feedback**, call the rate command and then show the next question in the same message:\n```bash\npython3 ~\u002F.hermes\u002Fskills\u002Fproductivity\u002Fmemento-flashcards\u002Fscripts\u002Fmemento_cards.py rate \\\n  --id CARD_ID --rating easy --user-answer \"what the user said\"\n```\n6. Repeat. Every answer MUST receive visible feedback before the next question.\n\n### Export\u002FImport CSV\n\n**Export:**\n```bash\npython3 ~\u002F.hermes\u002Fskills\u002Fproductivity\u002Fmemento-flashcards\u002Fscripts\u002Fmemento_cards.py export \\\n  --output ~\u002Fflashcards.csv\n```\n\nProduces a 3-column CSV: `question,answer,collection` (no header row).\n\n**Import:**\n```bash\npython3 ~\u002F.hermes\u002Fskills\u002Fproductivity\u002Fmemento-flashcards\u002Fscripts\u002Fmemento_cards.py import \\\n  --file ~\u002Fflashcards.csv \\\n  --collection \"Imported\"\n```\n\nReads a CSV with columns: question, answer, and optionally collection (column 3). If the collection column is missing, uses the `--collection` argument.\n\n### Statistics\n\n```bash\npython3 ~\u002F.hermes\u002Fskills\u002Fproductivity\u002Fmemento-flashcards\u002Fscripts\u002Fmemento_cards.py stats\n```\n\nReturns JSON with:\n- `total`: total card count\n- `learning`: cards in active rotation\n- `retired`: mastered cards\n- `due_now`: cards due for review right now\n- `collections`: breakdown by collection name\n\n## Pitfalls\n\n- **Never edit `cards.json` directly** — always use the script subcommands to avoid corruption\n- **Transcript failures** — some YouTube videos have no English transcript or have transcripts disabled; inform the user and suggest another video\n- **Optional dependency** — `youtube_quiz.py` needs `youtube-transcript-api`; if missing, tell the user to run `pip install youtube-transcript-api`\n- **Large imports** — CSV imports with thousands of rows work fine but the JSON output may be verbose; summarize the result for the user\n- **Video ID extraction** — support both `youtube.com\u002Fwatch?v=ID` and `youtu.be\u002FID` URL formats\n\n## Verification\n\nVerify the helper scripts directly:\n\n```bash\npython3 ~\u002F.hermes\u002Fskills\u002Fproductivity\u002Fmemento-flashcards\u002Fscripts\u002Fmemento_cards.py stats\npython3 ~\u002F.hermes\u002Fskills\u002Fproductivity\u002Fmemento-flashcards\u002Fscripts\u002Fmemento_cards.py add --question \"Capital of France?\" --answer \"Paris\" --collection \"General\"\npython3 ~\u002F.hermes\u002Fskills\u002Fproductivity\u002Fmemento-flashcards\u002Fscripts\u002Fmemento_cards.py due\n```\n\nIf you are testing from the repo checkout, run:\n\n```bash\npytest tests\u002Fskills\u002Ftest_memento_cards.py tests\u002Fskills\u002Ftest_youtube_quiz.py -q\n```\n\nAgent-level verification:\n- Start a review and confirm feedback is plain text, brief, and always includes the correct answer before the next card\n- Run a YouTube quiz flow and confirm each answer receives visible feedback before the next question\n\n## ? Связи\n\n- [[000 - Map of Maps]] — REPO_DOCS\n- [[000 - Map of Maps]] — Map of Maps\n\n","# Memento Flashcards — Spaced-Repetition Flashcard Skill\n\n## Overview\n\nMemento gives you a local, file-based flashcard system with spaced-repetition scheduling.\nUsers can chat with their flashcards by answering in free text and having the agent grade the response before scheduling the next review.\nUse it whenever the user wants to:\n\n- **Remember a fact** — turn any statement into a Q\u002FA flashcard\n- **Study with spaced repetition** — review due cards with adaptive intervals and agent-graded free-text answers\n- **Quiz from a YouTube video** — fetch a transcript and generate a 5-question quiz\n- **Manage decks** — organise cards into collections, export\u002Fimport CSV\n\nAll card data lives in a single JSON file. No external API keys are required — you (the agent) generate flashcard content and quiz questions directly.\n\nUser-facing response style for Memento Flashcards:\n- Use plain text only. Do not use Markdown formatting in replies to the user.\n- Keep review and quiz feedback brief and neutral. Avoid extra praise, pep, or long explanations.\n\n## When to Use\n\nUse this skill when the user wants to:\n- Save facts as flashcards for later review\n- Review due cards with spaced repetition\n- Generate a quiz from a YouTube video transcript\n- Import, export, inspect, or delete flashcard data\n\nDo not use this skill for general Q&A, coding help, or non-memory tasks.\n\n## Quick Reference\n\n| User intent | Action |\n|---|---|\n| \"Remember that X\" \u002F \"save this as a flashcard\" | Generate a Q\u002FA card, call `memento_cards.py add` |\n| Sends a fact without mentioning flashcards | Ask \"Want me to save this as a Memento flashcard?\" — only create if confirmed |\n| \"Create a flashcard\" | Ask for Q, A, collection; call `memento_cards.py add` |\n| \"Review my cards\" | Call `memento_cards.py due`, present cards one-by-one |\n| \"Quiz me on [YouTube URL]\" | Call `youtube_quiz.py fetch VIDEO_ID`, generate 5 questions, call `memento_cards.py add-quiz` |\n| \"Export my cards\" | Call `memento_cards.py export --output PATH` |\n| \"Import cards from CSV\" | Call `memento_cards.py import --file PATH --collection NAME` |\n| \"Show my stats\" | Call `memento_cards.py stats` |\n| \"Delete a card\" | Call `memento_cards.py delete --id ID` |\n| \"Delete a collection\" | Call `memento_cards.py delete-collection --collection NAME` |\n\n## Card Storage\n\nCards are stored in a JSON file at:\n\n```\n~\u002F.hermes\u002Fskills\u002Fproductivity\u002Fmemento-flashcards\u002Fdata\u002Fcards.json\n```\n\n**Never edit this file directly.** Always use `memento_cards.py` subcommands. The script handles atomic writes (write to temp file, then rename) to prevent corruption.\n\nThe file is created automatically on first use.\n\n## Procedure\n\n### Creating Cards from Facts\n\n### Activation Rules\n\nNot every factual statement should become a flashcard. Use this three-tier check:\n\n1. **Explicit intent** — the user mentions \"memento\", \"flashcard\", \"remember this\", \"save this card\", \"add a card\", or similar phrasing that clearly requests a flashcard → **create the card directly**, no confirmation needed.\n2. **Implicit intent** — the user sends a factual statement without mentioning flashcards (e.g. \"The speed of light is 299,792 km\u002Fs\") → **ask first**: \"Want me to save this as a Memento flashcard?\" Only create the card if the user confirms.\n3. **No intent** — the message is a coding task, a question, instructions, normal conversation, or anything that is clearly not a fact to memorize → **do NOT activate this skill at all**. Let other skills or default behavior handle it.\n\nWhen activation is confirmed (tier 1 directly, tier 2 after confirmation), generate a flashcard:\n\n**Step 1:** Turn the statement into a Q\u002FA pair. Use this format internally:\n\n```\nTurn the factual statement into a front-back pair.\nReturn exactly two lines:\nQ: \u003Cquestion text>\nA: \u003Canswer text>\n\nStatement: \"{statement}\"\n```\n\nRules:\n- The question should test recall of the key fact\n- The answer should be concise and direct\n\n**Step 2:** Call the script to store the card:\n\n```bash\npython3 ~\u002F.hermes\u002Fskills\u002Fproductivity\u002Fmemento-flashcards\u002Fscripts\u002Fmemento_cards.py add \\\n  --question \"What year did World War 2 end?\" \\\n  --answer \"1945\" \\\n  --collection \"History\"\n```\n\nIf the user doesn't specify a collection, use `\"General\"` as the default.\n\nThe script outputs JSON confirming the created card.\n\n### Manual Card Creation\n\nWhen the user explicitly asks to create a flashcard, ask them for:\n1. The question (front of card)\n2. The answer (back of card)\n3. The collection name (optional — default to `\"General\"`)\n\nThen call `memento_cards.py add` as above.\n\n### Reviewing Due Cards\n\nWhen the user wants to review, fetch all due cards:\n\n```bash\npython3 ~\u002F.hermes\u002Fskills\u002Fproductivity\u002Fmemento-flashcards\u002Fscripts\u002Fmemento_cards.py due\n```\n\nThis returns a JSON array of cards where `next_review_at \u003C= now`. If a collection filter is needed:\n\n```bash\npython3 ~\u002F.hermes\u002Fskills\u002Fproductivity\u002Fmemento-flashcards\u002Fscripts\u002Fmemento_cards.py due --collection \"History\"\n```\n\n**Review flow (free-text grading):**\n\nHere is an example of the EXACT interaction pattern you must follow. The user answers, you grade them, tell them the correct answer, then rate the card.\n\n**Example interaction:**\n\n> **Agent:** What year did the Berlin Wall fall?\n>\n> **User:** 1991\n>\n> **Agent:** Not quite. The Berlin Wall fell in 1989. Next review is tomorrow.\n> *(agent calls: memento_cards.py rate --id ABC --rating hard --user-answer \"1991\")*\n>\n> Next question: Who was the first person to walk on the moon?\n\n**The rules:**\n\n1. Show only the question. Wait for the user to answer.\n2. After receiving their answer, compare it to the expected answer and grade it:\n   - **correct** → user got the key fact right (even if worded differently)\n   - **partial** → right track but missing the core detail\n   - **incorrect** → wrong or off-topic\n3. **You MUST tell the user the correct answer and how they did.** Keep it short and plain-text. Use this format:\n   - correct: \"Correct. Answer: {answer}. Next review in 7 days.\"\n   - partial: \"Close. Answer: {answer}. {what they missed}. Next review in 3 days.\"\n   - incorrect: \"Not quite. Answer: {answer}. Next review tomorrow.\"\n4. Then call the rate command: correct→easy, partial→good, incorrect→hard.\n5. Then show the next question.\n\n```bash\npython3 ~\u002F.hermes\u002Fskills\u002Fproductivity\u002Fmemento-flashcards\u002Fscripts\u002Fmemento_cards.py rate \\\n  --id CARD_ID --rating easy --user-answer \"what the user said\"\n```\n\n**Never skip step 3.** The user must always see the correct answer and feedback before you move on.\n\nIf no cards are due, tell the user: \"No cards due for review right now. Check back later!\"\n\n**Retire override:** At any point the user can say \"retire this card\" to permanently remove it from reviews. Use `--rating retire` for this.\n\n### Spaced Repetition Algorithm\n\nThe rating determines the next review interval:\n\n| Rating | Interval | ease_streak | Status change |\n|---|---|---|---|\n| **hard** | +1 day | reset to 0 | stays learning |\n| **good** | +3 days | reset to 0 | stays learning |\n| **easy** | +7 days | +1 | if ease_streak >= 3 → retired |\n| **retire** | permanent | reset to 0 | → retired |\n\n- **learning**: card is actively in rotation\n- **retired**: card won't appear in reviews (user has mastered it or manually retired it)\n- Three consecutive \"easy\" ratings automatically retire a card\n\n### YouTube Quiz Generation\n\nWhen the user sends a YouTube URL and wants a quiz:\n\n**Step 1:** Extract the video ID from the URL (e.g. `dQw4w9WgXcQ` from `https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=dQw4w9WgXcQ`).\n\n**Step 2:** Fetch the transcript:\n\n```bash\npython3 ~\u002F.hermes\u002Fskills\u002Fproductivity\u002Fmemento-flashcards\u002Fscripts\u002Fyoutube_quiz.py fetch VIDEO_ID\n```\n\nThis returns `{\"title\": \"...\", \"transcript\": \"...\"}` or an error.\n\nIf the script reports `missing_dependency`, tell the user to install it:\n```bash\npip install youtube-transcript-api\n```\n\n**Step 3:** Generate 5 quiz questions from the transcript. Use these rules:\n\n```\nYou are creating a 5-question quiz for a podcast episode.\nReturn ONLY a JSON array with exactly 5 objects.\nEach object must contain keys 'question' and 'answer'.\n\nSelection criteria:\n- Prioritize important, surprising, or foundational facts.\n- Skip filler, obvious details, and facts that require heavy context.\n- Never return true\u002Ffalse questions.\n- Never ask only for a date.\n\nQuestion rules:\n- Each question must test exactly one discrete fact.\n- Use clear, unambiguous wording.\n- Prefer What, Who, How many, Which.\n- Avoid open-ended Describe or Explain prompts.\n\nAnswer rules:\n- Each answer must be under 240 characters.\n- Lead with the answer itself, not preamble.\n- Add only minimal clarifying detail if needed.\n```\n\nUse the first 15,000 characters of the transcript as context. Generate the questions yourself (you are the LLM).\n\n**Step 4:** Validate the output is valid JSON with exactly 5 items, each having non-empty `question` and `answer` strings. If validation fails, retry once.\n\n**Step 5:** Store quiz cards:\n\n```bash\npython3 ~\u002F.hermes\u002Fskills\u002Fproductivity\u002Fmemento-flashcards\u002Fscripts\u002Fmemento_cards.py add-quiz \\\n  --video-id \"VIDEO_ID\" \\\n  --questions '[{\"question\":\"...\",\"answer\":\"...\"},...]' \\\n  --collection \"Quiz - Episode Title\"\n```\n\nThe script deduplicates by `video_id` — if cards for that video already exist, it skips creation and reports the existing cards.\n\n**Step 6:** Present questions one-by-one using the same free-text grading flow:\n1. Show \"Question 1\u002F5: ...\" and wait for the user's answer. Never include the answer or any hint about revealing it.\n2. Wait for the user to answer in their own words\n3. Grade their answer using the grading prompt (see \"Reviewing Due Cards\" section)\n4. **IMPORTANT: You MUST reply to the user with feedback before doing anything else.** Show the grade, the correct answer, and when the card is next due. Do NOT silently skip to the next question. Keep it short and plain-text. Example: \"Not quite. Answer: {answer}. Next review tomorrow.\"\n5. **After showing feedback**, call the rate command and then show the next question in the same message:\n```bash\npython3 ~\u002F.hermes\u002Fskills\u002Fproductivity\u002Fmemento-flashcards\u002Fscripts\u002Fmemento_cards.py rate \\\n  --id CARD_ID --rating easy --user-answer \"what the user said\"\n```\n6. Repeat. Every answer MUST receive visible feedback before the next question.\n\n### Export\u002FImport CSV\n\n**Export:**\n```bash\npython3 ~\u002F.hermes\u002Fskills\u002Fproductivity\u002Fmemento-flashcards\u002Fscripts\u002Fmemento_cards.py export \\\n  --output ~\u002Fflashcards.csv\n```\n\nProduces a 3-column CSV: `question,answer,collection` (no header row).\n\n**Import:**\n```bash\npython3 ~\u002F.hermes\u002Fskills\u002Fproductivity\u002Fmemento-flashcards\u002Fscripts\u002Fmemento_cards.py import \\\n  --file ~\u002Fflashcards.csv \\\n  --collection \"Imported\"\n```\n\nReads a CSV with columns: question, answer, and optionally collection (column 3). If the collection column is missing, uses the `--collection` argument.\n\n### Statistics\n\n```bash\npython3 ~\u002F.hermes\u002Fskills\u002Fproductivity\u002Fmemento-flashcards\u002Fscripts\u002Fmemento_cards.py stats\n```\n\nReturns JSON with:\n- `total`: total card count\n- `learning`: cards in active rotation\n- `retired`: mastered cards\n- `due_now`: cards due for review right now\n- `collections`: breakdown by collection name\n\n## Pitfalls\n\n- **Never edit `cards.json` directly** — always use the script subcommands to avoid corruption\n- **Transcript failures** — some YouTube videos have no English transcript or have transcripts disabled; inform the user and suggest another video\n- **Optional dependency** — `youtube_quiz.py` needs `youtube-transcript-api`; if missing, tell the user to run `pip install youtube-transcript-api`\n- **Large imports** — CSV imports with thousands of rows work fine but the JSON output may be verbose; summarize the result for the user\n- **Video ID extraction** — support both `youtube.com\u002Fwatch?v=ID` and `youtu.be\u002FID` URL formats\n\n## Verification\n\nVerify the helper scripts directly:\n\n```bash\npython3 ~\u002F.hermes\u002Fskills\u002Fproductivity\u002Fmemento-flashcards\u002Fscripts\u002Fmemento_cards.py stats\npython3 ~\u002F.hermes\u002Fskills\u002Fproductivity\u002Fmemento-flashcards\u002Fscripts\u002Fmemento_cards.py add --question \"Capital of France?\" --answer \"Paris\" --collection \"General\"\npython3 ~\u002F.hermes\u002Fskills\u002Fproductivity\u002Fmemento-flashcards\u002Fscripts\u002Fmemento_cards.py due\n```\n\nIf you are testing from the repo checkout, run:\n\n```bash\npytest tests\u002Fskills\u002Ftest_memento_cards.py tests\u002Fskills\u002Ftest_youtube_quiz.py -q\n```\n\nAgent-level verification:\n- Start a review and confirm feedback is plain text, brief, and always includes the correct answer before the next card\n- Run a YouTube quiz flow and confirm each answer receives visible feedback before the next question\n\n## ? Связи\n\n- [[000 - Map of Maps]] — REPO_DOCS\n- [[000 - Map of Maps]] — Map of Maps\n\n",{"name":5,"author":49,"license":15,"version":50,"metadata":51,"platforms":63,"description":7},"Memento AI","1.0.0",{"hermes":52},{"tags":53,"category":60,"requires_toolsets":61},[54,55,56,57,58,59],"Education","Flashcards","Spaced Repetition","Learning","Quiz","YouTube","productivity",[62],"terminal",[64,43],"macos","main","bdd9f958d7bb1a0f19b8ad8da020b0bab0f53eb1","vc-kit\u002Fcontent\u002FCOMBINED\u002FCOMBINED\u002FREPO_DOCS\u002F02-hermes-agent\u002Foptional-skills\u002Fproductivity\u002Fmemento-flashcards",1,"https:\u002F\u002Fgithub.com\u002Fibragimov-oasis\u002Fvibe-coder","https:\u002F\u002Fgithub.com\u002Fibragimov-oasis","2026-06-24 16:31:18",{"source":8,"skillName":5,"commands":73,"prompt":83,"zipAvailable":84},[74,77,80],{"tool":75,"command":76},"npx","npx skills add ibragimov-oasis\u002Fvibe-coder --skill memento-flashcards",{"tool":78,"command":79},"bunx","bunx skills add ibragimov-oasis\u002Fvibe-coder --skill memento-flashcards",{"tool":81,"command":82},"pnpm","pnpm dlx skills add ibragimov-oasis\u002Fvibe-coder --skill memento-flashcards","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fibragimov-oasis\u002Fvibe-coder\u002Fblob\u002Fmain\u002Fvc-kit\u002Fcontent\u002FCOMBINED\u002FCOMBINED\u002FREPO_DOCS\u002F02-hermes-agent\u002Foptional-skills\u002Fproductivity\u002Fmemento-flashcards\u002FSKILL.md",true,[],[87,121,148,167,193,224],{"skillNo":88,"name":89,"nameZh":6,"description":90,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":91,"categories":92,"keywords":101,"publishedAt":44},"01M6Q4Q22KKKVMJJYA411DQ4ER","ckm:ui-styling","Create beautiful, accessible user interfaces with shadcn\u002Fui components (built on Radix UI + Tailwind), Tailwind CSS utility-first styling, and canvas-based visual designs. Use when building user interfaces, implementing design systems, creating responsive layouts, adding accessible components (dialogs, dropdowns, forms, tables), customizing themes and colors, implementing dark mode, generating visual designs and posters, or establishing consistent styling patterns across applications.","https:\u002F\u002Fgithub.com\u002Fibragimov-oasis\u002Fvibe-coder\u002Fblob\u002Fmain\u002Fvc-kit\u002Fcontent\u002FCOMBINED\u002FCOMBINED\u002Fui-design\u002Fui-rules\u002Fui-ux-pro-max\u002Fclaude\u002Fskills\u002Fui-styling\u002FSKILL.md",[93,98],{"categoryNo":94,"categoryName":95,"taxonomyType":96,"taxonomyTypeDesc":97},"01JBSEEDCAT000000000000015","视觉设计","SCENARIO","使用场景",{"categoryNo":99,"categoryName":100,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000032","设计师",[102,103,104,105,106,107,108,109,110,111,42,112,113,114,115,116,117,118,119,120],"ui styling","ui","styling","ckm:ui styling","ckm","design","css","canvas","components","component","design systems","Tailwind","across","themes","utility","mode","implementing","artifact\u002Fui-component","source\u002Fui-design",{"skillNo":122,"name":123,"nameZh":6,"description":124,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":125,"categories":126,"keywords":135,"publishedAt":44},"01M6Q4PQ2NX4NDVWTEHA3MQ2R0","ckm:design","Comprehensive design skill: brand identity, design tokens, UI styling, logo generation (55 styles, Gemini AI), corporate identity program (50 deliverables, CIP mockups), HTML presentations (Chart.js), banner design (22 styles, social\u002Fads\u002Fweb\u002Fprint), icon design (15 styles, SVG, Gemini 3.1 Pro), social photos (HTML→screenshot, multi-platform). Actions: design logo, create CIP, generate mockups, build slides, design banner, generate icon, create social photos, social media images, brand identity, design system. Platforms: Facebook, Twitter, LinkedIn, YouTube, Instagram, Pinterest, TikTok, Threads, Google Ads.","https:\u002F\u002Fgithub.com\u002Fibragimov-oasis\u002Fvibe-coder\u002Fblob\u002Fmain\u002Fvc-kit\u002Fcontent\u002FCOMBINED\u002FCOMBINED\u002Fui-design\u002Fui-rules\u002Fui-ux-pro-max\u002Fclaude\u002Fskills\u002Fdesign\u002FSKILL.md",[127,130,131,134],{"categoryNo":128,"categoryName":129,"taxonomyType":96,"taxonomyTypeDesc":97},"01JBSEEDCAT000000000000003","演示文稿",{"categoryNo":94,"categoryName":95,"taxonomyType":96,"taxonomyTypeDesc":97},{"categoryNo":132,"categoryName":133,"taxonomyType":96,"taxonomyTypeDesc":97},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":99,"categoryName":100,"taxonomyType":21,"taxonomyTypeDesc":22},[107,123,106,136,111,102,137,42,138,139,140,141,142,143,144,145,146,147,119,120],"google","presentations","generate","screenshot","actions","Media","logo","ads","youtube","tiktok","artifact","chart",{"skillNo":149,"name":150,"nameZh":6,"description":151,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":152,"categories":153,"keywords":156,"publishedAt":44},"01M6Q4PJE27GEA3M0CECEBCZKS","ckm:design-system","Token architecture, component specifications, and slide generation. Three-layer tokens (primitive→semantic→component), CSS variables, spacing\u002Ftypography scales, component specs, strategic slide creation. Use for design tokens, systematic design, brand-compliant presentations.","https:\u002F\u002Fgithub.com\u002Fibragimov-oasis\u002Fvibe-coder\u002Fblob\u002Fmain\u002Fvc-kit\u002Fcontent\u002FCOMBINED\u002FCOMBINED\u002Fui-design\u002Fui-rules\u002Fui-ux-pro-max\u002Fclaude\u002Fskills\u002Fdesign-system\u002FSKILL.md",[154,155],{"categoryNo":94,"categoryName":95,"taxonomyType":96,"taxonomyTypeDesc":97},{"categoryNo":99,"categoryName":100,"taxonomyType":21,"taxonomyTypeDesc":22},[107,157,39,158,123,106,108,111,159,137,146,160,161,162,163,164,165,166,119,120],"design system","ckm:design system","architecture","token","creation","systematic","css variables","Variables","spacing","layer",{"skillNo":168,"name":169,"nameZh":6,"description":170,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":171,"categories":172,"keywords":178,"publishedAt":44},"01M6Q4P90JXFYMH2S634QM6SQJ","ckm:banner-design","Design banners for social media, ads, website heroes, creative assets, and print. Multiple art direction options with AI-generated visuals. Actions: design, create, generate banner. Platforms: Facebook, Twitter\u002FX, LinkedIn, YouTube, Instagram, Google Display, website hero, print. Styles: minimalist, gradient, bold typography, photo-based, illustrated, geometric, retro, glassmorphism, 3D, neon, duotone, editorial, collage. Uses ui-ux-pro-max, frontend-design, ai-artist, ai-multimodal skills.","https:\u002F\u002Fgithub.com\u002Fibragimov-oasis\u002Fvibe-coder\u002Fblob\u002Fmain\u002Fvc-kit\u002Fcontent\u002FCOMBINED\u002FCOMBINED\u002Fui-design\u002Fui-rules\u002Fui-ux-pro-max\u002Fclaude\u002Fskills\u002Fbanner-design\u002FSKILL.md",[173,176,177],{"categoryNo":174,"categoryName":175,"taxonomyType":96,"taxonomyTypeDesc":97},"01JBSEEDCAT000000000000009","前端开发",{"categoryNo":94,"categoryName":95,"taxonomyType":96,"taxonomyTypeDesc":97},{"categoryNo":99,"categoryName":100,"taxonomyType":21,"taxonomyTypeDesc":22},[107,179,180,181,106,182,140,141,183,184,185,186,187,188,189,190,119,120,191,192],"banner design","ckm:banner design","banner","frontend","3D","generated","Art","social","dimensions","neon","direction","display","frontend-design","hero",{"skillNo":194,"name":195,"nameZh":6,"description":196,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":197,"categories":198,"keywords":205,"publishedAt":44},"01M6Q2RZXBJ9TBE413GXCYQNDB","seo","Comprehensive SEO analysis for any website or business type. Performs full site audits, single-page deep analysis, technical SEO checks (crawlability, indexability, Core Web Vitals with INP), schema markup detection\u002Fvalidation\u002Fgeneration, content quality assessment (E-E-A-T framework per Dec 2025 update extending to all competitive queries), image optimization, sitemap analysis, and Generative Engine Optimization (GEO) for AI Overviews, ChatGPT, and Perplexity citations. Analyzes AI crawler accessibility (GPTBot, ClaudeBot, PerplexityBot), llms.txt compliance, brand mention signals, and passage-level citability. Industry detection for SaaS, e-commerce, local business, publishers, agencies. Triggers on: \"SEO\", \"audit\", \"schema\", \"Core Web Vitals\", \"sitemap\", \"E-E-A-T\", \"AI Overviews\", \"GEO\", \"technical SEO\", \"content quality\", \"page speed\", \"structured data\".","https:\u002F\u002Fgithub.com\u002Fibragimov-oasis\u002Fvibe-coder\u002Fblob\u002Fmain\u002Fvc-kit\u002Fcontent\u002FCOMBINED\u002FCOMBINED\u002Fskills\u002Fskills-seo\u002Fseo\u002Fclaude-seo\u002Fskills\u002Fseo\u002FSKILL.md",[199,202],{"categoryNo":200,"categoryName":201,"taxonomyType":96,"taxonomyTypeDesc":97},"01JBSEEDCAT000000000000019","营销推广",{"categoryNo":203,"categoryName":204,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000035","市场营销",[195,206,207,208,209,210,211,146,212,213,214,215,216,217,218,219,220,221,222,223],"image","llms","assessment","deep analysis","Citations","analysis","local","deep","crawlability","seo analysis","2025","commerce","URL","domain\u002Fseo","source\u002Fskills-seo","vitals","generative","publishers",{"skillNo":225,"name":226,"nameZh":6,"description":227,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":228,"categories":229,"keywords":232,"publishedAt":44},"01M6Q2RVE7VGFCFQKBK468NHVY","seo-technical","Technical SEO audit across 9 categories: crawlability, indexability, security, URL structure, mobile, Core Web Vitals, structured data, JavaScript rendering, and IndexNow protocol. Use when user says \"technical SEO\", \"crawl issues\", \"robots.txt\", \"Core Web Vitals\", \"site speed\", or \"security headers\".","https:\u002F\u002Fgithub.com\u002Fibragimov-oasis\u002Fvibe-coder\u002Fblob\u002Fmain\u002Fvc-kit\u002Fcontent\u002FCOMBINED\u002FCOMBINED\u002Fskills\u002Fskills-seo\u002Fseo\u002Fclaude-seo\u002Fskills\u002Fseo-technical\u002FSKILL.md",[230,231],{"categoryNo":200,"categoryName":201,"taxonomyType":96,"taxonomyTypeDesc":97},{"categoryNo":203,"categoryName":204,"taxonomyType":21,"taxonomyTypeDesc":22},[195,233,234,235,236,237,238,239,240,146,114,214,241,242,218,243,244,219,220,221],"technical","seo technical","issues","audit","data","mobile","crawl","structure","rendering","technical seo audit","headers","categories"]