registry  /  @hasna/todos  /  0.11.71

@hasna/todos@0.11.71

⚠ Under review

Universal task management for AI coding agents - CLI + MCP server + interactive TUI

Static Scan Results

scanned 13d ago · by rust-scanner

Static analysis flagged 19 finding(s) at 86.0% confidence. This version is warn-only unless an AI or security-team review confirms malicious behavior.

Static reason
High-risk behavior combination matched malicious policy.

Decision evidence

public snapshot
Behavioral surface
Source
ChildProcessCryptoDynamicRequireEnvironmentVarsFilesystemNetworkShell
Supply chain
HighEntropyStringsMinifiedUrlStrings
ManifestNo manifest risk signals triggered.
scanned 8 file(s), 6.36 MB of source, external domains: 127.0.0.1, github.com, hasna.dev, preview.example.com, radix-ui.com, react.dev, www.npmjs.com, www.w3.org
Oversized source lightweight scan
dist/cli/index.js2.72 MB file, sampled 256 KB
FilesystemChildProcessEnvironmentVarsCryptoDynamicRequireHighEntropyStrings
dist/server/index.js3.00 MB file, sampled 256 KB
FilesystemNetworkChildProcessEnvironmentVarsCryptoShellHighEntropyStringsUrlStrings127.0.0.1

Source & flagged code

9 flagged · loading source
package.jsonView file
scripts.postinstall = mkdir -p $HOME/.hasna/todos $HOME/.hasna/todos/training 2>/dev/null || true
High
Install Time Lifecycle Scripts

Package defines install-time lifecycle scripts.

package.jsonView on unpkg
scripts.postinstall = mkdir -p $HOME/.hasna/todos $HOME/.hasna/todos/training 2>/dev/null || true
Medium
Ambiguous Install Lifecycle Script

Install-time lifecycle script is not statically allowlisted and needs review.

package.jsonView on unpkg
dist/registry.jsView file
2334import { resolve } from "path"; L2335: import { spawnSync } from "child_process"; L2336: function parseMetadata(value) {
High
Child Process

Package source references child process execution.

dist/registry.jsView on unpkg · L2334
2244commands TEXT DEFAULT '[]', L2245: stdout_summary TEXT, L2246: stderr_summary TEXT, ... L2315: try { L2316: tags = JSON.parse(row.tags); L2317: } catch { ... L2334: import { resolve } from "path"; L2335: import { spawnSync } from "child_process"; L2336: function parseMetadata(value) { ... L2349: is_primary: !!row.is_primary, L2350: metadata: parseMetadata(row.metadata) L2351: };
High
Cloud Metadata Access

Source reaches cloud instance metadata or link-local credential endpoints.

dist/registry.jsView on unpkg · L2244
dist/index.jsView file
2244Cross-file remote execution chain: dist/index.js spawns dist/mcp/index.js; helper contains network access plus dynamic code execution. L2244: commands TEXT DEFAULT '[]', L2245: stdout_summary TEXT, L2246: stderr_summary TEXT, ... L2315: try { L2316: tags = JSON.parse(row.tags); L2317: } catch { ... L2334: import { resolve } from "path"; L2335: import { spawnSync } from "child_process"; L2336: function parseMetadata(value) { ... L2349: is_primary: !!row.is_primary, L2350: metadata: parseMetadata(row.metadata) L2351: };
High
Cross File Remote Execution Context

Source spawns a local helper that also contains network and dynamic execution context; review data flow before blocking.

dist/index.jsView on unpkg · L2244
2244commands TEXT DEFAULT '[]', L2245: stdout_summary TEXT, L2246: stderr_summary TEXT, ... L2315: try { L2316: tags = JSON.parse(row.tags); L2317: } catch { ... L2334: import { resolve } from "path"; L2335: import { spawnSync } from "child_process"; L2336: function parseMetadata(value) { ... L2349: is_primary: !!row.is_primary, L2350: metadata: parseMetadata(row.metadata) L2351: };
Medium
Install Persistence

Source writes installer persistence such as shell profile or service configuration.

dist/index.jsView on unpkg · L2244
dist/cli/index.jsView file
context = "] || process.env["USERPROFILE"] || "~";\n}\nfunction getTodosGlobalDir() {\n return join3(getHomeDir(), ".hasna", "todos");\n}\nfunction ensureDir2(dir) {\n if (!existsSync4(dir))\n mkdirSync2(dir, { recursive: true });\n}\nfunction listJsonFiles(dir) {\n if (!existsSync4(dir))\n return [];\n return readdirSync(dir).filter((f) => f.endsWith(".json"));\n}\nfunction readJsonFile(path) {\n try {\n return JSON.parse(readFileSync2(path, "utf-8"));\n } catch {\n return null;\n }\n}\nfunction writeJsonFile(path, data) {\n writeFileSync(path, JSON.stringify(data, null, 2) + `\n`);\n}\nfunction readHighWaterMark(dir) {\n const path = join3(dir, ".highwatermark");\n if (!existsSync4(path))\n return 1;\n const val = parseInt(readFileSync2(path, "utf-8").trim(), 10);\n return isNaN(val) ? 1 : val;\n}\nfunction writeHighWaterMark(dir, value) {\n writeFileSync(join3(dir, ".highwatermark"), String(value));\n}\nfunction getFileMtimeMs(path) {\n try {\n return statSync(path).mtimeMs;\n } catch {\n return null;\n }\n}\nfunction parseTimestamp(val
Critical
Encrypted Payload Temp Execution

Source decrypts an embedded payload, writes it to disk, and executes it through a child process.

dist/cli/index.jsView on unpkg
dist/server/index.jsView file
path = dist/server/index.js kind = oversized_source_file sizeBytes = 3141231 magicHex = [redacted]
High
Oversized Source File

Package contains source files above the static scanner size ceiling.

dist/server/index.jsView on unpkg
path = dist/server/index.js kind = oversized_cli_entrypoint sizeBytes = 3141231 magicHex = [redacted]
Medium
Oversized Cli Entrypoint

Package contains an oversized executable-looking CLI entrypoint.

dist/server/index.jsView on unpkg

Findings

1 Critical6 High7 Medium5 Low
CriticalEncrypted Payload Temp Executiondist/cli/index.js
HighInstall Time Lifecycle Scriptspackage.json
HighChild Processdist/registry.js
HighShell
HighCloud Metadata Accessdist/registry.js
HighCross File Remote Execution Contextdist/index.js
HighOversized Source Filedist/server/index.js
MediumAmbiguous Install Lifecycle Scriptpackage.json
MediumDynamic Require
MediumNetwork
MediumEnvironment Vars
MediumInstall Persistencedist/index.js
MediumOversized Cli Entrypointdist/server/index.js
MediumStructural Risk Force Deep Review
LowNon Install Lifecycle Scripts
LowScripts Present
LowFilesystem
LowHigh Entropy Strings
LowUrl Strings