[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71EGV78P6HD017S8FZ98J32":3,"skill-same:01M71EGV78P6HD017S8FZ98J32":75},{"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":18,"publishedAt":39,"linkOnly":40,"markdownContent":41,"markdownBody":42,"frontMatter":43,"refName":44,"commitSha":45,"skillDirectory":46,"forksCount":47,"repositoryHtmlUrl":48,"repositoryHomepageUrl":6,"ownerHtmlUrl":49,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":50,"install":51,"resources":64},"01M71EGV78P6HD017S8FZ98J32","gh-session-extract",null,"Extract conversation skeleton or error signals from a single session file at a given path. Invoked by session-research agents after they have selected which sessions to deep-dive — not intended for direct user queries.","JGXC100\u002FGaleHarnessCodingCLI","JGXC100","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F11926809?v=4","01M71EEBHJ3EGYSNNDDSVDKXNG","JGX","01M71EEBJ995S5J2HDEQCBA268",0,"MIT","https:\u002F\u002Fgithub.com\u002FJGXC100\u002FGaleHarnessCodingCLI\u002Fblob\u002Fmain\u002Fplugins\u002Fgaleharness-cli\u002Fskills\u002Fgh-session-extract\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],"session","gh","extract","gh session extract","direct","at","fork","signals","research","queries","file","false","single","sessions","skeleton","for","which","deep","conversation","error","2026-11-10 10:12:30",false,"---\nname: gh-session-extract\ndescription: \"Extract conversation skeleton or error signals from a single session file at a given path. Invoked by session-research agents after they have selected which sessions to deep-dive — not intended for direct user queries.\"\nuser-invocable: false\ncontext: fork\n---\n\n# Session extract\n\nAgent-facing primitive. Extract filtered content from a single Claude Code, Codex, or Cursor session file — either a conversation skeleton or error signals.\n\nThis skill exists so that agents do not read multi-megabyte session files into context. The scripts under `scripts\u002F` own the JSONL shape knowledge and emit a narrative-readable digest.\n\n## Arguments\n\nSpace-separated positional args:\n\n1. `\u003Cfile>` — absolute path to a session JSONL file (typically a `file` value returned by `gh-session-inventory`).\n2. `\u003Cmode>` — `skeleton` or `errors`.\n3. `\u003Climit>` *(optional)* — `head:N` or `tail:N` to cap output at N lines (e.g., `head:200`). Omit to return full extraction.\n\n## Execution\n\n**Skeleton mode** — narrative of user messages, assistant text, and collapsed tool-call summaries:\n\n```bash\ncat \u003Cfile> | python3 scripts\u002Fextract-skeleton.py\n```\n\n**Errors mode** — just error signals:\n\n```bash\ncat \u003Cfile> | python3 scripts\u002Fextract-errors.py\n```\n\nIf `\u003Climit>` is `head:N`, pipe through `head -n N`. If `tail:N`, pipe through `tail -n N`. Apply the limit after the Python script, never before — the `_meta` line is emitted last and a head cap may drop it; that is acceptable when the caller asks for a head cap.\n\nReturn the raw stdout verbatim. Do not paraphrase, annotate, or synthesize — the caller does synthesis across multiple sessions.\n\n## What each mode returns\n\n### Skeleton\n\nNarrative output with one logical event per block, separated by `---`:\n\n- User messages (text only, no tool results, framework wrapper tags stripped)\n- Assistant text (no thinking\u002Freasoning blocks — those are internal or encrypted)\n- Tool call summaries; 3+ consecutive same-name calls are collapsed (e.g., `[tools] 5x Read (file1, file2, +3 more) -> all ok`)\n\nEnds with a `_meta` line: `{\"_meta\": true, \"lines\": N, \"parse_errors\": N, \"user\": N, \"assistant\": N, \"tool\": N}`.\n\n### Errors\n\nOne line per error, separated by `---`:\n\n- Claude Code: tool results with `is_error: true`\n- Codex: `exec_command_end` events with non-zero exit or non-empty stderr\n- Cursor: always empty — Cursor agent transcripts do not log tool results\n\nEnds with a `_meta` line: `{\"_meta\": true, \"lines\": N, \"parse_errors\": N, \"errors_found\": N}`.\n\n## Error handling\n\nIf the file cannot be read, let the error surface to the caller. If `_meta` reports `parse_errors > 0`, return the output as-is — partial extraction is still useful and the caller decides whether to widen the search or deep-dive further.\n","# Session extract\n\nAgent-facing primitive. Extract filtered content from a single Claude Code, Codex, or Cursor session file — either a conversation skeleton or error signals.\n\nThis skill exists so that agents do not read multi-megabyte session files into context. The scripts under `scripts\u002F` own the JSONL shape knowledge and emit a narrative-readable digest.\n\n## Arguments\n\nSpace-separated positional args:\n\n1. `\u003Cfile>` — absolute path to a session JSONL file (typically a `file` value returned by `gh-session-inventory`).\n2. `\u003Cmode>` — `skeleton` or `errors`.\n3. `\u003Climit>` *(optional)* — `head:N` or `tail:N` to cap output at N lines (e.g., `head:200`). Omit to return full extraction.\n\n## Execution\n\n**Skeleton mode** — narrative of user messages, assistant text, and collapsed tool-call summaries:\n\n```bash\ncat \u003Cfile> | python3 scripts\u002Fextract-skeleton.py\n```\n\n**Errors mode** — just error signals:\n\n```bash\ncat \u003Cfile> | python3 scripts\u002Fextract-errors.py\n```\n\nIf `\u003Climit>` is `head:N`, pipe through `head -n N`. If `tail:N`, pipe through `tail -n N`. Apply the limit after the Python script, never before — the `_meta` line is emitted last and a head cap may drop it; that is acceptable when the caller asks for a head cap.\n\nReturn the raw stdout verbatim. Do not paraphrase, annotate, or synthesize — the caller does synthesis across multiple sessions.\n\n## What each mode returns\n\n### Skeleton\n\nNarrative output with one logical event per block, separated by `---`:\n\n- User messages (text only, no tool results, framework wrapper tags stripped)\n- Assistant text (no thinking\u002Freasoning blocks — those are internal or encrypted)\n- Tool call summaries; 3+ consecutive same-name calls are collapsed (e.g., `[tools] 5x Read (file1, file2, +3 more) -> all ok`)\n\nEnds with a `_meta` line: `{\"_meta\": true, \"lines\": N, \"parse_errors\": N, \"user\": N, \"assistant\": N, \"tool\": N}`.\n\n### Errors\n\nOne line per error, separated by `---`:\n\n- Claude Code: tool results with `is_error: true`\n- Codex: `exec_command_end` events with non-zero exit or non-empty stderr\n- Cursor: always empty — Cursor agent transcripts do not log tool results\n\nEnds with a `_meta` line: `{\"_meta\": true, \"lines\": N, \"parse_errors\": N, \"errors_found\": N}`.\n\n## Error handling\n\nIf the file cannot be read, let the error surface to the caller. If `_meta` reports `parse_errors > 0`, return the output as-is — partial extraction is still useful and the caller decides whether to widen the search or deep-dive further.\n",{"name":5,"context":25,"description":7,"user-invocable":40},"main","94fc651a7c5ff227f3e8f4b9678dc4566f535677","plugins\u002Fgaleharness-cli\u002Fskills\u002Fgh-session-extract",2,"https:\u002F\u002Fgithub.com\u002FJGXC100\u002FGaleHarnessCodingCLI","https:\u002F\u002Fgithub.com\u002FJGXC100","2026-05-19 17:04:59",{"source":8,"skillName":5,"commands":52,"prompt":62,"zipAvailable":63},[53,56,59],{"tool":54,"command":55},"npx","npx skills add JGXC100\u002FGaleHarnessCodingCLI --skill gh-session-extract",{"tool":57,"command":58},"bunx","bunx skills add JGXC100\u002FGaleHarnessCodingCLI --skill gh-session-extract",{"tool":60,"command":61},"pnpm","pnpm dlx skills add JGXC100\u002FGaleHarnessCodingCLI --skill gh-session-extract","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FJGXC100\u002FGaleHarnessCodingCLI\u002Fblob\u002Fmain\u002Fplugins\u002Fgaleharness-cli\u002Fskills\u002Fgh-session-extract\u002FSKILL.md",true,[65,71],{"path":66,"resourceType":67,"resourceTypeDesc":68,"sizeBytes":69,"sourceHtmlUrl":70},"scripts\u002Fextract-errors.py","SCRIPT","脚本",3595,"https:\u002F\u002Fgithub.com\u002FJGXC100\u002FGaleHarnessCodingCLI\u002Fblob\u002Fmain\u002Fplugins\u002Fgaleharness-cli\u002Fskills\u002Fgh-session-extract\u002Fscripts\u002Fextract-errors.py",{"path":72,"resourceType":67,"resourceTypeDesc":68,"sizeBytes":73,"sourceHtmlUrl":74},"scripts\u002Fextract-skeleton.py",11914,"https:\u002F\u002Fgithub.com\u002FJGXC100\u002FGaleHarnessCodingCLI\u002Fblob\u002Fmain\u002Fplugins\u002Fgaleharness-cli\u002Fskills\u002Fgh-session-extract\u002Fscripts\u002Fextract-skeleton.py",[76,92,106,118,126,134],{"skillNo":77,"name":78,"nameZh":6,"description":79,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":80,"categories":81,"keywords":87,"publishedAt":39},"01M71EJT9M91X2T91N4ZPCWHN3","skill-one","Sample skill","https:\u002F\u002Fgithub.com\u002FJGXC100\u002FGaleHarnessCodingCLI\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fsample-plugin\u002Fskills\u002Fskill-one\u002FSKILL.md",[82],{"categoryNo":83,"categoryName":84,"taxonomyType":85,"taxonomyTypeDesc":86},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[88,89,90,91],"skill one","one","sample skill","sample",{"skillNo":93,"name":94,"nameZh":6,"description":95,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":96,"categories":97,"keywords":99,"publishedAt":39},"01M71EJRH7M0DGZ1QXJ9PSFMB5","disabled-skill","A skill with model invocation disabled","https:\u002F\u002Fgithub.com\u002FJGXC100\u002FGaleHarnessCodingCLI\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fsample-plugin\u002Fskills\u002Fdisabled-skill\u002FSKILL.md",[98],{"categoryNo":83,"categoryName":84,"taxonomyType":85,"taxonomyTypeDesc":86},[100,101,102,103,104,105],"disabled skill","a skill","with model","with","true","model",{"skillNo":107,"name":108,"nameZh":6,"description":109,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":110,"categories":111,"keywords":113,"publishedAt":39},"01M71EJQMRH6JC9H9V5BQWM7RJ","claude-only-skill","A skill restricted to Claude Code only","https:\u002F\u002Fgithub.com\u002FJGXC100\u002FGaleHarnessCodingCLI\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fsample-plugin\u002Fskills\u002Fclaude-only-skill\u002FSKILL.md",[112],{"categoryNo":83,"categoryName":84,"taxonomyType":85,"taxonomyTypeDesc":86},[114,115,116,117,101],"only","claude only skill","claude only","code",{"skillNo":119,"name":120,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":121,"categories":122,"keywords":123,"publishedAt":39},"01M71EJPXZ0644M41M587FVKYQ","default-skill","https:\u002F\u002Fgithub.com\u002FJGXC100\u002FGaleHarnessCodingCLI\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fcustom-paths\u002Fskills\u002Fdefault-skill\u002FSKILL.md",[],[124,125],"default skill","default",{"skillNo":127,"name":128,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":129,"categories":130,"keywords":131,"publishedAt":39},"01M71EJP6RPF6PDAJ2SY4VMBDT","custom-skill","https:\u002F\u002Fgithub.com\u002FJGXC100\u002FGaleHarnessCodingCLI\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fcustom-paths\u002Fcustom-skills\u002Fcustom-skill\u002FSKILL.md",[],[132,133],"custom skill","custom",{"skillNo":135,"name":136,"nameZh":6,"description":137,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":138,"categories":139,"keywords":143,"publishedAt":39},"01M71EJK74AZ929S8GF55G5CDV","test-xcode","Build and test iOS apps on simulator using XcodeBuildMCP. Use after making iOS code changes, before creating a PR, or when verifying app behavior and checking for crashes on simulator.","https:\u002F\u002Fgithub.com\u002FJGXC100\u002FGaleHarnessCodingCLI\u002Fblob\u002Fmain\u002Fplugins\u002Fgaleharness-cli\u002Fskills\u002Ftest-xcode\u002FSKILL.md",[140],{"categoryNo":141,"categoryName":142,"taxonomyType":85,"taxonomyTypeDesc":86},"01JBSEEDCAT000000000000008","测试与质量",[144,145,146,147,148,149,150,34,125,104,151,152,153,154,117,155,156,157,158,159],"test","xcode","test xcode","apps","app","build and test","pr","xcodebuildmcp","use","scheme","when","changes","build","ios","name","behavior"]