diff --git a/README.md b/README.md index 3d79a32..1d1c7f3 100644 --- a/README.md +++ b/README.md @@ -1,38 +1,23 @@ -# Claw 技能项目模板(通用) +# 头条号批量发布(toutiao-publisher) -本目录是一个**与具体业务无关**的技能(Skill)工程骨架,供团队在各类 **Claw / Agent 宿主**(桌面端、网关、IDE 插件等)上交付可安装技能包时参考。 - -## 你从这里能得到什么 - -- **行业标准对齐**:技能以「清单文件 + 可执行入口 + 文档」组织——与常见的 Agent Skill、CLI 工具包、内部自动化脚本仓库的惯例一致;不绑定某一厂商私有协议。 -- **可移植约定**:数据目录、用户隔离、兄弟技能路径等通过**环境变量契约**描述(见 `docs/RUNTIME.md`);不同宿主只需注入同名变量或做一层别名映射。 -- **低学习成本**:每个文件顶部与关键步骤都有注释;按下面顺序做即可跑通第一个命令。 - -## 建议的上手顺序(约 15~30 分钟) - -1. **复制本模板**为新仓库或新目录,全局把占位符 `your-skill-slug` / `Your Skill Display Name` 换成你的技能标识(与 `SKILL.md` 里 `metadata.skill.slug` 一致)。 -2. **阅读** `docs/RUNTIME.md`,确认你的宿主会注入哪些环境变量;若宿主使用另一套名字,在宿主侧做映射,或改 `optional/paths_snippet.py` 中的读取顺序(文件内有说明)。 -3. **本地试跑**:`python scripts/skill_main.py health` 应输出成功信息。 -4. **扩展子命令**:在 `scripts/skill_main.py` 的 `dispatch` 中增加分支;业务逻辑放在同目录其它模块或子包中,保持入口轻薄。 -5. **编写/调整 `SKILL.md`**:只改「何时触发、如何调用、参数含义」,不要写实现细节;实现细节放在 `docs/` 或代码注释里。 -6. **发布**:若使用 GitHub Actions,编辑 `.github/workflows/release_skill.yaml`,把 `uses:` 指向**你们组织**的复用工作流;若不用 CI,可删除该目录。 +基于团队 **skill-template** 骨架的头条号发布技能仓库;当前为**占位阶段**,仅含 CLI 骨架与文档,**发布功能待后续迭代**。 ## 目录一览 | 路径 | 作用 | |------|------| -| `SKILL.md` | 技能清单(YAML 头 + Markdown 正文),供宿主与协作者阅读 | -| `scripts/skill_main.py` | 推荐唯一 CLI 入口;含 `health` / `version` 示例 | -| `docs/RUNTIME.md` | 环境与目录契约(多宿主通用) | -| `docs/SKILL_TYPES.md` | 常见技能形态与自检清单 | -| `docs/PORTABILITY.md` | 多 Claw 宿主差异与兼容建议 | -| `optional/` | 可选复制进项目的片段(路径、SQLite 示例),**不默认 import** | +| `SKILL.md` | 技能清单(YAML 头 + Markdown 正文) | +| `scripts/skill_main.py` | CLI 入口:`health` / `version` | +| `docs/` | 运行时与可移植性说明 | +| `optional/` | 可选片段(路径、SQLite 等),默认不引用 | -## 不要做的事 +## 本地试跑 -- 不要在模板中提交真实密钥、真实业务表结构或平台专用逻辑。 -- 不要把模板改成只支持某一种宿主;特殊项写在 `docs/PORTABILITY.md` 的「宿主附录」中。 +```bash +python scripts/skill_main.py health +python scripts/skill_main.py version +``` ## 版本 -模板自身版本见 `SKILL.md` 的 `version` 字段;与你技能的业务版本一致更新即可。 +与 `SKILL.md` 中 `version` 字段对齐更新。 diff --git a/SKILL.md b/SKILL.md index d144e7b..311a857 100644 --- a/SKILL.md +++ b/SKILL.md @@ -1,37 +1,33 @@ --- # --------------------------------------------------------------------------- # 技能清单(Skill Manifest) -# 行业常见做法:YAML 头描述元数据,正文 Markdown 描述「何时用、怎么调」。 -# 不同 Claw 宿主解析字段可能略有差异;可移植标识请使用 metadata.skill.slug。 # --------------------------------------------------------------------------- -name: 您的技能显示名称 -description: 一句话说明技能做什么(给编排层与人类阅读,不写实现细节)。 -version: 1.0.0 +name: 头条号批量发布 +description: 头条号批量发布技能(骨架阶段:仅健康检查与版本;发布逻辑待实现)。 +version: 0.1.0 author: 深圳匠厂科技有限公司 metadata: + openclaw: + slug: toutiao-publisher + emoji: "📰" + category: "内容发布" skill: - # 机器可读、稳定标识:小写字母、数字、短横线;与数据子目录名一致。 - slug: your-skill-slug - emoji: "📦" - category: "通用" -# 宿主若限制可调用的工具类型,在此列出(按宿主文档填写)。 + slug: toutiao-publisher + emoji: "📰" + category: "内容发布" allowed-tools: - bash --- -# Your Skill Display Name +# 头条号批量发布(toutiao-publisher) ## 使用时机 - - -- 示例:用户说「检查技能是否可用」「运行某某任务」 +- 用户需要**在头条号侧批量或自动化发布内容**时(具体话术与流程待业务实现后补充)。 ## 执行步骤 - - -### 健康检查(推荐自动化先跑) +### 健康检查 ```bash python3 {baseDir}/scripts/skill_main.py health @@ -43,9 +39,9 @@ python3 {baseDir}/scripts/skill_main.py health python3 {baseDir}/scripts/skill_main.py version ``` -### 扩展子命令 +### 发布与其它子命令 -在 `scripts/skill_main.py` 中增加新的子命令分支,并在此处追加对应示例命令与参数说明。 +实现中:后续将在 `scripts/` 下增加发布入口,并在此文档补充命令与参数说明。 ## 环境依赖 @@ -53,4 +49,4 @@ python3 {baseDir}/scripts/skill_main.py version ## 数据与隐私 -本技能若产生持久化数据,应仅写入 `{CLAW_DATA_ROOT}/{CLAW_USER_ID}/your-skill-slug/` 下;不得将用户数据提交到版本库。 +本技能若产生持久化数据,应仅写入 `{CLAW_DATA_ROOT}/{CLAW_USER_ID}/toutiao-publisher/` 下;不得将用户数据提交到版本库。 diff --git a/optional/README.md b/optional/README.md index 9432856..6b1dbb6 100644 --- a/optional/README.md +++ b/optional/README.md @@ -14,4 +14,4 @@ | `paths_snippet.py` | `CLAW_*` 数据目录解析与 fallback 说明 | | `sqlite_minimal.py` | 无业务含义的 SQLite 建表示例 | -复制后务必全局替换 `your-skill-slug` 与表名,避免与别的技能冲突。 +本技能数据子目录与 `SKILL_SLUG` 为 `toutiao-publisher`;若复制片段到其它项目请改为对应 slug 与表名。 diff --git a/optional/paths_snippet.py b/optional/paths_snippet.py index 21d3d96..3e275fc 100644 --- a/optional/paths_snippet.py +++ b/optional/paths_snippet.py @@ -26,7 +26,7 @@ import os import sys # TODO: 复制本文件后改为你的 slug(与 SKILL.md metadata.skill.slug 一致) -SKILL_SLUG = "your-skill-slug" +SKILL_SLUG = "toutiao-publisher" def _getenv_first(names: tuple[str, ...]) -> str: @@ -82,7 +82,7 @@ def get_skills_root() -> str: """ 可选:并列安装的多技能根目录。 未设置 CLAW_SKILLS_ROOT 时,默认使用本文件所在仓库的上一级目录的上一级 - (即:.../skill-template/scripts/ → 误推断;复制后请改为 BASE_DIR 逻辑)。 + (即:.../toutiao-publisher/optional/ → 仅作开发时并列技能推断参考)。 """ root = _getenv_first(("CLAW_SKILLS_ROOT",)) if root: diff --git a/release.ps1 b/release.ps1 new file mode 100644 index 0000000..639081a --- /dev/null +++ b/release.ps1 @@ -0,0 +1,23 @@ +[CmdletBinding()] +param( + [string]$Prefix = "v", + [string]$Message = "正式发布", + [switch]$AutoCommit, + [switch]$RequireClean, + [string]$CommitMessage, + [switch]$DryRun +) + +Set-StrictMode -Version Latest +$ErrorActionPreference = "Stop" + +$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path +$sharedScript = Join-Path $scriptDir "..\jiangchang-platform-kit\tools\release.ps1" +$sharedScript = [System.IO.Path]::GetFullPath($sharedScript) + +if (-not (Test-Path $sharedScript)) { + throw "Shared release script not found: $sharedScript" +} + +& $sharedScript @PSBoundParameters +exit $LASTEXITCODE diff --git a/scripts/skill_main.py b/scripts/skill_main.py index 93a70b4..a9281a9 100644 --- a/scripts/skill_main.py +++ b/scripts/skill_main.py @@ -28,8 +28,8 @@ import json import sys from typing import Callable, Dict, List, Optional -# 与 SKILL.md 中 metadata.skill.slug 保持一致(模板占位,复制后请修改) -SKILL_SLUG = "your-skill-slug" +# 与 SKILL.md 中 metadata.openclaw.slug / metadata.skill.slug 保持一致 +SKILL_SLUG = "toutiao-publisher" def cmd_version(_args: argparse.Namespace) -> int: @@ -58,7 +58,7 @@ def cmd_health(_args: argparse.Namespace) -> int: def build_parser() -> argparse.ArgumentParser: p = argparse.ArgumentParser( - description="Claw skill CLI template — replace SKILL_SLUG and add subcommands.", + description="toutiao-publisher — Toutiao batch publish skill CLI (skeleton).", ) sub = p.add_subparsers(dest="command", required=True)