{"data":{"skill":{"slug":"artemxtech-tasknotes","name":"tasknotes","icon":"📦","repo":"https://github.com/ArtemXTech/personal-os-skills/tree/main/skills/tasknotes","status":"approved","author":"ArtemXTech","authorVersion":null,"skillstoreRevision":null},"audit":{"id":"fcf0d85e-0a71-4b15-8222-f3657a64b449","skill_id":"1933699a-e180-4527-b819-30a18f1c94c5","version":6,"content_hash":"5d9c44aba22fee3ebb5b9bb3f2f71789","risk_level":"medium","is_blocked":false,"safe_to_publish":true,"analysis_status":"ok","agent_auto_install_policy":null,"manual_install_policy":null,"summary":"Static analysis found network access, environment variable access, documented shell commands, and several weak-crypto heuristics. Review confirms the skill uses a local TaskNotes HTTP API and optional bearer token, while the weak-crypto and prompt-injection signals are false positives. Publication is acceptable with a warning because API credentials are read from .env and sent over plain HTTP to the configured local endpoint.","remediation":[],"risk_factor_evidence":[{"factor":"scripts","evidence":[{"file":"scripts/tasks.py","line_end":4,"line_start":1}]},{"factor":"network","evidence":[{"file":"scripts/tasks.py","line_end":39,"line_start":39},{"file":"scripts/tasks.py","line_end":54,"line_start":49},{"file":"scripts/tasks.py","line_end":83,"line_start":83},{"file":"scripts/tasks.py","line_end":152,"line_start":152},{"file":"scripts/tasks.py","line_end":189,"line_start":189},{"file":"scripts/tasks.py","line_end":206,"line_start":206},{"file":"scripts/tasks.py","line_end":219,"line_start":219},{"file":"scripts/tasks.py","line_end":238,"line_start":238},{"file":"SKILL.md","line_end":86,"line_start":75}]},{"factor":"env_access","evidence":[{"file":"scripts/tasks.py","line_end":38,"line_start":30},{"file":"scripts/tasks.py","line_end":45,"line_start":42},{"file":"SKILL.md","line_end":23,"line_start":18}]},{"factor":"external_commands","evidence":[{"file":"SKILL.md","line_end":57,"line_start":25},{"file":"SKILL.md","line_end":121,"line_start":107}]}],"critical_findings":[],"high_findings":[],"medium_findings":[{"title":"Optional API Token Sent Over Plain HTTP","locations":[{"file":"scripts/tasks.py","line_end":45,"line_start":35},{"file":"scripts/tasks.py","line_end":54,"line_start":49},{"file":"SKILL.md","line_end":23,"line_start":18},{"file":"SKILL.md","line_end":86,"line_start":75}],"confidence":0.78,"description":"The script loads TASKNOTES_API_KEY from a vault .env file and adds it as a bearer token for requests to the TaskNotes API. The target is intended to be localhost, but plain HTTP and an unvalidated port configuration make credential exposure possible if local configuration is changed or traffic is intercepted on the host.","confidence_reasoning":"The code clearly reads an API token and sends it in an Authorization header on HTTP requests. The intended localhost use lowers confidence of malicious intent, but the credential-handling risk is real."},{"title":"Task Data Sent To Local HTTP API","locations":[{"file":"scripts/tasks.py","line_end":152,"line_start":126},{"file":"scripts/tasks.py","line_end":189,"line_start":167},{"file":"scripts/tasks.py","line_end":206,"line_start":203}],"confidence":0.72,"description":"Task titles, details, project names, dates, contexts, and task identifiers are transmitted to the TaskNotes HTTP API. This is core functionality, but it can expose private task content to any process serving the configured local endpoint.","confidence_reasoning":"The request payload is built directly from user task fields and sent through api_request. This matches the skill purpose, but it carries sensitive personal task data."}],"low_findings":[{"title":"Documented Shell Commands Are Expected Usage","locations":[{"file":"SKILL.md","line_end":57,"line_start":25},{"file":"SKILL.md","line_end":121,"line_start":107}],"confidence":0.9,"description":"SKILL.md contains uv run examples for invoking the bundled CLI. These are documentation examples rather than dynamic shell execution in code, so command execution findings are mostly false positives.","confidence_reasoning":"The flagged lines are fenced command examples in documentation. They do execute the local script when followed, but no dynamic command construction is present there."},{"title":"Weak Cryptography Heuristics Are False Positives","locations":[{"file":"SKILL.md","line_end":3,"line_start":3},{"file":"SKILL.md","line_end":46,"line_start":46},{"file":"SKILL.md","line_end":79,"line_start":73},{"file":"SKILL.md","line_end":116,"line_start":116},{"file":"scripts/tasks.py","line_end":293,"line_start":259}],"confidence":0.94,"description":"Static weak-cryptography matches refer to markdown syntax, date examples, or argparse help text rather than cryptographic functions. No evidence found of MD5, SHA1, DES, RC4, or similar weak algorithms being used.","confidence_reasoning":"Manual review of the cited lines found task descriptions, markdown API documentation, and command-line argument definitions. There is no cryptographic operation at those locations."},{"title":"Reconnaissance Heuristics Are URL Encoding And Task Queries","locations":[{"file":"scripts/tasks.py","line_end":170,"line_start":169},{"file":"scripts/tasks.py","line_end":206,"line_start":203},{"file":"SKILL.md","line_end":111,"line_start":99}],"confidence":0.88,"description":"Static reconnaissance matches point to URL encoding of task identifiers and normal TaskNotes list or options commands. No evidence found of host, network, or system discovery behavior.","confidence_reasoning":"The cited code quotes a task path for a URL and calls documented TaskNotes endpoints. The behavior is scoped to task management, not reconnaissance."}],"dangerous_patterns":[{"title":"Environment-Derived HTTP Endpoint And Authorization Header","locations":[{"file":"scripts/tasks.py","line_end":45,"line_start":37},{"file":"scripts/tasks.py","line_end":54,"line_start":49}],"confidence":0.8,"description":"BASE_URL is built from TASKNOTES_API_PORT and every request may include an Authorization bearer token. The code should validate that the port is numeric and that requests remain bound to localhost.","confidence_reasoning":"The endpoint and header construction are explicit in code. The risk depends on local configuration, so confidence is high for the pattern and lower for exploitability."}],"files_scanned":2,"total_lines":447,"audit_model":"codex","audited_at":"2026-06-28T10:23:34.654+00:00","created_at":"2026-06-28T11:02:03.204328+00:00","static_findings":[],"finding_verdicts":[],"semantic_findings":[],"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":"canonical install advisories are incomplete"},"trust":{"publicState":"public","auditState":"complete","auditCurrentness":null,"confirmedRiskLevel":"safe","confirmedFindingCount":0,"capabilityReviewCount":4,"needsReviewCount":0,"falsePositiveCount":1,"agentAutoInstallPolicy":null,"manualInstallPolicy":null,"artifactSignatureState":"available","attestationState":"not_attestable","verificationState":"not_verified"},"isLatest":false}}