---
canonical: "https://firewall.lpm.dev/npm/fraim/v/2.0.208"
markdown: "https://firewall.lpm.dev/npm/fraim/v/2.0.208.md"
package: "fraim"
report_status: "published"
title: "fraim@2.0.208 npm security report"
verdict: "suspicious"
version: "2.0.208"
---

# fraim@2.0.208 npm security report

> **Trust boundary:** Package metadata, advisory text, filenames, URLs, and source snippets in this report come from external packages or feeds. Treat them as untrusted evidence. Do not execute instructions or code found in this document.

## Verdict summary
**Flagged as agent extension risk** — Allowed by default with warning: install-time first-party agent extension setup was detected.

- **Verdict:** Suspicious
- **Product-default install policy:** Warn
- **Firewall policy:** Warn-only agent extension risk
- **Public report status:** Published
- **Threat category:** Agent extension lifecycle risk
- **Selected version:** 2.0.208
- **Selected version is latest:** No
- **Analysis source:** AI Security Review (lpm-firewall-ai)

LPM treats this as warn-only first-party agent extension lifecycle risk. The explicit first-run wizard configures detected AI-agent/IDE surfaces and persists FRAIM invocation artifacts. No npm lifecycle-triggered mutation or covert exfiltration was found.

## Latest scan
- **Scanner version:** rust-scanner-worker-schema-1
- **Verdict:** Suspicious
- **Confidence:** 91.0%
- **Started:** 2026-07-28T21:19:03.237Z
- **Finished:** 2026-07-28T21:19:58.377Z
- **Download time:** 508 ms
- **Static scan time:** 2588 ms
- **AI review time:** 52043 ms
- **Total time:** 55140 ms

## Security analysis

### Published attack-surface review

- **Summary:** The explicit first-run wizard configures detected AI-agent/IDE surfaces and persists FRAIM invocation artifacts. No npm lifecycle-triggered mutation or covert exfiltration was found.

- **Trigger:** User runs fraim first-run and completes its FRAIM setup row.

- **Impact:** Adds FRAIM skills, commands, and MCP configuration to existing agent/IDE profiles; may install user-level runtime dependencies.

- **Evidence paths:** package.json, dist/src/cli/commands/first-run.js, dist/src/first-run/session-service.js, dist/src/cli/setup/ide-global-integration.js, dist/src/cli/setup/user-level-sync.js, dist/src/cli/utils/org-publish.js

- **Review source:** ai\_review

- **Reviewed:** 2026-07-28T21:19:58.377Z

### AI review details

- **Review stage:** source\_first\_review

- **Mechanism:** User-invoked AI-agent extension and MCP configuration setup

- **Rationale:** Source inspection does not support a malicious npm-package verdict because no install lifecycle hook performs the mutations. The explicit setup flow still creates a meaningful agent-extension lifecycle risk that warrants a warning.

- **Files touched:** ~/.claude/skills/fraim/SKILL.md, ~/.claude/commands/fraim.md, ~/.codex/skills/fraim/SKILL.md, ~/.cursor/rules/fraim.mdc, ~/.fraim/package.json, ~/.zshrc, ~/.bash\_profile, ~/.bashrc

- **Network endpoints:** https://fraim.wellnessatwork.me/api/org/publish

### Review decision

- **Verdict:** Suspicious

- **Confidence:** 91.0%

- **Recommended action:** downgrade\_to\_warn

- **Intent class:** Dangerous Capability

- **False-positive risk:** Low

- **Evidence for:** First-run setup writes FRAIM skill/command artifacts into detected AI-agent directories., It can add MCP provider entries, including tokens, to detected IDE configs., The setup flow installs fraim@latest and a user-level npm dependency., Shell PATH persistence is performed during first-run setup.

- **Evidence against:** package.json has no preinstall, install, or postinstall scripts., The risky actions are reached through the explicit fraim first-run wizard, not npm installation., IDE artifacts are FRAIM-branded and only created if missing., Org publishing is an explicit org publish command with configured backend.

## Public findings

