[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6PQAVS5DTTVEV9VA313YSYM":3,"skill-same:01M6PQAVS5DTTVEV9VA313YSYM":61},{"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":32,"linkOnly":33,"markdownContent":34,"markdownBody":35,"frontMatter":36,"refName":37,"commitSha":38,"skillDirectory":39,"forksCount":40,"repositoryHtmlUrl":41,"repositoryHomepageUrl":42,"ownerHtmlUrl":43,"ownerBlogUrl":44,"ownerDescription":45,"updatedAt":46,"install":47,"resources":60},"01M6PQAVS5DTTVEV9VA313YSYM","review-markdown-comments",null,"Reply to, resolve, or reopen Hubble review comments stored as CriticMarkup in Markdown files. Use when asked to address a Hubble review comment.","bholmesdev\u002Fhubble.md","bholmesdev","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F51384119?v=4","01M6CP8SJ3N9W8FYVCGV41QT3G","Ben Holmes","01M6CP8SP3A84K1TFMVS8BEBDW",1523,"MIT","https:\u002F\u002Fgithub.com\u002Fbholmesdev\u002Fhubble.md\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Freview-markdown-comments\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000002","文档处理","SCENARIO","使用场景",[24,25,26,27,28,29,30,31],"review","markdown","comments","review markdown comments","use","reply","files","as","2026-11-10 10:12:30",false,"---\nname: review-markdown-comments\ndescription: \"Reply to, resolve, or reopen Hubble review comments stored as CriticMarkup in Markdown files. Use when asked to address a Hubble review comment.\"\n---\n\n# Review Markdown Comments\n\nWork directly on the Markdown file named by the user.\n\n## Comment format\n\nHubble stores review state in the Markdown body using this portable subset:\n\n```md\n{==anchored text==}{>>comment body\u003C\u003C}{#c1}\n{++suggested insertion++}\n{--suggested deletion--}\n{~~original text~>replacement text~~}\n```\n\nThread state may follow a comment anchor as an HTML comment holding raw JSON.\nIt is not URI-encoded; Hubble parses it with `JSON.parse` directly, so an\nencoded payload fails to parse and renders as literal text in the note:\n\n```md\n\u003C!-- hubble-review:{\"v\":1,\"replies\":[],\"resolved\":false}-->\n```\n\nHubble uses `v`, `replies`, and `resolved`; other top-level keys are allowed.\nAlways write `\"v\": 1`. Escape any `--` inside the JSON as `\\u002d\\u002d`,\nsince a literal `--` terminates the HTML comment early. A reply has this\nshape:\n\n```json\n{\n  \"id\": \"r1\",\n  \"body\": \"Agent response\",\n  \"author\": \"agent\",\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\"\n}\n```\n\nReview markers inside inline code or fenced code are literal text, not\ncomments.\n\n## Address a comment\n\n1. Read the complete file. Locate the requested compact id, such as `{#c7}`;\n   if the user gives only anchored text, locate the exact CriticMarkup anchor\n   instead. Confirm the anchored text and comment body match the user's\n   request. If the id or exact anchor is absent or ambiguous, stop and report\n   the ambiguity.\n2. Parse the JSON metadata immediately following that logical comment. If it\n   is absent, start from an empty object. If it is malformed, stop rather\n   than overwrite it.\n3. Round-trip the metadata: mutate only the reply list and `resolved`, then\n   re-serialize the complete object — every other key and every existing\n   reply survives unchanged. Replies are append-only: add a reply with the\n   next unused `rN` id, `author: \"agent\"`, the response body, and the current\n   UTC time as an ISO-8601 `createdAt`.\n4. Set `resolved: true` only when the user's request has actually been\n   addressed. For an explicit reopen request, set `resolved: false`.\n   Acknowledgements, tests, questions, and partial work leave it `false`.\n5. Write the metadata block immediately after the comment's `{#cN}` marker\n   (see Fragmented anchors). Keep the anchored text byte-for-byte unchanged,\n   along with the comment body, CriticMarkup delimiters, suggested edits, and\n   all unrelated Markdown.\n\n## Fragmented anchors\n\nOne logical comment id may appear in multiple CriticMarkup fragments. The\nfinal fragment is authoritative: keep every marker, keep a single metadata\nblock, and place it after the final fragment — moving it there if it\ncurrently follows an earlier fragment. Report the fragmentation if it may\naffect the user's formatting.\n\n## Validation\n\nAfter editing:\n\n1. Re-read the file and confirm the requested id and exact anchored text are\n   still present.\n2. Parse the metadata after the final fragment and verify it is valid JSON,\n   the new reply is the final reply, the old replies and other keys\n   round-tripped, and `resolved` has the intended value. Confirm the note\n   renders the comment rather than showing the raw block as text. Check that\n   every `{==`, `==}`, `{>>`, `\u003C\u003C}`, and `{#` you touched belongs to a\n   complete `{==…==}{>>…\u003C\u003C}{#cN}` span on one line; a stray delimiter means\n   the span will not parse and shows as raw text in the note.\n3. Check the surrounding Markdown for accidental changes: inspect\n   `git diff -- \u003Cfile>` for a tracked file, or compare the before and after\n   text for an ignored\u002Fgenerated file.\n4. Report the reply you left and whether you resolved the comment.\n","# Review Markdown Comments\n\nWork directly on the Markdown file named by the user.\n\n## Comment format\n\nHubble stores review state in the Markdown body using this portable subset:\n\n```md\n{==anchored text==}{>>comment body\u003C\u003C}{#c1}\n{++suggested insertion++}\n{--suggested deletion--}\n{~~original text~>replacement text~~}\n```\n\nThread state may follow a comment anchor as an HTML comment holding raw JSON.\nIt is not URI-encoded; Hubble parses it with `JSON.parse` directly, so an\nencoded payload fails to parse and renders as literal text in the note:\n\n```md\n\u003C!-- hubble-review:{\"v\":1,\"replies\":[],\"resolved\":false}-->\n```\n\nHubble uses `v`, `replies`, and `resolved`; other top-level keys are allowed.\nAlways write `\"v\": 1`. Escape any `--` inside the JSON as `\\u002d\\u002d`,\nsince a literal `--` terminates the HTML comment early. A reply has this\nshape:\n\n```json\n{\n  \"id\": \"r1\",\n  \"body\": \"Agent response\",\n  \"author\": \"agent\",\n  \"createdAt\": \"2026-01-01T00:00:00.000Z\"\n}\n```\n\nReview markers inside inline code or fenced code are literal text, not\ncomments.\n\n## Address a comment\n\n1. Read the complete file. Locate the requested compact id, such as `{#c7}`;\n   if the user gives only anchored text, locate the exact CriticMarkup anchor\n   instead. Confirm the anchored text and comment body match the user's\n   request. If the id or exact anchor is absent or ambiguous, stop and report\n   the ambiguity.\n2. Parse the JSON metadata immediately following that logical comment. If it\n   is absent, start from an empty object. If it is malformed, stop rather\n   than overwrite it.\n3. Round-trip the metadata: mutate only the reply list and `resolved`, then\n   re-serialize the complete object — every other key and every existing\n   reply survives unchanged. Replies are append-only: add a reply with the\n   next unused `rN` id, `author: \"agent\"`, the response body, and the current\n   UTC time as an ISO-8601 `createdAt`.\n4. Set `resolved: true` only when the user's request has actually been\n   addressed. For an explicit reopen request, set `resolved: false`.\n   Acknowledgements, tests, questions, and partial work leave it `false`.\n5. Write the metadata block immediately after the comment's `{#cN}` marker\n   (see Fragmented anchors). Keep the anchored text byte-for-byte unchanged,\n   along with the comment body, CriticMarkup delimiters, suggested edits, and\n   all unrelated Markdown.\n\n## Fragmented anchors\n\nOne logical comment id may appear in multiple CriticMarkup fragments. The\nfinal fragment is authoritative: keep every marker, keep a single metadata\nblock, and place it after the final fragment — moving it there if it\ncurrently follows an earlier fragment. Report the fragmentation if it may\naffect the user's formatting.\n\n## Validation\n\nAfter editing:\n\n1. Re-read the file and confirm the requested id and exact anchored text are\n   still present.\n2. Parse the metadata after the final fragment and verify it is valid JSON,\n   the new reply is the final reply, the old replies and other keys\n   round-tripped, and `resolved` has the intended value. Confirm the note\n   renders the comment rather than showing the raw block as text. Check that\n   every `{==`, `==}`, `{>>`, `\u003C\u003C}`, and `{#` you touched belongs to a\n   complete `{==…==}{>>…\u003C\u003C}{#cN}` span on one line; a stray delimiter means\n   the span will not parse and shows as raw text in the note.\n3. Check the surrounding Markdown for accidental changes: inspect\n   `git diff -- \u003Cfile>` for a tracked file, or compare the before and after\n   text for an ignored\u002Fgenerated file.\n4. Report the reply you left and whether you resolved the comment.\n",{"name":5,"description":7},"main","cf633b3221b9572f22604168ac77c1ffa921debe",".agents\u002Fskills\u002Freview-markdown-comments",99,"https:\u002F\u002Fgithub.com\u002Fbholmesdev\u002Fhubble.md","https:\u002F\u002Fhubble.md","https:\u002F\u002Fgithub.com\u002Fbholmesdev","https:\u002F\u002Fbholmes.dev","Web developer, teacher, whiteboardist. Building the next terminal @warpdotdev ","2026-11-06 02:02:39",{"source":8,"skillName":5,"commands":48,"prompt":58,"zipAvailable":59},[49,52,55],{"tool":50,"command":51},"npx","npx skills add bholmesdev\u002Fhubble.md --skill review-markdown-comments",{"tool":53,"command":54},"bunx","bunx skills add bholmesdev\u002Fhubble.md --skill review-markdown-comments",{"tool":56,"command":57},"pnpm","pnpm dlx skills add bholmesdev\u002Fhubble.md --skill review-markdown-comments","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fbholmesdev\u002Fhubble.md\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Freview-markdown-comments\u002FSKILL.md",true,[],[62,79,99,119,144,154],{"skillNo":63,"name":64,"nameZh":6,"description":65,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":66,"categories":67,"keywords":68,"publishedAt":32},"01M6PQAH29FCQB6921Y94CA8F4","merge-risk","Use when assessing the risk of merging a PR","https:\u002F\u002Fgithub.com\u002Fbholmesdev\u002Fhubble.md\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fmerge-risk\u002FSKILL.md",[],[69,70,71,72,73,74,75,76,28,37,77,78],"merge risk","risk","merge","github","pr","https","engineering","matt pocock","true","blob",{"skillNo":80,"name":81,"nameZh":6,"description":82,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":83,"categories":84,"keywords":89,"publishedAt":32},"01M6PQA0ADFHMANPW4KRAV7EA6","embed-html-app","Embed a Hubble HTML App inline inside a Markdown File using an iframe block. Use when an app should be viewed in the context of a document.","https:\u002F\u002Fgithub.com\u002Fbholmesdev\u002Fhubble.md\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fembed-html-app\u002FSKILL.md",[85,86],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":87,"categoryName":88,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000009","前端开发",[90,91,92,93,94,95,28,96,25,97,98],"embed html app","embed","app","html","file","document","context","block","inline",{"skillNo":100,"name":101,"nameZh":6,"description":102,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":103,"categories":104,"keywords":105,"publishedAt":32},"01M6PQ9WQM5HF4QQ1J750346NY","edit-diagram","Create or edit a Hubble diagram: a .tldr file Hubble opens in its built-in tldraw canvas. With this skill installed, any diagram, canvas, whiteboard, or .tldr file is a Hubble diagram: use this skill instead of tldraw-offline, unless the user names the tldraw offline app or the file is a .tldraw archive.","https:\u002F\u002Fgithub.com\u002Fbholmesdev\u002Fhubble.md\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fedit-diagram\u002FSKILL.md",[],[106,107,108,109,110,111,112,92,28,113,114,115,94,116,117,118],"edit diagram","edit","diagram","user","whiteboard","with","tldraw","canvas","create","offline","tldraw offline","archive","tldr",{"skillNo":120,"name":121,"nameZh":6,"description":122,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":123,"categories":124,"keywords":129,"publishedAt":32},"01M6PQ9JKMF9ZDQWNVSA38VCTT","create-html-app","Create or update a Hubble HTML App: a folder-local .html file Hubble runs as a self-contained interactive UI, with Alpine, Tailwind, Hubble theme tokens, and the injected hubble runtime API.","https:\u002F\u002Fgithub.com\u002Fbholmesdev\u002Fhubble.md\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fcreate-html-app\u002FSKILL.md",[125,126],{"categoryNo":87,"categoryName":88,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":127,"categoryName":128,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000010","后端与接口",[130,92,93,114,131,132,94,133,134,135,136,137,138,139,140,141,31,142,111,143],"create html app","theme tokens","update","ui","api","Tailwind","interactive","self","local","tokens","runtime","alpine","theme","folder",{"skillNo":145,"name":146,"nameZh":6,"description":147,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":148,"categories":149,"keywords":150,"publishedAt":32},"01M6CPAR6ECFN9P9H1S4XWDCB1","convex","Routes general Convex requests to the right project skill. Use when the user asks which Convex skill to use or gives an underspecified Convex app task.","https:\u002F\u002Fgithub.com\u002Fbholmesdev\u002Fhubble.md\u002Fblob\u002Fmain\u002Fpackages\u002Fsync-backend\u002F.agents\u002Fskills\u002Fconvex\u002FSKILL.md",[],[146,151,152,28,109,153],"general","task","project skill",{"skillNo":155,"name":156,"nameZh":6,"description":157,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":158,"categories":159,"keywords":160,"publishedAt":32},"01M6CPAN2D6X1VYW8CDT2NAY5N","convex-setup-auth","Sets up Convex auth, identity mapping, and access control. Use for login, auth providers, users tables, protected functions, or roles in a Convex app.","https:\u002F\u002Fgithub.com\u002Fbholmesdev\u002Fhubble.md\u002Fblob\u002Fmain\u002Fpackages\u002Fsync-backend\u002F.agents\u002Fskills\u002Fconvex-setup-auth\u002FSKILL.md",[],[161,162,163,146,164,165,166,28,167,168,169,170],"convex setup auth","setup auth","setup","auth","Providers","access","identity","convex auth","functions","up"]