[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71SHJ43SX6DN3DYSZXFNHBZ":3,"skill-same:01M71SHJ43SX6DN3DYSZXFNHBZ":54},{"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":25,"linkOnly":26,"markdownContent":27,"markdownBody":28,"frontMatter":29,"refName":30,"commitSha":31,"skillDirectory":32,"forksCount":33,"repositoryHtmlUrl":34,"repositoryHomepageUrl":35,"ownerHtmlUrl":36,"ownerBlogUrl":37,"ownerDescription":38,"updatedAt":39,"install":40,"resources":53},"01M71SHJ43SX6DN3DYSZXFNHBZ","ship",null,"Commit, push, ensure a PR exists, capture screenshots, and attach them to the PR.","JustinDFuller\u002Fagent-session-manager","JustinDFuller","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F11914897?v=4","01M71SDTPZETGW0T4KYGMJVEF6","Justin Fuller","01M71SDTQK98BNVXNZ9TMD843D",1,"MIT","https:\u002F\u002Fgithub.com\u002FJustinDFuller\u002Fagent-session-manager\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fship\u002FSKILL.md",[],[5,19,20,21,22,23,24],"attach","push","pr","capture","commit","screenshots","2026-11-10 13:02:02",false,"---\nname: ship\ndescription: \"Commit, push, ensure a PR exists, capture screenshots, and attach them to the PR.\"\n---\n\n# Ship\n\nThis skill is a thin wrapper over `scripts\u002Fship.sh`. Do not perform the steps the script performs — invoke the script and let it drive.\n\n## Step 1: Gather state\n\nRun these in parallel:\n\n```bash\ngit status\ngit diff HEAD\ngit log --oneline -10\ngit branch --show-current\ngh pr view --json url,state 2>\u002Fdev\u002Fnull || true\n```\n\n## Step 2: Draft commit message (if needed)\n\nIf the working tree has staged or unstaged changes, draft a conventional-commit message in present tense that focuses on \"why\" over \"what\", following the repository's existing commit style.\n\nDo not add an AI `Co-Authored-By` trailer unless the current tool provides an exact configured trailer. Never copy another tool's trailer or invent an email address. If no exact trailer is configured, omit the AI trailer.\n\nWrite it to `.ship-commit-msg` (gitignored).\n\n## Step 3: Draft PR title and body (if needed)\n\nIf no PR exists for the current branch, draft a PR title and body using this template:\n\n```\n> [!NOTE]\n> This PR title, description, and code were generated with [active agent tool].\n\n## Summary\n\nOne or two sentence overview.\n\n## Changes\n\n* change one, one sentence\n* change two, also one sentence\n* no more than ten bullet points\n\n## Example\n\nScreenshots go here instead of a comment\n```\n\nWrite the body to `.ship-pr-body.md` (gitignored).\n\nUse the current tool's display name for `[active agent tool]`: `OpenAI Codex`, `Claude Code`, or `Cursor`. If the tool is different, use its actual display name. Never attribute one tool's work to another tool.\n\n## Step 4: Invoke the script\n\nAlways run `bash scripts\u002Fship.sh`, adding flags only for state that needs action:\n\n- Include `--commit-msg-file .ship-commit-msg` only if there were changes to commit.\n- Include `--pr-title \"...\"` and `--pr-body-file .ship-pr-body.md` only if no PR existed.\n\nThe script auto-detects a clean tree and an existing PR — `--screenshots-only` is no longer required and is kept only as a back-compat fast-path to skip commit\u002Fpush\u002Fensure-PR.\n\nExample (commit + new PR):\n```bash\nbash scripts\u002Fship.sh \\\n  --commit-msg-file .ship-commit-msg \\\n  --pr-title \"feat: brief summary\" \\\n  --pr-body-file .ship-pr-body.md\n```\n\nExample (already committed and PR exists — no flags needed):\n```bash\nbash scripts\u002Fship.sh\n```\n\n## Step 5: Handle failure\n\nIf the script exits non-zero, read the `INVARIANT VIOLATED:` line it printed. The script prints a compact filtered view of the Xcode output on failure; full logs are at `.build\u002Fship-*.log`:\n\n- Pre-flight build failure → `.build\u002Fship-preflight-build.log`\n- Screenshots build failure → `.build\u002Fship-screenshots.log`\n\nFix the root cause, then re-invoke `scripts\u002Fship.sh`.\n\n**Do not** silently retry, bypass the invariant, or improvise an alternative path.\n\n## Step 6: Report\n\nPrint the PR URL the script printed on its final line.\n\n## Rules\n\n- Never force-push\n- Never commit files that likely contain secrets (.env, credentials, keys)\n- Never skip the script and perform steps by hand\n- Never introduce a new fake or injected screenshot to satisfy `ship`; the `## Example` images must reflect real app behavior (see issue #221)\n","# Ship\n\nThis skill is a thin wrapper over `scripts\u002Fship.sh`. Do not perform the steps the script performs — invoke the script and let it drive.\n\n## Step 1: Gather state\n\nRun these in parallel:\n\n```bash\ngit status\ngit diff HEAD\ngit log --oneline -10\ngit branch --show-current\ngh pr view --json url,state 2>\u002Fdev\u002Fnull || true\n```\n\n## Step 2: Draft commit message (if needed)\n\nIf the working tree has staged or unstaged changes, draft a conventional-commit message in present tense that focuses on \"why\" over \"what\", following the repository's existing commit style.\n\nDo not add an AI `Co-Authored-By` trailer unless the current tool provides an exact configured trailer. Never copy another tool's trailer or invent an email address. If no exact trailer is configured, omit the AI trailer.\n\nWrite it to `.ship-commit-msg` (gitignored).\n\n## Step 3: Draft PR title and body (if needed)\n\nIf no PR exists for the current branch, draft a PR title and body using this template:\n\n```\n> [!NOTE]\n> This PR title, description, and code were generated with [active agent tool].\n\n## Summary\n\nOne or two sentence overview.\n\n## Changes\n\n* change one, one sentence\n* change two, also one sentence\n* no more than ten bullet points\n\n## Example\n\nScreenshots go here instead of a comment\n```\n\nWrite the body to `.ship-pr-body.md` (gitignored).\n\nUse the current tool's display name for `[active agent tool]`: `OpenAI Codex`, `Claude Code`, or `Cursor`. If the tool is different, use its actual display name. Never attribute one tool's work to another tool.\n\n## Step 4: Invoke the script\n\nAlways run `bash scripts\u002Fship.sh`, adding flags only for state that needs action:\n\n- Include `--commit-msg-file .ship-commit-msg` only if there were changes to commit.\n- Include `--pr-title \"...\"` and `--pr-body-file .ship-pr-body.md` only if no PR existed.\n\nThe script auto-detects a clean tree and an existing PR — `--screenshots-only` is no longer required and is kept only as a back-compat fast-path to skip commit\u002Fpush\u002Fensure-PR.\n\nExample (commit + new PR):\n```bash\nbash scripts\u002Fship.sh \\\n  --commit-msg-file .ship-commit-msg \\\n  --pr-title \"feat: brief summary\" \\\n  --pr-body-file .ship-pr-body.md\n```\n\nExample (already committed and PR exists — no flags needed):\n```bash\nbash scripts\u002Fship.sh\n```\n\n## Step 5: Handle failure\n\nIf the script exits non-zero, read the `INVARIANT VIOLATED:` line it printed. The script prints a compact filtered view of the Xcode output on failure; full logs are at `.build\u002Fship-*.log`:\n\n- Pre-flight build failure → `.build\u002Fship-preflight-build.log`\n- Screenshots build failure → `.build\u002Fship-screenshots.log`\n\nFix the root cause, then re-invoke `scripts\u002Fship.sh`.\n\n**Do not** silently retry, bypass the invariant, or improvise an alternative path.\n\n## Step 6: Report\n\nPrint the PR URL the script printed on its final line.\n\n## Rules\n\n- Never force-push\n- Never commit files that likely contain secrets (.env, credentials, keys)\n- Never skip the script and perform steps by hand\n- Never introduce a new fake or injected screenshot to satisfy `ship`; the `## Example` images must reflect real app behavior (see issue #221)\n",{"name":5,"description":7},"main","695fc2689b09e8c623d6a9a4fbf694bb21cf7965",".agents\u002Fskills\u002Fship",0,"https:\u002F\u002Fgithub.com\u002FJustinDFuller\u002Fagent-session-manager","https:\u002F\u002Fagent-session-manager.justindfuller.com\u002F","https:\u002F\u002Fgithub.com\u002FJustinDFuller","https:\u002F\u002Fwww.justindfuller.com","Some of my repos live at: https:\u002F\u002Fgithub.com\u002FJustinDFuller-org","2026-10-25 20:28:18",{"source":8,"skillName":5,"commands":41,"prompt":51,"zipAvailable":52},[42,45,48],{"tool":43,"command":44},"npx","npx skills add JustinDFuller\u002Fagent-session-manager --skill ship",{"tool":46,"command":47},"bunx","bunx skills add JustinDFuller\u002Fagent-session-manager --skill ship",{"tool":49,"command":50},"pnpm","pnpm dlx skills add JustinDFuller\u002Fagent-session-manager --skill ship","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FJustinDFuller\u002Fagent-session-manager\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fship\u002FSKILL.md",true,[],[55,84,114,136,151,169],{"skillNo":56,"name":57,"nameZh":6,"description":58,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":59,"categories":60,"keywords":66,"publishedAt":25},"01M71SJ1DXFKKP8YGZ39N48MK5","workflow","Development workflow for this repo: plan → test → implement → human review → repeat. Load when starting any feature, bug fix, or refactor.","https:\u002F\u002Fgithub.com\u002FJustinDFuller\u002Fagent-session-manager\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fworkflow\u002FSKILL.md",[61],{"categoryNo":62,"categoryName":63,"taxonomyType":64,"taxonomyTypeDesc":65},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[57,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83],"feature","development","for","repo","fix","load","when","development workflow","human review","implement","review","test","plan","human","bug","bug fix","refactor",{"skillNo":85,"name":86,"nameZh":6,"description":87,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":88,"categories":89,"keywords":95,"publishedAt":25},"01M71SHYJYXTAJ84CJM481VWAQ","usernotifications-documentation","UserNotifications official doc index — load when building notification features, requesting authorization, scheduling local notifications, handling notification actions, or any UserNotifications framework behavior.","https:\u002F\u002Fgithub.com\u002FJustinDFuller\u002Fagent-session-manager\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fusernotifications-documentation\u002FSKILL.md",[90],{"categoryNo":91,"categoryName":92,"taxonomyType":93,"taxonomyTypeDesc":94},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[96,97,98,99,100,101,72,102,73,103,104,105,106,107,108,109,110,111,112,113],"usernotifications documentation","documentation","official","domain","actions","local","false","scheduling","notifications","apple","notification","webfetch","behavior","features","doc","index","authorization","developer",{"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":25},"01M71SHW2GGPD63909M5XVXM4B","swiftui-macos-form-alignment","SwiftUI macOS Form layout: alignment override bug, background control, and VStack-based alternative. Load when debugging alignment issues inside Form rows, or when row controls (toggles, text fields, pickers) are visually misaligned with their labels on macOS.","https:\u002F\u002Fgithub.com\u002FJustinDFuller\u002Fagent-session-manager\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fswiftui-macos-form-alignment\u002FSKILL.md",[],[121,122,123,124,125,126,127,128,129,81,130,131,132,133,72,134,73,135],"alignment","form","swiftui","swiftui macos form alignment","macos","text","with","control","layout","issues","labels","fields","controls","debugging","background",{"skillNo":137,"name":138,"nameZh":6,"description":139,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":140,"categories":141,"keywords":142,"publishedAt":25},"01M71SHT28R4D9JZANY5PR3966","swiftui-documentation","SwiftUI official doc index — load when building SwiftUI views, modifiers, state management, data flow, AppKit bridging, or any SwiftUI behavior.","https:\u002F\u002Fgithub.com\u002FJustinDFuller\u002Fagent-session-manager\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fswiftui-documentation\u002FSKILL.md",[],[123,97,143,144,98,99,145,72,102,73,146,105,147,107,148,108,149,110,150,111],"swiftui documentation","data flow","appkit","state","state management","bridging","flow","data",{"skillNo":152,"name":153,"nameZh":6,"description":154,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":155,"categories":156,"keywords":157,"publishedAt":25},"01M71SHQF5BMDV4YBZNT21VDZD","swifterm-documentation","SwiftTerm official doc index — load when building SwiftTerm features, terminal emulation, terminal views, process lifecycle, delegate callbacks, GPU rendering, pseudo-terminals, or any SwiftTerm-specific behavior. Any project that uses or interacts with SwiftTerm should load this skill.","https:\u002F\u002Fgithub.com\u002FJustinDFuller\u002Fagent-session-manager\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fswifterm-documentation\u002FSKILL.md",[],[97,158,159,98,160,161,102,73,162,163,109,164,165,110,99,166,72,127,167,168],"swifterm documentation","emulation","project","delegate","io","terminal","rendering","Callbacks","lifecycle","gpu","github",{"skillNo":170,"name":171,"nameZh":6,"description":172,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":173,"categories":174,"keywords":178,"publishedAt":25},"01M71SHM94G4SHFM7083Q85MVK","sqlite-documentation","SQLite official doc index — load when working with SQLite, the C\u002FC++ API, import SQLite3, prepared statements, binding, query execution, result codes, or any SQLite-specific behavior. Any project that uses or interacts with SQLite should load this skill.","https:\u002F\u002Fgithub.com\u002FJustinDFuller\u002Fagent-session-manager\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fsqlite-documentation\u002FSKILL.md",[175],{"categoryNo":176,"categoryName":177,"taxonomyType":64,"taxonomyTypeDesc":65},"01JBSEEDCAT000000000000010","后端与接口",[179,97,180,181,98,182,99,160,183,184,72,102,73,185,186,127,107,187,108,188],"sqlite","sqlite documentation","import","c++","execution","codes","query","api","result","binding"]