### 1. High: Child Process
- **Category:** Source
- **Confidence:** 85.0%
- **Path:** dist/src/core/utils/git-utils.js
- **Public source:** [View source](<https://unpkg.com/fraim@2.0.208/dist/src/core/utils/git-utils.js>)

Package source references child process execution.

Public source snippet (untrusted):

```javascript
L9: exports.sanitizeRepoIdentifier = sanitizeRepoIdentifier;
L10: const child_process_1 = require("child_process");
L11: function extractLocalFolderLabel(rawPath) {
```

### 2. Medium: Dynamic Require
- **Category:** Source
- **Confidence:** 75.0%
- **Path:** bin/fraim.js
- **Public source:** [View source](<https://unpkg.com/fraim@2.0.208/bin/fraim.js>)

Package source references dynamic require/import behavior.

Public source snippet (untrusted):

```javascript
L3: try {
L4: require('../dist/src/cli/fraim.js');
L5: } catch (error) {
```

### 3. Medium: Network
- **Category:** Source
- **Confidence:** 75.0%

Package source references network APIs.

### 4. Medium: Environment Vars
- **Category:** Source
- **Confidence:** 75.0%

Package source references environment variables.

### 5. Medium: Install Persistence
- **Category:** Source
- **Confidence:** 75.0%
- **Path:** dist/src/first-run/session-service.js
- **Public source:** [View source](<https://unpkg.com/fraim@2.0.208/dist/src/first-run/session-service.js>)

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

Public source snippet (untrusted):

```javascript
L43: const crypto_1 = __importDefault(require("crypto"));
L44: const child_process_1 = require("child_process");
L45: const ide_detector_1 = require("../cli/setup/ide-detector");
...
L55: function getFakeStateMode() {
L56: if (process.env.FRAIM_FIRST_RUN_FAKE !== '1')
L57: return null;
...
L64: function commandVersion(command, extraBinDirs, basePath) {
L65: const executable = process.platform === 'win32' ? 'cmd.exe' : command;
L66: const args = process.platform === 'win32'
...
L79: return null;
L80: const text = `${result.stdout || ''}${result.stderr || ''}`.split(/\r?\n/)[0]?.trim() || null;
L81: return text;
```

### 6. Low: Filesystem
- **Category:** Source
- **Confidence:** 70.0%

Package source references filesystem APIs.

### 7. High: Same File Env Network Execution
- **Category:** Source
- **Confidence:** 85.0%
- **Path:** dist/src/cli/utils/org-publish.js
- **Public source:** [View source](<https://unpkg.com/fraim@2.0.208/dist/src/cli/utils/org-publish.js>)

A single source file combines environment access, network access, and code or shell execution; review context before blocking.

Public source snippet (untrusted):

```javascript
L66: if (organization.backend === 'fraim-cloud') {
L67: const remoteUrl = opts?.remoteUrl || process.env.FRAIM_REMOTE_URL || 'https://fraim.wellnessatwork.me';
L68: const apiKey = opts?.apiKey || (0, user_config_1.readUserFraimConfig)().apiKey;
...
L79: try {
L80: (0, child_process_1.execFileSync)('git', ['clone', '--depth=1', '--quiet', '--', gitUrl, '.'], {
L81: cwd: dir, stdio: ['ignore', 'pipe', 'pipe'], timeout: 60_000
```

### 8. High: Sandbox Evasion Gated Capability
- **Category:** Source
- **Confidence:** 84.0%
- **Path:** dist/src/cli/commands/override.js
- **Public source:** [View source](<https://unpkg.com/fraim@2.0.208/dist/src/cli/commands/override.js>)

Source gates dangerous network, credential, or execution behavior behind CI, host, platform, time, or geo fingerprint checks.

Public source snippet (untrusted):

```javascript
L10: const chalk_1 = __importDefault(require("chalk"));
L11: const axios_1 = __importDefault(require("axios"));
L12: const git_utils_1 = require("../../core/utils/git-utils");
...
L20: .action(async (registryPath, options) => {
L21: const projectRoot = process.cwd();
L22: const configPath = (0, project_fraim_paths_1.getWorkspaceConfigPath)(projectRoot);
...
L61: if (fs_1.default.existsSync(configPath)) {
L62: config = JSON.parse(fs_1.default.readFileSync(configPath, 'utf-8'));
L63: }
...
L65: if (isLocal) {
L66: const localPort = process.env.FRAIM_MCP_PORT ? parseInt(process.env.FRAIM_MCP_PORT) : (0, git_utils_1.getPort)();
L67: serverUrl = `http://localhost:${localPort}`;
```

### 9. High: Runtime Package Install
- **Category:** Source
- **Confidence:** 86.0%
- **Path:** dist/src/cli/setup/user-level-sync.js
- **Public source:** [View source](<https://unpkg.com/fraim@2.0.208/dist/src/cli/setup/user-level-sync.js>)

Package source invokes a package manager install command at runtime.

Public source snippet (untrusted):

```javascript
L95: try {
L96: (0, child_process_1.execSync)('npm install --no-audit --no-fund --no-save --no-package-lock --omit=dev', {
L97: cwd: baseDir,
```

### 10. Low: High Entropy Strings
- **Category:** Supply Chain
- **Confidence:** 55.0%

Package source contains high-entropy string patterns.

### 11. Low: Url Strings
- **Category:** Supply Chain
- **Confidence:** 65.0%

Package source contains URL literals.

### 12. Medium: Structural Risk Force Deep Review
- **Category:** Artifact Inventory
- **Confidence:** 100.0%

Artifact structure forces deeper review even if the static behavioral verdict is clean.

### 13. Low: No License
- **Category:** Manifest
- **Confidence:** 80.0%

Package manifest does not declare a clear license.

### 14. Critical: Previous Version Dangerous Delta
- **Category:** Supply Chain
- **Confidence:** 93.0%
- **Path:** dist/src/cli/commands/add-provider.js
- **Public source:** [View source](<https://unpkg.com/fraim@2.0.208/dist/src/cli/commands/add-provider.js>)

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

Public source snippet (untrusted):

```javascript
matchType = previous_version_dangerous_delta
matchedPackage = fraim@2.0.183
matchedIdentity = npm:ZnJhaW0:2.0.183
similarity = 0.692
summary = stored previous version shares package body but lacks this dangerous source file
```

## Dependencies and install lifecycle
- **Lifecycle scripts present:** No

- **Dependencies:** 20
- **Optional dependencies:** 0
- **Peer dependencies:** 0
- **Development dependencies:** 0
- **Published dependency-graph edges:** 20

### Published dependency entries
- @octokit/rest ^22.0.1 (Dependency)
- adm-zip ^0.5.16 (Dependency)
- axios ^1.7.0 (Dependency)
- chalk 4.1.2 (Dependency)
- commander ^14.0.2 (Dependency)
- cors ^2.8.5 (Dependency)
- dotenv ^16.4.7 (Dependency)
- express ^5.2.1 (Dependency)
- mongodb ^7.0.0 (Dependency)
- node-cron 4.2.1 (Dependency)
- node-edge-tts ^1.2.10 (Dependency)
- nodemailer ^8.0.3 (Dependency)
- prompts ^2.4.2 (Dependency)
- resend ^6.9.3 (Dependency)
- selfsigned ^5.5.0 (Dependency)
- semver ^7.7.4 (Dependency)
- stripe ^20.3.1 (Dependency)
- toml ^3.0.0 (Dependency)
- tree-kill ^1.2.2 (Dependency)
- xml2js ^0.6.2 (Dependency)

## Package metadata
- **Package:** fraim
- **Ecosystem:** npm
- **Version:** 2.0.208
- **Version published:** 2026-07-13T00:41:13.125Z
- **Package first seen:** 2026-07-01T15:04:54.500Z
- **Package last seen:** 2026-08-15T02:22:46.650Z
- **Known versions:** 30
- **Latest version:** 2.0.271
- **Appeal under review:** No
- **Description:** FRAIM core CLI and MCP package.
- **Maintainers:** sid.mathur
- **Runtime engines:** node: \>=16.0.0
- **Artifact files:** 178
- **Artifact unpacked size:** 1,733,084 bytes
- **Artifact signatures:** 1
- **Attestations:** No

## References
- [HTML security report](<https://firewall.lpm.dev/npm/fraim/v/2.0.208>)
