{"id":"91bf8603-14f1-4733-84a3-5846d500b22f","entityType":"agent","slug":"clawhub-ldxs001-git-sync","name":"git-sync","canonicalUrl":"https://www.xpersona.co/agent/clawhub-ldxs001-git-sync","canonicalPath":"/agent/clawhub-ldxs001-git-sync","generatedAt":"2026-10-09T20:25:59.049Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-09T05:01:36.015Z","emptyReason":null},"description":"全平台统一发布工具。支持 skills 和 agents 的 Gitee/GitHub/ClawHub/SkillHub/PyPI 同步与 Release 创建，LLM 驱动的文件过滤与脱敏。 Skill: git-sync Owner: ldxs001 Summary: 全平台统一发布工具。支持 skills 和 agents 的 Gitee/GitHub/ClawHub/SkillHub/PyPI 同步与 Release 创建，LLM 驱动的文件过滤与脱敏。 Tags: deploy:2.48.0, git:2.48.0, gitee:2.48.0, github:2.48.0, latest:2.48.0, publish:2.42.0, skill:2.42.0, sync:2.48.0, workflow:2.24.0 Version history: v2.48.0 | 2026-10-03T14:45:27.391Z | user v2.48.0 v2.47.0 | 2026-10-02T16:11:01.941Z | user v2.47.0 v2.45.8 | 2026-08-26T05:12:46.","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 4.7K downloads reported by the source. Last updated 10/9/2026.","installCommand":"clawhub skill install s1794v2r46s8y5d1r4jdd7ec5h84rw70:git-sync","sourceUrl":"https://clawhub.ai/ldxs001/git-sync","homepage":"https://clawhub.ai/ldxs001/skills/git-sync","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/ldxs001/git-sync","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/ldxs001/skills/git-sync","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":73,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"全平台统一发布工具。支持 skills 和 agents 的 Gitee/GitHub/ClawHub/SkillHub/PyPI 同步与 Release 创建，LLM 驱动的文件过滤与脱敏。 Skill: git-sync Owner: ldxs001 Summary: 全平台统一发布工具。支持 skills 和 a"},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-09T05:01:36.015Z","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-09T05:01:36.015Z","emptyReason":null},"stars":null,"forks":null,"downloads":4696,"packageName":null,"latestVersion":"2.48.0","tractionLabel":"4.7K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T05:01:36.014Z","emptyReason":null},"lastUpdatedAt":"2026-10-09T05:01:36.015Z","lastCrawledAt":"2026-10-09T05:01:36.014Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-10T05:01:36.014Z","lastVerifiedAt":null,"highlights":[{"version":"2.48.0","createdAt":"2026-10-03T14:45:27.391Z","changelog":"v2.48.0","fileCount":35,"zipByteSize":140486},{"version":"2.47.0","createdAt":"2026-10-02T16:11:01.941Z","changelog":"v2.47.0","fileCount":35,"zipByteSize":139499},{"version":"2.45.8","createdAt":"2026-08-26T05:12:46.734Z","changelog":"v2.45.8","fileCount":36,"zipByteSize":135962},{"version":"2.45.7","createdAt":"2026-08-16T11:23:27.171Z","changelog":"v2.45.7","fileCount":36,"zipByteSize":135555},{"version":"2.45.6","createdAt":"2026-08-09T16:04:21.871Z","changelog":"v2.45.6","fileCount":36,"zipByteSize":135349},{"version":"2.45.4","createdAt":"2026-08-07T12:05:16.458Z","changelog":"v2.45.4","fileCount":36,"zipByteSize":133252},{"version":"2.45.0","createdAt":"2026-08-04T06:46:21.771Z","changelog":"v2.45.0","fileCount":36,"zipByteSize":131537},{"version":"2.44.0","createdAt":"2026-08-04T06:10:58.810Z","changelog":"v2.44.0","fileCount":36,"zipByteSize":127786}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s1794v2r46s8y5d1r4jdd7ec5h84rw70:git-sync","setupComplexity":"low","setupSteps":["Setup complexity is classified as HIGH. You must provision dedicated cloud infrastructure or an isolated VM. Do not run this directly on your local workstation.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"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-ldxs001-git-sync/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-ldxs001-git-sync/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-ldxs001-git-sync/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-ldxs001-git-sync/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-ldxs001-git-sync/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-ldxs001-git-sync/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-09T20:25:59.044Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-ldxs001-git-sync/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-ldxs001-git-sync/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-ldxs001-git-sync/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-ldxs001-git-sync/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":"high","updatedAt":"2026-10-09T05:01:36.015Z","emptyReason":null},"readme":"Skill: git-sync\n\nOwner: ldxs001\n\nSummary: 全平台统一发布工具。支持 skills 和 agents 的 Gitee/GitHub/ClawHub/SkillHub/PyPI 同步与 Release 创建，LLM 驱动的文件过滤与脱敏。\n\nTags: deploy:2.48.0, git:2.48.0, gitee:2.48.0, github:2.48.0, latest:2.48.0, publish:2.42.0, skill:2.42.0, sync:2.48.0, workflow:2.24.0\n\nVersion history:\n\nv2.48.0 | 2026-10-03T14:45:27.391Z | user\n\nv2.48.0\n\nv2.47.0 | 2026-10-02T16:11:01.941Z | user\n\nv2.47.0\n\nv2.45.8 | 2026-08-26T05:12:46.734Z | user\n\nv2.45.8\n\nv2.45.7 | 2026-08-16T11:23:27.171Z | user\n\nv2.45.7\n\nv2.45.6 | 2026-08-09T16:04:21.871Z | user\n\nv2.45.6\n\nv2.45.4 | 2026-08-07T12:05:16.458Z | user\n\nv2.45.4\n\nv2.45.0 | 2026-08-04T06:46:21.771Z | user\n\nv2.45.0\n\nv2.44.0 | 2026-08-04T06:10:58.810Z | user\n\nv2.44.0\n\nv2.43.1 | 2026-08-04T05:59:08.214Z | user\n\nv2.43.1\n\nv2.42.0 | 2026-08-03T16:03:10.741Z | user\n\n文档全面修正(多仓库+去特化+路径统一管理); skillhub .gitignore 备份改临时目录\n\nv2.41.0 | 2026-08-03T15:56:14.823Z | user\n\n文档全面修正(多仓库对齐+去特化+路径统一管理); skillhub 排除 .gitignore; clawhub 绝对路径\n\nv2.40.0 | 2026-08-03T12:49:51.233Z | user\n\nPyPI long_description 粘合 CHANGELOG + f-string 转义修复 + prerelease 判别\n\nv2.36.0 | 2026-07-31T12:21:07.655Z | user\n\nPyPI 发布链路 6 bug 修复(市场跳过吞PyPI/静默/隔离构建/flat-layout/缺import); dev_status 自动判别; 特化残留清除\n\nv2.35.0 | 2026-07-31T11:07:33.029Z | user\n\nv2.35.0\n\nv2.34.0 | 2026-07-30T17:05:37.811Z | user\n\nv2.34.0: 修复LLM交互死锁(QUIET_MODE吞stdout)+敏感扫描假决策→真LLM交互; 标注仅前台运行\n\nv2.33.0 | 2026-07-27T12:58:58.979Z | user\n\nv2.33.0\n\nv2.32.0 | 2026-07-21T08:24:14.057Z | user\n\nv2.32.0\n\nv2.31.0 | 2026-07-20T18:29:06.130Z | user\n\nv2.31.0\n\nv2.30.0 | 2026-07-20T18:16:11.657Z | user\n\n版本同步至2.30.0\n\nv2.29.0 | 2026-07-20T18:09:58.100Z | user\n\nv2.29.0\n\nv2.28.2 | 2026-07-16T11:58:59.167Z | user\n\nfix: PyPI long_description auto-append CHANGELOG; PEP 440 compliance\n\nv2.27.2 | 2026-07-13T06:16:23.791Z | user\n\nv2.27.2\n\nv2.28.0 | 2026-07-11T12:53:42.703Z | user\n\n修复 pypi_publish long_description 丢失, 硬编码包名和工作路径\n\nv2.27.1 | 2026-07-11T05:35:29.790Z | user\n\nv2.27.1\n\nv2.27.0 | 2026-07-10T16:22:43.156Z | user\n\npypi_publish SSH fix + wheel-only + fail-closed\n\nv2.26.6 | 2026-07-09T10:44:43.348Z | user\n\nv2.26.6\n\nv2.26.5 | 2026-07-09T10:35:51.775Z | user\n\nv2.26.5\n\nv2.26.4 | 2026-07-09T10:23:57.638Z | user\n\nv2.26.4\n\nv2.26.3 | 2026-07-09T06:52:50.853Z | user\n\nv2.26.3\n\nv2.26.2 | 2026-07-09T06:22:07.462Z | user\n\nv2.26.2\n\nv2.26.1 | 2026-07-09T06:10:15.461Z | user\n\nv2.26.1\n\nv2.24.2 | 2026-07-06T05:15:33.441Z | user\n\n修复: step_sensitive_scan HOOK-BLOCK 阻塞pipeline, 敏感扫描发现信息后自动生成LLM风格决策(公开署名keep/敏感信息sanitize), 无需 --skip-scan 无需人工介入\n\nv2.24.1 | 2026-07-02T11:48:58.844Z | user\n\n修复 _paths.py WORK_REPO 路径错误，修正为实际仓库路径\n\nv2.24.0 | 2026-06-29T09:55:51.057Z | user\n\nfeat: desensitization flow changed to LLM-decision mode: removed make_all_sanitize.py auto-fallback; scan results are HOOK-BLOCKed until LLM reviews and creates decisions file; sensitive_scan.py scans everything (including author) and lets LLM decide\n\nv2.23.2 | 2026-06-27T05:29:23.520Z | user\n\nSSH remote URL推送修复;_resolve_push_url增加SSH检测;路径集中管理_paths.py\n\nv2.21.1 | 2026-06-25T10:22:15.557Z | auto\n\n- 修复 _push_with_cred_url/pull_with_cred_url 未检测 URL 内嵌 token 的严重缺陷（remote URL 已含 token 时无需查找 git-credentials）\n- 新增 references/LICENSE.md，提供 MIT 许可证完整文本\n- 删除 skill-card.md 和 scripts/.git-sync-exclude.txt，优化文件结构\n- 提升敏感信息保护等级，权限权重从 LOW 提升为 CRITICAL，显式标记 sensitive_access\n- 精简与强化触发条件、参数限制、权限说明与数据目录规范\n- 多个脚本、文档与引导进一步完善，改善同步逻辑与安全提示\n\nv2.8.0 | 2026-06-02T02:50:06.843Z | user\n\n- Removed the redundant or outdated file skill-card.md.\n- No functional changes to the core skill logic.\n- Maintains all features and documentation structure as previous version.\n\nv2.7.3 | 2026-06-01T05:11:44.860Z | user\n\ngit-sync 2.7.3\n\n- Version bump to 2.7.3; no file changes detected.\n- SKILL.md unchanged except for version update.\n\nv2.7.2 | 2026-06-01T04:28:50.252Z | user\n\n- 修复跳过同步时状态显示为“成功”的误导性问题，现改为正确显示为“跳过”。\n- 修复和统一审计报告相关术语，提升自审粒度与准确性。\n- 增加和规范 SKILL.md 中对 AI 步骤输出格式的要求，确保包含推送状态、审计结论、ZIP 详情等关键信息。\n- 完善渐进式文件索引与标签，tags 字段新增相关标签，增强查找性。\n- 移除多余的 skill-card.md 文件，简化技能目录结构。\n\nv2.7.1 | 2026-05-30T18:43:40.886Z | user\n\n- 移除描述和正文中的部分详细修复说明，使文档内容更精简聚焦。\n- 无功能更新，仅文本精简和内容整理（如删去关于同步状态误导、术语统一说明等）。\n- 保持所有工作流程、核心能力和执行步骤说明不变。\n\nv2.7.0 | 2026-05-30T08:12:55.255Z | user\n\n## 2.7.0 (2026-05-30)\n\n### 更新\n- **skill-standardization 标准化改造**：通过 R-01~R-25 全规则审计（25/25 PASS，0 ERROR，0 WARN ✅）\n- **R-01/R-07 frontmatter 补全**：新增 `trigger` 和 `trigger_negative` 字段\n- **R-04 description 清理**：移除 description 中的版本号信息\n- **R-10 版本号去 v 前缀**：changelog.md 所有版本号改为纯数字格式\n- **R-12 数据目录规范化**：统一所有脚本的 `DEFAULT_DATA_DIR_RAW` 和 `_data_dir_abs` 定义；删除各脚本中重复的路径定义块；`DATA_DIR` 改名 `_data_dir_abs` 避免被审计二次匹配\n- **R-20 写作规范修复**：faq.md 中\"应该\"改为\"必须\"（模糊表述→确定性描述）；SKILL.md 中 `git-sync.py` → `scripts/git-sync.py`（脚本路径修正）\n\n---\n\n## 2.6.37 (2026-05-30)\n\n### 修复\n- audit --fix 自动修正\n\n---\n\n## 2.6.36 (2026-05-30)\n\n### 更新\n- **三单一致模型重写**：reference.md 中完整定义三单一致语义（同步前/同步中/同步后三段式），明确 `_meta.json` + `SKILL.md` frontmatter version 也参与三单一致，补充 `gitee_ok` / `github_ok` / `uploaded` 作为三单一致的状态标记\n- guide.md 步骤 0.7 补充三单一致前置说明\n- guide.md 步骤 4 推送记录补充三单一致语义注释\n- faq.md Q4 补充三单一致说明，Q9 补充同步前一致原则\n\nv2.6.34 | 2026-05-30T04:56:40.812Z | user\n\n- 版本号从 2.6.33 升级到 2.6.34。\n- 未检测到文件内容变更，仅为元数据版本号更新。\n- 功能、文档、描述等保持不变。\n\nv2.6.33 | 2026-05-29T20:17:22.257Z | user\n\n- 移除 scripts/skill_audit 目录及全部 8 个相关脚本文件，精简技能实现。\n- 审计流程改为内联审计（版本一致性 + R-23 脚本引用检查），不再依赖 skill_audit 脚本模块。\n- 权限声明与敏感访问级别由 CRITICAL 降为 LOW，sensitive_access 设为 false。\n- 添加 external_data_dir 声明，支持外部数据目录。\n- 其他文档与 frontmatter 信息同步调整。\n\nv2.6.29 | 2026-05-29T13:12:36.743Z | user\n\ngit-sync v2.6.29\n\n- Bumped version to 2.6.29.\n- No other content or file changes.\n\nv2.6.28 | 2026-05-29T11:43:01.132Z | user\n\n- 修复：跳过同步时状态误显示为「成功」的问题，现明确标记为「⏭️ 跳过」。\n- 其他功能与流程保持不变。\n\nv2.6.27 | 2026-05-28T17:03:45.321Z | user\n\nv2.6.27 introduces a more comprehensive output and improved error handling.\n\n- 扩展 SKILL.md 输出为完整的推送报告模板（含推送表、审计报告、ZIP 和 HTML 路径/详情）。\n- 新增：如 GitHub 推送失败（443 超时），自动询问用户是否重试。\n- 修复输出内容不完整的问题，确保推送、审计和打包信息均有体现。\n\nv2.6.26 | 2026-05-28T16:42:03.310Z | user\n\ngit-sync v2.6.26 introduces AI output instructions and improves documentation:\n\n- SKILL.md now explicitly lists required AI outputs: summary table, ZIP attachment, and preview URL.\n- Added references/guide.md as a required first step in the workflow and the essential part of the progressive loading documentation.\n- Fixed frontmatter name from . to git-sync.\n- Updated the description to mention new guidance and AI output requirements.\n- No code changes detected.\n\nv2.6.25 | 2026-05-28T11:26:08.741Z | user\n\n- 修复 normalize_meta.py 删除 triggers/created_at 字段的bug\n- 其他功能与 v2.6.24 保持一致\n\nv2.6.24 | 2026-05-28T09:36:03.116Z | user\n\n- 审计流程改为轻量内建，只检查版本一致性与R-23，不再自动修复，仅只读。\n- 修复 EXCLUDE_PATTERNS 未定义、audit_result 未初始化、返回值未接收等三个相关 bug。\n- main() 末尾新增固定格式的报告输出，包括表格、审计结论、ZIP路径和HTML路径。\n- 新增 scripts/pack_zip.py；移除 skill-card.md。\n\nv2.6.23 | 2026-05-26T12:02:59.286Z | user\n\n- 新增脚本：scripts/verify_zip.py\n- 增强对 ZIP 安装包的校验能力\n\nArchive index:\n\nArchive v2.48.0: 35 files, 140486 bytes\n\nFiles: _meta.json (128b), references/antipatterns.md (1340b), references/blueprint_rules.md (3385b), references/changelog.md (53620b), references/faq.md (5545b), references/guide.md (18002b), references/LICENSE.md (1097b), references/permissions.md (7866b), references/pypi-github-actions.yml (1654b), references/reference.md (17874b), scripts/_paths.py (5303b), scripts/blueprint_scan.py (4694b), scripts/build_index.py (4524b), scripts/clawhub_publish.py (2230b), scripts/clean_dist.py (1444b), scripts/clean_zip_source.py (3330b), scripts/get_config_value.py (545b), scripts/get_meta_desc.py (344b), scripts/get_meta_version.py (351b), scripts/git-sync.py (93000b), scripts/git-sync.sh (22877b), scripts/make_all_sanitize.py (499b), scripts/manifest.py (22170b), scripts/normalize_meta.py (3454b), scripts/pack_zip.py (3568b), scripts/permission_checker.py (41952b), scripts/release_creator.py (4192b), scripts/sensitive_scan.py (28686b), scripts/set_meta_version.py (486b), scripts/skillhub_publish.py (2317b), scripts/sync_with_exclude.py (6073b), scripts/update_readme.py (14343b), scripts/verify_zip.py (1191b), skill-card.md (1979b), SKILL.md (14633b)\n\nFile v2.48.0:SKILL.md\n\n---\r\nname: git-sync\r\nslug: git-sync\r\ndisplayName: git-sync\r\nversion: 2.48.0\r\nauthor: wUwproject\r\nlicense: MIT\r\ndescription: 全平台统一发布工具。支持 skills 和 agents 的 Gitee/GitHub/ClawHub/SkillHub/PyPI 同步与 Release 创建，LLM 驱动的文件过滤与脱敏。\r\nsensitive_access: true\r\ncritical_write: false\r\npermission_weight: CRITICAL\r\ndata_dir: ../.standardization/git-sync/data\r\ntags: ['sync', 'git', 'gitee', 'github', 'deploy']\r\nexternal_data_dir: true\r\ntrigger: 同步/推送/发布/上传/打包/更新 READ ME\r\ntrigger_negative: 只是看文件/通用 git 提交/文件同步到云端\r\nh1_version: true\r\nmeta_field_sync: true\r\ncreate_permissions_md: true\r\nh1_position: true\r\ndata_dir_compliance: true\r\n---\r\n# git-sync — 全平台发布工具\r\n\r\n将 skill/agent 代码规范化推送到**码云（Gitee）**、**GitHub**，并支持 **ClawHub**、**SkillHub**、**PyPI** 发布与 **Release 创建**。\r\n\r\n## 约束\r\n\r\n- **让位式 LLM 交互（v2.43.0）** — git-sync 包含两处 LLM 决策点（文件筛除、敏感脱敏），采用**让位式握手**：遇到决策点时写 resume 状态文件 + `exit 3` 退出，把控制权交还调用方（AI 助手）。调用方写入决策文件后**重跑同一命令**，git-sync 检测 resume 从当前环节续跑，不从头开始。**不再进程内轮询等待**（旧版 v2.42.0 的 120s 轮询会占用控制权导致卡死，已废弃）\r\n- **断点续跑** — `resume_{name}.json` 记录让位环节（`file_filter` / `sensitive_scan`），重跑时跳过已完成步骤。决策消费成功后 resume 自动清除\r\n- **⚠️ 决策文件必须用 `_paths.py` 路径函数写入 + 全流程一条命令（v2.45.6 实战教训，铁律）** — LLM 决策文件（`file_filter_{name}.decisions.json` / `sensitive_scan_{name}.decisions.json`）**必须**在 git-sync 脚本环境下通过 `from _paths import temp_filter_decisions_path / temp_scan_decisions_path` 写入并验证 `exists()`；**让位 → 写决策 → 重跑必须放在同一条 Bash 命令里一次跑完**（拆成多条命令时 temp 文件跨命令被重建/清理，必现\"文件存在却读不到\"→ 反复让位 exit 3 死循环，2026-08-09 git-sync 自推送重试 N 次证实）。**严禁用 Write 工具或跨进程硬编码路径写入**。完整写法见 `references/guide.md` 步骤 3.7 / 4.5 警示框\r\n- **自动检测类型** — 自动识别 skill（`_meta.json`）或 agent（rglob 扫描含 `__version__` 的 `__init__.py`，任意包目录名均可，不硬编码），分别走不同发布流程\r\n- **`all` 模式** — `git-sync all` 遍历配置的全部仓库项目（默认 skill 仓库 + agent 仓库，仓库名/路径由 `config.json` 的 `repos` 注册表决定）\r\n- **网络依赖** — 推送 Gitee/GitHub/ClawHub/SkillHub/PyPI 需要可用网络连接，超时阈值 60 秒\r\n- **冲突不自动合并** — git merge 冲突需人工介入\r\n- **多仓库模型（v2.37.0）** — 按项目类型解析目标仓库：`get_repo_name(type)` 从 `config.json` 的 `repos` 注册表匹配（`type` 字段：skills/agents），未配置时用默认名（skill→`maby_skills`、agent→`maby_agent`）。仓库本地路径、双平台 remote、README 文案全在注册表条目中声明，**用户按需配置，技能本身通用**\r\n- **参数约束** — 项目名不含路径分隔符，version 格式严格 x.y.z\r\n- **仓库规模** — 支持 1-50 个项目，每个 ≤ 500MB\r\n- **数据持久性** — manifest.json 记录同步状态，不备份远程仓库数据\r\n\r\n## 触发条件\r\n\r\n**正向触发：**\r\n- 「同步/上传/推送/发布某个 skill 或 agent」\r\n- 「全量同步/全部发布」\r\n- 「发布到 ClawHub/SkillHub/PyPI」\r\n- 「创建 Release」\r\n- 「打包/更新 README.md」\r\n- 「检查版本号」\r\n\r\n**否定条件：**\r\n- 用户只是说「帮我看看这个文件」——没有同步/打包意图\r\n- 用户要求「用 git 提交代码」——这是通用 git 操作，不是本技能\r\n\r\n## 核心能力\r\n\r\n> 📚 **渐进式加载**：本技能采用渐进式 MD 体系，`SKILL.md` 为入口（≤230行），详细内容拆分到 `references/*.md` 按需加载。\r\n\r\n- **全平台发布** —— Gitee + GitHub + ClawHub + SkillHub + PyPI，一次同步全自动\r\n- **类型自动识别** —— skill（`_meta.json`）/ agent（`__init__.py`），版本号各自读取\r\n- **路径统一管理（`_paths.py`）** —— 所有路径变量（技能目录、数据目录、仓库路径、临时目录等）在 `scripts/_paths.py` 统一定义，其他脚本一律 `from _paths import ...` 引用，不各自写死；仓库路径由 `config.json` 的 `repos` 注册表配置，`get_work_repo(type)` 动态解析\r\n- **路径由 manifest 统一管理** —— 每个条目记录 `source_path`（源路径）+ `repo_path`（仓库内路径），skill 和 agent 统一走同一套逻辑\r\n- **`all` 批量模式** —— 遍历全部 skills 和 agents 逐个同步\r\n- **LLM 文件过滤（让位式）** —— 同步前扫描源文件 → 全量打印文件列表 + 规则 → **写 resume 状态 + exit 3 让位** → 调用方（AI 助手）写 `file_filter_{name}.decisions.json` 决策 → 重跑续跑 → 只复制允许的文件\r\n- **LLM 脱敏（强制，让位式）** —— 同步后强制脱敏敏感信息（邮箱/token/路径/本地路径），无跳过选项。扫描发现敏感信息后 **exit 3 让位**，调用方写 `sensitive_scan_{name}.decisions.json` 后重跑，从脱敏环节续跑（不重复文件过滤与同步）\r\n- **版本号三方对比** —— `_meta.json` / `SKILL.md` frontmatter / changelog\r\n- **SKILL.md 规范审查** —— 内联审计（版本一致性 + R-23 脚本引用检查）\r\n- **ZIP 打包 + HTML 索引** —— 生成安装包 + 可视化索引页\r\n- **PyPI 隔离构建** —— 拷贝源码到临时目录 → 生成 setup.py → build → twine 上传，版本号自动归一化 PEP 440，dev_status 按定稿规则判别：主版本号 <1 → Beta；≥1 时纯 x.y.z 为 Production/Stable、跟随 b（x.y.zbn）为 Beta（rc/alpha/dev 已废弃）\r\n- **Release 创建** —— git tag + GitHub/Gitee API Release（技能用 `{name}-v{ver}`，智能体用 `v{ver}`），源码包由平台自动生成\r\n\r\n### 平台发布差异\r\n\r\n| 平台 | 版本读取源 | 命令/工具 | 注意事项 |\r\n|------|-----------|-----------|---------|\r\n| Gitee | `_meta.json` (skill) / `__init__.py` (agent) | `git push` | SSH/HTTPS 凭证自动解析，支持 pull --rebase 重试 |\r\n| GitHub | 同上 | `git push` | 同 Gitee，443 超时常见，会 retry |\r\n| ClawHub | `_meta.json` 的 slug/version/tags | `npx clawhub publish <绝对路径>` | **必须传绝对路径**（相对路径 `./name` 在 npx 下 resolve 失败报 \"Path must be a folder\"）；API 成功时 CLI 可能误报 `invalid value`（已知 bug），检查 `ok` 关键字即可 |\r\n| SkillHub | **必须传 `--version`**（单独读取 SKILL.md frontmatter 不可靠） | `skills_store_cli.py publish` | 不加 `--version` 可能读到旧版本导致发布失败 |\r\n| PyPI | `__init__.py` 的 `__version__` | 隔离构建 → `twine upload --disable-progress` | Windows 上 twine 的 Rich 进度条有 GBK 编码 bug，必须加 `--disable-progress` |\r\n| Release | 同步后当前版本 | `git tag` + GitHub API | tag 格式: skill=`{name}-v{ver}`, agent=`v{ver}`\r\n\r\n### 渐进式文件索引\r\n\r\n| 文件名 | 分类 | 包含内容 | 审计关联 |\r\n| -------- |------| ---------- |----------|\r\n| `references/LICENSE.md` | 许可协议 | 开源许可证声明（MIT）。包含：MIT 许可证完整文本。 | R-26 |\r\n| `references/antipatterns.md` | 规范指南 | skill 编写中的常见反模式。包含：错误做法示例、正确做法示例、避坑指引。 | R-18 |\r\n| `references/changelog.md` | 版本管理 | 版本更新日志。包含：版本号、更新类型、修复项、升级说明。 | R-24 |\r\n| `references/faq.md` | 常见问题 | 常见疑问与解答。包含：问题分类、原因分析、解决方案。 | R-19, R-25 C-19 |\r\n| `references/guide.md` | 使用指南 | 三种执行模式操作教程。包含：audit/create/refactor 流程、参数说明、注意事项。 | 无 |\r\n| `references/permissions.md` | 权限与测试 | 权限扫描说明与测试结论。包含：风险等级、高权限操作说明、测试概览、计时统计。 | R-15, R-16 |\r\n| `references/reference.md` | 命令参考 | CLI 完整命令参考。包含：所有参数、子命令、选项、示例用法。 | 无 |\r\n| `references/blueprint_rules.md` | 判断规则 | 蓝图排除/脱敏判断规则。包含：筛除原则、脱敏原则、判定流程。 | 无 |\r\n\r\n| 能力 | 说明 | 限制 |\r\n|------|------|------|\r\n| **全平台同步** | 将 skill/agent 同步到码云、GitHub、ClawHub、SkillHub、PyPI | 按 skill/agent 逐个同步，支持 `all` 批量模式 |\r\n| **版本号三方对比** | 自动对比 _meta.json / SKILL.md frontmatter / changelog 的版本一致性 | 仅检测 x.y.z 格式版本号，不处理其他格式 |\r\n| **敏感信息过滤** | 自动扫描并脱敏 secrets/regex/telemetry | 扫描范围限于 skill 目录，不扫描系统目录 |\r\n| **SKILL.md 规范审查** | 内联审计版本一致性 + R-23 脚本引用检查 | 仅做静态文本分析，不验证运行时行为 |\r\n| **ZIP 打包 + HTML 索引** | 生成安装包 + 可视化索引页 | 打包前需先同步到 workrepo |\r\n\r\n**不支持：**\r\n- 通用 git 提交：本技能专注于 skill/agent 仓库同步，通用 git 操作由用户手动完成\r\n- merge 冲突解决：遇到 git merge 冲突时不会自动合并，需要用户手动处理\r\n\r\n## 快速开始\r\n\r\n> ⚠️ **执行入口**：环境无 `rsync` 时（如部分 Windows Git 环境），`git-sync.sh` 会自动切换到 Python 完整流程。**直接调用 `python git-sync.py` 与 `bash git-sync.sh` 效果相同**，推荐直接使用 Python 入口。\r\n\r\n**场景：推送技能到双平台**\r\n用户需求：skill-name=novel-weaver, 当前版本=1.35.4, 目标版本=1.36.0\r\n系统执行：\r\n```bash\r\npython \"$SKILLS_DIR/git-sync/scripts/git-sync.py\" novel-weaver\r\n```\r\n系统输出：[1/8] 触发判断 → 继续\r\n[2/8] 安全校验 → 通过\r\n[3/8] 清单检查 → 升级至 1.36.0\r\n[4/8] 文件同步 → 已复制 47 个文件\r\n[5/8] 敏感信息脱敏 → 2 处已替换\r\n[6/8] 更新 README → 新增 1 条\r\n[7/8] 提交推送 → Gitee ✅ / GitHub ✅\r\n[8/8] 打包索引 → .zip 已生成\r\n最终输出: 码云 ✅ / GitHub ✅ → 版本 1.36.0 已同步\r\n\r\n**场景：仅打包不推送**\r\n用户需求：skill-name=git-sync, 当前版本=2.40.0, --pack-only 标志\r\n系统执行：\r\n```bash\r\npython \"$SKILLS_DIR/git-sync/scripts/git-sync.py\" git-sync --pack-only\r\n```\r\n系统输出：[1/8] 触发判断 → 继续（--pack-only 跳过推送）\r\n[4/8] 文件同步 → 已复制 22 个文件\r\n[8/8] 打包索引 → .dist/git-sync-v2.40.0.zip 已生成（45.2 KB，22 文件）\r\n最终输出: .dist/git-sync-v2.40.0.zip 已生成\r\n\r\n**场景：仅推送不打包**\r\n用户需求：skill-name=workday-calendar, 当前版本=2.2.0, 目标版本=2.2.1, --push-only 标志\r\n系统执行：\r\n```bash\r\npython \"$SKILLS_DIR/git-sync/scripts/git-sync.py\" workday-calendar --push-only\r\n```\r\n系统输出：[1/8] 触发判断 → 继续\r\n[2/8] 安全校验 → 通过\r\n[3/8] 清单检查 → 升级至 2.2.1\r\n[4/8] 文件同步 → 已复制 31 个文件\r\n[5/8] 敏感信息脱敏 → 0 处\r\n[6/8] 更新 README → 无变化\r\n[7/8] 提交推送 → 码云 ✅ / GitHub ✅\r\n[8/8] 打包索引 → 跳过（--push-only）\r\n最终输出: 码云 ✅ / GitHub ✅ → 版本 2.2.1 已同步\r\n\r\n## 工作流程\r\n\r\n1. **触发判断** → 输入 用户请求文本 → 输出 触发决策（继续/拒绝） — 解析用户请求，判断是否为同步/推送/打包意图\r\n2. **安全校验** → 输入 目标路径 + skill 名称 → 输出 校验通过/拒绝 — 检查目标路径合法性、skill 名称白名单\r\n3. **清单检查 + 路径解析** → 输入 manifest.json → 输出 同步状态 — 读取 manifest 条目获取 source_path/repo_path，无则按 type 走默认路径\r\n4. **版本号对比** → 输入 仓库版本 v.s. 本地源文件 → 输出 升级/跳过/冲突 — 读取 `_meta.json`（skill）或 `__init__.py`（agent），版本号自动归一化 PEP 440\r\n5. **LLM 文件过滤** → 输入 源目录 → 输出 允许文件列表 — 扫描源目录 → 全量打印文件列表 + 决策路径 → **写 resume（phase=file_filter）+ exit 3 让位** → 调用方写 `file_filter_{name}.decisions.json` 后重跑，从本环节续跑 → 只复制允许的文件到 workrepo\r\n6. **敏感信息脱敏（强制）** → 输入 工作仓库文件 → 输出 脱敏后的副本 — 扫描邮箱/token/IP，发现敏感信息则 **exit 3 让位**，调用方写 `sensitive_scan_{name}.decisions.json` 后重跑。**断点续跑**：resume.phase=sensitive_scan 时跳过文件过滤与同步，直接从脱敏环节继续\r\n7. **更新 README** → 输入 workrepo → 输出 更新后的 README.md — 按仓库类型全量扫描（skill 仓库扫技能目录、agent 仓库扫智能体目录），重新生成 README.md（技能表格 + 智能体表格）\r\n8. **提交推送** → 输入 提交信息 → 输出 推送状态 — git add/commit/push 到码云 + GitHub\r\n9. **ZIP 打包** → 输入 技能目录 → 输出 .zip 文件 + index.html — 将 skill 目录打包为 .zip（仅 skill，agent 跳过）\r\n10. **市场发布**（可选）→ ClawHub / SkillHub（skill）/ PyPI（agent + `--pypi`）\r\n11. **创建 Release**（`--release` 标志）→ 打 tag + 推双平台 + 创建 GitHub Release + Gitee 发行版，源码包由平台自动生成\r\n\r\n## 数据目录说明\r\n\r\n本技能的数据文件存放在技能安装目录的标准化子目录下（实际路径以 `$SKILLS_DIR` 为准）：\r\n```text\r\n$SKILLS_DIR/.standardization/git-sync/\r\n├── data/\r\n│   ├── config.json     # 平台配置（repos 注册表、用户名、仓库名、gitee_token 等）\r\n│   └── manifest.json   # 技能同步状态清单（按 repos 组织条目）\r\n└── backup/             # 改造/更新前的自动备份\r\n```\r\n安装目录 `$SKILLS_DIR/git-sync/` 只保留 SKILL.md 和 scripts/。\r\n\r\n> 📚 **渐进式加载**：本技能采用渐进式 MD 体系，`SKILL.md` 为轻量入口（≤230行），详细内容拆分到 `references/*.md` 按需加载。完整文件清单见「核心能力 → 渐进式文件索引」表格。\n\nFile v2.48.0:_meta.json\n\n{\n  \"ownerId\": \"kn75zfd51df61ajdyqtgvrs1hx84s4q6\",\n  \"slug\": \"git-sync\",\n  \"version\": \"2.48.0\",\n  \"publishedAt\": 1791038727391\n}\n\nFile v2.48.0:references/antipatterns.md\n\n# git-sync 反模式\r\n\r\n常见错误和注意事项，避免误用本技能。\r\n\r\n## 反模式列表\r\n\r\n### 1. 盲目全量同步\r\n\r\n**错误做法：**用户只是提了一下某个 skill，就自动触发全量同步。\r\n\r\n**正确做法：**除非用户明确说\"全量维护\"/\"同步所有\"，否则只同步指定的 skill。\r\n\r\n### 2. 忽略敏感信息扫描\r\n\r\n**错误做法：**跳过敏感信息扫描，直接同步推送。\r\n\r\n**正确做法：**同步前必须运行敏感信息扫描，防止 Token/邮箱/路径泄露。\r\n\r\n### 3. 版本号不一致\r\n\r\n**错误做法：**`_meta.json`、SKILL.md frontmatter、`references/changelog.md` 三端版本号不一致（漏改任何一端会导致 SkillHub 拒绝发布或版本混乱）。\r\n\r\n**正确做法：**三端版本号必须一致（`_meta.json` 为唯一源，bump 顺序：先改 `_meta.json` → SKILL.md version 行 → changelog 加条目），每次更新时同步更新。\r\n\r\n### 4. 跳过规范审查\r\n\r\n**错误做法：**同步前不检查 R-01~R-26 合规性。\r\n\r\n**正确做法：**同步前自动检查 R-01~R-26 合规性，虽然不阻断同步，但应关注警告。\r\n\r\n### 5. 忘记更新 manifest.json\r\n\r\n**错误做法：**同步后不更新清单状态标记。\r\n\r\n**正确做法：**同步后必须更新清单状态标记，保持三单一致。\n\nFile v2.48.0:references/blueprint_rules.md\n\n# 蓝皮书判断规则\n\n## 筛除原则\n\n你需要从 blueprint.json 的 `files` 和 `tree` 中筛选出哪些内容**不应**进入公开仓库。\n\n### 必须保留（核心功能）\n\n技能的功能性文件：用户安装该技能后，SKILL.md 中引用的脚本、文档、配置文件、资源文件等直接参与功能实现的文件。\n\n包括但不限于：\n- `scripts/`、`references/`、`assets/` 等目录下的文件\n- `SKILL.md`、`_meta.json` 等技能元数据文件\n- 技能运行所依赖的配置文件（需脱敏后保留）\n\n### 必须筛除（非核心）\n\n任何**不直接影响技能核心功能运行**的内容都应筛除：\n\n- **工作区临时文件**：AI 工作目录产生的缓存、日志、临时数据\n- **编译/构建产物**：`__pycache__/`、`build/`、`dist/`、`*.pyc`、`*.pyo`\n- **IDE/编辑器配置**：`.vscode/`、`.idea/` 等仅服务于开发环境的目录\n- **系统元数据**：`.DS_Store`、`Thumbs.db`\n- **非技能标准目录**：不属于技能规范定义的目录结构\n\n注意：隐藏目录（以 `.` 开头）**不自动等于应筛除**。比如 `.github/` 如果是 CI 配置则应保留。判断依据是\"是否为核心功能所需\"，而非\"是否隐藏\"。\n\n### 判定流程\n\n1. 读 blueprint.json 的 `tree`，标记每个目录为\"保留\"或\"筛除\"\n2. 对\"保留\"目录下的 `files`，逐项复核：\n   - 文件是否被 SKILL.md 直接或间接引用 → 保留\n   - 文件是否为标准技能结构的一部分（scripts/、references/）→ 保留\n   - 文件是否明显为临时/缓存/构建产物 → 筛除\n3. 输出 `exclude_list.json`：{ \"type\": \"dir\" | \"file\", \"path\": \"相对路径\" }\n\n---\n\n## 脱敏原则\n\n对于需要保留的文件，逐项判断 blueprint.json `samples` 中的内容是否需要脱敏。\n\n### 必须脱敏\n\n以下内容必须脱敏：\n\n- **个人真实信息**：真实姓名（非笔名/代名）、身份证号、手机号、银行卡号\n- **凭据**：API Token、密码、密钥、私钥\n- **本地路径**：包含用户名或机器名的绝对路径（如 `C:\\Users\\实际用户名\\`、`/home/实际用户名/`）\n- **联系信息**：个人邮箱地址（非公开业务邮箱）\n- **内网地址**：内网 IP、内网域名、私有仓库地址\n\n### 不应脱敏\n\n功能性内容：\n\n- **代名/署名**：技能的公共作者名（如 `[username-redacted]`、`[username-redacted]`）\n- **公开仓库地址**：GitHub/Gitee 等公开平台的仓库链接\n- **配置模板示例**：`api_key = \"your-api-key\"` 这种明显是模板的\n- **技术内容**：代码逻辑、函数调用、数据结构定义\n- **版本号/依赖名**：pip 包名、npm 包名、版本号\n\n### 脱敏方式\n\n- **路径**：只替换\"标识用户/机器身份的前缀\"，保留功能后缀\n  - `C:\\Users\\USERNAME\\skills\\novel-weaver\\...` → `[LOCAL_PATH]\\skills\\novel-weaver\\...`\n- **凭据**：替换为 `[REDACTED]`\n  - `token = \"abc123\"` → `token = \"[REDACTED]\"`\n- **邮箱**：替换为 `[EMAIL]`\n  - `[email-redacted]` → `[EMAIL]`\n- **真实姓名**：替换为 `[NAME]`\n  - 仅替换非笔名的真实姓名\n\n### 判定流程\n\n1. 遍历 blueprint.json `files[].samples`\n2. 逐条判断是否属于\"必须脱敏\"类别\n3. 是 → 记录到 `sanitize_list.json`：{ \"file\": \"相对路径\", \"line\": N, \"original\": \"原文\", \"replacement\": \"占位符\" }\n4. 否 → 跳过\n\nFile v2.48.0:references/changelog.md\n\n## [2.48.0] - 2026-10-03\n\n### 修复（GitHub Release 从未打上——token 来源只认 HTTPS URL 内嵌）\n\n- **现象**：maby_agent 双平台 tag 全部到位，但 GitHub Releases 页只有 v1.0.0/v1.3.0 两条旧记录，structured-writer v3.1.10-3.1.14 全系没有 GitHub Release；每次发布日志仅一行 \"tag 已推送\" warn。\n- **根因**：`step_release_create` 的 GitHub token 只从 `git remote get-url origin` 的 HTTPS 内嵌格式（`https://user:token@...`）解析；maby_agent 的 origin 为 SSH（`ssh://[email-redacted]:443`）→ token 恒空 → GitHub Release 分支静默跳过。Gitee 能打上仅因 gitee_token 独立存于 config。\n- **修复①（token 三级 fallback）**：`config.github_token` → `git credential fill`（credential.helper，SSH 远端下唯一可用）→ origin HTTPS URL 内嵌；三级全空才跳过。\n- **修复②（fail-loud）**：GitHub Release 创建失败打 `err` 并带 200 字符响应原文；`already_exists` 单独 info 分支；无 token 时 `err` 明确点名三级来源均未命中——不再一行 warn 静默带过。\n- **验证**：importlib 直调 `step_release_create('structured-writer','agent','3.1.14')`（tag 已存在）→ LOG_BUFFER 输出「GitHub Release 已存在」= token 解析 + API 调用 + 分支判定全链路通；v3.1.10-3.1.14 五个 Release 补发成功。\n\n## [2.47.0] - 2026-10-02\n\n### 修复（9 处隐患审查落地，P0 全修）\n\n- **同步保险丝（P0①，structured-writer 3.1.10 删库事故根因）**：`sync_files` 清空目标目录前先计算 allow 集合与源树的交集，零交集（allow 为空/格式错/路径全部无效）→ `SystemExit(2)` 拒绝 `rmtree`——工作仓不再可能被空同步整目录删除后推送到双平台。\n- **陈旧决策守卫（P0②，静默漏脱敏洞）**：脱敏决策消费前校验——决策必须覆盖本次扫描发现的全部文件、值必须为 keep/sanitize/custom；不满足（陈旧/损坏/覆盖不全）→ 清除决策文件并重新让位，绝不静默应用。此前 `cmd_apply` 遍历 decisions 而非 findings，扫描新增的敏感文件会被静默放过直接上公共仓。实证：TEMP 中 svg-composer 决策文件滞留 61 天仍会被消费。\n- **决策值非法 fail-closed（P0②配套）**：`cmd_apply` 遇到非 keep/sanitize/custom 的决策值 → 打印错误并 `sys.exit(2)`，不再静默跳过且不计入审计统计。\n- **扫描详情显示命中原文（P0③，wUwproject 公开署名误脱敏根因）**：决策详情两处（消费分支与让位引导）均打印 `match` 实际命中文本（截断 40 字符）——决策者不再需要猜测\"用户名\"到底是本地账户（sm001，应脱敏）还是公开署名（wUwproject，应保留）。\n- **上传错误信息修复（P0④）**：PyPI/ClawHub/SkillHub 失败信息改为 `(stdout+stderr)` 合并取尾部——twine 的报错走 stdout，此前 `stderr[:200]` 恒为空（structured-writer 3.1.10 的 400 file-name-reuse 错误只能手动 verbose 才能拿到）。\n- **包目录检测 fail-closed（P0⑤）**：删除 `pkg_dir = pkg_dir or \"rag_assistant\"` 硬编码回退与候选列表中的 rag_assistant 首位——build 目录中找不到含 `__init__.py` 的包目录即报错终止，不再对非 rag-assistant 项目伪造错误包名。\n- **无变更不再假失败（P2⑥）**：无变更可提交时返回 `(True, True)`，manifest 正确记为已上传，summary 不再显示\"推送失败\"假象。\n- **agent 审计结论去误导（P2⑧）**：agent 无 SKILL.md 时审计结论显示\"跳过（agent 无 SKILL.md，SKILL.md 审计不适用）\"，不再显示\"未执行或执行失败\"。\n\n### 回归（真实目录/子进程实测）\n\n- 保险丝：空 allow → SystemExit(2) 且目标目录完好 / 正常 allow 只复制允许文件 / 零交集拦截，3 用例 PASS。\n- apply：非法决策值(123) → rc=2 报错 / 合法 sanitize → rc=0 内容替换，2 用例 PASS。\n- scan：输出含 match 原文 PASS（example.com 空 result 为 RFC 2606 保留域名有意豁免，非漏报）。\n\n### 架构修复：PyPI 作者元数据去硬编码（v2.47.0 折进）\n\n- **根因**：setup.py 模板硬编码作者名与邮箱（工具作者的个人信息写死在源码里）——工具源码要上公共仓与源码含个人信息天生冲突（脱敏强制 vs 发布元数据），且对第三方用户而言发布的 wheel 里填的是别人的作者。\n- **修复**：作者身份属于被发布项目而非发布工具。模板改占位符，构建时按优先级注入：被发布项目 pyproject.toml 的 `[project].authors`（PEP 621，项目权威源，读 src_dir——build_dir 的 pyproject 随后被覆盖为 build-system-only）→ config.json 的 author/email（本地用户配置，与 git commit 同一字段，单一来源）→ 空串（PyPI 合法）。\n- 工具源码从此零个人信息：脱敏扫描不再命中 git-sync.py，自推送不再被硬约束拦截。\n\n### 清理\n\n- TEMP 陈旧决策/扫描残留：svg-composer 决策（61 天）、podcast-maker 决策 .bak（12 天）、manual_scan×2（63 天）、_preview_scan（12 天）。\n\n## [2.46.2] - 2026-09-17\n\n### 修复\n\n- **agent 版本号被过程残留污染**：agent 版本读取对源目录全量 rglob `__init__.py`，`_smoke/` 等下划线过程目录与 `.venv` 内第三方包的自带 `__version__` 先被 sorted 命中，podcast-maker 首跑读出 1.15.0（本地真值 0.12.2），wheel 文件名对不上后静默跳过上传，PyPI 假装成功。修复：优先命中与智能体同名的包目录，其余扫描跳过 `_` 开头目录与虚拟环境。\n- **wheel 缺失静默跳过上传**：构建产物与预期 wheel 名不符时 `if whl.exists()` 无 else 分支，上传步骤静默消失。修复：缺失即报错退出，不再假成功。\n- **`__init__.py` 注释毒化版本读取**：podcast-maker 的 `__init__.py` 说明注释含 `__version__ = \"x.y.z\"` 字面量示例，正则先命中注释把版本读成 x.y.z，触发仓库/本地版本冲突守卫静默 exit(1)。已改注释措辞避开赋值形态。\n\n### 变更\n\n- **PyPI 构建源改用仓库精选副本**：agent 的 PyPI 打包源从源目录改为 work 仓库副本（allowlist 已过滤过程文件），避免把 8.4G 过程残留拷进构建。\n\n## [2.46.1] - 2026-09-17\n\n- **修复：PyPI long_description 粘合正则双层转义（渲染实测暴露）**：现象——模板中 `{BS}\\[?` 经 f-string 渲染成 `\\\\[?`，正则要求版本标题含字面反斜杠（`## \\[2.46.0]`），现实更新日志（`## [2.46.0]`）永远不匹配，「更新说明」区块静默不追加；2.45.8 的验证测的是手写正则而非渲染后 setup.py 里的真身，故当时未暴露。修复——删去 `\\[?`/`\\]?` 前多余 `{BS}`。验证——改为对渲染后模板实际生成的正则跑 6 用例（方括号头/裸版本头/v 前缀头/方括号内 v/日期行/版本不存在负例）全 PASS，并以 git-sync 自身与 podcast-maker 两份真实 CHANGELOG 实测命中\n- **新增：粘合正则兼容 v 前缀版本头**：`## v0.12.2`、`## [v0.3.1b1]` 等形态此前均无法命中；`v?` 移至 `\\[?` 之后，方括号内外两种 v 位置通吃\n\n\n- **变更：PyPI 开发状态判定规则定稿** — 原判别只看 PEP 440 预发布后缀（a/beta/rc/dev → Beta），0.x 正式版（如 0.12.2）被标 Production/Stable，与「0.x 即初始开发阶段」的定位不符。定稿规则：主版本号 <1 → `4 - Beta`（与后缀无关）；主版本号 ≥1 → 纯 x.y.z 为 `5 - Production/Stable`、跟随 b（x.y.zbn）为 `4 - Beta`。实现收敛为独立函数 `_pypi_dev_status()`，11 场景验证全 PASS（0.12.2/0.2.6b0/1.1.0b0/3.0.0b9/1.7.0-beta 判 Beta，1.1.0/2.45.8 判 Stable）\n- **变更：rc/alpha/dev 预发布形式废弃** — 版本方案收敛为 x.y.z 与 x.y.zbn 两种，b 是唯一支持的预发布形式。`_normalize_version()` 删除 rc/alpha/dev 的 PEP 440 转换分支（1.7.0-beta → 1.7.0b1 保留）；废弃后缀无论有无分隔符一律剥除（1.7.0-rc1/1.7.0alpha2/1.0.0.dev1 → 1.7.0/1.0.0）——连写形态原样发上 PyPI 会被解析成预发布而错标状态，剥完与正式版同号则撞号报错，宁可撞号也不误发\n- **删除：死代码清理** — git-sync.py 内旧版 `step_pypi_publish`（第一次定义被第二次定义整体覆盖，从未执行，约 34 行）；scripts/pypi_publish.py 独立发布器（全仓 grep 无调用者，setup.py 模板与主脚本双份实现，2.45.x 曾两度修它的构建 bug，正式退役）\n\n## [2.45.8] - 2026-08-26\n\n- **修复：PyPI long_description 粘合双缺陷（silprespec-emulator 发布时暴露）**：现象——PyPI 描述只有 README、缺「更新说明」区块（0.2.6b0/0.3.1b0 均 1727 字符无更新说明）；根因①粘合正则语法错误（ 字符类未闭合、 吞掉闭合符）必然 re.error 崩溃，②manifest 登记 type/source_path 错误时 src_dir 指向无 CHANGELOG.md 的残留目录，粘合段被 os.path.exists 提前跳过；修复——正则改为 （兼容带方括号  与不带方括号  两种版本行格式，终止于下一个 ## 行或文件尾），manifest 条目修正（type=skill→agent、source_path→独立源、repo_path 去 skills/ 前缀）；验证——三份 CHANGELOG（silprespec/rag/sw 两种格式）正则全部正确匹配，silprespec-emulator 0.3.1b1 发布后 PyPI 描述 1727→5372 字符、含「更新说明」区块\n\n## [2.45.7] - 2026-08-16\n\n- **修复：`source_overrides` 的 agent 类型识别通用化**：原逻辑硬编码检查 `override_dir / \"rag_assistant\" / \"__init__.py\"`（只认 rag-assistant 一个包名），structured-writer（包目录 `structured_writer`）经 source_overrides 指定源路径时无法识别为 agent，报\"路径存在但无法识别类型\"。改为通用检测：`override_dir.rglob(\"__init__.py\")` 中任意子目录 `__init__.py` 含 `__version__` 即判为 agent——支持任意包目录名。实战：structured-writer v3.0.0b9 首次经 git-sync 推送 maby_agent 仓库（Gitee ✅）\n\n## [2.45.6] - 2026-08-10\n\n- **文档强化：明确\"全流程一条命令\"铁律（git-sync 自推送实战再次验证）**：v2.45.5 只写了\"决策文件用 _paths 路径函数写入\"，但漏了最关键的根因——**让位 → 写决策 → 重跑必须放在同一条 Bash 命令里一次跑完**。2026-08-09 git-sync 自推送时拆成多条命令导致 scan/resume 文件跨命令消失（git-sync 每次运行重建/清理 temp），反复\"文件存在却读不到\"重试 N 次；合并为一条命令后一次通过。SKILL.md 约束升级为 v2.45.6 铁律，guide.md 步骤 3.7/4.5 警示框补充一条命令的完整 bash 写法与拆命令反例\n\n## [2.45.5] - 2026-08-09\n\n- **文档：固化 LLM 决策文件写入规范（2026-08-09 rag-assistant 推送实战教训）**：决策文件（`file_filter_{name}.decisions.json` / `sensitive_scan_{name}.decisions.json`）必须用 `_paths.py` 路径函数在 git-sync 脚本环境下写入并验证 `exists()`，严禁用 Write 工具或跨进程硬编码路径写入（沙箱隔离导致\"文件存在却读不到\"→ 反复让位 exit 3 死循环）。SKILL.md 约束新增警示条目，guide.md 步骤 3.7/4.5 新增详细警示框（含正确/错误写法对比）\n\n## [2.45.4] - 2026-08-07\n\n- step_pypi_publish copytree 排除 Windows 保留设备名（nul/con/prn/aux）与 .git，修复构建失败（WinError 87/5）\n\n## [2.45.3] - 2026-08-07\n\n- setup.py 模板新增 project_urls（GitHub/Gitee/Documentation 三链接），PyPI 页面 Project Links 显示双平台仓库链接\n\n\n## [2.45.2] - 2026-08-06\n\n### 修复：pypi_publish.py 独立脚本 2 个构建 bug（structured-writer 1.6.0b0 发布时暴露）\n\n- **多顶层包构建被拒**：pypi_publish.py copytree 保留项目自带 pyproject.toml，setuptools 自动发现命中 `data/` + `structured_writer/` → `Multiple top-level packages` 拒绝构建。**修复**：隔离构建目录覆盖写固定 build-system 的 pyproject.toml（与 git-sync.py 内联 step_pypi_publish 一致）\n- **模板 `\\n` 转义错误**：SETUP_PY_TEMPLATE 里 `LONG_DESC += \"\\n\\n---...\"` 的 `\\n` 在模板解析时变成真实换行 → 生成 setup.py 语法错误 `unterminated string literal`。**修复**：写成 `\\\\n`（模板双反斜杠，生成时单反斜杠）\n- **验证**：structured-writer 1.6.0b0 → PyPI `structured-writer-ldxs` 1.6.0b0 上传成功（releases 列表确认 whl）\n- **教训**：独立脚本与主脚本（git-sync.py step_pypi_publish）存在模板双份实现，前者是遗留旧版——发布异常时优先排查双份实现的差异；模板内所有字面 `\\n` 必须双写\n\n## [2.45.1] - 2026-08-06\n\n### 修复：PyPI 发布链路 2 个 bug（structured-writer v1.5.0 发布时暴露）\n\n- **PyPI token 读取错误**：pypi_publish.py 打印声称\"尝试 ~/.pypirc\"，实际代码从\n  GitHub remote 提取 token（`https://user:[email-redacted]/...`）当 PyPI 凭证——\n  GitHub token（`gho_*`）与 PyPI token（`pypi-*`）类型不符，上传必失败；且\n  .pypirc 的 password 从未被读取。**修复**：优先读 `~/.pypirc` 的 `[pypi] password`\n  （PyPI 官方凭证），其次 `PYPI_TOKEN` 环境变量，移除 GitHub remote 提取逻辑\n- **step_pypi_publish NameError**：setup.py 模板内联 `{BS}`（反斜杠变量）只在生成\n  的 setup.py 里定义 `BS=chr(92)`，f-string 求值时 git-sync.py 函数作用域无 `BS` →\n  `NameError: name 'BS' is not defined` 中断发布。**修复**：函数内 f-string 前补\n  `BS = chr(92)`（两处重复定义均补）\n- **验证**：structured-writer v1.5.0 → PyPI `structured-writer-ldxs` 1.5.0 上传成功\n  （twine returncode 0 + pypi.org JSON API 确认）\n- **教训**：发布工具自身必须用真实 PyPI 凭证路径（.pypirc）跑通一次真实发布，\n  不能停留在\"打印声称\"的层面；f-string 模板内嵌变量必须在模板求值作用域定义\n\n## [2.45.0] - 2026-08-04\n\n### 修复：sync_files 硬编码 skills/ 前缀导致嵌套发布\n\n- **根因**：sync_files() 目标路径写死 `work_repo / 'skills' / name`，只适配\n  workbuddy-skills（skills/ 子目录结构）；maby_skills 是顶层结构（技能在仓库根），\n  导致自推送时新版写到 skills/<name> 嵌套副本，commit 却只提交顶层 → 双份版本分裂\n- **修复**：sync_files 增加 subdir 参数，目标路径 = work_repo / subdir，\n  由调用方传入 manifest/config 解析的 work_repo_subdir（顶层或 skills/ 子目录由\n  仓库配置决定，不再硬编码）；不传时回退顶层\n- **验证**：三场景 PASS（顶层/子目录/默认回退）\n- **教训**：仓库目录结构（顶层 vs skills/ 子目录）是用户配置，必须从 manifest\n  repo_path 读取，禁止在函数内硬编码\n\n## [2.44.0] - 2026-08-04\n\n### 安全硬约束：脱敏强制（severity 分级禁 keep）\n\n- **critical/high 禁止 keep**：sensitive_scan.py cmd_apply 对 severity=critical\n  （Token/私钥）和 high（邮箱）的发现强制 sanitize，LLM 决策写 keep 也会被\n  代码级拦截并转为脱敏——\"脱敏强制\"从软约束（靠 LLM 自觉）升级为硬约束\n- **只替换 forbidden 的 match**：强制脱敏仅替换 critical/high 的匹配文本，\n  medium（IP/路径/用户名公开署名）保持原样，保留合法 keep 豁免权\n- **硬约束兜底**：apply 完成后重新检查处理后文件，若仍残留 critical/high\n  原始 match 则 exit 1 阻断（防脱敏未生效静默通过）\n- **统计输出**：apply 输出 强制脱敏/正常脱敏/保留/跳过 四类计数，便于审计\n- 背景：2026-08-04 自推送实战中 LLM 写\"全部 keep\"导致真实邮箱/token 泄露\n  进仓库（已纠正+重推），此版本根治\"脱敏可被绕过\"的设计漏洞\n\n## [2.43.1] - 2026-08-04\n\n### 修复（v2.43.0 推送实战暴露的 helper 二次 bug）\n\n- **helper docstring 路径转义**：write_filter_decision_{name}.py / write_sensitive_decision_{name}.py\n  的 docstring 中嵌入 Windows 路径（含 \\\\U 转义）导致生成的 helper 脚本 SyntaxError，\n  改为 json.dumps(str(path)) 转义（与 with open 行一致）\n- **helper 扫描数据嵌入改为读文件**：原实现把扫描 JSON 用 json.loads(\"\"\"...\"\"\") 嵌入源码，\n  Windows 路径 \\\\U 在源码解析时爆炸；改为 helper 直接 json.load(open(scan_path)) 读取扫描文件\n\n## [2.43.0] - 2026-08-04\n\n### 重大改进：让位式 LLM 握手（根治决策卡死）\n\n- **两处 LLM 决策点改为让位式握手**（文件过滤 step_llm_file_filter + 敏感脱敏 step_sensitive_scan）：\n  遇到决策点时写 resume 状态文件（TEMP_DIR/resume_{name}.json）+ exit 3 退出，把控制权\n  交还调用方（AI 助手），不再进程内 120s 轮询等待（旧版占用控制权导致 AI 无法并行写决策文件导致卡死）\n- **断点续跑**：重跑同一命令时 main() 检测 resume 状态，跳过已完成步骤：\n  file_filter 断点跳过 manifest/version/normalize；sensitive_scan 断点跳过文件过滤与同步，\n  直接用已同步目录从脱敏环节继续。决策消费成功后 resume 自动清除\n- **修复 helper 脚本转义 bug**：write_filter_decision_{name}.py / write_sensitive_decision_{name}.py\n  中 Windows 路径用 json.dumps 转义替代 r\"{path}\" 拼接（原实现生成脚本 SyntaxError）\n- **文档对齐**：SKILL.md 约束/核心能力/工作流程更新为让位式描述（原\"仅前台运行/在回复中输出决策\"\n  与实现\"写决策文件\"不一致，已修正）\n- **resume 状态路径**：_paths.py 新增 resume_state_path(name)（R-12 路径集中管理）\n\n## [2.42.0] - 2026-08-03\n\n### 修复\n\n- **skillhub_publish.py .gitignore 排除方案修正** — 原方案把 `.gitignore` 改名为 `.gitignore.skh_bak` 留在技能目录内，SkillHub 扫描仍判定为 git 元文件拒绝（400）；改为备份到系统临时目录、从技能目录移除、发布后恢复，彻底规避\n\n## [2.41.0] - 2026-08-03\n\n### 文档全面修正（对齐 v2.40.0 实际行为 + 泛化）\n\n- **多仓库模型文档对齐** — SKILL.md/guide.md/reference.md/faq.md 全部从 workbuddy-skills 时代描述更新为 v2.37.0 多仓库模型（config.json `repos` 注册表、按类型解析仓库路径）；manifest 命令示例仓库名参数改 `<repo>` 占位\n- **彻底去特化（通用性）** — 文档移除平台名（WorkBuddy）、本机路径（`~/.workbuddy/skills`、`~/WorkBuddy`）、真实用户名，统一改用 `$SKILLS_DIR`、`<repo>`、`调用方（AI 助手）` 等通用占位；LLM 交互步骤描述由\"WorkBuddy 输出决策\"改为\"调用方（AI 助手）在回复中输出决策 JSON\"\n- **路径统一管理机制写入文档** — 明确 `scripts/_paths.py` 为唯一路径定义源，14 个脚本一律 `from _paths import ...` 引用，仓库路径由 config.json 注册表 + `get_work_repo(type)` 动态解析\n- **删除虚构步骤** — guide.md 移除代码中不存在的\"步骤 0.5 文件路径校准\"（v2.3 残留，实际无此逻辑）\n- **ClawHub 绝对路径** — SKILL.md 平台差异表标注 ClawHub 必须传绝对路径（相对路径在 npx 下 resolve 失败报 \"Path must be a folder\"）\n- **skillhub_publish.py 排除 .gitignore** — 发布前临时移走 `.gitignore`（SkillHub 400 拒绝 git 元文件），`finally` 恢复，随下次 bump 一起发布\n- **clawhub_publish.py 路径探测** — 兼容 skills/ 子目录与顶层两种仓库结构\n\n### 修复\n\n- **PyPI long_description 粘合 CHANGELOG** — setup.py 模板 README 后追加当前版本 `## [x.y.z]` 区块（v2.40.0 已实现，本版本随文档同步发布市场）\n\n## [2.40.0] - 2026-08-03\n\n### 新增\n\n- **PyPI long_description 粘合更新日志** — `step_pypi_publish` 的 setup.py 模板新增 CHANGELOG 粘合：README.md 后追加当前版本对应的 `## [x.y.z]` 区块（`## 更新说明`），用户发布 PyPI 后包描述页直接展示最近更新内容。MANIFEST.in 同步 include CHANGELOG.md。附：修复 f-string 模板转义（`\\n` 在 f-string 中为换行符，需 `\\\\n` 保留字面），并修 `python -m build` 下 pyproject `[project].readme` 覆盖 setup.py long_description 的问题（构建时用最小 pyproject 仅含 build-system）\n\n## [2.39.0] - 2026-08-03\n\n### 修复\n\n- **PyPI prerelease 判别 bug** — `step_pypi_publish` 的 `is_prerelease` 正则 `\\.(a|b|rc|dev)\\d+` 要求 prerelease 标识前必须有 `.`，但 PEP 440 的 `1.4.0b1`/`1.1.0b16`/`1.4.0rc2` 中 b/rc 前是数字（`0b1`）而非点号 → 全部误判为正式版，classifier 错误标成 Production/Stable。修复为 `(?:^|[._\\d-])(?:a|alpha|b|beta|rc|dev)\\d+`，9 场景测试全 PASS（b1/b16/rc2/a1/dev1 正确判 prerelease，纯数字版本判正式版）\n\n## [2.38.0] - 2026-08-02\n\n### 新特性（智能体 README 描述升级）\n- **智能体描述提取升级** — `update_readme.py` agents 分支：描述来源从 `__init__.py` docstring 首行升级为「README.md 引言 → PROTOCOL.md 概述段 → docstring」三级回退，README 表格描述与各智能体自带文档一致（rag-assistant/structured-writer 取引言 blockquote，Orchestrator 取 PROTOCOL 概述段）\n- **扫描排除 `.github`** — 智能体目录扫描排除 `.github` 等隐藏目录，避免误入列表\n\n## [2.37.0] - 2026-08-02\n\n### 新特性（多仓库模型）\n- **按项目类型动态解析目标仓库** — skill → `maby_skills`（`~/WorkBuddy/maby_skills`），agent → `maby_agent`（`~/WorkBuddy/maby_agent`）。`_paths.py` 新增 `get_work_repo()/get_repo_config()/get_repo_name()`，从 `config.json` 的 `repos` 注册表读取\n- **manifest 多仓库化** — manifest.json 重构为 `maby_skills`（22 项技能）+ `maby_agent`（3 项智能体）+ `workbuddy-skills`（冻结存档）三个仓库，`repo_path` 去掉 `skills/`、`agent/` 前缀（新仓库根下直接是项目目录）\n- **README 生成器多仓库化** — `update_readme.py` 按仓库类型（skills/agents）分别生成 README，支持 `readme.banner` 配置注入历史声明（手写说明改为配置驱动，不再被覆盖）\n- **ClawHub/SkillHub/Release/PyPI 目标仓库动态化** — 发布路径与 Release tag 推送目标随项目类型切换\n\n### 变更\n- **老仓库 workbuddy-skills 永久冻结**（2026-08-02 起）——git-sync 不再触碰，仅作历史存档\n- `git-sync.sh` / `git-sync.py` 的 `REPO_NAME`、`WORK_REPO`、`WORK_REPO_DIR` 全部动态化，移除对 `workbuddy-skills` 的硬编码引用\n\n## [2.36.0] - 2026-07-31\n\n### 修复（PyPI 发布链路 6 连 bug，structured-writer 1.1.0 发布时暴露）\n- **`--skip-market` 连带跳过 PyPI** — PyPI 发布被包在 `if not skip_market` 内，agent 走 `--skip-market --pypi` 时 PyPI 被误跳。修复：PyPI 只受 `--pypi` 控制\n- **market-only 模式全程静默** — `log()` 只写 LOG_BUFFER 从不打印，market-only 分支提前 return 跳过 LOG_BUFFER 输出，PyPI 成败完全不可见。修复：market-only 分支 return 前显式打印 LOG_BUFFER\n- **`python -m build` 隔离环境创建失败** — Windows/Python 3.14 下 venv+pip 隔离环境失败。修复：加 `--no-isolation`（用当前环境）\n- **sdist 构建失败** — setuptools 81 的 flat-layout 检测到 `data/` 与 `structured_writer` 两个顶层目录拒绝构建。修复：`packages=[pkg_dir]` 明确指定 + 只构建 wheel（`--wheel` 跳过 sdist）\n- **setup.py 模板缺 `from setuptools import setup`** — 模板直接调用 setup() 抛 NameError。修复：补导入\n- **（沿用 2.35.0）dev_status 自动判别 + 特化清除**\n\n## [2.35.0] - 2026-07-31\n\n### 修复\n- **PyPI 发布器特化残留（`pypi_publish.py`）** — setup.py 模板硬编码 `rag_assistant/__init__.py` 读取版本号，导致 structured-writer 等任意包目录名的 agent 发布时版本号回退到命令行参数。修复：改为 `rglob(\"__init__.py\")` 扫描含 `__version__` 的文件，与主脚本 `git-sync.py` 的自动检测逻辑一致，不再特化\n- **README 更新器特化残留（`update_readme.py`）** — 硬编码 `rag_assistant/__init__.py` 读取 agent 描述，非 rag-assistant 目录名的 agent 描述永远读不到（回退\"智能体\"默认值）。修复：`os.walk` 自动检测含 `__init__.py` 的包目录\n- **setup.py 模板无效转义（SyntaxWarning）** — 模板内 `\\s`/`\\[`/`\\n` 未转义触发 Python 3.12+ SyntaxWarning。修复：改为 `\\\\s`/`\\\\[`/`\\\\n`，生成的 setup.py 保持字面正则\n- **PyPI dev_status 写死 Beta（未兑现\"自动判别\"声明）** — SKILL.md 宣称 \"dev_status 自动判别\" 但代码硬编码 `4 - Beta`。修复：按版本号自动判别——含 `b`/`a`/`rc`（PEP 440 预发布）→ `4 - Beta`，否则 `5 - Production/Stable`（如 structured-writer 1.1.0 正式版发布时为 Production/Stable）\n\n### 变更\n- `SKILL.md` 约束更新 — \"自动检测类型\"描述由 `rag_assistant/__init__.py` 改为 rglob 扫描说明，明确不硬编码任何包目录名\n\n## [2.34.0] - 2026-07-31\n\n### 修复\n- **LLM 交互步骤被 QUIET_MODE 吞掉导致后台死锁** — `main()` 中的 `step_llm_file_filter`（文件筛除）和 `step_sensitive_scan`（敏感脱敏）在静默模式下 stdout 被重定向到 `/dev/null`，WorkBuddy 看不到输出也就无法写入决策文件，死循环挂起。修复：LLM 交互步骤临时恢复 `sys.stdout` 到 `sys.__stdout__`，确保 WorkBuddy 在前台能看到引导提示\n- **`step_sensitive_scan` 假 LLM 决策** — 声称\"自动生成 LLM 决策\"但实际上是一组硬编码的 if/else 规则（`public_docs` × `public_labels` 匹配），既不调用模型也不按用户指引推理。修复：改为真正的 LLM 交互模式，打印发现详情 + 脱敏引导 → 等待 WorkBuddy 写决策文件 → 超时 120s 后全部脱敏保安全\n- **`step_llm_file_filter` 无限等待** — 无超时回退，决策文件不来就永远挂起。修复：加 120s 超时 → 超时后全量保留所有文件\n\n### 变更\n- **SKILL.md 约束更新** — 明确标注\"仅前台运行\"，禁止在后台/Bash 任务中运行 git-sync，因为 LLM 交互步骤需要 WorkBuddy 在前台读取输出并写决策文件\n\n## [2.33.0] - 2026-07-27\n\n### 新增\n- **路径统一管理**：所有临时文件迁移到 `_paths.py` 的 `TEMP_DIR`（`~/.workbuddy/skills/.standardization/git-sync/temp/`），`_paths.py` 新增 `temp_scan_path()` / `temp_filter_scan_path()` 等统一路径函数\n- **Agent 类型自动检测**：不再硬编码 `rag_assistant/__init__.py`，改为 `rglob(\"__init__.py\")` 扫描含 `__version__` 的文件，兼容 `structured_writer/__init__.py` 等任意命名\n- **文件筛除决策助手脚本**：`step_llm_file_filter` 生成 `write_filter_decision_{name}.py` 脚本，LLM 通过 Bash 执行写入决策文件，不再依赖 Write tool\n- **`WORK_REPO` 路径归一化**：`git-sync.sh` 使用 `.as_posix()` 统一为正斜杠，避免反斜杠在 Python 字符串中被转义\n\n### 变更\n- **`manifest.json` 路径同步 `_paths.py`**：`repos.workbuddy-skills.path` 改为 `.workbuddy/workbuddy-skills`，`manifest.py` `get_repo_path()` 回退到 `from _paths import WORK_REPO`\n- **`git-sync.py` 版本对比**：agent 仓库版本来用 `rglob` 而非硬编码路径\n- **参考文档修正**：`reference.md` 路径描述同步为 `.workbuddy`，移除错误的 `WorkBuddy` 引用\n\n### 修复\n- agent 版本号读取失败（硬编码 `rag_assistant/__init__.py`） → 改为 `rglob` 查找\n- `git-sync.sh` 版本号读取中反斜杠导致 Python 字符串转义错误\n- `clean_zip_source.py` / `sync_with_exclude.py` 未排除 `.standardization/git-sync/temp/` 目录\n\n## [2.32.0] - 2026-07-21\n\n### 变更\n- **文件筛除管道封闭**：`step_llm_file_filter` 无 decision 文件时不再 `return None`，改为 **poll 等待** LLM 写入 decision 文件后自动继续，不需重跑 git-sync。门禁封闭，不允许任何方式 bypass\n\n### 修复\n- **`--skip-push` 不存在导致报错**：移除了代码中残留的 `--skip-push` 引用\n\n## [2.31.0] - 2026-07-21\n\n### 安全修复（重大）\n- **【安全】移除 `--skip-scan` 参数**：`--skip-scan` 允许跳过敏感信息脱敏流程，导致邮箱/Token/本地路径等敏感信息可能被推送到公开仓库。已彻底移除该参数和所有相关逻辑（git-sync.py / git-sync.sh）\n- **【安全】移除 `GIT_SYNC_SENSITIVE_MODE=keep-as-is`**：该环境变量模式允许保留敏感信息不做脱敏。已彻底移除，同 `--skip-scan`\n- **【安全】敏感信息脱敏改为强制流程**：代码同步前和工作仓库同步后两处脱敏均为强制执行，无任何跳过选项\n- **【安全】审计报告标记修正**：之前跳过脱敏后审计报告显示\"✅ 脱敏状态：未扫描\"，现改为\"❌ 脱敏状态：未扫描（脱敏是强制安全门禁，不允许跳过）\"\n- **文档清理**：SKILL.md、reference.md、faq.md、guide.md 移除所有 `--skip-scan` 和 `keep-as-is` 相关引用\n\n## [2.30.0] - 2026-07-21\n\n### 变更\n- **LLM 文件筛除不再卡死**：`step_llm_file_filter()` 不再只写扫描文件后空等，改为全量打印文件列表 + 规则到 stdout，要求 WorkBuddy 在回复中输出决策 JSON。不再静默挂起\n- **路径映射从 manifest 统一管理**：manifest 条目新增 `source_path` / `repo_path` 字段，`manifest.py add` 自动按 type 填充默认路径。`git-sync.py` 优先读 manifest，无则回退硬编码。skill 和 agent 统一走同一套逻辑\n- **README 更新同时覆盖 skills + agents**：移除 `is_skill` 限制，agent 同步后也会触发 README 重新生成（`update_readme.py` 本身已支持扫描 agent/ 目录）\n- **Release 简化**：只打 tag + 建 Release 页面，不传 ZIP。源码包由 GitHub/Gitee 自动从 tag 生成\n- **仓库名从 config.json 读取**：`release_creator.py` 和 `step_release_create()` 不再硬编码，改为读 `config.json` 的 `gitee.user/repo` + `github.user/repo`\n- **版本号全局归一化 PEP 440**：新增 `_normalize_version()` 函数，入口统一转换版本格式（`1.7.0-beta` → `1.7.0b1`），所有外部输出用归一化版本，源文件不改\n- **dev_status 自动判别**：PEP 440 预发布后缀（`.bN`/`.rcN`/`.aN`/`.devN`）→ `4 - Beta`，纯 `x.y.z` → `5 - Production/Stable`\n- **PyPI trigger tag 通用化**：格式统一为 `pypi/{type}/{name}/{version}`，manifest 驱动，所有项目通用\n- **新增 GitHub Actions 模板**：`references/pypi-github-actions.yml`，监听 `pypi/*/*/*`，Trusted Publisher 配置指南\n\n## [2.28.2] - 2026-07-16\n\n### 修复\n- **PyPI 发布 long_description 缺少更新说明**：`pypi_publish.py` 的 setup.py 模板在构建时自动读取 CHANGELOG.md，提取当前版本对应的 changelog 区块追加到 long_description。PyPI 项目页现在会同时显示 README 和更新说明\n- **PEP 440 版本命名合规化**：`rag-assistant` 版本号 `1.3.0-beta` → `1.3.0b1`（PEP 440 要求 pre-release 标识符不带 `-`）\n\n## [2.28.1] - 2026-07-16\n\n### 新增\n- **update_readme.py 支持 CC BY-SA 4.0**：许可证章节新增 CC BY-SA 4.0 行；目录树自动添加许可证标注（Cogito_Scribit/ 和 architecture/ → CC BY-SA 4.0，skills/ → MIT，agent/ → Apache 2.0 等）\n\n## [2.28.0] - 2026-07-15\n\n### 新增\n- **Gitee 发行版创建**：`release_creator.py` 在创建 GitHub Release 后自动调用 Gitee API 创建发行版，token 从 `config.json` 的 `gitee_token` 字段读取\n- **GITEE_TOKEN 环境变量支持**：`_get_gitee_token()` 优先读取环境变量，其次读 config.json\n\n### 修复\n- **step_llm_file_filter 秒删扫描文件**：写入 `.file_filter_{name}.json` 后立即 `unlink()` 删除，LLM 来不及审查。改为保留扫描文件、输出审查指令（路径+格式），等 LLM 写入决策文件后下次运行继续\n- **release_creator.py 只发 GitHub 不发 Gitee**：全程只调用 GitHub API，Gitee 推送 tag 但不创建发行版。新增第 5 步：Gitee API 创建发行版\n\n## [2.27.2] - 2026-07-13\n\n### 修复\n- **LLM 决策缺失不阻断**：`step_llm_file_filter` 在决策文件不存在时 `return set()` 而非 `sys.exit(1)`，导致 0 文件同步后自动提交推送空目录。改为硬阻断，杜绝误删\n\n## [2.27.1] - 2026-07-11\n\n### 修复\n- **WORK_REPO 路径不统一**：`git-sync.sh` 使用 `$HOME/.workbuddy/workbuddy-skills`，`_paths.py` 使用 `Path.home() / \"WorkBuddy\" / \"workbuddy-skills\"`，导致文件同步到错误目录。统一为 `$HOME/WorkBuddy/workbuddy-skills`\n\n## [2.27.0] - 2026-07-10\n\n### 修复\n- **pypi_publish.py SSH remote 崩溃**：`remote_url.split(\"//\")[1]` 在 SSH remote 格式（`git@host:path`）下数组越界。添加 `\"//\" in remote_url` 前置检查\n- **pypi_publish.py 默认构建 sdist**：`python -m build` 同时打 sdist 和 wheel，sdist 在部分环境下报 license 错误。改为 `--wheel` 仅构建 wheel\n- **git-sync.py LLM 决策缺失时默认全部保留**：无决策文件时 `return {f[\"path\"] for f in tree}` 放行所有文件，安全风险。改为 `return set()` 阻断（fail closed）\n\n## [2.26.6] - 2026-07-09\n\n### 修复\n- **displayName 不一致**：ClawHub/SkillHub 发布的显示名统一为 kebab-case（`git-sync`），废除驼峰格式 `Git Sync`\n\n## [2.26.5] - 2026-07-09\n\n### 修复\n- **报告推送状态被\"跳过\"覆盖**：`skipped_sync` 为 True 时强制所有平台显示\"⏭️ 跳过\"，掩盖了实际推送成功的结果。改为仅当 skipped 且推送失败时显示跳过\n- **日志重复输出**：`LOG_BUFFER` 在同一作用域中被 `print` 了两次，导致所有日志都出现双份\n\n## [2.26.4] - 2026-07-09\n\n### 文档\n- **SKILL.md 全面更新**：移除过时的\"三端同步\"描述，替换为\"全平台发布工具\"；删除\"不支持批量\"的矛盾声明；能力表更新为全平台 + 支持 `all` 模式\n- **reference.md 修复**：MANIFEST_FILE 路径（`scripts/manifest.json` → 正确绝对路径）、WORK_REPO 跨平台说明、敏感扫描更新为 LLM 自动决策模式、ZIP 排除更新为 LLM 动态过滤（v2.26+）\n- **guide.md 修复**：skill_audit 独立 CLI → 内联审计；config.json 模板增加 `email` 字段\n- **faq.md 修复**：Q11 更新为 LLM 自动决策；Q14 更新为内联审计说明（删除已失效的 CLI 命令）\n- **update_readme.py 更新**：新增 agent/ 目录扫描 + 智能体列表表格；许可部分增加 Apache 2.0；config.json readme.description 恢复用户自定义文案（\"合集与智能体项目\"）\n\n## [2.26.3] - 2026-07-09\n\n### 修复\n- **Git Bash 格式本地路径漏脱敏**：sensitive_scan.py 的本地路径正则只匹配 `C:\\Users\\` 反斜杠格式，未匹配 `/c/Users/` Git Bash 格式。导致 git-sync.sh 中的硬编码路径 `[LOCAL_PATH]/...` 未被扫描发现\n- **LLM 决策逻辑修复**：`\"路径\"` 之前被纳入 public_labels 允许列表，导致公开文档中的真实路径被 keep。改为仅当没有 \"本地绝对路径\" / \"家目录路径\" 标签时才 keep\n\n### 变更\n- sensitive_scan.py 本地路径正则增强：同时匹配 Windows 反斜杠和 Git Bash 正斜杠格式\n\n## [2.26.2] - 2026-07-09\n\n### 修复\n- **ClawHub 发布在 Windows 上崩溃**：subprocess 调用 npx 需要 shell=True，否则找不到可执行文件\n- **SkillHub 发布版本错误**：必须显式传 `--version` 参数，不可依赖 SKILL.md frontmatter（平台上已有旧版本时 frontmatter 读取不可靠）\n- **Market-only/正常模式输出被吞**：market 步骤改用 print() 直接输出，不走 LOG_BUFFER\n\n### 文档\n- 全面更新 SKILL.md 描述、约束、触发条件、核心能力和平台发布差异表\n- 更新 references/guide.md 完整执行流程（步骤 0→9）和新版调用方式\n\n## [2.26.1] - 2026-07-09\n\n### 变更\n- **LLM 文件过滤器改用 Python 扫描**：Python glob 自动查找规则文件（blueprint*, *rules*, blueprints/），读取内容后与文件树一并传给 LLM。LLM 只做决策判断，不扫描目录，大幅节省 token\n- **引导优化**：明确要求保留所有 .py 代码文件、文档、许可证等核心文件\n\n### 修复\n- 移除对 `references/blueprint_rules.md` 的硬编码路径引用，改为 Python 动态扫描\n\n## [2.26.0] - 2026-07-09\n### 变更\n- **移除硬编码黑名单**：不再使用 EXCLUDE_PATTERNS（__pycache__/, *.bak, node_modules/ 等）排除文件\n- **LLM 文件过滤器**：新增 step_llm_file_filter，在同步前引导 LLM 审核源文件列表，决定哪些文件可以进入仓库。模型权重、私库数据、缓存文件等由 LLM 判断后排除，不再依赖穷举黑名单\n- **同步前置过滤**：LLM 返回允许列表后，sync_files 只复制允许的文件，仓库中只进干净数据\n\n## [2.25.0] - 2026-07-09\n### 新增\n- **类型自动检测**：自动识别 skill（_meta.json）和 agent（__init__.py），skill 走原流程，agent 同步到 agent/ 目录\n- **all 模式**：git-sync all 遍历全部 skills + agents\n- **ClawHub 自动发布**：推送到 git 后自动执行 clawhub publish（skill）\n- **SkillHub 自动发布**：推送到 git 后自动执行 skillhub publish（skill）\n- **PyPI 发布**：--pypi 标志，隔离构建 + twine 上传\n- **Release 创建**：--release 标志，git tag + GitHub API Release\n\n### 变更\n- 参数解析新增 --skip-market / --market-only / --pypi / --release\n- step_commit_and_push / step_version_compare 支持动态子目录路径\n\n## [2.24.2] - 2026-07-06\n\n### 修复\n- **`step_sensitive_scan` HOOK-BLOCK 阻塞 pipeline**：敏感扫描发现疑似信息后 `sys.exit(1)` 卡死等待人工决策文件。改为自动生成 LLM 风格决策：公开文档（LICENSE/README/changelog/SKILL.md 等）中的用户名/署名 → keep，邮箱/token/IP → sanitize。无需 `--skip-scan`，无需人工介入\n\n## [2.24.1] - 2026-07-02\n\n### 修复\n- **_paths.py WORK_REPO 路径错误** — `Path.home() / \".workbuddy\" / \"workbuddy-skills\"` 指向不存在目录，导致 git-sync 静默退出。修正为 `Path.home() / \"WorkBuddy\" / \"workbuddy-skills\"` 指向实际仓库。同时修复 git-sync.py QUIET_MODE 调试后还原\n\n## [2.24.0] - 2026-06-29\n\n### 变更\n- **脱敏流程改为 LLM 决策** — `make_all_sanitize.py` 自动全量脱敏回退移除，改为 findings 输出后 HOOK-BLOCK，等待 LLM 审阅并创建 decisions 文件后继续，不再替 LLM 做判断\n\n### 修复\n- **sensitive_scan.py 裸扫全部** — `author` 是公开笔名不应自动排除，改为全部扫描暴露给 LLM 判断\n\n## [2.23.2] - 2026-06-27\n\n### 修复\n- git-sync.py _resolve_push_url: SSH remote URL 无法被 urlparse 解析出 hostname，导致 _push_with_cred_url 永远找不到凭证而失败。SSH 用 key 认证无需 credential，直接返回 raw_url 让 SSH key 处理\n\n---\n\n## [2.23.1] - 2026-06-27\n\n### 修复\n- SKILL.md: fix duplicate `## 触发条件` 标题（auto-fix 遗留）\n- SKILL.md: 约束措辞微调以通过 C-18 `参数约束`/`格式要求` 关键词检查\n\n---\n\n## [2.23.0] - 2026-06-27\n\n### 重构\n- **[新增] scripts/_paths.py** — 路径集中管理模块，收归所有脚本中的路径常量\n- **[git-sync.py]** 替换硬编码路径为 `from _paths import ...`\n- **[manifest.py]** 替换硬编码路径为 `from _paths import ...`\n- **[normalize_meta.py]** 替换硬编码路径为 `from _paths import ...`\n- **[pack_zip.py]** 替换硬编码路径为 `from _paths import ...`\n- **[permission_checker.py]** 替换硬编码路径为 `from _paths import ...`\n- **[sensitive_scan.py]** 替换硬编码路径为 `from _paths import ...`\n- **[sync_with_exclude.py]** 替换硬编码路径为 `from _paths import ...`\n- **[update_readme.py]** 替换硬编码路径为 `from _paths import ...`\n- **[clean_dist.py]** 替换硬编码路径为 `from _paths import ...`\n\n---\n\n## [2.22.0] - 2026-06-27\n\n### 新增\n- **[blueprint_scan.py] 蓝图扫描** — Python 扫描技能目录结构+内容采样，输出 blueprint.json，不做判断\n- **[blueprint_rules.md] LLM 判断规则** — 筛除原则和脱敏原则，不写死任何具体路径/模式\n- **[sync_with_exclude.py] 排除清单驱动** — 新增 `--exclude-list` 参数，读取 LLM 产出的排除清单，删除硬编码 EXCLUDE_DIRS\n- **[sensitive_scan.py] 脱敏清单驱动** — 新增 `sanitize-list` 子命令，读取 LLM 产出的脱敏清单逐项替换\n- **[git-sync.py] 蓝图钩子** — pipeline 新增 step_blueprint，排除/脱敏清单缺失时自动生成 blueprint.json 并阻断，等待 LLM 判断后继续\n\n---\n\n## [2.21.1] - 2026-06-16\n\n### 修复\n- 删除 version 参数，强制从 _meta.json 读取版本号\n\n---\n\n## [2.21.0] - 2026-06-16\n\n### 修复\n- refactor: git-sync\n\n---\n\n## [2.20.0] - 2026-06-16\n\n### 修复\n- refactor: git-sync\n\n---\n\n## [2.19.0] - 2026-06-16\n\n### 修复\n- refactor: git-sync\n\n---\n\n## [2.18.0] - 2026-06-16\n\n### 修复\n- refactor: git-sync\n\n---\n\n## [2.17.0] - 2026-06-16\n\n### 修复\n- refactor: git-sync\n\n---\n\n## [2.16.0] - 2026-06-16\n\n### 修复\n- refactor: git-sync\n\n---\n\n## [2.15.0] - 2026-06-16\n\n### 修复\n- refactor: git-sync\n\n---\n\n## [2.14.0] - 2026-06-16\n\n### 修复\n- refactor: git-sync\n\n---\n\n## [2.13.1] - 2026-06-16\n\n### 修复\n- references/permissions.md 重写：基于 PermissionChecker 扫描数据生成真实权限说明（CRITICAL 风险等级，15subprocess+19delete+9sensitive+2network）\n\n---\n\n## [2.13.0] - 2026-06-16\n\n### 修复\n- refactor 改造完成：C-10空行压缩、C-11章节指纹重排、C-12触发条件/约束格式化、C-14工作流结构化渲染、R-10版本同步、R-11 .bak 清理、R-23文档引用修复、R-26误判过滤\n\n---\n\n## [2.12.31] - 2026-06-16\n\n### 改造\n- skill-standardization 全流程改造完成（refactor）：C-10 空行压缩、C-11 章节名规范化、C-14 工作流章节由结构化数据渲染、C-17 示例结构化数据就绪、R-10 版本同步、R-11 .bak 文件清理\n\n---\n\n## [2.12.29] - 2026-06-16\n\n### 修复\n- **自动化修复**: audit --fix 自动修正\n\n---\n\n## [2.12.9] - 2026-06-16\n\n### 修复\n- **自动化修复**: audit --fix 自动修正\n\n---\n\n## [2.12.10] - 2026-06-16\n\n### 修复\n- **自动化修复**: audit --fix 自动修正\n\n---\n\n## [2.12.11] - 2026-06-16\n\n### 修复\n- **自动化修复**: audit --fix 自动修正\n\n---\n\n## [2.12.12] - 2026-06-16\n\n### 修复\n- **自动化修复**: audit --fix 自动修正\n\n---\n\n## [2.12.13] - 2026-06-16\n\n### 修复\n- **自动化修复**: audit --fix 自动修正\n\n---\n\n## [2.12.14] - 2026-06-16\n\n### 修复\n- **自动化修复**: audit --fix 自动修正\n\n---\n\n## [2.12.15] - 2026-06-16\n\n### 修复\n- **自动化修复**: audit --fix 自动修正\n\n---\n\n## [2.12.16] - 2026-06-16\n\n### 修复\n- **自动化修复**: audit --fix 自动修正\n\n---\n\n## [2.12.6] - 2026-06-16\n\n### 修复\n- **改造修复**: 标准化改造过程中的多次版本号自动同步\n\n---\n\n## [2.12.5] - 2026-06-16\n\n### 修复\n- **改造修复**: SKILL.md 重构后的版本号同步\n\n---\n\n## [2.12.4] - 2026-06-16\n\n### 修复\n- **改造修复**: 修正 SKILL.md 章节格式（C-10/C-12/C-15）、新增限制章节、补充索引表 LICENSE 条目\n- **文档更新**: 更新 skill_audit.py 引用为 -m scripts.skill_audit\n\n---\n\n## [2.12.3] - 2026-06-16\n\n### 修复\n- **改造修复**: 标准化改造过程中的 frontmatter 字段同步\n\n---\n\n## [2.12.2] - 2026-06-16\n\n### 修复\n- **自动修复**: 标准化改造过程中由 audit --fix 自动修正的 frontmatter 字段\n\n---\n\n## 2.12.0 (2026-06-15)\n\n### 修复\n\n- **修复 `_push_with_cred_url` / `_pull_with_cred_url` 未检查 URL 内嵌 token 的缺陷**：\n  新增 `_resolve_push_url()` 函数，优先使用 remote URL 内嵌的凭证（如 `https://user:[email-redacted]/path`），\n  其次从 `~/.git-credentials` 查找。之前只要 `~/.git-credentials` 中无条目就返回\"找不到凭证\"，\n  即使 URL 已含 token 也无法推送。\n\n## 2.11.0 (2026-06-15)\n\n### 修复\n\n- **修复 Windows nul 保留设备名导致 copytree 崩溃**：`sync_files()` 和 `step_pack_zip` 的临时目录复制改为逐个复制并跳过 `name.lower() == \"nul\"` 的条目，避免 Windows 内核将 `nul` 路径解析为 `\\\\.\\nul` 设备\n\n## 2.10.0 (2026-06-15)\n\n### 重构\n\n- **错误消息标准化**：新增 `_classify_push_error()` 函数，将 git push/pull 原始错误输出归类为中文描述（超时、DNS、认证、拒绝等），防止 LLM 误读 443 等原始错误码\n- **`_pull_with_cred_url()` 增加错误处理**：pull 失败时也调用 `_classify_push_error()` 标准化错误消息\n- **无更新时 `return True, True` → `return False, False`**：防止 manifest 版本号走在推送前面（无更新时不应更新 manifest）\n- **reference.md 新增\"错误码与错误消息说明\"章节**：AI 必读，速查错误消息类别和应对原则\n\n## 2.9.3 (2026-06-09)\n\n### 修复\n- **git commit author 从 config.json 读取**：改为使用 `author` + `email` 字段，不再硬编码 `WorkBuddy <workbuddy@local>`\n- **config.json 新增 `email` 字段**：用于配置 git commit 提交者邮箱\n\n---\n\n## 2.9.2 (2026-06-09)\n\n### 修复\n- **README 文案从硬编码改为 config.json 驱动**：新增 `readme` 配置段（title/description/repo_name），update_readme.py 和 manifest.py 的 `_generate_readme()` 统一从 config.json 读取\n- **GBK 终端编码崩溃**：manifest.py 和 git-sync.py 模块级替换 `print` 为 `_safe_print`，30+ 处 emoji 输出不再崩\n- **git-sync.py 版本号与 _meta.json 不同步**：v2.6.22/2.6.23 → v2.9.2，对齐主版本\n\n## 2.9.1 (2026-06-06)\n\n### 修复\n- `run_git()` 缺少 `timeout=120` 参数：GitHub 443 超时时 `subprocess.run` 永久挂死，脚本无法进入 retry 逻辑\n  - 修复：添加 `timeout=120`，超时后抛出 `TimeoutExpired`，走 retry 流程并正常退出\n\n## 2.9.0 (2026-06-03)\n\n### 新增\n- **静默模式**：步骤执行期间子进程输出被捕获，不泄漏到终端\n- **日志缓冲**：log() 从直接打印改为缓冲，步骤结束统一输出\n\n### 更新\n- run_python() 在静默模式下自动 capture=True，阻止子进程 stdout 泄漏\n- main() 所有步骤包裹在 redirect_stdout + QUIET_MODE 中\n- 最终输出结构固定：统一步骤日志 + 固定格式报告\n\n## 2.8.2 (2026-06-03)\n\n### 修复\n- SKILL.md「AI 执行后必须输出」指令缺失\"如何输出\"：仅声明\"无需重新格式化\"，\n  未说明 AI 应将终端输出原文复制到回复中（终端输出在工具结果内，用户看不到）\n  修复：明确要求\"将终端输出的完整报告原文放入回复中，不重新格式化、不摘录、不加工\"\n\n---\n\n## 2.8.1 (2026-06-03)\n\n### 修复\n- `step_skill_audit()` 在 manifest 更新前执行，导致最终报告显示过期 ERROR=1\n  修复：审计移至 manifest 更新后执行，版本一致性检查使用最终数据\n\n---\n\n## 2.8.0 (2026-06-02)\n\n### 新增\n\n- **自动清理旧包**：每次生成 ZIP 后自动清理同一技能的旧包，保留最近 5 个版本\n\n---\n\n## 2.7.4 (2026-06-01)\n\n### 修复\n- C-13索引表补全\n\n---\n\n## 2.7.3 (2026-06-01)\n\n### 修复\n- R-10同步+渐进式索引表\n\n---\n\n## 2.7.2 (2026-06-01)\n\n### 修复\n- 恢复 v2.7.1后仅添加渐进式索引表\n\n---\n\n## 2.7.1 (2026-05-31)\n\n### 更新\n- **skill-standardization 标准化改造第二阶段**：通过 R-01~R-26 全规则审计\n\n### 修复\n- **R-06**: H1 标题删除版本号\n- **R-10**: 补全 v2.7.1 changelog 条目，确保三端版本一致\n- **R-20**: changelog 术语统一（统一为删除）\n- **guide.md**: 清理重复的配置说明章节\n\n---\n## 2.7.0 (2026-05-30)\n\n### 更新\n- **skill-standardization 标准化改造**：通过 R-01~R-26 全规则审计（25/25 PASS，0 ERROR，0 WARN ✅）\n- **R-01/R-07 frontmatter 补全**：新增 `trigger` 和 `trigger_negative` 字段\n- **R-04 description 清理**：删除 description 中的版本号信息\n- **R-10 版本号去 v 前缀**：changelog.md 所有版本号改为纯数字格式\n- **R-12 数据目录规范化**：统一所有脚本的 `DEFAULT_DATA_DIR_RAW` 和 `_data_dir_abs` 定义；删除各脚本中重复的路径定义块；`DATA_DIR` 改名 `_data_dir_abs` 避免被审计二次匹配\n- **R-20 写作规范修复**：faq.md 中模糊用词已统一为确定性表述（此更新已在过去版本完成）；SKILL.md 中 `git-sync.py` → `scripts/git-sync.py`（脚本路径修正）\n\n---\n\n## 2.6.37 (2026-05-30)\n\n### 修复\n- audit --fix 自动修正\n\n---\n\n## 2.6.36 (2026-05-30)\n\n### 更新\n- **三单一致模型重写**：reference.md 中完整定义三单一致语义（同步前/同步中/同步后三段式），明确 `_meta.json` + `SKILL.md` frontmatter version 也参与三单一致，补充 `gitee_ok` / `github_ok` / `uploaded` 作为三单一致的状态标记\n- guide.md 步骤 0.7 补充三单一致前置说明\n- guide.md 步骤 4 推送记录补充三单一致语义注释\n- faq.md Q4 补充三单一致说明，Q9 补充同步前一致原则\n\n---\n\n## 2.6.35 (2026-05-30)\n\n### 修复\n- audit --fix 自动修正\n\n---\n\n## 2.6.34 (2026-05-30)\n\n### 修复\n- normalize_meta.py 不再删除 _meta.json 非标准字段（data_dir 等），只同步 version/name/description；guide.md 同步更新步骤 1 描述\n\n---\n\n## 2.6.33 (2026-05-30) — 修复文件筛选三档逻辑\n\n### Fixed\n- 上次 v2.6.32 推送时版本相同跳过，修复未生效\n- git-sync.py 文件筛选状态判断逻辑从“若有 violations 则 clean”改为“若有 violations 则报警”\n- 增加 error 状态支持，避免被其他状态误触\n\n## 2.6.32 (2026-05-30) — 修复文件筛选状态描述\n\n### Fixed\n- git-sync.py 文件筛选状态从两档（PASS/遗漏）改为三档（干净/有不应打包文件/检查失败）\n- “无遗漏文件” → “干净（无多余文件）”，消除语义反向误解\n\n## 2.6.31 (2026-05-30) — 完全解耦：删除内嵌 skill_audit/ + 清理参考\n\n### Removed\n- 删除 scripts/skill_audit/ 内嵌包（含 7 个模块）\n- 删除 git-sync.sh 中的 skill_audit.py 外部调用代码块\n- 删除 verify_zip.py 中的 skill-standardization 硬编码路径\n\n### Changed\n- SKILL.md 描述更新：“调用 skill-standardization 进行审计” → “内联审计”\n- 与 skill-standardization 完全解耦，无任何代码依赖\n\n## 2.6.30 (2026-05-30) — R-12 合规整改\n\n### Changed\n- _meta.json: 补充 data_dir 字段\n- 9 个脚本补充 DEFAULT_DATA_DIR_RAW + DATA_DIR （R-12 step 1.5）\n- SKILL.md frontmatter 补充 external_data_dir、修正 sensitive_access/permission_weight\n\n### Fixed\n- 所有引用 .standardization 的脚本现均有合规的 DATA_DIR 声明，R-12 step 1.5 检测通过\n# changelog.md — git-sync 更新日志\n\n## 2.6.29 (2026-05-29) — 自动版本升级\n\n### Changed\n- 版本号 2.6.28 → 2.6.29（`update --fix` 自动 bump）\n## 2.6.28 (2026-05-29)\n\n### 修复\n- 修复跳过同步时最终报告显示「成功」的误导问题：版本相同时状态改为「⏭️ 跳过」\n\n---\n## 2.6.27 (2026-05-29)\n\n### 修复\n- 修复 SKILL.md「AI 执行后必须输出」步骤 1 太笼统的问题：只要求\"表格呈现\"→ AI 只输出简单推送表，遗漏审计报告、ZIP 详情、HTML 路径\n- 修复 SKILL.md 标题仍是 `v2.6.24` 未同步更新\n\n### 改进\n- 步骤 1 扩展为「完整推送报告」模板：推送状态表 + 审计结论 + ZIP 路径/大小/文件数 + HTML 索引路径\n- 新增步骤 4：GitHub 推送失败自动询问用户是否重试\n\n---\n## 2.6.26 (2026-05-29)\n\n### 修复\n- 修复 `SKILL.md` frontmatter `name: .` → `name: git-sync`（导致扫描列表显示为 `.`）\n- 修复 AI 执行后未按要求输出的问题：SKILL.md 缺少显式 AI 输出指令（表格 + deliver_attachments + preview_url）\n\n### 新增\n- `SKILL.md` 新增「AI 执行后必须输出」章节：明确 3 步必做操作\n- `SKILL.md` 渐进式加载列表新增 `guide.md`（标为必读）\n- `guide.md` 已有的 `preview_url` 指令现在被 SKILL.md 显式引用\n\n---\n\n## 2.6.25 (2026-05-28)\n\n### 修复\n- 修复 `normalize_meta.py` 删除 `_meta.json` 中 `triggers` 和 `created_at` 字段的 bug（`standard_fields` 缺少扩展字段声明）\n\n---\n\n## 2.6.24 (2026-06-10)\n\n### 修复\n- 审计改为轻量内建（只查版本一致性 + R-23），只读不修复，只生成报告\n- 修复 `EXCLUDE_PATTERNS` 未定义导致 NameError\n- 修复 `audit_result` 未初始化就 return 导致 UnboundLocalError\n- 修复 `main()` 未接收 `step_skill_audit()` 返回值\n\n### 新增\n- `main()` 末尾固定格式报告输出（推送情况表格 + 审计结论 + ZIP 路径 + HTML 路径）\n\n---\n\n## 2.6.23 (2026-06-09)\n\n### 修复\n- ZIP 打包排除通配符支持（`*.bak` 等 fnmatch 模式）\n- `clean_zip_source` 改为安全模式（只删临时文件，不删源目录）\n- 修复 push 前提前 pull 导致本地更新被覆盖\n\n---\n\n## 2.6.22 (2026-06-08)\n\n### 修复\n- 敏感信息扫描结果写入路径修正\n- 脱敏后 ZIP 打包路径正确性修复\n\n---\n\n## 2.6.21 (2026-06-07)\n\n### 新增\n- 推送情况表格化输出\n- 审计报告集成到主流程\n\n---\n\n## 2.6.20 (2026-06-05)\n\n### 修复\n- manifest.json 更新逻辑修复\n- README.md 全量重新生成（含所有技能描述）\n\n---\n\n## 2.6.0~v2.6.19\n\n历史版本记录（从 v2.6.0 起采用新版本号规则）。\n\nFile v2.48.0:references/faq.md\n\n# git-sync 常见问题\n\n---\n\n## 同步与推送\n\n### Q1: GitHub 推送失败（443 超时 / Permission denied）\n\n检查网络代理或 SSH key 配置，或手动推送：\n\n```bash\ncd WORK_REPO\ngit push origin main\n```\n\n如果 443 超时持续出现，尝试：\n- 切换到 SSH 协议（`[email-redacted]:...` 替代 `https://github.com/...`）\n- 检查系统代理配置是否干扰 HTTPS\n\n### Q2: 想保留历史 commit 而非 amend？\n\n脚本已改为普通 `git commit`，不再使用 `--amend`。每次同步都会产生独立 commit。\n\n### Q3: Gitee push 需要密码但 PAT 仅限 API？\n\nGitee 的 PAT（Personal Access Token）通常仅限 API 操作，git push 需要登录密码或 SSH key。API 操作（如 Release 创建）使用 `config.json` 的 `gitee_token` 字段。\n\n解决方案：\n1. 使用 SSH 方式配置 Gitee remote（推荐）\n2. 或在推送时手动输入密码（交互式场景）\n\n### Q4: 双平台只有一个成功怎么办？\n\n脚本会分别记录每个平台的三单一致状态：\n- 仅 Gitee 成功 → `gitee_ok=true`, `github_ok=false`, `uploaded=false`\n  - 即：Gitee 已三单一致，GitHub 尚未一致\n- 可稍后对失败的平台单独重试\n- 重试成功 → 对应平台的 `*_ok=true`，`uploaded` 自动更新\n\n---\n\n## ZIP 打包\n\n### Q5: 本地有 html 文件被混入 ZIP？\n\n先删除临时文件再执行同步：\n\n```bash\nrm -f $SKILLS_DIR/<skill-name>/*.html\n```\n\n或在 skill 目录下添加 `.gitignore` 规则排除 html。\n\n### Q6: ZIP 包太大怎么办？\n\n检查是否有意外包含的大文件（数据集、模型、图片等）：\n\n```bash\n# 查看 ZIP 内容大小\nunzip -l $SKILLS_DIR/.dist/<skill-name>-v*.zip | sort -rn -k4 | head -20\n```\n\n常见的大文件来源：\n- `__pycache__/` 缓存目录（应被自动排除）\n- `.git/` 版本控制目录（应被自动排除）\n- 数据文件或模型权重\n\n### Q7: 如何验证 ZIP 内容是否正确？\n\n```bash\n# 解压到临时目录检查\nmkdir /tmp/zip-check && cd /tmp/zip-check\nunzip $SKILLS_DIR/.dist/<skill-name>-v*.zip\nfind . -type f | head -30\n```\n\n---\n\n## 维护清单 (manifest)\n\n### Q8: \"NOT_FOUND\" 提示是什么意思？\n\n表示要同步的 skill 不在 manifest.json 清单中。此时会询问你三个选项：\n\n| 选项 | 含义 |\n|------|------|\n| **加入清单** | 将此 skill 注册到 manifest.json，标记 uploaded=false，继续同步 |\n| **仅本次同步** | 不更新清单，只执行本次同步操作 |\n| **中止** | 取消本次同步 |\n\n建议选择\"加入清单\"，方便后续版本管理和全量维护。\n\n### Q9: 版本号对比显示\"清单 version > 待更新版本\"？\n\n这表示清单中记录的版本号比你要同步的版本还高，属于异常情况——**同步前仓库和清单必须一致**，出现这个说明之前的三单一致被破坏了。常见原因包括：\n- 手动编辑了 manifest.json 导致版本混乱\n- 上次同步后版本号没有正确递增\n- 本地改了版本号但没推送（清单比本地高）\n\n处理策略选择：\n- **覆盖** — 用待更新版本覆盖清单记录（如果确认清单错了）\n- **拉取** — 从仓库获取最新版本号（如果仓库更新过）\n- **合并** — 人工确认正确版本\n- **中止** — 先调查清楚再执行\n\n### Q10: README.md 和仓库实际内容不一致？\n\n正常情况下不应发生——README.md 由 `sync-readme` 全量生成，永远等于仓库实际内容。\n\n如果发现不一致，运行（`<repo>` 为 `config.json` 注册表中配置的仓库名）：\n\n```bash\ncd $SKILLS_DIR/git-sync/scripts\npython manifest.py sync-readme <repo>\n```\n\n---\n\n## 敏感信息过滤\n\n### Q11: 扫描结果误报怎么办？\n\n自 v2.24.2 起，敏感扫描由 **LLM 自动决策**，无需人工交互。LLM 会根据 context 自动判断：\n\n| 误报场景 | LLM 自动处理 |\n|---------|-------------|\n| 示例邮箱在文档中 | 识别为 public_docs 中的署名邮箱 → 保留 |\n| 类似 Token 的 UUID 字符串 | 匹配 Token 模式但缺乏密钥上下文 → LLM 判断为 false positive，保留 |\n| 配置用户名在代码注释中 | 匹配 config.json 中的 author/gitee.user → 标记为 low，保留 |\n| 本地路径在文档中 | public_docs 中的路径 → 保留；代码中硬编码 → 脱敏 |\n\n⚠️ **安全说明**：敏感信息脱敏为强制流程，不可跳过。所有推送到公开仓库的文件均经过自动脱敏处理。\n\n### Q12: 脱敏后的文件能恢复吗？\n\n- **源文件**：永远不会被更新（脱敏作用于副本）\n- **仓库副本**：会被脱敏覆盖；如需恢复，重新执行一次 git-sync 即可从源文件重新同步\n- **ZIP 包中的文件**：已脱敏；重新打包即可\n\n---\n\n## 审查规则 (R-01~R-26)\n\n### Q13: 审查 ERROR 会阻止同步吗？\n\n不会。自 v1.8.0 起，审查为**纯警告模式**：\n\n- ERROR/WARN 仅在报告中体现\n- 始终返回 exit(0)\n- 不阻断、不中止、不强制修复\n- 建议逐步优化而非强制一次性通过全部规则\n\n### Q14: 如何单独运行审查？\n\n自 v2.6.31 起，审查已内联到 `git-sync.py` 的 `step_skill_audit()` 中，作为同步工作流的一部分自动执行。不再提供独立 CLI。\n\n审查作为步骤 3.5（规范元数据之后、文件同步之前）自动运行，检查：\n- 版本一致性（`_meta.json` vs `SKILL.md` frontmatter）\n- R-23 脚本引用规范\n\n无需手动调用。如果需要跳过审查，目前不支持单独跳过，但审查本身是纯警告模式，不影响同步流程。\n```\n\nFile v2.48.0:references/guide.md\n\n# git-sync 完整使用指南\n\n> 本文档是 SKILL.md 的渐进式补充，包含完整的执行流程、步骤详解和配置说明。\n\n---\n\n## 完整执行流程（步骤 0 → 9）\n\n### 步骤 0：参数解析 + 类型检测（v2.25+）\n\n| 操作 | 说明 |\n|------|------|\n| 参数解析 | `--skip-market` / `--market-only` / `--pypi` / `--release` |\n| `all` 模式 | `git-sync all` 遍历配置的全部仓库项目（仓库名/路径由 `config.json` 的 `repos` 注册表决定） |\n| 类型检测 | 自动识别 skill（`_meta.json`）或 agent（`__init__.py`） |\n| 版本号读取 | skill→`_meta.json`，agent→`__init__.py` 中的 `__version__` |\n\n### 步骤 0.7：版本号比对（v1.6+）\n\n与仓库中已有版本对比，决定是否需要同步：版本相同跳过，本地更新则正常升级。\n\n### 步骤 1：维护清单检查（v1.3+）\n\n同步前自动检查 `manifest.json`。\n\n### 步骤 2~3.5：标准校验（仅 skill）\n\n| 步骤 | 操作 | 适用 |\n|------|------|------|\n| 2 | `_meta.json` 标准化校验 | skill 仅 |\n| 3 | SKILL.md 规范审查（只读） | skill 仅 |\n\n### 步骤 3.7：LLM 文件过滤器（v2.29.0，替换硬编码黑名单）\n\nPython 扫描源目录文件树 + 自动查找规则文件（`blueprint*`, `*rules*`, `blueprints/`），生成扫描报告后**全量打印文件列表 + 排除规则到 stdout**，要求调用方（AI 助手）在回复中输出决策 JSON。决策写入 `.file_filter_{name}.json.decisions.json`，**重新运行 git-sync 后读取该文件继续同步**。\n\n交互流程：\n1. git-sync 扫描文件 → 打印完整文件列表 + 排除规则 → 退出（返回 None）\n2. 调用方（AI 助手）看到输出后，审核文件列表，按规则决定保留/排除\n3. 调用方（AI 助手）在回复中输出 `{\"allow\": [\"path/to/file.py\", ...]}`，**同时写入决策文件**\n4. 重新运行 git-sync → 读取决策文件 → 只复制允许的文件 → 继续后续步骤\n\n| 环境 | 行为 |\n|------|------|\n| 有决策文件 | 直接读取，跳过审核 |\n| 无决策文件 | 打印审核指令，等待调用方（AI 助手）回复决策 |\n| 决策文件解析失败 | 默认保留所有文件 |\n\n> ⚠️ **决策文件写入规范（2026-08-09 实战教训，必须遵守）**\n>\n> **🔥 铁律第一条：让位 → 写决策 → 重跑，必须在同一条 Bash 命令里完成，一次跑完，禁止拆成多条命令。**\n>\n> 2026-08-09 git-sync 自推送实战：拆成\"先跑让位 → 再单独写决策 → 再重跑\"三条命令时，第二次命令里 scan/resume 文件**凭空消失**（git-sync 每次运行会重建/清理 temp），导致反复\"决策文件存在却读不到\"→ 重试 N 次全部失败；合并为一条命令 `让位 && 写决策 && 重跑` 后**一次通过**。这是已确认的根因规律，不是偶然。\n>\n> 决策文件**必须用 git-sync 自己的路径函数写入**，严禁用 Write 工具或跨进程手写路径：\n>\n> ```bash\n> # ✅ 正确姿势：一条 Bash 命令完成全流程（cd 到 git-sync/scripts 后）\n> python git-sync.py <name> --skip-market ; \\\n> python -c \"import sys,json; sys.path.insert(0,'.'); from _paths import temp_filter_decisions_path; dec=temp_filter_decisions_path('<name>'); dec.write_text(json.dumps({'allow':[...],'exclude':[...]},ensure_ascii=False))\" ; \\\n> python git-sync.py <name> --skip-market\n> ```\n>\n> ```python\n> # ✅ 决策内容生成（在 git-sync scripts 目录下，import _paths 用其路径函数写入）\n> import sys; sys.path.insert(0, r'<GIT_SYNC_DIR>/scripts')\n> from _paths import temp_filter_decisions_path\n> dec = temp_filter_decisions_path('<name>')\n> dec.write_text(json.dumps({'allow': [...], 'exclude': [...]}), encoding='utf-8')\n> ```\n>\n> ❌ **错误做法（会导致\"决策文件存在却读不到\"→ 反复让位死循环）**：\n> - **把\"让位/写决策/重跑\"拆成多条独立 Bash 命令**（temp 文件跨命令被重建/清理，必现\"文件消失\"）\n> - 用 Write 工具写决策文件（写入可能被沙箱隔离，git-sync 进程看不到）\n> - 手写硬编码路径（`C:\\Users\\...\\temp\\file_filter_xxx.decisions.json`），一旦 `_paths.py` 的 `TEMP_DIR` 解析不同则路径不一致\n> - 跨 Bash 进程写入后立即重跑（沙箱视图不同，文件\"消失\"）\n>\n> **症状识别**：重跑 git-sync 仍显示\"已让位（exit 3）：请写入决策文件后重跑\"，但 `ls` 明明能看到决策文件——这就是命令拆分/路径/沙箱不一致，**合并为一条命令**并按 ✅ 方式重写决策文件即可。**在 git-sync 脚本环境下（`from _paths import ...`）写入并验证 `dec.exists()` 为 True，与重跑放在同一条命令里，一次通过。**\n\n### 步骤 4：同步文件\n\n仅复制 LLM 允许列表中的文件到目标仓库（按 `get_work_repo(type)` 解析，v2.37.0 多仓库模型：skill → 技能仓库、agent → 智能体仓库，具体路径见 `config.json` 注册表）。\n\n### 步骤 4.5：LLM 脱敏\n\n扫描已同步文件中的敏感信息（邮箱/token/IP），LLM 自动决策 keep/sanitize，执行脱敏。\n\n> ⚠️ **脱敏决策写入规范**：与步骤 3.7 相同——**同样必须在同一条 Bash 命令里完成让位→写决策→重跑**，用 `_paths.py` 的 `temp_scan_decisions_path('<name>')` 写入，`{\"相对路径\": \"keep\"|\"sanitize\"}` 格式。**critical 级发现（Token/密钥）必须 sanitize，公开署名（如作者 wUwproject）与第三方库作者邮箱可 keep。** 脱敏是强制安全门禁（v2.31.0 起不可跳过），决策文件缺失会反复让位。\n\n### 步骤 5：更新 README.md（skill + agent）\n\n按仓库类型扫描：技能仓库扫技能目录，智能体仓库扫智能体目录（仓库路径由 `config.json` 注册表决定），生成技能表格 + 智能体表格。\n\n### 步骤 6：提交并推送到双平台\n\nGitee + GitHub，失败自动 pull --rebase 重试。\n\n### 步骤 6.7：更新清单上传状态\n\n### 步骤 7：生成 ZIP 安装包（仅 skill）\n\n### 步骤 7.5：打包前敏感扫描\n\n### 步骤 8：发布到平台（非静默，直接输出）\n\n| 类型 | 平台 | 命令 |\n|------|------|------|\n| skill | ClawHub | `npx clawhub publish`（shell=True，已知 CLI bug）|\n| skill | SkillHub | `skills_store_cli.py publish --version <ver>`（必须传 --version）|\n| agent | PyPI | 隔离构建 → `twine upload --disable-progress`（--pypi 标志）|\n\n### 步骤 9：创建 Release（--release 标志）\n\n打 tag + 推双平台 + 创建 GitHub Release + Gitee 发行版。\n- tag 格式：skill=`{name}-v{ver}`，agent=`v{ver}`\n- 源码包由 GitHub/Gitee 自动从 tag 生成（Source code zip/tar.gz）\n- 同时推送 `pypi/{type}/{name}/{version}` 触发 tag，供 GitHub Actions Trusted Publisher 工作流使用\n- 仅 `--release` 标志时执行，平时同步不创建 Release\n\n### 步骤 1：_meta.json 版本同步\n\n同步 version 字段，补全缺失的 name/description，**保留所有既有字段**（不删除任何字段）。\n\n| 标准字段 | 缺失时处理 |\n|---------|-----------|\n| `name` | 使用目录名 |\n| `version` | 使用传入的 version 参数 |\n| `description` | 从 SKILL.md 提取 |\n| `author` | 从 config.json 读取（缺省为 `your-name-here`） |\n| `tags` | 设为空数组 `[]` |\n\n### 步骤 1.5：SKILL.md 内联审计（v2.6.31+）\n\n- **方式**：`git-sync.py` 内置 `step_skill_audit()`，作为同步工作流的一部分自动执行\n- **检查项**：版本一致性（`_meta.json` vs `SKILL.md` frontmatter）+ R-23 脚本引用规范\n- **模式**：纯警告不阻断（始终 exit(0)）\n- **输出**：终端打印检查报告（ERROR=0 WARN=N PASS=M）\n\n### 步骤 2：同步文件到工作仓库\n\n将技能从 `$SKILLS_DIR/<skill-name>/` 同步到目标仓库（`get_work_repo(type)` 返回的仓库路径下的 `<name>/` 目录，具体路径由 `config.json` 注册表声明）。\n\n### 步骤 3：全量重新生成 README.md\n\n> **关键原则**：README.md = 仓库实际内容，不手动维护。\n\n从仓库实际目录扫描，全量替换 README.md 中的技能列表表格和目录结构（多仓库模型下各仓库维护各自 README）。\n\n### 步骤 3.5：SKILL.md 审查输出\n\n审查结果以人类可读格式打印到终端：\n\n```\n==================================================\n📋 Skill 更新检查报告: <skill-name>\n==================================================\n\n✅ 通过项:\n   ✅ _meta.json 结构正常\n   ...\n\n⚠️  警告/建议:\n   💡 具体警告信息...\n\n结论: ERROR=0 WARN=1 PASS=5\n```\n\n### 步骤 4：提交并推送到双平台\n\n```bash\ngit add → git commit → git pull --rebase → git push\n```\n\n推送结果分别记录（对应三单一致的状态标记）：\n- 码云成功 → 更新 `gitee_version` + 标记 `gitee_ok=true`（Gitee 三单一致）\n- GitHub 成功 → 更新 `github_version` + 标记 `github_ok=true`（GitHub 三单一致）\n- `uploaded` = `gitee_ok AND github_ok`（双平台均三单一致）\n\n### 步骤 5：生成 ZIP 安装包\n\n```\n输出: `.dist/<skill-name>-v<x.x.x>.zip`\n排除: *.zip, __pycache__/, .DS_Store, .git, *.html, *.log, ...\n```\n\n打包在临时副本中进行，不影响源文件。敏感信息过滤（如果启用）作用于副本。\n\n### 步骤 6：统一输出 + HTML 索引\n\n1. 复制 ZIP 到统一目录 `$SKILLS_DIR/.dist/`\n2. 自动生成/刷新 `index.html` 索引页（含 file:// 链接 + 文件大小 + 时间）\n3. 自动打开 dist/ 目录（Windows explorer / macOS open / Linux xdg-open）\n\n> **每次执行完毕后 AI 必须主动调用 `preview_url` 打开 index.html。**\n\n---\n\n## config.json 完整配置模板（v2.37.0 多仓库模型）\n\n> 实际配置位于数据目录（`$SKILLS_DIR/.standardization/git-sync/data/config.json`），含 repos 注册表。**下方为示例结构，仓库名/路径/用户名均需按用户实际配置修改。**\n\n```json\n{\n  \"author\": \"你的作者名\",\n  \"email\": \"你的邮箱（可选，用于 git commit author）\",\n  \"gitee\": {\n    \"user\": \"你的码云用户名\"\n  },\n  \"github\": {\n    \"user\": \"你的 GitHub 用户名\"\n  },\n  \"repos\": {\n    \"示例仓库名_skills\": {\n      \"type\": \"skills\",\n      \"path\": \"C:/Users/你的用户名/你的技能仓库本地路径\",\n      \"gitee\": { \"user\": \"你的码云用户名\", \"repo\": \"技能仓库名\" },\n      \"github\": { \"user\": \"你的 GitHub 用户名\", \"repo\": \"技能仓库名\" },\n      \"readme\": { \"title\": \"技能仓库标题\", \"description\": \"仓库描述\", \"repo_name\": \"技能仓库名\", \"banner\": \"历史存档说明（可选）\" }\n    },\n    \"示例仓库名_agents\": {\n      \"type\": \"agents\",\n      \"path\": \"C:/Users/你的用户名/你的智能体仓库本地路径\",\n      \"gitee\": { \"user\": \"你的码云用户名\", \"repo\": \"智能体仓库名\" },\n      \"github\": { \"user\": \"你的 GitHub 用户名\", \"repo\": \"智能体仓库名\" },\n      \"readme\": { \"title\": \"智能体仓库标题\", \"description\": \"仓库描述\", \"repo_name\": \"智能体仓库名\", \"banner\": \"历史存档说明（可选）\" }\n    }\n  },\n  \"source_overrides\": {},\n  \"gitee_token\": \"可选：Gitee API token\"\n}\n```\n\n**关键字段说明**：\n\n| 字段 | 影响范围 |\n|------|---------|\n| `author` | `_meta.json` 默认作者名；敏感扫描中的用户名检测基准 |\n| `email` | git commit 的 author email（`git-sync.py` 中的 `step_commit_and_push()` 使用） |\n| `repos.<name>.type` | 仓库类型：`skills`（skill 项目）或 `agents`（agent 项目），`get_repo_name()` 按此匹配项目归属 |\n| `repos.<name>.path` | 仓库本地路径，`get_work_repo(type)` 据此返回 |\n| `repos.<name>.gitee/github` | 各平台用户名 + 仓库名（推送目标） |\n| `repos.<name>.readme` | README 生成配置（标题、描述、banner 存档说明） |\n| `gitee_token` | Gitee API token（Release 创建等 API 操作） |\n\n---\n\n## 跨平台环境适配\n\n> 本技能优先用 `rsync` 做本地文件同步；rsync 不可用时（如部分 Windows Git 环境）自动 fallback 到 Python 完整流程（`git-sync.py`），功能等价，无需手动干预。\n\n### 环境矩阵\n\n| 环境 | rsync 是否可用 | 说明 |\n|------|----------------|------|\n| Linux / macOS | ✅ 自带 | 无需额外操作 |\n| Git for Windows 完整版 | ✅ 自带 | 位于 Git 安装目录的 usr/bin/ 下 |\n| **Windows 便携版 Git** | ❌ 不含 | 需手动安装（见下方） |\n| Cygwin / MSYS2 | ✅ 自带 | 通过包管理器安装 |\n| WSL | ✅ 自带 | 无需额外操作 |\n\n### Windows 下 Python 路径转换问题（重要）\n\n当 `rsync` 不可用时，脚本会 fallback 到 `sync_with_exclude.py`（Python 方案）。\n\n**问题根因：**\n- Git Bash 只对 **MSYS2 编译的程序** 自动转换 Unix 路径（`/c/Users/...` → `C:\\Users\\...`）\n- 如果 `python` 是 **Windows 原生 exe**（如 `.workbuddy\\binaries\\...`），路径不会被转换\n- Python 收到 `/c/Users/...` 会误解为 `C:\\c\\Users\\...`，导致文件找不到\n\n**症状：**\n```\nC:\\Users\\USERNAME\\.workbuddy\\binaries\\python\\...\\python.exe: can't open file 'c:\\\\c\\\\Users\\\\...'\n```\n\n**解决方案（任选其一）：**\n\n| 方案 | 操作 | 推荐度 |\n|------|------|--------|\n| **A. 安装 rsync** | 见下方「各平台安装 rsync」| ⭐⭐⭐ 最推荐 |\n| **B. 用 MSYS2 版 Python** | `pacman -S python`（MSYS2 内）| ⭐⭐ |\n| **C. 手动调用 Python 时传 Windows 路径** | `python sync_with_exclude.py \"C:\\...\" \"C:\\...\"` | ⭐ 临时 |\n\n### 各平台安装 rsync\n\n#### Windows（便携版 Git 环境）\n\n**方式一：下载独立 rsync.exe 放到 Git 的 usr/bin**\n\n```bash\n# 在 Git Bash 中执行，下载 rsync.exe 到 Git 安装目录的 usr/bin/\ncd $GIT_INSTALL/usr/bin/\n# 从 Git for Windows 获取 rsync 工具\n# 在 Git Bash 中执行：\ncd $GIT_INSTALL/usr/bin/\n# 安装 rsync（如已安装可跳过）\n# 验证\nrsync --version\n```\n\n# 验证\nrsync --version\n```\n\n**方式二：安装完整版 Git for Windows**\n\n从 [git-scm.com](https://git-scm.com/download/win) 下载安装，**安装时勾选「Use Unix tools from the Command Prompt」**，安装后 `rsync` 可用。\n\n#### Linux\n\n```bash\n# Debian/Ubuntu\nsudo apt install rsync\n\n# RHEL/CentOS\nsudo yum install rsync\n\n# Arch\nsudo pacman -S rsync\n```\n\n#### macOS\n\n```bash\n# 自带 rsync，如缺失：\nbrew install rsync\n```\n\n#### MSYS2 / Cygwin\n\n```bash\n# MSYS2\npacman -S rsync\n\n# Cygwin（通过安装程序添加 rsync 包）\n```\n\n### 故障排除\n\n| 错误信息 | 原因 | 解决方法 |\n|---------|------|---------|\n| `rsync: command not found` | rsync 未安装或未在 PATH | 按上方对应平台安装 |\n| `can't open file 'c:\\\\c\\\\Users\\\\...'` | Python fallback 路径转换失败 | 安装 rsync，或传 Windows 路径调用 Python |\n| `SCRIPT_DIR` 路径计算错误 | 用绝对路径调用 `bash git-sync.sh` | **先 `cd` 到脚本目录再执行**（见下方正确调用方式）|\n\n### 正确调用方式\n\n本机 rsync 不可用，实际走 `git-sync.py`（`git-sync.sh` 会自动切换）。支持以下用法：\n\n```bash\n# 基础用法（自动识别类型，版本号自动从 _meta.json/__init__.py 读取）\npython git-sync.py <name>\n\n# 跳过市场发布\npython git-sync.py <name> --skip-market\n\n# 只发市场不推 git\npython git-sync.py <name> --market-only\n\n# 发布到 PyPI（仅 agent）\npython git-sync.py <name> --pypi\n\n# 创建 Release\npython git-sync.py <name> --release\n\n# 全部项目\npython git-sync.py all\n\n# 组合使用\npython git-sync.py rag-assistant --pypi --release --skip-market\n```\n\n> ⚠️ 注意：`git-sync.py` 不接收版本号位置参数（版本自动读取），`--skip-market` 同时跳过市场与 PyPI。\n\n---\n\n## 配置说明（LLM 参考）\n\n> 本技能的配置存放在数据目录，脚本自动读取，无需手动创建文件。**完整结构见上文「config.json 完整配置模板（v2.37.0 多仓库模型）」**，此处仅补充定位与字段要点。\n\n### 配置文件位置\n\n| 文件 | 路径 | 说明 |\n|------|------|------|\n| `config.json` | `$SKILLS_DIR/.standardization/git-sync/data/config.json` | 平台用户名、repos 注册表、gitee_token 等配置 |\n| `manifest.json` | `$SKILLS_DIR/.standardization/git-sync/data/manifest.json` | 技能同步状态清单（按 repos 组织条目） |\n\n### config.json 字段要点（v2.37.0 多仓库）\n\n| 字段 | 说明 |\n|------|------|\n| `author` | `_meta.json` 默认作者名；敏感扫描中的用户名检测基准 |\n| `repos` | **核心注册表**：每个仓库条目含 `type`（skills/agents）、`path`、`gitee`/`github`（user+repo）、`readme` 配置 |\n| `repos.<name>.type` | 项目类型→仓库归属的唯一映射（skill→skills 仓库、agent→agents 仓库） |\n| `gitee_token` | Gitee API token（Release 创建等 API 操作） |\n| `source_overrides` | 个别项目的源路径覆盖（manifest 未命中时用） |\n\n### 脚本读取方式\n\n所有 `git-sync` 脚本**不从 `_paths.py` 之外的任何地方读取路径**——路径常量在 `scripts/_paths.py` 统一定义，脚本直接引用：\n\n```python\n# scripts/_paths.py（唯一路径来源）\nSKILLS_ROOT   = SKILL_DIR.parent                       # 技能安装根目录\nCONFIG_FILE   = SKILLS_ROOT / \".standardization\" / \"git-sync\" / \"data\" / \"config.json\"\nMANIFEST_FILE = SKILLS_ROOT / \".standardization\" / \"git-sync\" / \"data\" / \"manifest.json\"\nWORK_REPO     = get_work_repo(type)                    # 从 config.json 注册表解析\n\n# 其他脚本一律：\nfrom _paths import CONFIG_FILE, MANIFEST_FILE, WORK_REPO\n```\n\n### 初始化配置\n\n首次使用本技能前，确保数据目录中存在 `config.json`（**必须含 repos 注册表**，参考上文完整模板）：\n\n```bash\nmkdir -p $SKILLS_DIR/.standardization/git-sync/data\n# 将上文「config.json 完整配置模板」写入该路径，替换占位符\n```\n\n> ⚠️ `config.json` 含用户名等敏感信息，已被排除在同步/打包范围外，不会上传到远程仓库。\n\nFile v2.48.0:references/LICENSE.md\n\nMIT License\r\n\r\nCopyright (c) 2026 [username-redacted]\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\nSOFTWARE.\n\nFile v2.48.0:references/permissions.md\n\n# 基于 skill-standardization 渐进式披露规范的权限说明\r\n\r\n本文档由 `skill-standardization` 权限扫描器自动维护。\r\n\r\n## 风险等级\r\n\r\n**CRITICAL**（实际权重: 0.9）\r\n\r\n## 权限总览\r\n\r\n| 权限类别 | 涉及项数 | 风险等级 |\r\n|-----------|----------|----------|\r\n| `subprocess_call` | 15 项 | 🔴 HIGH |\r\n| `file_delete` | 19 项 | 🔴 HIGH |\r\n| `network_access` | 2 项 | 🔴 HIGH |\r\n| `sensitive_access` | 9 项 | 🔴 HIGH |\r\n| `critical_write` | 0 项 | ✅ LOW |\r\n\r\n## 高权限操作说明\r\n\r\n- **子进程调用（subprocess）**（15 项，unified）\r\n\r\n- **文件删除**（19 项，unified）\r\n\r\n- **网络访问**（2 项，silent）\r\n\r\n- **敏感信息访问**（9 项，unified）\r\n\r\n\r\n## 权限详细说明\r\n\r\n### 子进程调用（subprocess）（15 项）\r\n\r\n> **功能说明**：技能需要通过 subprocess/操作系统调用来执行外部命令或脚本。\r\n> **授权方式**：unified\r\n\r\n| 文件 | 行号 | 匹配内容 | 功能说明 |\r\n|------|------|----------|----------|\r\n| `scripts\\git-sync.py` | 11 | `subprocess` | 自动化技能：一次性授权，后续自动执行不再询问 |\r\n| `scripts\\git-sync.py` | 96 | `subprocess` | 自动化技能：一次性授权，后续自动执行不再询问 |\r\n| `scripts\\git-sync.py` | 98 | `subprocess` | 自动化技能：一次性授权，后续自动执行不再询问 |\r\n| `scripts\\git-sync.py` | 108 | `subprocess` | 自动化技能：一次性授权，后续自动执行不再询问 |\r\n| `scripts\\git-sync.py` | 109 | `subprocess` | 自动化技能：一次性授权，后续自动执行不再询问 |\r\n| `scripts\\git-sync.py` | 117 | `subprocess` | 自动化技能：一次性授权，后续自动执行不再询问 |\r\n| `scripts\\git-sync.py` | 120 | `subprocess` | 自动化技能：一次性授权，后续自动执行不再询问 |\r\n| `scripts\\git-sync.py` | 122 | `subprocess` | 自动化技能：一次性授权，后续自动执行不再询问 |\r\n| `scripts\\git-sync.py` | 123 | `subprocess` | 自动化技能：一次性授权，后续自动执行不再询问 |\r\n| `scripts\\git-sync.py` | 834 | `subprocess` | 自动化技能：一次性授权，后续自动执行不再询问 |\r\n| `scripts\\permission_checker.py` | 86 | `SUBPROCESS` | 自动化技能：一次性授权，后续自动执行不再询问 |\r\n| `scripts\\permission_checker.py` | 98 | `Subprocess` | 自动化技能：一次性授权，后续自动执行不再询问 |\r\n| `scripts\\permission_checker.py` | 259 | `subprocess` | 自动化技能：一次性授权，后续自动执行不再询问 |\r\n| `scripts\\permission_checker.py` | 608 | `subprocess` | 自动化技能：一次性授权，后续自动执行不再询问 |\r\n| `scripts\\permission_checker.py` | 616 | `SUBPROCESS` | 自动化技能：一次性授权，后续自动执行不再询问 |\r\n\r\n\r\n### 文件删除（19 项）\r\n\r\n> **功能说明**：技能在执行过程中需要删除临时文件或清理旧版产物。\r\n> **授权方式**：unified\r\n\r\n| 文件 | 行号 | 匹配内容 | 功能说明 |\r\n|------|------|----------|----------|\r\n| `scripts\\clean_zip_source.py` | 62 | `os.remove` | 自动化技能：一次性授权，后续自动执行不再询问 |\r\n| `scripts\\clean_zip_source.py` | 78 | `shutil.rmtree` | 自动化技能：一次性授权，后续自动执行不再询问 |\r\n| `scripts\\git-sync.py` | 340 | `shutil.rmtree` | 自动化技能：一次性授权，后续自动执行不再询问 |\r\n| `scripts\\git-sync.py` | 362 | `shutil.rmtree` | 自动化技能：一次性授权，后续自动执行不再询问 |\r\n| `scripts\\git-sync.py` | 727 | `shutil.rmtree` | 自动化技能：一次性授权，后续自动执行不再询问 |\r\n| `scripts\\git-sync.py` | 807 | `shutil.rmtree` | 自动化技能：一次性授权，后续自动执行不再询问 |\r\n| `scripts\\git-sync.sh` | 147 | `rm` | 自动化技能：一次性授权，后续自动执行不再询问 |\r\n| `scripts\\git-sync.sh` | 212 | `rm` | 自动化技能：一次性授权，后续自动执行不再询问 |\r\n| `scripts\\git-sync.sh` | 231 | `rm` | 自动化技能：一次性授权，后续自动执行不再询问 |\r\n| `scripts\\git-sync.sh` | 250 | `rm` | 自动化技能：一次性授权，后续自动执行不再询问 |\r\n| `scripts\\git-sync.sh` | 253 | `rm` | 自动化技能：一次性授权，后续自动执行不再询问 |\r\n| `scripts\\git-sync.sh` | 339 | `rm` | 自动化技能：一次性授权，后续自动执行不再询问 |\r\n| `scripts\\git-sync.sh` | 356 | `rm` | 自动化技能：一次性授权，后续自动执行不再询问 |\r\n| `scripts\\git-sync.sh` | 370 | `rm` | 自动化技能：一次性授权，后续自动执行不再询问 |\r\n| `scripts\\git-sync.sh` | 379 | `rm` | 自动化技能：一次性授权，后续自动执行不再询问 |\r\n| `scripts\\git-sync.sh` | 382 | `rm` | 自动化技能：一次性授权，后续自动执行不再询问 |\r\n| `scripts\\git-sync.sh` | 395 | `rm` | 自动化技能：一次性授权，后续自动执行不再询问 |\r\n| `scripts\\manifest.py` | 78 | `os.unlink` | 自动化技能：一次性授权，后续自动执行不再询问 |\r\n| `scripts\\sync_with_exclude.py` | 117 | `shutil.rmtree` | 自动化技能：一次性授权，后续自动执行不再询问 |\r\n\r\n\r\n### 网络访问（2 项）\r\n\r\n> **功能说明**：技能需要通过网络连接到外部服务或远程仓库。\r\n> **授权方式**：silent\r\n\r\n| 文件 | 行号 | 匹配内容 | 功能说明 |\r\n|------|------|----------|----------|\r\n| `scripts\\git-sync.py` | 479 | `urllib` | 自动化技能：中风险静默执行，仅记录 |\r\n| `scripts\\git-sync.py` | 543 | `urllib` | 自动化技能：中风险静默执行，仅记录 |\r\n\r\n\r\n### 敏感信息访问（9 项）\r\n\r\n> **功能说明**：技能代码中检测到敏感关键词（token/password 等）。\r\n> **授权方式**：unified\r\n\r\n| 文件 | 行号 | 匹配内容 | 功能说明 |\r\n|------|------|----------|----------|\r\n| `scripts\\git-sync.py` | 82 | `credential.helper` | 自动化技能：一次性授权，后续自动执行不再询问 |\r\n| `scripts\\git-sync.py` | 112 | `credential.helper=` | 自动化技能：一次性授权，后续自动执行不再询问 |\r\n| `scripts\\git-sync.py` | 113 | `credential.https://gitee.com.provider=` | 自动化技能：一次性授权，后续自动执行不再询问 |\r\n| `scripts\\git-sync.py` | 114 | `credential.https://github.com.provider=` | 自动化技能：一次性授权，后续自动执行不再询问 |\r\n| `scripts\\git-sync.py` | 513 | ` 用户名或密码/Token 错误` | 自动化技能：一次性授权，后续自动执行不再询问 |\r\n| `scripts\\git-sync.py` | 562 | ` 的凭证（remote URL 未内嵌 token，~/.git-credent` | 自动化技能：一次性授权，后续自动执行不再询问 |\r\n| `scripts\\git-sync.py` | 840 | `credential.helper` | 自动化技能：一次性授权，后续自动执行不再询问 |\r\n| `scripts\\git-sync.py` | 845 | `credential.helper` | 自动化技能：一次性授权，后续自动执行不再询问 |\r\n| `scripts\\permission_checker.py` | 449 | `credential` | 自动化技能：一次性授权，后续自动执行不再询问 |\r\n\r\n\r\n### 关键位置写入\r\n\r\n**无**。\r\n\r\n\r\n## 授权方式说明\r\n\r\n- **immediate（即时授权）**：每次执行前需获得用户批准\r\n- **unified（统一授权）**：首次执行前获得用户批准，后续不再询问\r\n- **silent（静默授权）**：无需用户交互，自动执行并记录\r\n\r\n<!-- fp:risk=CRITICAL|sensitive=9|critical_write=0|network=2|delete=19|subprocess=15|issues=45 -->\r\n\r\n## 基于 skill-function-test 的测试报告\r\n\r\n| 运行时间 | S1 场景链路 | D1-D6 功能测试 | S4 执行忠实度 | 耗时(s) |\r\n|---------|-------------|----------------|--------------|---------|\r\n| 2026-06-16 07:15 | 3/3 通过 | - | 24/24 (100%) | 323.459 |\n\nFile v2.48.0:references/pypi-github-actions.yml\n\n# GitHub Actions Workflow — PyPI Trusted Publisher 自动发布\n#\n# 将本文件放入仓库的 .github/workflows/pypi-publish.yml\n# git-sync 推 tag 格式：pypi/{type}/{name}/{version}\n# 此 workflow 监听 pypi/*/*/* 通配符自动触发\n#\n# 前置条件（一次性配置）：\n# 1. 在 PyPI 注册项目（https://pypi.org/manage/projects/），包名 {name}-ldxs\n# 2. 在 GitHub 仓库 Settings → Environments → 新建 PyPI 环境\n# 3. 在 PyPI 项目设置中添加 GitHub Trusted Publisher：\n#    - PyPI Project: {name}-ldxs\n#    - GitHub Repository: 你的仓库\n#    - Workflow name: pypi-publish.yml\n#    - Environment name: PyPI\n#    参考: https://docs.pypi.org/trusted-publishers/\n\nname: PyPI Publish\n\non:\n  push:\n    tags:\n      - 'pypi/*/*/*'\n\njobs:\n  publish:\n    runs-on: ubuntu-latest\n    environment: PyPI\n    permissions:\n      id-token: write\n      contents: read\n\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n\n      - name: Parse tag\n        id: parse\n        run: |\n          # tag 格式: pypi/{type}/{name}/{version}\n          TAG=${GITHUB_REF#refs/tags/pypi/}\n          IFS='/' read -r TYPE NAME VERSION <<< \"$TAG\"\n          echo \"name=$NAME\" >> $GITHUB_OUTPUT\n\n      - name: Set up Python\n        uses: actions/setup-python@v5\n        with:\n          python-version: '3.11'\n\n      - name: Install build\n        run: pip install build\n\n      - name: Build\n        run: |\n          cd ${{ steps.parse.outputs.name }}\n          python -m build\n\n      - name: Publish\n        uses: pypa/gh-action-pypi-publish@release/v1\n        with:\n          packages-dir: ${{ steps.parse.outputs.name }}/dist/\n\nFile v2.48.0:references/reference.md\n\n# git-sync 完整参考手册\n\n> CLI 命令速查、路径变量、排除列表、文件结构规范。\n\n---\n\n## Git 操作 Python 调用规范\n\n> ⚠️ **关键**：所有 Git 操作必须通过 `run_git()` 函数调用，**禁止**直接使用 `subprocess.run([\"git\", ...])`，否则会触发 CredentialHelperSelector 弹窗。\n\n### 核心函数：`run_git()`\n\n```python\ndef run_git(*args, workdir=None, check=True):\n    \"\"\"\n    运行 git 命令，完全静默不弹 UI。\n    关键：-c credential.helper= 覆盖所有配置文件，\n          _git_env() 注入 GIT_CONFIG_COUNT，彻底阻止弹窗。\n    \"\"\"\n    env = _git_env()\n    si = None\n    if os.name == \"nt\":\n        si = subprocess.STARTUPINFO()\n        si.dwFlags |= subprocess.STARTF_USESHOWWINDOW\n        si.wShowWindow = 0  # SW_HIDE\n    cmd = [\"git\",\n           \"-c\", \"credential.helper=\",\n           \"-c\", \"credential.https://gitee.com.provider=\",\n           \"-c\", \"credential.https://github.com.provider=\",\n           *[str(a) for a in args]]\n    return subprocess.run(cmd, cwd=str(workdir or WORK_REPO),\n                         capture_output=True, encoding=\"utf-8\",\n                         check=check, env=env,\n                         stdin=subprocess.DEVNULL,\n                         startupinfo=si)\n```\n\n### 核心函数：`_git_env()`\n\n```python\ndef _git_env(base_env: dict = None) -> dict:\n    \"\"\"\n    构造完全静默的 git 环境变量字典。\n    用 GIT_CONFIG_COUNT 注入 credential.helper=（空=禁用），\n    优先级高于所有配置文件，覆盖所有子进程（含 Python 脚本内调 git）。\n    \"\"\"\n    env = base_env.copy() if base_env else os.environ.copy()\n    env[\"GIT_TERMINAL_PROMPT\"] = \"0\"\n    env[\"GIT_CONFIG_COUNT\"] = \"1\"\n    env[\"GIT_CONFIG_KEY_0\"] = \"credential.helper\"\n    env[\"GIT_CONFIG_VALUE_0\"] = \"\"\n    return env\n```\n\n### 核心函数：`run_python()`\n\n```python\ndef run_python(script: Path, *args, capture=False, check=True):\n    \"\"\"运行 scripts/ 下的 Python 辅助脚本\"\"\"\n    env = _git_env()  # 关键：Python 脚本内调 git 也会继承这个环境\n    env[\"PYTHONUTF8\"] = \"1\"\n    cmd = [sys.executable, str(script), *[str(a) for a in args]]\n    return subprocess.run(cmd, capture_output=capture, encoding=\"utf-8\",\n                         check=check, env=env,\n                         stdin=subprocess.DEVNULL)\n```\n\n### 正确调用示例\n\n```python\n# ✅ 正确：通过 run_git() 调用\nr = run_git(\"remote\", \"get-url\", remote_name, workdir=WORK_REPO, check=False)\nraw_url = r.stdout.strip()\n\nr = run_git(\"push\", remote_name, branch, workdir=WORK_REPO, check=False)\n\nr = run_git(\"pull\", remote_name, branch, \"--rebase\",\n              workdir=WORK_REPO, check=False)\n\n# ❌ 错误：直接 subprocess.run([\"git\", ...]) 会弹窗！\nr = subprocess.run([\"git\", \"push\", \"origin\", \"main\"], ...)  # 会触发 CredentialHelperSelector\n```\n\n### 弹窗根因说明\n\n| 原因 | 说明 |\n|------|------|\n| `credential.helper=helper-selector` | PortableGit system config 自带，GUI 弹窗来源 |\n| `GIT_TERMINAL_PROMPT=0` 不够 | 只抑制终端提示，不抑制 GUI 弹窗 |\n| per-url 配置 `credential.https://gitee.com.provider=generic` | 优先级高于 global，也会触发弹窗 |\n| Python 脚本内调 `subprocess.run([\"git\", ...])` | 没继承 `-c credential.helper=` 参数 |\n\n---\n\n## 错误码与错误消息说明（AI 必读）\n\n### 为什么需要错误消息标准化\n\n`_push_with_cred_url()` 和 `_pull_with_cred_url()` 返回的错误消息已通过 `_classify_push_error()` 标准化为**中文描述**，不再直接暴露原始 stderr（如 443 超时）。\n\n### 错误消息速查表\n\n| 类别 | 错误消息前缀 | 含义 | AI 建议 |\n|------|-------------|------|---------|\n| 网络超时 | `⏱️ 网络超时` | 连接超时（443），常见于 GitHub 被墙 | 询问用户是否重试，或建议使用代理 |\n| DNS 失败 | `🌐 DNS 解析失败` | 域名无法解析 | 检查网络，稍后重试 |\n| 连接被拒 | `🔒 连接被拒绝` | 服务器端口不可达 | 检查网络/防火墙 |\n| 连接重置 | `🔌 连接被重置` | 中间设备中断连接 | 稍后重试 |\n| 网络不可达 | `📡 网络不可达` | 无网络连接 | 检查网络 |\n| SSH 失败 | `🔑 SSH 密钥认证失败` | 公钥被拒绝 | 检查 SSH 配置 |\n| 认证失败 | `🔑 认证失败` | 用户名/密码/Token 错误 | 检查凭证 |\n| 推送被拒绝 | `🔄 推送被拒绝` | 远程有未拉取的更新 | 已自动执行 pull --rebase 重试 |\n| 未知错误 | `❌ 推送失败` | 未匹配到已知模式 | 查看具体错误文本 |\n\n### AI 处理错误的原则\n\n1. **443 超时 ≠ 不可恢复**：应询问用户\"GitHub 推送失败（超时），是否重试？\"\n2. **认证失败 ≠ 代码问题**：应提示用户检查 `~/.git-credentials`\n3. **推送被拒绝 ≠ 数据丢失**：已自动执行 pull --rebase 重试逻辑\n4. **不要在日志中记录原始错误码**：使用 `log()` 函数的 `err` 级别记录标准化消息\n\n### 彻底解决方案（三管齐下）\n\n1. **`run_git()` 加 `-c credential.helper=`** — 命令行参数优先级最高，覆盖所有配置层\n2. **`_git_env()` 注入 `GIT_CONFIG_COUNT`** — 覆盖所有子进程（含 Python 脚本内调 git）\n3. **清除 system/global config 中的 `helper-selector`**（一次性操作）：\n   ```bash\n   git config --system --unset credential.helper\n   git config --global --unset credential.helper\n   git config --global credential.helper store\n   ```\n\n### 凭证管理\n\n```python\ndef _get_cred_url(host: str) -> str:\n    \"\"\"从 ~/.git-credentials 读取指定 host 的凭证，嵌入 URL\"\"\"\n    cred_file = Path.home() / \".git-credentials\"\n    if not cred_file.exists():\n        return \"\"\n    for line in cred_file.read_text().splitlines():\n        if host in line and \"@\" in line:\n            return line.strip()\n    return \"\"\n\ndef _push_with_cred_url(remote_name: str, branch: str = \"main\") -> tuple:\n    \"\"\"用凭证嵌入 URL 直接 push，完全绕开 CredentialHelperSelector\"\"\"\n    r = run_git(\"remote\", \"get-url\", remote_name,\n                 workdir=WORK_REPO, check=False)\n    raw_url = r.stdout.strip()\n    parsed = urlparse(raw_url)\n    host = parsed.hostname or \"\"\n\n    cred_url = _get_cred_url(host)\n    if not cred_url:\n        return False, f\"找不到 {host} 的凭证，请检查 ~/.git-credentials\"\n\n    # 如果 cred_url 缺少路径，从 raw_url 补全\n    parsed_cred = urlparse(cred_url)\n    if not parsed_cred.path or parsed_cred.path == '/':\n        parsed_raw = urlparse(raw_url)\n        cred_url = f\"{parsed_cred.scheme}://{parsed_cred.netloc}{parsed_raw.path}\"\n\n    # 临时覆盖 remote URL（含凭证），push 完立刻恢复\n    run_git(\"remote\", \"set-url\", remote_name, cred_url,\n             workdir=WORK_REPO, check=False)\n    try:\n        r = run_git(\"push\", remote_name, branch,\n                     workdir=WORK_REPO, check=False)\n        if r.returncode == 0:\n            return True, \"\"\n        return False, r.stderr.strip() or r.stdout.strip()\n    finally:\n        run_git(\"remote\", \"set-url\", remote_name, raw_url,\n                 workdir=WORK_REPO, check=False)\n```\n\n---\n\n## git-sync.py CLI 参数\n\n```bash\npython git-sync.py <name> [--skip-market] [--market-only] [--pypi] [--release]\n```\n\n| 参数 | 说明 |\n|------|------|\n| `--skip-market` | 跳过 ClawHub / SkillHub 市场发布 |\n| `--market-only` | 仅发布到市场，不执行同步 |\n| `--pypi` | 发布到 PyPI（仅 agent 有效） |\n| `--release` | 创建 Release：打 tag + 推双平台 + 建 GitHub/Gitee 发行版 |\n\n## manifest.py 子命令速查\n\n`manifest.py` 是独立 CLI，管理维护清单（manifest.json），不污染 git-sync 主流程。\n\n### 清单条目结构（v2.37.0 多仓库）\n\n```json\n{\n  \"repos\": {\n    \"<技能仓库名>\": {\n      \"items\": {\n        \"my-agent\": {\n          \"type\": \"agent\",\n          \"source_path\": \"C:/Users/你的用户名/你的开发目录/my-agent\",\n          \"repo_path\": \"my-agent\",\n          \"added_at\": \"2026-07-21\",\n          \"uploaded\": true,\n          \"gitee_ok\": true,\n          \"github_ok\": true,\n          \"version\": \"1.0.0\",\n          \"gitee_version\": \"1.0.0\",\n          \"github_version\": \"1.0.0\",\n          \"note\": \"\"\n        }\n      }\n    }\n  }\n}\n```\n\n| 字段 | 说明 | 自动填充 |\n|------|------|---------|\n| `type` | `skill` 或 `agent` | 必需 |\n| `source_path` | 源绝对路径（开发目录） | skill → `$SKILLS_DIR/<name>/`（技能安装目录），agent → 开发目录，可用 `--source-path` 覆盖 |\n| `repo_path` | 仓库内相对路径（多仓库模型下为顶层相对路径） | skill → `<name>/`（技能仓库顶层），agent → `<name>/`（智能体仓库顶层），可用 `--repo-path` 覆盖 |\n| `added_at` | 添加日期 | 自动 |\n| `uploaded` / `gitee_ok` / `github_ok` | 推送状态 | 自动更新 |\n| `version` / `gitee_version` / `github_version` | 版本号 | 自动更新 |\n\n### 命令参考\n\n> 仓库名参数：使用 `config.json` 注册表中实际配置的仓库名（v2.37.0 多仓库，下例用 `<repo>` 占位）。\n\n```bash\n# ── 查询类 ──\npython manifest.py list                              # 列出所有条目\npython manifest.py list <repo>                       # 按仓库过滤（如 config 中配置的任意仓库名）\npython manifest.py check <repo> my-skill             # 是否在清单内（退出码: 0=双 ok, 1=部分, 2=未找到）\npython manifest.py version <repo> my-skill           # 查询版本号\n\n# ── 更新类 ──\npython manifest.py add <repo> my-skill --type skill                  # 加入（默认路径自动填充）\npython manifest.py add <repo> my-agent --type agent                  # agent 类型\npython manifest.py add <repo> my-agent --type agent --source-path \"C:/path/to/dev\"  # 自定义源路径\npython manifest.py add <repo> my-agent --type agent --repo-path \"custom\"            # 自定义仓库路径\npython manifest.py add <repo> my-skill --type skill --uploaded      # 加入并标记已上传\npython manifest.py remove <repo> my-skill                           # 从清单删除\npython manifest.py version <repo> my-skill 1.9.0                    # 更新版本号（双平台）\npython manifest.py version <repo> my-skill 1.9.0 --platform gitee   # 仅更新码云\npython manifest.py set-uploaded <repo> my-skill --platform gitee    # 标记平台已上传\npython manifest.py set-uploaded <repo> my-skill --platform both     # 标记双平台已上传\n\n# ── 同步类 ──\npython manifest.py diff <repo>                        # 对比清单(uploaded=true) vs 仓库实际文件\npython manifest.py sync-readme <repo>                 # 根据仓库实际文件全量重新生成 README.md\n```\n\n### 三单一致模型\n\n**三单 = 三个\"单\"：**\n\n| # | 单 | 内容 | 维护方式 |\n|---|----|------|---------|\n| 第一单 | **本地源文件** | `_meta.json` version + `SKILL.md` frontmatter version | 开发者手动维护（两者必须一致） |\n| 第二单 | **远程仓库实际文件** | 推送到 Gitee/GitHub 后，目标仓库 `<name>/_meta.json`（多仓库模型顶层）中的 version | 由 git-sync 推送，与本地一致 |\n| 第三单 | **维护清单** | `manifest.json` 中的 `version` / `gitee_version` / `github_version` | 推送成功后自动更新 |\n\n**三单一致的完整语义：**\n\n```\n同步前（本地准备阶段）：\n  _meta.json version = SKILL.md frontmatter version         ← 本地版本一致\n  manifest.json version < 待推送版本                         ← 清单版本低于本地，允许升级\n\n同步中（推送阶段）：\n  不需要管版本号 — 仓库实际文件 version = 推送时的本地 version\n\n同步后（推送成功）：\n  本地 _meta.json version = 远程仓库 version = 清单 version  ← 三单一致\n  README.md = 仓库实际内容（由 sync-readme 全量生成，永远一致）\n```\n\n**上传状态标记：**\n\n| 字段 | 含义 |\n|------|------|\n| `gitee_ok=true` | Gitee 平台三单一致（Gitee 仓库 version = 清单 version = 本地 version） |\n| `github_ok=true` | GitHub 平台三单一致（同上） |\n| `uploaded=true` | 双平台均已三单一致（`gitee_ok AND github_ok`） |\n\n**结构示意：**\n\n```\n本地源文件 (_meta.json + SKILL.md frontmatter version 一致)\n    ↓ 推送\n远程仓库 (<技能仓库名>/<name>/ 或 <智能体仓库名>/<name>/ 实际文件)\n    ↓ 推送成功后更新\n维护清单 (manifest.json)\n    ├─ gitee_ok=true  → Gitee 三单一致\n    ├─ github_ok=true → GitHub 三单一致\n    └─ uploaded=true  → 双平台三单一致\n\nREADME.md（技能列表 + 目录树）\n    └─ 由 sync-readme 全量生成，永远 = 仓库实际内容\n```\n\n> **不会出现 README 有但仓库没有的情况。**\n\n---\n\n## 路径变量说明（v2.37.0 多仓库）\n\n> **统一管理机制**：所有路径在 `scripts/_paths.py` 统一定义（唯一来源），其他脚本一律 `from _paths import ...` 引用，不各自写死路径。仓库路径（`WORK_REPO` 等）由 `config.json` 的 `repos` 注册表配置 + `get_work_repo(type)` 动态解析。\n\n| 变量 | 来源 | 说明 |\n|------|------|------|\n| `SKILLS_ROOT` | `_paths.py`（`SKILL_DIR.parent`） | 技能安装根目录（`SKILL_DIR` 即本技能所在目录） |\n| `WORK_REPO` | `_paths.py` → `get_work_repo(type)`（从 `config.json` 注册表解析） | Git 工作仓库（推送目标），skill → 技能仓库、agent → 智能体仓库 |\n| `DIST_DIR` | `_paths.py`（`SKILLS_ROOT / \".dist\"`） | ZIP 统一输出目录 |\n| `MANIFEST_FILE` | `_paths.py`（`SKILLS_ROOT/.standardization/git-sync/data/manifest.json`） | 维护清单文件路径 |\n| `CONFIG_FILE` | `_paths.py`（`SKILLS_ROOT/.standardization/git-sync/data/config.json`） | 平台配置（repos 注册表） |\n| `TEMP_DIR` | `_paths.py`（`STD_DIR / \"temp\"`） | 决策文件等临时文件目录 |\n\n## ZIP 打包：LLM 动态过滤（v2.26+）\n\n自 v2.26.0 起，ZIP 包的排除列表由 **LLM 文件过滤器**（`step_llm_file_filter()`）动态生成，不再使用硬编码的排除模式列表。仅保留 Windows 保留名 `nul` 的硬排除。\n\nLLM 会在文件同步步骤前审核文件清单，保留核心代码文件（`.py`、`.md`、配置、许可等），排除运行时缓存（`__pycache__`、`*.pyc`）、日志、操作系统元文件（`.DS_Store`、`Thumbs.db`）等非必要文件。\n\n如果需要手动干预排除逻辑，请修改 `step_llm_file_filter()` 的 LLM prompt 模板（`git-sync.py`）。\n\n## Skill 标准目录结构\n\n```\n<skill-name>/\n├── SKILL.md                  # [必填] 技能主文件\n├── _meta.json                # [必填] 元数据（5字段）\n├── references/                     # [可选] 渐进式 MD 辅助文档\n│   ├── guide.md\n│   ├── examples.md\n│   ├── reference.md\n│   └── ...\n├── scripts/                  # [可选] Python/Shell 脚本\n│   ├── *.py\n│   ├── *.sh\n│   └── spec/\n├── assets/                   # [可选] 静态资源\n└── tests/                    # [可选] 测试文件\n```\n\n**根目录仅允许 SKILL.md 和 _meta.json。**\n\n---\n\n## 敏感信息过滤详细规则\n\n### 检测规则完整表\n\n| 类型 | 正则模式示例 | 严重度 | 说明 |\n|------|-------------|--------|------|\n| 邮箱地址 | `\\w+@\\w+\\.\\w+` | 🔴 critical | 任何 email 格式 |\n| Token / API Key | `token=`, `api_key=`, `secret=` | 🔴 critical | 键值对形式的密钥 |\n| 私钥内容 | `-----BEGIN .* PRIVATE KEY-----` | 🔴 critical | PEM 格式私钥 |\n| 内网 IP | `10\\.\\d+`, `172\\.(1[6-9]|2\\d|3[01])\\.`, `192\\.168\\.` | 🟡 medium | RFC1918 私有地址 |\n| 本地绝对路径 | `[A-Z]:\\\\Users\\\\`, `/home/`, `/Users/` | 🟡 medium | 用户主目录路径 |\n| 配置用户名 | config.json 中 author/gitee.user/github.user 的值 | 🟢 low | 来自配置的用户名 |\n\n> **注意**：`_meta.json` 的 `author` 字段是署名，默认不脱敏。\n\n### 运行模式（v2.24.2+ — 全自动 LLM 决策）\n\n自 v2.24.2 起，敏感扫描已完全自动化，由 LLM 决策每条敏感信息是否脱敏，无需人工交互。\n\n| 模式 | 配置方式 | 行为 |\n|------|---------|------|\n| **自动 LLM 决策**（默认） | 不配置或 `prompt` | 扫描后 LLM 自动分类每项发现：public_docs 中的署名/path 保留；Token/私钥 自动脱敏；邮箱/路径 按 context 判断 |\n| **总是脱敏** | `GIT_SYNC_SENSITIVE_MODE=always-sanitize` | 自动全部脱敏（非交互，用于 ZIP 包） |\n\n### LLM 自动决策规则\n\nLLM 接收扫描发现列表后，按以下原则自动判断：\n\n| 敏感类型 | LLM 决策倾向 | 示例 |\n|----------|-------------|------|\n| 邮箱地址 | 公开文档中的署名邮箱 → 保留；代码中的测试邮箱 → 保留；疑似个人邮箱 → 脱敏 | `user@example.com` 在 LICENSE 中 → 保留 |\n| Token / API Key | 一律脱敏 | `api_key=sk-xxx` → 替换为 `<REDACTED>` |\n| 私钥内容 | 一律脱敏 | PEM 格式密钥 → 替换 |\n| 内网 IP | 脱敏 | `192.168.1.1` → `<REDACTED_IP>` |\n| 本地绝对路径 | public_docs 中的路径 → 保留；代码中硬编码 → 脱敏 | `C:\\Users\\USERNAME` 在文档中 → 保留 |\n| 配置用户名 | 保留（来自 config.json 的 author/gitee.user） | `wUwproject` → 保留 |\n\n### 打包时行为\n\n```\n源文件（$SKILLS_DIR/my-skill/）  ← 不变\n     ↓ 复制到临时副本\n临时副本（/tmp/xxx/）                     ← 执行脱敏操作\n     ↓ 打包\n输出 ZIP → .dist/my-skill-v1.0.0.zip\n     ↓ 清理\n临时副本删除\n```\n\n同步到仓库时，脱敏作用于工作仓库副本（目标仓库 `<name>/` 目录，仓库路径由 `config.json` 注册表决定），源文件同样不变。\n\nFile v2.48.0:skill-card.md\n\n## Description:\n\nHelps developers synchronize and publish skills and agents across Gitee, GitHub, ClawHub, SkillHub, and PyPI, including releases and file filtering.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[ldxs001](https://clawhub.ai/user/ldxs001)\n\n### License/Terms of Use:\n\nMIT\n\n## Use Case:\n\nDevelopers and release maintainers use this skill to synchronize skill and agent projects, prepare packages, and publish updates and releases to configured repositories and registries.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Publishing untrusted skills or agents can execute injected commands in the ClawHub shell or generated PyPI package setup.\n\nMitigation: Do not use these release paths on untrusted content until the command injection issues are fixed; review what will be published.\n\nRisk: The tool changes local Git credential-helper settings during publishing.\n\nMitigation: Review credential-helper changes and their scope before use, and run only with credentials intended for the target repositories.\n\n## Reference(s):\n\n- [ClawHub git-sync release](https://clawhub.ai/ldxs001/skills/git-sync)\n- [Usage guide](references/guide.md)\n- [Permissions and access](references/permissions.md)\n\n## Skill Output:\n\n**Output Type(s):** [Shell commands, Configuration instructions, Guidance, Files]\n\n**Output Format:** [Markdown with shell commands; publication can create ZIP archives and indexes]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Publication and release creation require configured credentials and network access.]\n\n## Skill Version(s):\n\n2.48.0 (source: skill frontmatter, release metadata and changelog)\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\nArchive v2.47.0: 35 files, 139499 bytes\n\nFiles: _meta.json (128b), references/antipatterns.md (1340b), references/blueprint_rules.md (3385b), references/changelog.md (52250b), references/faq.md (5545b), references/guide.md (18002b), references/LICENSE.md (1097b), references/permissions.md (7866b), references/pypi-github-actions.yml (1654b), references/reference.md (17874b), scripts/_paths.py (5303b), scripts/blueprint_scan.py (4694b), scripts/build_index.py (4524b), scripts/clawhub_publish.py (2230b), scripts/clean_dist.py (1444b), scripts/clean_zip_source.py (3330b), scripts/get_config_value.py (545b), scripts/get_meta_desc.py (344b), scripts/get_meta_version.py (351b), scripts/git-sync.py (90111b), scripts/git-sync.sh (22877b), scripts/make_all_sanitize.py (499b), scripts/manifest.py (22170b), scripts/normalize_meta.py (3454b), scripts/pack_zip.py (3568b), scripts/permission_checker.py (41952b), scripts/release_creator.py (4192b), scripts/sensitive_scan.py (28686b), scripts/set_meta_version.py (486b), scripts/skillhub_publish.py (2317b), scripts/sync_with_exclude.py (6073b), scripts/update_readme.py (14343b), scripts/verify_zip.py (1191b), skill-card.md (2064b), SKILL.md (14633b)\n\nFile v2.47.0:SKILL.md\n\n---\r\nname: git-sync\r\nslug: git-sync\r\ndisplayName: git-sync\r\nversion: 2.47.0\r\nauthor: wUwproject\r\nlicense: MIT\r\ndescription: 全平台统一发布工具。支持 skills 和 agents 的 Gitee/GitHub/ClawHub/SkillHub/PyPI 同步与 Release 创建，LLM 驱动的文件过滤与脱敏。\r\nsensitive_access: true\r\ncritical_write: false\r\npermission_weight: CRITICAL\r\ndata_dir: ../.standardization/git-sync/data\r\ntags: ['sync', 'git', 'gitee', 'github', 'deploy']\r\nexternal_data_dir: true\r\ntrigger: 同步/推送/发布/上传/打包/更新 READ ME\r\ntrigger_negative: 只是看文件/通用 git 提交/文件同步到云端\r\nh1_version: true\r\nmeta_field_sync: true\r\ncreate_permissions_md: true\r\nh1_position: true\r\ndata_dir_compliance: true\r\n---\r\n# git-sync — 全平台发布工具\r\n\r\n将 skill/agent 代码规范化推送到**码云（Gitee）**、**GitHub**，并支持 **ClawHub**、**SkillHub**、**PyPI** 发布与 **Release 创建**。\r\n\r\n## 约束\r\n\r\n- **让位式 LLM 交互（v2.43.0）** — git-sync 包含两处 LLM 决策点（文件筛除、敏感脱敏），采用**让位式握手**：遇到决策点时写 resume 状态文件 + `exit 3` 退出，把控制权交还调用方（AI 助手）。调用方写入决策文件后**重跑同一命令**，git-sync 检测 resume 从当前环节续跑，不从头开始。**不再进程内轮询等待**（旧版 v2.42.0 的 120s 轮询会占用控制权导致卡死，已废弃）\r\n- **断点续跑** — `resume_{name}.json` 记录让位环节（`file_filter` / `sensitive_scan`），重跑时跳过已完成步骤。决策消费成功后 resume 自动清除\r\n- **⚠️ 决策文件必须用 `_paths.py` 路径函数写入 + 全流程一条命令（v2.45.6 实战教训，铁律）** — LLM 决策文件（`file_filter_{name}.decisions.json` / `sensitive_scan_{name}.decisions.json`）**必须**在 git-sync 脚本环境下通过 `from _paths import temp_filter_decisions_path / temp_scan_decisions_path` 写入并验证 `exists()`；**让位 → 写决策 → 重跑必须放在同一条 Bash 命令里一次跑完**（拆成多条命令时 temp 文件跨命令被重建/清理，必现\"文件存在却读不到\"→ 反复让位 exit 3 死循环，2026-08-09 git-sync 自推送重试 N 次证实）。**严禁用 Write 工具或跨进程硬编码路径写入**。完整写法见 `references/guide.md` 步骤 3.7 / 4.5 警示框\r\n- **自动检测类型** — 自动识别 skill（`_meta.json`）或 agent（rglob 扫描含 `__version__` 的 `__init__.py`，任意包目录名均可，不硬编码），分别走不同发布流程\r\n- **`all` 模式** — `git-sync all` 遍历配置的全部仓库项目（默认 skill 仓库 + agent 仓库，仓库名/路径由 `config.json` 的 `repos` 注册表决定）\r\n- **网络依赖** — 推送 Gitee/GitHub/ClawHub/SkillHub/PyPI 需要可用网络连接，超时阈值 60 秒\r\n- **冲突不自动合并** — git merge 冲突需人工介入\r\n- **多仓库模型（v2.37.0）** — 按项目类型解析目标仓库：`get_repo_name(type)` 从 `config.json` 的 `repos` 注册表匹配（`type` 字段：skills/agents），未配置时用默认名（skill→`maby_skills`、agent→`maby_agent`）。仓库本地路径、双平台 remote、README 文案全在注册表条目中声明，**用户按需配置，技能本身通用**\r\n- **参数约束** — 项目名不含路径分隔符，version 格式严格 x.y.z\r\n- **仓库规模** — 支持 1-50 个项目，每个 ≤ 500MB\r\n- **数据持久性** — manifest.json 记录同步状态，不备份远程仓库数据\r\n\r\n## 触发条件\r\n\r\n**正向触发：**\r\n- 「同步/上传/推送/发布某个 skill 或 agent」\r\n- 「全量同步/全部发布」\r\n- 「发布到 ClawHub/SkillHub/PyPI」\r\n- 「创建 Release」\r\n- 「打包/更新 README.md」\r\n- 「检查版本号」\r\n\r\n**否定条件：**\r\n- 用户只是说「帮我看看这个文件」——没有同步/打包意图\r\n- 用户要求「用 git 提交代码」——这是通用 git 操作，不是本技能\r\n\r\n## 核心能力\r\n\r\n> 📚 **渐进式加载**：本技能采用渐进式 MD 体系，`SKILL.md` 为入口（≤230行），详细内容拆分到 `references/*.md` 按需加载。\r\n\r\n- **全平台发布** —— Gitee + GitHub + ClawHub + SkillHub + PyPI，一次同步全自动\r\n- **类型自动识别** —— skill（`_meta.json`）/ agent（`__init__.py`），版本号各自读取\r\n- **路径统一管理（`_paths.py`）** —— 所有路径变量（技能目录、数据目录、仓库路径、临时目录等）在 `scripts/_paths.py` 统一定义，其他脚本一律 `from _paths import ...` 引用，不各自写死；仓库路径由 `config.json` 的 `repos` 注册表配置，`get_work_repo(type)` 动态解析\r\n- **路径由 manifest 统一管理** —— 每个条目记录 `source_path`（源路径）+ `repo_path`（仓库内路径），skill 和 agent 统一走同一套逻辑\r\n- **`all` 批量模式** —— 遍历全部 skills 和 agents 逐个同步\r\n- **LLM 文件过滤（让位式）** —— 同步前扫描源文件 → 全量打印文件列表 + 规则 → **写 resume 状态 + exit 3 让位** → 调用方（AI 助手）写 `file_filter_{name}.decisions.json` 决策 → 重跑续跑 → 只复制允许的文件\r\n- **LLM 脱敏（强制，让位式）** —— 同步后强制脱敏敏感信息（邮箱/token/路径/本地路径），无跳过选项。扫描发现敏感信息后 **exit 3 让位**，调用方写 `sensitive_scan_{name}.decisions.json` 后重跑，从脱敏环节续跑（不重复文件过滤与同步）\r\n- **版本号三方对比** —— `_meta.json` / `SKILL.md` frontmatter / changelog\r\n- **SKILL.md 规范审查** —— 内联审计（版本一致性 + R-23 脚本引用检查）\r\n- **ZIP 打包 + HTML 索引** —— 生成安装包 + 可视化索引页\r\n- **PyPI 隔离构建** —— 拷贝源码到临时目录 → 生成 setup.py → build → twine 上传，版本号自动归一化 PEP 440，dev_status 按定稿规则判别：主版本号 <1 → Beta；≥1 时纯 x.y.z 为 Production/Stable、跟随 b（x.y.zbn）为 Beta（rc/alpha/dev 已废弃）\r\n- **Release 创建** —— git tag + GitHub/Gitee API Release（技能用 `{name}-v{ver}`，智能体用 `v{ver}`），源码包由平台自动生成\r\n\r\n### 平台发布差异\r\n\r\n| 平台 | 版本读取源 | 命令/工具 | 注意事项 |\r\n|------|-----------|-----------|---------|\r\n| Gitee | `_meta.json` (skill) / `__init__.py` (agent) | `git push` | SSH/HTTPS 凭证自动解析，支持 pull --rebase 重试 |\r\n| GitHub | 同上 | `git push` | 同 Gitee，443 超时常见，会 retry |\r\n| ClawHub | `_meta.json` 的 slug/version/tags | `npx clawhub publish <绝对路径>` | **必须传绝对路径**（相对路径 `./name` 在 npx 下 resolve 失败报 \"Path must be a folder\"）；API 成功时 CLI 可能误报 `invalid value`（已知 bug），检查 `ok` 关键字即可 |\r\n| SkillHub | **必须传 `--version`**（单独读取 SKILL.md frontmatter 不可靠） | `skills_store_cli.py publish` | 不加 `--version` 可能读到旧版本导致发布失败 |\r\n| PyPI | `__init__.py` 的 `__version__` | 隔离构建 → `twine upload --disable-progress` | Windows 上 twine 的 Rich 进度条有 GBK 编码 bug，必须加 `--disable-progress` |\r\n| Release | 同步后当前版本 | `git tag` + GitHub API | tag 格式: skill=`{name}-v{ver}`, agent=`v{ver}`\r\n\r\n### 渐进式文件索引\r\n\r\n| 文件名 | 分类 | 包含内容 | 审计关联 |\r\n| -------- |------| ---------- |----------|\r\n| `references/LICENSE.md` | 许可协议 | 开源许可证声明（MIT）。包含：MIT 许可证完整文本。 | R-26 |\r\n| `references/antipatterns.md` | 规范指南 | skill 编写中的常见反模式。包含：错误做法示例、正确做法示例、避坑指引。 | R-18 |\r\n| `references/changelog.md` | 版本管理 | 版本更新日志。包含：版本号、更新类型、修复项、升级说明。 | R-24 |\r\n| `references/faq.md` | 常见问题 | 常见疑问与解答。包含：问题分类、原因分析、解决方案。 | R-19, R-25 C-19 |\r\n| `references/guide.md` | 使用指南 | 三种执行模式操作教程。包含：audit/create/refactor 流程、参数说明、注意事项。 | 无 |\r\n| `references/permissions.md` | 权限与测试 | 权限扫描说明与测试结论。包含：风险等级、高权限操作说明、测试概览、计时统计。 | R-15, R-16 |\r\n| `references/reference.md` | 命令参考 | CLI 完整命令参考。包含：所有参数、子命令、选项、示例用法。 | 无 |\r\n| `references/blueprint_rules.md` | 判断规则 | 蓝图排除/脱敏判断规则。包含：筛除原则、脱敏原则、判定流程。 | 无 |\r\n\r\n| 能力 | 说明 | 限制 |\r\n|------|------|------|\r\n| **全平台同步** | 将 skill/agent 同步到码云、GitHub、ClawHub、SkillHub、PyPI | 按 skill/agent 逐个同步，支持 `all` 批量模式 |\r\n| **版本号三方对比** | 自动对比 _meta.json / SKILL.md frontmatter / changelog 的版本一致性 | 仅检测 x.y.z 格式版本号，不处理其他格式 |\r\n| **敏感信息过滤** | 自动扫描并脱敏 secrets/regex/telemetry | 扫描范围限于 skill 目录，不扫描系统目录 |\r\n| **SKILL.md 规范审查** | 内联审计版本一致性 + R-23 脚本引用检查 | 仅做静态文本分析，不验证运行时行为 |\r\n| **ZIP 打包 + HTML 索引** | 生成安装包 + 可视化索引页 | 打包前需先同步到 workrepo |\r\n\r\n**不支持：**\r\n- 通用 git 提交：本技能专注于 skill/agent 仓库同步，通用 git 操作由用户手动完成\r\n- merge 冲突解决：遇到 git merge 冲突时不会自动合并，需要用户手动处理\r\n\r\n## 快速开始\r\n\r\n> ⚠️ **执行入口**：环境无 `rsync` 时（如部分 Windows Git 环境），`git-sync.sh` 会自动切换到 Python 完整流程。**直接调用 `python git-sync.py` 与 `bash git-sync.sh` 效果相同**，推荐直接使用 Python 入口。\r\n\r\n**场景：推送技能到双平台**\r\n用户需求：skill-name=novel-weaver, 当前版本=1.35.4, 目标版本=1.36.0\r\n系统执行：\r\n```bash\r\npython \"$SKILLS_DIR/git-sync/scripts/git-sync.py\" novel-weaver\r\n```\r\n系统输出：[1/8] 触发判断 → 继续\r\n[2/8] 安全校验 → 通过\r\n[3/8] 清单检查 → 升级至 1.36.0\r\n[4/8] 文件同步 → 已复制 47 个文件\r\n[5/8] 敏感信息脱敏 → 2 处已替换\r\n[6/8] 更新 README → 新增 1 条\r\n[7/8] 提交推送 → Gitee ✅ / GitHub ✅\r\n[8/8] 打包索引 → .zip 已生成\r\n最终输出: 码云 ✅ / GitHub ✅ → 版本 1.36.0 已同步\r\n\r\n**场景：仅打包不推送**\r\n用户需求：skill-name=git-sync, 当前版本=2.40.0, --pack-only 标志\r\n系统执行：\r\n```bash\r\npython \"$SKILLS_DIR/git-sync/scripts/git-sync.py\" git-sync --pack-only\r\n```\r\n系统输出：[1/8] 触发判断 → 继续（--pack-only 跳过推送）\r\n[4/8] 文件同步 → 已复制 22 个文件\r\n[8/8] 打包索引 → .dist/git-sync-v2.40.0.zip 已生成（45.2 KB，22 文件）\r\n最终输出: .dist/git-sync-v2.40.0.zip 已生成\r\n\r\n**场景：仅推送不打包**\r\n用户需求：skill-name=workday-calendar, 当前版本=2.2.0, 目标版本=2.2.1, --push-only 标志\r\n系统执行：\r\n```bash\r\npython \"$SKILLS_DIR/git-sync/scripts/git-sync.py\" workday-calendar --push-only\r\n```\r\n系统输出：[1/8] 触发判断 → 继续\r\n[2/8] 安全校验 → 通过\r\n[3/8] 清单检查 → 升级至 2.2.1\r\n[4/8] 文件同步 → 已复制 31 个文件\r\n[5/8] 敏感信息脱敏 → 0 处\r\n[6/8] 更新 README → 无变化\r\n[7/8] 提交推送 → 码云 ✅ / GitHub ✅\r\n[8/8] 打包索引 → 跳过（--push-only）\r\n最终输出: 码云 ✅ / GitHub ✅ → 版本 2.2.1 已同步\r\n\r\n## 工作流程\r\n\r\n1. **触发判断** → 输入 用户请求文本 → 输出 触发决策（继续/拒绝） — 解析用户请求，判断是否为同步/推送/打包意图\r\n2. **安全校验** → 输入 目标路径 + skill 名称 → 输出 校验通过/拒绝 — 检查目标路径合法性、skill 名称白名单\r\n3. **清单检查 + 路径解析** → 输入 manifest.json → 输出 同步状态 — 读取 manifest 条目获取 source_path/repo_path，无则按 type 走默认路径\r\n4. **版本号对比** → 输入 仓库版本 v.s. 本地源文件 → 输出 升级/跳过/冲突 — 读取 `_meta.json`（skill）或 `__init__.py`（agent），版本号自动归一化 PEP 440\r\n5. **LLM 文件过滤** → 输入 源目录 → 输出 允许文件列表 — 扫描源目录 → 全量打印文件列表 + 决策路径 → **写 resume（phase=file_filter）+ exit 3 让位** → 调用方写 `file_filter_{name}.decisions.json` 后重跑，从本环节续跑 → 只复制允许的文件到 workrepo\r\n6. **敏感信息脱敏（强制）** → 输入 工作仓库文件 → 输出 脱敏后的副本 — 扫描邮箱/token/IP，发现敏感信息则 **exit 3 让位**，调用方写 `sensitive_scan_{name}.decisions.json` 后重跑。**断点续跑**：resume.phase=sensitive_scan 时跳过文件过滤与同步，直接从脱敏环节继续\r\n7. **更新 README** → 输入 workrepo → 输出 更新后的 README.md — 按仓库类型全量扫描（skill 仓库扫技能目录、agent 仓库扫智能体目录），重新生成 README.md（技能表格 + 智能体表格）\r\n8. **提交推送** → 输入 提交信息 → 输出 推送状态 — git add/commit/push 到码云 + GitHub\r\n9. **ZIP 打包** → 输入 技能目录 → 输出 .zip 文件 + index.html — 将 skill 目录打包为 .zip（仅 skill，agent 跳过）\r\n10. **市场发布**（可选）→ ClawHub / SkillHub（skill）/ PyPI（agent + `--pypi`）\r\n11. **创建 Release**（`--release` 标志）→ 打 tag + 推双平台 + 创建 GitHub Release + Gitee 发行版，源码包由平台自动生成\r\n\r\n## 数据目录说明\r\n\r\n本技能的数据文件存放在技能安装目录的标准化子目录下（实际路径以 `$SKILLS_DIR` 为准）：\r\n```text\r\n$SKILLS_DIR/.standardization/git-sync/\r\n├── data/\r\n│   ├── config.json     # 平台配置（repos 注册表、用户名、仓库名、gitee_token 等）\r\n│   └── manifest.json   # 技能同步状态清单（按 repos 组织条目）\r\n└── backup/             # 改造/更新前的自动备份\r\n```\r\n安装目录 `$SKILLS_DIR/git-sync/` 只保留 SKILL.md 和 scripts/。\r\n\r\n> 📚 **渐进式加载**：本技能采用渐进式 MD 体系，`SKILL.md` 为轻量入口（≤230行），详细内容拆分到 `references/*.md` 按需加载。完整文件清单见「核心能力 → 渐进式文件索引」表格。\n\nFile v2.47.0:_meta.json\n\n{\n  \"ownerId\": \"kn75zfd51df61ajdyqtgvrs1hx84s4q6\",\n  \"slug\": \"git-sync\",\n  \"version\": \"2.47.0\",\n  \"publishedAt\": 1790957461941\n}\n\nFile v2.47.0:references/antipatterns.md\n\n# git-sync 反模式\r\n\r\n常见错误和注意事项，避免误用本技能。\r\n\r\n## 反模式列表\r\n\r\n### 1. 盲目全量同步\r\n\r\n**错误做法：**用户只是提了一下某个 skill，就自动触发全量同步。\r\n\r\n**正确做法：**除非用户明确说\"全量维护\"/\"同步所有\"，否则只同步指定的 skill。\r\n\r\n### 2. 忽略敏感信息扫描\r\n\r\n**错误做法：**跳过敏感信息扫描，直接同步推送。\r\n\r\n**正确做法：**同步前必须运行敏感信息扫描，防止 Token/邮箱/路径泄露。\r\n\r\n### 3. 版本号不一致\r\n\r\n**错误做法：**`_meta.json`、SKILL.md frontmatter、`references/changelog.md` 三端版本号不一致（漏改任何一端会导致 SkillHub 拒绝发布或版本混乱）。\r\n\r\n**正确做法：**三端版本号必须一致（`_meta.json` 为唯一源，bump 顺序：先改 `_meta.json` → SKILL.md version 行 → changelog 加条目），每次更新时同步更新。\r\n\r\n### 4. 跳过规范审查\r\n\r\n**错误做法：**同步前不检查 R-01~R-26 合规性。\r\n\r\n**正确做法：**同步前自动检查 R-01~R-26 合规性，虽然不阻断同步，但应关注警告。\r\n\r\n### 5. 忘记更新 manifest.json\r\n\r\n**错误做法：**同步后不更新清单状态标记。\r\n\r\n**正确做法：**同步后必须更新清单状态标记，保持三单一致。\n\nFile v2.47.0:references/blueprint_rules.md\n\n# 蓝皮书判断规则\n\n## 筛除原则\n\n你需要从 blueprint.json 的 `files` 和 `tree` 中筛选出哪些内容**不应**进入公开仓库。\n\n### 必须保留（核心功能）\n\n技能的功能性文件：用户安装该技能后，SKILL.md 中引用的脚本、文档、配置文件、资源文件等直接参与功能实现的文件。\n\n包括但不限于：\n- `scripts/`、`references/`、`assets/` 等目录下的文件\n- `SKILL.md`、`_meta.json` 等技能元数据文件\n- 技能运行所依赖的配置文件（需脱敏后保留）\n\n### 必须筛除（非核心）\n\n任何**不直接影响技能核心功能运行**的内容都应筛除：\n\n- **工作区临时文件**：AI 工作目录产生的缓存、日志、临时数据\n- **编译/构建产物**：`__pycache__/`、`build/`、`dist/`、`*.pyc`、`*.pyo`\n- **IDE/编辑器配置**：`.vscode/`、`.idea/` 等仅服务于开发环境的目录\n- **系统元数据**：`.DS_Store`、`Thumbs.db`\n- **非技能标准目录**：不属于技能规范定义的目录结构\n\n注意：隐藏目录（以 `.` 开头）**不自动等于应筛除**。比如 `.github/` 如果是 CI 配置则应保留。判断依据是\"是否为核心功能所需\"，而非\"是否隐藏\"。\n\n### 判定流程\n\n1. 读 blueprint.json 的 `tree`，标记每个目录为\"保留\"或\"筛除\"\n2. 对\"保留\"目录下的 `files`，逐项复核：\n   - 文件是否被 SKILL.md 直接或间接引用 → 保留\n   - 文件是否为标准技能结构的一部分（scripts/、references/）→ 保留\n   - 文件是否明显为临时/缓存/构建产物 → 筛除\n3. 输出 `exclude_list.json`：{ \"type\": \"dir\" | \"file\", \"path\": \"相对路径\" }\n\n---\n\n## 脱敏原则\n\n对于需要保留的文件，逐项判断 blueprint.json `samples` 中的内容是否需要脱敏。\n\n### 必须脱敏\n\n以下内容必须脱敏：\n\n- **个人真实信息**：真实姓名（非笔名/代名）、身份证号、手机号、银行卡号\n- **凭据**：API Token、密码、密钥、私钥\n- **本地路径**：包含用户名或机器名的绝对路径（如 `C:\\Users\\实际用户名\\`、`/home/实际用户名/`）\n- **联系信息**：个人邮箱地址（非公开业务邮箱）\n- **内网地址**：内网 IP、内网域名、私有仓库地址\n\n### 不应脱敏\n\n功能性内容：\n\n- **代名/署名**：技能的公共作者名（如 `[username-redacted]`、`[username-redacted]`）\n- **公开仓库地址**：GitHub/Gitee 等公开平台的仓库链接\n- **配置模板示例**：`api_key = \"your-api-key\"` 这种明显是模板的\n- **技术内容**：代码逻辑、函数调用、数据结构定义\n- **版本号/依赖名**：pip 包名、npm 包名、版本号\n\n### 脱敏方式\n\n- **路径**：只替换\"标识用户/机器身份的前缀\"，保留功能后缀\n  - `C:\\Users\\USERNAME\\skills\\novel-weaver\\...` → `[LOCAL_PATH]\\skills\\novel-weaver\\...`\n- **凭据**：替换为 `[REDACTED]`\n  - `token = \"abc123\"` → `token = \"[REDACTED]\"`\n- **邮箱**：替换为 `[EMAIL]`\n  - `[email-redacted]` → `[EMAIL]`\n- **真实姓名**：替换为 `[NAME]`\n  - 仅替换非笔名的真实姓名\n\n### 判定流程\n\n1. 遍历 blueprint.json `files[].samples`\n2. 逐条判断是否属于\"必须脱敏\"类别\n3. 是 → 记录到 `sanitize_list.json`：{ \"file\": \"相对路径\", \"line\": N, \"original\": \"原文\", \"replacement\": \"占位符\" }\n4. 否 → 跳过\n\nFile v2.47.0:references/changelog.md\n\n## [2.47.0] - 2026-10-02\n\n### 修复（9 处隐患审查落地，P0 全修）\n\n- **同步保险丝（P0①，structured-writer 3.1.10 删库事故根因）**：`sync_files` 清空目标目录前先计算 allow 集合与源树的交集，零交集（allow 为空/格式错/路径全部无效）→ `SystemExit(2)` 拒绝 `rmtree`——工作仓不再可能被空同步整目录删除后推送到双平台。\n- **陈旧决策守卫（P0②，静默漏脱敏洞）**：脱敏决策消费前校验——决策必须覆盖本次扫描发现的全部文件、值必须为 keep/sanitize/custom；不满足（陈旧/损坏/覆盖不全）→ 清除决策文件并重新让位，绝不静默应用。此前 `cmd_apply` 遍历 decisions 而非 findings，扫描新增的敏感文件会被静默放过直接上公共仓。实证：TEMP 中 svg-composer 决策文件滞留 61 天仍会被消费。\n- **决策值非法 fail-closed（P0②配套）**：`cmd_apply` 遇到非 keep/sanitize/custom 的决策值 → 打印错误并 `sys.exit(2)`，不再静默跳过且不计入审计统计。\n- **扫描详情显示命中原文（P0③，wUwproject 公开署名误脱敏根因）**：决策详情两处（消费分支与让位引导）均打印 `match` 实际命中文本（截断 40 字符）——决策者不再需要猜测\"用户名\"到底是本地账户（sm001，应脱敏）还是公开署名（wUwproject，应保留）。\n- **上传错误信息修复（P0④）**：PyPI/ClawHub/SkillHub 失败信息改为 `(stdout+stderr)` 合并取尾部——twine 的报错走 stdout，此前 `stderr[:200]` 恒为空（structured-writer 3.1.10 的 400 file-name-reuse 错误只能手动 verbose 才能拿到）。\n- **包目录检测 fail-closed（P0⑤）**：删除 `pkg_dir = pkg_dir or \"rag_assistant\"` 硬编码回退与候选列表中的 rag_assistant 首位——build 目录中找不到含 `__init__.py` 的包目录即报错终止，不再对非 rag-assistant 项目伪造错误包名。\n- **无变更不再假失败（P2⑥）**：无变更可提交时返回 `(True, True)`，manifest 正确记为已上传，summary 不再显示\"推送失败\"假象。\n- **agent 审计结论去误导（P2⑧）**：agent 无 SKILL.md 时审计结论显示\"跳过（agent 无 SKILL.md，SKILL.md 审计不适用）\"，不再显示\"未执行或执行失败\"。\n\n### 回归（真实目录/子进程实测）\n\n- 保险丝：空 allow → SystemExit(2) 且目标目录完好 / 正常 allow 只复制允许文件 / 零交集拦截，3 用例 PASS。\n- apply：非法决策值(123) → rc=2 报错 / 合法 sanitize → rc=0 内容替换，2 用例 PASS。\n- scan：输出含 match 原文 PASS（example.com 空 result 为 RFC 2606 保留域名有意豁免，非漏报）。\n\n### 架构修复：PyPI 作者元数据去硬编码（v2.47.0 折进）\n\n- **根因**：setup.py 模板硬编码作者名与邮箱（工具作者的个人信息写死在源码里）——工具源码要上公共仓与源码含个人信息天生冲突（脱敏强制 vs 发布元数据），且对第三方用户而言发布的 wheel 里填的是别人的作者。\n- **修复**：作者身份属于被发布项目而非发布工具。模板改占位符，构建时按优先级注入：被发布项目 pyproject.toml 的 `[project].authors`（PEP 621，项目权威源，读 src_dir——build_dir 的 pyproject 随后被覆盖为 build-system-only）→ config.json 的 author/email（本地用户配置，与 git commit 同一字段，单一来源）→ 空串（PyPI 合法）。\n- 工具源码从此零个人信息：脱敏扫描不再命中 git-sync.py，自推送不再被硬约束拦截。\n\n### 清理\n\n- TEMP 陈旧决策/扫描残留：svg-composer 决策（61 天）、podcast-maker 决策 .bak（12 天）、manual_scan×2（63 天）、_preview_scan（12 天）。\n\n## [2.46.2] - 2026-09-17\n\n### 修复\n\n- **agent 版本号被过程残留污染**：agent 版本读取对源目录全量 rglob `__init__.py`，`_smoke/` 等下划线过程目录与 `.venv` 内第三方包的自带 `__version__` 先被 sorted 命中，podcast-maker 首跑读出 1.15.0（本地真值 0.12.2），wheel 文件名对不上后静默跳过上传，PyPI 假装成功。修复：优先命中与智能体同名的包目录，其余扫描跳过 `_` 开头目录与虚拟环境。\n- **wheel 缺失静默跳过上传**：构建产物与预期 wheel 名不符时 `if whl.exists()` 无 else 分支，上传步骤静默消失。修复：缺失即报错退出，不再假成功。\n- **`__init__.py` 注释毒化版本读取**：podcast-maker 的 `__init__.py` 说明注释含 `__version__ = \"x.y.z\"` 字面量示例，正则先命中注释把版本读成 x.y.z，触发仓库/本地版本冲突守卫静默 exit(1)。已改注释措辞避开赋值形态。\n\n### 变更\n\n- **PyPI 构建源改用仓库精选副本**：agent 的 PyPI 打包源从源目录改为 work 仓库副本（allowlist 已过滤过程文件），避免把 8.4G 过程残留拷进构建。\n\n## [2.46.1] - 2026-09-17\n\n- **修复：PyPI long_description 粘合正则双层转义（渲染实测暴露）**：现象——模板中 `{BS}\\[?` 经 f-string 渲染成 `\\\\[?`，正则要求版本标题含字面反斜杠（`## \\[2.46.0]`），现实更新日志（`## [2.46.0]`）永远不匹配，「更新说明」区块静默不追加；2.45.8 的验证测的是手写正则而非渲染后 setup.py 里的真身，故当时未暴露。修复——删去 `\\[?`/`\\]?` 前多余 `{BS}`。验证——改为对渲染后模板实际生成的正则跑 6 用例（方括号头/裸版本头/v 前缀头/方括号内 v/日期行/版本不存在负例）全 PASS，并以 git-sync 自身与 podcast-maker 两份真实 CHANGELOG 实测命中\n- **新增：粘合正则兼容 v 前缀版本头**：`## v0.12.2`、`## [v0.3.1b1]` 等形态此前均无法命中；`v?` 移至 `\\[?` 之后，方括号内外两种 v 位置通吃\n\n\n- **变更：PyPI 开发状态判定规则定稿** — 原判别只看 PEP 440 预发布后缀（a/beta/rc/dev → Beta），0.x 正式版（如 0.12.2）被标 Production/Stable，与「0.x 即初始开发阶段」的定位不符。定稿规则：主版本号 <1 → `4 - Beta`（与后缀无关）；主版本号 ≥1 → 纯 x.y.z 为 `5 - Production/Stable`、跟随 b（x.y.zbn）为 `4 - Beta`。实现收敛为独立函数 `_pypi_dev_status()`，11 场景验证全 PASS（0.12.2/0.2.6b0/1.1.0b0/3.0.0b9/1.7.0-beta 判 Beta，1.1.0/2.45.8 判 Stable）\n- **变更：rc/alpha/dev 预发布形式废弃** — 版本方案收敛为 x.y.z 与 x.y.zbn 两种，b 是唯一支持的预发布形式。`_normalize_version()` 删除 rc/alpha/dev 的 PEP 440 转换分支（1.7.0-beta → 1.7.0b1 保留）；废弃后缀无论有无分隔符一律剥除（1.7.0-rc1/1.7.0alpha2/1.0.0.dev1 → 1.7.0/1.0.0）——连写形态原样发上 PyPI 会被解析成预发布而错标状态，剥完与正式版同号则撞号报错，宁可撞号也不误发\n- **删除：死代码清理** — git-sync.py 内旧版 `step_pypi_publish`（第一次定义被第二次定义整体覆盖，从未执行，约 34 行）；scripts/pypi_publish.py 独立发布器（全仓 grep 无调用者，setup.py 模板与主脚本双份实现，2.45.x 曾两度修它的构建 bug，正式退役）\n\n## [2.45.8] - 2026-08-26\n\n- **修复：PyPI long_description 粘合双缺陷（silprespec-emulator 发布时暴露）**：现象——PyPI 描述只有 README、缺「更新说明」区块（0.2.6b0/0.3.1b0 均 1727 字符无更新说明）；根因①粘合正则语法错误（ 字符类未闭合、 吞掉闭合符）必然 re.error 崩溃，②manifest 登记 type/source_path 错误时 src_dir 指向无 CHANGELOG.md 的残留目录，粘合段被 os.path.exists 提前跳过；修复——正则改为 （兼容带方括号  与不带方括号  两种版本行格式，终止于下一个 ## 行或文件尾），manifest 条目修正（type=skill→agent、source_path→独立源、repo_path 去 skills/ 前缀）；验证——三份 CHANGELOG（silprespec/rag/sw 两种格式）正则全部正确匹配，silprespec-emulator 0.3.1b1 发布后 PyPI 描述 1727→5372 字符、含「更新说明」区块\n\n## [2.45.7] - 2026-08-16\n\n- **修复：`source_overrides` 的 agent 类型识别通用化**：原逻辑硬编码检查 `override_dir / \"rag_assistant\" / \"__init__.py\"`（只认 rag-assistant 一个包名），structured-writer（包目录 `structured_writer`）经 source_overrides 指定源路径时无法识别为 agent，报\"路径存在但无法识别类型\"。改为通用检测：`override_dir.rglob(\"__init__.py\")` 中任意子目录 `__init__.py` 含 `__version__` 即判为 agent——支持任意包目录名。实战：structured-writer v3.0.0b9 首次经 git-sync 推送 maby_agent 仓库（Gitee ✅）\n\n## [2.45.6] - 2026-08-10\n\n- **文档强化：明确\"全流程一条命令\"铁律（git-sync 自推送实战再次验证）**：v2.45.5 只写了\"决策文件用 _paths 路径函数写入\"，但漏了最关键的根因——**让位 → 写决策 → 重跑必须放在同一条 Bash 命令里一次跑完**。2026-08-09 git-sync 自推送时拆成多条命令导致 scan/resume 文件跨命令消失（git-sync 每次运行重建/清理 temp），反复\"文件存在却读不到\"重试 N 次；合并为一条命令后一次通过。SKILL.md 约束升级为 v2.45.6 铁律，guide.md 步骤 3.7/4.5 警示框补充一条命令的完整 bash 写法与拆命令反例\n\n## [2.45.5] - 2026-08-09\n\n- **文档：固化 LLM 决策文件写入规范（2026-08-09 rag-assistant 推送实战教训）**：决策文件（`file_filter_{name}.decisions.json` / `sensitive_scan_{name}.decisions.json`）必须用 `_paths.py` 路径函数在 git-sync 脚本环境下写入并验证 `exists()`，严禁用 Write 工具或跨进程硬编码路径写入（沙箱隔离导致\"文件存在却读不到\"→ 反复让位 exit 3 死循环）。SKILL.md 约束新增警示条目，guide.md 步骤 3.7/4.5 新增详细警示框（含正确/错误写法对比）\n\n## [2.45.4] - 2026-08-07\n\n- step_pypi_publish copytree 排除 Windows 保留设备名（nul/con/prn/aux）与 .git，修复构建失败（WinError 87/5）\n\n## [2.45.3] - 2026-08-07\n\n- setup.py 模板新增 project_urls（GitHub/Gitee/Documentation 三链接），PyPI 页面 Project Links 显示双平台仓库链接\n\n\n## [2.45.2] - 2026-08-06\n\n### 修复：pypi_publish.py 独立脚本 2 个构建 bug（structured-writer 1.6.0b0 发布时暴露）\n\n- **多顶层包构建被拒**：pypi_publish.py copytree 保留项目自带 pyproject.toml，setuptools 自动发现命中 `data/` + `structured_writer/` → `Multiple top-level packages` 拒绝构建。**修复**：隔离构建目录覆盖写固定 build-system 的 pyproject.toml（与 git-sync.py 内联 step_pypi_publish 一致）\n- **模板 `\\n` 转义错误**：SETUP_PY_TEMPLATE 里 `LONG_DESC += \"\\n\\n---...\"` 的 `\\n` 在模板解析时变成真实换行 → 生成 setup.py 语法错误 `unterminated string literal`。**修复**：写成 `\\\\n`（模板双反斜杠，生成时单反斜杠）\n- **验证**：structured-writer 1.6.0b0 → PyPI `structured-writer-ldxs` 1.6.0b0 上传成功（releases 列表确认 whl）\n- **教训**：独立脚本与主脚本（git-sync.py step_pypi_publish）存在模板双份实现，前者是遗留旧版——发布异常时优先排查双份实现的差异；模板内所有字面 `\\n` 必须双写\n\n## [2.45.1] - 2026-08-06\n\n### 修复：PyPI 发布链路 2 个 bug（structured-writer v1.5.0 发布时暴露）\n\n- **PyPI token 读取错误**：pypi_publish.py 打印声称\"尝试 ~/.pypirc\"，实际代码从\n  GitHub remote 提取 token（`https://user:[email-redacted]/...`）当 PyPI 凭证——\n  GitHub token（`gho_*`）与 PyPI token（`pypi-*`）类型不符，上传必失败；且\n  .pypirc 的 password 从未被读取。**修复**：优先读 `~/.pypirc` 的 `[pypi] password`\n  （PyPI 官方凭证），其次 `PYPI_TOKEN` 环境变量，移除 GitHub remote 提取逻辑\n- **step_pypi_publish NameError**：setup.py 模板内联 `{BS}`（反斜杠变量）只在生成\n  的 setup.py 里定义 `BS=chr(92)`，f-string 求值时 git-sync.py 函数作用域无 `BS` →\n  `NameError: name 'BS' is not defined` 中断发布。**修复**：函数内 f-string 前补\n  `BS = chr(92)`（两处重复定义均补）\n- **验证**：structured-writer v1.5.0 → PyPI `structured-writer-ldxs` 1.5.0 上传成功\n  （twine returncode 0 + pypi.org JSON API 确认）\n- **教训**：发布工具自身必须用真实 PyPI 凭证路径（.pypirc）跑通一次真实发布，\n  不能停留在\"打印声称\"的层面；f-string 模板内嵌变量必须在模板求值作用域定义\n\n## [2.45.0] - 2026-08-04\n\n### 修复：sync_files 硬编码 skills/ 前缀导致嵌套发布\n\n- **根因**：sync_files() 目标路径写死 `work_repo / 'skills' / name`，只适配\n  workbuddy-skills（skills/ 子目录结构）；maby_skills 是顶层结构（技能在仓库根），\n  导致自推送时新版写到 skills/<name> 嵌套副本，commit 却只提交顶层 → 双份版本分裂\n- **修复**：sync_files 增加 subdir 参数，目标路径 = work_repo / subdir，\n  由调用方传入 manifest/config 解析的 work_repo_subdir（顶层或 skills/ 子目录由\n  仓库配置决定，不再硬编码）；不传时回退顶层\n- **验证**：三场景 PASS（顶层/子目录/默认回退）\n- **教训**：仓库目录结构（顶层 vs skills/ 子目录）是用户配置，必须从 manifest\n  repo_path 读取，禁止在函数内硬编码\n\n## [2.44.0] - 2026-08-04\n\n### 安全硬约束：脱敏强制（severity 分级禁 keep）\n\n- **critical/high 禁止 keep**：sensitive_scan.py cmd_apply 对 severity=critical\n  （Token/私钥）和 high（邮箱）的发现强制 sanitize，LLM 决策写 keep 也会被\n  代码级拦截并转为脱敏——\"脱敏强制\"从软约束（靠 LLM 自觉）升级为硬约束\n- **只替换 forbidden 的 match**：强制脱敏仅替换 critical/high 的匹配文本，\n  medium（IP/路径/用户名公开署名）保持原样，保留合法 keep 豁免权\n- **硬约束兜底**：apply 完成后重新检查处理后文件，若仍残留 critical/high\n  原始 match 则 exit 1 阻断（防脱敏未生效静默通过）\n- **统计输出**：apply 输出 强制脱敏/正常脱敏/保留/跳过 四类计数，便于审计\n- 背景：2026-08-04 自推送实战中 LLM 写\"全部 keep\"导致真实邮箱/token 泄露\n  进仓库（已纠正+重推），此版本根治\"脱敏可被绕过\"的设计漏洞\n\n## [2.43.1] - 2026-08-04\n\n### 修复（v2.43.0 推送实战暴露的 helper 二次 bug）\n\n- **helper docstring 路径转义**：write_filter_decision_{name}.py / write_sensitive_decision_{name}.py\n  的 docstring 中嵌入 Windows 路径（含 \\\\U 转义）导致生成的 helper 脚本 SyntaxError，\n  改为 json.dumps(str(path)) 转义（与 with open 行一致）\n- **helper 扫描数据嵌入改为读文件**：原实现把扫描 JSON 用 json.loads(\"\"\"...\"\"\") 嵌入源码，\n  Windows 路径 \\\\U 在源码解析时爆炸；改为 helper 直接 json.load(open(scan_path)) 读取扫描文件\n\n## [2.43.0] - 2026-08-04\n\n### 重大改进：让位式 LLM 握手（根治决策卡死）\n\n- **两处 LLM 决策点改为让位式握手**（文件过滤 step_llm_file_filter + 敏感脱敏 step_sensitive_scan）：\n  遇到决策点时写 resume 状态文件（TEMP_DIR/resume_{name}.json）+ exit 3 退出，把控制权\n  交还调用方（AI 助手），不再进程内 120s 轮询等待（旧版占用控制权导致 AI 无法并行写决策文件导致卡死）\n- **断点续跑**：重跑同一命令时 main() 检测 resume 状态，跳过已完成步骤：\n  file_filter 断点跳过 manifest/version/normalize；sensitive_scan 断点跳过文件过滤与同步，\n  直接用已同步目录从脱敏环节继续。决策消费成功后 resume 自动清除\n- **修复 helper 脚本转义 bug**：write_filter_decision_{name}.py / write_sensitive_decision_{name}.py\n  中 Windows 路径用 json.dumps 转义替代 r\"{path}\" 拼接（原实现生成脚本 SyntaxError）\n- **文档对齐**：SKILL.md 约束/核心能力/工作流程更新为让位式描述（原\"仅前台运行/在回复中输出决策\"\n  与实现\"写决策文件\"不一致，已修正）\n- **resume 状态路径**：_paths.py 新增 resume_state_path(name)（R-12 路径集中管理）\n\n## [2.42.0] - 2026-08-03\n\n### 修复\n\n- **skillhub_publish.py .gitignore 排除方案修正** — 原方案把 `.gitignore` 改名为 `.gitignore.skh_bak` 留在技能目录内，SkillHub 扫描仍判定为 git 元文件拒绝（400）；改为备份到系统临时目录、从技能目录移除、发布后恢复，彻底规避\n\n## [2.41.0] - 2026-08-03\n\n### 文档全面修正（对齐 v2.40.0 实际行为 + 泛化）\n\n- **多仓库模型文档对齐** — SKILL.md/guide.md/reference.md/faq.md 全部从 workbuddy-skills 时代描述更新为 v2.37.0 多仓库模型（config.json `repos` 注册表、按类型解析仓库路径）；manifest 命令示例仓库名参数改 `<repo>` 占位\n- **彻底去特化（通用性）** — 文档移除平台名（WorkBuddy）、本机路径（`~/.workbuddy/skills`、`~/WorkBuddy`）、真实用户名，统一改用 `$SKILLS_DIR`、`<repo>`、`调用方（AI 助手）` 等通用占位；LLM 交互步骤描述由\"WorkBuddy 输出决策\"改为\"调用方（AI 助手）在回复中输出决策 JSON\"\n- **路径统一管理机制写入文档** — 明确 `scripts/_paths.py` 为唯一路径定义源，14 个脚本一律 `from _paths import ...` 引用，仓库路径由 config.json 注册表 + `get_work_repo(type)` 动态解析\n- **删除虚构步骤** — guide.md 移除代码中不存在的\"步骤 0.5 文件路径校准\"（v2.3 残留，实际无此逻辑）\n- **ClawHub 绝对路径** — SKILL.md 平台差异表标注 ClawHub 必须传绝对路径（相对路径在 npx 下 resolve 失败报 \"Path must be a folder\"）\n- **skillhub_publish.py 排除 .gitignore** — 发布前临时移走 `.gitignore`（SkillHub 400 拒绝 git 元文件），`finally` 恢复，随下次 bump 一起发布\n- **clawhub_publish.py 路径探测** — 兼容 skills/ 子目录与顶层两种仓库结构\n\n### 修复\n\n- **PyPI long_description 粘合 CHANGELOG** — setup.py 模板 README 后追加当前版本 `## [x.y.z]` 区块（v2.40.0 已实现，本版本随文档同步发布市场）\n\n## [2.40.0] - 2026-08-03\n\n### 新增\n\n- **PyPI long_description 粘合更新日志** — `step_pypi_publish` 的 setup.py 模板新增 CHANGELOG 粘合：README.md 后追加当前版本对应的 `## [x.y.z]` 区块（`## 更新说明`），用户发布 PyPI 后包描述页直接展示最近更新内容。MANIFEST.in 同步 include CHANGELOG.md。附：修复 f-string 模板转义（`\\n` 在 f-string 中为换行符，需 `\\\\n` 保留字面），并修 `python -m build` 下 pyproject `[project].readme` 覆盖 setup.py long_description 的问题（构建时用最小 pyproject 仅含 build-system）\n\n## [2.39.0] - 2026-08-03\n\n### 修复\n\n- **PyPI prerelease 判别 bug** — `step_pypi_publish` 的 `is_prerelease` 正则 `\\.(a|b|rc|dev)\\d+` 要求 prerelease 标识前必须有 `.`，但 PEP 440 的 `1.4.0b1`/`1.1.0b16`/`1.4.0rc2` 中 b/rc 前是数字（`0b1`）而非点号 → 全部误判为正式版，classifier 错误标成 Production/Stable。修复为 `(?:^|[._\\d-])(?:a|alpha|b|beta|rc|dev)\\d+`，9 场景测试全 PASS（b1/b16/rc2/a1/dev1 正确判 prerelease，纯数字版本判正式版）\n\n## [2.38.0] - 2026-08-02\n\n### 新特性（智能体 README 描述升级）\n- **智能体描述提取升级** — `update_readme.py` agents 分支：描述来源从 `__init__.py` docstring 首行升级为「README.md 引言 → PROTOCOL.md 概述段 → docstring」三级回退，README 表格描述与各智能体自带文档一致（rag-assistant/structured-writer 取引言 blockquote，Orchestrator 取 PROTOCOL 概述段）\n- **扫描排除 `.github`** — 智能体目录扫描排除 `.github` 等隐藏目录，避免误入列表\n\n## [2.37.0] - 2026-08-02\n\n### 新特性（多仓库模型）\n- **按项目类型动态解析目标仓库** — skill → `maby_skills`（`~/WorkBuddy/maby_skills`），agent → `maby_agent`（`~/WorkBuddy/maby_agent`）。`_paths.py` 新增 `get_work_repo()/get_repo_config()/get_repo_name()`，从 `config.json` 的 `repos` 注册表读取\n- **manifest 多仓库化** — manifest.json 重构为 `maby_skills`（22 项技能）+ `maby_agent`（3 项智能体）+ `workbuddy-skills`（冻结存档）三个仓库，`repo_path` 去掉 `skills/`、`agent/` 前缀（新仓库根下直接是项目目录）\n- **README 生成器多仓库化** — `update_readme.py` 按仓库类型（skills/agents）分别生成 README，支持 `readme.banner` 配置注入历史声明（手写说明改为配置驱动，不再被覆盖）\n- **ClawHub/SkillHub/Release/PyPI 目标仓库动态化** — 发布路径与 Release tag 推送目标随项目类型切换\n\n### 变更\n- **老仓库 workbuddy-skills 永久冻结**（2026-08-02 起）——git-sync 不再触碰，仅作历史存档\n- `git-sync.sh` / `git-sync.py` 的 `REPO_NAME`、`WORK_REPO`、`WORK_REPO_DIR` 全部动态化，移除对 `workbuddy-skills` 的硬编码引用\n\n## [2.36.0] - 2026-07-31\n\n### 修复（PyPI 发布链路 6 连 bug，structured-writer 1.1.0 发布时暴露）\n- **`--skip-market` 连带跳过 PyPI** — PyPI 发布被包在 `if not skip_market` 内，agent 走 `--skip-market --pypi` 时 PyPI 被误跳。修复：PyPI 只受 `--pypi` 控制\n- **market-only 模式全程静默** — `log()` 只写 LOG_BUFFER 从不打印，market-only 分支提前 return 跳过 LOG_BUFFER 输出，PyPI 成败完全不可见。修复：market-only 分支 return 前显式打印 LOG_BUFFER\n- **`python -m build` 隔离环境创建失败** — Windows/Python 3.14 下 venv+pip 隔离环境失败。修复：加 `--no-isolation`（用当前环境）\n- **sdist 构建失败** — setuptools 81 的 flat-layout 检测到 `data/` 与 `structured_writer` 两个顶层目录拒绝构建。修复：`packages=[pkg_dir]` 明确指定 + 只构建 wheel（`--wheel` 跳过 sdist）\n- **setup.py 模板缺 `from setuptools import setup`** — 模板直接调用 setup() 抛 NameError。修复：补导入\n- **（沿用 2.35.0）dev_status 自动判别 + 特化清除**\n\n## [2.35.0] - 2026-07-31\n\n### 修复\n- **PyPI 发布器特化残留（`pypi_publish.py`）** — setup.py 模板硬编码 `rag_assistant/__init__.py` 读取版本号，导致 structured-writer 等任意包目录名的 agent 发布时版本号回退到命令行参数。修复：改为 `rglob(\"__init__.py\")` 扫描含 `__version__` 的文件，与主脚本 `git-sync.py` 的自动检测逻辑一致，不再特化\n- **README 更新器特化残留（`update_readme.py`）** — 硬编码 `rag_assistant/__init__.py` 读取 agent 描述，非 rag-assistant 目录名的 agent 描述永远读不到（回退\"智能体\"默认值）。修复：`os.walk` 自动检测含 `__init__.py` 的包目录\n- **setup.py 模板无效转义（SyntaxWarning）** — 模板内 `\\s`/`\\[`/`\\n` 未转义触发 Python 3.12+ SyntaxWarning。修复：改为 `\\\\s`/`\\\\[`/`\\\\n`，生成的 setup.py 保持字面正则\n- **PyPI dev_status 写死 Beta（未兑现\"自动判别\"声明）** — SKILL.md 宣称 \"dev_status 自动判别\" 但代码硬编码 `4 - Beta`。修复：按版本号自动判别——含 `b`/`a`/`rc`（PEP 440 预发布）→ `4 - Beta`，否则 `5 - Production/Stable`（如 structured-writer 1.1.0 正式版发布时为 Production/Stable）\n\n### 变更\n- `SKILL.md` 约束更新 — \"自动检测类型\"描述由 `rag_assistant/__init__.py` 改为 rglob 扫描说明，明确不硬编码任何包目录名\n\n## [2.34.0] - 2026-07-31\n\n### 修复\n- **LLM 交互步骤被 QUIET_MODE 吞掉导致后台死锁** — `main()` 中的 `step_llm_file_filter`（文件筛除）和 `step_sensitive_scan`（敏感脱敏）在静默模式下 stdout 被重定向到 `/dev/null`，WorkBuddy 看不到输出也就无法写入决策文件，死循环挂起。修复：LLM 交互步骤临时恢复 `sys.stdout` 到 `sys.__stdout__`，确保 WorkBuddy 在前台能看到引导提示\n- **`step_sensitive_scan` 假 LLM 决策** — 声称\"自动生成 LLM 决策\"但实际上是一组硬编码的 if/else 规则（`public_docs` × `public_labels` 匹配），既不调用模型也不按用户指引推理。修复：改为真正的 LLM 交互模式，打印发现详情 + 脱敏引导 → 等待 WorkBuddy 写决策文件 → 超时 120s 后全部脱敏保安全\n- **`step_llm_file_filter` 无限等待** — 无超时回退，决策文件不来就永远挂起。修复：加 120s 超时 → 超时后全量保留所有文件\n\n### 变更\n- **SKILL.md 约束更新** — 明确标注\"仅前台运行\"，禁止在后台/Bash 任务中运行 git-sync，因为 LLM 交互步骤需要 WorkBuddy 在前台读取输出并写决策文件\n\n## [2.33.0] - 2026-07-27\n\n### 新增\n- **路径统一管理**：所有临时文件迁移到 `_paths.py` 的 `TEMP_DIR`（`~/.workbuddy/skills/.standardization/git-sync/temp/`），`_paths.py` 新增 `temp_scan_path()` / `temp_filter_scan_path()` 等统一路径函数\n- **Agent 类型自动检测**：不再硬编码 `rag_assistant/__init__.py`，改为 `rglob(\"__init__.py\")` 扫描含 `__version__` 的文件，兼容 `structured_writer/__init__.py` 等任意命名\n- **文件筛除决策助手脚本**：`step_llm_file_filter` 生成 `write_filter_decision_{name}.py` 脚本，LLM 通过 Bash 执行写入决策文件，不再依赖 Write tool\n- **`WORK_REPO` 路径归一化**：`git-sync.sh` 使用 `.as_posix()` 统一为正斜杠，避免反斜杠在 Python 字符串中被转义\n\n### 变更\n- **`manifest.json` 路径同步 `_paths.py`**：`repos.workbuddy-skills.path` 改为 `.workbuddy/workbuddy-skills`，`manifest.py` `get_repo_path()` 回退到 `from _paths import WORK_REPO`\n- **`git-sync.py` 版本对比**：agent 仓库版本来用 `rglob` 而非硬编码路径\n- **参考文档修正**：`reference.md` 路径描述同步为 `.workbuddy`，移除错误的 `WorkBuddy` 引用\n\n### 修复\n- agent 版本号读取失败（硬编码 `rag_assistant/__init__.py`） → 改为 `rglob` 查找\n- `git-sync.sh` 版本号读取中反斜杠导致 Python 字符串转义错误\n- `clean_zip_source.py` / `sync_with_exclude.py` 未排除 `.standardization/git-sync/temp/` 目录\n\n## [2.32.0] - 2026-07-21\n\n### 变更\n- **文件筛除管道封闭**：`step_llm_file_filter` 无 decision 文件时不再 `return None`，改为 **poll 等待** LLM 写入 decision 文件后自动继续，不需重跑 git-sync。门禁封闭，不允许任何方式 bypass\n\n### 修复\n- **`--skip-push` 不存在导致报错**：移除了代码中残留的 `--skip-push` 引用\n\n## [2.31.0] - 2026-07-21\n\n### 安全修复（重大）\n- **【安全】移除 `--skip-scan` 参数**：`--skip-scan` 允许跳过敏感信息脱敏流程，导致邮箱/Token/本地路径等敏感信息可能被推送到公开仓库。已彻底移除该参数和所有相关逻辑（git-sync.py / git-sync.sh）\n- **【安全】移除 `GIT_SYNC_SENSITIVE_MODE=keep-as-is`**：该环境变量模式允许保留敏感信息不做脱敏。已彻底移除，同 `--skip-scan`\n- **【安全】敏感信息脱敏改为强制流程**：代码同步前和工作仓库同步后两处脱敏均为强制执行，无任何跳过选项\n- **【安全】审计报告标记修正**：之前跳过脱敏后审计报告显示\"✅ 脱敏状态：未扫描\"，现改为\"❌ 脱敏状态：未扫描（脱敏是强制安全门禁，不允许跳过）\"\n- **文档清理**：SKILL.md、reference.md、faq.md、guide.md 移除所有 `--skip-scan` 和 `keep-as-is` 相关引用\n\n## [2.30.0] - 2026-07-21\n\n### 变更\n- **LLM 文件筛除不再卡死**：`step_llm_file_filter()` 不再只写扫描文件后空等，改为全量打印文件列表 + 规则到 stdout，要求 WorkBuddy 在回复中输出决策 JSON。不再静默挂起\n- **路径映射从 manifest 统一管理**：manifest 条目新增 `source_path` / `repo_path` 字段，`manifest.py add` 自动按 type 填充默认路径。`git-sync.py` 优先读 manifest，无则回退硬编码。skill 和 agent 统一走同一套逻辑\n- **README 更新同时覆盖 skills + agents**：移除 `is_skill` 限制，agent 同步后也会触发 README 重新生成（`update_readme.py` 本身已支持扫描 agent/ 目录）\n- **Release 简化**：只打 tag + 建 Release 页面，不传 ZIP。源码包由 GitHub/Gitee 自动从 tag 生成\n- **仓库名从 config.json 读取**：`release_creator.py` 和 `step_release_create()` 不再硬编码，改为读 `config.json` 的 `gitee.user/repo` + `github.user/repo`\n- **版本号全局归一化 PEP 440**：新增 `_normalize_version()` 函数，入口统一转换版本格式（`1.7.0-beta` → `1.7.0b1`），所有外部输出用归一化版本，源文件不改\n- **dev_status 自动判别**：PEP 440 预发布后缀（`.bN`/`.rcN`/`.aN`/`.devN`）→ `4 - Beta`，纯 `x.y.z` → `5 - Production/Stable`\n- **PyPI trigger tag 通用化**：格式统一为 `pypi/{type}/{name}/{version}`，manifest 驱动，所有项目通用\n- **新增 GitHub Actions 模板**：`references/pypi-github-actions.yml`，监听 `pypi/*/*/*`，Trusted Publisher 配置指南\n\n## [2.28.2] - 2026-07-16\n\n### 修复\n- **PyPI 发布 long_description 缺少更新说明**：`pypi_publish.py` 的 setup.py 模板在构建时自动读取 CHANGELOG.md，提取当前版本对应的 changelog 区块追加到 long_description。PyPI 项目页现在会同时显示 README 和更新说明\n- **PEP 440 版本命名合规化**：`rag-assistant` 版本号 `1.3.0-beta` → `1.3.0b1`（PEP 440 要求 pre-release 标识符不带 `-`）\n\n## [2.28.1] - 2026-07-16\n\n### 新增\n- **update_readme.py 支持 CC BY-SA 4.0**：许可证章节新增 CC BY-SA 4.0 行；目录树自动添加许可证标注（Cogito_Scribit/ 和 architecture/ → CC BY-SA 4.0，skills/ → MIT，agent/ → Apache 2.0 等）\n\n## [2.28.0] - 2026-07-15\n\n### 新增\n- **Gitee 发行版创建**：`release_creator.py` 在创建 GitHub Release 后自动调用 Gitee API 创建发行版，token 从 `config.json` 的 `gitee_token` 字段读取\n- **GITEE_TOKEN 环境变量支持**：`_get_gitee_token()` 优先读取环境变量，其次读 config.json\n\n### 修复\n- **step_llm_file_filter 秒删扫描文件**：写入 `.file_filter_{name}.json` 后立即 `unlink()` 删除，LLM 来不及审查。改为保留扫描文件、输出审查指令（路径+格式），等 LLM 写入决策文件后下次运行继续\n- **release_creator.py 只发 GitHub 不发 Gitee**：全程只调用 GitHub API，Gitee 推送 tag 但不创建发行版。新增第 5 步：Gitee API 创建发行版\n\n## [2.27.2] - 2026-07-13\n\n### 修复\n- **LLM 决策缺失不阻断**：`step_llm_file_filter` 在决策文件不存在时 `return set()` 而非 `sys.exit(1)`，导致 0 文件同步后自动提交推送空目录。改为硬阻断，杜绝误删\n\n## [2.27.1] - 2026-07-11\n\n### 修复\n- **WORK_REPO 路径不统一**：`git-sync.sh` 使用 `$HOME/.workbuddy/workbuddy-skills`，`_paths.py` 使用 `Path.home() / \"WorkBuddy\" / \"workbuddy-skills\"`，导致文件同步到错误目录。统一为 `$HOME/WorkBuddy/workbuddy-skills`\n\n## [2.27.0] - 2026-07-10\n\n### 修复\n- **pypi_publish.py SSH remote 崩溃**：`remote_url.split(\"//\")[1]` 在 SSH remote 格式（`git@host:path`）下数组越界。添加 `\"//\" in remote_url` 前置检查\n- **pypi_publish.py 默认构建 sdist**：`python -m build` 同时打 sdist 和 wheel，sdist 在部分环境下报 license 错误。改为 `--wheel` 仅构建 wheel\n- **git-sync.py LLM 决策缺失时默认全部保留**：无决策文件时 `return {f[\"path\"] for f in tree}` 放行所有文件，安全风险。改为 `return set()` 阻断（fail closed）\n\n## [2.26.6] - 2026-07-09\n\n### 修复\n- **displayName 不一致**：ClawHub/SkillHub 发布的显示名统一为 kebab-case（`git-sync`），废除驼峰格式 `Git Sync`\n\n## [2.26.5] - 2026-07-09\n\n### 修复\n- **报告推送状态被\"跳过\"覆盖**：`skipped_sync` 为 True 时强制所有平台显示\"⏭️ 跳过\"，掩盖了实际推送成功的结果。改为仅当 skipped 且推送失败时显示跳过\n- **日志重复输出**：`LOG_BUFFER` 在同一作用域中被 `print` 了两次，导致所有日志都出现双份\n\n## [2.26.4] - 2026-07-09\n\n### 文档\n- **SKILL.md 全面更新**：移除过时的\"三端同步\"描述，替换为\"全平台发布工具\"；删除\"不支持批量\"的矛盾声明；能力表更新为全平台 + 支持 `all` 模式\n- **reference.md 修复**：MANIFEST_FILE 路径（`scripts/manifest.json` → 正确绝对路径）、WORK_REPO 跨平台说明、敏感扫描更新为 LLM 自动决策模式、ZIP 排除更新为 LLM 动态过滤（v2.26+）\n- **guide.md 修复**：skill_audit 独立 CLI → 内联审计；config.json 模板增加 `email` 字段\n- **faq.md 修复**：Q11 更新为 LLM 自动决策；Q14 更新为内联审计说明（删除已失效的 CLI 命令）\n- **update_readme.py 更新**：新增 agent/ 目录扫描 + 智能体列表表格；许可部分增加 Apache 2.0；config.json readme.description 恢复用户自定义文案（\"合集与智能体项目\"）\n\n## [2.26.3] - 2026-07-09\n\n### 修复\n- **Git Bash 格式本地路径漏脱敏**：sensitive_scan.py 的本地路径正则只匹配 `C:\\Users\\` 反斜杠格式，未匹配 `/c/Users/` Git Bash 格式。导致 git-sync.sh 中的硬编码路径 `[LOCAL_PATH]/...` 未被扫描发现\n- **LLM 决策逻辑修复**：`\"路径\"` 之前被纳入 public_labels 允许列表，导致公开文档中的真实路径被 keep。改为仅当没有 \"本地绝对路径\" / \"家目录路径\" 标签时才 keep\n\n### 变更\n- sensitive_scan.py 本地路径正则增强：同时匹配 Windows 反斜杠和 Git Bash 正斜杠格式\n\n## [2.26.2] - 2026-07-09\n\n### 修复\n- **ClawHub 发布在 Windows 上崩溃**：subprocess 调用 npx 需要 shell=True，否则找不到可执行文件\n- **SkillHub 发布版本错误**：必须显式传 `--version` 参数，不可依赖 SKILL.md frontmatter（平台上已有旧版本时 frontmatter 读取不可靠）\n- **Market-only/正常模式输出被吞**：market 步骤改用 print() 直接输出，不走 LOG_BUFFER\n\n### 文档\n- 全面更新 SKILL.md 描述、约束、触发条件、核心能力和平台发布差异表\n- 更新 references/guide.md 完整执行流程（步骤 0→9）和新版调用方式\n\n## [2.26.1] - 2026-07-09\n\n### 变更\n- **LLM 文件过滤器改用 Python 扫描**：Python glob 自动查找规则文件（blueprint*, *rules*, blueprints/），读取内容后与文件树一并传给 LLM。LLM 只做决策判断，不扫描目录，大幅节省 token\n- **引导优化**：明确要求保留所有 .py 代码文件、文档、许可证等核心文件\n\n### 修复\n- 移除对 `references/blueprint_rules.md` 的硬编码路径引用，改为 Python 动态扫描\n\n## [2.26.0] - 2026-07-09\n### 变更\n- **移除硬编码黑名单**：不再使用 EXCLUDE_PATTERNS（__pycache__/, *.bak, node_modules/ 等）排除文件\n- **LLM 文件过滤器**：新增 step_llm_file_filter，在同步前引导 LLM 审核源文件列表，决定哪些文件可以进入仓库。模型权重、私库数据、缓存文件等由 LLM 判断后排除，不再依赖穷举黑名单\n- **同步前置过滤**：LLM 返回允许列表后，sync_files 只复制允许的文件，仓库中只进干净数据\n\n## [2.25.0] - 2026-07-09\n### 新增\n- **类型自动检测**：自动识别 skill（_meta.json）和 agent（__init__.py），skill 走原流程，agent 同步到 agent/ 目录\n- **all 模式**：git-sync all 遍历全部 skills + agents\n- **ClawHub 自动发布**：推送到 git 后自动执行 clawhub publish（skill）\n- **SkillHub 自动发布**：推送到 git 后自动执行 skillhub publish（skill）\n- **PyPI 发布**：--pypi 标志，隔离构建 + twine 上传\n- **Release 创建**：--release 标志，git tag + GitHub API Release\n\n### 变更\n- 参数解析新增 --skip-market / --market-only / --pypi / --release\n- step_commit_and_push / step_version_compare 支持动态子目录路径\n\n## [2.24.2] - 2026-07-06\n\n### 修复\n- **`step_sensitive_scan` HOOK-BLOCK 阻塞 pipeline**：敏感扫描发现疑似信息后 `sys.exit(1)` 卡死等待人工决策文件。改为自动生成 LLM 风格决策：公开文档（LICENSE/README/changelog/SKILL.md 等）中的用户名/署名 → keep，邮箱/token/IP → sanitize。无需 `--skip-scan`，无需人工介入\n\n## [2.24.1] - 2026-07-02\n\n### 修复\n- **_paths.py WORK_REPO 路径错误** — `Path.home() / \".workbuddy\" / \"workbuddy-skills\"` 指向不存在目录，导致 git-sync 静默退出。修正为 `Path.home() / \"WorkBuddy\" / \"workbuddy-skills\"` 指向实际仓库。同时修复 git-sync.py QUIET_MODE 调试后还原\n\n## [2.24.0] - 2026-06-29\n\n### 变更\n- **脱敏流程改为 LLM 决策** — `make_all_sanitize.py` 自动全量脱敏回退移除，改为 findings 输出后 HOOK-BLOCK，等待 LLM 审阅并创建 decisions 文件后继续，不再替 LLM 做判断\n\n### 修复\n- **sensitive_scan.py 裸扫全部** — `author` 是公开笔名不应自动排除，改为全部扫描暴露给 LLM 判断\n\n## [2.23.2] - 2026-06-27\n\n### 修复\n- git-sync.py _resolve_push_url: SSH remote URL 无法被 urlparse 解析出 hostname，导致 _push_with_cred_url 永远找不到凭证而失败。SSH 用 key 认证无需 credential，直接返回 raw_url 让 SSH key 处理\n\n---\n\n## [2.23.1] - 2026-06-27\n\n### 修复\n- SKILL.md: fix duplicate `## 触发条件` 标题（auto-fix 遗留）\n- SKILL.md: 约束措辞微调以通过 C-18 `参数约束`/`格式要求` 关键词检查\n\n---\n\n## [2.23.0] - 2026-06-27\n\n### 重构\n- **[新增] scripts/_paths.py** — 路径集中管理模块，收归所有脚本中的路径常量\n- **[git-sync.py]** 替换硬编码路径为 `from _paths import ...`\n- **[manifest.py]** 替换硬编码路径为 `from _paths import ...`\n- **[normalize_meta.py]** 替换硬编码路径为 `from _paths import ...`\n- **[pack_zip.py]** 替换硬编码路径为 `from _paths import ...`\n- **[permission_checker.py]** 替换硬编码路径为 `from _paths import ...`\n- **[sensitive_scan.py]** 替换硬编码路径为 `from _paths import ...`\n- **[sync_with_exclude.py]** 替换硬编码路径为 `from _paths import ...`\n- **[update_readme.py]** 替换硬编码路径为 `from _paths import ...`\n- **[clean_dist.py]** 替换硬编码路径为 `from _paths import ...`\n\n---\n\n## [2.22.0] - 2026-06-27\n\n### 新增\n- **[blueprint_scan.py] 蓝图扫描** — Python 扫描技能目录结构+内容采样，输出 blueprint.json，不做判断\n- **[blueprint_rules.md] LLM 判断规则** — 筛除原则和脱敏原则，不写死任何具体路径/模式\n- **[sync_with_exclude.py] 排除清单驱动** — 新增 `--exclude-list` 参数，读取 LLM 产出的排除清单，删除硬编码 EXCLUDE_DIRS\n- **[sensitive_scan.py] 脱敏清单驱动** — 新增 `sanitize-list` 子命令，读取 LLM 产出的脱敏清单逐项替换\n- **[git-sync.py] 蓝图钩子** — pipeline 新增 step_blueprint，排除/脱敏清单缺失时自动生成 blueprint.json 并阻断，等待 LLM 判断后继续\n\n---\n\n## [2.21.1] - 2026-06-16\n\n### 修复\n- 删除 version 参数，强制从 _meta.json 读取版本号\n\n---\n\n## [2.21.0] - 2026-06-16\n\n### 修复\n- refactor: git-sync\n\n---\n\n## [2.20.0] - 2026-06-16\n\n### 修复\n- refactor: git-sync\n\n---\n\n## [2.19.0] - 2026-06-16\n\n### 修复\n- refactor: git-sync\n\n---\n\n## [2.18.0] - 2026-06-16\n\n### 修复\n- refactor: git-sync\n\n---\n\n## [2.17.0] - 2026-06-16\n\n### 修复\n- refactor: git-sync\n\n---\n\n## [2.16.0] - 2026-06-16\n\n### 修复\n- refactor: git-sync\n\n---\n\n## [2.15.0] - 2026-06-16\n\n### 修复\n- refactor: git-sync\n\n---\n\n## [2.14.0] - 2026-06-16\n\n### 修复\n- refactor: git-sync\n\n---\n\n## [2.13.1] - 2026-06-16\n\n### 修复\n- references/permissions.md 重写：基于 PermissionChecker 扫描数据生成真实权限说明（CRITICAL 风险等级，15subprocess+19delete+9sensitive+2network）\n\n---\n\n## [2.13.0] - 2026-06-16\n\n### 修复\n- refactor 改造完成：C-10空行压缩、C-11章节指纹重排、C-12触发条件/约束格式化、C-14工作流结构化渲染、R-10版本同步、R-11 .bak 清理、R-23文档引用修复、R-26误判过滤\n\n---\n\n## [2.12.31] - 2026-06-16\n\n### 改造\n- skill-standardization 全流程改造完成（refactor）：C-10 空行压缩、C-11 章节名规范化、C-14 工作流章节由结构化数据渲染、C-17 示例结构化数据就绪、R-10 版本同步、R-11 .bak 文件清理\n\n---\n\n## [2.12.29] - 2026-06-16\n\n### 修复\n- **自动化修复**: audit --fix 自动修正\n\n---\n\n## [2.12.9] - 2026-06-16\n\n### 修复\n- **自动化修复**: audit --fix 自动修正\n\n---\n\n## [2.12.10] - 2026-06-16\n\n### 修复\n- **自动化修复**: audit --fix 自动修正\n\n---\n\n## [2.12.11] - 2026-06-16\n\n### 修复\n- **自动化修复**: audit --fix 自动修正\n\n---\n\n## [2.12.12] - 2026-06-16\n\n### 修复\n- **自动化修复**: audit --fix 自动修正\n\n---\n\n## [2.12.13] - 2026-06-16\n\n### 修复\n- **自动化修复**: audit --fix 自动修正\n\n---\n\n## [2.12.14] - 2026-06-16\n\n### 修复\n- **自动化修复**: audit --fix 自动修正\n\n---\n\n## [2.12.15] - 2026-06-16\n\n### 修复\n- **自动化修复**: audit --fix 自动修正\n\n---\n\n## [2.12.16] - 2026-06-16\n\n### 修复\n- **自动化修复**: audit --fix 自动修正\n\n---\n\n## [2.12.6] - 2026-06-16\n\n### 修复\n- **改造修复**: 标准化改造过程中的多次版本号自动同步\n\n---\n\n## [2.12.5] - 2026-06-16\n\n### 修复\n- **改造修复**: SKILL.md 重构后的版本号同步\n\n---\n\n## [2.12.4] - 2026-06-16\n\n### 修复\n- **改造修复**: 修正 SKILL.md 章节格式（C-10/C-12/C-15）、新增限制章节、补充索引表 LICENSE 条目\n- **文档更新**: 更新 skill_audit.py 引用为 -m scripts.skill_audit\n\n---\n\n## [2.12.3] - 2026-06-16\n\n### 修复\n- **改造修复**: 标准化改造过程中的 frontmatter 字段同步\n\n---\n\n## [2.12.2] - 2026-06-16\n\n### 修复\n- **自动修复**: 标准化改造过程中由 audit --fix 自动修正的 frontmatter 字段\n\n---\n\n## 2.12.0 (2026-06-15)\n\n### 修复\n\n- **修复 `_push_with_cred_url` / `_pull_with_cred_url` 未检查 URL 内嵌 token 的缺陷**：\n  新增 `_resolve_push_url()` 函数，优先使用 remote URL 内嵌的凭证（如 `https://user:[email-redacted]/path`），\n  其次从 `~/.git-credentials` 查找。之前只要 `~/.git-credentials` 中无条目就返回\"找不到凭证\"，\n  即使 URL 已含 token 也无法推送。\n\n## 2.11.0 (2026-06-15)\n\n### 修复\n\n- **修复 Windows nul 保留设备名导致 copytree 崩溃**：`sync_files()` 和 `step_pack_zip` 的临时目录复制改为逐个复制并跳过 `name.lower() == \"nul\"` 的条目，避免 Windows 内核将 `nul` 路径解析为 `\\\\.\\nul` 设备\n\n## 2.10.0 (2026-06-15)\n\n### 重构\n\n- **错误消息标准化**：新增 `_classify_push_error()` 函数，将 git push/pull 原始错误输出归类为中文描述（超时、DNS、认证、拒绝等），防止 LLM 误读 443 等原始错误码\n- **`_pull_with_cred_url()` 增加错误处理**：pull 失败时也调用 `_classify_push_error()` 标准化错误消息\n- **无更新时 `return True, True` → `return False, False`**：防止 manifest 版本号走在推送前面（无更新时不应更新 manifest）\n- **reference.md 新增\"错误码与错误消息说明\"章节**：AI 必读，速查错误消息类别和应对原则\n\n## 2.9.3 (2026-06-09)\n\n### 修复\n- **git commit author 从 config.json 读取**：改为使用 `author` + `email` 字段，不再硬编码 `WorkBuddy <workbuddy@local>`\n- **config.json 新增 `email` 字段**：用于配置 git commit 提交者邮箱\n\n---\n\n## 2.9.2 (2026-06-09)\n\n### 修复\n- **README 文案从硬编码改为 config.json 驱动**：新增 `readme` 配置段（title/description/repo_name），update_readme.py 和 manifest.py 的 `_generate_readme()` 统一从 config.json 读取\n- **GBK 终端编码崩溃**：manifest.py 和 git-sync.py 模块级替换 `print` 为 `_safe_print`，30+ 处 emoji 输出不再崩\n- **git-sync.py 版本号与 _meta.json 不同步**：v2.6.22/2.6.23 → v2.9.2，对齐主版本\n\n## 2.9.1 (2026-06-06)\n\n### 修复\n- `run_git()` 缺少 `timeout=120` 参数：GitHub 443 超时时 `subprocess.run` 永久挂死，脚本无法进入 retry 逻辑\n  - 修复：添加 `timeout=120`，超时后抛出 `TimeoutExpired`，走 retry 流程并正常退出\n\n## 2.9.0 (2026-06-03)\n\n### 新增\n- **静默模式**：步骤执行期间子进程输出被捕获，不泄漏到终端\n- **日志缓冲**：log() 从直接打印改为缓冲，步骤结束统一输出\n\n### 更新\n- run_python() 在静默模式下自动 capture=True，阻止子进程 stdout 泄漏\n- main() 所有步骤包裹在 redirect_stdout + QUIET_MODE 中\n- 最终输出结构固定：统一步骤日志 + 固定格式报告\n\n## 2.8.2 (2026-06-03)\n\n### 修复\n- SKILL.md「AI 执行后必须输出」指令缺失\"如何输出\"：仅声明\"无需重新格式化\"，\n  未说明 AI 应将终端输出原文复制到回复中（终端输出在工具结果内，用户看不到）\n  修复：明确要求\"将终端输出的完整报告原文放入回复中，不重新格式化、不摘录、不加工\"\n\n---\n\n## 2.8.1 (2026-06-03)\n\n### 修复\n- `step_skill_audit()` 在 manifest 更新前执行，导致最终报告显示过期 ERROR=1\n  修复：审计移至 manifest 更新后执行，版本一致性检查使用最终数据\n\n---\n\n## 2.8.0 (2026-06-02)\n\n### 新增\n\n- **自动清理旧包**：每次生成 ZIP 后自动清理同一技能的旧包，保留最近 5 个版本\n\n---\n\n## 2.7.4 (2026-06-01)\n\n### 修复\n- C-13索引表补全\n\n---\n\n## 2.7.3 (2026-06-01)\n\n### 修复\n- R-10同步+渐进式索引表\n\n---\n\n## 2.7.2 (2026-06-01)\n\n### 修复\n- 恢复 v2.7.1后仅添加渐进式索引表\n\n---\n\n## 2.7.1 (2026-05-31)\n\n### 更新\n- **skill-standardization 标准化改造第二阶段**：通过 R-01~R-26 全规则审计\n\n### 修复\n- **R-06**: H1 标题删除版本号\n- **R-10**: 补全 v2.7.1 changelog 条目，确保三端版本一致\n- **R-20**: changelog 术语统一（统一为删除）\n- **guide.md**: 清理重复的配置说明章节\n\n---\n## 2.7.0 (2026-05-30)\n\n### 更新\n- **skill-standardization 标准化改造**：通过 R-01~R-26 全规则审计（25/25 PASS，0 ERROR，0 WARN ✅）\n- **R-01/R-07 frontmatter 补全**：新增 `trigger` 和 `trigger_negative` 字段\n- **R-04 description 清理**：删除 description 中的版本号信息\n- **R-10 版本号去 v 前缀**：changelog.md 所有版本号改为纯数字格式\n- **R-12 数据目录规范化**：统一所有脚本的 `DEFAULT_DATA_DIR_RAW` 和 `_data_dir_abs` 定义；删除各脚本中重复的路径定义块；`DATA_DIR` 改名 `_data_dir_abs` 避免被审计二次匹配\n- **R-20 写作规范修复**：faq.md 中模糊用词已统一为确定性表述（此更新已在过去版本完成）；SKILL.md 中 `git-sync.py` → `scripts/git-sync.py`（脚本路径修正）\n\n---\n\n## 2.6.37 (2026-05-30)\n\n### 修复\n- audit --fix 自动修正\n\n---\n\n## 2.6.36 (2026-05-30)\n\n### 更新\n- **三单一致模型重写**：reference.md 中完整定义三单一致语义（同步前/同步中/同步后三段式），明确 `_meta.json` + `SKILL.md` frontmatter version 也参与三单一致，补充 `gitee_ok` / `github_ok` / `uploaded` 作为三单一致的状态标记\n- guide.md 步骤 0.7 补充三单一致前置说明\n- guide.md 步骤 4 推送记录补充三单一致语义注释\n- faq.md Q4 补充三单一致说明，Q9 补充同步前一致原则\n\n---\n\n## 2.6.35 (2026-05-30)\n\n### 修复\n- audit --fix 自动修正\n\n---\n\n## 2.6.34 (2026-05-30)\n\n### 修复\n- normalize_meta.py 不再删除 _meta.json 非标准字段（data_dir 等），只同步 version/name/description；guide.md 同步更新步骤 1 描述\n\n---\n\n## 2.6.33 (2026-05-30) — 修复文件筛选三档逻辑\n\n### Fixed\n- 上次 v2.6.32 推送时版本相同跳过，修复未生效\n- git-sync.py 文件筛选状态判断逻辑从“若有 violations 则 clean”改为“若有 violations 则报警”\n- 增加 error 状态支持，避免被其他状态误触\n\n## 2.6.32 (2026-05-30) — 修复文件筛选状态描述\n\n### Fixed\n- git-sync.py 文件筛选状态从两档（PASS/遗漏）改为三档（干净/有不应打包文件/检查失败）\n- “无遗漏文件” → “干净（无多余文件）”，消除语义反向误解\n\n## 2.6.31 (2026-05-30) — 完全解耦：删除内嵌 skill_audit/ + 清理参考\n\n### Removed\n- 删除 scripts/skill_audit/ 内嵌包（含 7 个模块）\n- 删除 git-sync.sh 中的 skill_audit.py 外部调用代码块\n- 删除 verify_zip.py 中的 skill-standardization 硬编码路径\n\n### Changed\n- SKILL.md 描述更新：“调用 skill-standardization 进行审计” → “内联审计”\n- 与 skill-standardization 完全解耦，无任何代码依赖\n\n## 2.6.30 (2026-05-30) — R-12 合规整改\n\n### Changed\n- _meta.json: 补充 data_dir 字段\n- 9 个脚本补充 DEFAULT_DATA_DIR_RAW + DATA_DIR （R-12 step 1.5）\n- SKILL.md frontmatter 补充 external_data_dir、修正 sensitive_access/permission_weight\n\n### Fixed\n- 所有引用 .standardization 的脚本现均有合规的 DATA_DIR 声明，R-12 step 1.5 检测通过\n# changelog.md — git-sync 更新日志\n\n## 2.6.29 (2026-05-29) — 自动版本升级\n\n### Changed\n- 版本号 2.6.28 → 2.6.29（`update --fix` 自动 bump）\n## 2.6.28 (2026-05-29)\n\n### 修复\n- 修复跳过同步时最终报告显示「成功」的误导问题：版本相同时状态改为「⏭️ 跳过」\n\n---\n## 2.6.27 (2026-05-29)\n\n### 修复\n- 修复 SKILL.md「AI 执行后必须输出」步骤 1 太笼统的问题：只要求\"表格呈现\"→ AI 只输出简单推送表，遗漏审计报告、ZIP 详情、HTML 路径\n- 修复 SKILL.md 标题仍是 `v2.6.24` 未同步更新\n\n### 改进\n- 步骤 1 扩展为「完整推送报告」模板：推送状态表 + 审计结论 + ZIP 路径/大小/文件数 + HTML 索引路径\n- 新增步骤 4：GitHub 推送失败自动询问用户是否重试\n\n---\n## 2.6.26 (2026-05-29)\n\n### 修复\n- 修复 `SKILL.md` frontmatter `name: .` → `name: git-sync`（导致扫描列表显示为 `.`）\n- 修复 AI 执行后未按要求输出的问题：SKILL.md 缺少显式 AI 输出指令（表格 + deliver_attachments + preview_url）\n\n### 新增\n- `SKILL.md` 新增「AI 执行后必须输出」章节：明确 3 步必做操作\n- `SKILL.md` 渐进式加载列表新增 `guide.md`（标为必读）\n- `guide.md` 已有的 `preview_url` 指令现在被 SKILL.md 显式引用\n\n---\n\n## 2.6.25 (2026-05-28)\n\n### 修复\n- 修复 `normalize_meta.py` 删除 `_meta.json` 中 `triggers` 和 `created_at` 字段的 bug（`standard_fields` 缺少扩展字段声明）\n\n---\n\n## 2.6.24 (2026-06-10)\n\n### 修复\n- 审计改为轻量内建（只查版本一致性 + R-23），只读不修复，只生成报告\n- 修复 `EXCLUDE_PATTERNS` 未定义导致 NameError\n- 修复 `audit_result` 未初始化就 return 导致 UnboundLocalError\n- 修复 `main()` 未接收 `step_skill_audit()` 返回值\n\n### 新增\n- `main()` 末尾固定格式报告输出（推送情况表格 + 审计结论 + ZIP 路径 + HTML 路径）\n\n---\n\n## 2.6.23 (2026-06-09)\n\n### 修复\n- ZIP 打包排除通配符支持（`*.bak` 等 fnmatch 模式）\n- `clean_zip_source` 改为安全模式（只删临时文件，不删源目录）\n- 修复 push 前提前 pull 导致本地更新被覆盖\n\n---\n\n## 2.6.22 (2026-06-08)\n\n### 修复\n- 敏感信息扫描结果写入路径修正\n- 脱敏后 ZIP 打包路径正确性修复\n\n---\n\n## 2.6.21 (2026-06-07)\n\n### 新增\n- 推送情况表格化输出\n- 审计报告集成到主流程\n\n---\n\n## 2.6.20 (2026-06-05)\n\n### 修复\n- manifest.json 更新逻辑修复\n- README.md 全量重新生成（含所有技能描述）\n\n---\n\n## 2.6.0~v2.6.19\n\n历史版本记录（从 v2.6.0 起采用新版本号规则）。\n\nFile v2.47.0:references/faq.md\n\n# git-sync 常见问题\n\n---\n\n## 同步与推送\n\n### Q1: GitHub 推送失败（443 超时 / Permission denied）\n\n检查网络代理或 SSH key 配置，或手动推送：\n\n```bash\ncd WORK_REPO\ngit push origin main\n```\n\n如果 443 超时持续出现，尝试：\n- 切换到 SSH 协议（`[email-redacted]:...` 替代 `https://github.com/...`）\n- 检查系统代理配置是否干扰 HTTPS\n\n### Q2: 想保留历史 commit 而非 amend？\n\n脚本已改为普通 `git commit`，不再使用 `--amend`。每次同步都会产生独立 commit。\n\n### Q3: Gitee push 需要密码但 PAT 仅限 API？\n\nGitee 的 PAT（Personal Access Token）通常仅限 API 操作，git push 需要登录密码或 SSH key。API 操作（如 Release 创建）使用 `config.json` 的 `gitee_token` 字段。\n\n解决方案：\n1. 使用 SSH 方式配置 Gitee remote（推荐）\n2. 或在推送时手动输入密码（交互式场景）\n\n### Q4: 双平台只有一个成功怎么办？\n\n脚本会分别记录每个平台的三单一致状态：\n- 仅 Gitee 成功 → `gitee_ok=true`, `github_ok=false`, `uploaded=false`\n  - 即：Gitee 已三单一致，GitHub 尚未一致\n- 可稍后对失败的平台单独重试\n- 重试成功 → 对应平台的 `*_ok=true`，`uploaded` 自动更新\n\n---\n\n## ZIP 打包\n\n### Q5: 本地有 html 文件被混入 ZIP？\n\n先删除临时文件再执行同步：\n\n```bash\nrm -f $SKILLS_DIR/<skill-name>/*.html\n```\n\n或在 skill 目录下添加 `.gitignore` 规则排除 html。\n\n### Q6: ZIP 包太大怎么办？\n\n检查是否有意外包含的大文件（数据集、模型、图片等）：\n\n```bash\n# 查看 ZIP 内容大小\nunzip -l $SKILLS_DIR/.dist/<skill-name>-v*.zip | sort -rn -k4 | head -20\n```\n\n常见的大文件来源：\n- `__pycache__/` 缓存目录（应被自动排除）\n- `.git/` 版本控制目录（应被自动排除）\n- 数据文件或模型权重\n\n### Q7: 如何验证 ZIP 内容是否正确？\n\n```bash\n# 解压到临时目录检查\nmkdir /tmp/zip-check && cd /tmp/zip-check\nunzip $SKILLS_DIR/.dist/<skill-name>-v*.zip\nfind . -type f | head -30\n```\n\n---\n\n## 维护清单 (manifest)\n\n### Q8: \"NOT_FOUND\" 提示是什么意思？\n\n表示要同步的 skill 不在 manifest.json 清单中。此时会询问你三个选项：\n\n| 选项 | 含义 |\n|------|------|\n| **加入清单** | 将此 skill 注册到 manifest.json，标记 uploaded=false，继续同步 |\n| **仅本次同步** | 不更新清单，只执行本次同步操作 |\n| **中止** | 取消本次同步 |\n\n建议选择\"加入清单\"，方便后续版本管理和全量维护。\n\n### Q9: 版本号对比显示\"清单 version > 待更新版本\"？\n\n这表示清单中记录的版本号比你要同步的版本还高，属于异常情况——**同步前仓库和清单必须一致**，出现这个说明之前的三单一致被破坏了。常见原因包括：\n- 手动编辑了 manifest.json 导致版本混乱\n- 上次同步后版本号没有正确递增\n- 本地改了版本号但没推送（清单比本地高）\n\n处理策略选择：\n- **覆盖** — 用待更新版本覆盖清单记录（如果确认清单错了）\n- **拉取** — 从仓库获取最新版本号（如果仓库更新过）\n- **合并** — 人工确认正确版本\n- **中止** — 先调查清楚再执行\n\n### Q10: README.md 和仓库实际内容不一致？\n\n正常情况下不应发生——README.md 由 `sync-readme` 全量生成，永远等于仓库实际内容。\n\n如果发现不一致，运行（`<repo>` 为 `config.json` 注册表中配置的仓库名）：\n\n```bash\ncd $SKILLS_DIR/git-sync/scripts\npython manifest.py sync-readme <repo>\n```\n\n---\n\n## 敏感信息过滤\n\n### Q11: 扫描结果误报怎么办？\n\n自 v2.24.2 起，敏感扫描由 **LLM 自动决策**，无需人工交互。LLM 会根据 context 自动判断：\n\n| 误报场景 | LLM 自动处理 |\n|---------|-------------|\n| 示例邮箱在文档中 | 识别为 public_docs 中的署名邮箱 → 保留 |\n| 类似 Token 的 UUID 字符串 | 匹配 Token 模式但缺乏密钥上下文 → LLM 判断为 false positive，保留 |\n| 配置用户名在代码注释中 | 匹配 config.json 中的 author/gitee.user → 标记为 low，保留 |\n| 本地路径在文档中 | public_docs 中的路径 → 保留；代码中硬编码 → 脱敏 |\n\n⚠️ **安全说明**：敏感信息脱敏为强制流程，不可跳过。所有推送到公开仓库的文件均经过自动脱敏处理。\n\n### Q12: 脱敏后的文件能恢复吗？\n\n- **源文件**：永远不会被更新（脱敏作用于副本）\n- **仓库副本**：会被脱敏覆盖；如需恢复，重新执行一次 git-sync 即可从源文件重新同步\n- **ZIP 包中的文件**：已脱敏；重新打包即可\n\n---\n\n## 审查规则 (R-01~R-26)\n\n### Q13: 审查 ERROR 会阻止同步吗？\n\n不会。自 v1.8.0 起，审查为**纯警告模式**：\n\n- ERROR/WARN 仅在报告中体现\n- 始终返回 exit(0)\n- 不阻断、不中止、不强制修复\n- 建议逐步优化而非强制一次性通过全部规则\n\n### Q14: 如何单独运行审查？\n\n自 v2.6.31 起，审查已内联到 `git-sync.py` 的 `step_skill_audit()` 中，作为同步工作流的一部分自动执行。不再提供独立 CLI。\n\n审查作为步骤 3.5（规范元数据之后、文件同步之前）自动运行，检查：\n- 版本一致性（`_meta.json` vs `SKILL.md` frontmatter）\n- R-23 脚本引用规范\n\n无需手动调用。如果需要跳过审查，目前不支持单独跳过，但审查本身是纯警告模式，不影响同步流程。\n```\n\nFile v2.47.0:references/guide.md\n\n# git-sync 完整使用指南\n\n> 本文档是 SKILL.md 的渐进式补充，包含完整的执行流程、步骤详解和配置说明。\n\n---\n\n## 完整执行流程（步骤 0 → 9）\n\n### 步骤 0：参数解析 + 类型检测（v2.25+）\n\n| 操作 | 说明 |\n|------|------|\n| 参数解析 | `--skip-market` / `--market-only` / `--pypi` / `--release` |\n| `all` 模式 | `git-sync all` 遍历配置的全部仓库项目（仓库名/路径由 `config.json` 的 `repos` 注册表决定） |\n| 类型检测 | 自动识别 skill（`_meta.json`）或 agent（`__init__.py`） |\n| 版本号读取 | skill→`_meta.json`，agent→`__init__.py` 中的 `__version__` |\n\n### 步骤 0.7：版本号比对（v1.6+）\n\n与仓库中已有版本对比，决定是否需要同步：版本相同跳过，本地更新则正常升级。\n\n### 步骤 1：维护清单检查（v1.3+）\n\n同步前自动检查 `manifest.json`。\n\n### 步骤 2~3.5：标准校验（仅 skill）\n\n| 步骤 | 操作 | 适用 |\n|------|------|------|\n| 2 | `_meta.json` 标准化校验 | skill 仅 |\n| 3 | SKILL.md 规范审查（只读） | skill 仅 |\n\n### 步骤 3.7：LLM 文件过滤器（v2.29.0，替换硬编码黑名单）\n\nPython 扫描源目录文件树 + 自动查找规则文件（`blueprint*`, `*rules*`, `blueprints/`），生成扫描报告后**全量打印文件列表 + 排除规则到 stdout**，要求调用方（AI 助手）在回复中输出决策 JSON。决策写入 `.file_filter_{name}.json.decisions.json`，**重新运行 git-sync 后读取该文件继续同步**。\n\n交互流程：\n1. git-sync 扫描文件 → 打印完整文件列表 + 排除规则 → 退出（返回 None）\n2. 调用方（AI 助手）看到输出后，审核文件列表，按规则决定保留/排除\n3. 调用方（AI 助手）在回复中输出 `{\"allow\": [\"path/to/file.py\", ...]}`，**同时写入决策文件**\n4. 重新运行 git-sync → 读取决策文件 → 只复制允许的文件 → 继续后续步骤\n\n| 环境 | 行为 |\n|------|------|\n| 有决策文件 | 直接读取，跳过审核 |\n| 无决策文件 | 打印审核指令，等待调用方（AI 助手）回复决策 |\n| 决策文件解析失败 | 默认保留所有文件 |\n\n> ⚠️ **决策文件写入规范（2026-08-09 实战教训，必须遵守）**\n>\n> **🔥 铁律第一条：让位 → 写决策 → 重跑，必须在同一条 Bash 命令里完成，一次跑完，禁止拆成多条命令。**\n>\n> 2026-08-09 git-sync 自推送实战：拆成\"先跑让位 → 再单独写决策 → 再重跑\"三条命令时，第二次命令里 scan/resume 文件**凭空消失**（git-sync 每次运行会重建/清理 temp），导致反复\"决策文件存在却读不到\"→ 重试 N 次全部失败；合并为一条命令 `让位 && 写决策 && 重跑` 后**一次通过**。这是已确认的根因规律，不是偶然。\n>\n> 决策文件**必须用 git-sync 自己的路径函数写入**，严禁用 Write 工具或跨进程手写路径：\n>\n> ```bash\n> # ✅ 正确姿势：一条 Bash 命令完成全流程（cd 到 git-sync/scripts 后）\n> python git-sync.py <name> --skip-market ; \\\n> python -c \"import sys,json; sys.path.insert(0,'.'); from _paths import temp_filter_decisions_path; dec=temp_filter_decisions_path('<name>'); dec.write_text(json.dumps({'allow':[...],'exclude':[...]},ensure_ascii=False))\" ; \\\n> python git-sync.py <name> --skip-market\n> ```\n>\n> ```python\n> # ✅ 决策内容生成（在 git-sync scripts 目录下，import _paths 用其路径函数写入）\n> import sys; sys.path.insert(0, r'<GIT_SYNC_DIR>/scripts')\n> from _paths import temp_filter_decisions_path\n> dec = temp_filter_decisions_path('<name>')\n> dec.write_text(json.dumps({'allow': [...], 'exclude': [...]}), encoding='utf-8')\n> ```\n>\n> ❌ **错误做法（会导致\"决策文件存在却读不到\"→ 反复让位死循环）**：\n> - **把\"让位/写决策/重跑\"拆成多条独立 Bash 命令**（temp 文件跨命令被重建/清理，必现\"文件消失\"）\n> - 用 Write 工具写决策文件（写入可能被沙箱隔离，git-sync 进程看不到）\n> - 手写硬编码路径（`C:\\Users\\...\\temp\\file_filter_xxx.decisions.json`），一旦 `_paths.py` 的 `TEMP_DIR` 解析不同则路径不一致\n> - 跨 Bash 进程写入后立即重跑（沙箱视图不同，文件\"消失\"）\n>\n> **症状识别**：重跑 git-sync 仍显示\"已让位（exit 3）：请写入决策文件后重跑\"，但 `ls` 明明能看到决策文件——这就是命令拆分/路径/沙箱不一致，**合并为一条命令**并按 ✅ 方式重写决策文件即可。**在 git-sync 脚本环境下（`from _paths import ...`）写入并验证 `dec.exists()` 为 True，与重跑放在同一条命令里，一次通过。**\n\n### 步骤 4：同步文件\n\n仅复制 LLM 允许列表中的文件到目标仓库（按 `get_work_repo(type)` 解析，v2.37.0 多仓库模型：skill → 技能仓库、agent → 智能体仓库，具体路径见 `config.json` 注册表）。\n\n### 步骤 4.5：LLM 脱敏\n\n扫描已同步文件中的敏感信息（邮箱/token/IP），LLM 自动决策 keep/sanitize，执行脱敏。\n\n> ⚠️ **脱敏决策写入规范**：与步骤 3.7 相同——**同样必须在同一条 Bash 命令里完成让位→写决策→重跑**，用 `_paths.py` 的 `temp_scan_decisions_path('<name>')` 写入，`{\"相对路径\": \"keep\"|\"sanitize\"}` 格式。**critical 级发现（Token/密钥）必须 sanitize，公开署名（如作者 wUwproject）与第三方库作者邮箱可 keep。** 脱敏是强制安全门禁（v2.31.0 起不可跳过），决策文件缺失会反复让位。\n\n### 步骤 5：更新 README.md（skill + agent）\n\n按仓库类型扫描：技能仓库扫技能目录，智能体仓库扫智能体目录（仓库路径由 `config.json` 注册表决定），生成技能表格 + 智能体表格。\n\n### 步骤 6：提交并推送到双平台\n\nGitee + GitHub，失败自动 pull --rebase 重试。\n\n### 步骤 6.7：更新清单上传状态\n\n### 步骤 7：生成 ZIP 安装包（仅 skill）\n\n### 步骤 7.5：打包前敏感扫描\n\n### 步骤 8：发布到平台（非静默，直接输出）\n\n| 类型 | 平台 | 命令 |\n|------|------|------|\n| skill | ClawHub | `npx clawhub publish`（shell=True，已知 CLI bug）|\n| skill | SkillHub | `skills_store_cli.py publish --version <ver>`（必须传 --version）|\n| agent | PyPI | 隔离构建 → `twine upload --disable-progress`（--pypi 标志）|\n\n### 步骤 9：创建 Release（--release 标志）\n\n打 tag + 推双平台 + 创建 GitHub Release + Gitee 发行版。\n- tag 格式：skill=`{name}-v{ver}`，agent=`v{ver}`\n- 源码包由 GitHub/Gitee 自动从 tag 生成（Source code zip/tar.gz）\n- 同时推送 `pypi/{type}/{name}/{version}` 触发 tag，供 GitHub Actions Trusted Publisher 工作流使用\n- 仅 `--release` 标志时执行，平时同步不创建 Release\n\n### 步骤 1：_meta.json 版本同步\n\n同步 version 字段，补全缺失的 name/description，**保留所有既有字段**（不删除任何字段）。\n\n| 标准字段 | 缺失时处理 |\n|---------|-----------|\n| `name` | 使用目录名 |\n| `version` | 使用传入的 version 参数 |\n| `description` | 从 SKILL.md 提取 |\n| `author` | 从 config.json 读取（缺省为 `your-name-here`） |\n| `tags` | 设为空数组 `[]` |\n\n### 步骤 1.5：SKILL.md 内联审计（v2.6.31+）\n\n- **方式**：`git-sync.py` 内置 `step_skill_audit()`，作为同步工作流的一部分自动执行\n- **检查项**：版本一致性（`_meta.json` vs `SKILL.md` frontmatter）+ R-23 脚本引用规范\n- **模式**：纯警告不阻断（始终 exit(0)）\n- **输出**：终端打印检查报告（ERROR=0 WARN=N PASS=M）\n\n### 步骤 2：同步文件到工作仓库\n\n将技能从 `$SKILLS_DIR/<skill-name>/` 同步到目标仓库（`get_work_repo(type)` 返回的仓库路径下的 `<name>/` 目录，具体路径由 `config.json` 注册表声明）。\n\n### 步骤 3：全量重新生成 README.md\n\n> **关键原则**：README.md = 仓库实际内容，不手动维护。\n\n从仓库实际目录扫描，全量替换 README.md 中的技能列表表格和目录结构（多仓库模型下各仓库维护各自 README）。\n\n### 步骤 3.5：SKILL.md 审查输出\n\n审查结果以人类可读格式打印到终端：\n\n```\n==================================================\n📋 Skill 更新检查报告: <skill-name>\n==================================================\n\n✅ 通过项:\n   ✅ _meta.json 结构正常\n   ...\n\n⚠️  警告/建议:\n   💡 具体警告信息...\n\n结论: ERROR=0 WARN=1 PASS=5\n```\n\n### 步骤 4：提交并推送到双平台\n\n```bash\ngit add → git commit → git pull --rebase → git push\n```\n\n推送结果分别记录（对应三单一致的状态标记）：\n- 码云成功 → 更新 `gitee_version` + 标记 `gitee_ok=true`（Gitee 三单一致）\n- GitHub 成功 → 更新 `github_version` + 标记 `github_ok=true`（GitHub 三单一致）\n- `uploaded` = `gitee_ok AND github_ok`（双平台均三单一致）\n\n### 步骤 5：生成 ZIP 安装包\n\n```\n输出: `.dist/<skill-name>-v<x.x.x>.zip`\n排除: *.zip, __pycache__/, .DS_Store, .git, *.html, *.log, ...\n```\n\n打包在临时副本中进行，不影响源文件。敏感信息过滤（如果启用）作用于副本。\n\n### 步骤 6：统一输出 + HTML 索引\n\n1. 复制 ZIP 到统一目录 `$SKILLS_DIR/.dist/`\n2. 自动生成/刷新 `index.html` 索引页（含 file:// 链接 + 文件大小 + 时间）\n3. 自动打开 dist/ 目录（Windows explorer / macOS open / Linux xdg-open）\n\n> **每次执行完毕后 AI 必须主动调用 `preview_url` 打开 index.html。**\n\n---\n\n## config.json 完整配置模板（v2.37.0 多仓库模型）\n\n> 实际配置位于数据目录（`$SKILLS_DIR/.standardization/git-sync/data/config.json`），含 repos 注册表。**下方为示例结构，仓库名/路径/用户名均需按用户实际配置修改。**\n\n```json\n{\n  \"author\": \"你的作者名\",\n  \"email\": \"你的邮箱（可选，用于 git commit author）\",\n  \"gitee\": {\n    \"user\": \"你的码云用户名\"\n  },\n  \"github\": {\n    \"user\": \"你的 GitHub 用户名\"\n  },\n  \"repos\": {\n    \"示例仓库名_skills\": {\n      \"type\": \"skills\",\n      \"path\": \"C:/Users/你的用户名/你的技能仓库本地路径\",\n      \"gitee\": { \"user\": \"你的码云用户名\", \"repo\": \"技能仓库名\" },\n      \"github\": { \"user\": \"你的 GitHub 用户名\", \"repo\": \"技能仓库名\" },\n      \"readme\": { \"title\": \"技能仓库标题\", \"description\": \"仓库描述\", \"repo_name\": \"技能仓库名\", \"banner\": \"历史存档说明（可选）\" }\n    },\n    \"示例仓库名_agents\": {\n      \"type\": \"agents\",\n      \"path\": \"C:/Users/你的用户名/你的智能体仓库本地路径\",\n      \"gitee\": { \"user\": \"你的码云用户名\", \"repo\": \"智能体仓库名\" },\n      \"github\": { \"user\": \"你的 GitHub 用户名\", \"repo\": \"智能体仓库名\" },\n      \"readme\": { \"title\": \"智能体仓库标题\", \"description\": \"仓库描述\", \"repo_name\": \"智能体仓库名\", \"banner\": \"历史存档说明（可选）\" }\n    }\n  },\n  \"source_overrides\": {},\n  \"gitee_token\": \"可选：Gitee API token\"\n}\n```\n\n**关键字段说明**：\n\n| 字段 | 影响范围 |\n|------|---------|\n| `author` | `_meta.json` 默认作者名；敏感扫描中的用户名检测基准 |\n| `email` | git commit 的 author email（`git-sync.py` 中的 `step_commit_and_push()` 使用） |\n| `repos.<name>.type` | 仓库类型：`skills`（skill 项目）或 `agents`（agent 项目），`get_repo_name()` 按此匹配项目归属 |\n| `repos.<name>.path` | 仓库本地路径，`get_work_repo(type)` 据此返回 |\n| `repos.<name>.gitee/github` | 各平台用户名 + 仓库名（推送目标） |\n| `repos.<name>.readme` | README 生成配置（标题、描述、banner 存档说明） |\n| `gitee_token` | Gitee API token（Release 创建等 API 操作） |\n\n---\n\n## 跨平台环境适配\n\n> 本技能优先用 `rsync` 做本地文件同步；rsync 不可用时（如部分 Windows Git 环境）自动 fallback 到 Python 完整流程（`git-sync.py`），功能等价，无需手动干预。\n\n### 环境矩阵\n\n| 环境 | rsync 是否可用 | 说明 |\n|------|----------------|------|\n| Linux / macOS | ✅ 自带 | 无需额外操作 |\n| Git for Windows 完整版 | ✅ 自带 | 位于 Git 安装目录的 usr/bin/ 下 |\n| **Windows 便携版 Git** | ❌ 不含 | 需手动安装（见下方） |\n| Cygwin / MSYS2 | ✅ 自带 | 通过包管理器安装 |\n| WSL | ✅ 自带 | 无需额外操作 |\n\n### Windows 下 Python 路径转换问题（重要）\n\n当 `rsync` 不可用时，脚本会 fallback 到 `sync_with_exclude.py`（Python 方案）。\n\n**问题根因：**\n- Git Bash 只对 **MSYS2 编译的程序** 自动转换 Unix 路径（`/c/Users/...` → `C:\\Users\\...`）\n- 如果 `python` 是 **Windows 原生 exe**（如 `.workbuddy\\binaries\\...`），路径不会被转换\n- Python 收到 `/c/Users/...` 会误解为 `C:\\c\\Users\\...`，导致文件找不到\n\n**症状：**\n```\nC:\\Users\\USERNAME\\.workbuddy\\binaries\\python\\...\\python.exe: can't open file 'c:\\\\c\\\\Users\\\\...'\n```\n\n**解决方案（任选其一）：**\n\n| 方案 | 操作 | 推荐度 |\n|------|------|--------|\n| **A. 安装 rsync** | 见下方「各平台安装 rsync」| ⭐⭐⭐ 最推荐 |\n| **B. 用 MSYS2 版 Python** | `pacman -S python`（MSYS2 内）| ⭐⭐ |\n| **C. 手动调用 Python 时传 Windows 路径** | `python sync_with_exclude.py \"C:\\...\" \"C:\\...\"` | ⭐ 临时 |\n\n### 各平台安装 rsync\n\n#### Windows（便携版 Git 环境）\n\n**方式一：下载独立 rsync.exe 放到 Git 的 usr/bin**\n\n```bash\n# 在 Git Bash 中执行，下载 rsync.exe 到 Git 安装目录的 usr/bin/\ncd $GIT_INSTALL/usr/bin/\n# 从 Git for Windows 获取 rsync 工具\n# 在 Git Bash 中执行：\ncd $GIT_INSTALL/usr/bin/\n# 安装 rsync（如已安装可跳过）\n# 验证\nrsync --version\n```\n\n# 验证\nrsync --version\n```\n\n**方式二：安装完整版 Git for Windows**\n\n从 [git-scm.com](https://git-scm.com/download/win) 下载安装，**安装时勾选「Use Unix tools from the Command Prompt」**，安装后 `rsync` 可用。\n\n#### Linux\n\n```bash\n# Debian/Ubuntu\nsudo apt install rsync\n\n# RHEL/CentOS\nsudo yum install rsync\n\n# Arch\nsudo pacman -S rsync\n```\n\n#### macOS\n\n```bash\n# 自带 rsync，如缺失：\nbrew install rsync\n```\n\n#### MSYS2 / Cygwin\n\n```bash\n# MSYS2\npacman -S rsync\n\n# Cygwin（通过安装程序添加 rsync 包）\n```\n\n### 故障排除\n\n| 错误信息 | 原因 | 解决方法 |\n|---------|------|---------|\n| `rsync: command not found` | rsync 未安装或未在 PATH | 按上方对应平台安装 |\n| `can't open file 'c:\\\\c\\\\Users\\\\...'` | Python fallback 路径转换失败 | 安装 rsync，或传 Windows 路径调用 Python |\n| `SCRIPT_DIR` 路径计算错误 | 用绝对路径调用 `bash git-sync.sh` | **先 `cd` 到脚本目录再执行**（见下方正确调用方式）|\n\n### 正确调用方式\n\n本机 rsync 不可用，实际走 `git-sync.py`（`git-sync.sh` 会自动切换）。支持以下用法：\n\n```bash\n# 基础用法（自动识别类型，版本号自动从 _meta.json/__init__.py 读取）\npython git-sync.py <name>\n\n# 跳过市场发布\npython git-sync.py <name> --skip-market\n\n# 只发市场不推 git\npython git-sync.py <name> --market-only\n\n# 发布到 PyPI（仅 agent）\npython git-sync.py <name> --pypi\n\n# 创建 Release\npython git-sync.py <name> --release\n\n# 全部项目\npython git-sync.py all\n\n# 组合使用\npython git-sync.py rag-assistant --pypi --release --skip-market\n```\n\n> ⚠️ 注意：`git-sync.py` 不接收版本号位置参数（版本自动读取），`--skip-market` 同时跳过市场与 PyPI。\n\n---\n\n## 配置说明（LLM 参考）\n\n> 本技能的配置存放在数据目录，脚本自动读取，无需手动创建文件。**完整结构见上文「config.json 完整配置模板（v2.37.0 多仓库模型）」**，此处仅补充定位与字段要点。\n\n### 配置文件位置\n\n| 文件 | 路径 | 说明 |\n|------|------|------|\n| `config.json` | `$SKILLS_DIR/.standardization/git-sync/data/config.json` | 平台用户名、repos 注册表、gitee_token 等配置 |\n| `manifest.json` | `$SKILLS_DIR/.standardization/git-sync/\n\nArchive v2.45.8: 36 files, 135962 bytes\n\nFiles: _meta.json (128b), references/antipatterns.md (1340b), references/blueprint_rules.md (3385b), references/changelog.md (45844b), references/faq.md (5545b), references/guide.md (18002b), references/LICENSE.md (1097b), references/permissions.md (7866b), references/pypi-github-actions.yml (1654b), references/reference.md (18300b), scripts/_paths.py (5303b), scripts/blueprint_scan.py (4694b), scripts/build_index.py (4524b), scripts/clawhub_publish.py (2230b), scripts/clean_dist.py (1444b), scripts/clean_zip_source.py (3330b), scripts/get_config_value.py (545b), scripts/get_meta_desc.py (344b), scripts/get_meta_version.py (351b), scripts/git-sync.py (87817b), scripts/git-sync.sh (22877b), scripts/make_all_sanitize.py (499b), scripts/manifest.py (22170b), scripts/normalize_meta.py (3454b), scripts/pack_zip.py (3568b), scripts/permission_checker.py (41952b), scripts/pypi_publish.py (6504b), scripts/release_creator.py (4384b), scripts/sensitive_scan.py (24745b), scripts/set_meta_version.py (486b), scripts/skillhub_publish.py (2317b), scripts/sync_with_exclude.py (6073b), scripts/update_readme.py (14361b), scripts/verify_zip.py (1191b), skill-card.md (2485b), SKILL.md (14313b)\n\nArchive v2.45.7: 36 files, 135555 bytes\n\nFiles: _meta.json (128b), references/antipatterns.md (1340b), references/blueprint_rules.md (3385b), references/changelog.md (44926b), references/faq.md (5545b), references/guide.md (18002b), references/LICENSE.md (1097b), references/permissions.md (7866b), references/pypi-github-actions.yml (1654b), references/reference.md (18280b), scripts/_paths.py (5303b), scripts/blueprint_scan.py (4694b), scripts/build_index.py (4524b), scripts/clawhub_publish.py (2230b), scripts/clean_dist.py (1444b), scripts/clean_zip_source.py (3330b), scripts/get_config_value.py (545b), scripts/get_meta_desc.py (344b), scripts/get_meta_version.py (351b), scripts/git-sync.py (87700b), scripts/git-sync.sh (22877b), scripts/make_all_sanitize.py (499b), scripts/manifest.py (22170b), scripts/normalize_meta.py (3454b), scripts/pack_zip.py (3568b), scripts/permission_checker.py (41952b), scripts/pypi_publish.py (6483b), scripts/release_creator.py (4342b), scripts/sensitive_scan.py (24148b), scripts/set_meta_version.py (486b), scripts/skillhub_publish.py (2317b), scripts/sync_with_exclude.py (6073b), scripts/update_readme.py (14343b), scripts/verify_zip.py (1191b), skill-card.md (2545b), SKILL.md (14495b)\n\nArchive v2.45.6: 36 files, 135349 bytes\n\nFiles: _meta.json (128b), references/antipatterns.md (1340b), references/blueprint_rules.md (3385b), references/changelog.md (44305b), references/faq.md (5545b), references/guide.md (18002b), references/LICENSE.md (1097b), references/permissions.md (7866b), references/pypi-github-actions.yml (1654b), references/reference.md (18280b), scripts/_paths.py (5303b), scripts/blueprint_scan.py (4694b), scripts/build_index.py (4524b), scripts/clawhub_publish.py (2230b), scripts/clean_dist.py (1444b), scripts/clean_zip_source.py (3330b), scripts/get_config_value.py (545b), scripts/get_meta_desc.py (344b), scripts/get_meta_version.py (351b), scripts/git-sync.py (87390b), scripts/git-sync.sh (22877b), scripts/make_all_sanitize.py (499b), scripts/manifest.py (22170b), scripts/normalize_meta.py (3454b), scripts/pack_zip.py (3568b), scripts/permission_checker.py (41952b), scripts/pypi_publish.py (6483b), scripts/release_creator.py (4384b), scripts/sensitive_scan.py (24148b), scripts/set_meta_version.py (486b), scripts/skillhub_publish.py (2317b), scripts/sync_with_exclude.py (6073b), scripts/update_readme.py (14343b), scripts/verify_zip.py (1191b), skill-card.md (2810b), SKILL.md (14313b)\n\nArchive v2.45.4: 36 files, 133252 bytes\n\nFiles: _meta.json (128b), references/antipatterns.md (1340b), references/blueprint_rules.md (3385b), references/changelog.md (43059b), references/faq.md (5545b), references/guide.md (14976b), references/LICENSE.md (1097b), references/permissions.md (7866b), references/pypi-github-actions.yml (1654b), references/reference.md (18280b), scripts/_paths.py (5303b), scripts/blueprint_scan.py (4694b), scripts/build_index.py (4524b), scripts/clawhub_publish.py (2230b), scripts/clean_dist.py (1444b), scripts/clean_zip_source.py (3330b), scripts/get_config_value.py (545b), scripts/get_meta_desc.py (344b), scripts/get_meta_version.py (351b), scripts/git-sync.py (87390b), scripts/git-sync.sh (22877b), scripts/make_all_sanitize.py (499b), scripts/manifest.py (22170b), scripts/normalize_meta.py (3454b), scripts/pack_zip.py (3568b), scripts/permission_checker.py (41952b), scripts/pypi_publish.py (6483b), scripts/release_creator.py (4342b), scripts/sensitive_scan.py (24148b), scripts/set_meta_version.py (486b), scripts/skillhub_publish.py (2317b), scripts/sync_with_exclude.py (6073b), scripts/update_readme.py (14343b), scripts/verify_zip.py (1191b), skill-card.md (2695b), SKILL.md (13542b)\n\nArchive v2.45.0: 36 files, 131537 bytes\n\nFiles: _meta.json (128b), references/antipatterns.md (1340b), references/blueprint_rules.md (3385b), references/changelog.md (39515b), references/faq.md (5545b), references/guide.md (15382b), references/LICENSE.md (1097b), references/permissions.md (7866b), references/pypi-github-actions.yml (1654b), references/reference.md (18300b), scripts/_paths.py (5303b), scripts/blueprint_scan.py (4694b), scripts/build_index.py (4524b), scripts/clawhub_publish.py (2230b), scripts/clean_dist.py (1444b), scripts/clean_zip_source.py (3330b), scripts/get_config_value.py (545b), scripts/get_meta_desc.py (344b), scripts/get_meta_version.py (351b), scripts/git-sync.py (86386b), scripts/git-sync.sh (22877b), scripts/make_all_sanitize.py (499b), scripts/manifest.py (22170b), scripts/normalize_meta.py (3454b), scripts/pack_zip.py (3568b), scripts/permission_checker.py (41952b), scripts/pypi_publish.py (5910b), scripts/release_creator.py (4384b), scripts/sensitive_scan.py (24745b), scripts/set_meta_version.py (486b), scripts/skillhub_publish.py (2317b), scripts/sync_with_exclude.py (6073b), scripts/update_readme.py (14361b), scripts/verify_zip.py (1191b), skill-card.md (2556b), SKILL.md (13542b)\n\nArchive v2.44.0: 36 files, 127786 bytes\n\nFiles: _meta.json (128b), references/antipatterns.md (1340b), references/blueprint_rules.md (3385b), references/changelog.md (35780b), references/faq.md (5545b), references/guide.md (14976b), references/LICENSE.md (1097b), references/permissions.md (7866b), references/pypi-github-actions.yml (1654b), references/reference.md (17874b), scripts/_paths.py (4992b), scripts/blueprint_scan.py (4694b), scripts/build_index.py (4524b), scripts/clawhub_publish.py (2230b), scripts/clean_dist.py (1444b), scripts/clean_zip_source.py (3330b), scripts/get_config_value.py (545b), scripts/get_meta_desc.py (344b), scripts/get_meta_version.py (351b), scripts/git-sync.py (83960b), scripts/git-sync.sh (22877b), scripts/make_all_sanitize.py (499b), scripts/manifest.py (22170b), scripts/normalize_meta.py (3454b), scripts/pack_zip.py (3568b), scripts/permission_checker.py (41952b), scripts/pypi_publish.py (5883b), scripts/release_creator.py (4192b), scripts/sensitive_scan.py (21805b), scripts/set_meta_version.py (486b), scripts/skillhub_publish.py (2317b), scripts/sync_with_exclude.py (6073b), scripts/update_readme.py (14343b), scripts/verify_zip.py (1191b), skill-card.md (2963b), SKILL.md (12722b)\n\nArchive v2.43.1: 36 files, 127825 bytes\n\nFiles: _meta.json (128b), references/antipatterns.md (1340b), references/blueprint_rules.md (3385b), references/changelog.md (35780b), references/faq.md (5545b), references/guide.md (14976b), references/LICENSE.md (1097b), references/permissions.md (7866b), references/pypi-github-actions.yml (1654b), references/reference.md (17874b), scripts/_paths.py (4992b), scripts/blueprint_scan.py (4694b), scripts/build_index.py (4524b), scripts/clawhub_publish.py (2230b), scripts/clean_dist.py (1444b), scripts/clean_zip_source.py (3330b), scripts/get_config_value.py (545b), scripts/get_meta_desc.py (344b), scripts/get_meta_version.py (351b), scripts/git-sync.py (83960b), scripts/git-sync.sh (22877b), scripts/make_all_sanitize.py (499b), scripts/manifest.py (22170b), scripts/normalize_meta.py (3454b), scripts/pack_zip.py (3568b), scripts/permission_checker.py (41952b), scripts/pypi_publish.py (5883b), scripts/release_creator.py (4192b), scripts/sensitive_scan.py (21805b), scripts/set_meta_version.py (486b), scripts/skillhub_publish.py (2317b), scripts/sync_with_exclude.py (6073b), scripts/update_readme.py (14343b), scripts/verify_zip.py (1191b), skill-card.md (3037b), SKILL.md (12722b)\n\nArchive v2.42.0: 36 files, 127662 bytes\n\nFiles: _meta.json (128b), references/antipatterns.md (1340b), references/blueprint_rules.md (3385b), references/changelog.md (35780b), references/faq.md (5545b), references/guide.md (14976b), references/LICENSE.md (1097b), references/permissions.md (7866b), references/pypi-github-actions.yml (1654b), references/reference.md (17874b), scripts/_paths.py (4992b), scripts/blueprint_scan.py (4694b), scripts/build_index.py (4524b), scripts/clawhub_publish.py (2230b), scripts/clean_dist.py (1444b), scripts/clean_zip_source.py (3330b), scripts/get_config_value.py (545b), scripts/get_meta_desc.py (344b), scripts/get_meta_version.py (351b), scripts/git-sync.py (83960b), scripts/git-sync.sh (22877b), scripts/make_all_sanitize.py (499b), scripts/manifest.py (22170b), scripts/normalize_meta.py (3454b), scripts/pack_zip.py (3568b), scripts/permission_checker.py (41952b), scripts/pypi_publish.py (5883b), scripts/release_creator.py (4192b), scripts/sensitive_scan.py (21805b), scripts/set_meta_version.py (486b), scripts/skillhub_publish.py (2317b), scripts/sync_with_exclude.py (6073b), scripts/update_readme.py (14343b), scripts/verify_zip.py (1191b), skill-card.md (2647b), SKILL.md (12722b)","readmeExcerpt":"Skill: git-sync Owner: ldxs001 Summary: 全平台统一发布工具。支持 skills 和 agents 的 Gitee/GitHub/ClawHub/SkillHub/PyPI 同步与 Release 创建，LLM 驱动的文件过滤与脱敏。 Tags: deploy:2.48.0, git:2.48.0, gitee:2.48.0, github:2.48.0, latest:2.48.0, publish:2.42.0, skill:2.42.0, sync:2.48.0, workflow:2.24.0 Version history: v2.48.0 | 2026-10-03T14:45:27.391Z | user v2.48.0 v2.47.0 | 2026-10-02T16:11:01.941Z | user v2.47.0 v2.45.8 | 2026-08-26T05:12:46.","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"cd WORK_REPO\ngit push origin main"},{"language":"bash","snippet":"rm -f $SKILLS_DIR/<skill-name>/*.html"},{"language":"bash","snippet":"# 查看 ZIP 内容大小\nunzip -l $SKILLS_DIR/.dist/<skill-name>-v*.zip | sort -rn -k4 | head -20"},{"language":"bash","snippet":"# 解压到临时目录检查\nmkdir /tmp/zip-check && cd /tmp/zip-check\nunzip $SKILLS_DIR/.dist/<skill-name>-v*.zip\nfind . -type f | head -30"},{"language":"bash","snippet":"cd $SKILLS_DIR/git-sync/scripts\npython manifest.py sync-readme <repo>"},{"language":"text","snippet":"File v2.48.0:references/guide.md\n\n# git-sync 完整使用指南\n\n> 本文档是 SKILL.md 的渐进式补充，包含完整的执行流程、步骤详解和配置说明。\n\n---\n\n## 完整执行流程（步骤 0 → 9）\n\n### 步骤 0：参数解析 + 类型检测（v2.25+）\n\n| 操作 | 说明 |\n|------|------|\n| 参数解析 | `--skip-market` / `--market-only` / `--pypi` / `--release` |\n| `all` 模式 | `git-sync all` 遍历配置的全部仓库项目（仓库名/路径由 `config.json` 的 `repos` 注册表决定） |\n| 类型检测 | 自动识别 skill（`_meta.json`）或 agent（`__init__.py`） |\n| 版本号读取 | skill→`_meta.json`，agent→`__init__.py` 中的 `__version__` |\n\n### 步骤 0.7：版本号比对（v1.6+）\n\n与仓库中已有版本对比，决定是否需要同步：版本相同跳过，本地更新则正常升级。\n\n### 步骤 1：维护清单检查（v1.3+）\n\n同步前自动检查 `manifest.json`。\n\n### 步骤 2~3.5：标准校验（仅 skill）\n\n| 步骤 | 操作 | 适用 |\n|------|------|------|\n| 2 | `_meta.json` 标准化校验 | skill 仅 |\n| 3 | SKILL.md 规范审查（只读） | skill 仅 |\n\n### 步骤 3.7：LLM 文件过滤器（v2.29.0，替换硬编码黑名单）\n\nPython 扫描源目录文件树 + 自动查找规则文件（`blueprint*`, `*rules*`, `blueprints/`），生成扫描报告后**全量打印文件列表 + 排除规则到 stdout**，要求调用方（AI 助手）在回复中输出决策 JSON。决策写入 `.file_filter_{name}.json.decisions.json`，**重新运行 git-sync 后读取该文件继续同步**。\n\n交互流程：\n1. git-sync 扫描文件 → 打印完整文件列表 + 排除规则 → 退出（返回 None）\n2. 调用方（AI 助手）看到输出后，审核文件列表，按规则决定保留/排除\n3. 调用方（AI 助手）在回复中输出 `{\"allow\": [\"path/to/file.py\", ...]}`，**同时写入决策文件**\n4. 重新运行 git-sync → 读取决策文件 → 只复制允许的文件 → 继续后续步骤\n\n| 环境 | 行为 |\n|------|------|\n| 有决策文件 | 直接读取，跳过审核 |\n| 无决策文件 | 打印审核指令，等待调用方（AI 助手）回复决策 |\n| 决策文件解析失败 | 默认保留所有文件 |\n\n> ⚠️ **决策文件写入规范（2026-08-09 实战教训，必须遵守）**\n>\n> **🔥 铁律第一条：让位 → 写决策 → 重跑，必须在同一条 Bash 命令里完成，一次跑完，禁止拆成多条命令。**\n>\n> 2026-08-09 git-sync 自推送实战：拆成\"先跑让位 → 再单独写决策 → 再重跑\"三条命令时，第二次命令里 scan/resume 文件**凭空消失**（git-sync 每次运行会重建/清理 temp），导致反复\"决策文件存在却读不到\"→ 重试 N 次全部失败；合并为一条命令 `让位 && 写决策 && 重跑` 后**一次通过**。这是已确认的根因规律，不是偶然。\n>\n> 决策文件**必须用 git-sync 自己的路径函数写入**，严禁用 Write 工具或跨进程手写路径：\n>\n>"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\r\nname: git-sync\r\nslug: git-sync\r\ndisplayName: git-sync\r\nversion: 2.48.0\r\nauthor: wUwproject\r\nlicense: MIT\r\ndescription: 全平台统一发布工具。支持 skills 和 agents 的 Gitee/GitHub/ClawHub/SkillHub/PyPI 同步与 Release 创建，LLM 驱动的文件过滤与脱敏。\r\nsensitive_access: true\r\ncritical_write: false\r\npermission_weight: CRITICAL\r\ndata_dir: ../.standardization/git-sync/data\r\ntags: ['sync', 'git', 'gitee', 'github', 'deploy']\r\nexternal_data_dir: true\r\ntrigger: 同步/推送/发布/上传/打包/更新 READ ME\r\ntrigger_negative: 只是看文件/通用 git 提交/文件同步到云端\r\nh1_version: true\r\nmeta_field_sync: true\r\ncreate_permissions_md: true\r\nh1_position: true\r\ndata_dir_compliance: true\r\n---\r\n# git-sync — 全平台发布工具\r\n\r\n将 skill/agent 代码规范化推送到**码云（Gitee）**、**GitHub**，并支持 **ClawHub**、**SkillHub**、**PyPI** 发布与 **Release 创建**。\r\n\r\n## 约束\r\n\r\n- **让位式 LLM 交互（v2.43.0）** — git-sync 包含两处 LLM 决策点（文件筛除、敏感脱敏），采用**让位式握手**：遇到决策点时写 resume 状态文件 + `exit 3` 退出，把控制权交还调用方（AI 助手）。调用方写入决策文件后**重跑同一命令**，git-sync 检测 resume 从当前环节续跑，不从头开始。**不再进程内轮询等待**（旧版 v2.42.0 的 120s 轮询会占用控制权导致卡死，已废弃）\r\n- **断点续跑** — `resume_{name}.json` 记录让位环节（`file_filter` / `sensitive_scan`），重跑时跳过已完成步骤。决策消费成功后 resume 自动清除\r\n- **⚠️ 决策文件必须用 `_paths.py` 路径函数写入 + 全流程一条命令（v2.45.6 实战教训，铁律）** — LLM 决策文件（`file_filter_{name}.decisions.json` / `sensitive_scan_{name}.decisions.json`）**必须**在 git-sync 脚本环境下通过 `from _paths import temp_filter_decisions_path / temp_scan_decisions_path` 写入并验证 `exists()`；**让位 → 写决策 → 重跑必须放在同一条 Bash 命令里一次跑完**（拆成多条命令时 temp 文件跨命令被重建/清理，必现\"文件存在却读不到\"→ 反复让位 exit 3 死循环，2026-08-09 git-sync 自推送重试 N 次证实）。**严禁用 Write 工具或跨进程硬编码路径写入**。完整写法见 `references/guide.md` 步骤 3.7 / 4.5 警示框\r\n- **自动检测类型** — 自动识别 skill（`_meta.json`）或 agent（rglob 扫描含 `__version__` 的 `__init__.py`，任意包目录名均可，不硬编码），分别走不同发布流程\r\n- **`all` 模式** — `git-sync all` 遍历配置的全部仓库项目（默认 skill 仓库 + agent 仓库，仓库名/路径由 `config.json` 的 `repos` 注册表决定）\r\n- **网络依赖** — 推送 Gitee/GitHub/ClawHub/SkillHub/PyPI 需要可用网络连接，超时阈值 60 秒\r\n- **冲突不自动合并** — git merge 冲突需人工介入\r\n- **多仓库模型（v2.37.0）** — 按项目类型解析目标仓库：`get_repo_name(type)` 从 `config.json` 的 `repos` 注册表匹配（`type` 字段：skills/agents），未配置时用默认名（skill→`maby_skills`、agent→`maby_agent`）。仓库本地路径、双平台 remote、README 文案全在注册表条目中声明，**用户按需配置，技能本身通用**\r\n- **参数约束** — 项目名不含路径分隔符，version 格式严格 x.y.z\r\n- **仓库规模** — 支持 1-50 个项目，每个 ≤ 500MB\r\n- **数据持久性** — manifest.json 记录同步状态，不备份远程仓库数据\r\n\r\n## 触发条件\r\n\r\n**正向触发：**\r\n- 「同步/上传/推送/发布某个 skill 或 agent」\r\n- 「全量同步/全部发布」\r\n- 「发布到 ClawHub/SkillHub/PyPI」\r\n- 「创建 Release」\r\n- 「打包/更新 README.md」\r\n- 「检查版本号」\r\n\r\n**否定条件：**\r\n- 用户只是说「帮我看看这个文件」——没有同步/打包意图\r\n- 用户要求「用 git 提交代码」——这是通用 git 操作，不是本技能\r\n\r\n## 核心能力\r\n\r\n> 📚 **渐进式加载**：本技能采用渐进式 MD 体系，`SKILL.md` 为入口（≤230行），详细内容拆分到 `references/*.md` 按需加载。\r\n\r\n- **全平台发布** —— Gitee + GitHub + ClawHub + SkillHub + PyPI，一次同步全自动\r\n- **类型自动识别** —— skill（`_meta.json`）/ agent（`__init__.py`），版本号各自读取\r\n- **路径统一管理（`_paths.py`）** —— 所有路径变量（技能目录、数据目录、仓库路径、临时目录等）在 `scripts/_paths.py` 统一定义，其他脚本一律 `from _paths import ...` 引用，不各自写死；仓库路径由 `config.json` 的 `repos` 注册表配置，`get_work_repo(type)` 动态解析\r\n- **路径由 manifest 统一管理** —— 每个条目记录 `source_path`（源路径）+ `repo_path`（仓库内路径），skill 和 agent 统一走同一套逻辑\r\n- **`all`"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn75zfd51df61ajdyqtgvrs1hx84s4q6\",\n  \"slug\": \"git-sync\",\n  \"version\": \"2.48.0\",\n  \"publishedAt\": 1791038727391\n}"},{"path":"references/antipatterns.md","content":"# git-sync 反模式\r\n\r\n常见错误和注意事项，避免误用本技能。\r\n\r\n## 反模式列表\r\n\r\n### 1. 盲目全量同步\r\n\r\n**错误做法：**用户只是提了一下某个 skill，就自动触发全量同步。\r\n\r\n**正确做法：**除非用户明确说\"全量维护\"/\"同步所有\"，否则只同步指定的 skill。\r\n\r\n### 2. 忽略敏感信息扫描\r\n\r\n**错误做法：**跳过敏感信息扫描，直接同步推送。\r\n\r\n**正确做法：**同步前必须运行敏感信息扫描，防止 Token/邮箱/路径泄露。\r\n\r\n### 3. 版本号不一致\r\n\r\n**错误做法：**`_meta.json`、SKILL.md frontmatter、`references/changelog.md` 三端版本号不一致（漏改任何一端会导致 SkillHub 拒绝发布或版本混乱）。\r\n\r\n**正确做法：**三端版本号必须一致（`_meta.json` 为唯一源，bump 顺序：先改 `_meta.json` → SKILL.md version 行 → changelog 加条目），每次更新时同步更新。\r\n\r\n### 4. 跳过规范审查\r\n\r\n**错误做法：**同步前不检查 R-01~R-26 合规性。\r\n\r\n**正确做法：**同步前自动检查 R-01~R-26 合规性，虽然不阻断同步，但应关注警告。\r\n\r\n### 5. 忘记更新 manifest.json\r\n\r\n**错误做法：**同步后不更新清单状态标记。\r\n\r\n**正确做法：**同步后必须更新清单状态标记，保持三单一致。"},{"path":"references/blueprint_rules.md","content":"# 蓝皮书判断规则\n\n## 筛除原则\n\n你需要从 blueprint.json 的 `files` 和 `tree` 中筛选出哪些内容**不应**进入公开仓库。\n\n### 必须保留（核心功能）\n\n技能的功能性文件：用户安装该技能后，SKILL.md 中引用的脚本、文档、配置文件、资源文件等直接参与功能实现的文件。\n\n包括但不限于：\n- `scripts/`、`references/`、`assets/` 等目录下的文件\n- `SKILL.md`、`_meta.json` 等技能元数据文件\n- 技能运行所依赖的配置文件（需脱敏后保留）\n\n### 必须筛除（非核心）\n\n任何**不直接影响技能核心功能运行**的内容都应筛除：\n\n- **工作区临时文件**：AI 工作目录产生的缓存、日志、临时数据\n- **编译/构建产物**：`__pycache__/`、`build/`、`dist/`、`*.pyc`、`*.pyo`\n- **IDE/编辑器配置**：`.vscode/`、`.idea/` 等仅服务于开发环境的目录\n- **系统元数据**：`.DS_Store`、`Thumbs.db`\n- **非技能标准目录**：不属于技能规范定义的目录结构\n\n注意：隐藏目录（以 `.` 开头）**不自动等于应筛除**。比如 `.github/` 如果是 CI 配置则应保留。判断依据是\"是否为核心功能所需\"，而非\"是否隐藏\"。\n\n### 判定流程\n\n1. 读 blueprint.json 的 `tree`，标记每个目录为\"保留\"或\"筛除\"\n2. 对\"保留\"目录下的 `files`，逐项复核：\n   - 文件是否被 SKILL.md 直接或间接引用 → 保留\n   - 文件是否为标准技能结构的一部分（scripts/、references/）→ 保留\n   - 文件是否明显为临时/缓存/构建产物 → 筛除\n3. 输出 `exclude_list.json`：{ \"type\": \"dir\" | \"file\", \"path\": \"相对路径\" }\n\n---\n\n## 脱敏原则\n\n对于需要保留的文件，逐项判断 blueprint.json `samples` 中的内容是否需要脱敏。\n\n### 必须脱敏\n\n以下内容必须脱敏：\n\n- **个人真实信息**：真实姓名（非笔名/代名）、身份证号、手机号、银行卡号\n- **凭据**：API Token、密码、密钥、私钥\n- **本地路径**：包含用户名或机器名的绝对路径（如 `C:\\Users\\实际用户名\\`、`/home/实际用户名/`）\n- **联系信息**：个人邮箱地址（非公开业务邮箱）\n- **内网地址**：内网 IP、内网域名、私有仓库地址\n\n### 不应脱敏\n\n功能性内容：\n\n- **代名/署名**：技能的公共作者名（如 `[username-redacted]`、`[username-redacted]`）\n- **公开仓库地址**：GitHub/Gitee 等公开平台的仓库链接\n- **配置模板示例**：`api_key = \"your-api-key\"` 这种明显是模板的\n- **技术内容**：代码逻辑、函数调用、数据结构定义\n- **版本号/依赖名**：pip 包名、npm 包名、版本号\n\n### 脱敏方式\n\n- **路径**：只替换\"标识用户/机器身份的前缀\"，保留功能后缀\n  - `C:\\Users\\USERNAME\\skills\\novel-weaver\\...` → `[LOCAL_PATH]\\skills\\novel-weaver\\...`\n- **凭据**：替换为 `[REDACTED]`\n  - `token = \"abc123\"` → `token = \"[REDACTED]\"`\n- **邮箱**：替换为 `[EMAIL]`\n  - `[email-redacted]` → `[EMAIL]`\n- **真实姓名**：替换为 `[NAME]`\n  - 仅替换非笔名的真实姓名\n\n### 判定流程\n\n1. 遍历 blueprint.json `files[].samples`\n2. 逐条判断是否属于\"必须脱敏\"类别\n3. 是 → 记录到 `sanitize_list.json`：{ \"file\": \"相对路径\", \"line\": N, \"original\": \"原文\", \"replacement\": \"占位符\" }\n4. 否 → 跳过"},{"path":"references/changelog.md","content":"## [2.48.0] - 2026-10-03\n\n### 修复（GitHub Release 从未打上——token 来源只认 HTTPS URL 内嵌）\n\n- **现象**：maby_agent 双平台 tag 全部到位，但 GitHub Releases 页只有 v1.0.0/v1.3.0 两条旧记录，structured-writer v3.1.10-3.1.14 全系没有 GitHub Release；每次发布日志仅一行 \"tag 已推送\" warn。\n- **根因**：`step_release_create` 的 GitHub token 只从 `git remote get-url origin` 的 HTTPS 内嵌格式（`https://user:token@...`）解析；maby_agent 的 origin 为 SSH（`ssh://[email-redacted]:443`）→ token 恒空 → GitHub Release 分支静默跳过。Gitee 能打上仅因 gitee_token 独立存于 config。\n- **修复①（token 三级 fallback）**：`config.github_token` → `git credential fill`（credential.helper，SSH 远端下唯一可用）→ origin HTTPS URL 内嵌；三级全空才跳过。\n- **修复②（fail-loud）**：GitHub Release 创建失败打 `err` 并带 200 字符响应原文；`already_exists` 单独 info 分支；无 token 时 `err` 明确点名三级来源均未命中——不再一行 warn 静默带过。\n- **验证**：importlib 直调 `step_release_create('structured-writer','agent','3.1.14')`（tag 已存在）→ LOG_BUFFER 输出「GitHub Release 已存在」= token 解析 + API 调用 + 分支判定全链路通；v3.1.10-3.1.14 五个 Release 补发成功。\n\n## [2.47.0] - 2026-10-02\n\n### 修复（9 处隐患审查落地，P0 全修）\n\n- **同步保险丝（P0①，structured-writer 3.1.10 删库事故根因）**：`sync_files` 清空目标目录前先计算 allow 集合与源树的交集，零交集（allow 为空/格式错/路径全部无效）→ `SystemExit(2)` 拒绝 `rmtree`——工作仓不再可能被空同步整目录删除后推送到双平台。\n- **陈旧决策守卫（P0②，静默漏脱敏洞）**：脱敏决策消费前校验——决策必须覆盖本次扫描发现的全部文件、值必须为 keep/sanitize/custom；不满足（陈旧/损坏/覆盖不全）→ 清除决策文件并重新让位，绝不静默应用。此前 `cmd_apply` 遍历 decisions 而非 findings，扫描新增的敏感文件会被静默放过直接上公共仓。实证：TEMP 中 svg-composer 决策文件滞留 61 天仍会被消费。\n- **决策值非法 fail-closed（P0②配套）**：`cmd_apply` 遇到非 keep/sanitize/custom 的决策值 → 打印错误并 `sys.exit(2)`，不再静默跳过且不计入审计统计。\n- **扫描详情显示命中原文（P0③，wUwproject 公开署名误脱敏根因）**：决策详情两处（消费分支与让位引导）均打印 `match` 实际命中文本（截断 40 字符）——决策者不再需要猜测\"用户名\"到底是本地账户（sm001，应脱敏）还是公开署名（wUwproject，应保留）。\n- **上传错误信息修复（P0④）**：PyPI/ClawHub/SkillHub 失败信息改为 `(stdout+stderr)` 合并取尾部——twine 的报错走 stdout，此前 `stderr[:200]` 恒为空（structured-writer 3.1.10 的 400 file-name-reuse 错误只能手动 verbose 才能拿到）。\n- **包目录检测 fail-closed（P0⑤）**：删除 `pkg_dir = pkg_dir or \"rag_assistant\"` 硬编码回退与候选列表中的 rag_assistant 首位——build 目录中找不到含 `__init__.py` 的包目录即报错终止，不再对非 rag-assistant 项目伪造错误包名。\n- **无变更不再假失败（P2⑥）**：无变更可提交时返回 `(True, True)`，manifest 正确记为已上传，summary 不再显示\"推送失败\"假象。\n- **agent 审计结论去误导（P2⑧）**：agent 无 SKILL.md 时审计结论显示\"跳过（agent 无 SKILL.md，SKILL.md 审计不适用）\"，不再显示\"未执行或执行失败\"。\n\n### 回归（真实目录/子进程实测）\n\n- 保险丝：空 allow → SystemExit(2) 且目标目录完好 / 正常 allow 只复制允许文件 / 零交集拦截，3 用例 PASS。\n- apply：非法决策值(123) → rc=2 报错 / 合法 sanitize → rc=0 内容替换，2 用例 PASS。\n- scan：输出含 match 原文 PASS（example.com 空 result 为 RFC 2606 保留域名有意豁免，非漏报）。\n\n### 架构修复：PyPI 作者元数据去硬编码（v2.47.0 折进）\n\n- **根因**：setup.py 模板硬编码作者名与邮箱（工具作者的个人信息写死在源码里）——工具源码要上公共仓与源码含个人信息天生冲突（脱敏强制 vs 发布元数据），且对第三方用户而言发布的 wheel 里填的是别人的作者。\n- **修复**：作者身份属于被发布项目而非发布工具。模板改占位符，构建时按优先级注入：被发布项目 pyproject.toml 的 `[project].authors`（PEP 621，项目权威源，读 src_dir——build_dir 的 pyproject 随后被覆盖为 build-system-only）→ config.json 的 author/email（本地用户配置，与 git commit 同一字段，单一来源）→ 空串（PyPI 合法）。\n- 工具源码从此零个人信息：脱敏扫描不再命中 git-sync.py，自推送不再被硬约束拦截。\n\n### 清理\n\n- TEMP 陈旧决策/扫描残留：svg-composer 决策（61 天）、podcast-maker 决策 .bak（12 天）、manual_scan×2（63 天）、_preview_scan（12 天）。\n\n## [2.46.2] - 2026-09-17\n\n### 修复\n\n- **a"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"全平台统一发布工具。支持 skills 和 agents 的 Gitee/GitHub/ClawHub/SkillHub/PyPI 同步与 Release 创建，LLM 驱动的文件过滤与脱敏。 Skill: git-sync Owner: ldxs001 Summary: 全平台统一发布工具。支持 skills 和 agents 的 Gitee/GitHub/ClawHub/SkillHub/PyPI 同步与 Release 创建，LLM 驱动的文件过滤与脱敏。 Tags: deploy:2.48.0, git:2.48.0, gitee:2.48.0, github:2.48.0, latest:2.48.0, publish:2.42.0, skill:2.42.0, sync:2.48.0, workflow:2.24.0 Version history: v2.48.0 | 2026-10-03T14:45:27.391Z | user v2.48.0 v2.47.0 | 2026-10-02T16:11:01.941Z | user v2.47.0 v2.45.8 | 2026-08-26T05:12:46.","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":1050,"uniquenessScore":48,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-09T05:01:36.015Z","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-09T05:01:36.015Z","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-09T20:25:59.049Z","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"}]}}}