[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M7E80ADACECJC63VS9KA3THG":3,"skill-same:01M7E80ADACECJC63VS9KA3THG":92},{"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":19,"linkOnly":20,"markdownContent":21,"markdownBody":22,"frontMatter":23,"refName":35,"commitSha":36,"skillDirectory":37,"forksCount":14,"repositoryHtmlUrl":38,"repositoryHomepageUrl":6,"ownerHtmlUrl":39,"ownerBlogUrl":40,"ownerDescription":41,"updatedAt":42,"install":43,"resources":55},"01M7E80ADACECJC63VS9KA3THG","scholar-gather",null,"Resolve and pin a corpus, inventory it, and record what was read and what was deliberately skipped, into sources.jsonl","tony\u002Fskills","tony","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F26336?v=4","01M72E5RNJ7SQV8F9KBM5RKRMN","Tony Narlock","01M7E7MBN5C6YZ4JJJ5Y82KBJG",0,"MIT","https:\u002F\u002Fgithub.com\u002Ftony\u002Fskills\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fscholar-gather\u002FSKILL.md",[],[],"2026-11-15 14:19:17",false,"---\nname: scholar-gather\ndescription: >-\n  Resolve and pin a corpus, inventory it, and record what was read and what\n  was deliberately skipped, into sources.jsonl\ndisable-model-invocation: true\nallowed-tools: [\"Bash\", \"Read\", \"Grep\", \"Glob\", \"Write\", \"AskUserQuestion\"]\nmetadata:\n  argument-hint: \"\u003Ctarget>... [--kind=code|prose] [--out=\u003Cdir>]\"\n  source: \"plugins\u002Fscholar\u002Fskills\u002Fgather\u002FSKILL.md\"\n---\n\n# this skill\n\nStage 1. Turn a loose target (a repository, a set of them, a book) into a\npinned, inventoried source list a later stage can cite against.\n\nRead `references\u002Fsource-pins.md` for how to pin,\n`references\u002Fcitation.md` for citation fields, and\n`references\u002Fstage-gates.md` for this stage's exit condition.\n\nUser arguments: $ARGUMENTS\n\nRead `references\u002Foutput-contract.md` before writing study files.\n\n## The invariant\n\nNever write into the corpus being read: no `git checkout`, no `git clean`, no\nedit inside a target. Studying a project must not dirty its checkout. Output\nlands under `--out`, defaulting to `notes\u002Fontology\u002F\u003Csubject>\u002F` in the current\nrepository, even when that repository is the corpus: the dirty-tree checks in\n`gather` and `extract` leave the study directory out, so the study does not\nblock the next stage. The corpus is recorded by URL and ref; `extract` fetches a pinned checkout\nwhen it needs one. A checkout with no remote is recorded by its directory name\n(step 1). A pasted excerpt is the exception: it has no\nURL, so it is stored under `--out`.\n\n## Procedure\n\n### 1. Resolve each target to a ref\n\nResolve repository targets using `source-pins.md`.\n\nFor a local checkout, resolve it with the pin script. `\u003Cpins>` is\n`references\u002Fscholar_pins.py`, resolved against this skill's directory to an\nabsolute path, and `\u003Cout>` is the study directory:\n\n```console\n$ python3 \u003Cpins> local \u003Ccorpus> \\\n    --study \u003Cout>\n```\n\nIt exits non-zero with a one-line reason when the checkout has uncommitted\nedits (files under `\u003Cout>` do not count), and otherwise prints one JSON line:\n`commit` (the full 40 digits to record as `commit`), `ref` (the tag when one\npoints exactly at HEAD, else the 7-character HEAD), `tag`, and `pushed`.\nQuotes are read at HEAD, so a tag behind HEAD is never the ref. A refusal\nmeans: stop and ask the user to commit or pass a scope that excludes the\nedits. `\"pushed\": false` means a permalink to the commit can 404: pin a pushed\nref instead, or record the source without a URL (below).\n\nFor a remote on another host, the script vets URL and REF, lists the remote,\nand prints the commit (the peeled commit of an annotated tag, else the plain\nref; a tag wins over a branch of the same name). A refusal is a one-line\nreason; report the source as unresolved:\n\n```console\n$ python3 \u003Cpins> ls-remote URL REF\n```\n\nA checkout with no remote has no URL form. Publish it first, or record\n`source` as the repository's directory name, leave `url` out of every cite, and\ncite `path@commit` in `locator`; `verify` checks those with `git show` inside\nthat repository.\n\nFor prose, the ref is the edition: publisher, year, and printing. It has no\n`commit`; leave it empty. A pasted prose excerpt is saved verbatim to\n`\u003Cout>\u002Fcorpus\u002Fexcerpt-\u003Cn>.txt` (n counts from 1), and that path relative to `\u003Cout>`\nis the row's `source`. Name no title the user did not give.\n\n### 2. Inventory without reading everything\n\nEstablish the shape of the corpus cheaply. For code, the module or package\nlist and the size of each. For prose, the table of contents. For several\nrepositories, the list and what each one is for.\n\n### 3. Decide scope with the user\n\nPresent the inventory via `ask-user-choice` and settle what will be read. Most\nstudies should not read everything. Where no question tool exists, print the\ninventory and a proposed scope, then stop without writing `sources.jsonl`.\nA scope the user named in the request is already settled; do not ask again.\n\n### 4. Write sources.jsonl and check it\n\nOne row per source, including every source deliberately not read:\n\n```json\n{\"source\": \"https:\u002F\u002Fgithub.com\u002FOWNER\u002FREPO\", \"ref\": \"v2.40.0\", \"commit\": \"\u003C40-character SHA>\", \"scope\": \"src\u002Fparser\u002F\", \"locator_kind\": \"line-range\", \"read\": true, \"why\": \"\"}\n{\"source\": \"https:\u002F\u002Fgithub.com\u002FOWNER\u002FREPO\", \"ref\": \"v2.40.0\", \"commit\": \"\u003C40-character SHA>\", \"scope\": \"test\u002F\", \"locator_kind\": \"line-range\", \"read\": false, \"why\": \"tests name fixtures, not domain concepts\"}\n{\"source\": \"Example Press, Style Guide\", \"ref\": \"2024, first printing\", \"commit\": \"\", \"scope\": \"chapter 2\", \"locator_kind\": \"search-string\", \"read\": true, \"why\": \"\"}\n```\n\n`locator_kind` is how citations into the source are located: `line-range`,\n`section`, `page`, or `search-string`, defined in\n`references\u002Fcitation.md`. `annotate`, `extract`, and `verify` all use\nthese four values.\n\nThen read it back with the gate in `references\u002Fstage-gates.md`\n(`--check-sources`) and fix every line it prints before reporting. `contest`'s\ncompleteness pass reads exactly this file.\n\n## Rules\n\n- List `sources.jsonl` under `## Pinned` as its path under `--out`. For prose\n  the commit line is \"Commit: none\"; the ref is only the edition as given\n  (\"2024, first printing\").\n- A commit not on any remote is recorded as \"commit not on a remote; recorded\n  without URL\".\n- \"Out of scope\" is not a reason in `why`. Say what the source contains and why\n  that does not bear on the vocabulary.\n\n## Output\n\nPer `references\u002Foutput-contract.md`. Hero: `✓ \u003Csubject>: \u003Cn> sources\npinned, \u003Cn> skipped` or `⚠ Blocked: \u003Creason>`. Sections:\n\n1. `## Pinned`: the `sources.jsonl` written, as a path under `--out`, then\n   each source read, its ref, and how the ref was resolved.\n2. `## Skipped`: each source not read, and why.\n3. `## Shape`: the inventory that informed the scope decision, stated as\n   what is there (\"one excerpt, two sentences\"), never as what is missing.\n\nNext-step options: run extract, widen scope, stop here.\n\nWrite it per `references\u002Fprose-rules.md`.\n\n\n## Portability notes\n\n- `ask-user-choice` — present the listed options and wait for the user to pick one. Hosts with a structured multiple-choice tool (Claude Code's `AskUserQuestion`) should use it; otherwise print a numbered list and wait for a numbered reply. Never proceed on an assumed answer.\n- `$ARGUMENTS` — the text the user passed when invoking this skill. If your host does not substitute it, read it as the user's request in the current turn, and ask when there is none.\n- Bundled files — every relative path in this skill points at a file shipped inside this skill directory. Read them from here, not from the host's plugin tree.\n","# this skill\n\nStage 1. Turn a loose target (a repository, a set of them, a book) into a\npinned, inventoried source list a later stage can cite against.\n\nRead `references\u002Fsource-pins.md` for how to pin,\n`references\u002Fcitation.md` for citation fields, and\n`references\u002Fstage-gates.md` for this stage's exit condition.\n\nUser arguments: $ARGUMENTS\n\nRead `references\u002Foutput-contract.md` before writing study files.\n\n## The invariant\n\nNever write into the corpus being read: no `git checkout`, no `git clean`, no\nedit inside a target. Studying a project must not dirty its checkout. Output\nlands under `--out`, defaulting to `notes\u002Fontology\u002F\u003Csubject>\u002F` in the current\nrepository, even when that repository is the corpus: the dirty-tree checks in\n`gather` and `extract` leave the study directory out, so the study does not\nblock the next stage. The corpus is recorded by URL and ref; `extract` fetches a pinned checkout\nwhen it needs one. A checkout with no remote is recorded by its directory name\n(step 1). A pasted excerpt is the exception: it has no\nURL, so it is stored under `--out`.\n\n## Procedure\n\n### 1. Resolve each target to a ref\n\nResolve repository targets using `source-pins.md`.\n\nFor a local checkout, resolve it with the pin script. `\u003Cpins>` is\n`references\u002Fscholar_pins.py`, resolved against this skill's directory to an\nabsolute path, and `\u003Cout>` is the study directory:\n\n```console\n$ python3 \u003Cpins> local \u003Ccorpus> \\\n    --study \u003Cout>\n```\n\nIt exits non-zero with a one-line reason when the checkout has uncommitted\nedits (files under `\u003Cout>` do not count), and otherwise prints one JSON line:\n`commit` (the full 40 digits to record as `commit`), `ref` (the tag when one\npoints exactly at HEAD, else the 7-character HEAD), `tag`, and `pushed`.\nQuotes are read at HEAD, so a tag behind HEAD is never the ref. A refusal\nmeans: stop and ask the user to commit or pass a scope that excludes the\nedits. `\"pushed\": false` means a permalink to the commit can 404: pin a pushed\nref instead, or record the source without a URL (below).\n\nFor a remote on another host, the script vets URL and REF, lists the remote,\nand prints the commit (the peeled commit of an annotated tag, else the plain\nref; a tag wins over a branch of the same name). A refusal is a one-line\nreason; report the source as unresolved:\n\n```console\n$ python3 \u003Cpins> ls-remote URL REF\n```\n\nA checkout with no remote has no URL form. Publish it first, or record\n`source` as the repository's directory name, leave `url` out of every cite, and\ncite `path@commit` in `locator`; `verify` checks those with `git show` inside\nthat repository.\n\nFor prose, the ref is the edition: publisher, year, and printing. It has no\n`commit`; leave it empty. A pasted prose excerpt is saved verbatim to\n`\u003Cout>\u002Fcorpus\u002Fexcerpt-\u003Cn>.txt` (n counts from 1), and that path relative to `\u003Cout>`\nis the row's `source`. Name no title the user did not give.\n\n### 2. Inventory without reading everything\n\nEstablish the shape of the corpus cheaply. For code, the module or package\nlist and the size of each. For prose, the table of contents. For several\nrepositories, the list and what each one is for.\n\n### 3. Decide scope with the user\n\nPresent the inventory via `ask-user-choice` and settle what will be read. Most\nstudies should not read everything. Where no question tool exists, print the\ninventory and a proposed scope, then stop without writing `sources.jsonl`.\nA scope the user named in the request is already settled; do not ask again.\n\n### 4. Write sources.jsonl and check it\n\nOne row per source, including every source deliberately not read:\n\n```json\n{\"source\": \"https:\u002F\u002Fgithub.com\u002FOWNER\u002FREPO\", \"ref\": \"v2.40.0\", \"commit\": \"\u003C40-character SHA>\", \"scope\": \"src\u002Fparser\u002F\", \"locator_kind\": \"line-range\", \"read\": true, \"why\": \"\"}\n{\"source\": \"https:\u002F\u002Fgithub.com\u002FOWNER\u002FREPO\", \"ref\": \"v2.40.0\", \"commit\": \"\u003C40-character SHA>\", \"scope\": \"test\u002F\", \"locator_kind\": \"line-range\", \"read\": false, \"why\": \"tests name fixtures, not domain concepts\"}\n{\"source\": \"Example Press, Style Guide\", \"ref\": \"2024, first printing\", \"commit\": \"\", \"scope\": \"chapter 2\", \"locator_kind\": \"search-string\", \"read\": true, \"why\": \"\"}\n```\n\n`locator_kind` is how citations into the source are located: `line-range`,\n`section`, `page`, or `search-string`, defined in\n`references\u002Fcitation.md`. `annotate`, `extract`, and `verify` all use\nthese four values.\n\nThen read it back with the gate in `references\u002Fstage-gates.md`\n(`--check-sources`) and fix every line it prints before reporting. `contest`'s\ncompleteness pass reads exactly this file.\n\n## Rules\n\n- List `sources.jsonl` under `## Pinned` as its path under `--out`. For prose\n  the commit line is \"Commit: none\"; the ref is only the edition as given\n  (\"2024, first printing\").\n- A commit not on any remote is recorded as \"commit not on a remote; recorded\n  without URL\".\n- \"Out of scope\" is not a reason in `why`. Say what the source contains and why\n  that does not bear on the vocabulary.\n\n## Output\n\nPer `references\u002Foutput-contract.md`. Hero: `✓ \u003Csubject>: \u003Cn> sources\npinned, \u003Cn> skipped` or `⚠ Blocked: \u003Creason>`. Sections:\n\n1. `## Pinned`: the `sources.jsonl` written, as a path under `--out`, then\n   each source read, its ref, and how the ref was resolved.\n2. `## Skipped`: each source not read, and why.\n3. `## Shape`: the inventory that informed the scope decision, stated as\n   what is there (\"one excerpt, two sentences\"), never as what is missing.\n\nNext-step options: run extract, widen scope, stop here.\n\nWrite it per `references\u002Fprose-rules.md`.\n\n\n## Portability notes\n\n- `ask-user-choice` — present the listed options and wait for the user to pick one. Hosts with a structured multiple-choice tool (Claude Code's `AskUserQuestion`) should use it; otherwise print a numbered list and wait for a numbered reply. Never proceed on an assumed answer.\n- `$ARGUMENTS` — the text the user passed when invoking this skill. If your host does not substitute it, read it as the user's request in the current turn, and ask when there is none.\n- Bundled files — every relative path in this skill points at a file shipped inside this skill directory. Read them from here, not from the host's plugin tree.\n",{"name":5,"metadata":24,"description":7,"allowed-tools":27,"disable-model-invocation":34},{"source":25,"argument-hint":26},"plugins\u002Fscholar\u002Fskills\u002Fgather\u002FSKILL.md","\u003Ctarget>... [--kind=code|prose] [--out=\u003Cdir>]",[28,29,30,31,32,33],"Bash","Read","Grep","Glob","Write","AskUserQuestion",true,"main","5fbeb3b47beedea13813be7b7023f736a8d97a65",".agents\u002Fskills\u002Fscholar-gather","https:\u002F\u002Fgithub.com\u002Ftony\u002Fskills","https:\u002F\u002Fgithub.com\u002Ftony","https:\u002F\u002Ftony.sh","lighthouse keeper","2026-11-08 17:57:34",{"source":8,"skillName":5,"commands":44,"prompt":54,"zipAvailable":34},[45,48,51],{"tool":46,"command":47},"npx","npx skills add tony\u002Fskills --skill scholar-gather",{"tool":49,"command":50},"bunx","bunx skills add tony\u002Fskills --skill scholar-gather",{"tool":52,"command":53},"pnpm","pnpm dlx skills add tony\u002Fskills --skill scholar-gather","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Ftony\u002Fskills\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fscholar-gather\u002FSKILL.md",[56,62,66,70,74,80,84,88],{"path":57,"resourceType":58,"resourceTypeDesc":59,"sizeBytes":60,"sourceHtmlUrl":61},"agents\u002Fopenai.yaml","REFERENCE","参考文档",294,"https:\u002F\u002Fgithub.com\u002Ftony\u002Fskills\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fscholar-gather\u002Fagents\u002Fopenai.yaml",{"path":63,"resourceType":58,"resourceTypeDesc":59,"sizeBytes":64,"sourceHtmlUrl":65},"references\u002Fcitation.md",2560,"https:\u002F\u002Fgithub.com\u002Ftony\u002Fskills\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fscholar-gather\u002Freferences\u002Fcitation.md",{"path":67,"resourceType":58,"resourceTypeDesc":59,"sizeBytes":68,"sourceHtmlUrl":69},"references\u002Foutput-contract.md",4098,"https:\u002F\u002Fgithub.com\u002Ftony\u002Fskills\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fscholar-gather\u002Freferences\u002Foutput-contract.md",{"path":71,"resourceType":58,"resourceTypeDesc":59,"sizeBytes":72,"sourceHtmlUrl":73},"references\u002Fprose-rules.md",4644,"https:\u002F\u002Fgithub.com\u002Ftony\u002Fskills\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fscholar-gather\u002Freferences\u002Fprose-rules.md",{"path":75,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":78,"sourceHtmlUrl":79},"references\u002Fscholar_pins.py","SCRIPT","脚本",9878,"https:\u002F\u002Fgithub.com\u002Ftony\u002Fskills\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fscholar-gather\u002Freferences\u002Fscholar_pins.py",{"path":81,"resourceType":58,"resourceTypeDesc":59,"sizeBytes":82,"sourceHtmlUrl":83},"references\u002Fsource-pins.md",2713,"https:\u002F\u002Fgithub.com\u002Ftony\u002Fskills\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fscholar-gather\u002Freferences\u002Fsource-pins.md",{"path":85,"resourceType":58,"resourceTypeDesc":59,"sizeBytes":86,"sourceHtmlUrl":87},"references\u002Fstage-gates.md",4310,"https:\u002F\u002Fgithub.com\u002Ftony\u002Fskills\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fscholar-gather\u002Freferences\u002Fstage-gates.md",{"path":89,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":90,"sourceHtmlUrl":91},"references\u002Fterm_metrics.py",48954,"https:\u002F\u002Fgithub.com\u002Ftony\u002Fskills\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fscholar-gather\u002Freferences\u002Fterm_metrics.py",[93,100,107,114,121,128],{"skillNo":94,"name":95,"nameZh":6,"description":96,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":97,"categories":98,"keywords":99,"publishedAt":19},"01M7E8NCSHXV2JPW4J61R0TQS7","serene-bliss","Use when asked to make a CLI --help, docs page, error message, or tooling UX more serene or calmer for developer experience; returns text, no edits.","https:\u002F\u002Fgithub.com\u002Ftony\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fweave\u002Fskills\u002Fserene-bliss\u002FSKILL.md",[],[],{"skillNo":101,"name":102,"nameZh":6,"description":103,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":104,"categories":105,"keywords":106,"publishedAt":19},"01M7E8N87MAVJD8RRQKQB1ZPS6","review","Weave code review: run independent adversarial reviews in parallel, then synthesize findings","https:\u002F\u002Fgithub.com\u002Ftony\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fweave\u002Fskills\u002Freview\u002FSKILL.md",[],[],{"skillNo":108,"name":109,"nameZh":6,"description":110,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":111,"categories":112,"keywords":113,"publishedAt":19},"01M7E8N402XG4ZBFNACQ413163","refine","Use when asked to refine a draft, iterate on code until cleaner, or polish a README through repeated critique and improvement.","https:\u002F\u002Fgithub.com\u002Ftony\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fweave\u002Fskills\u002Frefine\u002FSKILL.md",[],[],{"skillNo":115,"name":116,"nameZh":6,"description":117,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":118,"categories":119,"keywords":120,"publishedAt":19},"01M7E8N01KB86A7136P00GVKJW","prompt","Weave prompt: compare independent adversarial implementations, then adopt the single best one","https:\u002F\u002Fgithub.com\u002Ftony\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fweave\u002Fskills\u002Fprompt\u002FSKILL.md",[],[],{"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":127,"publishedAt":19},"01M7E8MW7YJW2PCMDW3G9RTGNK","plan","Weave planning: compare independent adversarial plans, then synthesize the best one","https:\u002F\u002Fgithub.com\u002Ftony\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fweave\u002Fskills\u002Fplan\u002FSKILL.md",[],[],{"skillNo":129,"name":130,"nameZh":6,"description":131,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":132,"categories":133,"keywords":134,"publishedAt":19},"01M7E8MSBYXNCV4ZYWDS4PFJXK","fix-review","Fix weave review findings: validate, add test coverage, fix, and commit each as atomic changes","https:\u002F\u002Fgithub.com\u002Ftony\u002Fskills\u002Fblob\u002Fmain\u002Fplugins\u002Fweave\u002Fskills\u002Ffix-review\u002FSKILL.md",[],[]]