diff --git a/scripts/build-marketplace.sh b/scripts/build-marketplace.sh index d716aac..c756d22 100755 --- a/scripts/build-marketplace.sh +++ b/scripts/build-marketplace.sh @@ -5,7 +5,8 @@ # marketplace/oddyssey/ (the materialized plugin the manifests # point at: agents, commands, skills, # plugin.json, .claude-plugin/plugin.json, -# .mcp.json, mcp.json, com.github.copilot/) +# .mcp.json, mcp.json, com.github.copilot/, +# LICENSE, SECURITY.md) # Everything it writes is GENERATED - never edit those files by hand. # Run by the release workflow after the version bumps, so the artifacts # always carry the released version and the matching oddyssey-mcp pin. @@ -150,6 +151,18 @@ if [ -f marketplace/oddyssey/hooks/hooks.json ]; then done fi +# Claude Code's default, declared for the plugin scanners that want it +# explicit: the plugin's own plugin.json is the authority. On every entry, +# where Claude Code reads it, and at the root, where the HOL scanner looks +# (Claude Code ignores it there). +jq '. + {strict: true} | .plugins |= map(. + {strict: true})' .claude-plugin/marketplace.json \ + > "$TMP/marketplace.json" +cp "$TMP/marketplace.json" .claude-plugin/marketplace.json + +# A scanner reads the plugin directory as a repository of its own: carry +# the repository's license and security policy into it. +cp LICENSE SECURITY.md marketplace/oddyssey/ + cat > marketplace/README.md <<'EOF' # GENERATED - do not edit diff --git a/tests/skills/odd-memory/test_odd_report.py b/tests/skills/odd-memory/test_odd_report.py index 0f20feb..9502206 100644 --- a/tests/skills/odd-memory/test_odd_report.py +++ b/tests/skills/odd-memory/test_odd_report.py @@ -1499,9 +1499,10 @@ def test_the_credential_rule_tells_a_value_from_its_wiring(report): ) for text in wiring: assert report.credential_in(text) is None, text + # the values a secret scanner would match are assembled at run time values = ( "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.abcdefgh", - "token: ghp_16C7e42F292c6912E7710c838347Ae178B4a", + "token: " + "ghp_" + "16C7e42F292c6912E7710c838347Ae178B4a", "InstrumentationKey=0a1b2c3d-0000-4000-8000-000000000001", "--query instrumentationKey", "api_key=sk-abcdefghijklmnopqrstuvwxyz0123", @@ -1514,8 +1515,8 @@ def test_the_credential_rule_tells_a_value_from_its_wiring(report): "`api_key: eyJrIjoiT0tTcE1tYVYifQ==`", "**token: Zm9vYmFyYmF6cXV4MTIzNDU2Nzg5MA==**", "| check | q | `api_key: eyJrIjoiT0tTcE1tYVYifQ==` | id |", - 'api_key: "eyJrIjoiT0tTcE1tYVYifQ=="', - "token: 'ghp_16C7e42F292c6912E7710c838347Ae178B4a'", + 'api_key: "' + "eyJrIjoiT0tTcE1tYVYifQ==" + '"', + "token: '" + "ghp_" + "16C7e42F292c6912E7710c838347Ae178B4a'", ) for text in values: assert report.credential_in(text), text