mirror of
https://github.com/obra/superpowers.git
synced 2026-06-11 05:09:05 +08:00
87 lines
2.2 KiB
Bash
Executable File
87 lines
2.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
MANIFEST="$REPO_ROOT/.kimi-plugin/plugin.json"
|
|
|
|
python3 - "$MANIFEST" <<'PY'
|
|
import json
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
manifest_path = Path(sys.argv[1])
|
|
manifest = json.loads(manifest_path.read_text(encoding="utf-8"))
|
|
|
|
def assert_equal(actual, expected, label):
|
|
if actual != expected:
|
|
raise AssertionError(f"{label}: expected {expected!r}, got {actual!r}")
|
|
|
|
def assert_present(text, needle, label):
|
|
if needle not in text:
|
|
raise AssertionError(f"{label}: missing {needle!r}")
|
|
|
|
assert_equal(manifest.get("name"), "superpowers", "plugin name")
|
|
assert_equal(manifest.get("skills"), "./skills/", "skills path")
|
|
assert_equal(
|
|
manifest.get("sessionStart", {}).get("skill"),
|
|
"using-superpowers",
|
|
"sessionStart.skill",
|
|
)
|
|
|
|
instructions = manifest.get("skillInstructions")
|
|
if not isinstance(instructions, str) or not instructions.strip():
|
|
raise AssertionError("skillInstructions must be a non-empty string")
|
|
|
|
for token in [
|
|
"AskUserQuestion",
|
|
"TodoList",
|
|
"Agent",
|
|
"Skill",
|
|
"Read",
|
|
"Write",
|
|
"Edit",
|
|
"Bash",
|
|
"Grep",
|
|
"Glob",
|
|
"FetchURL",
|
|
"WebSearch",
|
|
]:
|
|
assert_present(instructions, token, "skillInstructions")
|
|
|
|
version_config = json.loads(
|
|
(manifest_path.parents[1] / ".version-bump.json").read_text(encoding="utf-8")
|
|
)
|
|
version_entries = version_config.get("files")
|
|
if not isinstance(version_entries, list):
|
|
raise AssertionError(".version-bump.json must contain files list")
|
|
|
|
if not any(
|
|
entry.get("path") == ".kimi-plugin/plugin.json" and entry.get("field") == "version"
|
|
for entry in version_entries
|
|
if isinstance(entry, dict)
|
|
):
|
|
raise AssertionError(
|
|
".version-bump.json must update .kimi-plugin/plugin.json version"
|
|
)
|
|
|
|
unsupported_fields = [
|
|
"tools",
|
|
"commands",
|
|
"hooks",
|
|
"apps",
|
|
"inject",
|
|
"configFile",
|
|
"config_file",
|
|
"bootstrap",
|
|
]
|
|
present_unsupported = sorted(field for field in unsupported_fields if field in manifest)
|
|
if present_unsupported:
|
|
raise AssertionError(
|
|
"unsupported Kimi runtime fields present: "
|
|
+ ", ".join(present_unsupported)
|
|
)
|
|
|
|
print("Kimi plugin manifest looks good")
|
|
PY
|