Loading...
Loading...
Compare original and translation side by side
clawsec-suiteclawsec-suiteadvisories/feed.jsonHEARTBEAT.mdhooks/clawsec-advisory-guardian/scripts/scripts/guarded_skill_install.mjsscripts/discover_skill_catalog.mjsadvisories/feed.jsonHEARTBEAT.mdhooks/clawsec-advisory-guardian/scripts/scripts/guarded_skill_install.mjsscripts/discover_skill_catalog.mjsclawsec-suitehttps://clawsec.prompt.security/skills/index.jsonSUITE_DIR="${INSTALL_ROOT:-$HOME/.openclaw/skills}/clawsec-suite"
node "$SUITE_DIR/scripts/discover_skill_catalog.mjs"skill.jsonclawsec-suitehttps://clawsec.prompt.security/skills/index.jsonSUITE_DIR="${INSTALL_ROOT:-$HOME/.openclaw/skills}/clawsec-suite"
node "$SUITE_DIR/scripts/discover_skill_catalog.mjs"skill.jsonnpx clawhub@latest install clawsec-suitenpx clawhub@latest install clawsec-suiteset -euo pipefail
VERSION="${SKILL_VERSION:?Set SKILL_VERSION (e.g. 0.0.8)}"
INSTALL_ROOT="${INSTALL_ROOT:-$HOME/.openclaw/skills}"
DEST="$INSTALL_ROOT/clawsec-suite"
BASE="https://github.com/prompt-security/clawsec/releases/download/clawsec-suite-v${VERSION}"
TEMP_DIR="$(mktemp -d)"
trap 'rm -rf "$TEMP_DIR"' EXITset -euo pipefail
VERSION="${SKILL_VERSION:?Set SKILL_VERSION (e.g. 0.0.8)}"
INSTALL_ROOT="${INSTALL_ROOT:-$HOME/.openclaw/skills}"
DEST="$INSTALL_ROOT/clawsec-suite"
BASE="https://github.com/prompt-security/clawsec/releases/download/clawsec-suite-v${VERSION}"
TEMP_DIR="$(mktemp -d)"
trap 'rm -rf "$TEMP_DIR"' EXITundefinedundefinedSUITE_DIR="${INSTALL_ROOT:-$HOME/.openclaw/skills}/clawsec-suite"
node "$SUITE_DIR/scripts/setup_advisory_hook.mjs"6hSUITE_DIR="${INSTALL_ROOT:-$HOME/.openclaw/skills}/clawsec-suite"
node "$SUITE_DIR/scripts/setup_advisory_cron.mjs"agent:bootstrap/newcommand:newaffected/newSUITE_DIR="${INSTALL_ROOT:-$HOME/.openclaw/skills}/clawsec-suite"
node "$SUITE_DIR/scripts/setup_advisory_hook.mjs"SUITE_DIR="${INSTALL_ROOT:-$HOME/.openclaw/skills}/clawsec-suite"
node "$SUITE_DIR/scripts/setup_advisory_cron.mjs"agent:bootstrap/newcommand:newaffected/newSUITE_DIR="${INSTALL_ROOT:-$HOME/.openclaw/skills}/clawsec-suite"
node "$SUITE_DIR/scripts/guarded_skill_install.mjs" --skill helper-plus --version 1.0.1--version42--confirm-advisorynode "$SUITE_DIR/scripts/guarded_skill_install.mjs" --skill helper-plus --version 1.0.1 --confirm-advisorySUITE_DIR="${INSTALL_ROOT:-$HOME/.openclaw/skills}/clawsec-suite"
node "$SUITE_DIR/scripts/guarded_skill_install.mjs" --skill helper-plus --version 1.0.1--version42--confirm-advisorynode "$SUITE_DIR/scripts/guarded_skill_install.mjs" --skill helper-plus --version 1.0.1 --confirm-advisoryhttps://clawsec.prompt.security/advisories/feed.json${CLAWSEC_FEED_URL}.sigCLAWSEC_FEED_SIG_URLchecksums.jsonCLAWSEC_FEED_CHECKSUMS_URL~/.openclaw/skills/clawsec-suite/advisories/feed.json${CLAWSEC_LOCAL_FEED}.sigCLAWSEC_LOCAL_FEED_SIG~/.openclaw/skills/clawsec-suite/advisories/checksums.json~/.openclaw/skills/clawsec-suite/advisories/feed-signing-public.pemCLAWSEC_FEED_PUBLIC_KEY~/.openclaw/clawsec-suite-feed-state.jsonCLAWSEC_HOOK_INTERVAL_SECONDS300CLAWSEC_ALLOW_UNSIGNED_FEED=1https://clawsec.prompt.security/advisories/feed.json${CLAWSEC_FEED_URL}.sigCLAWSEC_FEED_SIG_URLchecksums.jsonCLAWSEC_FEED_CHECKSUMS_URL~/.openclaw/skills/clawsec-suite/advisories/feed.json${CLAWSEC_LOCAL_FEED}.sigCLAWSEC_LOCAL_FEED_SIG~/.openclaw/skills/clawsec-suite/advisories/checksums.json~/.openclaw/skills/clawsec-suite/advisories/feed-signing-public.pemCLAWSEC_FEED_PUBLIC_KEY~/.openclaw/clawsec-suite-feed-state.jsonCLAWSEC_HOOK_INTERVAL_SECONDS300CLAWSEC_ALLOW_UNSIGNED_FEED=1FEED_URL="${CLAWSEC_FEED_URL:-https://clawsec.prompt.security/advisories/feed.json}"
STATE_FILE="${CLAWSEC_SUITE_STATE_FILE:-$HOME/.openclaw/clawsec-suite-feed-state.json}"
TMP="$(mktemp -d)"
trap 'rm -rf "$TMP"' EXIT
if ! curl -fsSLo "$TMP/feed.json" "$FEED_URL"; then
echo "ERROR: Failed to fetch advisory feed"
exit 1
fi
if ! jq -e '.version and (.advisories | type == "array")' "$TMP/feed.json" >/dev/null; then
echo "ERROR: Invalid advisory feed format"
exit 1
fi
mkdir -p "$(dirname "$STATE_FILE")"
if [ ! -f "$STATE_FILE" ]; then
echo '{"schema_version":"1.0","known_advisories":[],"last_feed_check":null,"last_feed_updated":null}' > "$STATE_FILE"
chmod 600 "$STATE_FILE"
fi
NEW_IDS_FILE="$TMP/new_ids.txt"
jq -r --argfile state "$STATE_FILE" '($state.known_advisories // []) as $known | [.advisories[]?.id | select(. != null and ($known | index(.) | not))] | .[]?' "$TMP/feed.json" > "$NEW_IDS_FILE"
if [ -s "$NEW_IDS_FILE" ]; then
echo "New advisories detected:"
while IFS= read -r id; do
[ -z "$id" ] && continue
jq -r --arg id "$id" '.advisories[] | select(.id == $id) | "- [\(.severity | ascii_upcase)] \(.id): \(.title)"' "$TMP/feed.json"
done < "$NEW_IDS_FILE"
else
echo "FEED_OK - no new advisories"
fiFEED_URL="${CLAWSEC_FEED_URL:-https://clawsec.prompt.security/advisories/feed.json}"
STATE_FILE="${CLAWSEC_SUITE_STATE_FILE:-$HOME/.openclaw/clawsec-suite-feed-state.json}"
TMP="$(mktemp -d)"
trap 'rm -rf "$TMP"' EXIT
if ! curl -fsSLo "$TMP/feed.json" "$FEED_URL"; then
echo "ERROR: Failed to fetch advisory feed"
exit 1
fi
if ! jq -e '.version and (.advisories | type == "array")' "$TMP/feed.json" >/dev/null; then
echo "ERROR: Invalid advisory feed format"
exit 1
fi
mkdir -p "$(dirname "$STATE_FILE")"
if [ ! -f "$STATE_FILE" ]; then
echo '{"schema_version":"1.0","known_advisories":[],"last_feed_check":null,"last_feed_updated":null}' > "$STATE_FILE"
chmod 600 "$STATE_FILE"
fi
NEW_IDS_FILE="$TMP/new_ids.txt"
jq -r --argfile state "$STATE_FILE" '($state.known_advisories // []) as $known | [.advisories[]?.id | select(. != null and ($known | index(.) | not))] | .[]?' "$TMP/feed.json" > "$NEW_IDS_FILE"
if [ -s "$NEW_IDS_FILE" ]; then
echo "New advisories detected:"
while IFS= read -r id; do
[ -z "$id" ] && continue
jq -r --arg id "$id" '.advisories[] | select(.id == $id) | "- [\(.severity | ascii_upcase)] \(.id): \(.title)"' "$TMP/feed.json"
done < "$NEW_IDS_FILE"
else
echo "FEED_OK - no new advisories"
fiskills/clawsec-suite/HEARTBEAT.mdskills/clawsec-suite/HEARTBEAT.md"enabledFor""advisory"enabledFor"advisory""enabledFor""advisory"enabledFor"advisory"--config <path>OPENCLAW_AUDIT_CONFIG~/.openclaw/security-audit.json.clawsec/allowlist.json--config <path>OPENCLAW_AUDIT_CONFIG~/.openclaw/security-audit.json.clawsec/allowlist.json{
"enabledFor": ["advisory"],
"suppressions": [
{
"checkId": "CVE-2026-25593",
"skill": "clawsec-suite",
"reason": "First-party security tooling — reviewed by security team",
"suppressedAt": "2026-02-15"
},
{
"checkId": "CLAW-2026-0001",
"skill": "example-skill",
"reason": "Advisory does not apply to our deployment configuration",
"suppressedAt": "2026-02-16"
}
]
}{
"enabledFor": ["advisory"],
"suppressions": [
{
"checkId": "CVE-2026-25593",
"skill": "clawsec-suite",
"reason": "内部安全工具 — 已通过安全团队审核",
"suppressedAt": "2026-02-15"
},
{
"checkId": "CLAW-2026-0001",
"skill": "example-skill",
"reason": "该咨询不适用于我们的部署配置",
"suppressedAt": "2026-02-16"
}
]
}"enabledFor": ["advisory"]"enabledFor": ["audit"]"enabledFor": ["audit", "advisory"]enabledFor"enabledFor": ["advisory"]"enabledFor": ["audit"]"enabledFor": ["audit", "advisory"]enabledForCVE-2026-25593CLAW-2026-0001CVE-2026-25593CLAW-2026-0001| Field | Description | Example |
|---|---|---|
| Advisory ID to suppress | |
| Affected skill name | |
| Justification for audit trail (required) | |
| ISO 8601 date (YYYY-MM-DD) | |
| 字段 | 描述 | 示例 |
|---|---|---|
| 需抑制的咨询ID | |
| 受影响的Skill名称 | |
| 审计跟踪所需的理由(必填) | |
| ISO 8601格式日期(YYYY-MM-DD) | |
enabledFor{
"enabledFor": ["audit", "advisory"],
"suppressions": [
{
"checkId": "skills.code_safety",
"skill": "clawsec-suite",
"reason": "First-party tooling — audit finding accepted",
"suppressedAt": "2026-02-15"
},
{
"checkId": "CVE-2026-25593",
"skill": "clawsec-suite",
"reason": "First-party tooling — advisory reviewed",
"suppressedAt": "2026-02-15"
}
]
}skills.code_safetyCVE-2026-25593CLAW-2026-0001enabledFor{
"enabledFor": ["audit", "advisory"],
"suppressions": [
{
"checkId": "skills.code_safety",
"skill": "clawsec-suite",
"reason": "内部工具 — 接受审计发现",
"suppressedAt": "2026-02-15"
},
{
"checkId": "CVE-2026-25593",
"skill": "clawsec-suite",
"reason": "内部工具 — 已审核咨询",
"suppressedAt": "2026-02-15"
}
]
}skills.code_safetyCVE-2026-25593CLAW-2026-0001SUITE_DIR="${INSTALL_ROOT:-$HOME/.openclaw/skills}/clawsec-suite"
node "$SUITE_DIR/scripts/discover_skill_catalog.mjs"SUITE_DIR="${INSTALL_ROOT:-$HOME/.openclaw/skills}/clawsec-suite"
node "$SUITE_DIR/scripts/discover_skill_catalog.mjs"
Machine-readable output is also available for automation:
```bash
node "$SUITE_DIR/scripts/discover_skill_catalog.mjs" --json
也支持机器可读格式的输出,用于自动化流程:
```bash
node "$SUITE_DIR/scripts/discover_skill_catalog.mjs" --jsonchecksums.jsonCLAWSEC_ALLOW_UNSIGNED_FEEDcriticalhighclawsec-feedchecksums.jsonCLAWSEC_ALLOW_UNSIGNED_FEEDcriticalhighclawsec-feed