Community이미지github.com

wxyz199/local-only-file-analysis

스프레드시트, Word/PowerPoint 문서, PDF, 이미지 및 텍스트 파일을 로컬 머신에서만 분석하고, 모든 모드에서 개인 데이터(이름, 전화번호, 주소, 신분증 번호, 여권 번호, 은행카드, 이메일, 번호판, 계정 ID)를 필수적으로 마스킹하며, 클라우드 문서, 클라우드 드라이브, 지식 베이스, 온라인 변환기, OCR 서비스 또는 외부 검색으로의 업로드가 전혀 없습니다. 사용자가 통계, 추출, 프로파일링 또는 요약을 위해 로컬 파일을 전달할 때마다 사용하십시오.

local-only-file-analysis란 무엇인가요?

이 스킬은 로컬 머신에서만 파일을 분석하는 AI 에이전트 기능으로, 개인 데이터 보호를 최우선으로 합니다. 사용자가 제공한 스프레드시트, 문서, PDF, 이미지 등을 절대 클라우드로 보내지 않고 로컬 스크립트로 처리하며, 모든 분석 모드에서 이름, 전화번호, 주소, 신분증 번호 등 민감 정보를 자동 마스킹합니다. Claude Code, Cursor, Codex 등 다양한 AI 에이전트 플랫폼에서 사용 가능하며, 사용자에게 먼저 로컬 경로를 요청하고 분석 모드(일반/엄격)를 선택하게 합니다. 일반 모드는 구조와 통계 및 마스킹된 데이터 미리보기를 제공하고, 엄격 모드는 집계 지표만 제공하여 원본 텍스트가 AI 컨텍스트에 노출되지 않도록 합니다. 마스킹은 안정적인 가명(pseudonym)을 사용하여 동일한 값이 동일한 가명으로 매핑되므로 집계 및 중복 제거가 가능하며, 값-가명 매핑은 메모리에만 존재하고 디스크에 저장되지 않습니다. 또한 모든 분석 과정의 감사 시트를 생성하여 파일 무결성과 마스킹 실행 여부를 검증할 수 있습니다.

지원 대상~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/wxyz199/local-only-file-analysis/tree/HEAD

Installed? Explore more 이미지 skills: steipete/songsee, affaan-m/frontend-design, mattpocock/improve-codebase-architecture · View all 6 →

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

로컬 전용 파일 분석

목표

표(테이블) 형식, 문서, PDF 및 이미지 파일을 어떤 클라우드 서비스로도 파일이나 내용을 보내지 않고 분석하며, 모든 모드에서 개인 데이터(이름, 연락처, 주소, 신분증 번호)를 마스킹합니다. 원본 파일은 로컬 머신에서 읽기 전용으로 열리며, 추출 및 통계는 로컬 스크립트를 통해 실행되고, 모든 결과물은 로컬 작업 디렉터리 안에 보관됩니다.

1단계 — 먼저 로컬 경로 요청 (필수, 절대 생략 불가)

이 스킬이 활성화된 후 첫 문장은 분석을 시작하지 않고 로컬 경로를 요청해야 합니다. 문맥에 맞게 아래 표현을 사용하며, 네 가지 사항을 포함하세요: 아무것도 업로드되지 않음, 절대 경로 필요, 경로 복사 방법, 파일 선택기 선택 사항.

이 파일을 이 머신에서만 분석합니다. 어떤 클라우드 서비스로도 전송되지 않으며, 보고서에는 이름, 전화번호, 주소 및 신분증 번호가 마스킹됩니다. 절대 로컬 경로를 알려주세요. 예: /Users/you/Documents/ledger.xlsx 또는 D:\data\ledger.xlsx. 여러 파일은 새 줄로 구분해 주세요. 경로 복사 방법: 파일을 마우스 오른쪽 버튼으로 클릭 → "경로로 복사" (Windows), 또는 터미널에 파일을 드래그 / Finder에서 ⌥⌘C 사용 (macOS). 또는 "파일을 선택해 주세요"라고 말씀하시면 로컬 파일 대화상자를 열어 드립니다.

