{"data":{"skill":{"slug":"localheroai-localhero","name":"localhero","icon":"📦","repo":"https://github.com/localheroai/agent-skill/tree/main/","status":"approved","author":"localheroai","authorVersion":null,"skillstoreRevision":null},"audit":{"id":"f9aa0701-e3c1-4246-81b6-409674a15993","skill_id":"7cf6f854-9969-47dd-8bdf-84dc01e5c582","version":4,"content_hash":"3f956d897dddc83446226b6662f77334","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 hits are Markdown examples or documentation for Localhero.ai commands and are false positives. Confirmed risks are scoped external CLI execution through npx, API key handling guidance, and third-party transfer of translation content; no prompt injection attempt was found.","remediation":[{"issue":"External Localhero.ai CLI execution","severity":"medium","suggestion":"Keep allowed tools limited to npx @localheroai/cli commands and ask users before running commands that modify files or contact the service."},{"issue":"API key handling guidance","severity":"high","suggestion":"Prefer interactive login or user-managed environment variables. Do not ask users to paste API keys into prompts, logs, or shell commands."},{"issue":"Translation content sent to an external service","severity":"medium","suggestion":"Tell users before source strings or translation files are sent to Localhero.ai, especially for private or regulated projects."}],"risk_factor_evidence":[{"factor":"env_access","evidence":[{"file":"cli-reference.md","line_end":67,"line_start":67},{"file":"cli-reference.md","line_end":120,"line_start":120},{"file":"SKILL.md","line_end":65,"line_start":65}]},{"factor":"external_commands","evidence":[{"file":"SKILL.md","line_end":13,"line_start":13},{"file":"SKILL.md","line_end":14,"line_start":14},{"file":"SKILL.md","line_end":24,"line_start":24},{"file":"SKILL.md","line_end":29,"line_start":29},{"file":"SKILL.md","line_end":30,"line_start":30},{"file":"SKILL.md","line_end":41,"line_start":41},{"file":"SKILL.md","line_end":42,"line_start":42},{"file":"SKILL.md","line_end":43,"line_start":43},{"file":"SKILL.md","line_end":46,"line_start":46},{"file":"SKILL.md","line_end":51,"line_start":51},{"file":"SKILL.md","line_end":55,"line_start":55},{"file":"SKILL.md","line_end":63,"line_start":61},{"file":"SKILL.md","line_end":65,"line_start":63},{"file":"SKILL.md","line_end":65,"line_start":65}]},{"factor":"network","evidence":[{"file":"SKILL.md","line_end":9,"line_start":9},{"file":"SKILL.md","line_end":34,"line_start":34},{"file":"SKILL.md","line_end":65,"line_start":65},{"file":"SKILL.md","line_end":69,"line_start":69}]}],"critical_findings":[],"high_findings":[{"title":"Ruby/shell backtick execution","locations":[{"file":"SKILL.md","line_end":65,"line_start":65}],"confidence":0.78,"description":"For non-interactive environments, they can also use `npx @localheroai/cli login --api-key <key>` or ","review_kind":"capability","source_category":"external_commands","source_severity":"medium","confidence_reasoning":"The line documents npx @localheroai/cli login --api-key <key>. Passing keys on a command line can expose them in shell history or process listings, so this is a real handling risk."},{"title":"Generic API/secret keys","locations":[{"file":"SKILL.md","line_end":65,"line_start":65}],"confidence":0.68,"description":"For non-interactive environments, they can also use `npx @localheroai/cli login --api-key <key>` or ","review_kind":"capability","source_category":"env_access","source_severity":"high","confidence_reasoning":"The line tells users to authenticate with an API key or LOCALHERO_API_KEY. No secret is present, but the skill guidance involves credentials and could lead to key exposure if pasted into prompts or shell history."}],"medium_findings":[{"title":"Ruby/shell backtick execution","locations":[{"file":"SKILL.md","line_end":13,"line_start":13}],"confidence":0.72,"description":"1. **ONLY write source language strings** — let Localhero.ai handle target translations (via GitHub ","review_kind":"capability","source_category":"external_commands","source_severity":"medium","confidence_reasoning":"The line references running npx @localheroai/cli translate as part of the skill workflow. The command is scoped to the Localhero CLI, but it still executes external npm code and contacts a service."},{"title":"Ruby/shell backtick execution","locations":[{"file":"SKILL.md","line_end":30,"line_start":30}],"confidence":0.84,"description":"- Otherwise, run `npx @localheroai/cli translate --changed-only`. This translates only keys that dif","review_kind":"capability","source_category":"external_commands","source_severity":"medium","confidence_reasoning":"The skill explicitly instructs running npx @localheroai/cli translate --changed-only. This is intended functionality, but it executes an external CLI and can modify translation files."},{"title":"Ruby/shell backtick execution","locations":[{"file":"SKILL.md","line_end":51,"line_start":51}],"confidence":0.82,"description":"Run `npx @localheroai/cli glossary --output json` to get the project glossary. Use these terms consi","review_kind":"capability","source_category":"external_commands","source_severity":"medium","confidence_reasoning":"The skill instructs running npx @localheroai/cli glossary --output json to fetch project glossary data. The command is scoped, but it still invokes an external CLI and service."},{"title":"Ruby/shell backtick execution","locations":[{"file":"SKILL.md","line_end":55,"line_start":55}],"confidence":0.82,"description":"Run `npx @localheroai/cli settings --output json` to get the project's tone, style, and language set","review_kind":"capability","source_category":"external_commands","source_severity":"medium","confidence_reasoning":"The skill instructs running npx @localheroai/cli settings --output json to fetch tone and language settings. This is intended but remains external command execution."},{"title":"Ruby/shell backtick execution","locations":[{"file":"SKILL.md","line_end":63,"line_start":61}],"confidence":0.7,"description":"```bash","review_kind":"capability","source_category":"external_commands","source_severity":"medium","confidence_reasoning":"The finding range contains a bash block with npx @localheroai/cli login. It is a fixed authentication command, but it executes an external CLI."},{"title":"Ruby/shell backtick execution","locations":[{"file":"SKILL.md","line_end":65,"line_start":63}],"confidence":0.7,"description":"```","review_kind":"capability","source_category":"external_commands","source_severity":"medium","confidence_reasoning":"The finding range includes authentication guidance with npx @localheroai/cli login --api-key. This is not arbitrary execution, but it combines external command execution with credential handling."},{"title":"Third-Party Translation Data Transfer","locations":[{"file":"SKILL.md","line_end":30,"line_start":28},{"file":"cli-reference.md","line_end":24,"line_start":16}],"confidence":0.86,"description":"The workflow runs Localhero.ai translation commands and the CLI reference documents pushing source files to Localhero.ai. Source strings and translation files may contain proprietary product text, so users need explicit awareness before commands send data externally.","review_kind":"security","source_category":"semantic","source_severity":"medium","confidence_reasoning":"The skill explicitly instructs running translate commands, and the CLI reference describes pushing source files. This confirms third-party data transfer as intended behavior, not hidden malware."}],"low_findings":[],"dangerous_patterns":[],"files_scanned":4,"total_lines":245,"audit_model":"codex","audited_at":"2026-07-05T20:34:23.528+00:00","created_at":"2026-07-07T02:33:54.511434+00:00","static_findings":[{"id":"env_access:cli-reference.md:67:generic-api-secret-keys","file":"cli-reference.md","pattern":"Generic API/secret keys","snippet":"Environment variable alternative: `export LOCALHERO_API_KEY=tk_xxx`","category":"env_access","line_end":67,"severity":"high","line_start":67},{"id":"env_access:cli-reference.md:120:generic-api-secret-keys","file":"cli-reference.md","pattern":"Generic API/secret keys","snippet":"| `LOCALHERO_API_KEY` | API key (alternative to `.localhero_key` file) |","category":"env_access","line_end":120,"severity":"high","line_start":120},{"id":"external_commands:SKILL.md:13:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"1. **ONLY write source language strings** — let Localhero.ai handle target translations (via GitHub ","category":"external_commands","line_end":13,"severity":"medium","line_start":13},{"id":"external_commands:SKILL.md:14:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"2. Read `localhero.json` to find the source locale, file paths, and patterns","category":"external_commands","line_end":14,"severity":"medium","line_start":14},{"id":"external_commands:SKILL.md:24:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"1. Check `localhero.json` for `sourceLocale` and `translationFiles.paths`","category":"external_commands","line_end":24,"severity":"medium","line_start":24},{"id":"external_commands:SKILL.md:29:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- Check if any file in `.github/workflows/` references `localheroai/localhero-action`. If so, transl","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":"- Otherwise, run `npx @localheroai/cli translate --changed-only`. This translates only keys that dif","category":"external_commands","line_end":30,"severity":"medium","line_start":30},{"id":"external_commands:SKILL.md:41:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- Namespaced: `users.profile.title`","category":"external_commands","line_end":41,"severity":"medium","line_start":41},{"id":"external_commands:SKILL.md:42:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- Grouped by feature/page: `dashboard.welcome_message`","category":"external_commands","line_end":42,"severity":"medium","line_start":42},{"id":"external_commands:SKILL.md:43:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- Action-oriented for buttons: `actions.save`, `actions.cancel`","category":"external_commands","line_end":43,"severity":"medium","line_start":43},{"id":"external_commands:SKILL.md:46:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- msgid is the source string itself: `msgid \"Welcome to the dashboard\"`","category":"external_commands","line_end":46,"severity":"medium","line_start":46},{"id":"external_commands:SKILL.md:51:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"Run `npx @localheroai/cli glossary --output json` to get the project glossary. Use these terms consi","category":"external_commands","line_end":51,"severity":"medium","line_start":51},{"id":"external_commands:SKILL.md:55:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"Run `npx @localheroai/cli settings --output json` to get the project's tone, style, and language set","category":"external_commands","line_end":55,"severity":"medium","line_start":55},{"id":"external_commands:SKILL.md:61:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":63,"severity":"medium","line_start":61},{"id":"external_commands:SKILL.md:63:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":65,"severity":"medium","line_start":63},{"id":"external_commands:SKILL.md:65:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"For non-interactive environments, they can also use `npx @localheroai/cli login --api-key <key>` or ","category":"external_commands","line_end":65,"severity":"medium","line_start":65},{"id":"network:SKILL.md:9:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"You are helping a developer write and maintain internationalized source strings in a project that us","category":"network","line_end":9,"severity":"low","line_start":9},{"id":"network:SKILL.md:34:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"The Localhero.ai web UI (https://localhero.ai) is where users manage translation settings, glossary ","category":"network","line_end":34,"severity":"low","line_start":34},{"id":"network:SKILL.md:65:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"For non-interactive environments, they can also use `npx @localheroai/cli login --api-key <key>` or ","category":"network","line_end":65,"severity":"low","line_start":65},{"id":"network:SKILL.md:69:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"See [cli-reference.md](cli-reference.md) for all available commands. Full source at https://github.c","category":"network","line_end":69,"severity":"low","line_start":69},{"id":"env_access:SKILL.md:65:generic-api-secret-keys","file":"SKILL.md","pattern":"Generic API/secret keys","snippet":"For non-interactive environments, they can also use `npx @localheroai/cli login --api-key <key>` or ","category":"env_access","line_end":65,"severity":"high","line_start":65},{"id":"blocker:SKILL.md:46:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"- msgid is the source string itself: `msgid \"Welcome to the dashboard\"`","category":"blocker","line_end":46,"severity":"low","line_start":46}],"finding_verdicts":[{"id":"env_access:cli-reference.md:67:generic-api-secret-keys","reason":"This line documents a placeholder LOCALHERO_API_KEY environment variable. It does not contain a real secret or show code that reads or exfiltrates credentials.","verdict":"false_positive","confidence":0.9},{"id":"env_access:cli-reference.md:120:generic-api-secret-keys","reason":"This is a reference table entry for an expected authentication environment variable. No actual key value or credential access logic is present.","verdict":"false_positive","confidence":0.91},{"id":"external_commands:SKILL.md:13:ruby-shell-backtick-execution","reason":"The line references running npx @localheroai/cli translate as part of the skill workflow. The command is scoped to the Localhero CLI, but it still executes external npm code and contacts a service.","verdict":"confirmed","severity":"medium","confidence":0.72},{"id":"external_commands:SKILL.md:14:ruby-shell-backtick-execution","reason":"The backticks wrap localhero.json as Markdown inline code. This is a configuration filename, not a shell command or Ruby backtick execution.","verdict":"false_positive","confidence":0.95},{"id":"external_commands:SKILL.md:24:ruby-shell-backtick-execution","reason":"The line names localhero.json fields to inspect. It contains Markdown formatting only and does not instruct shell execution.","verdict":"false_positive","confidence":0.95},{"id":"external_commands:SKILL.md:29:ruby-shell-backtick-execution","reason":"The line asks the assistant to inspect workflow files for a GitHub Action reference. The backtick content is a path and action name, not a command execution sink.","verdict":"false_positive","confidence":0.88},{"id":"external_commands:SKILL.md:30:ruby-shell-backtick-execution","reason":"The skill explicitly instructs running npx @localheroai/cli translate --changed-only. This is intended functionality, but it executes an external CLI and can modify translation files.","verdict":"confirmed","severity":"medium","confidence":0.84},{"id":"external_commands:SKILL.md:41:ruby-shell-backtick-execution","reason":"The content is an i18n key naming example in Markdown. It is not executable code and has no command injection path.","verdict":"false_positive","confidence":0.96},{"id":"external_commands:SKILL.md:42:ruby-shell-backtick-execution","reason":"The backtick text is a sample translation key. It is not a shell command and cannot execute.","verdict":"false_positive","confidence":0.96},{"id":"external_commands:SKILL.md:43:ruby-shell-backtick-execution","reason":"The line lists example button key names. Markdown inline code was mistaken for command execution.","verdict":"false_positive","confidence":0.96},{"id":"external_commands:SKILL.md:46:ruby-shell-backtick-execution","reason":"The line shows a gettext msgid example. It is a localization string, not system reconnaissance or shell execution.","verdict":"false_positive","confidence":0.95},{"id":"external_commands:SKILL.md:51:ruby-shell-backtick-execution","reason":"The skill instructs running npx @localheroai/cli glossary --output json to fetch project glossary data. The command is scoped, but it still invokes an external CLI and service.","verdict":"confirmed","severity":"medium","confidence":0.82},{"id":"external_commands:SKILL.md:55:ruby-shell-backtick-execution","reason":"The skill instructs running npx @localheroai/cli settings --output json to fetch tone and language settings. This is intended but remains external command execution.","verdict":"confirmed","severity":"medium","confidence":0.82},{"id":"external_commands:SKILL.md:61:ruby-shell-backtick-execution","reason":"The finding range contains a bash block with npx @localheroai/cli login. It is a fixed authentication command, but it executes an external CLI.","verdict":"confirmed","severity":"medium","confidence":0.7},{"id":"external_commands:SKILL.md:63:ruby-shell-backtick-execution","reason":"The finding range includes authentication guidance with npx @localheroai/cli login --api-key. This is not arbitrary execution, but it combines external command execution with credential handling.","verdict":"confirmed","severity":"medium","confidence":0.7},{"id":"external_commands:SKILL.md:65:ruby-shell-backtick-execution","reason":"The line documents npx @localheroai/cli login --api-key <key>. Passing keys on a command line can expose them in shell history or process listings, so this is a real handling risk.","verdict":"confirmed","severity":"high","confidence":0.78},{"id":"network:SKILL.md:9:hardcoded-url","reason":"The URL identifies the Localhero.ai service used by the skill. It is documentation for the integration, not a hidden or unauthorized network endpoint.","verdict":"false_positive","confidence":0.86},{"id":"network:SKILL.md:34:hardcoded-url","reason":"The URL points users to the Localhero.ai web UI for review and settings. This is visible product documentation and not covert network behavior.","verdict":"false_positive","confidence":0.86},{"id":"network:SKILL.md:65:hardcoded-url","reason":"The URL points to the service page for obtaining API keys. It is user-facing authentication documentation, not a coded request or exfiltration destination.","verdict":"false_positive","confidence":0.82},{"id":"network:SKILL.md:69:hardcoded-url","reason":"The URL links to the public Localhero CLI source repository. This is documentation provenance, not runtime network access.","verdict":"false_positive","confidence":0.88},{"id":"env_access:SKILL.md:65:generic-api-secret-keys","reason":"The line tells users to authenticate with an API key or LOCALHERO_API_KEY. No secret is present, but the skill guidance involves credentials and could lead to key exposure if pasted into prompts or shell history.","verdict":"confirmed","severity":"high","confidence":0.68},{"id":"blocker:SKILL.md:46:system-reconnaissance","reason":"The line is a gettext msgid localization example. It does not inspect the system, collect host information, or perform reconnaissance.","verdict":"false_positive","confidence":0.96}],"semantic_findings":[{"title":"Third-Party Translation Data Transfer","severity":"medium","locations":[{"file":"SKILL.md","line_end":30,"line_start":28},{"file":"cli-reference.md","line_end":24,"line_start":16}],"confidence":0.86,"description":"The workflow runs Localhero.ai translation commands and the CLI reference documents pushing source files to Localhero.ai. Source strings and translation files may contain proprietary product text, so users need explicit awareness before commands send data externally.","confidence_reasoning":"The skill explicitly instructs running translate commands, and the CLI reference describes pushing source files. This confirms third-party data transfer as intended behavior, not hidden malware."}],"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":8,"needsReviewCount":0,"falsePositiveCount":0,"agentAutoInstallPolicy":"allowed","manualInstallPolicy":"allowed","artifactSignatureState":"available","attestationState":"not_attestable","verificationState":"not_verified"},"isLatest":false}}