Skip to content

Commit e150325

Browse files
committed
Squashed 'astrbot-sdk/' changes from b817715b9..378257db7
378257db7 chore: refresh vendor snapshot [skip ci] f8dab1de5 Merge pull request #100 from united-pooh:dev 5492735cd feat: 添加 repo 字段到插件元数据,增强插件信息的完整性 REVERT: b817715b9 chore: refresh vendor snapshot [skip ci] git-subtree-dir: astrbot-sdk git-subtree-split: 378257db7da5e75fb99449ab1266f33e101a6922
1 parent 6436e4b commit e150325

6 files changed

Lines changed: 48 additions & 7 deletions

File tree

src/astrbot_sdk/cli.py

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -678,6 +678,7 @@ def _render_init_plugin_yaml(
678678
display_name: str,
679679
desc: str,
680680
author: str,
681+
repo: str,
681682
version: str,
682683
) -> str:
683684
python_version = f"{sys.version_info.major}.{sys.version_info.minor}"
@@ -688,6 +689,7 @@ def _render_init_plugin_yaml(
688689
display_name: {display_name}
689690
desc: {desc}
690691
author: {author}
692+
repo: {repo}
691693
version: {version}
692694
runtime:
693695
python: "{python_version}"
@@ -968,19 +970,21 @@ def _prompt_nonempty_text(prompt: str) -> str:
968970
click.echo("该字段不能为空,请重新输入。")
969971

970972

971-
def _collect_init_metadata(name: str | None) -> tuple[str, str, str, str]:
972-
if name is not None:
973-
return name, "", "", "1.0.0"
973+
def _default_init_repo_name(plugin_name: str) -> str:
974+
return _normalize_plugin_name(plugin_name)
974975

975-
plugin_name = _prompt_nonempty_text("插件名字")
976-
author = click.prompt("作者", type=str, default="", show_default=False).strip()
976+
977+
def _collect_init_metadata(name: str | None) -> tuple[str, str, str, str, str]:
978+
plugin_name = name if name is not None else _prompt_nonempty_text("插件名字")
979+
author = _prompt_nonempty_text("作者")
980+
repo = _default_init_repo_name(plugin_name)
977981
desc = click.prompt("描述", type=str, default="", show_default=False).strip()
978982
version = click.prompt("版本", type=str, default="1.0.0", show_default=True).strip()
979-
return plugin_name, author, desc, version or "1.0.0"
983+
return plugin_name, author, repo, desc, version or "1.0.0"
980984

981985

982986
def _init_plugin(name: str | None, agents: tuple[str, ...] = ()) -> None:
983-
raw_name, author, desc, version = _collect_init_metadata(name)
987+
raw_name, author, repo, desc, version = _collect_init_metadata(name)
984988
plugin_name = _normalize_plugin_name(raw_name)
985989
target_dir = Path(plugin_name)
986990
if target_dir.exists():
@@ -995,6 +999,7 @@ def _init_plugin(name: str | None, agents: tuple[str, ...] = ()) -> None:
995999
display_name=display_name,
9961000
desc=desc,
9971001
author=author,
1002+
repo=repo,
9981003
version=version,
9991004
),
10001005
encoding="utf-8",

src/astrbot_sdk/clients/metadata.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ class StarMetadata:
2626
name: str
2727
display_name: str
2828
description: str
29+
repo: str
2930
author: str
3031
version: str
3132
enabled: bool = True
@@ -44,6 +45,7 @@ def from_dict(cls, data: dict[str, Any]) -> StarMetadata:
4445
name=str(data.get("name", "")),
4546
display_name=str(data.get("display_name", data.get("name", ""))),
4647
description=str(data.get("desc", data.get("description", ""))),
48+
repo=str(data.get("repo", "")),
4749
author=str(data.get("author", "")),
4850
version=str(data.get("version", "0.0.0")),
4951
enabled=bool(data.get("enabled", True)),

