// npm 패키지
ai-engineering-harness
Engineering discipline and workflow guardrails for AI coding agents (Claude, Cursor, Codex, Gemini).
버전
7
메인테이너
1
라이선스
MIT
최초 publish
2026-06-03
publisher
davidtruong170621
tarball
1,397,606 B
AUTO-PUBLISHED·2개 버전 인덱싱됨·최근 publish: 2026-06-05
// exfil path
what is read → where it shipssteals
- ● MCP config
sends to
- ⚙ curl | bash(fetches + executes remote payload)
// offending code· @1.0.1· 3 files flagged
llm: malicious · 0.95→ 정적 분석기가 curl-pipe-bash 패턴 검출 — 설치 경로에 원격 코드 실행 형태가 그대로 드러남.
- @1.0.1··AUTO-PUBLISHED·publisher: davidtruong170621heuristic 38/100static flags 5llm malicious (0.95) via fast-tracknew-publisher:2dpublisher-handle-randomlookinghas-source-reporeads-mcp-configcurl-pipe-bashclaude-agent-config-injectionarchive-then-uploadchild-process-spawn
→ 정적 분석기가 curl-pipe-bash 패턴 검출 — 설치 경로에 원격 코드 실행 형태가 그대로 드러남.
// offending code· 3 files flaggedpatterns: 5
--- package/aih.sh (excerpt) --- #!/bin/sh # ai-engineering-harness lifecycle dispatcher — runtime/scope selection + .harness init + manual fallback # # For secure remote install with checksum verification, use: # curl -fsSL https://raw.githubusercontent.com/truongnat/ai-engineering-harness/main/install-secure.sh | sh # # For direct execution (without verification), use: # curl -fsSL https://raw.githubusercontent.com/truongnat/ai-engineering-harness/main/aih.sh | sh -s -- install set -eu REPO="truongnat/ai-engineering-harness" TARGET="." REF="main" DRY_RUN=0 FORCE=0 RUNTIME="" SCOPE="" INIT_HARNESS=0 INSTALL_CACHE=0 NO_INSTALL_CACHE=0 YES=0 VERB=install VISIBILITY="" IGNORE_STRATEGY=auto EFFECTIVE_IGNORE_STRATEGY=none UNINSTALL_REMOVE_CACHE=0 UNINSTALL_REMOVE_STATE=0 FULL_UNINSTALL=0 HARNES_IGNORE_BLOCK_START='# ai-engineering-harness start' HARNES_IGNORE_BLOCK_END='# ai-engineering-harness end' usage() { cat <<'EOF' ai-engineering-harness installer Usage: aih.sh [install] [options] aih.sh install [options] aih.sh uninstall [options] aih.sh update [options] aih.sh status [options] aih.sh doctor [options] Recommended: sh aih.sh install sh aih.sh update sh aih.sh uninstall sh aih.sh status sh aih.sh doctor Options: --target <path> Target repository (default: current directory) --runtime <name> claude | codex | cursor | gemini | generic | all | manual --scope <name> global | project (required for non-manual non-interactive) --visibility <name> privat --- package/install-secure.sh (excerpt) --- #!/bin/sh # Secure installer for ai-engineering-harness with checksum verification # Usage: curl -fsSL https://raw.githubusercontent.com/truongnat/ai-engineering-harness/main/install-secure.sh | sh set -eu REPO="truongnat/ai-engineering-harness" BRANCH="${1:-main}" TEMP_DIR=$(mktemp -d) trap "rm -rf $TEMP_DIR" EXIT echo "�� ai-engineering-harness secure installer" echo "Repository: $REPO ($BRANCH)" echo "" # Step 1: Download aih.sh echo "�� Downloading aih.sh..." curl -fsSL \ "https://raw.githubusercontent.com/$REPO/$BRANCH/aih.sh" \ -o "$TEMP_DIR/aih.sh" || { echo "❌ Failed to download aih.sh" >&2 exit 1 } # Step 2: Download checksum echo "�� Downloading checksum..." curl -fsSL \ "https://raw.githubusercontent.com/$REPO/$BRANCH/aih.sh.sha256" \ -o "$TEMP_DIR/aih.sh.sha256" || { echo "⚠️ Warning: Could not download checksum file" >&2 echo " Proceeding without verification (not recommended)" >&2 echo "" sh "$TEMP_DIR/aih.sh" "$@" exit $? } # Step 3: Verify checksum echo "✅ Verifying checksum..." cd "$TEMP_DIR" if ! sha256sum -c aih.sh.sha256 > /dev/null 2>&1; then echo "❌ Checksum verification failed!" >&2 echo " aih.sh may have been tampered with." >&2 echo " Installation aborted." >&2 exit 1 fi echo "✓ Checksum verified" # Step 4: Execute aih.sh with all passed arguments echo "" echo "�� Running aih.sh install..." echo "" sh "$TEMP_DIR/aih.sh" "$@" --- package/scripts/discover-tools.js (excerpt) --- #!/usr/bin/env node const childProcess = require("node:child_process"); const isWindows = process.platform === "win32"; function run(command, args) { return childProcess.spawnSync(command, args, { encoding: "utf8", timeout: 15000, shell: false }); } function detectCommand(command) { const detector = isWindows ? "where" : "sh"; const detectorArgs = isWindows ? [command] : ["-lc", `command -v ${command}`]; const result = run(detector, detectorArgs); if (result.status !== 0) { return { available: false }; } const location = (result.stdout || "").split(/\r?\n/).find(Boolean) || ""; return { available: true, command, location }; } function detectVersion(command, args = ["--version"]) { const result = run(command, args); if (result.status !== 0) { return null; } return (result.stdout || result.stderr || "").split(/\r?\n/).find(Boolean) || null; } function detectGitWorktree(gitInfo) { if (!gitInfo.available) { return { available: false }; } // Avoid `git worktree --help` on Windows Git — it opens git-worktree.html in a browser. const result = run("git", ["worktree", "list"]); return { available: result.status === 0, command: "git worktree", version: detectVersion("git") }; } function detectGitGrep(gitInfo) { return { available: gitInfo.available, command: "git grep" }; } function detectOptional(command, versionArgs) { const info = detectCommand(command); if (!info.availabl
