registry  /  @happyvertical/smrt-cli  /  0.38.2

@happyvertical/smrt-cli@0.38.2

Developer CLI for SMRT framework - introspection, testing, and project management

AI Security Review

scanned 4d ago · by lpm-firewall-ai

No confirmed malicious attack surface was found. Risky primitives are developer CLI features activated by explicit commands, not install-time or import-time compromise.

Static reason
One or more suspicious static signals were detected.; previous stored version diff introduced dangerous source
Trigger
User runs smrt CLI subcommands
Impact
User-invoked project file generation or command execution within documented CLI workflows
Mechanism
developer tooling for SMRT manifests, docs, templates, git merge drivers, migrations, and playground scaffolding
Rationale
Static inspection shows a broad developer CLI with dynamic imports, child processes, file writes, and template downloads, but these are tied to explicit commands and package-aligned functionality. There are no lifecycle hooks, credential harvesting, hidden exfiltration, persistence, or unconsented foreign AI-agent control-surface writes.
Evidence
package.jsonbin/smrt.jsdist/index.jsdist/commands-gnJG0EIL.jsdist/json-validator-D5hN4DGj.jsscripts/verify-package-types-exports.js.agents/smrt-framework.md.claude/smrt-framework.md.gitattributes.smrt/register.jssmrt.config.tssrc/lib/server/smrt.tssrc/lib/objects/index.tssrc/lib/objects/Example.ts.env.example.gitignoresrc/playground.tssrc/routes/playground/+page.sveltevite.config.tsvite.config.js
Network endpoints5
github.com/{user}/{repo}/archive/{ref}.tar.gzgitlab.com/{user}/{repo}/-/archive/{ref}/{repo}-{ref}.tar.gzbitbucket.org/{user}/{repo}/get/{ref}.tar.gzregistry.npmjs.orggithub.com/happyvertical/smrt.git

Decision evidence

public snapshot
AI called this Clean at 90.0% confidence as Benign with low false-positive risk.
Evidence for block
    Evidence against
    • package.json has no npm lifecycle install hooks; bin only delegates to dist/index.js via node.
    • bin/smrt.js spawnSync executes the package CLI entry with inherited argv, not a hidden payload.
    • dist/index.js lazy-loads command modules and imports project .smrt/register.js or entrypoints only during CLI execution.
    • dist/commands-gnJG0EIL.js docs:claude writes .claude/smrt-framework.md only when user invokes that command; no install-time agent mutation.
    • dist/commands-gnJG0EIL.js network access is template download from user-supplied GitHub/GitLab/Bitbucket URLs with HTTPS redirect validation.
    • dist/commands-gnJG0EIL.js shell/package-manager usage is tied to explicit git, gnode, playground, test, or migration commands.
    Behavioral surface
    Source
    ChildProcessCryptoDynamicRequireEnvironmentVarsFilesystemNetworkShell
    Supply chain
    HighEntropyStringsUrlStrings
    ManifestNo manifest risk signals triggered.
    scanned 6 file(s), 383 KB of source, external domains: bitbucket.org, github.com, gitlab.com

    Source & flagged code

    5 flagged · loading source
    bin/smrt.jsView file
    2L3: import { spawnSync } from 'node:child_process'; L4: import { existsSync } from 'node:fs';
    High
    Child Process

    Package source references child process execution.

    bin/smrt.jsView on unpkg · L2
    dist/commands-gnJG0EIL.jsView file
    matchType = previous_version_dangerous_delta matchedPackage = @happyvertical/smrt-cli@0.38.3 matchedIdentity = npm:QGhhcHB5dmVydGljYWwvc21ydC1jbGk:0.38.3 similarity = 0.500 summary = stored previous version shares package body but lacks this dangerous source file
    Critical
    Previous Version Dangerous Delta

    This package version adds a dangerous source file absent from the previous stored version; route for source-aware review.

    dist/commands-gnJG0EIL.jsView on unpkg
    4469* Security: Command and arguments are validated to prevent injection attacks. L4470: * shell: true is NOT used to avoid command injection vulnerabilities. L4471: */
    High
    Shell

    Package source references shell execution.

    dist/commands-gnJG0EIL.jsView on unpkg · L4469
    3648execSync(`git config ${configScope} merge.smrt-json.name "SMRT JSON merge driver"`, { stdio: "inherit" }); L3649: execSync(`git config ${configScope} merge.smrt-json.driver "npx smrt merge-json %O %A %B"`, { stdio: "inherit" }); L3650: changes.push(`Git merge driver configured (${options.global ? "global" : "local"})`);
    High
    Runtime Package Install

    Package source invokes a package manager install command at runtime.

    dist/commands-gnJG0EIL.jsView on unpkg · L3648
    121} L122: const { getPackageConfig } = await import("@happyvertical/smrt-config"); L123: const { DEFAULT_CLI_CONFIG } = await import("./config-BwrFRL8L.js");
    Medium
    Dynamic Require

    Package source references dynamic require/import behavior.

    dist/commands-gnJG0EIL.jsView on unpkg · L121

    Findings

    1 Critical3 High4 Medium4 Low
    CriticalPrevious Version Dangerous Deltadist/commands-gnJG0EIL.js
    HighChild Processbin/smrt.js
    HighShelldist/commands-gnJG0EIL.js
    HighRuntime Package Installdist/commands-gnJG0EIL.js
    MediumDynamic Requiredist/commands-gnJG0EIL.js
    MediumNetwork
    MediumEnvironment Vars
    MediumStructural Risk Force Deep Review
    LowScripts Present
    LowFilesystem
    LowHigh Entropy Strings
    LowUrl Strings