{"id":"77bc54fa-7d22-4274-b1fd-c311f5e2ecd1","entityType":"agent","slug":"clawhub-stoner-byte-github-release-analyzer","name":"GitHub Release Analyzer","canonicalUrl":"https://www.xpersona.co/agent/clawhub-stoner-byte-github-release-analyzer","canonicalPath":"/agent/clawhub-stoner-byte-github-release-analyzer","generatedAt":"2026-10-12T15:52:05.378Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T21:19:53.696Z","emptyReason":null},"description":"Analyze GitHub repository releases and summarize release notes. Use when the user asks to analyze, summarize, review, or track the latest release or recent releases for a GitHub repo, including phrases like \"分析最新 release\", \"latest release\", \"release 更新了什么\", \"汇总仓库 release\", or requests to build a cron that tracks GitHub releases. Supports manual one-off analysis and cron-driven incremental tracking.","descriptionLabel":"Source description","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 991 downloads reported by the source. Last updated 10/11/2026.","installCommand":"clawhub skill install s173r5y8tqy4nhexgndp34581984p37h:github-release-analyzer","sourceUrl":"https://clawhub.ai/stoner-byte/github-release-analyzer","homepage":"https://clawhub.ai/stoner-byte/skills/github-release-analyzer","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/stoner-byte/github-release-analyzer","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/stoner-byte/skills/github-release-analyzer","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":60,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"GitHub Release Analyzer technical dossier on Xpersona with agent coverage, OPENCLEW support, and live trust metadata."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-11T21:19:53.696Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T21:19:53.696Z","emptyReason":null},"stars":null,"forks":null,"downloads":991,"likes":null,"task":null,"library":null,"packageName":null,"latestVersion":"0.0.5","tractionLabel":"991 downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T21:19:53.596Z","emptyReason":null},"lastUpdatedAt":"2026-10-11T21:19:53.696Z","lastCrawledAt":"2026-10-11T21:19:53.596Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-12T21:19:53.596Z","lastVerifiedAt":null,"highlights":[{"version":"0.0.5","createdAt":"2026-08-19T04:38:13.411Z","changelog":"Add Hermes compatibility, profile-scoped state storage, and platform compatibility tests.","fileCount":16,"zipByteSize":17326},{"version":"0.0.4","createdAt":"2026-05-09T15:11:17.392Z","changelog":"Fix state storage to survive skill upgrades: state now resolves with priority (1) env var, (2) legacy workspace path if existing state found, (3) persistent ~/.openclaw/state/ path.","fileCount":14,"zipByteSize":14766},{"version":"0.0.3","createdAt":"2026-04-30T02:55:30.539Z","changelog":"Remove homepage metadata","fileCount":13,"zipByteSize":13274},{"version":"0.0.2","createdAt":"2026-04-30T02:51:09.598Z","changelog":"Add homepage metadata linking to the GitHub source repository","fileCount":13,"zipByteSize":13294},{"version":"0.0.1","createdAt":"2026-04-30T02:40:58.248Z","changelog":"Initial public release","fileCount":13,"zipByteSize":13273}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s173r5y8tqy4nhexgndp34581984p37h:github-release-analyzer","setupComplexity":"low","setupSteps":["Install using `clawhub skill install s173r5y8tqy4nhexgndp34581984p37h:github-release-analyzer` in an isolated environment before connecting it to live workloads.","No published capability contract is available yet, so validate auth and request/response behavior manually.","Review the upstream CLAWHUB listing at https://clawhub.ai/stoner-byte/github-release-analyzer before using production credentials."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-stoner-byte-github-release-analyzer/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-stoner-byte-github-release-analyzer/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-stoner-byte-github-release-analyzer/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-stoner-byte-github-release-analyzer/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-stoner-byte-github-release-analyzer/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-stoner-byte-github-release-analyzer/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-12T15:52:05.376Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-stoner-byte-github-release-analyzer/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-stoner-byte-github-release-analyzer/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-stoner-byte-github-release-analyzer/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-stoner-byte-github-release-analyzer/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T21:19:53.696Z","emptyReason":null},"readme":"Skill: GitHub Release Analyzer\n\nOwner: stoner-byte\n\nSummary: Analyze GitHub repository releases and summarize release notes. Use when the user asks to analyze, summarize, review, or track the latest release or recent releases for a GitHub repo, including phrases like \"分析最新 release\", \"latest release\", \"release 更新了什么\", \"汇总仓库 release\", or requests to build a cron that tracks GitHub releases. Supports manual one-off analysis and cron-driven incremental tracking.\n\nTags: latest:0.0.5\n\nVersion history:\n\nv0.0.5 | 2026-08-19T04:38:13.411Z | user\n\nAdd Hermes compatibility, profile-scoped state storage, and platform compatibility tests.\n\nv0.0.4 | 2026-05-09T15:11:17.392Z | user\n\nFix state storage to survive skill upgrades: state now resolves with priority (1) env var, (2) legacy workspace path if existing state found, (3) persistent ~/.openclaw/state/ path.\n\nv0.0.3 | 2026-04-30T02:55:30.539Z | user\n\nRemove homepage metadata\n\nv0.0.2 | 2026-04-30T02:51:09.598Z | user\n\nAdd homepage metadata linking to the GitHub source repository\n\nv0.0.1 | 2026-04-30T02:40:58.248Z | user\n\nInitial public release\n\nArchive index:\n\nArchive v0.0.5: 16 files, 17326 bytes\n\nFiles: LICENSE (1061b), README.md (989b), references/execution-modes.md (1470b), references/state-format.md (1165b), references/summary-contract.md (2291b), references/templates.md (1202b), scripts/models.py (1258b), scripts/release_fetcher.py (3371b), scripts/repo_utils.py (1166b), scripts/run.py (10402b), scripts/state_store.py (2460b), scripts/summary_formatter.py (3245b), skill-card.md (2260b), SKILL.md (3816b), tests/test_platform_compat.py (4239b), _meta.json (142b)\n\nFile v0.0.5:SKILL.md\n\n---\nname: github-release-analyzer\nversion: 0.0.5\ndescription: Analyze GitHub repository releases and summarize release notes. Use when the user asks to analyze, summarize, review, or track the latest release or recent releases for a GitHub repo, including phrases like \"分析最新 release\", \"latest release\", \"release 更新了什么\", \"汇总仓库 release\", or requests to build a cron that tracks GitHub releases. Supports manual one-off analysis and cron-driven incremental tracking.\nmetadata:\n  openclaw:\n    emoji: \"📦\"\n    requires:\n      bins: [python3]\n  hermes:\n    tags: [github, releases, monitoring, cron]\n---\n\n# GitHub Release Analyzer\n\nUse this skill as a fixed pipeline:\n\n```text\nprepare -> summarize -> render -> deliver -> commit\n```\n\nOnly `summarize` is free-form. `prepare`, `render`, and `commit` are deterministic script steps.\n\n## Inputs\n\n- Repo input: `https://github.com/<owner>/<repo>` or `<owner>/<repo>`\n- Default `stateKey`: `{owner}__{repo}`\n- Default template: `default`\n- Default behavior:\n  - manual: latest formal release only, no state read/write\n  - cron: formal releases only, first run selects latest only, later runs select unprocessed only\n\n## Workflow\n\nBefore running any `scripts/...` command, set the command working directory to\nthe directory containing the loaded `SKILL.md` (the Skill root). Do not run\nthese commands from the OpenClaw workspace root. This does **not** require a\nshell `SKILL_DIR` environment variable: OpenClaw uses the loaded Skill's\ninstalled directory, and Hermes uses the `skill_dir` returned by `skill_view`.\n\n1. Read `references/execution-modes.md` and choose `manual` or `cron`.\n2. From the Skill root, run:\n\n```bash\npython3 scripts/run.py prepare --repo <repo> --mode <manual|cron>\n```\n\nUseful flags:\n\n- `--state-key <key>`\n- `--limit <n>`\n- `--include-prerelease`\n- `--output-template default`\n- `--initial-cron-behavior latest-only`\n\n3. If `status=has_updates`, read `references/summary-contract.md` and produce one summary string per selected release.\n   Keep the summary language aligned with the primary language of the invocation instruction.\n\n4. Render the final message:\n\n```bash\npython3 scripts/run.py render --repo <repo> --mode <manual|cron> < payload.json\n```\n\nWhen building the `render` payload, preserve the release fields required by `render`, especially `tag_name`, `published_at`, and `html_url`.\n\n5. In cron mode, after successful delivery, commit state:\n\n```bash\npython3 scripts/run.py commit \\\n  --repo <repo> \\\n  --mode cron \\\n  --processed-tags <comma-separated-tags> \\\n  --latest-release-id <id> \\\n  --latest-published-at <iso8601>\n```\n\n## Rules\n\n- Treat `prepare` output as the source of truth for selection, ordering, first-run behavior, repo normalization, and state path.\n- The output language must follow the primary language of the invocation instruction.\n- The final outgoing message must come from `render`.\n- In cron mode:\n  - if `status=no_update` or `status=no_release`, reply with `NO_REPLY`\n  - if `status=has_updates`, emit only the final rendered message\n- Update processed state only after successful delivery.\n\n## Hard prohibitions\n\n- Do not skip `prepare`.\n- Do not bypass `render`.\n- Do not reorder or silently drop releases selected by `prepare`.\n- Do not call `commit` in manual mode.\n- Do not call `commit` before delivery succeeds in cron mode.\n- Do not replace the summary contract with ad hoc prose outside the required `summaries[]` string-array shape.\n- In cron mode, when `status=no_update` or `status=no_release`, reply exactly `NO_REPLY`.\n- In cron mode, do not emit progress chatter, intermediate JSON, step labels, or workflow narration.\n\n## Files to read\n\n- `references/execution-modes.md`\n- `references/summary-contract.md`\n- `references/templates.md`\n- `references/state-format.md`\n\nFile v0.0.5:README.md\n\n# github-release-analyzer\n\nCurrent planned release version: **0.0.1**\n\nAnalyze GitHub releases and turn release notes into short, high-signal summaries.\n\n## What it does\n\n- Supports a single repo input: `owner/repo` or `https://github.com/owner/repo`\n- Manual mode: summarize the latest formal release\n- Cron mode: track unprocessed formal releases incrementally\n- Preserves a deterministic pipeline:\n  `prepare -> summarize -> render -> commit`\n\n## Main files\n\n- `SKILL.md` — skill routing + workflow rules\n- `scripts/run.py` — deterministic entrypoint for `prepare`, `render`, `commit`\n- `references/execution-modes.md` — manual vs cron behavior\n- `references/summary-contract.md` — required summary output shape\n\n## Notes\n\n- Requires `python3`\n- Default state is stored under `~/.openclaw/workspace/state/github-release-analyzer/`\n- Cron mode returns `NO_REPLY` when there is no new formal release to report\n\n## Initial publish target\n\n- License: MIT\n- Initial version: `0.0.1`\n\nFile v0.0.5:_meta.json\n\n{\n  \"ownerId\": \"kn7bapcyjfbh5hs3fty4kvxann84pre4\",\n  \"slug\": \"github-release-analyzer\",\n  \"version\": \"0.0.5\",\n  \"publishedAt\": 1787114293411\n}\n\nFile v0.0.5:references/execution-modes.md\n\n# Execution Modes\n\n## Manual\n\nRequired path:\n\n1. `prepare --mode manual`\n2. If `status=no_release`, reply that no formal release exists\n3. If `status=has_updates`, summarize exactly the selected `releases[]`\n4. Build `summaries[]`\n5. `render --mode manual`\n6. Reply with the rendered `message`\n\nDo not:\n\n- read or write state\n- call `commit`\n- analyze more than the selected latest formal release\n- add workflow narration or extra preambles\n\n## Cron\n\nRequired path:\n\n1. `prepare --mode cron`\n2. If `status=no_release` or `status=no_update`, reply exactly `NO_REPLY`\n3. If `status=has_updates`, summarize exactly the selected `releases[]`\n4. Keep `prepare` ordering\n5. Build `summaries[]`\n6. `render --mode cron`\n7. Deliver the rendered `message`\n8. After successful delivery, `commit`\n\nDo not:\n\n- skip `prepare`\n- bypass `render`\n- write processed state before delivery succeeds\n- when `status=no_update` or `status=no_release`, reply exactly `NO_REPLY`\n- emit progress narration, step labels, intermediate JSON, or any workflow text to the delivery target\n\n## Cron prompt shape\n\nKeep cron instructions short and mechanical. The useful constraints are:\n\n- use this skill in cron mode\n- run deterministic `prepare` first\n- summarize only formal releases selected by `prepare`\n- first run: latest only\n- later runs: unprocessed only, ordered old to new\n- no update: reply exactly `NO_REPLY`\n- only emit the final rendered message\n- after successful delivery, commit state\n\nFile v0.0.5:references/state-format.md\n\n# State Format\n\nDefault paths:\n\n```text\nHermes: $HERMES_HOME/state/github-release-analyzer/{stateKey}.json\nOpenClaw legacy (when populated): ~/.openclaw/workspace/state/github-release-analyzer/{stateKey}.json\nOpenClaw persistent: ~/.openclaw/state/github-release-analyzer/{stateKey}.json\n```\n\n`GITHUB_RELEASE_ANALYZER_STATE_ROOT` overrides the default root on either\nplatform. When `HERMES_HOME` is set, the Hermes path is used. Otherwise,\nOpenClaw preserves its existing legacy-then-persistent fallback behavior.\n\nSchema:\n\n```json\n{\n  \"repo\": \"openclaw/openclaw\",\n  \"processed_tags\": [],\n  \"latest_processed_release_id\": null,\n  \"latest_processed_published_at\": null,\n  \"last_checked_at\": null,\n  \"last_success_at\": null,\n  \"initialized_at\": null\n}\n```\n\nRules:\n\n- derive `stateKey` from normalized repo unless explicitly overridden\n- missing file or empty `initialized_at` means first run\n- first cron run summarizes the latest formal release only\n- `prepare` updates `last_checked_at`\n- `commit` updates processed tags and latest processed metadata only after successful delivery\n- failed fetch, summarize, render, or delivery must not mark releases as processed\n\nFile v0.0.5:references/summary-contract.md\n\n# Summary Contract\n\nFlow:\n\n```text\nprepare -> summarize -> render -> deliver -> commit\n```\n\nEach selected release produces exactly one summary string.\n\n## Requirements\n\n- Output in the primary language of the invocation instruction (zh → 中文, en → 英文)\n- Keep facts anchored to the release body\n- Keep the summary distilled and high-signal, but do not force it into a fixed length budget\n- Output JSON only. Each summary item must be a single non-empty string, not an object.\n- Distill the release into a readable, high-signal summary rather than mirroring the changelog.\n- Use markdown to make the result easy to scan. Prefer short sections, bullet lists, and compact grouping over long continuous prose.\n- Do not force a fixed internal structure, but the summary should still feel organized and easy to skim.\n- Prioritize the most important themes and expand when the release has multiple genuinely meaningful areas of change.\n- Summarize fixes and improvements clearly, not inflated counts or vague praise.\n- Focus on the most directly affected users or maintainers, and expand when that adds real decision value.\n- Summary text must be in the same language as the invocation instruction, regardless of the source release language\n- Do not translate the changelog line by line\n- Do not invent scope, quantities, or recommendations not clearly supported by the source\n- Avoid hype such as `大幅重构`, `显著提升`, `建议所有用户升级` unless the source clearly justifies it\n\n## Render payload\n\n`run.py render` reads stdin JSON in this shape:\n\n```json\n{\n  \"outputTemplate\": \"default\",\n  \"language\": \"zh\",\n  \"releases\": [{ \"tag_name\": \"v2026.4.26\", \"published_at\": \"2026-04-28T01:11:02Z\", \"html_url\": \"...\" }],\n  \"summaries\": [\n    \"...\"\n  ]\n}\n```\n\nValidation rules:\n\n- `releases.length == summaries.length`\n- when building the render payload, keep the release fields required by `render`, especially `tag_name`, `published_at`, and `html_url`\n- each `summaries[i]` must be a non-empty string\n- each summary should be organized for scanning, not written as one large undifferentiated block of prose\n- `language` should match the invocation instruction language, use `zh` or `en`\n- one release uses single-release template, multiple releases use multi-release template\n\nFile v0.0.5:references/templates.md\n\n# Output Templates\n\nCurrent template name:\n\n- `default`\n\nTemplate routing is deterministic in `scripts/summary_formatter.py`.\n\n## Language policy\n\n- Keep the rendered message in the same language as the invocation instruction.\n- Pass `language: zh` or `language: en` to `run.py render` stdin payload.\n\n## Single release\n\n### zh\n\n```markdown\n**{owner}/{repo} 最新 Release：{tag_name}**\n\n- 发布时间：{published_at}\n\n{summary_markdown}\n\n- 链接：{html_url}\n```\n\n### en\n\n```markdown\n**{owner}/{repo} Latest Release: {tag_name}**\n\n- Published at: {published_at}\n\n{summary_markdown}\n\n- Link: {html_url}\n```\n\n## Multi-release\n\n### zh\n\n```markdown\n**{owner}/{repo} 新版本汇总（共 {count} 个）**\n\n**1. {tag_name}**\n- 发布时间：{published_at}\n\n{summary_markdown}\n\n- 链接：{html_url}\n```\n\n### en\n\n```markdown\n**{owner}/{repo} Release Summary ({count} total)**\n\n**1. {tag_name}**\n- Published at: {published_at}\n\n{summary_markdown}\n\n- Link: {html_url}\n```\n\nRepeat the numbered block for each release.\n\n## Mode policy\n\n- manual: reply with the rendered message only, no state language, no workflow narration\n- cron: emit only the final rendered message, no filler, no step labels, no JSON\n\nFile v0.0.5:skill-card.md\n\n## Description:\n\nAnalyze GitHub repository releases and summarize release notes.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[stoner-byte](https://clawhub.ai/user/stoner-byte)\n\n### License/Terms of Use:\n\nMIT\n\n## Use Case:\n\nDevelopers and teams use this skill to summarize the latest or recent formal GitHub releases for a repository, either on demand or through cron-style incremental monitoring.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Cron state keys can escape the intended state directory and read or overwrite other JSON files the agent can access.\n\nMitigation: Avoid custom --state-key values until path validation is added, and review cron jobs or shared instructions that can set state keys.\n\nRisk: GitHub release bodies are external content that may contain untrusted instructions.\n\nMitigation: Treat release bodies only as source material for summaries, and do not let release text control agent behavior.\n\nRisk: Release monitoring depends on repository targets supplied by users or scheduled jobs.\n\nMitigation: Use trusted GitHub repository targets and review configured cron inputs before enabling recurring execution.\n\n## Reference(s):\n\n- [Execution Modes](references/execution-modes.md)\n- [Summary Contract](references/summary-contract.md)\n- [State Format](references/state-format.md)\n- [Output Templates](references/templates.md)\n- [ClawHub skill page](https://clawhub.ai/stoner-byte/skills/github-release-analyzer)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Shell commands, Configuration]\n\n**Output Format:** [Markdown messages with JSON render payloads and shell commands for prepare, render, and cron state commit steps.]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Cron mode emits NO_REPLY when no formal release is selected; requires python3 and a GitHub repository input.]\n\n## Skill Version(s):\n\n0.0.5 (source: SKILL.md frontmatter and server release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v0.0.5:LICENSE\n\nMIT License\n\nCopyright (c) 2026 BOSS\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\nArchive v0.0.4: 14 files, 14766 bytes\n\nFiles: README.md (989b), references/execution-modes.md (1470b), references/state-format.md (762b), references/summary-contract.md (2291b), references/templates.md (1202b), scripts/models.py (1258b), scripts/release_fetcher.py (3371b), scripts/repo_utils.py (1166b), scripts/run.py (10402b), scripts/state_store.py (2272b), scripts/summary_formatter.py (3245b), skill-card.md (2284b), SKILL.md (3444b), _meta.json (142b)\n\nFile v0.0.4:SKILL.md\n\n---\nname: github-release-analyzer\nversion: 0.0.4\ndescription: Analyze GitHub repository releases and summarize release notes. Use when the user asks to analyze, summarize, review, or track the latest release or recent releases for a GitHub repo, including phrases like \"分析最新 release\", \"latest release\", \"release 更新了什么\", \"汇总仓库 release\", or requests to build a cron that tracks GitHub releases. Supports manual one-off analysis and cron-driven incremental tracking.\nmetadata:\n  {\"openclaw\":{\"emoji\":\"📦\",\"requires\":{\"bins\":[\"python3\"]}}}\n---\n\n# GitHub Release Analyzer\n\nUse this skill as a fixed pipeline:\n\n```text\nprepare -> summarize -> render -> deliver -> commit\n```\n\nOnly `summarize` is free-form. `prepare`, `render`, and `commit` are deterministic script steps.\n\n## Inputs\n\n- Repo input: `https://github.com/<owner>/<repo>` or `<owner>/<repo>`\n- Default `stateKey`: `{owner}__{repo}`\n- Default template: `default`\n- Default behavior:\n  - manual: latest formal release only, no state read/write\n  - cron: formal releases only, first run selects latest only, later runs select unprocessed only\n\n## Workflow\n\n1. Read `references/execution-modes.md` and choose `manual` or `cron`.\n2. Run:\n\n```bash\npython3 skills/github-release-analyzer/scripts/run.py prepare --repo <repo> --mode <manual|cron>\n```\n\nUseful flags:\n\n- `--state-key <key>`\n- `--limit <n>`\n- `--include-prerelease`\n- `--output-template default`\n- `--initial-cron-behavior latest-only`\n\n3. If `status=has_updates`, read `references/summary-contract.md` and produce one summary string per selected release.\n   Keep the summary language aligned with the primary language of the invocation instruction.\n\n4. Render the final message:\n\n```bash\npython3 skills/github-release-analyzer/scripts/run.py render --repo <repo> --mode <manual|cron> < payload.json\n```\n\nWhen building the `render` payload, preserve the release fields required by `render`, especially `tag_name`, `published_at`, and `html_url`.\n\n5. In cron mode, after successful delivery, commit state:\n\n```bash\npython3 skills/github-release-analyzer/scripts/run.py commit \\\n  --repo <repo> \\\n  --mode cron \\\n  --processed-tags <comma-separated-tags> \\\n  --latest-release-id <id> \\\n  --latest-published-at <iso8601>\n```\n\n## Rules\n\n- Treat `prepare` output as the source of truth for selection, ordering, first-run behavior, repo normalization, and state path.\n- The output language must follow the primary language of the invocation instruction.\n- The final outgoing message must come from `render`.\n- In cron mode:\n  - if `status=no_update` or `status=no_release`, reply with `NO_REPLY`\n  - if `status=has_updates`, emit only the final rendered message\n- Update processed state only after successful delivery.\n\n## Hard prohibitions\n\n- Do not skip `prepare`.\n- Do not bypass `render`.\n- Do not reorder or silently drop releases selected by `prepare`.\n- Do not call `commit` in manual mode.\n- Do not call `commit` before delivery succeeds in cron mode.\n- Do not replace the summary contract with ad hoc prose outside the required `summaries[]` string-array shape.\n- In cron mode, when `status=no_update` or `status=no_release`, reply exactly `NO_REPLY`.\n- In cron mode, do not emit progress chatter, intermediate JSON, step labels, or workflow narration.\n\n## Files to read\n\n- `references/execution-modes.md`\n- `references/summary-contract.md`\n- `references/templates.md`\n- `references/state-format.md`\n\nFile v0.0.4:README.md\n\n# github-release-analyzer\n\nCurrent planned release version: **0.0.1**\n\nAnalyze GitHub releases and turn release notes into short, high-signal summaries.\n\n## What it does\n\n- Supports a single repo input: `owner/repo` or `https://github.com/owner/repo`\n- Manual mode: summarize the latest formal release\n- Cron mode: track unprocessed formal releases incrementally\n- Preserves a deterministic pipeline:\n  `prepare -> summarize -> render -> commit`\n\n## Main files\n\n- `SKILL.md` — skill routing + workflow rules\n- `scripts/run.py` — deterministic entrypoint for `prepare`, `render`, `commit`\n- `references/execution-modes.md` — manual vs cron behavior\n- `references/summary-contract.md` — required summary output shape\n\n## Notes\n\n- Requires `python3`\n- Default state is stored under `~/.openclaw/workspace/state/github-release-analyzer/`\n- Cron mode returns `NO_REPLY` when there is no new formal release to report\n\n## Initial publish target\n\n- License: MIT\n- Initial version: `0.0.1`\n\nFile v0.0.4:_meta.json\n\n{\n  \"ownerId\": \"kn7bapcyjfbh5hs3fty4kvxann84pre4\",\n  \"slug\": \"github-release-analyzer\",\n  \"version\": \"0.0.4\",\n  \"publishedAt\": 1778339477392\n}\n\nFile v0.0.4:references/execution-modes.md\n\n# Execution Modes\n\n## Manual\n\nRequired path:\n\n1. `prepare --mode manual`\n2. If `status=no_release`, reply that no formal release exists\n3. If `status=has_updates`, summarize exactly the selected `releases[]`\n4. Build `summaries[]`\n5. `render --mode manual`\n6. Reply with the rendered `message`\n\nDo not:\n\n- read or write state\n- call `commit`\n- analyze more than the selected latest formal release\n- add workflow narration or extra preambles\n\n## Cron\n\nRequired path:\n\n1. `prepare --mode cron`\n2. If `status=no_release` or `status=no_update`, reply exactly `NO_REPLY`\n3. If `status=has_updates`, summarize exactly the selected `releases[]`\n4. Keep `prepare` ordering\n5. Build `summaries[]`\n6. `render --mode cron`\n7. Deliver the rendered `message`\n8. After successful delivery, `commit`\n\nDo not:\n\n- skip `prepare`\n- bypass `render`\n- write processed state before delivery succeeds\n- when `status=no_update` or `status=no_release`, reply exactly `NO_REPLY`\n- emit progress narration, step labels, intermediate JSON, or any workflow text to the delivery target\n\n## Cron prompt shape\n\nKeep cron instructions short and mechanical. The useful constraints are:\n\n- use this skill in cron mode\n- run deterministic `prepare` first\n- summarize only formal releases selected by `prepare`\n- first run: latest only\n- later runs: unprocessed only, ordered old to new\n- no update: reply exactly `NO_REPLY`\n- only emit the final rendered message\n- after successful delivery, commit state\n\nFile v0.0.4:references/state-format.md\n\n# State Format\n\nDefault path:\n\n```text\n~/.openclaw/workspace/state/github-release-analyzer/{stateKey}.json\n```\n\nSchema:\n\n```json\n{\n  \"repo\": \"openclaw/openclaw\",\n  \"processed_tags\": [],\n  \"latest_processed_release_id\": null,\n  \"latest_processed_published_at\": null,\n  \"last_checked_at\": null,\n  \"last_success_at\": null,\n  \"initialized_at\": null\n}\n```\n\nRules:\n\n- derive `stateKey` from normalized repo unless explicitly overridden\n- missing file or empty `initialized_at` means first run\n- first cron run summarizes the latest formal release only\n- `prepare` updates `last_checked_at`\n- `commit` updates processed tags and latest processed metadata only after successful delivery\n- failed fetch, summarize, render, or delivery must not mark releases as processed\n\nFile v0.0.4:references/summary-contract.md\n\n# Summary Contract\n\nFlow:\n\n```text\nprepare -> summarize -> render -> deliver -> commit\n```\n\nEach selected release produces exactly one summary string.\n\n## Requirements\n\n- Output in the primary language of the invocation instruction (zh → 中文, en → 英文)\n- Keep facts anchored to the release body\n- Keep the summary distilled and high-signal, but do not force it into a fixed length budget\n- Output JSON only. Each summary item must be a single non-empty string, not an object.\n- Distill the release into a readable, high-signal summary rather than mirroring the changelog.\n- Use markdown to make the result easy to scan. Prefer short sections, bullet lists, and compact grouping over long continuous prose.\n- Do not force a fixed internal structure, but the summary should still feel organized and easy to skim.\n- Prioritize the most important themes and expand when the release has multiple genuinely meaningful areas of change.\n- Summarize fixes and improvements clearly, not inflated counts or vague praise.\n- Focus on the most directly affected users or maintainers, and expand when that adds real decision value.\n- Summary text must be in the same language as the invocation instruction, regardless of the source release language\n- Do not translate the changelog line by line\n- Do not invent scope, quantities, or recommendations not clearly supported by the source\n- Avoid hype such as `大幅重构`, `显著提升`, `建议所有用户升级` unless the source clearly justifies it\n\n## Render payload\n\n`run.py render` reads stdin JSON in this shape:\n\n```json\n{\n  \"outputTemplate\": \"default\",\n  \"language\": \"zh\",\n  \"releases\": [{ \"tag_name\": \"v2026.4.26\", \"published_at\": \"2026-04-28T01:11:02Z\", \"html_url\": \"...\" }],\n  \"summaries\": [\n    \"...\"\n  ]\n}\n```\n\nValidation rules:\n\n- `releases.length == summaries.length`\n- when building the render payload, keep the release fields required by `render`, especially `tag_name`, `published_at`, and `html_url`\n- each `summaries[i]` must be a non-empty string\n- each summary should be organized for scanning, not written as one large undifferentiated block of prose\n- `language` should match the invocation instruction language, use `zh` or `en`\n- one release uses single-release template, multiple releases use multi-release template\n\nFile v0.0.4:references/templates.md\n\n# Output Templates\n\nCurrent template name:\n\n- `default`\n\nTemplate routing is deterministic in `scripts/summary_formatter.py`.\n\n## Language policy\n\n- Keep the rendered message in the same language as the invocation instruction.\n- Pass `language: zh` or `language: en` to `run.py render` stdin payload.\n\n## Single release\n\n### zh\n\n```markdown\n**{owner}/{repo} 最新 Release：{tag_name}**\n\n- 发布时间：{published_at}\n\n{summary_markdown}\n\n- 链接：{html_url}\n```\n\n### en\n\n```markdown\n**{owner}/{repo} Latest Release: {tag_name}**\n\n- Published at: {published_at}\n\n{summary_markdown}\n\n- Link: {html_url}\n```\n\n## Multi-release\n\n### zh\n\n```markdown\n**{owner}/{repo} 新版本汇总（共 {count} 个）**\n\n**1. {tag_name}**\n- 发布时间：{published_at}\n\n{summary_markdown}\n\n- 链接：{html_url}\n```\n\n### en\n\n```markdown\n**{owner}/{repo} Release Summary ({count} total)**\n\n**1. {tag_name}**\n- Published at: {published_at}\n\n{summary_markdown}\n\n- Link: {html_url}\n```\n\nRepeat the numbered block for each release.\n\n## Mode policy\n\n- manual: reply with the rendered message only, no state language, no workflow narration\n- cron: emit only the final rendered message, no filler, no step labels, no JSON\n\nFile v0.0.4:skill-card.md\n\n## Description: <br>\nAnalyzes GitHub repository releases and summarizes latest or recent release notes for manual use or cron-driven tracking. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[stoner-byte](https://clawhub.ai/user/stoner-byte) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nDevelopers and engineers use this skill to check GitHub release changes, summarize selected formal releases, and optionally track unprocessed releases in cron workflows. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: In cron mode, a crafted custom state key can redirect the state file outside the intended state folder. <br>\nMitigation: For cron use, avoid custom state keys containing slashes, backslashes, '..', or absolute paths until state-key validation constrains writes to the OpenClaw state directory. <br>\nRisk: The skill fetches and summarizes public GitHub release content, so low-quality or misleading release notes can affect the final summary. <br>\nMitigation: Review the generated release summary against the linked release notes before using it for operational decisions. <br>\n\n\n## Reference(s): <br>\n- [ClawHub skill page](https://clawhub.ai/stoner-byte/github-release-analyzer) <br>\n- [Execution Modes](references/execution-modes.md) <br>\n- [Summary Contract](references/summary-contract.md) <br>\n- [State Format](references/state-format.md) <br>\n- [Output Templates](references/templates.md) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [Text, Markdown, Shell commands, Configuration] <br>\n**Output Format:** [Markdown summaries and deterministic command-driven workflow output] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [Manual mode returns the latest formal release summary; cron mode emits NO_REPLY when no new formal release is available.] <br>\n\n## Skill Version(s): <br>\n0.0.4 (source: server release metadata and SKILL.md frontmatter) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nArchive v0.0.3: 13 files, 13274 bytes\n\nFiles: README.md (989b), references/execution-modes.md (1470b), references/state-format.md (762b), references/summary-contract.md (2291b), references/templates.md (1202b), scripts/models.py (1258b), scripts/release_fetcher.py (3371b), scripts/repo_utils.py (1166b), scripts/run.py (10402b), scripts/state_store.py (1597b), scripts/summary_formatter.py (3245b), SKILL.md (3429b), _meta.json (142b)\n\nFile v0.0.3:SKILL.md\n\n---\nname: github-release-analyzer\ndescription: Analyze GitHub repository releases and summarize release notes. Use when the user asks to analyze, summarize, review, or track the latest release or recent releases for a GitHub repo, including phrases like \"分析最新 release\", \"latest release\", \"release 更新了什么\", \"汇总仓库 release\", or requests to build a cron that tracks GitHub releases. Supports manual one-off analysis and cron-driven incremental tracking.\nmetadata:\n  {\"openclaw\":{\"emoji\":\"📦\",\"requires\":{\"bins\":[\"python3\"]}}}\n---\n\n# GitHub Release Analyzer\n\nUse this skill as a fixed pipeline:\n\n```text\nprepare -> summarize -> render -> deliver -> commit\n```\n\nOnly `summarize` is free-form. `prepare`, `render`, and `commit` are deterministic script steps.\n\n## Inputs\n\n- Repo input: `https://github.com/<owner>/<repo>` or `<owner>/<repo>`\n- Default `stateKey`: `{owner}__{repo}`\n- Default template: `default`\n- Default behavior:\n  - manual: latest formal release only, no state read/write\n  - cron: formal releases only, first run selects latest only, later runs select unprocessed only\n\n## Workflow\n\n1. Read `references/execution-modes.md` and choose `manual` or `cron`.\n2. Run:\n\n```bash\npython3 skills/github-release-analyzer/scripts/run.py prepare --repo <repo> --mode <manual|cron>\n```\n\nUseful flags:\n\n- `--state-key <key>`\n- `--limit <n>`\n- `--include-prerelease`\n- `--output-template default`\n- `--initial-cron-behavior latest-only`\n\n3. If `status=has_updates`, read `references/summary-contract.md` and produce one summary string per selected release.\n   Keep the summary language aligned with the primary language of the invocation instruction.\n\n4. Render the final message:\n\n```bash\npython3 skills/github-release-analyzer/scripts/run.py render --repo <repo> --mode <manual|cron> < payload.json\n```\n\nWhen building the `render` payload, preserve the release fields required by `render`, especially `tag_name`, `published_at`, and `html_url`.\n\n5. In cron mode, after successful delivery, commit state:\n\n```bash\npython3 skills/github-release-analyzer/scripts/run.py commit \\\n  --repo <repo> \\\n  --mode cron \\\n  --processed-tags <comma-separated-tags> \\\n  --latest-release-id <id> \\\n  --latest-published-at <iso8601>\n```\n\n## Rules\n\n- Treat `prepare` output as the source of truth for selection, ordering, first-run behavior, repo normalization, and state path.\n- The output language must follow the primary language of the invocation instruction.\n- The final outgoing message must come from `render`.\n- In cron mode:\n  - if `status=no_update` or `status=no_release`, reply with `NO_REPLY`\n  - if `status=has_updates`, emit only the final rendered message\n- Update processed state only after successful delivery.\n\n## Hard prohibitions\n\n- Do not skip `prepare`.\n- Do not bypass `render`.\n- Do not reorder or silently drop releases selected by `prepare`.\n- Do not call `commit` in manual mode.\n- Do not call `commit` before delivery succeeds in cron mode.\n- Do not replace the summary contract with ad hoc prose outside the required `summaries[]` string-array shape.\n- In cron mode, when `status=no_update` or `status=no_release`, reply exactly `NO_REPLY`.\n- In cron mode, do not emit progress chatter, intermediate JSON, step labels, or workflow narration.\n\n## Files to read\n\n- `references/execution-modes.md`\n- `references/summary-contract.md`\n- `references/templates.md`\n- `references/state-format.md`\n\nFile v0.0.3:README.md\n\n# github-release-analyzer\n\nCurrent planned release version: **0.0.1**\n\nAnalyze GitHub releases and turn release notes into short, high-signal summaries.\n\n## What it does\n\n- Supports a single repo input: `owner/repo` or `https://github.com/owner/repo`\n- Manual mode: summarize the latest formal release\n- Cron mode: track unprocessed formal releases incrementally\n- Preserves a deterministic pipeline:\n  `prepare -> summarize -> render -> commit`\n\n## Main files\n\n- `SKILL.md` — skill routing + workflow rules\n- `scripts/run.py` — deterministic entrypoint for `prepare`, `render`, `commit`\n- `references/execution-modes.md` — manual vs cron behavior\n- `references/summary-contract.md` — required summary output shape\n\n## Notes\n\n- Requires `python3`\n- Default state is stored under `~/.openclaw/workspace/state/github-release-analyzer/`\n- Cron mode returns `NO_REPLY` when there is no new formal release to report\n\n## Initial publish target\n\n- License: MIT\n- Initial version: `0.0.1`\n\nFile v0.0.3:_meta.json\n\n{\n  \"ownerId\": \"kn7bapcyjfbh5hs3fty4kvxann84pre4\",\n  \"slug\": \"github-release-analyzer\",\n  \"version\": \"0.0.3\",\n  \"publishedAt\": 1777517730539\n}\n\nFile v0.0.3:references/execution-modes.md\n\n# Execution Modes\n\n## Manual\n\nRequired path:\n\n1. `prepare --mode manual`\n2. If `status=no_release`, reply that no formal release exists\n3. If `status=has_updates`, summarize exactly the selected `releases[]`\n4. Build `summaries[]`\n5. `render --mode manual`\n6. Reply with the rendered `message`\n\nDo not:\n\n- read or write state\n- call `commit`\n- analyze more than the selected latest formal release\n- add workflow narration or extra preambles\n\n## Cron\n\nRequired path:\n\n1. `prepare --mode cron`\n2. If `status=no_release` or `status=no_update`, reply exactly `NO_REPLY`\n3. If `status=has_updates`, summarize exactly the selected `releases[]`\n4. Keep `prepare` ordering\n5. Build `summaries[]`\n6. `render --mode cron`\n7. Deliver the rendered `message`\n8. After successful delivery, `commit`\n\nDo not:\n\n- skip `prepare`\n- bypass `render`\n- write processed state before delivery succeeds\n- when `status=no_update` or `status=no_release`, reply exactly `NO_REPLY`\n- emit progress narration, step labels, intermediate JSON, or any workflow text to the delivery target\n\n## Cron prompt shape\n\nKeep cron instructions short and mechanical. The useful constraints are:\n\n- use this skill in cron mode\n- run deterministic `prepare` first\n- summarize only formal releases selected by `prepare`\n- first run: latest only\n- later runs: unprocessed only, ordered old to new\n- no update: reply exactly `NO_REPLY`\n- only emit the final rendered message\n- after successful delivery, commit state\n\nFile v0.0.3:references/state-format.md\n\n# State Format\n\nDefault path:\n\n```text\n~/.openclaw/workspace/state/github-release-analyzer/{stateKey}.json\n```\n\nSchema:\n\n```json\n{\n  \"repo\": \"openclaw/openclaw\",\n  \"processed_tags\": [],\n  \"latest_processed_release_id\": null,\n  \"latest_processed_published_at\": null,\n  \"last_checked_at\": null,\n  \"last_success_at\": null,\n  \"initialized_at\": null\n}\n```\n\nRules:\n\n- derive `stateKey` from normalized repo unless explicitly overridden\n- missing file or empty `initialized_at` means first run\n- first cron run summarizes the latest formal release only\n- `prepare` updates `last_checked_at`\n- `commit` updates processed tags and latest processed metadata only after successful delivery\n- failed fetch, summarize, render, or delivery must not mark releases as processed\n\nFile v0.0.3:references/summary-contract.md\n\n# Summary Contract\n\nFlow:\n\n```text\nprepare -> summarize -> render -> deliver -> commit\n```\n\nEach selected release produces exactly one summary string.\n\n## Requirements\n\n- Output in the primary language of the invocation instruction (zh → 中文, en → 英文)\n- Keep facts anchored to the release body\n- Keep the summary distilled and high-signal, but do not force it into a fixed length budget\n- Output JSON only. Each summary item must be a single non-empty string, not an object.\n- Distill the release into a readable, high-signal summary rather than mirroring the changelog.\n- Use markdown to make the result easy to scan. Prefer short sections, bullet lists, and compact grouping over long continuous prose.\n- Do not force a fixed internal structure, but the summary should still feel organized and easy to skim.\n- Prioritize the most important themes and expand when the release has multiple genuinely meaningful areas of change.\n- Summarize fixes and improvements clearly, not inflated counts or vague praise.\n- Focus on the most directly affected users or maintainers, and expand when that adds real decision value.\n- Summary text must be in the same language as the invocation instruction, regardless of the source release language\n- Do not translate the changelog line by line\n- Do not invent scope, quantities, or recommendations not clearly supported by the source\n- Avoid hype such as `大幅重构`, `显著提升`, `建议所有用户升级` unless the source clearly justifies it\n\n## Render payload\n\n`run.py render` reads stdin JSON in this shape:\n\n```json\n{\n  \"outputTemplate\": \"default\",\n  \"language\": \"zh\",\n  \"releases\": [{ \"tag_name\": \"v2026.4.26\", \"published_at\": \"2026-04-28T01:11:02Z\", \"html_url\": \"...\" }],\n  \"summaries\": [\n    \"...\"\n  ]\n}\n```\n\nValidation rules:\n\n- `releases.length == summaries.length`\n- when building the render payload, keep the release fields required by `render`, especially `tag_name`, `published_at`, and `html_url`\n- each `summaries[i]` must be a non-empty string\n- each summary should be organized for scanning, not written as one large undifferentiated block of prose\n- `language` should match the invocation instruction language, use `zh` or `en`\n- one release uses single-release template, multiple releases use multi-release template\n\nFile v0.0.3:references/templates.md\n\n# Output Templates\n\nCurrent template name:\n\n- `default`\n\nTemplate routing is deterministic in `scripts/summary_formatter.py`.\n\n## Language policy\n\n- Keep the rendered message in the same language as the invocation instruction.\n- Pass `language: zh` or `language: en` to `run.py render` stdin payload.\n\n## Single release\n\n### zh\n\n```markdown\n**{owner}/{repo} 最新 Release：{tag_name}**\n\n- 发布时间：{published_at}\n\n{summary_markdown}\n\n- 链接：{html_url}\n```\n\n### en\n\n```markdown\n**{owner}/{repo} Latest Release: {tag_name}**\n\n- Published at: {published_at}\n\n{summary_markdown}\n\n- Link: {html_url}\n```\n\n## Multi-release\n\n### zh\n\n```markdown\n**{owner}/{repo} 新版本汇总（共 {count} 个）**\n\n**1. {tag_name}**\n- 发布时间：{published_at}\n\n{summary_markdown}\n\n- 链接：{html_url}\n```\n\n### en\n\n```markdown\n**{owner}/{repo} Release Summary ({count} total)**\n\n**1. {tag_name}**\n- Published at: {published_at}\n\n{summary_markdown}\n\n- Link: {html_url}\n```\n\nRepeat the numbered block for each release.\n\n## Mode policy\n\n- manual: reply with the rendered message only, no state language, no workflow narration\n- cron: emit only the final rendered message, no filler, no step labels, no JSON\n\nArchive v0.0.2: 13 files, 13294 bytes\n\nFiles: README.md (989b), references/execution-modes.md (1470b), references/state-format.md (762b), references/summary-contract.md (2291b), references/templates.md (1202b), scripts/models.py (1258b), scripts/release_fetcher.py (3371b), scripts/repo_utils.py (1166b), scripts/run.py (10402b), scripts/state_store.py (1597b), scripts/summary_formatter.py (3245b), SKILL.md (3494b), _meta.json (142b)\n\nFile v0.0.2:SKILL.md\n\n---\nname: github-release-analyzer\ndescription: Analyze GitHub repository releases and summarize release notes. Use when the user asks to analyze, summarize, review, or track the latest release or recent releases for a GitHub repo, including phrases like \"分析最新 release\", \"latest release\", \"release 更新了什么\", \"汇总仓库 release\", or requests to build a cron that tracks GitHub releases. Supports manual one-off analysis and cron-driven incremental tracking.\nhomepage: https://github.com/stoner-byte/github-release-analyzer\nmetadata:\n  {\"openclaw\":{\"emoji\":\"📦\",\"requires\":{\"bins\":[\"python3\"]}}}\n---\n\n# GitHub Release Analyzer\n\nUse this skill as a fixed pipeline:\n\n```text\nprepare -> summarize -> render -> deliver -> commit\n```\n\nOnly `summarize` is free-form. `prepare`, `render`, and `commit` are deterministic script steps.\n\n## Inputs\n\n- Repo input: `https://github.com/<owner>/<repo>` or `<owner>/<repo>`\n- Default `stateKey`: `{owner}__{repo}`\n- Default template: `default`\n- Default behavior:\n  - manual: latest formal release only, no state read/write\n  - cron: formal releases only, first run selects latest only, later runs select unprocessed only\n\n## Workflow\n\n1. Read `references/execution-modes.md` and choose `manual` or `cron`.\n2. Run:\n\n```bash\npython3 skills/github-release-analyzer/scripts/run.py prepare --repo <repo> --mode <manual|cron>\n```\n\nUseful flags:\n\n- `--state-key <key>`\n- `--limit <n>`\n- `--include-prerelease`\n- `--output-template default`\n- `--initial-cron-behavior latest-only`\n\n3. If `status=has_updates`, read `references/summary-contract.md` and produce one summary string per selected release.\n   Keep the summary language aligned with the primary language of the invocation instruction.\n\n4. Render the final message:\n\n```bash\npython3 skills/github-release-analyzer/scripts/run.py render --repo <repo> --mode <manual|cron> < payload.json\n```\n\nWhen building the `render` payload, preserve the release fields required by `render`, especially `tag_name`, `published_at`, and `html_url`.\n\n5. In cron mode, after successful delivery, commit state:\n\n```bash\npython3 skills/github-release-analyzer/scripts/run.py commit \\\n  --repo <repo> \\\n  --mode cron \\\n  --processed-tags <comma-separated-tags> \\\n  --latest-release-id <id> \\\n  --latest-published-at <iso8601>\n```\n\n## Rules\n\n- Treat `prepare` output as the source of truth for selection, ordering, first-run behavior, repo normalization, and state path.\n- The output language must follow the primary language of the invocation instruction.\n- The final outgoing message must come from `render`.\n- In cron mode:\n  - if `status=no_update` or `status=no_release`, reply with `NO_REPLY`\n  - if `status=has_updates`, emit only the final rendered message\n- Update processed state only after successful delivery.\n\n## Hard prohibitions\n\n- Do not skip `prepare`.\n- Do not bypass `render`.\n- Do not reorder or silently drop releases selected by `prepare`.\n- Do not call `commit` in manual mode.\n- Do not call `commit` before delivery succeeds in cron mode.\n- Do not replace the summary contract with ad hoc prose outside the required `summaries[]` string-array shape.\n- In cron mode, when `status=no_update` or `status=no_release`, reply exactly `NO_REPLY`.\n- In cron mode, do not emit progress chatter, intermediate JSON, step labels, or workflow narration.\n\n## Files to read\n\n- `references/execution-modes.md`\n- `references/summary-contract.md`\n- `references/templates.md`\n- `references/state-format.md`\n\nFile v0.0.2:README.md\n\n# github-release-analyzer\n\nCurrent planned release version: **0.0.1**\n\nAnalyze GitHub releases and turn release notes into short, high-signal summaries.\n\n## What it does\n\n- Supports a single repo input: `owner/repo` or `https://github.com/owner/repo`\n- Manual mode: summarize the latest formal release\n- Cron mode: track unprocessed formal releases incrementally\n- Preserves a deterministic pipeline:\n  `prepare -> summarize -> render -> commit`\n\n## Main files\n\n- `SKILL.md` — skill routing + workflow rules\n- `scripts/run.py` — deterministic entrypoint for `prepare`, `render`, `commit`\n- `references/execution-modes.md` — manual vs cron behavior\n- `references/summary-contract.md` — required summary output shape\n\n## Notes\n\n- Requires `python3`\n- Default state is stored under `~/.openclaw/workspace/state/github-release-analyzer/`\n- Cron mode returns `NO_REPLY` when there is no new formal release to report\n\n## Initial publish target\n\n- License: MIT\n- Initial version: `0.0.1`\n\nFile v0.0.2:_meta.json\n\n{\n  \"ownerId\": \"kn7bapcyjfbh5hs3fty4kvxann84pre4\",\n  \"slug\": \"github-release-analyzer\",\n  \"version\": \"0.0.2\",\n  \"publishedAt\": 1777517469598\n}\n\nFile v0.0.2:references/execution-modes.md\n\n# Execution Modes\n\n## Manual\n\nRequired path:\n\n1. `prepare --mode manual`\n2. If `status=no_release`, reply that no formal release exists\n3. If `status=has_updates`, summarize exactly the selected `releases[]`\n4. Build `summaries[]`\n5. `render --mode manual`\n6. Reply with the rendered `message`\n\nDo not:\n\n- read or write state\n- call `commit`\n- analyze more than the selected latest formal release\n- add workflow narration or extra preambles\n\n## Cron\n\nRequired path:\n\n1. `prepare --mode cron`\n2. If `status=no_release` or `status=no_update`, reply exactly `NO_REPLY`\n3. If `status=has_updates`, summarize exactly the selected `releases[]`\n4. Keep `prepare` ordering\n5. Build `summaries[]`\n6. `render --mode cron`\n7. Deliver the rendered `message`\n8. After successful delivery, `commit`\n\nDo not:\n\n- skip `prepare`\n- bypass `render`\n- write processed state before delivery succeeds\n- when `status=no_update` or `status=no_release`, reply exactly `NO_REPLY`\n- emit progress narration, step labels, intermediate JSON, or any workflow text to the delivery target\n\n## Cron prompt shape\n\nKeep cron instructions short and mechanical. The useful constraints are:\n\n- use this skill in cron mode\n- run deterministic `prepare` first\n- summarize only formal releases selected by `prepare`\n- first run: latest only\n- later runs: unprocessed only, ordered old to new\n- no update: reply exactly `NO_REPLY`\n- only emit the final rendered message\n- after successful delivery, commit state\n\nFile v0.0.2:references/state-format.md\n\n# State Format\n\nDefault path:\n\n```text\n~/.openclaw/workspace/state/github-release-analyzer/{stateKey}.json\n```\n\nSchema:\n\n```json\n{\n  \"repo\": \"openclaw/openclaw\",\n  \"processed_tags\": [],\n  \"latest_processed_release_id\": null,\n  \"latest_processed_published_at\": null,\n  \"last_checked_at\": null,\n  \"last_success_at\": null,\n  \"initialized_at\": null\n}\n```\n\nRules:\n\n- derive `stateKey` from normalized repo unless explicitly overridden\n- missing file or empty `initialized_at` means first run\n- first cron run summarizes the latest formal release only\n- `prepare` updates `last_checked_at`\n- `commit` updates processed tags and latest processed metadata only after successful delivery\n- failed fetch, summarize, render, or delivery must not mark releases as processed\n\nFile v0.0.2:references/summary-contract.md\n\n# Summary Contract\n\nFlow:\n\n```text\nprepare -> summarize -> render -> deliver -> commit\n```\n\nEach selected release produces exactly one summary string.\n\n## Requirements\n\n- Output in the primary language of the invocation instruction (zh → 中文, en → 英文)\n- Keep facts anchored to the release body\n- Keep the summary distilled and high-signal, but do not force it into a fixed length budget\n- Output JSON only. Each summary item must be a single non-empty string, not an object.\n- Distill the release into a readable, high-signal summary rather than mirroring the changelog.\n- Use markdown to make the result easy to scan. Prefer short sections, bullet lists, and compact grouping over long continuous prose.\n- Do not force a fixed internal structure, but the summary should still feel organized and easy to skim.\n- Prioritize the most important themes and expand when the release has multiple genuinely meaningful areas of change.\n- Summarize fixes and improvements clearly, not inflated counts or vague praise.\n- Focus on the most directly affected users or maintainers, and expand when that adds real decision value.\n- Summary text must be in the same language as the invocation instruction, regardless of the source release language\n- Do not translate the changelog line by line\n- Do not invent scope, quantities, or recommendations not clearly supported by the source\n- Avoid hype such as `大幅重构`, `显著提升`, `建议所有用户升级` unless the source clearly justifies it\n\n## Render payload\n\n`run.py render` reads stdin JSON in this shape:\n\n```json\n{\n  \"outputTemplate\": \"default\",\n  \"language\": \"zh\",\n  \"releases\": [{ \"tag_name\": \"v2026.4.26\", \"published_at\": \"2026-04-28T01:11:02Z\", \"html_url\": \"...\" }],\n  \"summaries\": [\n    \"...\"\n  ]\n}\n```\n\nValidation rules:\n\n- `releases.length == summaries.length`\n- when building the render payload, keep the release fields required by `render`, especially `tag_name`, `published_at`, and `html_url`\n- each `summaries[i]` must be a non-empty string\n- each summary should be organized for scanning, not written as one large undifferentiated block of prose\n- `language` should match the invocation instruction language, use `zh` or `en`\n- one release uses single-release template, multiple releases use multi-release template\n\nFile v0.0.2:references/templates.md\n\n# Output Templates\n\nCurrent template name:\n\n- `default`\n\nTemplate routing is deterministic in `scripts/summary_formatter.py`.\n\n## Language policy\n\n- Keep the rendered message in the same language as the invocation instruction.\n- Pass `language: zh` or `language: en` to `run.py render` stdin payload.\n\n## Single release\n\n### zh\n\n```markdown\n**{owner}/{repo} 最新 Release：{tag_name}**\n\n- 发布时间：{published_at}\n\n{summary_markdown}\n\n- 链接：{html_url}\n```\n\n### en\n\n```markdown\n**{owner}/{repo} Latest Release: {tag_name}**\n\n- Published at: {published_at}\n\n{summary_markdown}\n\n- Link: {html_url}\n```\n\n## Multi-release\n\n### zh\n\n```markdown\n**{owner}/{repo} 新版本汇总（共 {count} 个）**\n\n**1. {tag_name}**\n- 发布时间：{published_at}\n\n{summary_markdown}\n\n- 链接：{html_url}\n```\n\n### en\n\n```markdown\n**{owner}/{repo} Release Summary ({count} total)**\n\n**1. {tag_name}**\n- Published at: {published_at}\n\n{summary_markdown}\n\n- Link: {html_url}\n```\n\nRepeat the numbered block for each release.\n\n## Mode policy\n\n- manual: reply with the rendered message only, no state language, no workflow narration\n- cron: emit only the final rendered message, no filler, no step labels, no JSON\n\nArchive v0.0.1: 13 files, 13273 bytes\n\nFiles: README.md (989b), references/execution-modes.md (1470b), references/state-format.md (762b), references/summary-contract.md (2291b), references/templates.md (1202b), scripts/models.py (1258b), scripts/release_fetcher.py (3371b), scripts/repo_utils.py (1166b), scripts/run.py (10402b), scripts/state_store.py (1597b), scripts/summary_formatter.py (3245b), SKILL.md (3429b), _meta.json (142b)\n\nFile v0.0.1:SKILL.md\n\n---\nname: github-release-analyzer\ndescription: Analyze GitHub repository releases and summarize release notes. Use when the user asks to analyze, summarize, review, or track the latest release or recent releases for a GitHub repo, including phrases like \"分析最新 release\", \"latest release\", \"release 更新了什么\", \"汇总仓库 release\", or requests to build a cron that tracks GitHub releases. Supports manual one-off analysis and cron-driven incremental tracking.\nmetadata:\n  {\"openclaw\":{\"emoji\":\"📦\",\"requires\":{\"bins\":[\"python3\"]}}}\n---\n\n# GitHub Release Analyzer\n\nUse this skill as a fixed pipeline:\n\n```text\nprepare -> summarize -> render -> deliver -> commit\n```\n\nOnly `summarize` is free-form. `prepare`, `render`, and `commit` are deterministic script steps.\n\n## Inputs\n\n- Repo input: `https://github.com/<owner>/<repo>` or `<owner>/<repo>`\n- Default `stateKey`: `{owner}__{repo}`\n- Default template: `default`\n- Default behavior:\n  - manual: latest formal release only, no state read/write\n  - cron: formal releases only, first run selects latest only, later runs select unprocessed only\n\n## Workflow\n\n1. Read `references/execution-modes.md` and choose `manual` or `cron`.\n2. Run:\n\n```bash\npython3 skills/github-release-analyzer/scripts/run.py prepare --repo <repo> --mode <manual|cron>\n```\n\nUseful flags:\n\n- `--state-key <key>`\n- `--limit <n>`\n- `--include-prerelease`\n- `--output-template default`\n- `--initial-cron-behavior latest-only`\n\n3. If `status=has_updates`, read `references/summary-contract.md` and produce one summary string per selected release.\n   Keep the summary language aligned with the primary language of the invocation instruction.\n\n4. Render the final message:\n\n```bash\npython3 skills/github-release-analyzer/scripts/run.py render --repo <repo> --mode <manual|cron> < payload.json\n```\n\nWhen building the `render` payload, preserve the release fields required by `render`, especially `tag_name`, `published_at`, and `html_url`.\n\n5. In cron mode, after successful delivery, commit state:\n\n```bash\npython3 skills/github-release-analyzer/scripts/run.py commit \\\n  --repo <repo> \\\n  --mode cron \\\n  --processed-tags <comma-separated-tags> \\\n  --latest-release-id <id> \\\n  --latest-published-at <iso8601>\n```\n\n## Rules\n\n- Treat `prepare` output as the source of truth for selection, ordering, first-run behavior, repo normalization, and state path.\n- The output language must follow the primary language of the invocation instruction.\n- The final outgoing message must come from `render`.\n- In cron mode:\n  - if `status=no_update` or `status=no_release`, reply with `NO_REPLY`\n  - if `status=has_updates`, emit only the final rendered message\n- Update processed state only after successful delivery.\n\n## Hard prohibitions\n\n- Do not skip `prepare`.\n- Do not bypass `render`.\n- Do not reorder or silently drop releases selected by `prepare`.\n- Do not call `commit` in manual mode.\n- Do not call `commit` before delivery succeeds in cron mode.\n- Do not replace the summary contract with ad hoc prose outside the required `summaries[]` string-array shape.\n- In cron mode, when `status=no_update` or `status=no_release`, reply exactly `NO_REPLY`.\n- In cron mode, do not emit progress chatter, intermediate JSON, step labels, or workflow narration.\n\n## Files to read\n\n- `references/execution-modes.md`\n- `references/summary-contract.md`\n- `references/templates.md`\n- `references/state-format.md`\n\nFile v0.0.1:README.md\n\n# github-release-analyzer\n\nCurrent planned release version: **0.0.1**\n\nAnalyze GitHub releases and turn release notes into short, high-signal summaries.\n\n## What it does\n\n- Supports a single repo input: `owner/repo` or `https://github.com/owner/repo`\n- Manual mode: summarize the latest formal release\n- Cron mode: track unprocessed formal releases incrementally\n- Preserves a deterministic pipeline:\n  `prepare -> summarize -> render -> commit`\n\n## Main files\n\n- `SKILL.md` — skill routing + workflow rules\n- `scripts/run.py` — deterministic entrypoint for `prepare`, `render`, `commit`\n- `references/execution-modes.md` — manual vs cron behavior\n- `references/summary-contract.md` — required summary output shape\n\n## Notes\n\n- Requires `python3`\n- Default state is stored under `~/.openclaw/workspace/state/github-release-analyzer/`\n- Cron mode returns `NO_REPLY` when there is no new formal release to report\n\n## Initial publish target\n\n- License: MIT\n- Initial version: `0.0.1`\n\nFile v0.0.1:_meta.json\n\n{\n  \"ownerId\": \"kn7bapcyjfbh5hs3fty4kvxann84pre4\",\n  \"slug\": \"github-release-analyzer\",\n  \"version\": \"0.0.1\",\n  \"publishedAt\": 1777516858248\n}\n\nFile v0.0.1:references/execution-modes.md\n\n# Execution Modes\n\n## Manual\n\nRequired path:\n\n1. `prepare --mode manual`\n2. If `status=no_release`, reply that no formal release exists\n3. If `status=has_updates`, summarize exactly the selected `releases[]`\n4. Build `summaries[]`\n5. `render --mode manual`\n6. Reply with the rendered `message`\n\nDo not:\n\n- read or write state\n- call `commit`\n- analyze more than the selected latest formal release\n- add workflow narration or extra preambles\n\n## Cron\n\nRequired path:\n\n1. `prepare --mode cron`\n2. If `status=no_release` or `status=no_update`, reply exactly `NO_REPLY`\n3. If `status=has_updates`, summarize exactly the selected `releases[]`\n4. Keep `prepare` ordering\n5. Build `summaries[]`\n6. `render --mode cron`\n7. Deliver the rendered `message`\n8. After successful delivery, `commit`\n\nDo not:\n\n- skip `prepare`\n- bypass `render`\n- write processed state before delivery succeeds\n- when `status=no_update` or `status=no_release`, reply exactly `NO_REPLY`\n- emit progress narration, step labels, intermediate JSON, or any workflow text to the delivery target\n\n## Cron prompt shape\n\nKeep cron instructions short and mechanical. The useful constraints are:\n\n- use this skill in cron mode\n- run deterministic `prepare` first\n- summarize only formal releases selected by `prepare`\n- first run: latest only\n- later runs: unprocessed only, ordered old to new\n- no update: reply exactly `NO_REPLY`\n- only emit the final rendered message\n- after successful delivery, commit state\n\nFile v0.0.1:references/state-format.md\n\n# State Format\n\nDefault path:\n\n```text\n~/.openclaw/workspace/state/github-release-analyzer/{stateKey}.json\n```\n\nSchema:\n\n```json\n{\n  \"repo\": \"openclaw/openclaw\",\n  \"processed_tags\": [],\n  \"latest_processed_release_id\": null,\n  \"latest_processed_published_at\": null,\n  \"last_checked_at\": null,\n  \"last_success_at\": null,\n  \"initialized_at\": null\n}\n```\n\nRules:\n\n- derive `stateKey` from normalized repo unless explicitly overridden\n- missing file or empty `initialized_at` means first run\n- first cron run summarizes the latest formal release only\n- `prepare` updates `last_checked_at`\n- `commit` updates processed tags and latest processed metadata only after successful delivery\n- failed fetch, summarize, render, or delivery must not mark releases as processed\n\nFile v0.0.1:references/summary-contract.md\n\n# Summary Contract\n\nFlow:\n\n```text\nprepare -> summarize -> render -> deliver -> commit\n```\n\nEach selected release produces exactly one summary string.\n\n## Requirements\n\n- Output in the primary language of the invocation instruction (zh → 中文, en → 英文)\n- Keep facts anchored to the release body\n- Keep the summary distilled and high-signal, but do not force it into a fixed length budget\n- Output JSON only. Each summary item must be a single non-empty string, not an object.\n- Distill the release into a readable, high-signal summary rather than mirroring the changelog.\n- Use markdown to make the result easy to scan. Prefer short sections, bullet lists, and compact grouping over long continuous prose.\n- Do not force a fixed internal structure, but the summary should still feel organized and easy to skim.\n- Prioritize the most important themes and expand when the release has multiple genuinely meaningful areas of change.\n- Summarize fixes and improvements clearly, not inflated counts or vague praise.\n- Focus on the most directly affected users or maintainers, and expand when that adds real decision value.\n- Summary text must be in the same language as the invocation instruction, regardless of the source release language\n- Do not translate the changelog line by line\n- Do not invent scope, quantities, or recommendations not clearly supported by the source\n- Avoid hype such as `大幅重构`, `显著提升`, `建议所有用户升级` unless the source clearly justifies it\n\n## Render payload\n\n`run.py render` reads stdin JSON in this shape:\n\n```json\n{\n  \"outputTemplate\": \"default\",\n  \"language\": \"zh\",\n  \"releases\": [{ \"tag_name\": \"v2026.4.26\", \"published_at\": \"2026-04-28T01:11:02Z\", \"html_url\": \"...\" }],\n  \"summaries\": [\n    \"...\"\n  ]\n}\n```\n\nValidation rules:\n\n- `releases.length == summaries.length`\n- when building the render payload, keep the release fields required by `render`, especially `tag_name`, `published_at`, and `html_url`\n- each `summaries[i]` must be a non-empty string\n- each summary should be organized for scanning, not written as one large undifferentiated block of prose\n- `language` should match the invocation instruction language, use `zh` or `en`\n- one release uses single-release template, multiple releases use multi-release template\n\nFile v0.0.1:references/templates.md\n\n# Output Templates\n\nCurrent template name:\n\n- `default`\n\nTemplate routing is deterministic in `scripts/summary_formatter.py`.\n\n## Language policy\n\n- Keep the rendered message in the same language as the invocation instruction.\n- Pass `language: zh` or `language: en` to `run.py render` stdin payload.\n\n## Single release\n\n### zh\n\n```markdown\n**{owner}/{repo} 最新 Release：{tag_name}**\n\n- 发布时间：{published_at}\n\n{summary_markdown}\n\n- 链接：{html_url}\n```\n\n### en\n\n```markdown\n**{owner}/{repo} Latest Release: {tag_name}**\n\n- Published at: {published_at}\n\n{summary_markdown}\n\n- Link: {html_url}\n```\n\n## Multi-release\n\n### zh\n\n```markdown\n**{owner}/{repo} 新版本汇总（共 {count} 个）**\n\n**1. {tag_name}**\n- 发布时间：{published_at}\n\n{summary_markdown}\n\n- 链接：{html_url}\n```\n\n### en\n\n```markdown\n**{owner}/{repo} Release Summary ({count} total)**\n\n**1. {tag_name}**\n- Published at: {published_at}\n\n{summary_markdown}\n\n- Link: {html_url}\n```\n\nRepeat the numbered block for each release.\n\n## Mode policy\n\n- manual: reply with the rendered message only, no state language, no workflow narration\n- cron: emit only the final rendered message, no filler, no step labels, no JSON","readmeExcerpt":"Skill: GitHub Release Analyzer Owner: stoner-byte Summary: Analyze GitHub repository releases and summarize release notes. Use when the user asks to analyze, summarize, review, or track the latest release or recent releases for a GitHub repo, including phrases like \"分析最新 release\", \"latest release\", \"release 更新了什么\", \"汇总仓库 release\", or requests to build a cron that tracks GitHub releases. Supports manual one-off analys","codeSnippets":[],"executableExamples":[{"language":"text","snippet":"prepare -> summarize -> render -> deliver -> commit"},{"language":"bash","snippet":"python3 scripts/run.py prepare --repo <repo> --mode <manual|cron>"},{"language":"bash","snippet":"python3 scripts/run.py render --repo <repo> --mode <manual|cron> < payload.json"},{"language":"bash","snippet":"python3 scripts/run.py commit \\\n  --repo <repo> \\\n  --mode cron \\\n  --processed-tags <comma-separated-tags> \\\n  --latest-release-id <id> \\\n  --latest-published-at <iso8601>"},{"language":"text","snippet":"Hermes: $HERMES_HOME/state/github-release-analyzer/{stateKey}.json\nOpenClaw legacy (when populated): ~/.openclaw/workspace/state/github-release-analyzer/{stateKey}.json\nOpenClaw persistent: ~/.openclaw/state/github-release-analyzer/{stateKey}.json"},{"language":"json","snippet":"{\n  \"repo\": \"openclaw/openclaw\",\n  \"processed_tags\": [],\n  \"latest_processed_release_id\": null,\n  \"latest_processed_published_at\": null,\n  \"last_checked_at\": null,\n  \"last_success_at\": null,\n  \"initialized_at\": null\n}"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: github-release-analyzer\nversion: 0.0.5\ndescription: Analyze GitHub repository releases and summarize release notes. Use when the user asks to analyze, summarize, review, or track the latest release or recent releases for a GitHub repo, including phrases like \"分析最新 release\", \"latest release\", \"release 更新了什么\", \"汇总仓库 release\", or requests to build a cron that tracks GitHub releases. Supports manual one-off analysis and cron-driven incremental tracking.\nmetadata:\n  openclaw:\n    emoji: \"📦\"\n    requires:\n      bins: [python3]\n  hermes:\n    tags: [github, releases, monitoring, cron]\n---\n\n# GitHub Release Analyzer\n\nUse this skill as a fixed pipeline:\n\n```text\nprepare -> summarize -> render -> deliver -> commit\n```\n\nOnly `summarize` is free-form. `prepare`, `render`, and `commit` are deterministic script steps.\n\n## Inputs\n\n- Repo input: `https://github.com/<owner>/<repo>` or `<owner>/<repo>`\n- Default `stateKey`: `{owner}__{repo}`\n- Default template: `default`\n- Default behavior:\n  - manual: latest formal release only, no state read/write\n  - cron: formal releases only, first run selects latest only, later runs select unprocessed only\n\n## Workflow\n\nBefore running any `scripts/...` command, set the command working directory to\nthe directory containing the loaded `SKILL.md` (the Skill root). Do not run\nthese commands from the OpenClaw workspace root. This does **not** require a\nshell `SKILL_DIR` environment variable: OpenClaw uses the loaded Skill's\ninstalled directory, and Hermes uses the `skill_dir` returned by `skill_view`.\n\n1. Read `references/execution-modes.md` and choose `manual` or `cron`.\n2. From the Skill root, run:\n\n```bash\npython3 scripts/run.py prepare --repo <repo> --mode <manual|cron>\n```\n\nUseful flags:\n\n- `--state-key <key>`\n- `--limit <n>`\n- `--include-prerelease`\n- `--output-template default`\n- `--initial-cron-behavior latest-only`\n\n3. If `status=has_updates`, read `references/summary-contract.md` and produce one summary string per selected release.\n   Keep the summary language aligned with the primary language of the invocation instruction.\n\n4. Render the final message:\n\n```bash\npython3 scripts/run.py render --repo <repo> --mode <manual|cron> < payload.json\n```\n\nWhen building the `render` payload, preserve the release fields required by `render`, especially `tag_name`, `published_at`, and `html_url`.\n\n5. In cron mode, after successful delivery, commit state:\n\n```bash\npython3 scripts/run.py commit \\\n  --repo <repo> \\\n  --mode cron \\\n  --processed-tags <comma-separated-tags> \\\n  --latest-release-id <id> \\\n  --latest-published-at <iso8601>\n```\n\n## Rules\n\n- Treat `prepare` output as the source of truth for selection, ordering, first-run behavior, repo normalization, and state path.\n- The output language must follow the primary language of the invocation instruction.\n- The final outgoing message must come from `render`.\n- In cron mode:\n  - if `status=no_update` or `status=no_release`, reply with `NO_REPLY`\n  - if `status=has_update"},{"path":"README.md","content":"# github-release-analyzer\n\nCurrent planned release version: **0.0.1**\n\nAnalyze GitHub releases and turn release notes into short, high-signal summaries.\n\n## What it does\n\n- Supports a single repo input: `owner/repo` or `https://github.com/owner/repo`\n- Manual mode: summarize the latest formal release\n- Cron mode: track unprocessed formal releases incrementally\n- Preserves a deterministic pipeline:\n  `prepare -> summarize -> render -> commit`\n\n## Main files\n\n- `SKILL.md` — skill routing + workflow rules\n- `scripts/run.py` — deterministic entrypoint for `prepare`, `render`, `commit`\n- `references/execution-modes.md` — manual vs cron behavior\n- `references/summary-contract.md` — required summary output shape\n\n## Notes\n\n- Requires `python3`\n- Default state is stored under `~/.openclaw/workspace/state/github-release-analyzer/`\n- Cron mode returns `NO_REPLY` when there is no new formal release to report\n\n## Initial publish target\n\n- License: MIT\n- Initial version: `0.0.1`"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn7bapcyjfbh5hs3fty4kvxann84pre4\",\n  \"slug\": \"github-release-analyzer\",\n  \"version\": \"0.0.5\",\n  \"publishedAt\": 1787114293411\n}"},{"path":"references/execution-modes.md","content":"# Execution Modes\n\n## Manual\n\nRequired path:\n\n1. `prepare --mode manual`\n2. If `status=no_release`, reply that no formal release exists\n3. If `status=has_updates`, summarize exactly the selected `releases[]`\n4. Build `summaries[]`\n5. `render --mode manual`\n6. Reply with the rendered `message`\n\nDo not:\n\n- read or write state\n- call `commit`\n- analyze more than the selected latest formal release\n- add workflow narration or extra preambles\n\n## Cron\n\nRequired path:\n\n1. `prepare --mode cron`\n2. If `status=no_release` or `status=no_update`, reply exactly `NO_REPLY`\n3. If `status=has_updates`, summarize exactly the selected `releases[]`\n4. Keep `prepare` ordering\n5. Build `summaries[]`\n6. `render --mode cron`\n7. Deliver the rendered `message`\n8. After successful delivery, `commit`\n\nDo not:\n\n- skip `prepare`\n- bypass `render`\n- write processed state before delivery succeeds\n- when `status=no_update` or `status=no_release`, reply exactly `NO_REPLY`\n- emit progress narration, step labels, intermediate JSON, or any workflow text to the delivery target\n\n## Cron prompt shape\n\nKeep cron instructions short and mechanical. The useful constraints are:\n\n- use this skill in cron mode\n- run deterministic `prepare` first\n- summarize only formal releases selected by `prepare`\n- first run: latest only\n- later runs: unprocessed only, ordered old to new\n- no update: reply exactly `NO_REPLY`\n- only emit the final rendered message\n- after successful delivery, commit state"},{"path":"references/state-format.md","content":"# State Format\n\nDefault paths:\n\n```text\nHermes: $HERMES_HOME/state/github-release-analyzer/{stateKey}.json\nOpenClaw legacy (when populated): ~/.openclaw/workspace/state/github-release-analyzer/{stateKey}.json\nOpenClaw persistent: ~/.openclaw/state/github-release-analyzer/{stateKey}.json\n```\n\n`GITHUB_RELEASE_ANALYZER_STATE_ROOT` overrides the default root on either\nplatform. When `HERMES_HOME` is set, the Hermes path is used. Otherwise,\nOpenClaw preserves its existing legacy-then-persistent fallback behavior.\n\nSchema:\n\n```json\n{\n  \"repo\": \"openclaw/openclaw\",\n  \"processed_tags\": [],\n  \"latest_processed_release_id\": null,\n  \"latest_processed_published_at\": null,\n  \"last_checked_at\": null,\n  \"last_success_at\": null,\n  \"initialized_at\": null\n}\n```\n\nRules:\n\n- derive `stateKey` from normalized repo unless explicitly overridden\n- missing file or empty `initialized_at` means first run\n- first cron run summarizes the latest formal release only\n- `prepare` updates `last_checked_at`\n- `commit` updates processed tags and latest processed metadata only after successful delivery\n- failed fetch, summarize, render, or delivery must not mark releases as processed"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":null,"editorialQuality":{"score":100,"threshold":65,"status":"thin","wordCount":1252,"uniquenessScore":41,"reasons":["uniqueness-below-45"]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-11T21:19:53.696Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-11T21:19:53.696Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-12T15:52:05.378Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}