src/astrbot_sdk/runtime/capability_router.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -337,6 +337,7 @@ def upsert_plugin(
337337
normalized_metadata = dict(metadata)
338338
normalized_metadata.setdefault("display_name", name)
339339
normalized_metadata.setdefault("description", "")
340+
normalized_metadata.setdefault("repo", "")
340341
normalized_metadata.setdefault("author", "")
341342
normalized_metadata.setdefault("version", "0.0.0")
342343
normalized_metadata.setdefault("enabled", True)

src/astrbot_sdk/runtime/loader.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
plugin.yaml 格式:
3636
name: my_plugin
3737
author: author_name
38+
repo: my_plugin
3839
desc: Plugin description
3940
version: 1.0.0
4041
runtime:
@@ -112,12 +113,29 @@
112113
DiscoverySeverity: TypeAlias = Literal["warning", "error"]
113114
DiscoveryPhase: TypeAlias = Literal["discovery", "load", "lifecycle", "reload"]
114115
_LOGGER = logging.getLogger(__name__)
116+
_GITHUB_REPO_NAME_RE = re.compile(r"^[A-Za-z0-9_.-]+$")
117+
_GITHUB_REPO_SLUG_RE = re.compile(r"^[A-Za-z0-9_.-]+/[A-Za-z0-9_.-]+$")
118+
_GITHUB_REPO_URL_RE = re.compile(
119+
r"^https://github\.com/[A-Za-z0-9_.-]+/[A-Za-z0-9_.-]+/?$",
120+
re.IGNORECASE,
121+
)
115122

116123

117124
def _default_python_version() -> str:
118125
return f"{sys.version_info.major}.{sys.version_info.minor}"
119126

120127

128+
def _is_valid_github_repo_ref(value: str) -> bool:
129+
normalized = value.strip()
130+
if not normalized:
131+
return False
132+
return bool(
133+
_GITHUB_REPO_NAME_RE.fullmatch(normalized)
134+
or _GITHUB_REPO_SLUG_RE.fullmatch(normalized)
135+
or _GITHUB_REPO_URL_RE.fullmatch(normalized)
136+
)
137+
138+
121139
def _venv_python_path(venv_dir: Path) -> Path:
122140
if os.name == "nt":
123141
return venv_dir / "Scripts" / "python.exe"
@@ -709,6 +727,19 @@ def validate_plugin_spec(plugin: PluginSpec) -> None:
709727
if not isinstance(raw_python, str) or not raw_python:
710728
raise ValueError(f"{manifest_label} 缺少 runtime.python。")
711729

730+
raw_author = manifest_data.get("author")
731+
if not isinstance(raw_author, str) or not raw_author.strip():
732+
raise ValueError(f"{manifest_label} 缺少 author。")
733+
734+
raw_repo = manifest_data.get("repo")
735+
if not isinstance(raw_repo, str) or not raw_repo.strip():
736+
raise ValueError(f"{manifest_label} 缺少 repo。")
737+
if not _is_valid_github_repo_ref(raw_repo):
738+
raise ValueError(
739+
f"{manifest_label} 的 repo 不合法:"
740+
"请填写 GitHub 仓库名(repo)、owner/repo,或 https://github.com/owner/repo。"
741+
)
742+
712743
components = manifest_data.get("components")
713744
if not isinstance(components, list):
714745
raise ValueError(f"{manifest_label} 的 components 必须是数组。")

src/astrbot_sdk/runtime/supervisor.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -462,6 +462,7 @@ def _publish_plugin_registry_snapshot(
462462
"description": str(
463463
manifest.get("desc") or manifest.get("description") or ""
464464
),
465+
"repo": str(manifest.get("repo") or ""),
465466
"author": str(manifest.get("author") or ""),
466467
"version": str(manifest.get("version") or "0.0.0"),
467468
"enabled": plugin.name in enabled_plugins,

src/astrbot_sdk/testing.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ def _plugin_metadata_from_spec(
8787
"name": plugin.name,
8888
"display_name": str(manifest.get("display_name") or plugin.name),
8989
"description": str(manifest.get("desc") or manifest.get("description") or ""),
90+
"repo": str(manifest.get("repo") or ""),
9091
"author": str(manifest.get("author") or ""),
9192
"version": str(manifest.get("version") or "0.0.0"),
9293
"enabled": enabled,

0 commit comments

Comments
 (0)