후속 처리:

  • 사용자가 "선택해 줘 / 대화상자 보여 줘"라고 말하면 python "<skill_dir>/scripts/pick_path.py" (다중 선택) 또는 --single 옵션을 실행합니다. 출력된 경로를 입력으로 사용합니다. 종료 코드 2는 그래픽 세션이 없음을 의미하므로 사용자에게 경로를 붙여넣도록 요청합니다.
  • 사용자가 "첨부파일이에요"라고 말하지만 경로 없이 첨부파일 카드만 있는 경우 → 다음 섹션에 따라 처리합니다. 첨부파일을 조용히 읽지 마십시오.
  • 경로를 받은 후 검증: 경로 존재, 지원되는 확장자, 적절한 파일 수 (약 10개 이상의 파일을 유형별로 그룹화).

사용자가 이미 첨부파일을 드롭한 경우

어떤 것이든 수락하기 전에 위험을 명시합니다.

한 가지 알려드리자면, 채팅에 드롭된 파일은 이미 플랫폼 서버에 저장되어 있을 수 있으므로 더 이상 완전히 로컬 경로가 아닙니다. 이 파일이 기밀 정보나 개인 데이터를 포함하는 경우, 대신 로컬 경로를 보내 주시면 디스크에서 읽어서 분석하겠습니다. 어떤 것도 이 머신을 떠나지 않습니다.

사용자가 여전히 첨부파일을 원한다면 진행하되, 전달 방식을 정직하게 표시합니다: "입력은 채팅 첨부파일에서 왔으며, 플랫폼 서버에 도달했을 수 있습니다" — 첨부파일을 "완전히 로컬"이라고 절대 말하지 마십시오.

2단계 — 사용자가 모드를 선택하도록 함

두 가지 옵션; 사용자가 선택해야 합니다. 지정되지 않은 경우 일반 모드를 사용하고 답변의 첫 줄에 모드를 명시합니다.

일반 (기본값)엄격
보고서 내용구조 + 통계 + 마스킹된 값 미리보기 (처음 N개 행, 본문 발췌)집계 지표만: 행/열 수, 유형, null이 아닌 비율, 고유 개수, 범위, 평균
원시 텍스트마스킹된 텍스트가 보고서에 포함되어 모델에 표시됨절대 표시되지 않음; 모델은 지표만 봄
적합 대상일반 내부 데이터, 의미 해석, 서면 결론고객 기록, 급여, 의료 데이터, 계약서, 기밀 자료
비용마스킹된 내용이 추론 컨텍스트에 포함됨의미 판단 불가, 통계 기반 답변만 가능

표현:

모드를 선택해 주세요: ① 일반 — 구조, 통계 및 마스킹된 미리보기를 통해 내용을 읽고 결론을 도출할 수 있습니다. ② 엄격 — 지표만 포함되며, 보고서 어디에도 원본 텍스트가 없습니다. 기본값은 일반입니다.

필수 마스킹 (모든 모드, 비활성화 불가)

마스킹은 선택 사항이 아니라 기본 동작입니다. 스크립트에는 끄기 스위치가 없으며 --mode strict는 "마스킹이 선택 사항"을 의미하지 않습니다. 엄격 모드는 마스킹 위에 "원본 텍스트 없음"을 추가로 적용합니다.

