{"data":{"skill":{"slug":"screenci-playwright-cli","name":"playwright-cli","icon":"📦","repo":"https://github.com/screenci/screenci/tree/main/skills/playwright-cli/","status":"approved","author":"screenci","authorVersion":null,"skillstoreRevision":null},"audit":{"id":"5e1cbe44-1e0b-42ee-a582-905f1a78af29","skill_id":"dd55b2f5-59a7-4f47-8456-e84f70b5cfc5","version":1,"content_hash":"df4e9b020e3df6934eed019ce7d24c82","risk_level":"medium","is_blocked":false,"safe_to_publish":true,"analysis_status":"ok","agent_auto_install_policy":"allowed","manual_install_policy":"allowed","summary":"Most static findings are Markdown inline code or fenced examples, not Ruby shell backtick execution or malicious networking. The main residual concern is the recommendation to globally install an unpinned npm package with @latest.","remediation":[{"issue":"Mutable global npm installation","severity":"medium","suggestion":"Pin a reviewed @playwright/cli version and prefer project-local installation over npm install -g. Require explicit user confirmation before installation."},{"issue":"Broad command examples in documentation","severity":"low","suggestion":"State that browser navigation, form submission, and package commands should run only after user approval and only against authorized sites."}],"risk_factor_evidence":[{"factor":"external_commands","evidence":[{"file":"SKILL.md","line_end":20,"line_start":20},{"file":"SKILL.md","line_end":21,"line_start":21},{"file":"SKILL.md","line_end":29,"line_start":29},{"file":"SKILL.md","line_end":30,"line_start":30},{"file":"SKILL.md","line_end":49,"line_start":38},{"file":"SKILL.md","line_end":53,"line_start":49},{"file":"SKILL.md","line_end":73,"line_start":53},{"file":"SKILL.md","line_end":77,"line_start":73},{"file":"SKILL.md","line_end":83,"line_start":77},{"file":"SKILL.md","line_end":89,"line_start":83},{"file":"SKILL.md","line_end":96,"line_start":89},{"file":"SKILL.md","line_end":100,"line_start":96},{"file":"SKILL.md","line_end":110,"line_start":100},{"file":"SKILL.md","line_end":112,"line_start":110},{"file":"SKILL.md","line_end":115,"line_start":112},{"file":"SKILL.md","line_end":120,"line_start":115},{"file":"SKILL.md","line_end":126,"line_start":120},{"file":"SKILL.md","line_end":132,"line_start":126},{"file":"SKILL.md","line_end":136,"line_start":132},{"file":"SKILL.md","line_end":145,"line_start":136},{"file":"SKILL.md","line_end":149,"line_start":145},{"file":"SKILL.md","line_end":158,"line_start":149},{"file":"SKILL.md","line_end":162,"line_start":158},{"file":"SKILL.md","line_end":164,"line_start":162},{"file":"SKILL.md","line_end":166,"line_start":164},{"file":"SKILL.md","line_end":170,"line_start":166},{"file":"SKILL.md","line_end":172,"line_start":170},{"file":"SKILL.md","line_end":176,"line_start":172},{"file":"SKILL.md","line_end":184,"line_start":176}]},{"factor":"network","evidence":[{"file":"SKILL.md","line_end":12,"line_start":12},{"file":"SKILL.md","line_end":42,"line_start":42},{"file":"SKILL.md","line_end":56,"line_start":56},{"file":"SKILL.md","line_end":57,"line_start":57},{"file":"SKILL.md","line_end":90,"line_start":90},{"file":"SKILL.md","line_end":92,"line_start":92},{"file":"SKILL.md","line_end":177,"line_start":177}]}],"critical_findings":[],"high_findings":[],"medium_findings":[{"title":"Mutable Global Package Installation","locations":[{"file":"SKILL.md","line_end":172,"line_start":168}],"confidence":0.86,"description":"The skill recommends installing @playwright/cli globally with the @latest tag. This fetches unpinned code and changes the host toolchain outside the project.","review_kind":"security","source_category":"semantic","source_severity":"medium","confidence_reasoning":"Line 171 contains a global npm install using @latest, which is a concrete supply-chain and environment mutation risk. The behavior is legitimate installation guidance, but it should be pinned and confirmed."}],"low_findings":[],"dangerous_patterns":[],"files_scanned":1,"total_lines":187,"audit_model":"codex","audited_at":"2026-07-05T11:03:56.564+00:00","created_at":"2026-07-05T13:56:12.510136+00:00","static_findings":[{"id":"external_commands:SKILL.md:20:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"Use `playwright-cli` to inspect a live page and discover the real flow, stable","category":"external_commands","line_end":20,"severity":"medium","line_start":20},{"id":"external_commands:SKILL.md:21:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"selectors, and cookie/consent steps before authoring a ScreenCI `.screenci.ts`","category":"external_commands","line_end":21,"severity":"medium","line_start":21},{"id":"external_commands:SKILL.md:29:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"`hide()` block, preferably a stable locator such as","category":"external_commands","line_end":29,"severity":"medium","line_start":29},{"id":"external_commands:SKILL.md:30:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"`getByRole('button', { name: /accept|accept all|allow all|agree|ok/i })`.","category":"external_commands","line_end":30,"severity":"medium","line_start":30},{"id":"external_commands:SKILL.md:38:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":49,"severity":"medium","line_start":38},{"id":"external_commands:SKILL.md:49:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":53,"severity":"medium","line_start":49},{"id":"external_commands:SKILL.md:53:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":73,"severity":"medium","line_start":53},{"id":"external_commands:SKILL.md:73:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":77,"severity":"medium","line_start":73},{"id":"external_commands:SKILL.md:77:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":83,"severity":"medium","line_start":77},{"id":"external_commands:SKILL.md:83:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":89,"severity":"medium","line_start":83},{"id":"external_commands:SKILL.md:89:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":96,"severity":"medium","line_start":89},{"id":"external_commands:SKILL.md:96:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":100,"severity":"medium","line_start":96},{"id":"external_commands:SKILL.md:100:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":110,"severity":"medium","line_start":100},{"id":"external_commands:SKILL.md:110:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":112,"severity":"medium","line_start":110},{"id":"external_commands:SKILL.md:112:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"The global `--raw` option strips page status and generated code, returning only","category":"external_commands","line_end":115,"severity":"medium","line_start":112},{"id":"external_commands:SKILL.md:115:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":120,"severity":"medium","line_start":115},{"id":"external_commands:SKILL.md:120:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":126,"severity":"medium","line_start":120},{"id":"external_commands:SKILL.md:126:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":132,"severity":"medium","line_start":126},{"id":"external_commands:SKILL.md:132:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":136,"severity":"medium","line_start":132},{"id":"external_commands:SKILL.md:136:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":145,"severity":"medium","line_start":136},{"id":"external_commands:SKILL.md:145:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":149,"severity":"medium","line_start":145},{"id":"external_commands:SKILL.md:149:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":158,"severity":"medium","line_start":149},{"id":"external_commands:SKILL.md:158:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":162,"severity":"medium","line_start":158},{"id":"external_commands:SKILL.md:162:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"If global `playwright-cli` is not available, try a local version:","category":"external_commands","line_end":164,"severity":"medium","line_start":162},{"id":"external_commands:SKILL.md:164:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":166,"severity":"medium","line_start":164},{"id":"external_commands:SKILL.md:166:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":170,"severity":"medium","line_start":166},{"id":"external_commands:SKILL.md:170:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":172,"severity":"medium","line_start":170},{"id":"external_commands:SKILL.md:172:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":176,"severity":"medium","line_start":172},{"id":"external_commands:SKILL.md:176:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":184,"severity":"medium","line_start":176},{"id":"network:SKILL.md:12:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"(https://github.com/microsoft/playwright-cli), Copyright (c) Microsoft Corporation,","category":"network","line_end":12,"severity":"low","line_start":12},{"id":"network:SKILL.md:42:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"playwright-cli goto https://playwright.dev","category":"network","line_end":42,"severity":"low","line_start":42},{"id":"network:SKILL.md:56:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"playwright-cli open https://example.com/","category":"network","line_end":56,"severity":"low","line_start":56},{"id":"network:SKILL.md:57:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"playwright-cli goto https://playwright.dev","category":"network","line_end":57,"severity":"low","line_start":57},{"id":"network:SKILL.md:90:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"> playwright-cli goto https://example.com","category":"network","line_end":90,"severity":"low","line_start":90},{"id":"network:SKILL.md:92:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"- Page URL: https://example.com/","category":"network","line_end":92,"severity":"low","line_start":92},{"id":"network:SKILL.md:177:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"playwright-cli open https://example.com/form","category":"network","line_end":177,"severity":"low","line_start":177},{"id":"blocker:SKILL.md:143:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"# test id","category":"blocker","line_end":144,"severity":"low","line_start":143}],"finding_verdicts":[{"id":"external_commands:SKILL.md:20:ruby-shell-backtick-execution","reason":"This is Markdown inline code documenting the Playwright CLI or selector syntax, not executable Ruby or shell backtick code. It does not create an automatic command execution path.","verdict":"false_positive","confidence":0.95},{"id":"external_commands:SKILL.md:21:ruby-shell-backtick-execution","reason":"This is Markdown inline code documenting the Playwright CLI or selector syntax, not executable Ruby or shell backtick code. It does not create an automatic command execution path.","verdict":"false_positive","confidence":0.95},{"id":"external_commands:SKILL.md:29:ruby-shell-backtick-execution","reason":"This is Markdown inline code documenting the Playwright CLI or selector syntax, not executable Ruby or shell backtick code. It does not create an automatic command execution path.","verdict":"false_positive","confidence":0.95},{"id":"external_commands:SKILL.md:30:ruby-shell-backtick-execution","reason":"This is Markdown inline code documenting the Playwright CLI or selector syntax, not executable Ruby or shell backtick code. It does not create an automatic command execution path.","verdict":"false_positive","confidence":0.95},{"id":"external_commands:SKILL.md:38:ruby-shell-backtick-execution","reason":"This is a Markdown fenced example for legitimate Playwright CLI usage, not Ruby backtick execution. The commands require an agent or user to invoke them and are aligned with the skill purpose.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:49:ruby-shell-backtick-execution","reason":"This is a Markdown fenced example for legitimate Playwright CLI usage, not Ruby backtick execution. The commands require an agent or user to invoke them and are aligned with the skill purpose.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:53:ruby-shell-backtick-execution","reason":"This is a Markdown fenced example for legitimate Playwright CLI usage, not Ruby backtick execution. The commands require an agent or user to invoke them and are aligned with the skill purpose.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:73:ruby-shell-backtick-execution","reason":"This is a Markdown fenced example for legitimate Playwright CLI usage, not Ruby backtick execution. The commands require an agent or user to invoke them and are aligned with the skill purpose.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:77:ruby-shell-backtick-execution","reason":"This is a Markdown fenced example for legitimate Playwright CLI usage, not Ruby backtick execution. The commands require an agent or user to invoke them and are aligned with the skill purpose.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:83:ruby-shell-backtick-execution","reason":"This is a Markdown fenced example for legitimate Playwright CLI usage, not Ruby backtick execution. The commands require an agent or user to invoke them and are aligned with the skill purpose.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:89:ruby-shell-backtick-execution","reason":"This is a Markdown fenced example for legitimate Playwright CLI usage, not Ruby backtick execution. The commands require an agent or user to invoke them and are aligned with the skill purpose.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:96:ruby-shell-backtick-execution","reason":"This is a Markdown fenced example for legitimate Playwright CLI usage, not Ruby backtick execution. The commands require an agent or user to invoke them and are aligned with the skill purpose.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:100:ruby-shell-backtick-execution","reason":"This is a Markdown fenced example for legitimate Playwright CLI usage, not Ruby backtick execution. The commands require an agent or user to invoke them and are aligned with the skill purpose.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:110:ruby-shell-backtick-execution","reason":"This is a Markdown fenced example for legitimate Playwright CLI usage, not Ruby backtick execution. The commands require an agent or user to invoke them and are aligned with the skill purpose.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:112:ruby-shell-backtick-execution","reason":"This text documents the --raw option and piping snapshots into diff, not Ruby backtick execution. The example is local comparison output and does not show hidden command injection.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:115:ruby-shell-backtick-execution","reason":"This text documents the --raw option and piping snapshots into diff, not Ruby backtick execution. The example is local comparison output and does not show hidden command injection.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:120:ruby-shell-backtick-execution","reason":"This text documents the --raw option and piping snapshots into diff, not Ruby backtick execution. The example is local comparison output and does not show hidden command injection.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:126:ruby-shell-backtick-execution","reason":"This is a Markdown fenced example for legitimate Playwright CLI usage, not Ruby backtick execution. The commands require an agent or user to invoke them and are aligned with the skill purpose.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:132:ruby-shell-backtick-execution","reason":"This is a Markdown fenced example for legitimate Playwright CLI usage, not Ruby backtick execution. The commands require an agent or user to invoke them and are aligned with the skill purpose.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:136:ruby-shell-backtick-execution","reason":"This is a Markdown fenced example for legitimate Playwright CLI usage, not Ruby backtick execution. The commands require an agent or user to invoke them and are aligned with the skill purpose.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:145:ruby-shell-backtick-execution","reason":"This is a Markdown fenced example for legitimate Playwright CLI usage, not Ruby backtick execution. The commands require an agent or user to invoke them and are aligned with the skill purpose.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:149:ruby-shell-backtick-execution","reason":"This is a Markdown fenced example for legitimate Playwright CLI usage, not Ruby backtick execution. The commands require an agent or user to invoke them and are aligned with the skill purpose.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:158:ruby-shell-backtick-execution","reason":"This is a Markdown fenced example for legitimate Playwright CLI usage, not Ruby backtick execution. The commands require an agent or user to invoke them and are aligned with the skill purpose.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:162:ruby-shell-backtick-execution","reason":"This documents checking for a local Playwright CLI with npx --no-install, not Ruby backtick execution. The option avoids package installation and has no dynamic command construction.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:164:ruby-shell-backtick-execution","reason":"This documents checking for a local Playwright CLI with npx --no-install, not Ruby backtick execution. The option avoids package installation and has no dynamic command construction.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:166:ruby-shell-backtick-execution","reason":"This documents checking for a local Playwright CLI with npx --no-install, not Ruby backtick execution. The option avoids package installation and has no dynamic command construction.","verdict":"false_positive","confidence":0.9},{"id":"external_commands:SKILL.md:170:ruby-shell-backtick-execution","reason":"This is a Markdown install example, not Ruby backtick execution. The install recommendation is handled separately as a semantic supply-chain finding because the static pattern itself is inaccurate.","verdict":"false_positive","confidence":0.88},{"id":"external_commands:SKILL.md:172:ruby-shell-backtick-execution","reason":"This is a Markdown install example, not Ruby backtick execution. The install recommendation is handled separately as a semantic supply-chain finding because the static pattern itself is inaccurate.","verdict":"false_positive","confidence":0.88},{"id":"external_commands:SKILL.md:176:ruby-shell-backtick-execution","reason":"This is a Markdown fenced example for legitimate Playwright CLI usage, not Ruby backtick execution. The commands require an agent or user to invoke them and are aligned with the skill purpose.","verdict":"false_positive","confidence":0.9},{"id":"network:SKILL.md:12:hardcoded-url","reason":"The URL appears in attribution for the upstream Playwright CLI project, not in code that transmits data. It is documentation metadata rather than a network request.","verdict":"false_positive","confidence":0.93},{"id":"network:SKILL.md:42:hardcoded-url","reason":"The URL is an example navigation target for browser automation documentation. It does not send secrets or contact an unexpected endpoint by itself.","verdict":"false_positive","confidence":0.88},{"id":"network:SKILL.md:56:hardcoded-url","reason":"The URL is an example navigation target for browser automation documentation. It does not send secrets or contact an unexpected endpoint by itself.","verdict":"false_positive","confidence":0.88},{"id":"network:SKILL.md:57:hardcoded-url","reason":"The URL is an example navigation target for browser automation documentation. It does not send secrets or contact an unexpected endpoint by itself.","verdict":"false_positive","confidence":0.88},{"id":"network:SKILL.md:90:hardcoded-url","reason":"The URL is an example navigation target for browser automation documentation. It does not send secrets or contact an unexpected endpoint by itself.","verdict":"false_positive","confidence":0.88},{"id":"network:SKILL.md:92:hardcoded-url","reason":"The URL appears in sample command output showing the current page URL. It is not an active request or data exfiltration path in the skill file.","verdict":"false_positive","confidence":0.9},{"id":"network:SKILL.md:177:hardcoded-url","reason":"The URL is an example navigation target for browser automation documentation. It does not send secrets or contact an unexpected endpoint by itself.","verdict":"false_positive","confidence":0.88},{"id":"blocker:SKILL.md:143:system-reconnaissance","reason":"The text is a Playwright selector example for getByTestId, not system reconnaissance. It does not inspect host system details or collect environment information.","verdict":"false_positive","confidence":0.94}],"semantic_findings":[{"title":"Mutable Global Package Installation","severity":"medium","locations":[{"file":"SKILL.md","line_end":172,"line_start":168}],"confidence":0.86,"description":"The skill recommends installing @playwright/cli globally with the @latest tag. This fetches unpinned code and changes the host toolchain outside the project.","confidence_reasoning":"Line 171 contains a global npm install using @latest, which is a concrete supply-chain and environment mutation risk. The behavior is legitimate installation guidance, but it should be pinned and confirmed."}],"subject_marketplace_commit_sha":null,"subject_content_hash":null,"subject_tree_hash":null,"subject_plugin_path":null,"audit_payload_hash":null,"confirmed_risk_level":null,"scanner_version":null,"policy_version":null,"subject":{"marketplaceCommitSha":null,"contentHash":null,"treeHash":null,"pluginPath":null,"auditPayloadHash":null},"scannerVersion":null,"policyVersion":null},"auditTranslation":null,"localization":{"requestedLocale":"en","contentLocale":"en","availableLocales":["en"],"fallbackToEnglish":false},"attestation":{"availability":"not_attestable","url":null,"status":null,"reason":"confirmed_risk_level does not match the canonical trust resolver"},"trust":{"publicState":"public","auditState":"complete","auditCurrentness":null,"confirmedRiskLevel":"medium","confirmedFindingCount":1,"capabilityReviewCount":0,"needsReviewCount":0,"falsePositiveCount":0,"agentAutoInstallPolicy":"allowed","manualInstallPolicy":"allowed","artifactSignatureState":"available","attestationState":"not_attestable","verificationState":"not_verified"},"isLatest":false}}