[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CD9P9FCHC46T2N8AKDECKB":3,"skill-same:01M6CD9P9FCHC46T2N8AKDECKB":152},{"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":16,"sourceHtmlUrl":17,"categories":18,"keywords":24,"publishedAt":47,"linkOnly":48,"markdownContent":49,"markdownBody":50,"frontMatter":51,"refName":54,"commitSha":55,"skillDirectory":56,"forksCount":57,"repositoryHtmlUrl":58,"repositoryHomepageUrl":59,"ownerHtmlUrl":60,"ownerBlogUrl":6,"ownerDescription":61,"updatedAt":62,"install":63,"resources":76},"01M6CD9P9FCHC46T2N8AKDECKB","skill-creator",null,"Create new skills, modify and improve existing skills, and measure skill performance. Use when users want to create a skill from scratch, edit, or optimize an existing skill, run evals to test a skill, benchmark skill performance with variance analysis, or optimize a skill's description for better triggering accuracy.","mrwogu\u002Fpromptscript","mrwogu","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F2917861?v=4","01M6CD988FG8NZ7SGMM9JG76Y7","Wojciech Guziak","01M6CD98C8MZJE9HW7P95CYB3S",344,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fmrwogu\u002Fpromptscript\u002Fblob\u002Fmain\u002F.factory\u002Fskills\u002Fskill-creator\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fmrwogu\u002Fpromptscript\u002Fblob\u002Fmain\u002F.factory\u002Fskills\u002Fskill-creator\u002FSKILL.md",[19],{"categoryNo":20,"categoryName":21,"taxonomyType":22,"taxonomyTypeDesc":23},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],"creator","skill creator","use","new","when","scratch","Existing","accuracy","for","users","optimize","evals","edit","improve","analysis","benchmark","run","create","variance analysis","test","run evals","performance","2026-11-10 10:12:30",false,"---\n\ndescription: Commit a skill authored in this workspace to the liferay-portal repository, collapsing the workspace's duplicated agent trees into the repository's symlinked layout. Use when the user asks to commit, contribute, or upstream a skill, and as the handoff from `author-skill`.\nname: commit-skill\n\n---\n\n# Commit Skill\n\nTake a skill that exists only in this workspace and commit it to `liferay-portal\u002Fworkspaces\u002Fliferay-sample-workspace`, the source the published skill pack is built from.\n\nThe finish line is a **local commit on a fresh branch**. There is no push and no pull request — the user sends it for review themselves.\n\n## When to Invoke\n\n- \"Commit my skill\"\n- \"Contribute this skill to liferay-portal\"\n- \"Upstream the skill I just wrote\"\n- As the handoff at the end of `author-skill`, which publishes into the workspace and stops at the workspace boundary\n\n## Prerequisites\n\n### The Workspace Root\n\nThe workspace root is the directory holding `gradle.properties` and `settings.gradle`. Every workspace relative path below resolves against it.\n\n### The Portal Repository\n\nAsk the user for the absolute path to their `liferay-portal` clone.\n\nThe repository's own rules and skills then have to be brought into scope for the agent. Step 5 needs both: `.claude\u002Frules\u002Fcommit.md` for the message format, and the `format-source` skill, which that rule mandates before any commit. Reading a file out of the repository works without this, but a skill that is not in scope cannot be invoked at all — so `format-source` is the part that fails silently.\n\nAdding a directory to a session is the user's to do, and each agent exposes it differently — a slash command, a launch flag, a setting. In Claude Code, it is `\u002Fadd-dir \u003Cportal-repo>`. Ask the user to add the repository root in whatever way their agent provides, wait for their reply, then confirm that `format-source` is invokable before continuing.\n\nStore the resolved path so later runs can offer it instead of asking again.\n\n### The Canonical Remote\n\nResolve the remote by **URL**, never by the name `upstream`. A clone may carry several forks under names that say nothing about which is canonical:\n\n```bash\ngit remote -v | awk '$3==\"(fetch)\" && $2 ~ \u002F[:\u002F]liferay\\\u002Fliferay-portal(\\.git)?$\u002F {print $1}'\n```\n\nThe `[:\u002F]` prefix matches both `git@github.com:` and `https:\u002F\u002Fgithub.com\u002F` forms, and `(\\.git)?$` anchors past an inconsistent suffix. Anchoring is what keeps forks under `liferay-devtools`, `liferay-one`, and personal accounts from matching.\n\nA clone with no such remote is not expected. When it happens, say so and ask the user whether to add it — do not guess a fork.\n\n## Workflow\n\n### Step 1: Determine What to Commit\n\nCheck three sources in order, and stop at the first that answers.\n\n**Session context.** The common case is `author-skill` having just run, so the names are already known. Confirm them with the user rather than deriving them again.\n\n**Repository detection.** When the workspace is itself a Git repository, everything below counts as a candidate:\n\n| Candidate | How It Presents |\n| --- | --- |\n| Untracked skill files | `git status --porcelain` lines beginning `??` |\n| Uncommitted edits to an existing skill | lines beginning ` M` or `M ` |\n| Already committed skill changes | `git log` against the tracking branch |\n\n**Baseline comparison.** When the workspace is not a repository, diff it against the portal repo's own tree, which has the same layout:\n\n```bash\ndiff --recursive --brief \\\n\t\"${WORKSPACE}\u002F.agents\u002Fskills\" \\\n\t\"${PORTAL_REPO}\u002Fworkspaces\u002Fliferay-sample-workspace\u002F.agents\u002Fskills\"\n```\n\nPresent what was found and confirm before doing anything else.\n\n### Step 2: Assemble the Full Changeset\n\nA skill is more than its `SKILL.md`. `author-skill` also edits the Skill Router and may add a rules card, and every one of those edits belongs in the commit:\n\n| Part | Workspace Path |\n| --- | --- |\n| The skill | `.agents\u002Fskills\u002F\u003Cname>\u002FSKILL.md` |\n| Its mirrors | `\u003Cvendor>\u002Fskills\u002F\u003Cname>\u002FSKILL.md`, one per vendor directory |\n| Skill Router row | `.agents\u002Fliferay-rules.md` and each vendor twin |\n| Preflight Rule row | same files, when the skill must load before authoring an artifact type |\n| New rules card | `.agents\u002Frules\u002F\u003Ccard>.md` and its mirrors |\n\nDiscover the vendor directories rather than hardcoding them:\n\n```bash\nfor dir in .*\u002F; do\n\t[ -d \"${dir}skills\" ] && [ \"${dir}\" != \".agents\u002F\" ] && echo \"${dir}\"\ndone\n```\n\nA skill committed without its Skill Router row loads only when named exactly. The file is present, the skill is effectively invisible, and nothing fails.\n\nBefore collapsing, confirm the mirrors still agree with `.agents\u002F`. Nothing regenerates them and nothing fails when they drift, so a stale mirror means Step 4 silently picks a winner:\n\n```bash\nfor dir in \"${WORKSPACE}\"\u002F.*\u002F; do\n\t[ -d \"${dir}skills\u002F\u003Cname>\" ] || continue\n\t[ \"$(basename \"${dir}\")\" = \".agents\" ] && continue\n\n\tdiff \"${WORKSPACE}\u002F.agents\u002Fskills\u002F\u003Cname>\u002FSKILL.md\" \"${dir}skills\u002F\u003Cname>\u002FSKILL.md\"\ndone\n```\n\n### Step 3: Prepare the Branch\n\nWork from a freshly pulled `master` so the baseline and the commit share a revision:\n\n1. Stash any working changes in the portal repo. **Leave the stash in place** and report it — do not pop it. Capture the ref, since an existing stash stack makes `stash@{0}` ambiguous within minutes:\n\n\t```bash\n\tgit -C \"${PORTAL_REPO}\" stash push --include-untracked --message \"commit-skill: \u003Cname>\"\n\tgit -C \"${PORTAL_REPO}\" stash list | head -1\n\t```\n\n1. Check out `master`, then pull from the remote resolved in Prerequisites.\n\n1. Ask the user for the branch name, then create it.\n\nWhen the workspace turns out to live **inside** the portal repo, stop. The stash would capture the very skill being contributed, and the branch switch would move it out from under the user. Say so and let them decide.\n\n### Step 4: Collapse Into the Repo Layout\n\nThe two trees are not the same shape. A workspace populated by `updateWorkspace` holds independent copies, because the published artifact contains no symlinks; the repo holds one real file and symlinks beside it:\n\n| File | Workspace | Repo |\n| --- | --- | --- |\n| `.agents\u002Fskills\u002F\u003Cname>\u002FSKILL.md` | real file | real file |\n| `\u003Cvendor>\u002Fskills\u002F\u003Cname>\u002FSKILL.md` | identical copy | symlink to `..\u002F..\u002F..\u002F.agents\u002Fskills\u002F\u003Cname>\u002FSKILL.md` |\n| `.agents\u002Fliferay-rules.md` | real file | real file |\n| `\u003Cvendor>\u002F\u003Centry-point>` | identical copy | symlink to `..\u002F.agents\u002Fliferay-rules.md` |\n\nSo committing is a **collapse**, never a straight copy: write one real file under `.agents\u002F`, then create the symlinks. The relative depth differs between the two cases above — count it from the link's own directory rather than reusing a path.\n\nEach vendor names its entry point differently, so read the existing one in the repo rather than assuming a name. Match whatever vendor directories the repository already carries; adding a tree it does not have is a separate decision, not part of contributing a skill.\n\nSkill Router and Preflight Rule edits collapse the same way. Two separately edited files in the workspace become one edit to `.agents\u002Fliferay-rules.md`, since each vendor entry point already points at it.\n\nSkills and rules cards in this repository end **without** a trailing newline. Check the last byte, where `0a` means one is still there:\n\n```bash\ntail -c 1 \"${PORTAL_REPO}\u002Fworkspaces\u002Fliferay-sample-workspace\u002F.agents\u002Fskills\u002F\u003Cname>\u002FSKILL.md\" | xxd -p\n```\n\n### Step 5: Resolve the Ticket and Commit\n\nFollow `.claude\u002Frules\u002Fcommit.md` in the portal repo — it owns the message format and mandates `format-source` first.\n\nIts ticket resolution reads the current branch and recent commits, which on a freshly created branch describe whatever the user was last working on rather than this contribution. Resolve the ticket by situation instead:\n\n| Situation | Where the Ticket Comes From |\n| --- | --- |\n| Branch was just created | Ask. When the branch name the user gave carries a ticket, offer it as the suggestion rather than asking blind |\n| Branch already existed | Read that branch's own commits first, then fall back to asking |\n\nNever take the ticket from `master`'s log or from the branch the repo happened to be on.\n\nCommit, then stop. Report the branch, the commit, and the stash.\n\n## Patterns and Gotchas\n\n- **A straight copy produces the wrong tree.** The workspace's vendor copies are real files; the repo expects symlinks. Copying them over commits duplicated content that the publish step already produces on its own.\n- **The Skill Router row is the difference between shipped and invisible.** It is the single most commonly dropped part of the changeset, and its absence never produces an error.\n- **`commit.md`'s ticket rules read stale state here.** Both of its inference sources describe the user's previous work, not this contribution, and both answer confidently.\n- **Mirror drift is silent.** When `.agents\u002F` and a vendor copy disagree, the collapse resolves it without telling anyone. Diff before, not after.\n- **The stash is the one step that looks destructive.** Report its ref every time. The user decides when to restore it.\n- **Do not push or open a pull request.** The commit is the deliverable; review is the user's to start.\n\n## Success Signal\n\nThe branch exists carrying one new commit, the repository tree holds a real file with symlinks beside it, and the Skill Router names the skill:\n\n```bash\ngit -C \"${PORTAL_REPO}\" log --oneline --name-status -1\n\nls -la \"${PORTAL_REPO}\"\u002Fworkspaces\u002Fliferay-sample-workspace\u002F.*\u002Fskills\u002F\u003Cname>\u002FSKILL.md\n\ngrep --count \"\u003Cname>\" \"${PORTAL_REPO}\u002Fworkspaces\u002Fliferay-sample-workspace\u002F.agents\u002Fliferay-rules.md\"\n```\n\nThe symlink listing should show `lrwxrwxrwx` and the `.agents\u002F` target. Whether the contribution is accepted is decided in review, not here.\n\n## See Also\n\n- `.claude\u002Frules\u002Fcommit.md` in the portal repo — the commit message format this skill follows.\n- `skills\u002Fauthor-skill\u002FSKILL.md` — writes the skill and hands off to this one.","# Commit Skill\n\nTake a skill that exists only in this workspace and commit it to `liferay-portal\u002Fworkspaces\u002Fliferay-sample-workspace`, the source the published skill pack is built from.\n\nThe finish line is a **local commit on a fresh branch**. There is no push and no pull request — the user sends it for review themselves.\n\n## When to Invoke\n\n- \"Commit my skill\"\n- \"Contribute this skill to liferay-portal\"\n- \"Upstream the skill I just wrote\"\n- As the handoff at the end of `author-skill`, which publishes into the workspace and stops at the workspace boundary\n\n## Prerequisites\n\n### The Workspace Root\n\nThe workspace root is the directory holding `gradle.properties` and `settings.gradle`. Every workspace relative path below resolves against it.\n\n### The Portal Repository\n\nAsk the user for the absolute path to their `liferay-portal` clone.\n\nThe repository's own rules and skills then have to be brought into scope for the agent. Step 5 needs both: `.claude\u002Frules\u002Fcommit.md` for the message format, and the `format-source` skill, which that rule mandates before any commit. Reading a file out of the repository works without this, but a skill that is not in scope cannot be invoked at all — so `format-source` is the part that fails silently.\n\nAdding a directory to a session is the user's to do, and each agent exposes it differently — a slash command, a launch flag, a setting. In Claude Code, it is `\u002Fadd-dir \u003Cportal-repo>`. Ask the user to add the repository root in whatever way their agent provides, wait for their reply, then confirm that `format-source` is invokable before continuing.\n\nStore the resolved path so later runs can offer it instead of asking again.\n\n### The Canonical Remote\n\nResolve the remote by **URL**, never by the name `upstream`. A clone may carry several forks under names that say nothing about which is canonical:\n\n```bash\ngit remote -v | awk '$3==\"(fetch)\" && $2 ~ \u002F[:\u002F]liferay\\\u002Fliferay-portal(\\.git)?$\u002F {print $1}'\n```\n\nThe `[:\u002F]` prefix matches both `git@github.com:` and `https:\u002F\u002Fgithub.com\u002F` forms, and `(\\.git)?$` anchors past an inconsistent suffix. Anchoring is what keeps forks under `liferay-devtools`, `liferay-one`, and personal accounts from matching.\n\nA clone with no such remote is not expected. When it happens, say so and ask the user whether to add it — do not guess a fork.\n\n## Workflow\n\n### Step 1: Determine What to Commit\n\nCheck three sources in order, and stop at the first that answers.\n\n**Session context.** The common case is `author-skill` having just run, so the names are already known. Confirm them with the user rather than deriving them again.\n\n**Repository detection.** When the workspace is itself a Git repository, everything below counts as a candidate:\n\n| Candidate | How It Presents |\n| --- | --- |\n| Untracked skill files | `git status --porcelain` lines beginning `??` |\n| Uncommitted edits to an existing skill | lines beginning ` M` or `M ` |\n| Already committed skill changes | `git log` against the tracking branch |\n\n**Baseline comparison.** When the workspace is not a repository, diff it against the portal repo's own tree, which has the same layout:\n\n```bash\ndiff --recursive --brief \\\n\t\"${WORKSPACE}\u002F.agents\u002Fskills\" \\\n\t\"${PORTAL_REPO}\u002Fworkspaces\u002Fliferay-sample-workspace\u002F.agents\u002Fskills\"\n```\n\nPresent what was found and confirm before doing anything else.\n\n### Step 2: Assemble the Full Changeset\n\nA skill is more than its `SKILL.md`. `author-skill` also edits the Skill Router and may add a rules card, and every one of those edits belongs in the commit:\n\n| Part | Workspace Path |\n| --- | --- |\n| The skill | `.agents\u002Fskills\u002F\u003Cname>\u002FSKILL.md` |\n| Its mirrors | `\u003Cvendor>\u002Fskills\u002F\u003Cname>\u002FSKILL.md`, one per vendor directory |\n| Skill Router row | `.agents\u002Fliferay-rules.md` and each vendor twin |\n| Preflight Rule row | same files, when the skill must load before authoring an artifact type |\n| New rules card | `.agents\u002Frules\u002F\u003Ccard>.md` and its mirrors |\n\nDiscover the vendor directories rather than hardcoding them:\n\n```bash\nfor dir in .*\u002F; do\n\t[ -d \"${dir}skills\" ] && [ \"${dir}\" != \".agents\u002F\" ] && echo \"${dir}\"\ndone\n```\n\nA skill committed without its Skill Router row loads only when named exactly. The file is present, the skill is effectively invisible, and nothing fails.\n\nBefore collapsing, confirm the mirrors still agree with `.agents\u002F`. Nothing regenerates them and nothing fails when they drift, so a stale mirror means Step 4 silently picks a winner:\n\n```bash\nfor dir in \"${WORKSPACE}\"\u002F.*\u002F; do\n\t[ -d \"${dir}skills\u002F\u003Cname>\" ] || continue\n\t[ \"$(basename \"${dir}\")\" = \".agents\" ] && continue\n\n\tdiff \"${WORKSPACE}\u002F.agents\u002Fskills\u002F\u003Cname>\u002FSKILL.md\" \"${dir}skills\u002F\u003Cname>\u002FSKILL.md\"\ndone\n```\n\n### Step 3: Prepare the Branch\n\nWork from a freshly pulled `master` so the baseline and the commit share a revision:\n\n1. Stash any working changes in the portal repo. **Leave the stash in place** and report it — do not pop it. Capture the ref, since an existing stash stack makes `stash@{0}` ambiguous within minutes:\n\n\t```bash\n\tgit -C \"${PORTAL_REPO}\" stash push --include-untracked --message \"commit-skill: \u003Cname>\"\n\tgit -C \"${PORTAL_REPO}\" stash list | head -1\n\t```\n\n1. Check out `master`, then pull from the remote resolved in Prerequisites.\n\n1. Ask the user for the branch name, then create it.\n\nWhen the workspace turns out to live **inside** the portal repo, stop. The stash would capture the very skill being contributed, and the branch switch would move it out from under the user. Say so and let them decide.\n\n### Step 4: Collapse Into the Repo Layout\n\nThe two trees are not the same shape. A workspace populated by `updateWorkspace` holds independent copies, because the published artifact contains no symlinks; the repo holds one real file and symlinks beside it:\n\n| File | Workspace | Repo |\n| --- | --- | --- |\n| `.agents\u002Fskills\u002F\u003Cname>\u002FSKILL.md` | real file | real file |\n| `\u003Cvendor>\u002Fskills\u002F\u003Cname>\u002FSKILL.md` | identical copy | symlink to `..\u002F..\u002F..\u002F.agents\u002Fskills\u002F\u003Cname>\u002FSKILL.md` |\n| `.agents\u002Fliferay-rules.md` | real file | real file |\n| `\u003Cvendor>\u002F\u003Centry-point>` | identical copy | symlink to `..\u002F.agents\u002Fliferay-rules.md` |\n\nSo committing is a **collapse**, never a straight copy: write one real file under `.agents\u002F`, then create the symlinks. The relative depth differs between the two cases above — count it from the link's own directory rather than reusing a path.\n\nEach vendor names its entry point differently, so read the existing one in the repo rather than assuming a name. Match whatever vendor directories the repository already carries; adding a tree it does not have is a separate decision, not part of contributing a skill.\n\nSkill Router and Preflight Rule edits collapse the same way. Two separately edited files in the workspace become one edit to `.agents\u002Fliferay-rules.md`, since each vendor entry point already points at it.\n\nSkills and rules cards in this repository end **without** a trailing newline. Check the last byte, where `0a` means one is still there:\n\n```bash\ntail -c 1 \"${PORTAL_REPO}\u002Fworkspaces\u002Fliferay-sample-workspace\u002F.agents\u002Fskills\u002F\u003Cname>\u002FSKILL.md\" | xxd -p\n```\n\n### Step 5: Resolve the Ticket and Commit\n\nFollow `.claude\u002Frules\u002Fcommit.md` in the portal repo — it owns the message format and mandates `format-source` first.\n\nIts ticket resolution reads the current branch and recent commits, which on a freshly created branch describe whatever the user was last working on rather than this contribution. Resolve the ticket by situation instead:\n\n| Situation | Where the Ticket Comes From |\n| --- | --- |\n| Branch was just created | Ask. When the branch name the user gave carries a ticket, offer it as the suggestion rather than asking blind |\n| Branch already existed | Read that branch's own commits first, then fall back to asking |\n\nNever take the ticket from `master`'s log or from the branch the repo happened to be on.\n\nCommit, then stop. Report the branch, the commit, and the stash.\n\n## Patterns and Gotchas\n\n- **A straight copy produces the wrong tree.** The workspace's vendor copies are real files; the repo expects symlinks. Copying them over commits duplicated content that the publish step already produces on its own.\n- **The Skill Router row is the difference between shipped and invisible.** It is the single most commonly dropped part of the changeset, and its absence never produces an error.\n- **`commit.md`'s ticket rules read stale state here.** Both of its inference sources describe the user's previous work, not this contribution, and both answer confidently.\n- **Mirror drift is silent.** When `.agents\u002F` and a vendor copy disagree, the collapse resolves it without telling anyone. Diff before, not after.\n- **The stash is the one step that looks destructive.** Report its ref every time. The user decides when to restore it.\n- **Do not push or open a pull request.** The commit is the deliverable; review is the user's to start.\n\n## Success Signal\n\nThe branch exists carrying one new commit, the repository tree holds a real file with symlinks beside it, and the Skill Router names the skill:\n\n```bash\ngit -C \"${PORTAL_REPO}\" log --oneline --name-status -1\n\nls -la \"${PORTAL_REPO}\"\u002Fworkspaces\u002Fliferay-sample-workspace\u002F.*\u002Fskills\u002F\u003Cname>\u002FSKILL.md\n\ngrep --count \"\u003Cname>\" \"${PORTAL_REPO}\u002Fworkspaces\u002Fliferay-sample-workspace\u002F.agents\u002Fliferay-rules.md\"\n```\n\nThe symlink listing should show `lrwxrwxrwx` and the `.agents\u002F` target. Whether the contribution is accepted is decided in review, not here.\n\n## See Also\n\n- `.claude\u002Frules\u002Fcommit.md` in the portal repo — the commit message format this skill follows.\n- `skills\u002Fauthor-skill\u002FSKILL.md` — writes the skill and hands off to this one.",{"name":52,"description":53},"commit-skill","Commit a skill authored in this workspace to the liferay-portal repository, collapsing the workspace's duplicated agent trees into the repository's symlinked layout. Use when the user asks to commit, contribute, or upstream a skill, and as the handoff from `author-skill`.","master","02992542dbd5a9d65782cdc1d0c3151ddc3debb3",".factory\u002Fskills\u002Fskill-creator",7,"https:\u002F\u002Fgithub.com\u002Fmrwogu\u002Fpromptscript","https:\u002F\u002Fgetpromptscript.dev\u002F","https:\u002F\u002Fgithub.com\u002Fmrwogu","AI Developer Experience","2026-11-09 13:55:29",{"source":8,"skillName":52,"commands":64,"prompt":74,"zipAvailable":75},[65,68,71],{"tool":66,"command":67},"npx","npx skills add mrwogu\u002Fpromptscript --skill commit-skill",{"tool":69,"command":70},"bunx","bunx skills add mrwogu\u002Fpromptscript --skill commit-skill",{"tool":72,"command":73},"pnpm","pnpm dlx skills add mrwogu\u002Fpromptscript --skill commit-skill","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fmrwogu\u002Fpromptscript\u002Fblob\u002Fmain\u002F.factory\u002Fskills\u002Fskill-creator\u002FSKILL.md",true,[77,83,87,91,97,103,107,112,116,120,124,128,132,136,140,144,148],{"path":78,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":81,"sourceHtmlUrl":82},"agents\u002Fanalyzer.md","REFERENCE","参考文档",10376,"https:\u002F\u002Fgithub.com\u002Fmrwogu\u002Fpromptscript\u002Fblob\u002Fmain\u002F.factory\u002Fskills\u002Fskill-creator\u002Fagents\u002Fanalyzer.md",{"path":84,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":85,"sourceHtmlUrl":86},"agents\u002Fcomparator.md",7287,"https:\u002F\u002Fgithub.com\u002Fmrwogu\u002Fpromptscript\u002Fblob\u002Fmain\u002F.factory\u002Fskills\u002Fskill-creator\u002Fagents\u002Fcomparator.md",{"path":88,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":89,"sourceHtmlUrl":90},"agents\u002Fgrader.md",9049,"https:\u002F\u002Fgithub.com\u002Fmrwogu\u002Fpromptscript\u002Fblob\u002Fmain\u002F.factory\u002Fskills\u002Fskill-creator\u002Fagents\u002Fgrader.md",{"path":92,"resourceType":93,"resourceTypeDesc":94,"sizeBytes":95,"sourceHtmlUrl":96},"assets\u002Feval_review.html","ASSET","资产文件",7058,"https:\u002F\u002Fgithub.com\u002Fmrwogu\u002Fpromptscript\u002Fblob\u002Fmain\u002F.factory\u002Fskills\u002Fskill-creator\u002Fassets\u002Feval_review.html",{"path":98,"resourceType":99,"resourceTypeDesc":100,"sizeBytes":101,"sourceHtmlUrl":102},"eval-viewer\u002Fgenerate_review.py","SCRIPT","脚本",16365,"https:\u002F\u002Fgithub.com\u002Fmrwogu\u002Fpromptscript\u002Fblob\u002Fmain\u002F.factory\u002Fskills\u002Fskill-creator\u002Feval-viewer\u002Fgenerate_review.py",{"path":104,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":105,"sourceHtmlUrl":106},"eval-viewer\u002Fviewer.html",44998,"https:\u002F\u002Fgithub.com\u002Fmrwogu\u002Fpromptscript\u002Fblob\u002Fmain\u002F.factory\u002Fskills\u002Fskill-creator\u002Feval-viewer\u002Fviewer.html",{"path":108,"resourceType":109,"resourceTypeDesc":110,"sizeBytes":111,"sourceHtmlUrl":16},"LICENSE.txt","LICENSE","许可证",11345,{"path":113,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":114,"sourceHtmlUrl":115},"references\u002Fschemas.md",12129,"https:\u002F\u002Fgithub.com\u002Fmrwogu\u002Fpromptscript\u002Fblob\u002Fmain\u002F.factory\u002Fskills\u002Fskill-creator\u002Freferences\u002Fschemas.md",{"path":117,"resourceType":99,"resourceTypeDesc":100,"sizeBytes":118,"sourceHtmlUrl":119},"scripts\u002F__init__.py",0,"https:\u002F\u002Fgithub.com\u002Fmrwogu\u002Fpromptscript\u002Fblob\u002Fmain\u002F.factory\u002Fskills\u002Fskill-creator\u002Fscripts\u002F__init__.py",{"path":121,"resourceType":99,"resourceTypeDesc":100,"sizeBytes":122,"sourceHtmlUrl":123},"scripts\u002Faggregate_benchmark.py",14386,"https:\u002F\u002Fgithub.com\u002Fmrwogu\u002Fpromptscript\u002Fblob\u002Fmain\u002F.factory\u002Fskills\u002Fskill-creator\u002Fscripts\u002Faggregate_benchmark.py",{"path":125,"resourceType":99,"resourceTypeDesc":100,"sizeBytes":126,"sourceHtmlUrl":127},"scripts\u002Fgenerate_report.py",12847,"https:\u002F\u002Fgithub.com\u002Fmrwogu\u002Fpromptscript\u002Fblob\u002Fmain\u002F.factory\u002Fskills\u002Fskill-creator\u002Fscripts\u002Fgenerate_report.py",{"path":129,"resourceType":99,"resourceTypeDesc":100,"sizeBytes":130,"sourceHtmlUrl":131},"scripts\u002Fimprove_description.py",11116,"https:\u002F\u002Fgithub.com\u002Fmrwogu\u002Fpromptscript\u002Fblob\u002Fmain\u002F.factory\u002Fskills\u002Fskill-creator\u002Fscripts\u002Fimprove_description.py",{"path":133,"resourceType":99,"resourceTypeDesc":100,"sizeBytes":134,"sourceHtmlUrl":135},"scripts\u002Fpackage_skill.py",4234,"https:\u002F\u002Fgithub.com\u002Fmrwogu\u002Fpromptscript\u002Fblob\u002Fmain\u002F.factory\u002Fskills\u002Fskill-creator\u002Fscripts\u002Fpackage_skill.py",{"path":137,"resourceType":99,"resourceTypeDesc":100,"sizeBytes":138,"sourceHtmlUrl":139},"scripts\u002Fquick_validate.py",3972,"https:\u002F\u002Fgithub.com\u002Fmrwogu\u002Fpromptscript\u002Fblob\u002Fmain\u002F.factory\u002Fskills\u002Fskill-creator\u002Fscripts\u002Fquick_validate.py",{"path":141,"resourceType":99,"resourceTypeDesc":100,"sizeBytes":142,"sourceHtmlUrl":143},"scripts\u002Frun_eval.py",11464,"https:\u002F\u002Fgithub.com\u002Fmrwogu\u002Fpromptscript\u002Fblob\u002Fmain\u002F.factory\u002Fskills\u002Fskill-creator\u002Fscripts\u002Frun_eval.py",{"path":145,"resourceType":99,"resourceTypeDesc":100,"sizeBytes":146,"sourceHtmlUrl":147},"scripts\u002Frun_loop.py",13605,"https:\u002F\u002Fgithub.com\u002Fmrwogu\u002Fpromptscript\u002Fblob\u002Fmain\u002F.factory\u002Fskills\u002Fskill-creator\u002Fscripts\u002Frun_loop.py",{"path":149,"resourceType":99,"resourceTypeDesc":100,"sizeBytes":150,"sourceHtmlUrl":151},"scripts\u002Futils.py",1661,"https:\u002F\u002Fgithub.com\u002Fmrwogu\u002Fpromptscript\u002Fblob\u002Fmain\u002F.factory\u002Fskills\u002Fskill-creator\u002Fscripts\u002Futils.py",[153,185,194,209,217,237],{"skillNo":154,"name":155,"nameZh":6,"description":156,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":157,"licenseFileUrl":6,"sourceHtmlUrl":158,"categories":159,"keywords":166,"publishedAt":47},"01M6CDARG1R0SC1QS30MG6NH4Z","promptscript","PromptScript language expert for reading, writing, modifying, and troubleshooting .prs files. Use when working with PromptScript syntax, creating or editing .prs files, adding blocks like @identity, @standards, @restrictions, @shortcuts, @skills, or @agents, configuring promptscript.yaml, resolving compilation errors, understanding inheritance (@inherit), composition (@use, @extend, @override), contextual @header metadata, or migrating AI instructions to PromptScript. Also use when asked about the 50 built-in coding agent compilation targets, including GitHub Copilot, Claude Code, Cursor, Antigravity, Factory AI, and AGENTS.md-based platforms, or about the bundle and prompt-text targets for application prompts.","MIT","https:\u002F\u002Fgithub.com\u002Fmrwogu\u002Fpromptscript\u002Fblob\u002Fmain\u002Fskills\u002Fpromptscript\u002FSKILL.md",[160,161],{"categoryNo":20,"categoryName":21,"taxonomyType":22,"taxonomyTypeDesc":23},{"categoryNo":162,"categoryName":163,"taxonomyType":164,"taxonomyTypeDesc":165},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[155,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,33],"identity","Composition","files","writing","text","read","write","coding","standards","gemini","expert","kiro-cli","inheritance","windsurf","kilo","reading","factory-ai","goose",{"skillNo":186,"name":177,"nameZh":6,"description":187,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":157,"licenseFileUrl":6,"sourceHtmlUrl":188,"categories":189,"keywords":190,"publishedAt":47},"01M6CDANHZWNCXCKZQSGVZW8S8","Base expert skill","https:\u002F\u002Fgithub.com\u002Fmrwogu\u002Fpromptscript\u002Fblob\u002Fmain\u002Fpackages\u002Fresolver\u002Fsrc\u002F__tests__\u002F__fixtures__\u002Fskill-references\u002Fskills\u002Fexpert\u002FSKILL.md",[],[177,191,192,193],"spring","references","base",{"skillNo":195,"name":196,"nameZh":6,"description":197,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":157,"licenseFileUrl":6,"sourceHtmlUrl":198,"categories":199,"keywords":201,"publishedAt":47},"01M6CDAK4J08AXZ8ZKX9VWP9NE","tdd-workflow","Test-driven development workflow","https:\u002F\u002Fgithub.com\u002Fmrwogu\u002Fpromptscript\u002Fblob\u002Fmain\u002Fpackages\u002Fresolver\u002Fsrc\u002F__tests__\u002F__fixtures__\u002Fregistry\u002Fnative-skills\u002Ftdd-workflow\u002FSKILL.md",[200],{"categoryNo":20,"categoryName":21,"taxonomyType":22,"taxonomyTypeDesc":23},[202,203,204,205,206,207,208,44],"tdd workflow","tdd","workflow","test-driven","driven","development","development workflow",{"skillNo":210,"name":211,"nameZh":6,"description":212,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":157,"licenseFileUrl":6,"sourceHtmlUrl":213,"categories":214,"keywords":215,"publishedAt":47},"01M6CDAGQMZ3SZP69Q1XREEX48","alpha","Alpha skill","https:\u002F\u002Fgithub.com\u002Fmrwogu\u002Fpromptscript\u002Fblob\u002Fmain\u002Fpackages\u002Fresolver\u002Fsrc\u002F__tests__\u002F__fixtures__\u002Fmd-imports\u002Fskill-dir\u002Falpha\u002FSKILL.md",[],[211,216],"alpha skill",{"skillNo":218,"name":219,"nameZh":6,"description":220,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":221,"categories":222,"keywords":226,"publishedAt":47},"01M6CDAEB3EZ86CQSYM28J34ZS","pdf-processing","Extract PDF text, fill forms, merge files. Use when handling PDFs.","https:\u002F\u002Fgithub.com\u002Fmrwogu\u002Fpromptscript\u002Fblob\u002Fmain\u002Fpackages\u002Fformatters\u002Fsrc\u002F__tests__\u002Ffixtures\u002Fplatform-contracts\u002Fgemini\u002Fskill.md",[223],{"categoryNo":224,"categoryName":225,"taxonomyType":22,"taxonomyTypeDesc":23},"01JBSEEDCAT000000000000002","文档处理",[227,228,229,230,231,169,27,171,232,233,29,234,235,236],"processing","pdf processing","PDF","fill","example","merge","extract","extract pdf","forms","org",{"skillNo":238,"name":239,"nameZh":6,"description":240,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":157,"licenseFileUrl":6,"sourceHtmlUrl":241,"categories":242,"keywords":246,"publishedAt":47},"01M6CDABP7FSQ9BY079P1QWJR2","react-component-patterns","Conventions for writing React components in this codebase.","https:\u002F\u002Fgithub.com\u002Fmrwogu\u002Fpromptscript\u002Fblob\u002Fmain\u002Fpackages\u002Fformatters\u002Fsrc\u002F__tests__\u002Ffixtures\u002Fplatform-contracts\u002Fcursor\u002Fskill.md",[243],{"categoryNo":244,"categoryName":245,"taxonomyType":22,"taxonomyTypeDesc":23},"01JBSEEDCAT000000000000009","前端开发",[247,248,249,250,251,33,252,253,254,255,256,257,170,258],"react","patterns","component","react component","react component patterns","codebase","conventions","ui","packages","react components","components","tsx"]