범주포함 필드결과
이름이름, 계좌 소유자, 연락처, 법정 대리인, 소유자, 담당자, 계정 관리자, 신청자, 수취인, 카드 소지자, 주주[NAME#1]
연락처휴대폰, 유선전화(지역 번호 포함), 팩스, 이메일[PHONE#1] / [EMAIL#1]
주소주소, 거주지, 우편 주소, 등록 주소, 소재지시/도는 유지, 나머지는 [ADDRESS#1]로; --mask-region은 지역도 숨김
신분증주민등록번호(18/15자리), 여권, 여행 허가증, 공무원증, 통일사회신용코드[ID#1]
금융은행 카드, 계좌 번호, 카드 번호[ACCOUNT#1]
기타 식별자자동차 번호판, 고객 번호, 직원 번호, 회원 번호, 학생 번호, 사회보장번호, 보험 증권 번호[PLATE#1] / [IDNO#1]

전달 메모에서 인용할 수 있는 세 가지 구현 원칙:

  1. 안정적인 가명(Pseudonyms). 동일한 소스 값은 항상 동일한 실행 내에서 동일한 가명으로 매핑됩니다. "Zhang이 3번 나타납니다"는 "[NAME#1]이 3번 나타납니다"가 됩니다. 카운팅, 중복 제거 및 조인은 여전히 작동하지만, 신원은 유지되지 않습니다.
  2. 디스크에 매핑 없음. 값-가명 매핑은 메모리에만 존재합니다. report.md나 manifest.json에는 포함되지 않으며, 히트 횟수만 기록됩니다.
  3. 자유 텍스트에 대한 휴리스틱. 구조화된 테이블은 열 헤더로 분류되어 열 전체가 마스킹됩니다. 본문, PDF 및 슬라이드의 자유 텍스트는 정규 표현식과 성(last name) 어휘 사전을 사용합니다 ("연락처: 홍길동", "김철수 씨"). 휴리스틱은 놓칠 수 있습니다. 특히 문맥적 단서가 없는 고립된 이름의 경우 그렇습니다. 솔직하게 말하고, 절대 "모든 것이 감지됩니다"라고 주장하지 마십시오.

시/도를 유지하는 것은 의도적입니다: 거리 주소를 노출하지 않고 지역 수준의 분석을 지원합니다. 지역 자체가 민감한 경우 --mask-region을 사용하십시오.

3단계 — 로컬에서 추출

python "<skill_dir>/scripts/local_extract.py" "/path/to/ledger.xlsx" "/path/to/report.docx" \
  --workspace ".local_analysis"

엄격 모드에는 --mode strict를 추가하고, 지역을 숨기려면 --mask-region을, 사용자 정의 패턴에는 --redact "EMP\\d{6}" (반복 가능)을 추가합니다.

출력물 (모두 --workspace 내부):

  • report.md — 마스킹된 구조 프로필 + 통계 + 미리보기; 이후 분석을 위한 유일한 입력
  • manifest.json — 파일 목록, SHA-256, 모드, masking.enabled=true, 마스킹 히트 횟수, network_used: false

콘솔에는 파일별 유형, 크기, 마스킹된 필드, 히트 횟수 및 "네트워크 요청: 0"이 출력됩니다. 그 후 로컬 파일 리더로 report.md를 읽으십시오. 스크린샷이나 온라인 OCR로 대체하지 마십시오.

4단계 — 로컬에서 계산하고, 절대 머리로 계산하지 않음

합계, 비율, 고유 개수, 정렬, 그룹화, 기간 대비 변화: 항상 로컬 스크립트로 계산합니다. 전체 데이터를 보지 않고 모델이 추정하는 것은 거의 항상 틀립니다. local_extract.py의 parse_xlsx / parse_delimited / Masker를 일회성 스크립트에서 재사용하여 계산한 후 숫자를 보고서에 작성하십시오. 가명은 그룹화하고 직접 계산할 수 있습니다. 역으로 되돌릴 필요가 없습니다.

5단계 — 감사 시트 생성

python "<skill_dir>/scripts/local_audit.py" ".local_analysis" --note "로컬에서 처리, 업로드 없음"

감사 시트는 다섯 부분으로 구성됩니다: 소스 파일 무결성(해시 재확인으로 읽기 전용, 복사본 없음 증명), 마스킹 실행(스위치 상태, 범주, 이 실행의 히트 수), 작업 산출물 목록, 라인별 적색선 검사, 결론. 종료 코드 0 = 통과, 1 = 처리 중 소스 파일 변경됨.

6단계 — 보고

결론을 먼저, 데이터를 다음에, 하나의 마무리 문장:

이 분석은 클라우드 서비스 없이 이 머신에서만 완전히 실행되었습니다. 소스 파일은 읽기 전용으로 변경되지 않았으며, 보고서는 이름, 전화번호, 주소 및 신분증 번호를 마스킹합니다(안정적인 가명). 결과물은 .local_analysis/에, 감사 시트는 audit.md에 있습니다.

적색선 (절대 트리거되지 않음)

범주금지일반적인 도구
클라우드 문서온라인 시트/문서 생성, 가져오기 또는 "편집"Tencent Docs, Kingsoft Docs, Feishu Docs 커넥터
클라우드 드라이브 / 객체 스토리지파일 또는 결과물 업로드Tencent Drive, WeDrive, 클라우드 파일 스토리지
지식 베이스라이브러리에 쓰기, URL 수집라이브러리 업로드, ima 지식 베이스
외부 검색소스 텍스트 또는 조각을 쿼리로 사용웹 검색, 페이지 스크래핑
온라인 변환 / OCR온라인 PDF 변환, 온라인 압축 풀기, 온라인 이미지 인식모든 온라인 도구, 이미지 이해 API
외부 전송파일 또는 요약을 채팅, 메일, 봇에 게시WeCom 메시지, 이메일, 회의록 업로드

예외는 단 하나: 사용자가 명시적으로 "이것은 업로드/전송되어도 괜찮습니다"라고 말한 경우입니다. 그래도 다시 한 번 확인하고 두 번째 승인을 받은 후에만 행동하십시오.

파일 유형별 로컬 경로

유형권장 로컬 경로참고 사항
.xlsx .xlsmlocal_extract.py (zip + XML 직접)다중 시트, 열 수준 마스킹; 날짜가 일련 번호로 표시될 수 있음
.csv .tsv .txt .md .json .htmllocal_extract.pyUTF-8 / GB18030 및 구분자 감지; CSV는 헤더로 마스킹
.docx .pptxlocal_extract.py (zip + XML 직접)단락, 제목 개요, 테이블, 슬라이드별 글머리 기호; 본문은 자유 텍스트 마스킹을 통해 처리
.pdflocal_extract.py로컬 workbuddy-pdf CLI가 있으면 사용, 그렇지 않으면 내장 zlib 대체 방식 사용
.png .jpg .gif .bmp .webplocal_extract.py형식, 크기, 해시만; tesseract가 있는 경우에만 로컬 OCR
.xls .doc .ppt 레거시 바이너리사용자에게 로컬에서 다시 저장하거나 로컬 편집기에서 열도록 요청내용을 추출하기 위해 온라인 변환기로 절대 보내지 않음
스캔된 PDF / 이미지 내 텍스트로컬 OCR, 또는 사용자가 내용을 받아쓰기OCR이 없으면 솔직하게 "이미지 내용을 인식할 수 없습니다"라고 말하고 두 가지 로컬 경로(OCR 설치 및 재실행 / 사용자 설명)를 제시. "비전 모델로 살펴보겠다"고 하지 마십시오. 이미지가 추론 경로에 들어가 사용자의 요청을 위반하게 됩니다.

성능 저하 규칙

  1. 로컬 스크립트가 구문 분석 가능 → 스크립트 출력 사용.
  2. 추출 가능한 텍스트 없음(스캔, 레거시 형식, 암호화됨) → 이유를 설명하고 로컬 대안(로컬에 다시 저장, 로컬 OCR, 사용자 받아쓰기) 제시.
  3. 사용자가 "지금 결과를 원해요"라고 강요 → 모드 질문으로 돌아갑니다: "현재 상태로는 통계적으로만 답변할 수 있습니다. 괜찮으신가요?"

흔한 실수

  • 경로 요청을 생략하고 채팅 첨부파일을 직접 분석: 1단계 위반.
  • report.md 전체를 답변에 붙여넣기: 보고서는 작업 문서입니다. 답변에는 결론과 핵심 숫자가 포함됩니다.
  • 엄격 모드가 마스킹을 불필요하게 만든다고 믿음: 두 차원은 독립적입니다.
  • 마스킹되지 않은 값을 콘솔이나 임시 파일에 출력하여 "데이터 보기": 어떤 것이든 기록되기 전에 마스킹이 이루어져야 합니다.
  • 머리로 계산하는 대신 로컬에서 계산하지 않음: 추정은 전체 데이터 규모에서 거의 항상 틀립니다.
  • "편의를 위해" .xls를 클라우드 변환기로 보냄: 적색선 위반; 대신 로컬에 다시 저장하십시오.
  • 인코딩 무시: GB18030 CSV를 UTF-8로 읽으면 깨진 글자(mojibake)가 발생하여 열 프로필을 오염시킵니다. 스크립트는 처리하지만, 직접 작성한 코드도 처리해야 합니다.

언어 참고 사항

감지 규칙은 중국어 데이터 형식(주민등록번호, 省/市 주소, 중국어 성)과 일반 패턴(이메일, 전화, 은행 카드, 번호판)을 대상으로 합니다. 보고서와 콘솔 출력은 현재 중국어입니다. 패턴이 허용하는 경우 감지 로직은 언어에 구애받지 않습니다. 영어 전용 문서의 경우, 구조화된 테이블 마스킹은 열 헤더를 통해 여전히 작동하지만 자유 텍스트 이름 감지는 약합니다. 과장하지 말고 솔직하게 말하십시오.

관련 스킬