회사에서 작업 폴더 구성을 도와줘. 뭔가 작업 폴더를 꾸미는 것에 대한 일반적인 추천 같은게 있을까?

좋아—회사에서 쓸 “작업 폴더”는 한 번 잘 짜두면 팀 생산성이 확 달라져요. 아래처럼 단계별로 만들면 실패 확률이 낮습니다.

1) 먼저 원칙부터 정하기 (짧고 강력한 룰 8가지)

  1. 최대 깊이 3단계 : 팀 → 프로젝트 → 작업물까지만. (깊어질수록 찾기·권한 관리가 어려워져요)

  2. 정렬되는 이름 : 접두 번호(00,10,20…) + 한글/영문 키워드.

  3. 날짜 형식 고정 : YYYY-MM-DD (예: 2025-08-26_회의록.md)

  4. 버전 규칙 : 최종본 금지. v001, v002… 또는 draft/approved 두 트랙.

  5. 원본 vs 산출물 분리 : source(편집파일) / export(배포파일).

  6. 권한 레벨 분리 : Shared(공유) / Restricted(민감·임원용) / Private(개인).

  7. 메타정보는 README에 : 폴더마다 README.md로 목적·담당·태그 기록.

  8. 아카이브 주기 : 완료 30일 후 Archive/로 이동, 1년 후 장기보관.

2) 상위 구조 선택 (3가지 중 택1 또는 하이브리드)

  • 프로젝트 중심(권장: 프로젝트형 조직)
    10_Projects/PRJ-코드_이름 아래에 표준 하위 폴더.

  • 기능 중심(권장: 기능별 팀조직)
    20_Product, 30_Design, 40_Engineering… 아래에 연간/분기 폴더.

  • 개인 작업공간 + 공유 허브(혼합형)
    90_People/홍길동/workspace는 자유롭게, 산출물만 공유 폴더로 승격.

3) 바로 쓰는 표준 템플릿

아래 트리는 대부분 회사에서 바로 적용 가능한 최소·표준 구성입니다.

/Company
├─ 00_Admin
│  ├─ 01_Policies
│  └─ 02_Templates   ← 문서/슬라이드/회의록 템플릿
├─ 10_Projects
│  └─ PRJ-2025-012_신제품출시
│     ├─ 01_Plan        ← 일정/OKR/예산
│     ├─ 02_Research    ← 리서치, 경쟁/고객 인터뷰
│     ├─ 03_Design
│     │  ├─ source
│     │  └─ export
│     ├─ 04_Build
│     ├─ 05_Test
│     ├─ 06_Release
│     ├─ 80_Meetings    ← 2025-08-26_킥오프_메모.md
│     ├─ 90_Archive
│     └─ README.md
├─ 20_Product
├─ 30_SalesMarketing
├─ 40_Engineering
├─ 50_Data
│  ├─ 01_Raw
│  ├─ 02_Processed
│  └─ 03_Reports
├─ 60_SharedAssets     ← 로고, 폰트, 컬러가이드 등 공용
├─ 70_Restricted       ← 계약서/급여/법무(권한 제한)
├─ 90_People
│  └─ 홍길동
│     ├─ workspace
│     └─ handover      ← 인수인계용
└─ 99_Archive

4) 파일·폴더 네이밍 규칙 (복붙해서 팀 규칙으로)

  • 폴더 : 10_Projects, PRJ-2025-012_신제품출시

  • 문서 : 2025-08-26_프로젝트킥오프_회의록_v001.md

  • 디자인 :

    • 원본: 홈페이지KV_v003_source.psd

    • 산출: 홈페이지KV_v003_1080x1080_export.png

  • 데이터 : 2025-08-월간DAU_v004_approved.csv

5) 폴더별 README 템플릿 (복붙)

# 폴더 목적
- 신제품 출시 프로젝트 산출물 중앙 저장소

# 담당/권한
- 오너: 홍길동(@id) / 편집 권한: PM팀, 디자인팀 / 열람: 전사

# 구조
- 01_Plan: 일정·OKR·예산
- 02_Research: 고객/경쟁 리서치
- 03_Design: source/export 분리
...

# 공통 규칙
- 파일명: YYYY-MM-DD_제목_v### (source/export 구분)
- 완료 30일 후 90_Archive로 이동
- 의사결정은 /01_Plan/ADR에 기록

6) 협업·운영 습관 (실무 팁 8가지)

  1. 결정 기록(ADR) : 중요한 결정은 /01_Plan/ADR/2025-08-26_결정_요약.md.

  2. 회의록 표준화 : 회의 목적 · 참석자 · 요약 · 액션아이템(담당/기한) 섹션 고정.

  3. 액션 아이템은 도구로 이관 : 회의록 내 체크리스트는 JIRA/Asana로 바로 링크.

  4. 링크만 저장 : SaaS 산출물(Google Docs 등)은 링크 파일 .url로 두되, 최종 PDF 도 함께 보관.

  5. 민감정보 분리 : 계약/급여/개인정보는 70_Restricted로만. 접근 로그 관리.

  6. 아카이브 의식화 : 매월 말 “폴더 다이어트” 30분—Archive로 이동 + README 갱신.

  7. 템플릿 먼저 : 새 프로젝트 시작 시 02_Templates에서 복제해 시작.

  8. 검색 친화 태그 : 파일 첫 줄에 #태그(예: #런칭 #광고 #DAU)를 넣어 검색 품질↑.

7) 역할별 미세튜닝

  • PM/기획 : /01_PlanRoadmap.xlsx, KPI_Dashboard.pdf, ADR/ 고정 폴더.

  • 디자인 : source/export, fonts/brand/refs 3분리, 내보내기 규격 프리셋 같이 저장.

  • 개발 : 코드 저장소와 산출물 폴더는 링크로 연결(docs/, release_notes/). 빌드 산출물은 06_Release.

  • 세일즈/마케팅 : campaigns/YYYY-QN/캠페인명/로 분기 관리, 모든 크리에이티브는 export에만 배포.


원하면, 당신 팀의 업종/툴 체인(예: Google Drive/OneDrive, Notion, Jira, Figma)에 맞춰 위 구조를 1:1로 커스터마이즈해서 드릴게요. “팀 구성/업무 유형/민감자료 범위”만 알려주면 곧바로 맞춤 트리 만들어줄게요.

나 혼자 쓰는 거긴 해

좋아, “혼자 쓰는 회사 작업 폴더”라면 빠른 캡처 → 쉽게 찾기 → 가벼운 유지보수 만 잘 되면 끝이에요. 아래대로 단계별 로 세팅해보세요.

1) 목표 3가지 먼저 정리

  1. 캡처 속도 : 생각/파일을 즉시 던져놓을 곳이 있어야 함(= 00_Inbox).

  2. 검색 용이 : 규칙적 네이밍 + 얕은 깊이(최대 3단).

  3. 관리 최소화 : 주 1회 아카이브만 하면 버틸 구조.

2) 추천 상위 구조 (PARA+Solo)

/Work (루트 폴더)
├─ 00_Inbox           ← 급하게 던져두는 임시함 (매일/격일 비우기)
├─ 10_Today           ← 오늘 집중: WIP, 임시 노트
├─ 20_Projects        ← 끝나면 Archive로 이동
├─ 30_Areas           ← 역할/지속업무(예: 리포트, 운영)
├─ 40_Resources       ← 참고자료(매뉴얼, 규정, 레퍼런스)
├─ 50_Snippets        ← 텍스트 스니펫/스크립트/쿼리 모음
├─ 60_Assets          ← 로고/템플릿/브랜드 리소스
├─ 70_Exports         ← 외부 전달본(PDF, PPT, 이미지)
└─ 99_Archive         ← 완료 프로젝트·옛 참고자료
  • 개념 : Projects(유한), Areas(지속), Resources(참고), Archive(보관) + 혼자쓰는 맛을 위한 Today/Inbox/Snippets/Exports.

3) 네이밍 규칙(짧고 강력)

  • 날짜 : YYYY-MM-DD (예: 2025-08-26_주간리포트.md)

  • 버전 : _v001, v002… (최종본 금지)

  • 프로젝트 폴더 : PRJ-YYYY-번호_짧은이름 (예: PRJ-2025-012_런칭준비)

  • 정렬용 접두 : 폴더는 00,10,20… 사용 (이미 반영)

4) 프로젝트 폴더 템플릿(복붙)

/20_Projects/PRJ-2025-012_런칭준비
├─ 01_Plan        ← 목표/타임라인/OKR
├─ 02_Work        ← 실작업(문서, 스프레드시트 등)
├─ 03_Meetings    ← 회의노트(날짜_제목.md)
├─ 04_Refs        ← 링크모음/연구자료(요약 필수)
├─ export         ← 대외공유본(PDF/이미지)
└─ README.md

README.md 템플릿

# 목적
- (한 줄 요약) 런칭 준비 전 과정 관리

# 범위/완료조건
- (예) 9/30까지 광고·CS·릴리즈 노트 확정

# 링크
- 기획 문서: ...
- 대시보드: ...

# 진행 현황(요약)
- 2025-08-26: 킥오프 완료, 메시지 프레임 확정

# 다음 액션(담당/기한)
- 배너 시안 v002 (나 / 08-28)

5) 개인 작업 루틴(하루·주간·월간)

매일

  1. 캡처 : 모든 파일/메모는 00_Inbox에 던지기.

  2. 집중 공간 : 당일 작업은 10_Today에서 처리(완료/중간산출물은 해당 프로젝트로 이동).

  3. 로그 : 30_Areas/worklog/2025/2025-08/2025-08-26.md에 5줄 요약.

주 1회(금요일 15분)

  • 00_Inbox 비우기 → 20_Projects 또는 40_Resources로 분류.

  • 끝난 프로젝트는 99_Archive로 이동.

월 1회(첫 영업일 20분)

  • 40_Resources 중 구식 자료는 아카이브.

  • 50_Snippets 정리(재사용 가능한 제목으로 변경).

6) 자주 쓰는 노트 템플릿 2종

회의 노트 (03_Meetings/2025-08-26_파트너_콜.md)

# 목적
# 요약(3줄)
# 결정사항
# 액션(담당/기한)
# 참고 링크

일일 작업로그 (worklog/2025/2025-08/2025-08-26.md)

## 오늘 3줄 요약
- 
## 집중 작업(링크)
- 
## 배운 점 / 이슈
- 
## 내일 첫 태스크
- 

7) 단독 사용에 딱 맞는 팁

  • 링크만 두지 말고 “최종 PDF”도 함께 export에 저장(나중에 권한 문제 방지).

  • 검색 키워드 를 문서 첫 줄에 넣기: tags: #런칭 #광고 #대시보드.

  • 스니펫 관리 : 50_Snippets/sql, 50_Snippets/text, 50_Snippets/bash로 분리.

  • 깊이는 3단 이하 만 유지(찾기 속도↓ 방지).

  • 바탕화면 금지, 북마크화면 2개 만: 00_Inbox, 10_Today.


원하면 지금 구조를 당신 이름/업무에 맞춰 바로 커스터마이즈 해서 트리까지 만들어줄게요. (예: 직무/툴—기획, 데이터, 디자인—에 맞춘 하위 폴더와 스니펫 기본 세트)

주 업무는 데스크탑 애플리케이션 툴 개발이야(파이썬 패키지 형태), 그리고 교육 자료나 논문 자료를 모을 수 있는 곳도 있으면 좋겠어. 그리고 필요한 툴 설치 공간도 있으면 좋겠어. 그리고 환경 세팅을 위한 공간도 있으면 좋겠어.

좋다—니 요구(데스크탑 앱용 파이썬 패키지 + 교육/논문 자료 + 툴 설치공간 + 환경 세팅)를 딱 맞춘 1인 개발용 작업 폴더스타터 키트 까지 만들어놨어. 바로 받아서 쓰면 돼요.

starter kit 다운로드


1) 상위 구조 (혼자 쓰는 용 + 네가 원하는 추가공간)

/Work
├─ 00_Inbox            ← 급히 던져놓는 임시함
├─ 10_Today            ← 오늘 집중(WIP)
├─ 20_Projects         ← 각 앱/도구별 프로젝트(파이썬 패키지 형식)
├─ 30_Areas
│  ├─ worklog          ← 일일/주간 로그
│  └─ environments     ← 공통 환경 메모
├─ 40_Resources
│  └─ edu              ← 교육/논문/튜토리얼 모음
│     ├─ courses
│     ├─ tutorials
│     └─ papers
│        ├─ to_read
│        ├─ reading_notes (템플릿 포함)
│        └─ summaries
├─ 50_Snippets         ← 재사용 스니펫(sql/text/bash)
├─ 60_Assets           ← 로고/템플릿 등 공용
├─ 70_Exports          ← 외부 전달용 산출물(PDF/실행파일)
├─ 80_Tools            ← 툴 설치/포터블/스크립트/devcontainer
│  ├─ installers       ← 오프라인 설치 파일 보관(체크섬 기록 권장)
│  ├─ bin              ← 포터블 실행파일
│  ├─ scripts          ← 설치 자동화 스크립트/메모
│  └─ devcontainer     ← VSCode devcontainer 등
├─ 85_Environments     ← conda/venv/docker 예시 구성
└─ 99_Archive

교육/논문: 40_Resources/edu/papers읽을거리/메모/요약 3분리 + reading_notes/TEMPLATE.md 포함.
툴 설치: 80_Tools/installers 폴더와 scripts/install_notes.md 준비.
환경 세팅: 85_Environments/conda/environment.yml, venv/README.md, docker/Dockerfile 샘플 포함.


2) 프로젝트(파이썬 패키지) 템플릿 — 바로 실행 가능

starter kit 안에 예제로 20_Projects/PRJ-2025-001_sample_app를 넣어뒀어. 구조:

PRJ-2025-001_sample_app
├─ src/sample_app       ← 패키지 소스 (CLI/GUI 엔트리 포함)
├─ tests                ← pytest 예제
├─ scripts              ← OS별 설치/실행/빌드 스크립트(.sh/.ps1)
├─ .devcontainer        ← 컨테이너 개발환경 설정
├─ pyproject.toml       ← PEP621(setuptools) + extras(dev/gui)
├─ .env.example         ← 환경변수 예시
├─ .gitignore / .editorconfig
└─ README.md

키 포인트

  • 엔트리포인트

    • CLI: sample-appsample_app.cli:main

    • GUI(선택): sample-app-guisample_app.gui:main (PySide6 필요)

  • 옵션 의존성

    • .[dev]: pytest/ruff/pyinstaller

    • .[gui]: PySide6 (원하면 설치)

  • 단일 실행파일 빌드 : PyInstaller 스크립트 내장(윈도/맥/리눅스 공통)


3) 시작 순서 (한 번만 하면 끝)

macOS / Linux

cd Work/20_Projects/PRJ-2025-001_sample_app
./scripts/install.sh         # venv 생성 + dev 의존성 설치
./scripts/run_cli.sh         # CLI 동작 확인
# GUI가 필요하면:
source .venv/bin/activate
pip install ".[gui]"
./scripts/run_gui.sh

Windows (PowerShell)

cd Work/20_Projects/PRJ-2025-001_sample_app
./scripts/install.ps1
./scripts/run_cli.ps1
# GUI 필요 시:
.\.venv\Scripts\Activate.ps1
pip install ".[gui]"
./scripts/run_gui.ps1

빌드(실행파일 만들기)

# CLI
./scripts/build_cli.sh    # dist/sample-app(또는 .exe)
# GUI
./scripts/build_gui.sh    # dist/sample-app-gui(또는 .exe)

4) 논문/교육 자료 관리 — 최소 규칙

  • PDF는/papers/to_read, 메모는 /papers/reading_notes/YYYY-MM-DD_제목.md

  • 한 달에 한 번 /summaries에 1~2페이지 요약(나중에 검색/레퍼런스로 최고)

  • 코스/튜토리얼은 /edu/courses, /edu/tutorials로 구분. 실습 산출물은 해당 프로젝트의 /docs/export로 링크


5) 환경 세팅 & 툴 설치 — 실무 루틴

  1. 툴 설치파일80_Tools/installers에 보관 + install_notes.md에 버전/체크섬 기록

  2. 개별 프로젝트마다 로컬 venv (.venv/)로 독립 관리

  3. 회사/외부 이동 대비해서 70_Exports에 최종 산출물(실행파일/PDF) 같이 남기기

  4. 컨테이너가 필요하면 85_Environments/docker/Dockerfile이나 프로젝트 내 .devcontainer 사용


6) 네이밍 요약(복붙 규칙)

  • 파일: YYYY-MM-DD_제목_v001.ext

  • 프로젝트 폴더: PRJ-연도-번호_짧은이름 예) PRJ-2025-012_GUI툴

  • 깊이: 최대 3단 유지


7) 다음 액션 (3분 컷)

  1. starter kit 압축 해제 → 원하는 위치에 /Work 배치

  2. PRJ-2025-001_sample_app을 네 프로젝트명으로 폴더/pyproject 패키지명 변경

  3. OS에 맞는 설치 스크립트 실행 후 바로 코딩 시작

필요하면 네가 쓰는 GUI 프레임워크(PySide6/PyQt/Tkinter), 배포 방식(PyInstaller/Briefcase), 테스트 전략 에 맞춰 템플릿을 더 다듬어 줄게. 원하는 스택만 알려줘—바로 적용한 버전으로 트리까지 만들어서 드릴게!

그리고 툴 개발만 하는건 아니고 그 툴을 이용해서 어떤 실제 산출물을 만들어야 할 때도 있어.

좋아—툴 개발 + 그 툴로 실제 산출물(레포트, 이미지, 패키지, 실행파일 등)까지 만드는 흐름을 깔끔하게 돌릴 수 있게 구조와 템플릿을 추가로 준비했어. (재현성·추적성·인수인계에 강함)

업데이트된 스타터(Jobs 포함) 다운로드


1) 한눈에 보는 구조 (툴 ↔ 산출물 분리)

/Work
├─ 20_Projects         ← 툴(파이썬 패키지) 개발
│   └─ PRJ-2025-001_sample_app/...
├─ 25_Jobs             ← 툴을 써서 만드는 “산출물 작업 단위”
│   └─ JOB-2025-001_sample_output/  ← 샘플 Job 포함
│      ├─ 01_Brief         요구사항/검수기준
│      ├─ 02_Input/raw     원천데이터
│      ├─ 03_Config        파라미터(yml/json)
│      ├─ 04_Run           실행 스크립트, 로그, 매니페스트
│      ├─ 05_Output        중간/최종 산출물(작업용)
│      └─ 06_Export        전달본(완성품)
├─ 40_Resources/edu     ← 교육/논문/튜토리얼
├─ 70_Exports           ← 여러 Job의 최종본 모아보기(선택)
└─ 85_Environments      ← conda/venv/docker 샘플

왜 분리하나?

  • Projects 는 코드 수명(버전·릴리즈) 중심, Jobs요구사항·입력·설정 → 결과물 이라는 프로세스 중심.

  • Job 단위로 매니페스트/체크섬이 남으니 나중에 같은 결과를 재현 하기 쉬움.


2) 실행 흐름 (Step-by-step)

  1. 툴 개발/업데이트 : 20_Projects/PRJ-...에서 기능 추가 후 .[dev] 설치.

  2. Job 생성 : 25_Jobs 아래 새 JOB-YYYY-###_이름 폴더 복제.

  3. 입력/설정 배치 : 02_Input/raw에 데이터, 03_Config/config.yml에 파라미터 작성.

  4. 실행 :

    • macOS/Linux:
      cd 25_Jobs/JOB-.../04_Run
      bash run.sh
      
    • Windows (PowerShell):
      cd 25_Jobs/JOB-.../04_Run
      ./run.ps1
      

스크립트가 run.py를 호출 → 산출물06_Export에 생성 + manifest.json / run_log.txt 기록.

  1. 검수/전달 : qa_checklist.md로 확인 → 필요 시 /Work/70_Exports에도 복사.

샘플 Job은 실제로 툴 패키지 버전(예:sample_app.__version__)을 읽어 매니페스트에 박아두고, 산출물 파일의 SHA256 체크섬 까지 저장하도록 되어 있어. (전달 후 변경 여부도 검증 가능)


3) 네이밍 & 버전 전략 (산출물용)

  • Job 코드 접두 : JOB-2025-023_캠페인A_보고서_v003.pdf

  • 세부 규칙 : JOB코드_YYYYMMDD[-run]_v###.ext

  • 툴 버전 고정 : 매니페스트에 tool_version, 파라미터 파일 경로, Python 버전, OS 정보 포함.


4) 재현성 체크리스트

  • 03_Config/config.yml에 모든 파라미터 기록

  • 입력 데이터 소스/버전 기록(가능하면 체크섬)

  • 85_Environments(conda/venv/docker) 중 하나로 환경 고정

  • 04_Run/manifest.json 자동 생성 확인

  • 랜덤 사용 시 시드 고정 및 매니페스트에 기록


5) 교육/논문 자료와 실무 연결

  • 논문을 읽고 도입한 알고리즘/기법은 해당 툴 PRJ의 /docs에 요약,
    실험·비교 결과는 개별 Job 으로 실행해 입력/설정/산출 을 남기면 논문→코드→결과 추적이 선명해짐.

  • 템플릿 포함: 40_Resources/edu/papers/reading_notes/TEMPLATE.md


6) 바로 다음 액션

  1. 압축을 풀고 /Work를 원하는 위치에 둔다.

  2. 샘플 툴 PRJ-2025-001_sample_app에서 설치 스크립트 실행 → 동작 확인.

  3. 25_Jobs/JOB-2025-001_sample_output을 복제해 너의 실제 산출물 작업에 맞춰 brief/config만 바꿔 실행.

원하면 네 도메인(예: 이미지 처리, 리포트 생성, 포맷 규격) 기준으로 Job 스캐폴드(검수 스텝·표준 파라미터·파일명 규칙)를 더 빡빡하게 커스터마이즈해서 만들어줄게.

전체 다시 보여줘

좋아! 지금까지 만든 걸 한눈에, 단계별로 싹 정리해 줄게.
(바로 쓸 수 있는 스타터 포함)

최신 스타터(툴 + Jobs 포함) 다운로드


1) 목표 3가지

  1. 빠른 캡처 : 어디서든 00_Inbox로 던져 넣기

  2. 쉽게 찾기 : 얕은 깊이(최대 3단) + 규칙적 네이밍

  3. 가벼운 유지보수 : 주 1회 정리·아카이브


2) 상위 폴더 구조(최종본)

/Work
├─ 00_Inbox               # 급히 던지는 임시함
├─ 10_Today               # 오늘 집중 작업(WIP)
├─ 20_Projects            # 툴(파이썬 패키지) 개발
│   └─ PRJ-2025-001_sample_app/...
├─ 25_Jobs                # 툴을 사용해 만드는 실제 산출 작업 단위
│   └─ JOB-2025-001_sample_output/
│      ├─ 01_Brief
│      ├─ 02_Input/raw
│      ├─ 03_Config
│      ├─ 04_Run
│      ├─ 05_Output
│      └─ 06_Export
├─ 30_Areas
│   ├─ worklog
│   └─ environments
├─ 40_Resources
│   └─ edu
│      ├─ courses
│      ├─ tutorials
│      └─ papers
│         ├─ to_read
│         ├─ reading_notes (TEMPLATE.md 포함)
│         └─ summaries
├─ 50_Snippets           # sql/text/bash 재사용 스니펫
├─ 60_Assets             # 로고·템플릿 등 공용
├─ 70_Exports            # 여러 Job 최종 전달본 모아보기(선택)
├─ 80_Tools              # 설치파일·포터블·자동화 스크립트·devcontainer
│   ├─ installers
│   ├─ bin
│   ├─ scripts
│   └─ devcontainer
├─ 85_Environments       # conda/venv/docker 샘플
└─ 99_Archive

3) 네이밍 규칙(짧고 강력)

  • 파일 : YYYY-MM-DD_제목_v001.ext

  • 프로젝트 폴더 : PRJ-연도-번호_짧은이름 → 예) PRJ-2025-012_GUI툴

  • Job 폴더 : JOB-연도-번호_짧은이름 → 예) JOB-2025-023_보고서A

  • 깊이 제한 : 최대 3단


4) 툴(파이썬 패키지) 템플릿 요약

PRJ-2025-001_sample_app
├─ src/sample_app (cli.py, gui.py, __init__.py)
├─ tests/test_smoke.py
├─ scripts/ (install/run/build/test/lint: .sh / .ps1 모두)
├─ .devcontainer/devcontainer.json
├─ pyproject.toml (extras: dev/gui, entry points 등록)
├─ .env.example, .gitignore, .editorconfig
└─ README.md
  • 엔트리포인트 :

    • CLI: sample-appsample_app.cli:main

    • GUI(옵션): sample-app-guisample_app.gui:main (PySide6)

  • 개발 편의 : .[dev]에 pytest/ruff/pyinstaller 포함

  • 단일 실행파일 : PyInstaller 스크립트 내장

시작(맥/리눅스)

cd Work/20_Projects/PRJ-2025-001_sample_app
./scripts/install.sh
./scripts/run_cli.sh
# GUI 필요 시:
source .venv/bin/activate && pip install ".[gui]" && ./scripts/run_gui.sh

시작(Windows PowerShell)

cd Work/20_Projects/PRJ-2025-001_sample_app
./scripts/install.ps1
./scripts/run_cli.ps1
# GUI 필요 시:
.\.venv\Scripts\Activate.ps1; pip install ".[gui]"; ./scripts/run_gui.ps1

빌드

./scripts/build_cli.sh     # CLI 실행파일
./scripts/build_gui.sh     # GUI 실행파일

5) 실제 산출물(Job) 파이프라인

  • 의도 : Projects(코드)와 분리해 입력→설정→실행→산출 흐름을 재현 가능 하게 관리

  • 실행 절차

    1. 02_Input/raw에 원천 데이터 배치

    2. 03_Config/config.yml에 파라미터 기록

    3. 04_Run/run.sh(또는 run.ps1) 실행

    4. 06_Export에 전달본 생성 + manifest.json/run_log.txt 출력

    5. 필요 시 70_Exports로도 복사(전사 공유)

  • 품질/추적 :

    • 매니페스트에 tool_version, Python/OS, 파라미터 파일, SHA256 체크섬 자동 저장

    • qa_checklist.md로 규격·포맷·시드 고정 점검


6) 교육/논문 자료 워크플로

  • PDF는 40_Resources/edu/papers/to_read

  • 메모는 reading_notes/YYYY-MM-DD_제목.md (템플릿 제공)

  • 1~2페이지 요약은 summaries/

  • 논문에서 채택한 아이디어는 프로젝트 /docs에 정리, 실험은 개별 Job 으로 기록(입력/설정/산출 연결)


7) 환경·툴 설치 공간 사용법

  • 80_Tools/installers: 오프라인 설치 파일 보관, 버전·체크섬scripts/install_notes.md에 메모

  • 85_Environments:

    • conda/environment.yml

    • venv/README.md

    • docker/Dockerfile (또는 프로젝트 내 .devcontainer)


8) 일/주 운영 루틴

매일

  • 모든 캡처는 00_Inbox → 당일 처리건은 10_Today

  • 작업 끝난 파일은 프로젝트 또는 Job 위치로 이동

  • 30_Areas/worklog/YYYY/YYYY-MM/날짜.md에 5줄 로그

주 1회

  • 00_Inbox 정리, 완료 Job/Project는 99_Archive

  • 70_Exports 정리(최종 전달본만 유지)


9) 바로 다음 액션(3단계)

  1. 압축 해제 후 /Work 배치

  2. 툴 템플릿 폴더/패키지명(예: sample_app)을 네 프로젝트명으로 변경

  3. 샘플 Job을 복제해 brief/config만 수정 → 04_Run 실행


필요하면 네 도메인(이미지 처리, 리포트 생성, 특정 포맷 규격 등)에 맞춰 Job 스캐폴드(검수 목록, 파라미터 스키마, 파일명 규칙)를 더 촘촘히 커스터마이즈해서 바로 쓸 버전으로 만들어줄게.

1. 만약에 배포한 툴에 대한 제보가 버그가 들어와서 이에 대해 디버깅 수행이 필요해. 2. 배포한 툴에 대한 example을 만드는 작업을 하고 싶어. 3. 새로 설치한 툴에 대한 간단한 사용법 및 feasibility 검사용 테스트를 수행하고 싶어. 4. 파이썬 문법이 헷갈려서(regex) 등을 jupyter 띄워서 간단히 테스트하고 싶어. 5. 각종 유용한 팁을 모아두고 싶어. 6. 다른 여러 곳에서 참조할만한 Resource를 모아두고 싶어(설정 파일 등) 7. Manual 파일들을 모아두고 싶어. 각각의 업무에 대해 작업해야할 폴더를 알려줘. 없다면 추가해줘

좋아! 네가 적어준 7가지 업무 각각에 대해 어디서 작업할지 + 없던 폴더는 추가 까지 다 해놨어.
바로 쓸 수 있게 템플릿과 스크립트도 넣어 업데이트된 스타터 압축본을 만들었어.

업무별 확장 스타터(Tasks Extended) 다운로드


1) “배포 툴 버그 제보” 디버깅

  • 작업 위치(재현/증거 관리)
    25_Jobs/BUG-YYYY-###_이름/
    01_Report/      # 제보 내용, 기대/실제, 환경
    02_Repro/input  # 재현용 입력/파일
    03_Config/      # 재현 파라미터(.yml/.json)
    04_Run/         # repro.py + run 스크립트(sh/ps1)
    05_Evidence/    # 로그/덤프/스크린샷/체크섬
    06_FixValidation# 패치 검증 케이스
    

샘플 생성됨: 25_Jobs/BUG-2025-001_sample_bug/ (report.md, repro.py 포함)

  • 작업 위치(코드 측 기록)
    20_Projects/PRJ-.../issues/BUG-YYYY-###/

    • triage.md: 심각도/영향/추정 원인/다음 스텝

    • fix_notes.md: 루트원인/커밋/테스트/릴리즈 계획


2) 배포한 툴의 example 제작

  • 소스 예제(프로젝트 안)
    20_Projects/PRJ-.../examples/
    data/      # 공개 가능한 소형 샘플 데이터
    scripts/   # run_*.py: 기능별 최소 예제
    docs/      # 각 예제의 기대 출력/설명
    

샘플 생성됨: examples/scripts/run_hello.py, examples/docs/hello.md

  • 예제 결과물 패키징(선택)
    실제 산출 패키지로 묶고 싶으면 Job으로 실행 :
    25_Jobs/EX-YYYY-###_툴예제/ (Job 스캐폴드 복제)

3) 새로 설치한 툴의 사용법·feasibility 스모크 테스트

  • 작업 위치
    25_Jobs/SMOKE-YYYY-###_toolname/

    • 03_Config/commands.txt에 버전 출력 등 통과 기준 명령 을 나열

    • 04_Run/smoke.sh/smoke.ps1가 순차 실행 → 결과 06_Export/에 남김
      샘플 생성됨: SMOKE-2025-001_new_tool/ (commands.txt, smoke.sh 포함)


4) 파이썬/regex 등 빠른 실험 용 Jupyter

  • 작업 위치
    31_Labs/jupyter/

    • regex_scratch.ipynb(생성됨): 소형 정규표현식 테스트 노트북

    • 실험은 작게 하고, 배운 건 30_Areas/kb로 옮겨 정리


5) 각종 유용한 팁 모음

  • 작업 위치
    30_Areas/kb/
    tips/         # 단문 팁 (python.md, regex.md 샘플 생성)
    cheatsheets/  # 한 장 요약
    howtos/       # 절차형 가이드
    
    • 라이프로그성 메모는 여기, 재사용 가능한 코드50_Snippets/에 보관

6) 여러 곳에서 참조할 Resource(설정 등) 중앙 저장소

  • 작업 위치
    40_Resources/reference/configs/
    vscode/ ruff/ pytest/ pyinstaller/ pyside6/ jupyter/
    

→ 샘플 pytest.ini, ruff.toml, jupyter_notebook_config.py 포함

  • 실제 프로젝트에서 가져다 쓸 골든 설정 은 여기서 관리하고, 각 프로젝트에는 심볼릭 링크/복사.

7) Manual 파일 모음

  • 작업 위치
    40_Resources/manuals/<벤더>/<제품>/<버전>/
    → 샘플: manuals/AcmeTool/1.0/index.md

    • PDF/HTML/마크다운 매뉴얼 정리, 루트 README.md에 규칙 설명

보너스: 빠르게 쓰는 규칙(요약)

  • Job 네이밍 :

    • 버그: BUG-2025-023_<키워드>

    • 예제: EX-2025-011_<기능>

    • 스모크: SMOKE-2025-004_<툴이름>

  • 산출 파일명 : JOB코드_YYYYMMDD_v###.ext

  • 증거 관리 : 05_Evidence에 로그/덤프/스크린샷 + SHA256 기록

  • 지식 이전 : 31_Labs → 정리되면 30_Areas/kb로 승격


원하면 니가 실제로 쓰는 툴 이름/도메인(예: 영상 처리, 리포트 생성, CAD 등)을 알려줘. 그러면 BUG/EX/SMOKE Job 템플릿을 그 도메인 규격(입력 포맷, QA 체크리스트, 파일명 규칙)으로 더 구체화해서 맞춤 스캐폴드 로 바로 내줄게.

kb가 뭐야? 이제 정리된 구조를 하나의 plain text 파일로 정리해줘. 각 폴더별로 간단한 설명을 오른쪽에 붙여주면 좋겠어. 하위 폴더 구조 예시도 같이 주고

좋아! 먼저 질문부터 답할게.

  • kb가 뭐야?
    kbknowledge base(지식 베이스)의 줄임말이야. 계속 쓰이는 팁·치트시트·가이드(How-to) 같은 축적형 지식 을 모아두는 폴더고, 우리 구조에서는 30_Areas/kb/ 아래에 tips/, cheatsheets/, howtos/로 나눠서 정리해.

요청한 대로, 전체 구조를 plain text 파일 로 만들어 두었어. 각 폴더 오른쪽에 간단 설명 이 붙어 있고, 하위 구조 예시 도 포함했어.

work_folder_structure.txt 다운로드

원본을 그대로 붙여넣어도 되지만, 파일로 받아두면 팀원에게 전송하거나 문서에 링크 걸기 편해. 필요하면 네 실제 프로젝트명/툴명으로 예시들을 자동 치환한 버전도 만들어 줄게.

그냥 본문에 써줘

아래 그대로 복붙해서 쓰면 돼요. (오른쪽은 간단 설명, 들여쓰기는 계층)

Work 폴더 구조 요약 (생성: 2025-08-26)
※ 각 줄의 오른쪽은 간단 설명, 들여쓰기는 계층을 의미합니다.

Work/ - 1인 개발용 작업 루트
  00_Inbox/ - 급히 던져두는 임시함(매일 비우기)
  10_Today/ - 오늘 집중 작업(WIP), 끝나면 제자리 이동
  20_Projects/ - 툴(파이썬 패키지) 개발 공간
    PRJ-YYYY-NNN_name/ - 단일 프로젝트(패키지) 단위
      src/ - 패키지 소스 코드
        <package_name>/ - 모듈 디렉터리(예: sample_app)
      tests/ - pytest 테스트
      scripts/ - install/run/build/lint/test 스크립트(.sh/.ps1)
      examples/ - 배포용 예제 모음
        data/ - 공개 가능한 소형 샘플 데이터
        scripts/ - run_*.py 예제 스크립트
        docs/ - 예제 설명 및 기대 출력
      .devcontainer/ - 컨테이너 개발환경 설정(devcontainer.json 등)
      pyproject.toml - 프로젝트 메타, 의존성, 엔트리포인트
      README.md - 사용법/개요
      .gitignore, .editorconfig - 개발 편의
  25_Jobs/ - 툴을 사용해 만드는 실제 산출 작업 단위
    JOB-YYYY-NNN_name/ - 일반 산출 Job(입력→설정→실행→산출)
      01_Brief/ - 요구사항/검수기준/마감
      02_Input/
        raw/ - 원천 데이터
      03_Config/ - 파라미터(yml/json), 런 설정
      04_Run/ - 실행 스크립트(run.sh/ps1, run.py), 로그
      05_Output/ - 중간/최종 산출물(작업용)
      06_Export/ - 전달본(최종 산출물)
      90_Archive/ - 완료 후 보관
    BUG-YYYY-NNN_name/ - 배포 버그 재현/증거/수정 검증 용 Job
      01_Report/ - 제보 내용, 환경, 기대/실제
      02_Repro/
        input/ - 재현에 필요한 입력
      03_Config/ - 재현 파라미터
      04_Run/ - repro.py, repro.sh/ps1, repro_log.txt
      05_Evidence/
        logs/ - 콘솔/크래시 로그, 스크린샷, 체크섬
      06_FixValidation/ - 패치 검증 케이스
    EX-YYYY-NNN_name/ - 툴 예제 산출 Job(선택, 패키징 목적)
    SMOKE-YYYY-NNN_tool/ - 새 툴 설치 후 스모크/feasibility 테스트
      01_Brief/ - 성공 기준 정의
      03_Config/ - commands.txt: 테스트 명령 목록
      04_Run/ - smoke.sh/ps1로 일괄 실행
      06_Export/ - 결과 요약(result.txt 등)
  30_Areas/ - 지속 업무 영역(Projects와 달리 계속 유지)
    worklog/ - 일일/주간 작업 로그(YYYY/YY-MM/날짜.md)
    environments/ - 공통 환경 메모/전략
    kb/ - knowledge base(지식 베이스): 팁·문서·가이드 축적
      tips/ - 단문 팁 모음(예: python.md, regex.md)
      cheatsheets/ - 한 장 요약
      howtos/ - 절차형 가이드
  31_Labs/ - 실험실 영역(가벼운 테스트/실습)
    jupyter/ - 스크래치 노트북(예: regex_scratch.ipynb)
  40_Resources/ - 참고 자료(교육/레퍼런스/매뉴얼/설정)
    edu/ - 교육·논문·튜토리얼
      courses/ - 강의/코스 자료
      tutorials/ - 튜토리얼 모음
      papers/ - 논문 관리
        to_read/ - 읽을 논문 PDF
        reading_notes/ - 논문 메모(YYYY-MM-DD_제목.md, TEMPLATE.md 포함)
        summaries/ - 1~2페이지 요약
    reference/ - 여러 곳에서 참조할 공통 리소스
      configs/ - 표준 설정(프로젝트에서 재사용)
        vscode/ - VSCode 설정
        ruff/ - ruff.toml 예시
        pytest/ - pytest.ini 예시
        pyinstaller/ - 빌드 설정 템플릿
        pyside6/ - GUI 프레임워크 관련
        jupyter/ - jupyter_notebook_config.py 예시
    manuals/ - 매뉴얼/가이드(PDF/HTML/MD)
      <vendor>/<product>/<version>/ - 버전별 정리
  50_Snippets/ - 재사용 코드/문구
    sql/ - 쿼리 스니펫
    text/ - 문서/이메일 문구
    bash/ - 쉘 스니펫
  60_Assets/ - 로고/폰트/템플릿 등 공용 리소스
  70_Exports/ - 여러 Job의 최종 전달본 모아보기(옵션)
  80_Tools/ - 툴 설치/포터블/자동화
    installers/ - 오프라인 설치 파일, install_notes.md(버전·체크섬)
    bin/ - 포터블 실행파일
    scripts/ - 설치/유틸 스크립트
    devcontainer/ - 개발 컨테이너 관련
  85_Environments/ - 개발 환경 예시
    conda/
      environment.yml - conda 환경 정의
    venv/
      README.md - 표준 venv 사용 가이드
    docker/
      Dockerfile - 개발 컨테이너 베이스
  99_Archive/ - 완료 프로젝트/Job/자료 보관

[네이밍 요약]
- 프로젝트 폴더: PRJ-연도-번호_짧은이름 (예: PRJ-2025-012_GUItool)
- Job 폴더: JOB/BUG/EX/SMOKE-연도-번호_이름
- 파일: YYYY-MM-DD_제목_v001.ext (최종본 금지, 버전 증가)
- 깊이: 최대 3단 유지

1. 내가 만든 툴을 유저들에게 배포할 장소도 있으면 좋겠어. 2. 골든 설정 뿐 아니라 내 개인 설정을 저장할 곳도 있으면 좋겠어. 두 가지를 어떻게 관리하면 될 지 알려줘. 폴더 추가가 필요하다면 추가해줘

좋아—두 가지를 깔끔하게 나누자.

1) 배포 장소 (유저에게 줄 최종물 보관)

폴더 추가

/75_Releases                         ← “배포 전용” 중앙 보관소
  /<project_slug>/                   ← 예: sample-app
    /vX.Y.Z/                         ← 릴리스 버전별
      /installers/                   ← .exe/.msi/.pkg/.dmg 등
      /wheels/                       ← Python wheel(s)
      /portable/                     ← 포터블/압축본
      /docs/                         ← 설치 가이드, README, FAQ
      /licenses/                     ← LICENSE, ThirdPartyNotices.txt
      /checksums/                    ← *.sha256 (무결성 확인)
      ReleaseNotes.md                ← 릴리스 노트
    /latest/                         ← 최신 버전(심볼릭링크 or 복사)
  catalog.json                       ← (선택) 버전/파일 목록 인덱스

운용 규칙(짧게)

  1. 빌드 산출물 은 프로젝트 내부 dist/에 생성

  2. QA 통과75_Releases/<project>/vX.Y.Z/로 복사

  3. checksums/*.sha256 생성(무결성 검증)

  4. ReleaseNotes.md와 간단 설치 가이드 /docs/ 배치

  5. latest/를 새 버전으로 갱신

  6. 외부 공유 시엔 이 경로만 링크 (프로젝트 내부 dist/는 개발용)

필요하면 25_Jobs/REL-YYYY-###_<project>_vX.Y.Z/ 형태로 릴리스 Job 을 만들어 “체크섬 생성/노트 작성/배포 복사”를 자동화하면 좋아요.


2) 개인 설정 보관 (골든 설정과 분리)

폴더 추가

/40_Resources
  /reference/configs/                ← 골든 설정(공유·문서화 대상)
    vscode/ ruff/ pytest/ jupyter/ … 
  /personal/configs/                 ← 내 PC/취향/비밀 경로(비공유)
    /os/                             ← os별 설정
      mac/  win/  linux/
    /shell/                          ← bash/zsh/powershell 프로필
      bash/ zsh/ powershell/
    /editors/                        ← VSCode, PyCharm 사용자 설정
      vscode/settings.user.json
      vscode/keybindings.user.json
    /git/                            ← .gitconfig.local 등
    /python/                         ← pip.conf, poetry.toml, pypirc
    /tools/                          ← 각종 툴 개인 프리셋
    /secrets/README.md               ← (실제 비밀은 두지 말고 안내만)
    .gitignore                       ← 개인/민감 파일 커밋 방지

레이어링(권장 패턴)

  • 골든(Base) : /40_Resources/reference/configs/...

  • 개인(Override) : /40_Resources/personal/configs/...

  • 로직/도구에서는 base + personal겹쳐 읽기(있으면 개인이 우선).

    • 예: config.yml + config.local.yml

    • VSCode: settings.json(골든) + settings.user.json(개인)

안전/편의 팁

  • personal/configs/.gitignore*.local, secrets/*, *.key, *.pem, *.p12, id_*, *token*, .env*광범위 차단

  • 진짜 비밀값은 저장하지 말고 예시만(e.g. .env.example) 남기기

  • 홈 디렉터리와 심볼릭 링크 로 연결하는 부트스트랩 스크립트를 80_Tools/scripts/bootstrap_*에 둬도 좋음

    • 예: ln -s /Work/40_Resources/personal/configs/shell/zsh/.zshrc ~/.zshrc

빠른 요약(한 줄씩)

  • 배포/75_Releases/<project>/vX.Y.Z/에 버전/체크섬/문서까지 원스톱 정리 , latest/로 최신 포인터 제공.

  • 설정 은 “공유 가능한 골든”은 /40_Resources/reference/configs/, “내 취향/개인/민감”은 /40_Resources/personal/configs/이원화 하고, 툴은 개인 설정을 덮어쓰기 레이어 로 읽게 설계.

원하면 위 구조를 네 현재 스타터에 실제 폴더/샘플 파일까지 추가한 압축본 으로 바로 만들어 줄게.

이제 마지막으로 지금까지의 모든 내용을 정리하자. 1. 최종 폴더 구조(각 폴더에 대한 설명과 예시 구조와 함께) 2. 주요 업무 flow

좋아—지금까지 만든 걸 한 번에 보기 좋게 정리했어.
필요하면 바로 복붙해서 팀 문서/Notion에 넣어도 돼.

1) 최종 폴더 구조 (설명 + 예시 하위 구조)

Work/                                - 1인 개발용 작업 루트
  00_Inbox/                          - 급히 던져두는 임시함(매일 비우기)
  10_Today/                          - 오늘 집중 작업(WIP), 끝나면 제자리 이동

  20_Projects/                       - 툴(파이썬 패키지) 개발 공간
    PRJ-YYYY-NNN_name/               - 단일 프로젝트(패키지) 단위 (예: PRJ-2025-001_sample_app)
      src/<package_name>/            - 패키지 소스(예: sample_app/)
      tests/                         - pytest 테스트
      scripts/                       - install/run/build/lint/test 스크립트(.sh/.ps1)
      examples/                      - 배포용 예제 모음
        data/                        - 공개 가능한 소형 샘플 데이터
        scripts/                     - run_*.py 예제 스크립트
        docs/                        - 예제 설명 및 기대 출력
      issues/                        - 버그/개선 이슈 노트(예: BUG-2025-001/)
      .devcontainer/                 - 컨테이너 개발환경 설정
      docs/                          - 프로젝트 문서(설계/ADR/가이드)
      pyproject.toml                 - 메타/의존성/엔트리포인트
      .gitignore, .editorconfig, README.md

  25_Jobs/                           - 툴을 사용해 만드는 “산출물 작업 단위”
    JOB-YYYY-NNN_name/               - 일반 산출 Job(입력→설정→실행→산출)
      01_Brief/                      - 요구사항/검수기준/마감
      02_Input/
        raw/                         - 원천 데이터
      03_Config/                     - 파라미터(yml/json)
      04_Run/                        - run.sh/ps1, run.py, 로그
      05_Output/                     - 중간/최종 산출물(작업용)
      06_Export/                     - 전달본(최종 산출물)
      90_Archive/                    - 완료 후 보관
    BUG-YYYY-NNN_name/               - 배포 버그 재현/증거/수정 검증 Job
      01_Report/                     - 제보 내용, 환경, 기대/실제
      02_Repro/input/                - 재현 입력
      03_Config/                     - 재현 파라미터
      04_Run/                        - repro.py + 스크립트, repro_log.txt
      05_Evidence/logs/              - 콘솔/크래시 로그·스크린샷·체크섬
      06_FixValidation/              - 패치 검증 케이스
    EX-YYYY-NNN_name/                - “툴 예제” 산출 Job(패키징 목적)
    SMOKE-YYYY-NNN_tool/             - 새 툴 설치 후 스모크/feasibility 테스트
      01_Brief/                      - 성공 기준 정의
      03_Config/                     - commands.txt: 테스트 명령 목록
      04_Run/                        - smoke.sh/ps1로 일괄 실행
      06_Export/                     - 결과 요약(result.txt 등)

  30_Areas/                          - 지속 업무(Projects와 달리 계속 유지)
    worklog/YYYY/YY-MM/날짜.md       - 일일/주간 작업 로그(5줄 요약 권장)
    environments/                    - 공통 환경 메모/전략
    kb/                              - knowledge base(지식 베이스)
      tips/                          - 단문 팁(예: python.md, regex.md)
      cheatsheets/                   - 한 장 요약
      howtos/                        - 절차형 가이드

  31_Labs/                           - 실험실(가벼운 테스트/실습)
    jupyter/                         - 스크래치 노트북(예: regex_scratch.ipynb)

  40_Resources/                      - 참고 자료(교육/레퍼런스/설정/매뉴얼)
    edu/                             - 교육·논문·튜토리얼
      courses/                       - 강의/코스 자료
      tutorials/                     - 튜토리얼 모음
      papers/                        - 논문 관리
        to_read/                     - 읽을 논문 PDF
        reading_notes/               - 메모(YYYY-MM-DD_제목.md, TEMPLATE.md)
        summaries/                   - 1~2 페이지 요약
    reference/                       - “골든” 공용 설정(공유/문서화 대상)
      configs/                       - 표준 설정 모음
        vscode/ ruff/ pytest/ pyinstaller/ pyside6/ jupyter/
    personal/                        - 개인 설정(내 PC/취향/비공개)
      configs/
        os/{mac,win,linux}/          - OS별 설정
        shell/{bash,zsh,powershell}/ - 쉘 프로필
        editors/vscode/              - settings.user.json, keybindings.user.json
        git/                         - .gitconfig.local 등
        python/                      - pip.conf, poetry.toml, pypirc
        tools/                       - 각종 도구 개인 프리셋
        secrets/README.md            - (실제 비밀은 두지 않음)
        .gitignore                   - *.local, secrets/* 등 광범위 차단
    manuals/                         - 매뉴얼/가이드(PDF/HTML/MD)
      <vendor>/<product>/<version>/  - 버전별 정리

  50_Snippets/                       - 재사용 코드/문구
    sql/ text/ bash/

  60_Assets/                         - 로고/폰트/템플릿 등 공용 리소스

  70_Exports/                        - 여러 Job의 “최종 전달본” 모아보기(옵션)

  75_Releases/                       - 유저 배포 전용 중앙 보관소
    <project_slug>/                  - 예: sample-app
      vX.Y.Z/                        - 버전별 폴더
        installers/                  - .exe/.msi/.pkg/.dmg 등
        wheels/                      - Python wheel(s)
        portable/                    - 포터블/압축본
        docs/                        - 설치 가이드, README, FAQ
        licenses/                    - LICENSE, ThirdPartyNotices.txt
        checksums/                   - *.sha256 (무결성 확인)
        ReleaseNotes.md              - 릴리스 노트
      latest/                        - 최신 버전(심볼릭 링크 또는 복사)
    catalog.json                     - (선택) 버전/파일 인덱스

  80_Tools/                          - 툴 설치/포터블/자동화
    installers/                      - 오프라인 설치 파일, install_notes.md
    bin/                             - 포터블 실행파일
    scripts/                         - 설치/유틸/부트스트랩 스크립트
    devcontainer/                    - 개발 컨테이너 관련

  85_Environments/                   - 개발 환경 예시
    conda/environment.yml
    venv/README.md
    docker/Dockerfile

  99_Archive/                        - 완료 프로젝트/Job/자료 보관

네이밍 & 버전 규칙(요약)

  • 프로젝트 폴더 : PRJ-연도-번호_짧은이름 (예: PRJ-2025-012_GUI툴)

  • Job 폴더 : JOB/BUG/EX/SMOKE-연도-번호_이름

  • 파일 : YYYY-MM-DD_제목_v001.ext (최종본 금지, 버전 증가)

  • 깊이 : 최대 3단

  • 설정 레이어링 : reference/configs(공용 골든) + personal/configs(내 오버라이드)


2) 주요 업무 Flow (핵심 단계별)

A. 툴(파이썬 패키지) 개발 → 릴리스

  1. 프로젝트 생성/진행 : 20_Projects/PRJ-...

    • ./scripts/install.(sh|ps1)로 venv + dev 의존성 설치

    • 기능 추가 → tests/에 단위 테스트, ruff로 린트

  2. 실행파일 빌드(옵션) : ./scripts/build_cli.sh / build_gui.sh

  3. 릴리스 산출 정리 : QA 통과 후 75_Releases/<project>/vX.Y.Z/

    • installers/, wheels/, portable/ + docs/, licenses/, checksums/*.sha256

    • ReleaseNotes.md 작성, latest/ 갱신

    • (선택) 25_Jobs/REL-YYYY-###_...로 릴리스 자동화 Job 운영

B. 실제 산출물 만들기(도구 사용 → 결과 전달)

  1. Job 생성 : 25_Jobs/JOB-YYYY-###_이름 복제

  2. 입력/설정 : 02_Input/raw/에 데이터, 03_Config/config.yml 작성

  3. 실행 : 04_Run/run.sh|ps1 → 결과 06_Export/, 로그·매니페스트 자동 생성

  4. 검수/전달 : qa_checklist.md 확인 → 필요 시 70_Exports/에 모아두기

  5. 재현성 확보 : 매니페스트에 툴 버전/파라미터/OS/Python/체크섬 기록

C. 배포 버그 제보 → 디버깅 → 수정 검증

  1. 수집/정리 : 25_Jobs/BUG-YYYY-###_.../01_Report/에 제보·환경·재현 절차 기록

  2. 재현 세팅 : 02_Repro/input/, 03_Config/ 구성 → 04_Run/repro.py 실행

  3. 증거 수집 : 05_Evidence/logs/에 로그·덤프·스크린샷·체크섬

  4. 코드 작업 : 20_Projects/.../issues/BUG-.../triage.md → 원인/수정 방향

  5. 검증 : 06_FixValidation/ 시나리오 통과 후 패치 릴리스(Flow A로 연결)

D. 배포 예제(example) 제작

  1. 프로젝트 내 examples/{data,scripts,docs}최소 실행 예제 작성

  2. (선택) 패키징/전달용이면 25_Jobs/EX-YYYY-###_...로 Job 화 → 재현/전달 관리

E. 새로 설치한 툴 스모크/feasibility 테스트

  1. Job 생성 : 25_Jobs/SMOKE-YYYY-###_tool/

  2. 명령 정의 : 03_Config/commands.txt(예: tool --version)

  3. 실행 : 04_Run/smoke.sh|ps106_Export/result.txt

  4. 판정 : 성공 기준(시간/종료코드/출력) 충족 확인

F. 빠른 실험(정규표현식·파이썬 문법 등)

  1. 스크래치 : 31_Labs/jupyter/regex_scratch.ipynb 등에서 작게 실험

  2. 지식화 : 유효한 내용은 30_Areas/kb/{tips,cheatsheets,howtos}로 승격 정리

G. 지식/설정 자산화(골든 vs 개인)

  • 골든 설정 : 40_Resources/reference/configs/에서 공유 가능한 표준 을 관리

  • 개인 설정 : 40_Resources/personal/configs/에 내 취향/PC별 설정 저장

  • 레이어링 원칙 : 도구가 base(골든) + personal(오버라이드)를 함께 읽도록 설계

  • 부트스트랩 : 80_Tools/scripts/에 심볼릭 링크/복사 스크립트 두고 환경 신속 반영

H. 매뉴얼/레퍼런스/교육자료 관리

  • 논문/교육 : 40_Resources/edu/에서 to_read → reading_notes → summaries 흐름

  • 매뉴얼 : 40_Resources/manuals/<vendor>/<product>/<version>/에 버전별 정리

  • 공통 참조 리소스 : 40_Resources/reference/(골든)와 personal/(개인)를 구분

I. 일상 운영 루틴

  • 매일 : 캡처는 00_Inbox → 당일 작업은 10_Today에서 처리 → 제자리 이동

  • 주 1회 : 00_Inbox 비우기, 완료 Job/Project는 99_Archive로 이동, 70_Exports 정리

  • 월 1회 : 40_Resources/edu/kb 정리, 불용 자료 아카이브


필요하면 네 환경/도메인(예: 영상·리포트·CAD) 기준으로 Job 템플릿의 QA 체크리스트/파일명 규격/파라미터 스키마 를 더 촘촘히 커스터마이즈해서 바로 쓸 버전으로 만들어줄게.

근데 31_Labs랑 25_Jobs/SMOKE*랑 역할이 겹치진 않나?

좋은 질문! 둘이 살짝 겹쳐 보이지만 목적·형식·보존성 이 다릅니다. 아래처럼 쓰면 깔끔해요.

결론 먼저

  • 31Labs** = _개인용 스크래치 공간. 빨리 시도하고 버려도 되는 **짧은 실험(regex, 파이썬 문법, 라이브러리 API 감 잡기).

  • 25Jobs/SMOKE-** * = _재현 가능한 점검 공간. **새로 설치한 툴의 동작 확인/feasibility증거와 함께 남기는 공식 스모크 테스트.


언제 어디에? (결정 규칙)

  1. 5분/50줄 규칙

    • 5분 내, 50줄 이하의 즉흥 테스트 → 31_Labs

    • 설치·환경 의존, 통과 기준/로그/결과를 남겨야 함 → SMOKE Job

  2. 재현 필요? 공유 필요?

    • “나만 잠깐 확인” → 31_Labs

    • “나중에 또 돌리거나 증빙/비교 필요” → SMOKE Job

  3. 입력/설정/출력 구조가 필요?

    • 필요 없음(메모성/코드 조각) → 31_Labs

    • 필요 있음(명령 목록, 로그, 결과물, 매니페스트) → SMOKE Job


역할 차이 한눈에

구분 31_Labs 25_Jobs/SMOKE-*
목적 빠른 실험, 개념 확인 설치 검증/feasibility, 재현/증빙
형식 자유(노트북/스크립트) 정형(입력·설정·실행·결과 폴더)
결과 버려도 됨, 요약만 kb로 승격 로그/결과/체크섬·통과기준 보존
공유성 개인 중심 공유·재사용 전제
regex 패턴, pandas 한 줄 테스트 tool --version·샘플 실행·성능 스냅샷

충돌/중복을 피하는 운용 룰

  • 프로모션 사다리 : 31_Labs에서 시작 → “재현/공유 필요” 판단되면 SMOKE Job으로 승격

    1. 25_Jobs/SMOKE-YYYY-###_<tool>/ 생성

    2. Labs에서 확인한 명령들을 03_Config/commands.txt로 옮김

    3. 기대 출력/성공 기준을 01_Brief/brief.md에 명시

    4. 04_Run/smoke.sh|ps1 실행 → 06_Export/result.txt와 로그로 증빙

  • 보존 정책 : 31_Labs 산출물은 7일 이내

    • 지식은 30_Areas/kb/{tips, cheatsheets, howtos}

    • 재현 테스트는 SMOKE Job 으로

    • 나머지는 삭제/아카이브

  • 네이밍 :

    • Labs 노트북: YYYY-MM-DD_topic.ipynb

    • SMOKE Job: SMOKE-YYYY-###_<tool> + 결과 파일 result.txt, 로그 run_log.txt


폴더 배치(최종 권장)

  • 31_Labs/jupyter/

    • regex_scratch.ipynb (짧은 패턴/문법 테스트)

    • proto_*.ipynb (짧은 실험들)

  • **25Jobs/SMOKE-YYYY-### /**

    • 01_Brief/ (성공 기준)

    • 03_Config/commands.txt (검증 명령 리스트)

    • 04_Run/smoke.sh|ps1 (일괄 실행)

    • 06_Export/result.txt + 로그/매니페스트(증빙)


예시 시나리오

  • “ffmpeg 새 버전 깔았는데 옵션 잘 먹나?”

    • Labs에서 옵션 한두 개 즉석 확인 → 정상이라도 SMOKE Job 으로 승격해 ffmpeg -version, 샘플 변환 1건, 처리시간, 출력 해시까지 기록.
  • “정규식 lookbehind 기억 안 나네?”

    • Labs 노트북 에서 바로 테스트 → 유용한 패턴은 kb/regex.md에 추가.

미니멀을 원한다면

  • 31_Labs를 완전히 없애고 모든 검증을 SMOKE로만 해도 됩니다. 다만 초기 탐색 속도는 떨어져요.

  • 반대로 간단히 하고 싶다면, “설치 검증/증빙이 필요한 것만 SMOKE, 나머지는 Labs”로 유지하는 게 보통 가장 효율적입니다.

원하면 Labs→SMOKE 자동 승격 스크립트(노트북 코드 블록을 commands.txt로 변환, Job 스켈레톤 생성)도 만들어 줄게.

kb 대신 한국인이 쉽게 이해할만한 쉬운 단어 추천해주고, 폴더 구조 다시 한 번 자세히 설명해줘. 몇몇 라인에 대한 설명이 빠져 있는것 같아

좋은 포인트! 먼저 kb 대체어부터 정리하고, 그다음 폴더 구조를 한 줄도 빠짐없이 상세 설명 으로 다시 써줄게.

kb 대체어(한국어)

  • 1순위 추천: 노하우 — 가장 직관적이고 짧음

  • 대안: 지식창고 , 메모모음 , 가이드북
    → 아래 구조에서는 30_Areas/kb30_Areas/노하우로 바꿔서 표기할게.


최종 폴더 구조 (설명 + 예시 하위 구조 포함)

Work/                                - 1인 개발용 작업 루트(모든 업무의 최고 루트)
  00_Inbox/                          - 급히 던져두는 임시함(매일/주 1회 비우기)
  10_Today/                          - 오늘 집중 작업(WIP) 임시 거점(끝나면 제자리로 이동)

  20_Projects/                       - 툴(파이썬 패키지) 개발 공간(코드 수명 중심)
    PRJ-YYYY-NNN_name/               - 개별 프로젝트(예: PRJ-2025-001_sample_app)
      src/<package_name>/            - 패키지 소스(예: sample_app/)
      tests/                         - pytest 테스트 케이스
      scripts/                       - install/run/build/lint/test 스크립트(.sh/.ps1)
      examples/                      - 배포용 예제(최소 실행 가능 샘플)
        data/                        - 공개 가능한 소형 샘플 데이터
        scripts/                     - run_*.py 예제 스크립트
        docs/                        - 예제 설명·기대 출력
      issues/                        - 버그/개선 이슈 노트(예: BUG-2025-001/)
      docs/                          - 설계 문서/ADR/가이드
      .devcontainer/                 - 컨테이너 개발환경(devcontainer.json 등)
      pyproject.toml                 - 메타/의존성/엔트리포인트(PEP 621)
      .gitignore, .editorconfig, README.md - 개발 편의·개요

  25_Jobs/                           - 툴을 사용해 만드는 “산출물 작업 단위”(프로세스 중심)
    JOB-YYYY-NNN_name/               - 일반 산출 Job(입력→설정→실행→산출)
      01_Brief/                      - 요구사항/수락 기준/마감 명시
      02_Input/
        raw/                         - 원천 데이터(읽기 전용 보관)
      03_Config/                     - 파라미터(yml/json), 실행 설정
      04_Run/                        - run.sh|ps1, run.py, 실행 로그
      05_Output/                     - 중간/최종 산출물(작업 영역)
      06_Export/                     - 전달본(최종 산출물)
      90_Archive/                    - 완료 후 장기 보관
    BUG-YYYY-NNN_name/               - 배포 버그 재현/증거/수정 검증 Job
      01_Report/                     - 제보 내용·환경·기대/실제 기록
      02_Repro/input/                - 재현에 필요한 입력 샘플
      03_Config/                     - 재현 파라미터·플래그
      04_Run/                        - repro.py + 스크립트, repro_log.txt
      05_Evidence/logs/              - 콘솔/크래시 로그·스크린샷·체크섬
      06_FixValidation/              - 패치 검증 시나리오/결과
    EX-YYYY-NNN_name/                - “툴 예제”를 패키징·배포하기 위한 Job(선택)
    SMOKE-YYYY-NNN_tool/             - 새 툴 설치 후 스모크/feasibility 테스트
      01_Brief/                      - 성공 기준(시간·종료코드·출력) 정의
      03_Config/                     - commands.txt: 검증 명령 목록
      04_Run/                        - smoke.sh|ps1로 일괄 실행(로그 남김)
      06_Export/                     - 결과 요약(result.txt 등)

  30_Areas/                          - 지속 업무(장기 유지되는 영역)
    worklog/YYYY/YY-MM/날짜.md       - 일일/주간 작업 로그(5줄 요약 권장)
    environments/                    - 공통 환경 메모/전략(예: Python 버전 정책)
    노하우/                          - Knowledge Base(축적형 지식, ‘kb’ 대체)
      팁/                             - 단문 팁(예: python.md, regex.md)
      요약표/                         - 한 장짜리 치트시트
      가이드/                         - 절차형 How-to(설치/배포/디버깅 절차)

  31_Labs/                           - 실험실(짧은 테스트/프로토타입; 재현 불필수)
    jupyter/                         - 스크래치 노트북(예: regex_scratch.ipynb)

  40_Resources/                      - 참고 자료(교육/레퍼런스/설정/매뉴얼)
    edu/                             - 교육·논문·튜토리얼
      courses/                       - 강의·코스 자료(슬라이드/노트)
      tutorials/                     - 튜토리얼 모음(링크/코드)
      papers/                        - 논문 관리(읽기→메모→요약 흐름)
        to_read/                     - 읽을 논문 PDF
        reading_notes/               - 메모(YYYY-MM-DD_제목.md, TEMPLATE.md 포함)
        summaries/                   - 1~2페이지 요약본
    reference/                       - “골든” 공용 설정(공유·문서화 대상)
      configs/                       - 표준 설정 모음(프로젝트에서 재사용)
        vscode/ ruff/ pytest/ pyinstaller/ pyside6/ jupyter/ - 도구별 샘플
    personal/                        - 개인 설정(내 PC/취향/비공개)
      configs/
        os/{mac,win,linux}/          - OS별 설정(예: 키보드/언어)
        shell/{bash,zsh,powershell}/ - 쉘 프로필(.zshrc/.bashrc 등)
        editors/vscode/              - settings.user.json, keybindings.user.json
        git/                         - .gitconfig.local 등
        python/                      - pip.conf, poetry.toml, pypirc
        tools/                       - 각종 도구 개인 프리셋
        secrets/README.md            - (실제 비밀은 두지 말고 안내만)
        .gitignore                   - *.local, secrets/*, *.pem 등 광범위 차단
    manuals/                         - 매뉴얼/가이드(PDF/HTML/MD)
      <vendor>/<product>/<version>/  - 벤더/제품/버전별 정리

  50_Snippets/                       - 재사용 코드·문구 조각
    sql/ text/ bash/                 - 카테고리별 스니펫

  60_Assets/                         - 로고/폰트/템플릿·브랜딩 리소스

  70_Exports/                        - 여러 Job의 “최종 전달본” 뷰(모아보기; 선택)

  75_Releases/                       - 유저 배포 전용 중앙 보관소(버전별)
    <project_slug>/                  - 예: sample-app
      vX.Y.Z/                        - 특정 버전 릴리스
        installers/                  - .exe/.msi/.pkg/.dmg 등 설치 프로그램
        wheels/                      - Python wheel(s)
        portable/                    - 포터블/압축 패키지
        docs/                        - README/설치 가이드/FAQ
        licenses/                    - LICENSE/ThirdPartyNotices.txt
        checksums/                   - *.sha256(무결성 검증용)
        ReleaseNotes.md              - 릴리스 노트(변경 사항)
      latest/                        - 최신 버전 포인터(심볼릭 링크/복사)
    catalog.json                     - (선택) 버전·파일 인덱스

  80_Tools/                          - 툴 설치/포터블/자동화 스크립트
    installers/                      - 오프라인 설치 파일 + install_notes.md
    bin/                             - 포터블 실행 파일(로컬 PATH로 연결 가능)
    scripts/                         - 설치·부트스트랩·유틸 스크립트
    devcontainer/                    - 개발 컨테이너 도구(공유 템플릿)

  85_Environments/                   - 개발 환경 예시(고정·재현 목적)
    conda/environment.yml            - conda 환경 정의
    venv/README.md                   - 표준 venv 사용 가이드
    docker/Dockerfile                - 개발 컨테이너 베이스 이미지

  99_Archive/                        - 완료 Project/Job/자료 장기 보관(읽기 전용)

네이밍·운용 규칙(요약)

  • 프로젝트 폴더 : PRJ-연도-번호_짧은이름 (예: PRJ-2025-012_GUI툴)

  • Job 폴더 : JOB/BUG/EX/SMOKE-연도-번호_이름

  • 파일명 : YYYY-MM-DD_제목_v001.ext (최종본 대신 버전 넘김)

  • 깊이 제한 : 최대 3단(찾기/권한/동기화 이슈 최소화)

  • 설정 레이어링 : reference/configs(골든) + personal/configs(개인 오버라이드)

  • Labs ↔ SMOKE 경계 : 5분/50줄 규칙—짧은 실험은 31_Labs, 재현·증빙 필요 시 SMOKE Job으로 승격

필요하면 위 구조에서 노하우 하위 폴더 이름(예: Tip, 요약표Cheatsheets)을 영문으로 바꾼 변형판도 같이 정리해 줄게.

응 영문으로 바꿔줘. 그리고 10_Today는 어떻게 쓰는거야? 내가 작업하는 것을 mv로 여기로 가져와?

좋아! 요청대로 한국어 폴더명 → 영어 로 바꾸고, 10_Today의 실제 운용도 단계별로 정리해줄게.


1) 영어로 바꾼 최종 폴더 구조 (설명 + 예시 하위)

Work/                                - Solo dev workspace root
  00_Inbox/                          - Quick dump inbox (clear daily/weekly)
  10_Today/                          - Today's focus staging area (WIP dashboard)

  20_Projects/                       - Tool (Python package) development (code lifecycle)
    PRJ-YYYY-NNN_name/               - One project/package (e.g., PRJ-2025-001_sample_app)
      src/<package_name>/            - Package source (e.g., sample_app/)
      tests/                         - Pytest cases
      scripts/                       - install/run/build/lint/test (.sh/.ps1)
      examples/                      - Minimal runnable examples for users
        data/                        - Small public/sample datasets
        scripts/                     - run_*.py example scripts
        docs/                        - Example docs & expected outputs
      issues/                        - Bug/feature notes (e.g., BUG-2025-001/)
      docs/                          - Design docs/ADR/guides
      .devcontainer/                 - Dev container config
      pyproject.toml                 - Metadata/deps/entry points (PEP 621)
      .gitignore, .editorconfig, README.md

  25_Jobs/                           - Real deliverable runs (process lifecycle)
    JOB-YYYY-NNN_name/               - General job (input → config → run → outputs)
      01_Brief/                      - Requirements/acceptance criteria/deadline
      02_Input/
        raw/                         - Source data (read-only)
      03_Config/                     - Params (yml/json) & run settings
      04_Run/                        - run.sh|ps1, run.py, logs
      05_Output/                     - Intermediate/final (working area)
      06_Export/                     - Final deliverables for hand-off
      90_Archive/                    - Long-term storage after completion
    BUG-YYYY-NNN_name/               - Distributed-binary bug repro & fix validation
      01_Report/                     - Report/env/expected vs actual
      02_Repro/input/                - Minimal repro inputs
      03_Config/                     - Repro flags/params
      04_Run/                        - repro.py + scripts, repro_log.txt
      05_Evidence/logs/              - Console/crash logs, screenshots, checksums
      06_FixValidation/              - Post-fix validation scenarios
    EX-YYYY-NNN_name/                - Packaged examples job (optional)
    SMOKE-YYYY-NNN_tool/             - New tool smoke/feasibility tests
      01_Brief/                      - Pass criteria (time/exit-code/output)
      03_Config/                     - commands.txt (test commands)
      04_Run/                        - smoke.sh|ps1 (batch run, logs)
      06_Export/                     - Result summary (result.txt)

  30_Areas/                          - Ongoing areas (long-lived)
    worklog/YYYY/YY-MM/DATE.md       - Daily/weekly 5-line logs
    environments/                    - Common env strategy (e.g., Python policy)
    knowledge_base/                  - Accumulated knowledge (was 'kb/노하우')
      tips/                          - Short tips (e.g., python.md, regex.md)
      cheatsheets/                   - One-pagers
      howtos/                        - Step-by-step guides (install/release/debug)

  31_Labs/                           - Scratch lab (quick experiments; non-repro)
    jupyter/                         - Scratch notebooks (e.g., regex_scratch.ipynb)

  40_Resources/                      - References (education/configs/manuals)
    edu/                             - Courses/tutorials/papers
      courses/                       - Course slides/notes
      tutorials/                     - Tutorial links & code
      papers/                        - Paper flow (to_read → notes → summaries)
        to_read/                     - PDFs queued to read
        reading_notes/               - Notes (YYYY-MM-DD_Title.md, TEMPLATE.md)
        summaries/                   - 1–2 page summaries
    reference/                       - “Golden” shared configs (documented, reusable)
      configs/                       - Standard configs used across projects
        vscode/ ruff/ pytest/ pyinstaller/ pyside6/ jupyter/
    personal/                        - Private/personal configs (override layer)
      configs/
        os/{mac,win,linux}/          - OS-level settings
        shell/{bash,zsh,powershell}/ - Shell profiles
        editors/vscode/              - settings.user.json, keybindings.user.json
        git/                         - .gitconfig.local, etc.
        python/                      - pip.conf, poetry.toml, pypirc
        tools/                       - Personal presets per tool
        secrets/README.md            - (Pointers only; no real secrets)
        .gitignore                   - Broad ignore (e.g., *.local, secrets/*, *.pem)

    manuals/                         - Product manuals (PDF/HTML/MD)
      <vendor>/<product>/<version>/  - Vendor/product/version tree

  50_Snippets/                       - Reusable snippets
    sql/ text/ bash/

  60_Assets/                         - Logos/fonts/templates & brand assets

  70_Exports/                        - Collected final deliverables (across jobs; optional)

  75_Releases/                       - Distribution hub for users (versioned)
    <project_slug>/
      vX.Y.Z/
        installers/                  - .exe/.msi/.pkg/.dmg
        wheels/                      - Python wheels
        portable/                    - Portable/zip packages
        docs/                        - README/install guide/FAQ
        licenses/                    - LICENSE/ThirdParty notices
        checksums/                   - *.sha256 (integrity)
        ReleaseNotes.md              - Changelog per release
      latest/                        - Pointer to current version
    catalog.json                     - (Optional) index of versions/files

  80_Tools/                          - Installers/portable/tools automation
    installers/                      - Offline installers + install_notes.md
    bin/                             - Portable binaries (optional PATH)
    scripts/                         - Bootstrap/utility scripts
    devcontainer/                    - Dev container tooling

  85_Environments/                   - Reproducible dev env samples
    conda/environment.yml
    venv/README.md
    docker/Dockerfile

  99_Archive/                        - Completed projects/jobs/resources (read-only)

2) 10_Today는 어떻게 쓰나? (step-by-step 운용법)

결론

  • 정답은 “여기로 ‘이동(mv)’해서 작업하지 않는다.”

  • 10_Today대시보드/런치패드 야. 원본은 항상 제자리(Projects/Jobs/Resources)에 두고, Today에는 링크/체크리스트/임시 메모 만 둬.

추천 방식 3가지

A) 링크 모드(권장) — 원본은 제자리, Today엔 바로가기(심볼릭 링크/바로가기 파일)

  • macOS/Linux:
    cd Work/10_Today
    ln -s ../20_Projects/PRJ-2025-001_sample_app/README.md README.today.md
    ln -s ../25_Jobs/JOB-2025-010_report/04_Run/run.sh job_run.sh
    
  • Windows (PowerShell; 관리자/개발자 모드 권장):
    cd Work\10_Today
    cmd /c mklink README.today.md ..\20_Projects\PRJ-2025-001_sample_app\README.md
    cmd /c mklink job_run.ps1 ..\25_Jobs\JOB-2025-010_report\04_Run\run.ps1
    
  • 장점: 경로 일관성, 중복/충돌 없음.

B) 인덱스 모드(가볍게) — Today에는 today.md만 두고 작업 링크 를 모음

# 2025-08-26
- [Run job](../25_Jobs/JOB-2025-010_report/04_Run/run.sh)
- [Spec](../20_Projects/PRJ-2025-001_sample_app/docs/spec.md)
- Notes: ...

C) 스테이징 모드(예외적) — 아주 잠깐 필요한 임시 파일 만 복사해서 사용하고, EOD(End Of Day)에 원위치 이동/삭제

  • 규칙: 코드 리포/입력 데이터의 정본은 절대 이동 금지. 혼선/충돌 위험 큼.

하루 루틴(10_Today 중심)

  1. 아침 5분 : 10_Today/today.md 업데이트(Top 3, 주요 링크, 간단 체크리스트).

  2. 작업 중 : 링크/노트를 Today에 추가. 실제 파일 편집은 원래 폴더 에서.

  3. 업무 종료 전 5분 :

    • PR/커밋/아카이브는 본 위치에서 마무리

    • Today의 임시 파일 삭제, today.md에 결과 요약 3줄

    • 남길 내용은 30_Areas/knowledge_base나 해당 Project/Job의 README로 승격.

Do / Don’t

  • Do : 링크/노트/짧은 To-Do, 오늘만 쓸 임시 스크립트

  • Don’t : 장기 보관, 깊은 하위 폴더, 정본 파일 이동


필요하면 10_Today/today.md 템플릿이나 링크 생성/정리 자동화 스크립트(오늘 할 일 → 링크 묶음 생성)를 만들어줄게.

그러면 PRJ 폴더 채로 링크하거나 하진 마?

짧은 답: 웬만하면 PRJ 폴더 “통째로” Today에 링크하지 않는 걸 추천 해.
대신 “핵심 핸들(README, run 스크립트, 현재 작업 파일/노트, Export 폴더)”만 걸어두는 게 안전하고 깔끔해.


왜 통째 링크를 비추하나 (step-by-step)

  1. 혼선 위험 : Today에서 열어놓고 작업하다가 “여기가 진짜 루트”처럼 느껴져서 경로가 꼬이거나 불필요한 새 파일이 Today 쪽에 생길 수 있어.

  2. 도구/인덱싱 문제 : IDE, 검색 인덱서, 백업 툴이 원본+링크를 중복 스캔 해서 속도 저하/중복 결과가 나올 수 있어.

  3. 대청소 사고 방지 : Today는 매일/주기적으로 비우는 공간인데, 폴더 통째 링크는 삭제/이동 실수 의 표면적을 넓혀. (링크만 지워도 되지만 헷갈리기 쉬움)

  4. 불필요한 깊이 : Today는 “대시보드”라서 얕고 가벼워야 해. 통째 링크는 Today를 다시 트리로 만들어 버림.


그러면 어떻게? (권장 패턴)

1) “핵심 핸들” 링크만 둔다

  • 프로젝트당 3~5개 정도:

    • README.md (프로젝트 개요/체크리스트)

    • scripts/run.sh 또는 04_Run/run.sh (자주 돌리는 엔트리)

    • 오늘 편집할 문서 1개 (예: docs/spec.md)

    • 산출 확인용 06_Export/ 폴더 (있으면)

  • macOS/Linux
    cd Work/10_Today
    ln -s ../20_Projects/PRJ-2025-001_sample_app/README.md PRJ1_README.md
    ln -s ../20_Projects/PRJ-2025-001_sample_app/scripts/run.sh PRJ1_run.sh
    ln -s ../25_Jobs/JOB-2025-010_report/04_Run/run.sh JOB10_run.sh
    ln -s ../25_Jobs/JOB-2025-010_report/06_Export JOB10_Export
    
  • Windows (PowerShell, 관리자 권장)
    cd Work\10_Today
    cmd /c mklink PRJ1_README.md ..\20_Projects\PRJ-2025-001_sample_app\README.md
    cmd /c mklink PRJ1_run.ps1 ..\20_Projects\PRJ-2025-001_sample_app\scripts\run.ps1
    cmd /c mklink /D JOB10_Export ..\25_Jobs\JOB-2025-010_report\06_Export
    

2) 인덱스 노트 1장만 두고 링크 모음

  • 10_Today/today.md에 그날 핸들 링크만 나열: ```md

    2025-08-26

3) 예외적으로 폴더 링크가 꼭 필요하다면

  • 일시적으로만 쓰고 EOD에 정리.

  • OS별 권장:

    • macOS: Finder Alias(자동 추적에 강함) 또는 ln -s(CLI 친화)

    • Windows: mklink /D(디렉터리 심볼릭 링크) 또는 .lnk 바로가기(GUI 용이)

  • 주의 : VSCode 등 일부 도구는 심볼릭 루트로 연 프로젝트 에서 경로/디버깅이 살짝 헷갈릴 수 있으니, 가능하면 원본 경로를 워크스페이스 루트 로 여는 걸 추천.


Today 운영 미니 규칙

  • 5분/3핸들 룰 : 아침에 3개 내외 핸들만 걸고, 퇴근 전 정리.

  • 정본 불가침 : 코드/데이터의 정본은 항상 원래 위치(Projects/Jobs/Resources). Today에는 링크·체크리스트·임시 메모만.

  • 주 1회 리셋 : 쓰지 않는 링크/임시 파일 제거.


요약

  • 통째 링크? 기본은 No.

  • 대안 : “핵심 핸들”만 Today에 링크하거나, today.md로 링크 인덱스 관리.

  • 예외 : 정말 필요하면 일시적으로 폴더 링크를 쓰되, EOD에 반드시 정리하고 원본 루트로 작업 여는 습관 유지.

근데 그럴거면 링크 만드는게 더 일일거 같은데. md에 저장해봐야 주로 console에서 작업을 하는데 별 편의적으로는 도움이 안될거 같고 그냥 메모용 정도로 쓰는건가

맞아—링크 만들고 md 편집하는 게 오히려 일이면 안 쓰게 돼요. 그럴 땐 콘솔 중심 으로 10_Today를 “대시보드 명령팔레트”로 쓰면 딱 좋아요. 링크/MD 없이, 단 하나의 스크립트 + 짧은 목록 파일 로 오늘 할 일을 실행하게요.

아래 중 하나(또는 둘 다)로 가자:


옵션 A) today 단일 스크립트 + 간단 목록 파일 (가장 추천)

1) 목록 파일(편집만 하면 됨)

Work/10_Today/shortcuts.list (형식: 라벨 | 경로(Work 기준) | 명령)

# 예시
Run PRJ tests          | 20_Projects/PRJ-2025-001_sample_app        | ./scripts/test.sh
Build GUI              | 20_Projects/PRJ-2025-001_sample_app        | ./scripts/build_gui.sh
Re-run sample JOB      | 25_Jobs/JOB-2025-001_sample_output/04_Run  | ./run.sh
Open JOB export        | 25_Jobs/JOB-2025-001_sample_output/06_Export | ls -al

2) Bash/Zsh용 today (의존성 없음: select 메뉴)

Work/10_Today/today:

#!/usr/bin/env bash
set -euo pipefail
W="${WORK_DIR:-$HOME/Work}"
LIST="$W/10_Today/shortcuts.list"
[[ -f "$LIST" ]] || { echo "No shortcuts.list"; exit 1; }

mapfile -t ITEMS < <(grep -v '^\s*#' "$LIST" | sed '/^\s*$/d')
PS3="today> "
select CH in "${ITEMS[@]}" "Edit shortcuts"; do
  if [[ "$REPLY" -eq $((${#ITEMS[@]}+1)) ]]; then ${EDITOR:-vi} "$LIST"; continue; fi
  IFS='|' read -r LABEL REL CMD <<<"$CH"
  DIR="$W/$(echo "$REL" | xargs)"
  (cd "$DIR" && eval "$CMD")
  break
done

실행권한: chmod +x Work/10_Today/today
사용: ~/Work/10_Today/today

빠른 추가용 pin 함수(콘솔에서 1줄 등록)

~/.bashrc 또는 ~/.zshrc:

export WORK_DIR="$HOME/Work"
pin() {
  local label="$1"; shift || true
  local cmd="${*:-$SHELL}"
  local rel="${PWD#"$WORK_DIR/"}"
  echo "$label | $rel | $cmd" >> "$WORK_DIR/10_Today/shortcuts.list"
  echo "Pinned: $label -> $rel | $cmd"
}

예) 현재 디렉터리에서 자주 돌리는 명령을 고정:

pin "This job run" "./run.sh"
pin "Open spec" "${EDITOR:-vi} docs/spec.md"

3) PowerShell용 today.ps1 (윈도우)

Work\10_Today\today.ps1:

$W = $env:WORK_DIR; if (-not $W) { $W = "$HOME\Work" }
$L = Join-Path $W "10_Today\shortcuts.list"
if (-not (Test-Path $L)) { Write-Error "No shortcuts.list"; exit 1 }

$items = Get-Content $L | Where-Object {$_ -notmatch '^\s*$|^\s*#'}
for ($i=0; $i -lt $items.Count; $i++) { "{0}. {1}" -f ($i+1), $items[$i] }
$choice = Read-Host "today>"
if ($choice -match '^\d+$') {
  $line = $items[$choice-1]
  $parts = $line -split '\s*\|\s*'
  Set-Location (Join-Path $W $parts[1])
  Invoke-Expression $parts[2]
}

핀 기능 :

function pin {
  param([string]$Label, [string]$Cmd = $null)
  $W = $env:WORK_DIR; if (-not $W) { $W = "$HOME\Work" }
  $rel = (Resolve-Path .).Path.Replace("$W\","")
  if (-not $Cmd) { $Cmd = $Host.UI.RawUI.WindowTitle }
  "$Label | $rel | $Cmd" | Add-Content (Join-Path $W "10_Today\shortcuts.list")
}

요약: 링크·md 없이 목록 파일에 라인만 추가today로 선택 실행.


옵션 B) 아예 “함수/별칭”만 쓰기 (초간단)

Bash/Zsh

export W="$HOME/Work"
p() { cd "$W/20_Projects" && select d in PRJ-*; do cd "$d"; break; done; }     # 프로젝트 이동
j() { cd "$W/25_Jobs" && select d in {JOB,BUG,EX,SMOKE}-* 2>/dev/null; do cd "$d"; break; done; }  # 잡 이동
prun() { (cd "$W/25_Jobs/$1/04_Run" && ./run.sh); }  # 사용: prun JOB-2025-001_x
pexport() { cd "$W/25_Jobs/$1/06_Export"; }

PowerShell

$W = $env:WORK_DIR; if (-not $W) { $W = "$HOME\Work" }
function p { Set-Location "$W\20_Projects"; $d = Get-ChildItem PRJ-* | Out-GridView -PassThru; if ($d){ Set-Location $d } }
function j { Set-Location "$W\25_Jobs"; $d = Get-ChildItem -Directory | Where-Object { $_.Name -match '^(JOB|BUG|EX|SMOKE)-' } | Out-GridView -PassThru; if ($d){ Set-Location $d } }
function prun($job) { Push-Location "$W\25_Jobs\$job\04_Run"; ./run.ps1; Pop-Location }

완전 심플: 링크도 md도 없음. 함수로 점프하고 스크립트만 실행.


마무리 가이드 (의사결정 규칙)

  • 링크/MD는 굳이 X. 콘솔 위주면 today(옵션 A)나 함수/별칭(옵션 B)이 가장 빠름.

  • 등록은 1줄 : shortcuts.list에 라인 추가(또는 pin "라벨" "명령").

  • 정본은 원래 위치 : Today는 “출발점”일 뿐, 코드는 Projects/Jobs에서 실행.

  • 주 1회 청소 : 안 쓰는 단축 라인 삭제, 최신 작업만 남기기.

원하면 위 스크립트들을 네 스타터에 파일로 반영한 버전 을 바로 만들어 줄게. 어느 셸(Bash/Zsh/PowerShell) 주력인지만 알려줘!

Work/10_Today/shortcuts.list 이걸 어떻게 쓰는거야?

좋아 — Work/10_Today/shortcuts.list콘솔에서 자주 하는 작업들을 “메뉴처럼” 고르는 목록 이야.
각 줄마다 라벨 | (Work 기준) 상대경로 | 실행 명령 3개를 | 로 구분해 적어두고, today 스크립트로 선택 실행해.

아래를 순서대로 하면 바로 써진다.


0) 개념 한 줄

  • shortcuts.list = “오늘 쓸 단축키 목록”

  • today = 이 목록을 읽어서 번호로 고르게 해주는 런처


1) 기본 설치 (macOS/Linux)

  1. 환경 변수(Work 루트) 지정
export WORK_DIR="$HOME/Work"   # Work 폴더가 다른 곳이면 그 경로로 바꿔줘
  1. 런처 스크립트 저장
    ~/Work/10_Today/today 파일을 만들고 아래 내용 붙여넣기:
#!/usr/bin/env bash
set -euo pipefail
W="${WORK_DIR:-$HOME/Work}"
LIST="$W/10_Today/shortcuts.list"
[[ -f "$LIST" ]] || { echo "No shortcuts.list"; exit 1; }

mapfile -t ITEMS < <(grep -v '^\s*#' "$LIST" | sed '/^\s*$/d')
PS3="today> "
select CH in "${ITEMS[@]}" "Edit shortcuts"; do
  if [[ "$REPLY" -eq $((${#ITEMS[@]}+1)) ]]; then ${EDITOR:-vi} "$LIST"; continue; fi
  IFS='|' read -r LABEL REL CMD <<<"$CH"
  DIR="$W/$(echo "$REL" | xargs)"
  (cd "$DIR" && eval "$CMD")
  break
done

실행 권한:

chmod +x ~/Work/10_Today/today
  1. 목록 파일 만들기
    ~/Work/10_Today/shortcuts.list:
# Label                | RelativePath(from Work)                       | Command
Run tests              | 20_Projects/PRJ-2025-001_sample_app           | ./scripts/test.sh
Build GUI              | 20_Projects/PRJ-2025-001_sample_app           | ./scripts/build_gui.sh
Re-run sample job      | 25_Jobs/JOB-2025-001_sample_output/04_Run     | ./run.sh
Open job export        | 25_Jobs/JOB-2025-001_sample_output/06_Export  | ls -al
  1. 실행
~/Work/10_Today/today
# → 번호 메뉴가 뜨고, 고르면 해당 경로로 cd 후 명령을 실행

(선택) 편하게 t 별칭 추가:
echo "alias t='$HOME/Work/10_Today/today'" >> ~/.zshrc && source ~/.zshrc
이제 t만 쳐도 된다.


2) 기본 설치 (Windows / PowerShell)

  1. 환경 변수(Work 루트) 지정
$env:WORK_DIR="$HOME\Work"
  1. 런처 스크립트 저장
    $HOME\Work\10_Today\today.ps1:
$W = $env:WORK_DIR; if (-not $W) { $W = "$HOME\Work" }
$L = Join-Path $W "10_Today\shortcuts.list"
if (-not (Test-Path $L)) { Write-Error "No shortcuts.list"; exit 1 }

$items = Get-Content $L | Where-Object {$_ -notmatch '^\s*$|^\s*#'}
for ($i=0; $i -lt $items.Count; $i++) { "{0}. {1}" -f ($i+1), $items[$i] }
$choice = Read-Host "today>"
if ($choice -match '^\d+$') {
  $line = $items[$choice-1]
  $parts = $line -split '\s*\|\s*'
  Set-Location (Join-Path $W $parts[1])
  Invoke-Expression $parts[2]
}

실행 정책 때문에 막히면(관리자 PowerShell에서):
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned

  1. 목록 파일 만들기
    $HOME\Work\10_Today\shortcuts.list (형식 동일):
Run tests              | 20_Projects/PRJ-2025-001_sample_app           | ./scripts/test.ps1
Build GUI              | 20_Projects/PRJ-2025-001_sample_app           | ./scripts/build_gui.ps1
Re-run sample job      | 25_Jobs/JOB-2025-001_sample_output/04_Run     | ./run.ps1
Open job export        | 25_Jobs/JOB-2025-001_sample_output/06_Export  | dir
  1. 실행
$HOME\Work\10_Today\today.ps1

(선택) Set-Alias t "$HOME\Work\10_Today\today.ps1" 추가 후 t로 실행.


3) shortcuts.list 작성 규칙 (중요 포인트)

  • 포맷 : 라벨 | (Work 기준) 상대경로 | 명령

    • 라벨 : 메뉴에서 보이는 이름. 자유 텍스트.

    • 상대경로 : Work/ 기준. 예: 20_Projects/PRJ-.../scripts

    • 명령 : 해당 경로에서 실행할 콘솔 명령. 예: ./run.sh

  • 주석/빈 줄 : # 로 시작하면 무시, 빈 줄도 무시.

  • 파이프 기호| 주의: 이 파일은 |로 구분하니, 명령에 파이프가 필요하면

    • 작은 래퍼 스크립트(예: scripts/mycmd.sh)를 만들어 그걸 호출해.

    • 예) scripts/mycmd.sh 안에 python x.py | grep foo → 목록에는 ./scripts/mycmd.sh

  • 상대경로는 Work 기준 : WORK_DIR(기본 ~/Work)를 바꾸면 자동으로 따라감.

  • 환경변수/별칭 : 명령 안에서 ${EDITOR}(bash)나 $env:EDITOR(PowerShell) 사용 가능.


4) (선택) 콘솔에서 1줄로 빠르게 등록 — pin 함수

Bash/Zsh

export WORK_DIR="$HOME/Work"
pin() {
  local label="$1"; shift || true
  local cmd="${*:-$SHELL}"
  local rel="${PWD#"$WORK_DIR/"}"
  echo "$label | $rel | $cmd" >> "$WORK_DIR/10_Today/shortcuts.list"
  echo "Pinned: $label -> $rel | $cmd"
}
# 사용 예시
pin "Run current job" "./run.sh"
pin "Edit spec"      '${EDITOR:-vi} docs/spec.md'

PowerShell

function pin {
  param([string]$Label, [string]$Cmd = $null)
  $W = $env:WORK_DIR; if (-not $W) { $W = "$HOME\Work" }
  $rel = (Resolve-Path .).Path.Replace("$W\","")
  if (-not $Cmd) { $Cmd = "powershell" }
  "$Label | $rel | $Cmd" | Add-Content (Join-Path $W "10_Today\shortcuts.list")
}
# 예시
pin "Run current job" "./run.ps1"

5) 자주 쓰는 실전 예시 (복붙)

Open project README    | 20_Projects/PRJ-2025-001_sample_app           | ${EDITOR:-vi} README.md
Run CLI                | 20_Projects/PRJ-2025-001_sample_app           | ./scripts/run_cli.sh
Build (CLI onefile)    | 20_Projects/PRJ-2025-001_sample_app           | ./scripts/build_cli.sh
Run SMOKE              | 25_Jobs/SMOKE-2025-001_new_tool/04_Run        | ./smoke.sh
Re-run BUG repro       | 25_Jobs/BUG-2025-001_sample_bug/04_Run        | ./repro.sh
Check JOB exports      | 25_Jobs/JOB-2025-001_sample_output/06_Export  | ls -al
Release notes (edit)   | 75_Releases/sample-app/v0.1.0                 | ${EDITOR:-vi} ReleaseNotes.md

6) 문제 해결

  • No shortcuts.list → 경로 확인: ~/Work/10_Today/shortcuts.list

  • Permission denied → chmod +x ~/Work/10_Today/today (bash) / 실행정책 설정(PS)

  • 명령에서 파이프가 필요 → 래퍼 스크립트 로 감싸서 실행

  • 다른 곳에 Work가 있을 때 → export WORK_DIR="/path/to/Work"(bash) / $env:WORK_DIR="D:\Work"(PS)


요약: shortcuts.list만 편집하고 today를 실행하면, 원하는 작업을 번호 선택 으로 바로 돌릴 수 있어. 링크/MD 필요 없다—완전 콘솔 친화 모드!

tcsh용으로도 하나 만들어줘

좋지! tcsh 에서도 똑같이 “번호 선택 메뉴”로 돌릴 수 있게 런처/핀 스크립트를 만들어 보자. 콘솔만으로 씁니다—링크/MD 불필요.


1) tcsh 런처: today.csh

설치 (macOS/Linux, tcsh)

  1. Work 루트 환경변수(로그인 시 자동)
tcsh

# ~/.cshrc
setenv WORK_DIR "$HOME/Work"
  1. 런처 스크립트 저장
    $HOME/Work/10_Today/today.csh:
tcsh

#!/bin/tcsh -f
# tcsh launcher for Work/10_Today/shortcuts.list
# Format per line: Label | RelativePath(from Work) | Command

# Resolve Work root
set W = "$HOME/Work"
if ( $?WORK_DIR ) set W = "$WORK_DIR"

set LIST = "$W/10_Today/shortcuts.list"
if ( ! -f "$LIST" ) then
  echo "No shortcuts.list at: $LIST"
  exit 1
endif

# Filter comments/blank lines into a temp file
set TMP = "$W/10_Today/.shortcuts.filtered.$$"
grep -v '^[[:space:]]*#' "$LIST" | sed '/^[[:space:]]*$/d' > "$TMP"
set count = `wc -l < "$TMP"`
if ( "$count" == 0 ) then
  echo "No items in shortcuts.list"
  /bin/rm -f "$TMP"
  exit 0
endif

# Show numbered menu
set i = 1
while ( $i <= $count )
  set line = `sed -n "${i}p" "$TMP"`
  echo "$i. $line"
  @ i++
end
@ edit_idx = $count + 1
echo "$edit_idx. Edit shortcuts"
echo -n "today> "
set choice = $<

if ( "$choice" == "$edit_idx" ) then
  if ( $?EDITOR ) then
    eval "$EDITOR $LIST"
  else
    vi "$LIST"
  endif
  /bin/rm -f "$TMP"
  exit 0
endif

# Validate numeric choice
if ( "$choice" !~ [0-9]* ) then
  echo "Invalid choice"
  /bin/rm -f "$TMP"
  exit 1
endif

# Pick the selected line
set sel = `sed -n "${choice}p" "$TMP"`

# Extract Label | Relative | Command
set label = `echo "$sel" | awk -F '|' '{gsub(/^[ \t]+|[ \t]+$/, "", $1); print $1}'`
set rel   = `echo "$sel" | awk -F '|' '{gsub(/^[ \t]+|[ \t]+$/, "", $2); print $2}'`
set cmd   = `echo "$sel" | awk -F '|' '{sub(/^[ \t]+/, "", $3); print $3}'`

set dir = "$W/$rel"
if ( ! -d "$dir" ) then
  echo "Directory not found: $dir"
  /bin/rm -f "$TMP"
  exit 1
endif

cd "$dir"
# Run command in that dir
eval "$cmd"

# Cleanup
/bin/rm -f "$TMP"

실행 권한:

chmod +x "$HOME/Work/10_Today/today.csh"

(선택) 단축 별칭:

tcsh

# ~/.cshrc
alias t '$HOME/Work/10_Today/today.csh'
source ~/.cshrc
  1. 목록 파일 만들기
    $HOME/Work/10_Today/shortcuts.list:
# Label                 | RelativePath(from Work)                      | Command
Run tests               | 20_Projects/PRJ-2025-001_sample_app          | ./scripts/test.sh
Build GUI               | 20_Projects/PRJ-2025-001_sample_app          | ./scripts/build_gui.sh
Re-run sample job       | 25_Jobs/JOB-2025-001_sample_output/04_Run    | ./run.sh
Open job export         | 25_Jobs/JOB-2025-001_sample_output/06_Export | ls -al

사용:

tcsh

$ ~/Work/10_Today/today.csh
# → 번호 선택 후, 해당 경로로 cd 하고 Command 실행

파이프(|) 주의 : 이 파일은 | 구분자를 쓰므로, 명령에 파이프가 필요하면
작은 래퍼 스크립트(예: scripts/mycmd.sh)를 만들어 그걸 호출해 주세요.


2) tcsh “핀” 유틸: 한 줄로 목록에 추가하기

$HOME/Work/10_Today/pin.csh:

tcsh

#!/bin/tcsh -f
# Usage: pin.csh "Label" [command]
set W = "$HOME/Work"
if ( $?WORK_DIR ) set W = "$WORK_DIR"
set L = "$W/10_Today/shortcuts.list"

if ( "$#argv" == 0 ) then
  echo 'Usage: pin.csh "Label" [command]'
  exit 1
endif

set label = "$1"
shift
if ( "$#argv" > 0 ) then
  set cmd = "$*"
else
  set cmd = "$SHELL"
endif

# Current dir relative to Work
set rel = `echo "$cwd" | sed "s#^$W/##"`
echo "$label | $rel | $cmd" >> "$L"
echo "Pinned: $label -> $rel | $cmd"

권한:

chmod +x "$HOME/Work/10_Today/pin.csh"

사용 예시:

tcsh

# 지금 폴더의 run.sh를 핀으로 등록
~/Work/10_Today/pin.csh "Run current job" "./run.sh"

# 스펙 문서 편집을 핀으로 등록(EDITOR가 설정되어 있다면 그걸 사용)
~/Work/10_Today/pin.csh "Edit spec" '${EDITOR} docs/spec.md'

자주 묻는 요점 정리

  • shortcuts.list 포맷: **Label RelativePath Command** (Work 기준 상대경로)
  • 편집 키 : 메뉴의 마지막 항목 “Edit shortcuts” 선택하면 $EDITOR(없으면 vi)로 바로 열림

  • WORK_DIR 를 옮겼다면: setenv WORK_DIR "/새/경로/Work" 만 바꾸면 자동으로 따라감

  • 문제 : “No shortcuts.list” → 경로 확인, 빈 파일이면 항목 추가

  • 권장 : Today는 “실행 출발점”일 뿐, 정본 코드는 20_Projects/25_Jobs/에 둡니다

필요하면 today.csh즐겨찾기 고정/검색/필터 같은 옵션(menu 검색, 번호 다중 실행 등)도 추가해 줄게.

간단한 스크립트는 어디 모아야할까

좋은 질문! “간단한 스크립트”는 쓰임새(범위·수명)로 나눠서 보관하면 헷갈림이 사라져요. 아래 결정표 대로 두면 됩니다. 필요에 따라 폴더 하나(▶ 추가 표시)도 제안했어요.


어디에 둘까? (결정표)

상황/목적 보관 위치 이유/메모
프로젝트 전용 작업 (빌드/테스트/런) 20_Projects/PRJ-…/scripts/ 프로젝트 루트 기준 경로가 고정. 팀/CI도 그대로 사용 가능.
Job 실행 파이프라인 (입력→설정→실행→산출) 25_Jobs/<JOB>/04_Run/ 재현·증빙 목적. 로그/매니페스트와 같은 맥락에 둠.
여러 프로젝트에서 재사용하는 범용 스크립트 80_Tools/scripts/ 공용(골든) 도구. PATH 에 추가해서 어디서든 호출.
오늘만 쓰는 임시 래퍼/런처 (콘솔 중심) 10_Today/wrappers/ shortcuts.list에서 부르는 작은 래퍼를 모아두는 임시 구역. EOD/주 1회 정리.
짧은 1~3줄 트릭/반복 명령(코드 조각) 50_Snippets/bash/ ‘실행파일’이 아니라 참고용 조각. 나중에 성숙하면 스크립트로 승격.
실험·프로토타입 (버려도 되는 테스트) 31_Labs/jupyter/ 또는 해당 실험 폴더 아이디어 검증 단계. 유효해지면 상위 위치로 승격.
개인 셸 함수/별칭 (환경 설정) 40_Resources/personal/configs/shell/{bash,zsh,tcsh,powershell}/ 로그인 시 자동 로딩. 비공유/취향/OS별로 분리.

신규 폴더 제안 : 10_Today/wrappers/

  • 예: today에서 파이프(|), 복잡한 인자 등이 필요할 때 짧은 래퍼(*.sh, *.ps1, *.csh)를 여기에 두고 shortcuts.list에서는 그 래퍼만 호출.

  • 정리 주기: 하루~일주일. 재사용 가치가 생기면 80_Tools/scripts/PRJ-…/scripts/승격.


운용 규칙 (간단·실전형)

  1. PATH 설정(단 한 번)
  • Bash/Zsh/tcsh:
    export PATH="$HOME/Work/80_Tools/scripts:$PATH"
    
  • PowerShell:
    $env:Path = "$HOME\Work\80_Tools\scripts;" + $env:Path
    

이렇게 하면 어디서든 my-tool.sh 같은 공용 스크립트를 바로 실행.

  1. 승격 루트
  • 50_Snippets/bash/one-liner.txt → 좋아서 자주 쓰게 됨 →
    10_Today/wrappers/say_hello.sh로 임시 사용 → 여전히 유용 →
    80_Tools/scripts/say_hello.sh승격 + --help/설명 추가.
  1. 이름 규칙
  • 동사-목적 : build_cli.sh, release_copy.ps1, repro_bug.csh

  • OS/셸 태그(필요 시): *_mac.sh, *_win.ps1, *_nix.sh, *_tcsh.csh

  • 프로젝트 한정 이면 파일명에 프로젝트 약어 붙이기: build_cli_app1.sh

  1. 헤더/안전 옵션(필수)
  • Bash/Zsh:
    #!/usr/bin/env bash
    set -euo pipefail
    
  • PowerShell:
    $ErrorActionPreference = "Stop"
    Set-StrictMode -Version Latest
    
  • tcsh:
    tcsh
        
    #!/bin/tcsh -f
    
  • 최상단 주석 3줄(설명/의존성/예시):
    # build_cli.sh - Build CLI as onefile with PyInstaller
    # deps: pyinstaller>=6, Python 3.11 venv activated
    # usage: ./build_cli.sh
    
  1. 문서화 위치
  • 공용 스크립트 목록은 80_Tools/scripts/INDEX.md 한 장으로 관리
    (이름, 한줄 설명, 사용 예시).

  • 프로젝트 전용은 PRJ-…/README.md의 “Scripts” 섹션에 표로 정리.


예시 배치 (샘플)

Work/
  10_Today/
    wrappers/
      hotfix_export.sh         # 오늘만 쓸 임시 래퍼 (EOD 삭제/승격)
  20_Projects/PRJ-2025-001_sample_app/
    scripts/
      install.sh | .ps1
      run_cli.sh | .ps1
      build_cli.sh | .ps1
  25_Jobs/JOB-2025-010_report/04_Run/
    run.sh | run.ps1            # Job 실행 진입점
  50_Snippets/bash/
    tmux_one_liners.md
    git_tricks.md
  80_Tools/scripts/
    release_copy.sh             # 공용: dist → 75_Releases 로 전개
    checksum_all.sh             # 공용: SHA256 생성
    today                       # 콘솔 런처(선택)
    today.csh                   # tcsh 런처(선택)
    today.ps1                   # PS 런처(선택)
  40_Resources/personal/configs/shell/
    .zshrc, .tcshrc, Microsoft.PowerShell_profile.ps1

shortcuts.list와 궁합 좋게 쓰는 팁

  • 파이프/복잡 명령이 필요하면 10_Today/wrappers/*.sh에 래퍼로 만들고,
    shortcuts.list에서는 ./wrappers/that_task.sh만 호출 → 깔끔.

  • 래퍼가 일주일 내내 유용하면 80_Tools/scripts/승격 + PATH에서 직접 호출.


원하면 지금 스타터에 10_Today/wrappers/80_Tools/scripts/INDEX.md 틀, 그리고 checksum_all.sh/release_copy.sh 같은 실사용 공용 스크립트 샘플까지 바로 만들어서 붙여줄게. 어느 셸(Bash/Zsh/tcsh/PowerShell)을 주력으로 쓰는지도 알려줘!

근데 config를 교육자료랑 같은 폴더에 두는게 난 좀 이상해

완전 공감해요. 교육자료(edu)설정(config)은 성격이 달라서 분리하는 게 깔끔합니다.
아래처럼 전용 루트 32_Configs/를 새로 두고, 기존 구조를 살짝 조정해요.


왜 분리?

  • 의도 분리 : 문서/학습(읽기) vs 설정/프리셋(실행·적용)

  • 권한/백업 : 개인설정은 민감·빈도 높음 → 별도 관리가 안전

  • 레이어링 명확 : shared(골든)personal(오버라이드) 우선순위가 뚜렷


수정된 최종 트리(설정만 이동, 나머지 동일)

Work/
  00_Inbox/
  10_Today/
  20_Projects/
  25_Jobs/
  30_Areas/
    worklog/
    environments/
    knowledge_base/
      tips/ cheatsheets/ howtos/
  31_Labs/
  32_Configs/                         - ★ 설정 전용 루트
    shared/                           - 조직/프로젝트에 공유 가능한 '골든'
      global/                         - 도구별 표준 설정(전역)
        vscode/ ruff/ pytest/ pyinstaller/ pyside6/ jupyter/
      projects/                       - 특정 프로젝트 전용 기본설정
        sample-app/                   - 예: 프로젝트별 pytest.ini, ruff.toml 등
      README.md                       - 적용 원칙/우선순위
    personal/                         - 나만의 오버라이드(비공개)
      os/{mac,win,linux}/             - OS별 세팅(키보드/입력기 등)
      shell/{bash,zsh,tcsh,powershell}/ - 프로필·별칭
      editors/vscode/                 - settings.user.json, keybindings.user.json
      git/                            - .gitconfig.local 등
      python/                         - pip.conf, poetry.toml, pypirc
      tools/                          - 각 툴 개인 프리셋
      secrets/README.md               - (실제 비밀은 두지 말 것)
      .gitignore                      - *.local, secrets/*, *.pem 등 폭넓게 제외
  40_Resources/                       - 레퍼런스/교육/매뉴얼(설정 X)
    edu/ (courses, tutorials, papers/…)
    manuals/ (<vendor>/<product>/<version>/)
    reference/                        - (선택) 스펙/표준 문서 등 '읽을거리'만
  50_Snippets/
  60_Assets/
  70_Exports/
  75_Releases/
  80_Tools/
    installers/ bin/ scripts/ devcontainer/
  85_Environments/ (conda/ venv/ docker/)
  99_Archive/

포인트: 설정은 전부32_Configs/로 이동. 40_Resources엔 더 이상 설정이 없고, 순수 레퍼런스/학습 자료만 남깁니다.


레이어링(우선순위) 규칙

  1. Project 로컬(리포 내부 설정)

  2. 32_Configs/personal/ (내 오버라이드)

  3. **32_Configs/shared/projects/ /** (프로젝트용 골든)

  4. 32_Configs/shared/global/ (전역 골든)

예: pytest는 순서대로 pytest.ini를 찾고, 없으면 상위로 올라가며 대체.


마이그레이션(3분 컷)

# 1) 디렉터리 생성
mkdir -p ~/Work/32_Configs/shared/{global,projects} ~/Work/32_Configs/personal

# 2) 기존 설정 이동
#   (전역 골든)
mv ~/Work/40_Resources/reference/configs/* ~/Work/32_Configs/shared/global/ 2>/dev/null || true
#   (개인)
mv ~/Work/40_Resources/personal/configs/*  ~/Work/32_Configs/personal/     2>/dev/null || true

# 3) 흔적 정리(선택)
rmdir ~/Work/40_Resources/reference/configs ~/Work/40_Resources/personal/configs 2>/dev/null || true

PowerShell:

New-Item -ItemType Directory -Force -Path "$HOME\Work\32_Configs\shared\global","$HOME\Work\32_Configs\shared\projects","$HOME\Work\32_Configs\personal" | Out-Null
Move-Item "$HOME\Work\40_Resources\reference\configs\*" "$HOME\Work\32_Configs\shared\global" -ErrorAction SilentlyContinue
Move-Item "$HOME\Work\40_Resources\personal\configs\*"  "$HOME\Work\32_Configs\personal"     -ErrorAction SilentlyContinue

부트스트랩(홈 설정 연결 예시)

Bash/Zsh:

export WORK_DIR="$HOME/Work"
export WORK_CONFIGS="$WORK_DIR/32_Configs"
# 예: zsh 개인설정 연결
ln -snf "$WORK_CONFIGS/personal/shell/zsh/.zshrc" ~/.zshrc
# VSCode 사용자 설정
mkdir -p ~/Library/Application\ Support/Code/User
ln -snf "$WORK_CONFIGS/personal/editors/vscode/settings.user.json" \
        ~/Library/Application\ Support/Code/User/settings.json

PowerShell:

$W="$HOME\Work\32_Configs\personal"
New-Item -Type SymbolicLink -Path "$HOME\Documents\PowerShell\Microsoft.PowerShell_profile.ps1" -Target "$W\shell\powershell\profile.ps1" -Force

tcsh:

tcsh

setenv WORK_CONFIGS "$HOME/Work/32_Configs"
ln -snf "$WORK_CONFIGS/personal/shell/tcsh/.tcshrc" ~/.tcshrc

프로젝트에서 설정 불러오기(권장 패턴)

패턴 A) *.base.* + *.local.*

  • 리포 내 pyproject.toml/ruff.toml/pytest.ini기본

  • 내 개인 오버라이드는 같은 디렉터리의 *.local.*

  • 스크립트에서 발견 시 병합:

test -f ruff.local.toml && export RUFF_ARGS="--config ruff.local.toml"

패턴 B) config.d/ 디렉터리 병합

  • 프로젝트 내 config.d/00-base.toml, 10-ci.toml

  • 개인은 config.d/90-local.toml로 추가(깃 무시)


today/런처에서도 바로 접근

Work/10_Today/shortcuts.list에 자주 쓰는 설정 편집/링크 추가:

Edit pytest (shared)   | 32_Configs/shared/global/pytest   | ${EDITOR:-vi} pytest.ini
Edit ruff (personal)   | 32_Configs/personal/python        | ${EDITOR:-vi} ruff.local.toml
Bootstrap dotfiles     | 80_Tools/scripts                  | ./bootstrap_configs.sh

요약

  • 설정 =32_Configs/로 완전 분리 (shared/personal, global/projects 계층)

  • 교육/레퍼런스 =40_Resources/ (설정 없음)

  • 우선순위 : Project → personal → shared/projects → shared/global

  • 부트스트랩 스크립트 로 홈/IDE에 심볼릭 링크나 복사 연결

  • today 런처나 pin으로 설정 편집/적용을 콘솔 한 번

원하면 bootstrap_configs.sh/.ps132_Configs/shared 템플릿 파일들(ruff/pytest/VSC)까지 실제 파일 로 생성한 압축본을 바로 만들어줄게.

왜 하필 32야?

짧게 말하면, 정렬·근접성·확장성 때문에 32_Configs로 잡았어요.

왜 하필 32?

  • 정렬(시각적 그룹화)
    상위 레벨을 10 단위로 끊어 두었죠.
    30_Areas   ← 장기 운영(업무 영역)
    31_Labs    ← 가벼운 실험
    32_Configs ← 설정(실행·적용 중심)
    40_Resources ← 읽을거리/레퍼런스
    

ConfigsLabs와 Resources 사이 에 오도록 32를 줘서, “업무(30) → 실험(31) → 설정적용(32) → 참고자료(40)” 흐름으로 자연스럽게 스캔됩니다.

  • 근접성(자주 손대는 것끼리)
    설정은 주로 Areas/Labs에서 파생 돼요(실험하다 설정을 고치고, 운영하면서 정책을 조정). 그래서 30대에 붙여 손 닿는 데 두었습니다.

  • 확장성(번호 남겨두기)
    33~39 사이에 여유가 생겨요. 나중에 필요하면:

    • 33_Templates (문서/코드 템플릿)

    • 34_Policies (보안/품질 정책 문서)

    • 35_Checklists(QA/릴리스 체크리스트)
      … 같은 식으로 중간번호를 끼워넣기 쉽습니다.

꼭 32여야 해?

아니요. 아래처럼 취향대로 바꿔도 좋아요—핵심은 일관성.

  • 35_Configs : 홀수만 써서 시각적으로 구분 원할 때

  • 28_Configs : Projects(20대)와 운영(30대) 사이로 끌어당기고 싶을 때

  • 82_Configs : Tools(80대)와 묶고 싶을 때(개인 취향/DevOps 성향)

바꾸고 싶다면 (안전하게 리네임)

두 곳 이상에서 쓰는 스크립트/런처가 있으면 경로만 함께 바꿔주면 됩니다.

bash/zsh

mv ~/Work/32_Configs ~/Work/35_Configs
# today 런처 목록 등 경로 업데이트
sed -i '' 's#/32_Configs/#/35_Configs/#g' ~/Work/10_Today/shortcuts.list 2>/dev/null || true

PowerShell

Rename-Item "$HOME\Work\32_Configs" "35_Configs"
(Get-Content "$HOME\Work\10_Today\shortcuts.list") -replace '/32_Configs/', '/35_Configs/' |
  Set-Content "$HOME\Work\10_Today\shortcuts.list"

현재 상위 번호 체계 요약(기억용)

00  Inbox         | 10  Today          | 20  Projects      | 25  Jobs
30  Areas         | 31  Labs            | 32  Configs       | 40  Resources
50  Snippets      | 60  Assets          | 70  Exports       | 75  Releases
80  Tools         | 85  Environments    | 99  Archive

원하면 네 취향(짝수만/홀수만/문자 프리픽스 등)에 맞춰 전체 번호 리패터닝 표 랑 자동 마이그레이션 스크립트도 같이 만들어줄게.

90을 개인용 Configs 로 하자. 최종적으로 각 폴더명(영어)과 담을 내용(한글)을 정리해줘. 그리고 10가지 정도 업무 예시에 대해 Workflow를 작성해줘. 예를 들어 프로젝트 만들기, 분석 작업하기, 개인용 스크립트 만들기, 툴 설치하기, 개인 shell alias 설정하기 등등이 있을 수 있어.

좋아—요청대로 폴더명은 영어 , 설명은 한글 로 정리하고, 마지막에 대표 업무 10가지 워크플로우 를 단계별로 붙일게.
(개인용 설정은 90_Configs로 확정, “공유/골든 설정”은 32_Configs에 유지)


1) 최종 폴더 구조 (영문 이름 + 한글 설명 + 예시 하위)

Work/                                     - 1인 개발용 작업 루트
  00_Inbox/                               - 급히 던져두는 임시함(매일/주기적으로 비우기)

  10_Today/                               - 오늘 작업 대시보드(콘솔 중심 실행 출발점)
    shortcuts.list                        - today 런처가 읽는 “라벨|경로|명령” 목록
    (wrappers/)                           - 파이프/복잡 인자용 임시 래퍼 스크립트(단기 보관)

  20_Projects/                            - 툴(파이썬 패키지) 개발(코드 수명 중심)
    PRJ-YYYY-NNN_name/                    - 개별 프로젝트(예: PRJ-2025-001_sample_app)
      src/<package_name>/                 - 패키지 소스
      tests/                              - pytest 테스트
      scripts/                            - install/run/build/lint/test 스크립트(.sh/.ps1)
      examples/{data,scripts,docs}/       - 배포용 최소 실행 예제
      issues/BUG-YYYY-NNN/                - 버그/개선 이슈 노트
      docs/                               - 설계·ADR·가이드
      .devcontainer/                      - 개발 컨테이너 설정
      pyproject.toml, README.md, .gitignore, .editorconfig

  25_Jobs/                                - “산출물 작업 단위”(프로세스 수명 중심)
    JOB-YYYY-NNN_name/                    - 일반 산출 Job(입력→설정→실행→산출)
      01_Brief/                           - 요구사항/수락 기준/마감
      02_Input/raw/                       - 원천 데이터(읽기 전용 보관)
      03_Config/                          - 파라미터(yml/json), 실행 설정
      04_Run/                             - run.sh|ps1, run.py, 로그
      05_Output/                          - 중간/최종 산출물(작업 영역)
      06_Export/                          - 전달본(최종 산출물)
      90_Archive/                         - 완료 후 장기 보관
    BUG-YYYY-NNN_name/                    - 배포 버그 재현/증거/수정 검증
      01_Report/ 02_Repro/input/ 03_Config/ 04_Run/ 05_Evidence/logs/ 06_FixValidation/
    EX-YYYY-NNN_name/                     - “툴 예제” 패키징용 Job(선택)
    SMOKE-YYYY-NNN_tool/                  - 새 툴 설치 후 스모크/feasibility 테스트

  30_Areas/                               - 장기 운영 영역(지속 업무)
    worklog/YYYY/YY-MM/DATE.md            - 일일/주간 5줄 로그
    environments/                         - 공통 환경 메모/전략(예: 파이썬 버전 정책)
    knowledge_base/{tips,cheatsheets,howtos}/
                                           - 축적 지식: 팁/치트시트/가이드

  31_Labs/                                - 실험실(짧은 테스트/프로토; 재현 불필요)
    jupyter/                              - 스크래치 노트북(예: regex_scratch.ipynb)

  32_Configs/                             - 공유/골든 설정(문서화·재사용 대상)
    shared/
      global/{vscode,ruff,pytest,pyinstaller,pyside6,jupyter}/
                                           - 전역 표준 설정
      projects/<project_slug>/             - 특정 프로젝트 기본설정
      README.md                            - 적용 원칙/우선순위

  40_Resources/                           - 참고 자료(교육/매뉴얼/스펙—설정 제외)
    edu/{courses,tutorials,papers/…}/      - 강의·튜토리얼·논문(읽을거리 중심)
    manuals/<vendor>/<product>/<version>/  - 매뉴얼/가이드(PDF/HTML/MD)
    reference/                             - 표준/스펙 문서 등 레퍼런스

  50_Snippets/{sql,text,bash}/            - 재사용 코드/문구 조각(짧은 예제·원라이너)

  60_Assets/                              - 로고/폰트/템플릿 등 브랜딩 리소스

  70_Exports/                             - 여러 Job의 “최종 전달본” 모아보기(선택)

  75_Releases/                            - 유저 배포 전용 중앙 보관소(버전드)
    <project_slug>/vX.Y.Z/{installers,wheels,portable,docs,licenses,checksums}/
    <project_slug>/latest/                 - 최신 버전 포인터
    catalog.json                           - (선택) 버전/파일 인덱스

  80_Tools/                               - 설치파일/포터블/자동화 스크립트
    installers/                            - 오프라인 설치 파일 + install_notes.md(버전·체크섬)
    bin/                                   - 포터블 실행파일(PATH에 추가 가능)
    scripts/                               - bootstrap/release/checksum 등 공용 스크립트
    devcontainer/                          - 개발 컨테이너 툴

  85_Environments/                        - 재현 가능한 개발 환경 샘플
    conda/environment.yml
    venv/README.md
    docker/Dockerfile

  90_Configs/                             - ★개인 설정(오버라이드·비공개)
    os/{mac,win,linux}/                    - OS별 설정(키맵/입력기 등)
    shell/{bash,zsh,tcsh,powershell}/      - 프로필·별칭(개인용)
    editors/vscode/{settings.user.json,keybindings.user.json}
    git/.gitconfig.local
    python/{pip.conf,poetry.toml,pypirc}
    tools/                                 - 각 툴 개인 프리셋
    secrets/README.md                      - (실제 비밀은 두지 말고 안내만)
    .gitignore                             - *.local, secrets/*, *.pem 등 광범위 제외

  99_Archive/                             - 완료 Project/Job/자료 장기 보관(읽기 전용)

2) 대표 업무 10가지 Workflow (Step-by-step)

1) 새 프로젝트 만들기 (Python 패키지/데스크탑 툴)

  1. 20_Projects/PRJ-YYYY-NNN_<name>/ 생성(템플릿 복사).

  2. ./scripts/install.(sh|ps1)로 venv + dev 의존성 설치.

  3. src/<pkg>/, pyproject.toml 패키지명과 엔트리포인트 수정.

  4. tests/에 최소 test_smoke.py 추가 → ./scripts/test.* 실행.

  5. 필요 시 GUI 의존성(.[gui]) 추가, scripts/run_gui.*로 확인.

  6. README에 사용법/예제/버전 정책 기입.

2) 분석·산출물 작업 수행(도구 사용 → 결과 전달)

  1. 25_Jobs/JOB-YYYY-NNN_<title>/ 생성.

  2. 01_Brief/에 요구사항·마감·검수 기준 작성.

  3. 02_Input/raw/에 입력 배치, 03_Config/config.yml 작성.

  4. 04_Run/run.(sh|ps1) 실행 → 06_Export/에 최종본, 로그/manifest 생성.

  5. qa_checklist.md 통과 → 필요 시 70_Exports/에도 복사.

3) 개인용 스크립트 만들기

  1. 오늘만 쓸 임시면 10_Today/wrappers/에 작성 → shortcuts.list에서 호출.

  2. 여러 프로젝트에서 재사용되면 80_Tools/scripts/승격 + --help/README 작성.

  3. PATH에 80_Tools/scripts 추가.

  4. 프로젝트 전용이면 20_Projects/PRJ-…/scripts/에 두고 README의 Scripts 섹션에 문서화.

4) 새 툴 설치(+ 스모크 테스트)

  1. 설치파일을 80_Tools/installers/에 보관, install_notes.md에 버전·체크섬 기록.

  2. 설치 후 25_Jobs/SMOKE-YYYY-NNN_<tool>/ 생성.

  3. 03_Config/commands.txttool --version 등 기본 명령 기입.

  4. 04_Run/smoke.(sh|ps1) 실행 → 06_Export/result.txt 확인.

  5. 통과하면 10_Today/shortcuts.list에 단축 명령 추가.

5) 개인 shell alias/프로필 설정

  1. 90_Configs/shell/<your_shell>/에 프로필·별칭 작성(예: .zshrc, profile.ps1).

  2. 홈으로 심볼릭 링크 연결(또는 복사):

    • macOS/Linux: ln -snf "$HOME/Work/90_Configs/shell/zsh/.zshrc" ~/.zshrc

    • PowerShell: 프로필 링크/로드.

  3. 재시작 또는 source 후 동작 확인.

  4. 공용으로 권장하고 싶은 항목은 32_Configs/shared/global/에도 복제.

6) 배포 버전 만들기(Release)

  1. 프로젝트에서 ./scripts/build_cli.*/build_gui.*로 빌드.

  2. 릴리스 검증 Job(선택): 25_Jobs/REL-YYYY-NNN_<proj>_vX.Y.Z/에서 체크섬·노트 자동화.

  3. 75_Releases/<project>/vX.Y.Z/{installers,wheels,portable,docs,licenses,checksums}/ 정리.

  4. ReleaseNotes.md 작성, latest/ 갱신.

  5. 필요 시 사내/외부 배포 링크 공지.

7) 버그 제보 → 디버깅 → 패치

  1. 25_Jobs/BUG-YYYY-NNN_<title>/01_Report/에 제보/환경/재현절차 작성.

  2. 02_Repro/input/, 03_Config/ 준비 → 04_Run/repro.*로 재현.

  3. 05_Evidence/logs/에 로그·스크린샷·체크섬 수집.

  4. 코드는 20_Projects/.../issues/BUG-.../에서 triage/fix_notes 관리.

  5. 06_FixValidation/ 시나리오 통과 후 패치 릴리스(Workflow 6로 이동).

8) 빠른 실험(정규식/파이썬 문법 등)

  1. 31_Labs/jupyter/에서 스크래치(작게, 5분/50줄 규칙).

  2. 가치가 있으면 30_Areas/knowledge_base/{tips,cheatsheets,howtos}승격 요약.

  3. 재현/증빙이 필요해지면 SMOKE Job 이나 일반 JOB 으로 전환.

9) 교육·논문 자료 관리

  1. PDF는 40_Resources/edu/papers/to_read/에 저장.

  2. 읽으면서 reading_notes/YYYY-MM-DD_Title.md 작성(템플릿 사용).

  3. 한 달에 한 번 summaries/에 1~2페이지 요약 정리.

  4. 코드/알고리즘으로 채택되면 관련 PRJ의 docs/ 또는 Job으로 연결하여 실험/결과 보관.

10) 설정 레이어링 적용(골든 ↔ 개인)

  1. 우선순위 : Project 로컬 → 90_Configs/personal32_Configs/shared/projects/<proj>32_Configs/shared/global.

  2. VSCode/ruff/pytest 등은 프로젝트에서 기본 설정, 개인은 *.local.* 오버라이드.

  3. 부트스트랩 스크립트(80_Tools/scripts/bootstrap_configs.*)로 홈/IDE에 링크·복사 자동 적용.

  4. 10_Today/shortcuts.list에 “Edit ruff (personal)” 같은 단축키 추가.


원하면 위 변경(특히 90_Configs 신설)까지 실제 폴더와 샘플 파일을 생성한 스타터 압축본 으로 바로 만들어 줄 수 있어. 어떤 셸을 주력으로 쓰는지만 알려줘(예: zsh, tcsh, PowerShell).

90_Configs랑 32_Configs랑 이름이 겹쳐. rename이 필요해 보여

좋은 지적! 이름 충돌을 없애고 의도가 한눈에 보이도록 이렇게 바꿉니다.

새 이름 (명확·일관)

  • **32SharedConfigs** → _공유/골든 설정 (팀·프로젝트가 재사용하는 표준)

  • **90PersonalConfigs** → _개인 설정 (내 취향/오버라이드/비공개)

둘 다 Configs를 유지하되 접두로 Shared / Personal 을 붙여 구분을 확실히 했어요.


최종 구조(해당 부분만 발췌)

Work/
  32_SharedConfigs/                     - 공유/골든 설정(문서화·재사용 대상)
    global/{vscode,ruff,pytest,pyinstaller,pyside6,jupyter}/
                                         - 전역 표준 설정
    projects/<project_slug>/             - 특정 프로젝트 기본설정
    README.md                            - 적용 원칙/우선순위

  90_PersonalConfigs/                   - 개인 설정(오버라이드·비공개)
    os/{mac,win,linux}/                  - OS별 설정
    shell/{bash,zsh,tcsh,powershell}/    - 프로필·별칭
    editors/vscode/{settings.user.json,keybindings.user.json}
    git/.gitconfig.local
    python/{pip.conf,poetry.toml,pypirc}
    tools/                               - 각 툴 개인 프리셋
    secrets/README.md                    - (실제 비밀은 두지 말 것)
    .gitignore                           - *.local, secrets/*, *.pem 등 폭넓게 제외

설정 레이어링(우선순위 그대로 유지)

Project 로컬 → 90_PersonalConfigs → 32_SharedConfigs/projects → 32_SharedConfigs/global


안전한 리네임(3분 컷)

macOS/Linux (bash/zsh)

cd ~/Work
mv 32_Configs 32_SharedConfigs 2>/dev/null || true
mv 90_Configs 90_PersonalConfigs 2>/dev/null || true

# today 목록 경로 일괄 치환
sed -i '' 's#/32_Configs/#/32_SharedConfigs/#g' 10_Today/shortcuts.list 2>/dev/null || true
sed -i '' 's#/90_Configs/#/90_PersonalConfigs/#g' 10_Today/shortcuts.list 2>/dev/null || true

# 홈 심볼릭 링크 재연결 예시
ln -snf "$HOME/Work/90_PersonalConfigs/shell/zsh/.zshrc" ~/.zshrc

Windows (PowerShell)

Rename-Item "$HOME\Work\32_Configs" "32_SharedConfigs" -ErrorAction SilentlyContinue
Rename-Item "$HOME\Work\90_Configs" "90_PersonalConfigs" -ErrorAction SilentlyContinue

(Get-Content "$HOME\Work\10_Today\shortcuts.list") `
  -replace '/32_Configs/', '/32_SharedConfigs/' `
  -replace '/90_Configs/', '/90_PersonalConfigs/' `
  | Set-Content "$HOME\Work\10_Today\shortcuts.list"

# 예: 개인 프로필 링크 재설정
# New-Item -Type SymbolicLink -Path "$HOME\Documents\PowerShell\Microsoft.PowerShell_profile.ps1" `
#   -Target "$HOME\Work\90_PersonalConfigs\shell\powershell\profile.ps1" -Force

tcsh

tcsh

cd ~/Work
if ( -d 32_Configs )  mv 32_Configs 32_SharedConfigs
if ( -d 90_Configs )  mv 90_Configs 90_PersonalConfigs
# shortcuts.list 내 경로는 수동 또는 sed로 치환
sed -i '' 's#/32_Configs/#/32_SharedConfigs/#g; s#/90_Configs/#/90_PersonalConfigs/#g' 10_Today/shortcuts.list

부트스트랩/런처에서의 새 경로 사용 예

shortcuts.list 예시

Edit pytest (shared)   | 32_SharedConfigs/global/pytest   | ${EDITOR:-vi} pytest.ini
Edit ruff (personal)   | 90_PersonalConfigs/python        | ${EDITOR:-vi} ruff.local.toml
Bootstrap dotfiles     | 80_Tools/scripts                 | ./bootstrap_configs.sh

심볼릭 링크 예시

# VSCode 사용자 설정
mkdir -p ~/Library/Application\ Support/Code/User
ln -snf "$HOME/Work/90_PersonalConfigs/editors/vscode/settings.user.json" \
        ~/Library/Application\ Support/Code/User/settings.json

왜 이 이름이 좋은가 (짧게)

  • 가독성 : 폴더를 보는 순간 “공유용 vs 개인용”이 즉시 구분.

  • 검색성 : SharedConfigs, PersonalConfigs 키워드로 코드·문서·스크립트에서 쉽게 grep.

  • 확장성 : 나중에 33_Templates/, 34_Policies/ 같은 디렉터리도 무리 없이 추가.

필요하면 위 리네임을 반영한 today 런처/핀 스크립트 샘플 업데이트와 bootstrap_configs.(sh|ps1|csh)까지 만들어서 드릴게.

근데 shortcuts가 그렇게 유용해? 여러 군데서 사용하네

좋은 포인트야. shortcuts.list 가 “유용하냐”는 건 작업 스타일/규모에 따라 갈려.
정리하자면:

결론 (의사결정 매트릭스)

  • 명령이 5~20개 정도로 “매일 반복”된다 → shortcuts.list 유지 (번호 선택 한 방, 쉘/OS 무관).

  • 명령이 들쭉날쭉·많음( >30)shortcuts.list 없애고 자동 탐색 러너 로 전환.

  • 프로젝트별로만 돌림 → 각 PRJ에 Make/just/invoke/nox 같은 로컬 태스크 러너 두고, Today는 단순 점프만.

아래에 세 가지 운용안 을 다 줬어. 너한테 맞는 걸 골라 쓰면 돼.


옵션 A) shortcuts.list 계속 쓸 때 (유지비 최소 트릭)

  • 등록은 1줄 : pin(bash/zsh/ps/tcsh)로 현재 폴더·명령을 자동 추가 → 타이핑 부담 최소.

  • 정리 주기 : 금요일 5분에 TOP10만 남기고 나머지 아카이브.

  • 한 곳에서만 사용 : today 러너만 이 파일을 읽게 하고, 다른 스크립트/도구는 직접 파싱 금지(중복도입 방지).

이미 우리가 만든 today/pin 세트는 이 전제를 만족해. (=한 군데에서만 소비)


옵션 B) 자동 탐색 러너(추천: 명령이 많거나 자주 변할 때)

리스트 관리 자체가 귀찮다면, Work 전체를 스캔 해서 “돌릴 수 있는 스크립트”를 자동으로 메뉴로 보여주면 끝이야.
shortcuts.list 없이 바로 사용.

bash/zsh: work-run (fzf 있으면 퍼지 선택, 없으면 번호 선택)

#!/usr/bin/env bash
set -euo pipefail
W="${WORK_DIR:-$HOME/Work}"

# (1) 후보 수집: 자주 쓰는 엔트리 스크립트 패턴
mapfile -t CANDIDATES < <(
  find "$W" -type f \( \
      -path "$W/20_Projects/*/scripts/*.sh" -o \
      -path "$W/25_Jobs/*/04_Run/*.sh" -o \
      -path "$W/25_Jobs/*/04_Run/*.ps1" -o \
      -path "$W/80_Tools/scripts/*.sh" \
    \) 2>/dev/null \
  | sort
)

(( ${#CANDIDATES[@]} )) || { echo "No runnable scripts found."; exit 1; }

pick_with_fzf() {
  command -v fzf >/dev/null 2>&1 || return 1
  printf '%s\n' "${CANDIDATES[@]}" \
    | sed "s|^$W/||" \
    | fzf --prompt="work-run> " --height=40% --reverse \
          --preview="sed -n '1,80p' \"$W/{}\"" \
    | sed "s|^|$W/|"
}

SEL="$(pick_with_fzf || true)"
if [[ -z "${SEL:-}" ]]; then
  # fallback: 번호 선택
  i=1
  for p in "${CANDIDATES[@]}"; do
    rel="${p#$W/}"; printf "%2d) %s\n" "$i" "$rel"; ((i++))
  done
  read -rp "work-run> " idx
  [[ "$idx" =~ ^[0-9]+$ ]] || { echo "Invalid"; exit 1; }
  SEL="${CANDIDATES[$((idx-1))]}"
fi

dir="$(dirname "$SEL")"; file="$(basename "$SEL")"
cd "$dir"
case "$file" in
  *.ps1)  pwsh -NoLogo -NoProfile -File "$file" ;;   # pwsh있으면 PS 스크립트도 실행
  *.sh)   chmod +x "$file" 2>/dev/null || true; "./$file" ;;
  *)      echo "Unknown type: $file"; exit 1 ;;
esac

사용:

chmod +x ~/Work/80_Tools/scripts/work-run
export PATH="$HOME/Work/80_Tools/scripts:$PATH"
work-run
  • 패턴은 필요하면 추가해(예: build_*.sh, repro.sh, smoke.sh 등).

  • fzf가 있으면 퍼지 검색/프리뷰, 없으면 번호 메뉴.

tcsh: work-run.csh (간단 번호 선택)

tcsh

#!/bin/tcsh -f
set W = "$HOME/Work"
if ( $?WORK_DIR ) set W = "$WORK_DIR"

set tmp = "/tmp/work-run.$$"
# 후보: scripts/*.sh, 04_Run/*.sh, 80_Tools/scripts/*.sh
find "$W" -type f \( \
  -path "$W/20_Projects/*/scripts/*.sh" -o \
  -path "$W/25_Jobs/*/04_Run/*.sh" -o \
  -path "$W/80_Tools/scripts/*.sh" \
\) | sort | sed "s|^$W/||" > "$tmp"

set n = `wc -l < "$tmp"`
if ( "$n" == 0 ) then
  echo "No runnable scripts found."; /bin/rm -f "$tmp"; exit 0
endif

set i = 1
foreach line (`cat "$tmp"`)
  echo "$i) $line"
  @ i++
end
echo -n "work-run> "
set idx = $<
set sel = `sed -n "${idx}p" "$tmp"`; /bin/rm -f "$tmp"
set full = "$W/$sel"
set dir = `dirname "$full"`; set file = `basename "$full"`
cd "$dir"
if ( "$file:e" == "sh" ) then
  chmod +x "$file" >/dev/null
  ./"$file"
else
  echo "Unknown type: $file"
endif

사용:

tcsh

chmod +x ~/Work/80_Tools/scripts/work-run.csh
setenv PATH "$HOME/Work/80_Tools/scripts:$PATH"
work-run.csh

이 방식이면 여러 군데서 shortcuts를 쓰지 않아도 되고, 새 스크립트를 만들면 자동으로 메뉴에 잡혀.


옵션 C) 프로젝트 로컬 태스크 러너 로 통일

  • 각 PRJ 루트에 아래 중 하나를 채택:

    • Makefile : make test, make build, make run

    • justfile(추천): 사람이 읽기 쉬운 문법, just build, just test

    • Invoke/Fab(파이썬 태스크): inv build, inv release

    • nox/tox(테스트/세션): nox -s lint tests

  • 10_Today에서는 그 프로젝트로 cd만 하고, 나머지는 로컬 태스크로 실행.

  • 장점: 유지보수 최소 , CI/CD와 스크립트 공유 쉬움.

  • 단점: 프로젝트마다 태스크 정의 필요.


어느 걸 쓰면 좋을까? (현실 규칙)

  • 초기 셋업/개인 워크스페이스 : B(자동 탐색) → 관리 부담 0

  • 안정화되면 : C(프로젝트 태스크 러너)로 고정해 품질↑

  • 매일 도는 Top10 명령이 뚜렷 : A(shotcuts.list) 유지 + pin으로 등록을 “노가다 0”으로


보너스: 혼용 예시 (실전형)

  • work-run으로 전체 스크립트 퍼지 검색 해서 바로 실행

  • 자주 쓰는 5~10개는 shortcuts.list고정 슬롯

  • 프로젝트 내부에는 justfilebuild/test/run 표준화

이렇게 잡으면 “여러 군데서 shortcuts를 쓴다”는 느낌 없이,
한 가지 진입점(work-run 혹은 today) 만 기억하면 되고,
필요할 때만 최소한으로 shortcuts.list를 운용하면 돼.

만약에 교육 실험(LAB)을 따라해보고 싶다면 어디서 해야할까

좋은 질문! 교육 실험(LAB)은 “자료(읽기)”와 “실습(실행)”을 분리해서 관리하면 깔끔합니다.

한 줄 결론

  • 자료(강의/튜토리얼/노트) : 40_Resources/edu/... (읽기 전용 레퍼런스)

  • 가벼운 따라하기·짧은 탐색( <30분): 31_Labs/jupyter/ (스크래치)

  • 데이터·설정·결과를 남기는 제대로 된 실습 : 25_Jobs/LAB-YYYY-NNN_<topic>/ (재현 가능한 구조)


어디서 무엇을 하나요?

1) 자료는 여기: 40_Resources/edu/

  • courses/<provider>/<course-name>/ : 강의 슬라이드/수업 링크

  • tutorials/<topic>/ : 튜토리얼 링크/README

  • papers/ : 논문 워크플로(to_read → reading_notes → summaries)

역할: “읽을거리/레퍼런스” 저장소. 실행 파일이나 산출물은 두지 않음.

2) 짧은 실습은 여기: 31_Labs/jupyter/

  • 파일 예: 2025-08-26_pytorch-tensor-basics.ipynb, regex_scratch.ipynb

  • 용도: API 감, 문법/정규식 테스트, 작은 코드 실험(5분/50줄 규칙)

  • 끝나고 유용하면 요약을 30_Areas/knowledge_base/{tips|cheatsheets|howtos}승격
    (예: “PyTorch 텐서 기본” 치트시트)

3) 본격 실습(데이터·산출·리포트 필요)은 여기: 25_Jobs/LAB-YYYY-NNN_<topic>/

LAB을 JOB의 한 타입 으로 보면 됩니다(재현성/증빙 목적).

권장 스켈레톤

25_Jobs/
  LAB-2025-012_pytorch-cnn/
    01_Brief/            - 학습 목표, 평가 기준(예: 정확도 ≥ 90%), 마감
    02_Input/
      raw/               - 원천 데이터(큰 파일은 심볼릭 링크 권장)
    03_Config/
      env.yml            - conda/venv 의존성 명세(또는 requirements.txt)
      params.yml         - 하이퍼파라미터/경로 설정
    04_Run/
      notebooks/         - 실습 노트북(실행 본문)
      run.sh|run.ps1     - 일괄실행/로그/시드고정
      manifest.json      - 자동 생성(환경/버전/체크섬)
    05_Output/
      intermediate/      - 체크포인트/중간 산출
      reports/           - 리포트 파일(HTML/PDF)
    06_Export/
      final/             - 제출/공유용 최종본

왜 Job 형태?

  • 입력/설정/실행/산출이 분리되어 다시 돌리기 쉬움

  • 체크섬·환경 버전이 manifest로 기록 → 결과 신뢰도↑

  • 팀/미래의 나에게 재현 가능한 증거 가 됨


실전 워크플로 (LAB 따라하기)

A) “짧게 맛보기” (유튜토리얼/블로그 코드 몇 줄)

  1. 40_Resources/edu/tutorials/<topic>/에 링크/원문 저장

  2. 31_Labs/jupyter/2025-08-26_<topic>.ipynb에서 바로 실습

  3. 유용하면 → 30_Areas/knowledge_base/tips/<topic>.md에 요약 10줄

B) “실제 데이터로 결과를 내야 함”(성능/리포트 필요)

  1. 25_Jobs/LAB-YYYY-NNN_<topic>/ 생성

  2. 01_Brief/에 목표/평가 기준/데이터 출처 작성

  3. 02_Input/raw/에 데이터 배치(대용량은 경로만, 심링크 추천)

  4. 03_Config/env.yml, params.yml 작성

  5. 04_Run/notebooks/에 노트북 저장, run.sh에서 순서·시드 고정

  6. 실행 → 05_Output/에 중간물, 06_Export/final/에 최종 리포트/PDF

  7. 성과가 재사용 가능하면, 도구화 해서 20_Projects/PRJ-...로 승격

C) “LAB이 결국 재사용 툴로 발전”

  1. 실습 코드에서 공통 로직을 패키지화20_Projects/PRJ-.../src/<pkg>/

  2. 예제는 20_Projects/.../examples/로 옮겨 최소 실행 샘플 제공

  3. 학습 기록/리포트는 기존 LAB-... Job에 그대로 보존(출처·증빙)


환경/설정은 어디서?

  • 공유/골든 설정 : 32_SharedConfigs/ (예: 표준 pytest.ini, ruff.toml)

  • 개인 설정(오버라이드) : 90_PersonalConfigs/ (셸 프로필, 개인 ruff/VSCode 등)

  • 특정 LAB 전용 의존성 : LAB-.../03_Config/env.yml 또는 requirements.txt
    (프로젝트로 승격되면 PRJ 리포 안으로 옮기기)


Today 런처/자동 러너에 연결 (선택)

  • 그냥 콘솔에서 자주 돌리면:

    • work-run 자동 탐색 러너를 쓰면 LAB-.../04_Run/*.sh가 자동 후보에 올라옵니다.

    • 또는 10_Today/shortcuts.list에 한 줄 추가:

      Run LAB CNN | 25_Jobs/LAB-2025-012_pytorch-cnn/04_Run | ./run.sh
      

언제 어디서 할지 결정 규칙(요약)

  • < 30분 / 재현 불요 / 개인 확인31_Labs/jupyter

  • 데이터·결과·평가 필요 / 공유·재현 필요25_Jobs/LAB-YYYY-...

  • 도구로 발전20_Projects/PRJ-... (LAB은 기록으로 남김)

필요하면 LAB용 템플릿(Job 스캐폴드 + env/params 샘플 + run 스크립트)을 바로 만들어줄게. 어떤 주제(예: PyTorch, Pandas, NLP, 시각화)로 실습할지 알려주면 거기에 맞춰 뼈대까지 넣어 드릴 수 있어!

25_Jobs가 엄청 뚱뚱해지네

맞아—그 느낌 정상이에요. 25_Jobs가 비대해지기 쉬운 폴더 라서, 구조·정책·자동화 3가지만 잡으면 금방 얇아집니다. 아래 그대로 적용해보자.


1) 구조: 25_Jobs를 “타입×연도×상태”로 쪼개기

Work/
  25_Jobs/                          ← 산출 작업 루트
    _active/                        ← 지금 진행 중(12개 이내 유지)
    _templates/                     ← 복제용 스캐폴드(빈 템플릿)
    JOB/                            ← 일반 작업(연도별 보관)
      2025/
      2024/
    BUG/                            ← 배포 버그 재현/검증
      2025/
    SMOKE/                          ← 새 툴 스모크/feasibility
      2025/
    LAB/                            ← 교육 실습 중 “재현형” 실습
      2025/
    EX/                             ← 배포 예제 패키징
      2025/
    REL/                            ← 릴리스 준비/검증(Job 형태)
      2025/
  • 새 작업은 항상 25_Jobs/_active/타입-YYYY-NNN_제목/로 시작 → 끝나면 동일 타입의 연도 폴더로 이동.

  • 템플릿은 전부 _templates/에 모아두고 복제만 한다(중복 템플릿 방지).

예) 진행 중 버그: _active/BUG-2025-013_crash_xxx/
완료 후 이동: BUG/2025/BUG-2025-013_crash_xxx/


2) 정책: 수명주기(Hot → Warm → Cold)

단계 위치 기간/기준 해야 할 일
Hot _active/ 작업 중 매일 편집, 로그/메모 살림
Warm 타입/2025/ 완료 후 ~90일 중간산출물 정리, 05_Output/intermediate 압축/삭제
Cold 99_Archive/25_Jobs/2025/ 90일↑ 또는 재사용 낮음 전체 폴더 이동(읽기 전용), 필요 파일만 70_Exports 링크
  • 상한선 : _active/12개 이내 (넘으면 가장 오래된 것부터 Warm으로 이동).

  • 원천데이터 : 큰 파일은 02_Input/raw심볼릭 링크/경로만(실파일은 별도 데이터 저장소; 아래 5번 참고).


3) 인덱스: 가벼운 카탈로그 1장(검색·정리용)

25_Jobs/index.csv (또는 catalog.json) — 최소 필드:

job_code,type,year,title,status,owner,tags,start,end,path
JOB-2025-041,JOB,2025,"보고서 A",done,me,"report,pdf",2025-08-20,2025-08-22,25_Jobs/JOB/2025/JOB-2025-041_보고서A
BUG-2025-013,BUG,2025,"crash on save",warm,me,"win11,pyinstaller",2025-08-15,2025-08-16,25_Jobs/BUG/2025/BUG-2025-013_crash
  • 새 Job 만들 때 한 줄 추가 → 완료 시 statusdone으로 바꿔도 검색이 편함.

  • work-run(자동 탐색 러너)나 간단 스크립트가 이 인덱스를 참고하면 더 빨라져요.


4) 자동화: 얇게 유지하는 4가지 루틴

A) “Close & Move”(핫 → 웜)

  • 종료 커밋/정리 후:

    1. 05_Output/intermediate 압축 또는 삭제

    2. 06_Export만 남기고 나머지 로그는 7~30일 보존

    3. 폴더를 타입/연도/mv

    4. index.csv 상태 done 업데이트

B) “Archive”(웜 → 콜드)

  • 90일 지난 done99_Archive/25_Jobs/연도/로 이동

  • 70_Exports엔 최종본 링크 또는 복사

C) “Thin Logs”

  • 30일 지난 *.loggzip

  • 대용량 *.csv 중간 산출은 해시만 남기고 삭제 가능

D) “Top-N Active Rule”

  • _active/가 12개 초과 시 today에 경고: 가장 오래된 3개 를 Warm로 이동

원하면 위 4개를 묶은 주간 스윕 스크립트 도 내줄 수 있어요(쉘/PS/tcsh 버전).


5) (선택) 대용량 데이터 분리

대용량 원천/중간 데이터가 많은 편이면 아래처럼 분리하면 Jobs가 가벼워집니다.

Work/
  26_Data/
    raw/<dataset or source>/...
    cache/<tool or proj>/...
  • Job의 02_Input/raw에는 심볼릭 링크 또는 경로만 두기

  • 데이터 버전 기록은 Job의 03_Config/params.yml에 해시/버전/경로로 남김


6) 콘솔에서 빠르게 찾기/열기 (예시 스니펫)

Bash/Zsh: 타입별/상태별 리스트

jobs-find() { find "$HOME/Work/25_Jobs/${1:-_active}" -maxdepth 2 -type d -name "*-20*" | sort; }
jobs-open() { cd "$(jobs-find "$1" | fzf)" || return; }
# 사용: jobs-open _active  /  jobs-open BUG/2025

PowerShell:

function JobsOpen($path="$_active") {
  $root="$HOME\Work\25_Jobs\$path"
  Get-ChildItem $root -Recurse -Depth 2 -Directory | Out-GridView -PassThru | Set-Location
}

(tcsh 버전도 원하면 줄게요.)


7) 템플릿은 한 곳에만

  • 25_Jobs/_templates/JOB/BUG/SMOKE/LAB/EX/REL 스켈레톤 6개만 유지

  • 새 작업은 항상 여기서 복제 → 템플릿 중복을 없애고 한 번만 관리


8) Today/런처와의 연동 (가볍게)

  • _active/런처 대상 에 포함 → 완료와 동시에 자동 제외

  • work-run 자동 탐색 러너를 쓰면 _active/**/04_Run/*.sh|ps1만 우선 순위로 스캔


오늘 할 일(3분 셋업)

  1. 25_Jobs 안에 _active/, _templates/, JOB/2025, BUG/2025, SMOKE/2025, LAB/2025, EX/2025, REL/2025 만들기

  2. 진행 중 Job을 전부 _active/로 옮기기(12개 이하로)

  3. 완료된 것들은 타입/연도 폴더로 정리

  4. index.csv 초안 만들어 상단 10개만 우선 채우기


요약

  • 모든 새 작업은_active/에서 시작 → 끝나면 타입/연도로 이동 → 오래되면 99_Archive.

  • 템플릿은 한 군데(_templates/)만.

  • (원하면) 26_Data 로 대용량 분리.

  • 주간 스윕 스크립트/자동 탐색 러너로 손 가는 정리 작업 0에 가깝게.

필요하면 위 구조로 폴더/인덱스/스윕 스크립트 세트 를 바로 만들어 드릴게—쓰는 셸(bash/zsh/PowerShell/tcsh)만 알려줘!

DB 같은 데이터셋들을 저장하고 싶을 땐 어디에 해야할까?

좋은 질문! DB 같은 데이터셋 은 코드/산출과 분리해서 전용 루트 에 보관하는 게 최고예요.
내역 추적·복구·용량 관리가 쉬워지고, 25_Jobs도 가벼워집니다.


추천 위치: Work/26_Data/ (데이터 전용 루트)

26_Data/                                   ← 데이터셋 중앙 저장소
├─ registry/                               ← 카탈로그(메타데이터)
│  ├─ catalog.csv
│  └─ README.md
├─ raw/                                    ← 원본(불변) 스냅샷/덤프
│  ├─ db/
│  │  ├─ postgres/<db_name>/snapshots/YYYY/<TS>/  ← .dump(.gz) or .sql.gz
│  │  │  ├─ dump.sql.gz
│  │  │  ├─ SHA256SUMS
│  │  │  └─ manifest.yml                   ← 출처/버전/테이블/PII/라이선스 등
│  │  └─ mysql/<db_name>/snapshots/...
│  └─ files/<source>/<dataset>/<YYYY-MM-DD>/  ← CSV/JSON/ZIP 등 외부 파일 원본
├─ processed/                              ← 정제/정규화/파케이(Parquet) 등 2차 산출
│  └─ <dataset>/<version>/
├─ samples/                                ← 예제/테스트용 소용량 서브셋
│  └─ <dataset>/<version>/
├─ cache/                                  ← 일시 캐시(삭제 가능)
│  ├─ project/<PRJ-slug>/
│  └─ job/<JOB-code>/
└─ schemas/                                ← DDL/스키마(JSON/SQL)
   └─ <engine>/<db_name>/

원칙

  • raw/불변(immutable) 로 취급: 덮어쓰지 말고 스냅샷을 추가 만 합니다.

  • processed/는 파생 데이터(정제/집계), samples/는 작은 학습/테스트셋.

  • cache/는 언제든 지워도 되는 중간물.

  • 큰 원본은 여기 에 두고, Job/Project에서는 경로 참조나 심볼릭 링크 만 사용.


DB 덤프/스냅샷 표준 네이밍

  • 디렉터리: raw/db/<engine>/<db_name>/snapshots/<YYYY>/<YYYYMMDD-HHMMSS>/

  • 파일:

    • Postgres: <db_name>_<YYYYMMDD-HHMMSS>.dump.gz (pg_dump -Fc 후 gzip)

    • MySQL: <db_name>_<YYYYMMDD-HHMMSS>.sql.gz

  • 무결성: SHA256SUMS (여러 파일이면 모두 기록)

  • 메타: manifest.yml 예시 ```yaml dataset: postgres/salesdb snapshot: 2025-08-26T10-20-00 source: prod-rds pii_level: medium # none/low/medium/high license: internal tables:

    • customers: {rows: 120342}
    • orders: {rows: 502113} checksum: dump.sql.gz: "ab12…ef" restore: engine: postgres target_db: salesdb_local ```

26_Data 카탈로그(인덱스) 예시

26_Data/registry/catalog.csv

kind,engine,name,version_or_ts,tags,path,pii,notes
db,postgres,salesdb,2025-08-26T10-20-00,"prod,snapshot",raw/db/postgres/salesdb/snapshots/2025/20250826-102000,medium,"month-end"
files,ext,ad_events,2025-08-01,"ads,csv",raw/files/ad_platform/ad_events/2025-08-01,low,"export via API"

워크플로 (DB 기준, Postgres 예시)

1) 스냅샷(덤프) 만들기 → 26_Data에 보관

# 예: Postgres
TS=$(date +%Y%m%d-%H%M%S)
BASE=~/Work/26_Data/raw/db/postgres/salesdb/snapshots/$(date +%Y)
DEST=$BASE/$TS
mkdir -p "$DEST"
pg_dump -Fc "postgresql://user:pass@host:5432/salesdb" -f "$DEST/dump.dump"
gzip "$DEST/dump.dump"
sha256sum "$DEST/dump.dump.gz" > "$DEST/SHA256SUMS"
# manifest.yml 작성(템플릿 복사 후 수정)

MySQL : mysqldump -u user -p --databases salesdb | gzip > "$DEST/dump.sql.gz"

  • 자격증명90_PersonalConfigs/secrets/.env-db.local 같은 곳에 두고, 스크립트는 환경변수 참조 만 하세요(비밀 직접 기록 금지).

2) 로컬 복원(실험/Job용)

# Postgres
createdb salesdb_local
gunzip -c "$DEST/dump.dump.gz" | pg_restore -d salesdb_local
# 또는: pg_restore -d salesdb_local "$DEST/dump.dump.gz"
  • 컨테이너 사용 시(권장): 85_Environments/docker/docker-compose.yml에 DB 서비스 정의하고,
    26_Data/db/postgres/_volumes/<name>:/var/lib/postgresql/data 볼륨으로 붙입니다.

3) Job/Project에서 쓰기 (링크 또는 경로 참조)

  • 링크(맥/리눅스) :
    ln -s ~/Work/26_Data/raw/db/postgres/salesdb/snapshots/2025/20250826-102000 \
          ~/Work/25_Jobs/JOB-2025-041_report/02_Input/raw/salesdb_20250826
    
  • 경로 설정 : 25_Jobs/.../03_Config/params.yml에 기록
    inputs:
      salesdb_snapshot: "../../../26_Data/raw/db/postgres/salesdb/snapshots/2025/20250826-102000"
    
  • 크레덴셜 : 90_PersonalConfigs/secrets/.env-db.local에, Job 스크립트는 source만.

4) 샘플/서브셋 만들기

  • 테이블 일부만 CSV로 덤프:
    psql salesdb_local -c "\copy (SELECT * FROM customers LIMIT 1000) TO 'customers_sample.csv' CSV HEADER"
    mv customers_sample.csv ~/Work/26_Data/samples/salesdb/v2025.08/
    
  • 반복 쓰면 스크립트화 → 80_Tools/scripts/make_sample_salesdb.sh승격.

5) 정제/정규화 파이프라인

  • ETL/정제 결과는 processed/<dataset>/<version>/...에 저장(Parquet 권장).

  • 파라미터/코드/환경은 해당 Job/Project 쪽에 남기고, 결과물만 processed에.


보안/거버넌스 체크리스트

  • PII/민감도 태깅 : manifest.ymlpii_level 필수.

  • 접근권한 : 고(高) 민감도 스냅샷은 디스크 암호화 또는 gpg로 파일 단위 암호화:
    gpg -c dump.dump.gz   # 복호화는 gpg dump.dump.gz.gpg
    
  • 보존 정책 : raw/는 N개월 보관(예: 12개월); cache/는 7~30일 후 정리.

  • .gitignore : Work 전체를 git에 올리지 않더라도, 26_Data 루트에 보호용 .gitignore 권장:
    *
    !registry/
    !registry/catalog.csv
    !.gitignore
    

(의도치 않은 업로드 방지)


25_Jobs가 가벼워지는 이유

  • 대용량은 전부26_Data: Job에는 링크/경로/manifest만.

  • 완료된 Job을 아카이브해도 데이터는 중앙(26_Data)에 남아 중복 저장 없음.


Today/런처 연결(선택)

10_Today/shortcuts.list 또는 work-run 자동 러너에서 스냅샷·복원 스크립트를 호출:

Snapshot salesdb | 26_Data/raw/db/postgres/salesdb/snapshots | ./../../../../80_Tools/scripts/pg_snapshot_salesdb.sh
Restore salesdb  | 26_Data/raw/db/postgres/salesdb/snapshots/2025/20250826-102000 | ./../../../../80_Tools/scripts/pg_restore_local.sh

요약

  • 데이터는26_Data로 일원화: raw/(불변) · processed/ · samples/ · cache/ · schemas/ · registry/.

  • DB 스냅샷은 엔진/DB/연도/타임스탬프 체계로 보관 + manifest.yml + SHA256SUMS.

  • Job/Project는 경로 참조/심링크 만 사용 → 25_Jobs 비대화 방지.

  • 비밀/크레덴셜은90_PersonalConfigs/secrets, 설정 표준은 32_SharedConfigs, 개인 오버라이드는 90_PersonalConfigs.

원하면 Postgres/MySQL 기준으로 스냅샷/복원 스크립트 두 개(리눅스·PowerShell·tcsh)manifest.yml 템플릿, 그리고 registry/catalog.csv 초기 파일까지 실제 파일 로 만들어줄게.

그런 db는 아니고 dataset (input/output 등)을 저장하려고

굿! DB 덤프가 아니라 ‘데이터셋(입력/출력)’을 보관하려는 거라면, 코드는 그대로 두고 데이터만 중앙화 하면 깔끔해요. 아래처럼 정리하면 됩니다.


한 줄 요약

  • 중앙 저장소 : Work/26_Data/

  • 입력 데이터셋 : 26_Data/datasets/…

  • 가공/출력 데이터셋(여러 Job에서 재사용할 가치가 있는 결과): 26_Data/derived/…

  • Job/Project 에서는 경로 참조 또는 심볼릭 링크만 사용 (복사 금지)


폴더 구조(권장)

26_Data/                                  ← 데이터 전용 루트
├─ registry/                               ← 카탈로그/색인
│  ├─ catalog.csv                          ← 데이터셋 목록/버전/경로
│  └─ README.md                            ← 등록 규칙
├─ datasets/                               ← “입력” 데이터셋(원본/정제)
│  └─ <dataset_name>/
│     └─ vYYYY.MMDD/                       ← 날짜 버전 추천(또는 semver)
│        ├─ raw/                           ← 주로 외부 원본(가급적 불변)
│        ├─ interim/                       ← 일시 정제(중간물)
│        ├─ processed/                     ← 분석/모델에 투입 가능한 정제본
│        ├─ samples/                       ← 소용량 서브셋(테스트/예제)
│        ├─ docs/                          ← README, dataset_card.md
│        ├─ manifest.yml                   ← 출처/라이선스/체크섬 등 메타
│        └─ SHA256SUMS                     ← 무결성
├─ derived/                                ← “출력/가공 결과” 데이터셋(재사용 가치 있음)
│  └─ <artifact_name>/
│     └─ vYYYY.MMDD/
│        ├─ data/                          ← 결과물(예: parquet/csv/images)
│        ├─ metrics/                       ← 점수/리포트/지표
│        ├─ docs/
│        ├─ manifest.yml
│        └─ SHA256SUMS
└─ cache/                                  ← 언제 지워도 되는 캐시(속도용)

의미

  • datasets/ = 입력 측 “공급원” 저장소

  • derived/ = 여러 Job에서 재사용할 결과물 저장소(“출력 데이터셋” 승격본)

  • Job 안의 06_Export전달본 이고, 장기 재사용 가치가 생기면 derived/로 승격


네이밍 & 메타(짧게)

  • 버전 : vYYYY.MMDD (예: v2025.0825) 권장. 바꾸면 manifest.yml에 이유 기록.

  • 파일 형식 : 가능하면 Parquet(열 지향, 스키마/압축 유리), 그 외 CSV/JSON.

  • manifest.yml 예시
    name: ad_events
    version: v2025.0826
    kind: dataset            # or derived
    license: internal
    source: "ad_platform export API"
    schema: {rows: 5_021_113, format: parquet}
    pii_level: low           # none/low/medium/high
    checksum:
      processed/events.parquet: "ab12...ef"
    notes: "tz normalized to UTC, invalid rows dropped"
    
  • dataset_card.md : 용도/전처리/열 설명/예시 쿼리 1~2개만.

Job/Project에서 쓰는 법(복사 금지! 링크/경로 참조)

심볼릭 링크(맥/리눅스)

ln -s ~/Work/26_Data/datasets/ad_events/v2025.0826/processed \
      ~/Work/25_Jobs/JOB-2025-041_report/02_Input/raw/ad_events

PowerShell(윈도우, 디렉터리 링크)

cmd /c mklink /D ^
  "%USERPROFILE%\Work\25_Jobs\JOB-2025-041_report\02_Input\raw\ad_events" ^
  "%USERPROFILE%\Work\26_Data\datasets\ad_events\v2025.0826\processed"

Job 설정에 경로 기입

# 25_Jobs/.../03_Config/params.yml
inputs:
  ad_events_dir: "../../../26_Data/datasets/ad_events/v2025.0826/processed"

워크플로우(간단)

A) 새 “입력” 데이터셋 추가

  1. 26_Data/datasets/<name>/vYYYY.MMDD/ 생성

  2. raw/에 원본 배치 → 필요 시 interim/processed/ 정제

  3. manifest.yml/dataset_card.md/SHA256SUMS 작성

  4. registry/catalog.csv에 한 줄 등록

B) Job에서 사용

  1. 심링크 or params.yml에 절대/상대 경로 지정

  2. 실행 시 입력버전 을 매니페스트에 기록(재현성)

C) Job “출력”을 재사용 데이터셋으로 승격

  1. Job의 06_Export 결과 중 일반화된 산출물 만 추려

  2. 26_Data/derived/<artifact>/vYYYY.MMDD/에 배치

  3. manifest.yml과 지표(metrics/) 작성 → catalog.csv 등록

D) 정리/청소

  • 60~90일 지난 interim/, 대용량 CSV는 압축 또는 삭제(hash/로그만 보존)

  • cache/는 언제든 삭제 가능


Do / Don’t

  • 중앙화 : 입력/출력 데이터셋은 26_Data 에만, Job/Project는 링크/경로만

  • 버전 고정 : Job 매니페스트에 dataset 버전 을 박아두기

  • 작은 샘플 : samples/를 만들어 테스트/예제에 활용

  • 복사본 남기기 : Job 안에 원본 데이터를 복제해서 쌓지 않기

  • 비밀 넣기 : 자격증명/토큰은 90_PersonalConfigs/secrets/에만


원하면 초기 스캐폴드(폴더/manifest 템플릿/csv 카탈로그)
symlink/catalog 등록을 자동으로 해주는 간단 스크립트(bash·PowerShell·tcsh)도 바로 만들어 줄게.

번호는 26번 괜찮아?

짧은 결론: 네, 26번 아주 괜찮아요.
지금 쓰는 번호 체계(20=Projects, 25=Jobs, 30대=운영/학습, 40=레퍼런스…)에서 데이터셋은 Jobs보다 살짝 뒤 에 두면 “코드→실행→데이터 자산” 흐름이 자연스럽고, 26은 그 목적에 딱 맞습니다.


왜 26인가 (step-by-step)

  1. 시각적 그룹화 :
    20_Projects → 25_Jobs → 26_(Data|Datasets) → 30_Areas
    = 코드 → 실행 → 데이터 자산(공유 입력/출력) → 장기 운영 순서로 정렬.

  2. 근접성 :
    Job이 쓰는 입력/출력 경로를 한 단계 옆(25↔26) 에 두면 경로 참조/심볼릭 링크가 짧고 관리가 쉬움.

  3. 확장 여지 :
    27~29 비워둬서, 나중에 27_ModelStore, 28_FeatureStore 같은 확장도 자연스럽게 끼워 넣기 가능.


이름은 26_Data vs 26_Datasets 중 택1

  • 26_Datasets : “입력/출력 데이터셋”에 초점(당신 목적에 가장 명확)

  • 26_Data : DB 덤프·원천 파일·캐시까지 넓게 포함할 때

지금 대화 맥락상 26_Datasets 추천. (원하면 datasets/derived/cache/registry 하위 그대로 유지)

예시:

26_Datasets/
  registry/         # 카탈로그
  datasets/         # 입력 데이터셋(버전별: vYYYY.MMDD)
  derived/          # 여러 Job에서 재사용할 출력 데이터셋(승격본)
  cache/            # 삭제 가능 캐시

이미 만들어 둔 구조와의 연결 규칙(요약)

  • Job/Project에는 복사 금지심볼릭 링크/경로만 참조

  • Job 매니페스트에 dataset 버전 기록(재현성)

  • 06_Export의 결과 중 “재사용 가치” 있는 건 26_Datasets/derived승격


바꾸고 싶을 때(안전 리네임)

bash/zsh:

cd ~/Work
mv 26_Data 26_Datasets 2>/dev/null || true
sed -i '' 's#/26_Data/#/26_Datasets/#g' 10_Today/shortcuts.list 2>/dev/null || true

PowerShell:

Rename-Item "$HOME\Work\26_Data" "26_Datasets" -ErrorAction SilentlyContinue
(Get-Content "$HOME\Work\10_Today\shortcuts.list") -replace '/26_Data/','/26_Datasets/' |
  Set-Content "$HOME\Work\10_Today\shortcuts.list"

최종 추천 한 줄

  • 번호는 26 유지 , 이름은 26_Datasets로 명확성↑ — 지금 쓰는 워크플로(25_Jobs, 75_Releases, 32_SharedConfigs, 90_PersonalConfigs)와도 정렬이 아주 잘 맞습니다.

전체 구조를 마지막으로 한 번 만들어줘(띄어쓰기 대신에 폴더 선을 이용해서 표현해줬으면 좋겠어, 폴더명은 영어, 설명은 한글로). 그리고 사용 시 주요 주의점도 밑에 써줘.

아래 트리를 그대로 복붙해서 문서에 쓰면 돼요.
(좌측은 폴더명(영문) , - 오른쪽은 설명(한글) 입니다. 하위 예시도 넣었어요.)

Work/                                           - 1인 개발용 작업 루트
├─ 00_Inbox/                                    - 급히 던져두는 임시함(매일/주기적 비우기)
├─ 10_Today/                                    - 오늘 작업 대시보드(콘솔 실행 출발점)
│  ├─ shortcuts.list                             - today 런처가 읽는 "라벨 | 경로 | 명령" 목록
│  └─ wrappers/                                  - 파이프/복잡 인자용 임시 래퍼 스크립트(단기 보관)
├─ 20_Projects/                                 - 툴(파이썬 패키지) 개발(코드 수명 중심)
│  └─ PRJ-YYYY-NNN_name/                         - 개별 프로젝트(예: PRJ-2025-001_sample_app)
│     ├─ src/<package_name>/                     - 패키지 소스(예: sample_app/)
│     ├─ tests/                                  - pytest 테스트
│     ├─ scripts/                                - install/run/build/lint/test 스크립트(.sh/.ps1)
│     ├─ examples/{data,scripts,docs}/           - 배포용 최소 실행 예제
│     ├─ issues/BUG-YYYY-NNN/                    - 버그/개선 이슈 노트
│     ├─ docs/                                   - 설계·ADR·가이드
│     ├─ .devcontainer/                          - 개발 컨테이너 설정
│     └─ pyproject.toml, README.md, .gitignore, .editorconfig
├─ 25_Jobs/                                     - “산출물 작업 단위”(프로세스 수명 중심)
│  ├─ _active/                                   - 진행 중 작업(최대 12개 유지)
│  ├─ _templates/                                - 복제용 스캐폴드(JOB/BUG/SMOKE/LAB/EX/REL)
│  ├─ JOB/                                       - 일반 산출 작업(연도별 보관)
│  │  └─ 2025/
│  ├─ BUG/                                       - 배포 버그 재현/증거/검증
│  │  └─ 2025/
│  ├─ SMOKE/                                     - 새 툴 스모크/feasibility
│  │  └─ 2025/
│  ├─ LAB/                                       - 재현형 교육 실습
│  │  └─ 2025/
│  ├─ EX/                                        - 배포 예제 패키징
│  │  └─ 2025/
│  └─ REL/                                       - 릴리스 준비/검증(Job 형태)
│     └─ 2025/
├─ 26_Datasets/                                 - 데이터셋 중앙 저장소(입력/출력 자산)
│  ├─ registry/                                   - 카탈로그(색인)
│  │  ├─ catalog.csv                              - 데이터셋 목록/버전/경로
│  │  └─ README.md                                - 등록 규칙
│  ├─ datasets/                                   - “입력” 데이터셋(원본/정제)
│  │  └─ <dataset_name>/vYYYY.MMDD/               - 날짜 버전 권장(예: v2025.0826)
│  │     ├─ raw/                                  - 외부 원본(불변 취급)
│  │     ├─ interim/                              - 일시 정제(중간물)
│  │     ├─ processed/                            - 분석/모델 투입용 정제본
│  │     ├─ samples/                              - 소용량 서브셋(테스트/예제)
│  │     ├─ docs/                                 - README, dataset_card.md
│  │     ├─ manifest.yml                          - 출처/스키마/체크섬/라이선스
│  │     └─ SHA256SUMS                            - 무결성 체크섬
│  ├─ derived/                                    - 재사용 가치 있는 “출력” 데이터셋(승격본)
│  │  └─ <artifact_name>/vYYYY.MMDD/
│  │     ├─ data/                                 - 결과물(예: parquet/csv/images)
│  │     ├─ metrics/                              - 점수·지표·리포트
│  │     ├─ docs/, manifest.yml, SHA256SUMS
│  └─ cache/                                      - 언제 지워도 되는 캐시
├─ 30_Areas/                                    - 장기 운영 영역(지속 업무)
│  ├─ worklog/YYYY/YY-MM/DATE.md                 - 일일/주간 5줄 로그
│  ├─ environments/                               - 공통 환경 전략(예: 파이썬 버전 정책)
│  └─ knowledge_base/{tips,cheatsheets,howtos}/   - 축적 지식: 팁/치트시트/가이드
├─ 31_Labs/                                     - 실험실(짧은 실습/프로토타입; 재현 불필요)
│  └─ jupyter/                                   - 스크래치 노트북(예: regex_scratch.ipynb)
├─ 32_SharedConfigs/                            - 공유/골든 설정(문서화·재사용)
│  ├─ global/{vscode,ruff,pytest,pyinstaller,pyside6,jupyter}/
│  └─ projects/<project_slug>/                   - 특정 프로젝트 기본설정
├─ 40_Resources/                                - 참고 자료(교육/매뉴얼/스펙—설정 제외)
│  ├─ edu/{courses,tutorials,papers/{to_read,reading_notes,summaries}}/
│  ├─ manuals/<vendor>/<product>/<version>/      - 매뉴얼/가이드(PDF/HTML/MD)
│  └─ reference/                                 - 표준/스펙 문서 등 읽을거리
├─ 50_Snippets/{sql,text,bash}/                 - 재사용 코드/문구 조각(짧은 예제·원라이너)
├─ 60_Assets/                                   - 로고/폰트/템플릿 등 브랜딩 리소스
├─ 70_Exports/                                  - 여러 Job의 “최종 전달본” 모아보기(선택)
├─ 75_Releases/                                 - 유저 배포 전용(버전드)
│  └─ <project_slug>/
│     ├─ vX.Y.Z/{installers,wheels,portable,docs,licenses,checksums,ReleaseNotes.md}
│     └─ latest/                                - 최신 버전 포인터
├─ 80_Tools/                                    - 설치파일/포터블/자동화 스크립트
│  ├─ installers/                                - 오프라인 설치 + install_notes.md(버전·체크섬)
│  ├─ bin/                                       - 포터블 실행파일(PATH 추가 가능)
│  ├─ scripts/                                   - bootstrap/release/checksum 등 공용 스크립트
│  └─ devcontainer/                              - 개발 컨테이너 도구
├─ 85_Environments/                             - 재현 가능한 개발 환경 샘플
│  ├─ conda/environment.yml
│  ├─ venv/README.md
│  └─ docker/Dockerfile
├─ 90_PersonalConfigs/                          - 개인 설정(오버라이드·비공개)
│  ├─ os/{mac,win,linux}/                        - OS별 설정(키맵/입력기 등)
│  ├─ shell/{bash,zsh,tcsh,powershell}/          - 프로필·별칭
│  ├─ editors/vscode/{settings.user.json,keybindings.user.json}
│  ├─ git/.gitconfig.local
│  ├─ python/{pip.conf,poetry.toml,pypirc}
│  ├─ tools/                                     - 각 툴 개인 프리셋
│  ├─ secrets/README.md                          - (실제 비밀은 두지 말 것)
│  └─ .gitignore                                 - *.local, secrets/*, *.pem 등 넓게 제외
└─ 99_Archive/                                  - 완료 Project/Job/자료 장기 보관(읽기 전용)

사용 시 주요 주의점 (핵심 체크리스트)

  1. 단일 정본 원칙

    • 코드 정본은 20_Projects/, 산출 파이프라인은 25_Jobs/, 데이터셋은 26_Datasets/에만 둡니다.

    • 다른 위치에는 복사하지 말고 경로 참조/심볼릭 링크만 사용하세요.

  2. 10_Today는 ‘대시보드’

    • 원본을 옮기지 않습니다. 링크/런처만 두고, 편집은 본래 위치에서.

    • 콘솔 위주면 shortcuts.list 또는 work-run 자동 탐색 러너만 사용.

  3. 25_Jobs 비대화 방지

    • 새 작업은 항상 25_Jobs/_active/타입-YYYY-NNN_제목/에서 시작 → 완료 즉시 타입/연도/로 이동.

    • _active/는 최대 12개 규칙, 30일 지난 로그는 압축, 중간물은 정리.

  4. 데이터 버전/무결성

    • 입력/출력 데이터셋은 vYYYY.MMDD 버전으로 관리하고 manifest.yml + SHA256SUMS를 필수 기록.

    • 26_Datasets/cache/는 언제든 삭제 가능. 중요한 데이터는 raw/ 또는 processed/에.

  5. 설정 레이어링(우선순위)

    • Project 로컬 → 90_PersonalConfigs(개인 오버라이드) → 32_SharedConfigs/projects/<proj>32_SharedConfigs/global.

    • VSCode/ruff/pytest 등은 *.local.*로 개인 설정을 분리하면 충돌 최소화.

  6. 보안/비밀 관리

    • 자격증명/토큰/키는 90_PersonalConfigs/secrets/에만 두고, 코드/스크립트는 환경변수로 읽기.

    • 레포에 올릴 땐 .gitignore가 비밀/대용량을 확실히 제외하는지 확인.

  7. 깊이 제한 & 네이밍

    • 폴더 깊이는 최대 3단 을 목표로(탐색/권한/동기화 이슈 감소).

    • 규칙적 네이밍: PRJ-연도-번호_이름, JOB/BUG/SMOKE/LAB/EX/REL-연도-번호_이름, 파일은 YYYY-MM-DD_제목_v001.ext.

  8. 릴리스 품질 보장

    • 배포는 항상 75_Releases/<project>/vX.Y.Z/로만 공유. checksums/와 ReleaseNotes.md 포함.

    • latest/ 업데이트 시 실제 버전 폴더 내용과 일치 확인.

  9. 대용량 데이터 분리 고려

    • 정말 큰 원천/캐시는 26_Datasets 하위에만 두고, Job/Project에는 링크로만 연결. 백업 정책도 별도로.
  10. 운영 루틴

  • 매일: 00_Inbox 비우기, Today 정리.

  • 주 1회: _active 슬림화, shortcuts.list Top10 유지, 로그 압축.

  • 월 1회: 데이터 카탈로그 갱신, 불용 Job/데이터 아카이브.

필요하면 이 구조를 초기 폴더/README/샘플 파일 세트 로 바로 생성해 드릴게요. (선호 셸: bash/zsh/tcsh/PowerShell 알려주면 해당 스크립트도 포함해서!)

manifest.yml는 어떻게 작성해야해? 그리고 checksum는 어떻게 만들어?

좋아! manifest.yml 은 “이 데이터셋이 무엇이며, 어디서 왔고, 어떻게 만들었고, 무엇으로 검증했는가”를 기록하는 증빙 카드 예요.
checksum 은 파일 무결성을 확인하기 위한 지문 이고, 보통 SHA256SUMS라는 텍스트 파일로 함께 둡니다.

아래를 그대로 따라 하면 됩니다.


1) manifest.yml 작성 가이드

위치

  • 각 버전 루트에 둡니다.
    예:
    Work/26_Datasets/datasets/<dataset_name>/vYYYY.MMDD/manifest.yml
    Work/26_Datasets/derived/<artifact_name>/vYYYY.MMDD/manifest.yml

최소 필수 필드 (작게 시작)

name: ad_events                  # 데이터셋/아티팩트 이름
kind: dataset                    # dataset | derived
version: v2025.0826             # 버전(권장: vYYYY.MMDD)
created_at: 2025-08-26T14:30:00+09:00
owner: your.name@company.com

source:                          # 어디서 왔는가(입력 데이터셋이면 필수)
  type: external                 # external | internal | manual
  detail: "ad_platform export API v3"

schema:                          # 간단 스키마(요약)
  format: parquet                # parquet | csv | json | image | ...
  rows: 5021113
  columns:
    - {name: event_id, type: string}
    - {name: ts_utc,   type: timestamp}
    - {name: campaign, type: string}
    - {name: cost,     type: float}

pii_level: low                   # none | low | medium | high
license: internal                # 라이선스/사용 제한

files:                           # 포함 파일 요약(상대경로)
  - path: processed/events.parquet
    bytes: 812345678
    sha256: "ab12...ef"          # 선택(있으면 SHA256SUMS와 동일해야 함)

notes: "tz normalized to UTC, invalid rows dropped"

파생(derived) 데이터셋일 때의 추가 필드

kind: derived
lineage:                          # 어떤 입력/코드/실행에서 나왔는가
  inputs:
    - {name: ad_events, version: v2025.0826, path: "../../../datasets/ad_events/v2025.0826/processed"}
  code:
    repo: "PRJ-2025-001_sample_app"       # 또는 Git URL
    commit: "a1b2c3d"                     # 생성에 사용한 커밋/태그
  job:
    id: "JOB-2025-041_reportX"            # (있으면) 생산 Job 코드

metrics:                          # 품질/성능 요약(선택)
  records_after_filters: 4988333
  null_rate_cost: 0.0004
  sanity_checks:
    - "timestamp not null: pass"
    - "cost >= 0: pass"

확장 필드(필요할 때만)

  • tool_versions: Python/패키지/CLI 버전

  • constraints: 사용 제한, 만료일

  • hash_tree: 전체 디렉터리 해시(고급)

규칙

  • 짧게 시작(필수만) → 진짜 필요한 메타만 점진적으로 추가

  • 경로는 상대경로 로 적되, 항상 버전 루트 기준 으로 기록


2) SHA256SUMS 만들기 (무결성 체크섬)

파일 위치/이름

  • 각 버전 루트에 SHA256SUMS(확장자 없음)로 둡니다.

  • 내용 포맷:

    <sha256>  <상대경로>
    

예:
d2c7...9fa processed/events.parquet

macOS / Linux (bash/zsh)

버전 루트에서 실행:

# 1) 기존 파일 제거(있다면)
rm -f SHA256SUMS

# 2) 모든 파일에 대해 sha256 생성(숨김·SUMS 제외)
find . -type f ! -name 'SHA256SUMS' ! -name '.*' -print0 \
| xargs -0 sha256sum > SHA256SUMS
# macOS에는 sha256sum이 없을 수 있음 → 대체:
# find . -type f ! -name 'SHA256SUMS' ! -name '.*' -exec sh -c 'shasum -a 256 "$1" | sed "s#  #  #"' _ {} \; > SHA256SUMS

# 3) 검증(선택)
sha256sum -c SHA256SUMS
# macOS 대체:
# awk '{print $2}' SHA256SUMS | while read -r f; do
#   calc=$(shasum -a 256 "$f" | awk '{print $1}')
#   want=$(grep "  $f$" SHA256SUMS | awk '{print $1}')
#   [[ "$calc" == "$want" ]] && echo "OK  $f" || echo "FAIL  $f"
# done

Windows (PowerShell)

# 버전 루트에서 실행:
Remove-Item -Force SHA256SUMS -ErrorAction SilentlyContinue
Get-ChildItem -Recurse -File -Force | Where-Object {
  $_.Name -ne 'SHA256SUMS' -and -not $_.Name.StartsWith('.')
} | ForEach-Object {
  $h = (Get-FileHash $_.FullName -Algorithm SHA256).Hash.ToLower()
  $rel = $_.FullName.Substring((Get-Location).Path.Length + 1).Replace('\','/')
  "$h  $rel"
} | Set-Content -NoNewline -Path SHA256SUMS

# 검증:
Get-Content SHA256SUMS | ForEach-Object {
  $parts = $_ -split '\s\s'
  $want = $parts[0]; $file = $parts[1]
  $got = (Get-FileHash $file -Algorithm SHA256).Hash.ToLower()
  if ($got -eq $want) { "OK  $file" } else { "FAIL  $file" }
}

tcsh

tcsh

# 버전 루트에서 실행:
rm -f SHA256SUMS
# GNU coreutils(sha256sum)가 있으면:
find . -type f ! -name 'SHA256SUMS' ! -name '.*' -print0 | xargs -0 sha256sum > SHA256SUMS
# 없고 macOS 기본이라면:
# find . -type f ! -name 'SHA256SUMS' ! -name '.*' -exec sh -c 'shasum -a 256 "$1"' _ {} \; > SHA256SUMS

생성/검증 스크립트로 고정(추천)

  • 공용 : Work/80_Tools/scripts/checksum_all.sh|ps1|csh

  • 사용법 : 버전 루트에서 checksum_all.sh 실행 → SHA256SUMS 생성 → -c 옵션으로 검증


3) 함께 쓰는 운영 팁

  • manifest vs SHA256SUMS

    • SHA256SUMS : 파일 전체 목록 과 해시(머신용, 검증 전용)

    • manifest.yml : 주요 파일 요약/메타(사람이 읽기 쉬운 카드)
      → 둘 다 있되, manifest의 files[].sha256핵심 파일만 넣어도 충분

  • 무결성 실패 시

    • 전송/압축/복사 과정에서 손상 가능 → 원본에서 다시 가져와 SUMS 재생성

    • 라인 엔딩/권한과 무관(바이너리 기준)이라 신뢰도 높음

  • 제외 대상

    • SUMS 만들 때 숨김파일(.*)SHA256SUMS 자신은 제외

    • 캐시/임시 파일은 cache/에만 두고 SUMS에서 자연히 제외되게

  • 대용량 최적화

    • Parquet 등 대형 파일은 생성 직후 SUMS를 만들어두고, 나중엔 변경 금지(불변 원칙)
  • 버전 규칙

    • vYYYY.MMDD스냅샷 의미 가 분명해짐. 파생물도 동일 규칙 사용

빠른 시작(복붙용 템플릿)

입력 데이터셋:manifest.yml

name: <dataset_name>
kind: dataset
version: vYYYY.MMDD
created_at: 2025-08-26T00:00:00+09:00
owner: your.name@company.com
source:
  type: <external|internal|manual>
  detail: "<설명/링크>"
schema:
  format: <parquet|csv|json|image|...>
  rows: <int or unknown>
  columns:
    - {name: <col1>, type: <type>}
pii_level: <none|low|medium|high>
license: <internal|...>
files:
  - {path: <relative/file>, bytes: <int>, sha256: "<optional>"}
notes: "<중요 정제/전처리 노트>"

파생 데이터셋:manifest.yml

name: <artifact_name>
kind: derived
version: vYYYY.MMDD
created_at: 2025-08-26T00:00:00+09:00
owner: your.name@company.com
lineage:
  inputs:
    - {name: <dataset_a>, version: vYYYY.MMDD, path: "../../../datasets/<dataset_a>/vYYYY.MMDD/processed"}
  code:
    repo: "<PRJ-... or git URL>"
    commit: "<hash or tag>"
  job:
    id: "<JOB-YYYY-NNN_title>"
schema:
  format: <parquet|csv|...>
  rows: <int>
metrics:
  records_after_filters: <int>
  sanity_checks:
    - "rule: pass/fail"
notes: "<변환 요약/제약>"

필요하면 위 체크섬 생성/검증 스크립트80_Tools/scripts/에 넣은 버전으로 만들어 줄게—쓰는 셸(bash/zsh/PowerShell/tcsh)만 말해줘!

폰트 파일은 어디 저장해?

짧게: Work/60_Assets/fonts/ 아래에 둬요.
여긴 로고/템플릿과 같은 “브랜딩/시각 자산” 영역이라 폰트의 정본 위치 로 딱 맞습니다.


권장 폴더 트리(복붙)

Work/
└─ 60_Assets/                               - 브랜딩/시각 자산
   └─ fonts/                                - 폰트 정본 저장소
      ├─ _catalog.csv                       - (선택) 폰트 목록/버전/라이선스 인덱스
      ├─ <FamilyName>/                      - 예: Pretendard, Inter, NotoSansKR
      │  └─ vX.Y/                           - 폰트 패밀리 버전(없으면 v1.0 등)
      │     ├─ desktop/                     - 앱/문서용: OTF/TTF
      │     ├─ web/                         - 웹/경량 배포: WOFF2(권장), WOFF
      │     ├─ variable/                    - 가변 폰트(옵션)
      │     ├─ subsets/                     - 부분 서브셋(예: KR-basic, UI-only)
      │     ├─ license/                     - LICENSE, README-LICENSE.md
      │     ├─ specimen/                    - 샘플 이미지/미리보기
      │     └─ SHA256SUMS                   - 무결성 체크섬(옵션)
      └─ <FamilyName2>/
         └─ vX.Y/...

프로젝트 전용 폰트?
정본은 위에 두고, 프로젝트에서는 링크/빌드시 복사 만 해요. (복사본이 정본이 되지 않도록!)


운용 규칙(핵심)

  • 정본은 60_Assets/fonts : 여기만 갱신하고, 나머지는 참조/동기화.

  • 버저닝 : 폰트 패밀리마다 vX.Y 폴더를 만들어 버전 충돌을 방지.

  • 라이선스 동봉 : license/에 LICENSE, 사용범위 메모(웹 임베드 가능 여부 등).

  • 무결성(선택) : 대외 배포/릴리스에 들어가면 SHA256SUMS 생성(아래 예시).

  • 개인 설치본 은 OS에 설치하되(시스템 폴더), 정본은 변하지 않게 60_Assets에 유지.


프로젝트에서 쓰는 법

1) 데스크탑 앱(PySide6/Qt 등)에서 번들

  • 복사 방식(빌드 시) : 빌드 스크립트에서 필요한 파일만 프로젝트로 동기화.
    # 예: Inter v4.0의 OTF만 앱 리포지토리로 동기화
    rsync -av \
      "$HOME/Work/60_Assets/fonts/Inter/v4.0/desktop/" \
      "$HOME/Work/20_Projects/PRJ-2025-001_app/assets/fonts/"
    
  • 런타임 로드(PySide6) :
    from PySide6.QtGui import QFontDatabase, QFont
    QFontDatabase.addApplicationFont(":/assets/fonts/Inter-Regular.otf")
    QApplication.setFont(QFont("Inter", 10))
    

2) 웹/CSS에서 임베드

/* WOFF2 우선 */
@font-face{
  font-family:"Inter";
  src: url("/assets/fonts/Inter/v4.0/web/Inter-Variable.woff2") format("woff2");
  font-weight: 100 900; /* variable */
  font-style: normal;
  font-display: swap;
}
body{ font-family: "Inter", "Noto Sans KR", system-ui, -apple-system, sans-serif; }

3) 릴리스에 포함(선택)

  • 폰트를 앱과 함께 배포하면, 해당 프로젝트의 75_Releases/<project>/vX.Y.Z/docs/
    라이선스 요약 을 반드시 포함하세요(배포권한 확인).

서브셋/가변 폰트 팁

  • 가변 폰트(variable)가 있다면 우선 고려(파일 수↓, 품질↑).

  • 웹/경량 배포는 WOFF2만 으로 충분한 경우가 많음.

  • 서브셋 은 UI에 필요한 글리프만 추출해 용량을 크게 줄일 수 있어요.
    (툴: pyftsubset 등—원하면 스크립트 만들어 드림)


라이선스/보안 주의

  • 상업용/배포제한 폰트는 리포지토리에 올리지 말고,
    60_Assets/fonts/<Family>/vX.Y/license/사용범위 메모 를 명확히.

  • 팀 공유가 불가하면, 개인 환경에는 OS 설치 만 하고 정본은 내부 서버/스토리지에 두기.

  • 외부 배포 시 README-LICENSE.md에 출처/허용범위/금지사항 요약.


체크섬(SHA256) 만들기(옵션)

버전 루트에서:

# macOS/Linux (sha256sum 있을 때)
find . -type f ! -name 'SHA256SUMS' ! -name '.*' -print0 | xargs -0 sha256sum > SHA256SUMS

# macOS 기본(shasum) 대체
find . -type f ! -name 'SHA256SUMS' ! -name '.*' -exec sh -c 'shasum -a 256 "$1" | sed "s#  #  #"' _ {} \; > SHA256SUMS

Windows PowerShell:

Remove-Item -Force SHA256SUMS -ErrorAction SilentlyContinue
Get-ChildItem -Recurse -File -Force | Where-Object { $_.Name -ne 'SHA256SUMS' -and -not $_.Name.StartsWith('.') } |
  ForEach-Object {
    $h=(Get-FileHash $_.FullName -Algorithm SHA256).Hash.ToLower()
    $rel=$_.FullName.Substring((Get-Location).Path.Length+1).Replace('\','/')
    "$h  $rel"
  } | Set-Content -NoNewline SHA256SUMS

빠른 체크리스트

  • 폰트 정본: 60_Assets/fonts (버전·라이선스 동봉)

  • 프로젝트: 빌드시 동기화/복사 또는 런타임 로드(정본은 건드리지 않기)

  • 웹: WOFF2 +font-display: swap, 시스템 폰트 적절한 폴백

  • 데스크탑: 애플리케이션 번들에 포함하면 라이선스 확인 필수

  • 서브셋/가변 폰트로 용량 최적화 , 필요 시 스크립트화

원하면 네가 쓰는 폰트 패밀리(예: Pretendard, Noto Sans KR) 기준으로
초기 트리 + 빌드 동기화 스크립트(bash/PowerShell/tcsh)까지 만들어줄게.

다운로드 파일들 저장할 폴더도 추가해줘

좋아, 다운로드 전용 착륙지(Landing Zone)를 추가하자.
기존 00_Inbox(수작업 스크랩/임시)와 구분해서, 브라우저/CLI가 내려받는 파일 은 여기로 모으고 정리 후 각 “정본 위치”로 이동하는 흐름이 깔끔해.


추가 트리 (복붙용) — 영문 폴더명 + 한글 설명

Work/
├─ 05_Downloads/                               - 다운로드 착륙지(Landing Zone, 정리 전 임시)
│  ├─ _inbox/                                  - 브라우저/툴 기본 저장 경로(정리 전)
│  ├─ installers/                              - 설치 파일 임시(.exe/.msi/.pkg/.dmg/.whl/.zip)
│  ├─ datasets/                                - 데이터셋 압축/CSV 임시(해제 전)
│  ├─ manuals/                                 - 매뉴얼/가이드 PDF/HTML 임시
│  ├─ assets/                                  - 폰트/아이콘/템플릿 등 임시
│  ├─ quarantine/                              - 의심 파일(검사 전 격리)
│  └─ README_SORTING.md                        - 분류 규칙 요약(어디로 옮길지 안내)
├─ 10_Today/
├─ 20_Projects/
├─ 25_Jobs/
├─ 26_Datasets/
├─ 30_Areas/
├─ 31_Labs/
├─ 32_SharedConfigs/
├─ 40_Resources/
├─ 50_Snippets/
├─ 60_Assets/
├─ 70_Exports/
├─ 75_Releases/
├─ 80_Tools/
├─ 85_Environments/
├─ 90_PersonalConfigs/
└─ 99_Archive/

라우팅 규칙(다운로드 → 정본 위치)

분류(05_Downloads 하위) 정리 완료 시 최종 위치(정본) 비고
installers/ 80_Tools/installers/ 버전·체크섬 기록(install_notes.md, SHA256)
datasets/ 26_Datasets/datasets/<name>/vYYYY.MMDD/{raw→processed} 압축 해제 후 manifest.yml 작성
manuals/ 40_Resources/manuals/<vendor>/<product>/<version>/ PDF/HTML/MD
assets/ (폰트 등) 60_Assets/fonts/… 60_Assets/... 라이선스 동봉, 버전 폴더 유지
_inbox/ 기타 용도에 따라 위 카테고리로 이동 스크린샷/메모는 00_Inbox가 더 적합

원칙: 05_Downloads는 임시. 정리 끝나면 비워서 가볍게 유지!


브라우저/툴 연동(선택)

  • 기본 다운로드 경로Work/05_Downloads/_inbox로 지정.

  • 시스템 “다운로드” 폴더를 바꾸고 싶다면, 심볼릭 링크 로 연결:

macOS/Linux

# 기존 ~/Downloads를 백업/삭제 후 Today 착륙지로 링크
mv ~/Downloads ~/Downloads.bak 2>/dev/null || true
ln -s "$HOME/Work/05_Downloads/_inbox" "$HOME/Downloads"

Windows (PowerShell 관리자)

ren "$HOME\Downloads" Downloads.bak
cmd /c mklink /D "%USERPROFILE%\Downloads" "%USERPROFILE%\Work\05_Downloads\_inbox"

부담되면, 브라우저(Chrome/Edge/Firefox)에서 해당 경로만 기본 폴더로 지정해도 충분.


주간 정리 루틴(가볍게)

  1. installers/80_Tools/installers/로 이동 + install_notes.md 업데이트

  2. datasets/ → 압축 해제 → 26_Datasets/datasets/<name>/vYYYY.MMDD/raw에 배치

    • manifest.yml 초안 작성, SHA256SUMS 생성(무결성)
  3. manuals/40_Resources/manuals/...로 이동

  4. assets/(폰트 등) → 60_Assets/...로 이동

  5. _inbox/ → 비우기(불필요 파일 삭제, 기타는 적절한 곳으로 라우팅)

  6. quarantine/ → 바이러스/정책 검사 후 처리


today/런처에 한 줄 추가(선택)

Sort downloads       | 05_Downloads               | ${EDITOR:-vi} README_SORTING.md
Open installers box  | 80_Tools/installers        | ls -al

사용 시 주요 주의점

  • 정본은 각 전용 폴더 : 05_Downloads는 절대 정본 보관소가 아님. 정리 후 반드시 이동.

  • 체크섬/메타 : 데이터셋·설치파일은 이동 전에 SHA256SUMS 생성, manifest.yml/install_notes.md 기록.

  • 보안 : 알 수 없는 파일은 quarantine/로 옮겨 검사 후 사용.

  • 용량 관리 : _inboxdatasets의 압축본은 해제 후 삭제(정본은 26_Datasets).

  • .gitignore : Work를 레포로 관리한다면 05_Downloads/**는 반드시 무시.

  • 중복 방지 : 동일 파일이 정본 위치에 있으면 복사 금지 , 덮어쓰기 대신 버전 폴더 사용.

필요하면 05_Downloads에서 자동 분류(installers/datasets/manuals/…) 하고
정본 위치로 옮기면서 체크섬까지 생성 하는 스윕 스크립트(bash/PowerShell/tcsh)도 만들어줄게.

오 생각보다 빠른 번호네 나는 98 정도 생각했어

좋아, 번호는 취향/운영 철학 문제라 05든 98이든 OK야.
아래처럼 장단점 비교 → 98로 쓸 때의 최종안(트리/규칙/리네임 명령)까지 한 번에 정리해줄게.


어떤 번호가 좋을까? (짧은 판단 기준)

  1. 05_Downloads (상단 배치)

    • 장점: 파일 탐색기에서 항상 맨 위 에 보여서 “받자마자 분류”가 쉬움.

    • 단점: 상단이 복잡해 보일 수 있음.

  2. 98_Downloads (하단 배치) ← 네가 선호

    • 장점: 작업 트리의 말미 에 있어 시각적 소음 ↓, “임시/정리대상” 느낌이 분명.

    • 단점: 스크롤이 조금 늘어남. (대신 브라우저 기본경로만 잘 맞추면 문제 없음)

결론: 98도 충분히 합리적. “임시·정리대상”을 뒤로 미루고 싶다면 98이 좋아.


98로 쓰는 최종안 (복붙용)

Work/
├─ 00_Inbox/                                  - 수작업 스크랩/임시(노트·스크린샷)
├─ 10_Today/
├─ 20_Projects/
├─ 25_Jobs/
├─ 26_Datasets/
├─ 30_Areas/
├─ 31_Labs/
├─ 32_SharedConfigs/
├─ 40_Resources/
├─ 50_Snippets/
├─ 60_Assets/
├─ 70_Exports/
├─ 75_Releases/
├─ 80_Tools/
├─ 85_Environments/
├─ 90_PersonalConfigs/
├─ 98_Downloads/                              - 다운로드 착륙지(Landing Zone, 정리 전 임시)
│  ├─ _inbox/                                 - 브라우저/툴 기본 저장 경로
│  ├─ installers/                             - 설치 파일(.exe/.msi/.pkg/.dmg/.whl/.zip)
│  ├─ datasets/                               - 데이터셋 압축/CSV 임시(해제 전)
│  ├─ manuals/                                - 매뉴얼/가이드 PDF/HTML 임시
│  ├─ assets/                                 - 폰트/아이콘/템플릿 등 임시
│  ├─ quarantine/                             - 의심 파일(검사 전 격리)
│  └─ README_SORTING.md                       - 분류 규칙 요약(최종 위치 안내)
└─ 99_Archive/

라우팅 규칙(변경 없음, 폴더만 98로 교체)

98_Downloads 하위 정본 최종 위치 비고
installers/ 80_Tools/installers/ 버전·체크섬 install_notes.md, SHA256SUMS
datasets/ 26_Datasets/datasets/<name>/vYYYY.MMDD/{raw→processed} manifest.yml 작성
manuals/ 40_Resources/manuals/<vendor>/<product>/<version>/  
assets/ 60_Assets/... 폰트는 60_Assets/fonts/...
_inbox/ 기타 상황에 맞게 위 카테고리로 이동  

안전한 리네임 & 브라우저 연동

macOS/Linux (bash/zsh)

cd ~/Work
mkdir -p 98_Downloads/{_inbox,installers,datasets,manuals,assets,quarantine}
# 기존 05_Downloads를 썼다면:
[ -d 05_Downloads ] && mv 05_Downloads/* 98_Downloads/ && rmdir 05_Downloads 2>/dev/null || true

# OS의 ~/Downloads를 Work/98_Downloads/_inbox로 심볼릭 링크(선택)
mv ~/Downloads ~/Downloads.bak 2>/dev/null || true
ln -s "$HOME/Work/98_Downloads/_inbox" "$HOME/Downloads"

Windows (PowerShell)

New-Item -ItemType Directory -Force -Path "$HOME\Work\98_Downloads\_inbox","$HOME\Work\98_Downloads\installers","$HOME\Work\98_Downloads\datasets","$HOME\Work\98_Downloads\manuals","$HOME\Work\98_Downloads\assets","$HOME\Work\98_Downloads\quarantine" | Out-Null
# 기존 05_Downloads 사용분 이동(있을 때만)
if (Test-Path "$HOME\Work\05_Downloads") { Move-Item "$HOME\Work\05_Downloads\*" "$HOME\Work\98_Downloads" -Force; Remove-Item "$HOME\Work\05_Downloads" -Force }

# 사용자 Downloads → _inbox 링크(선택, 관리자 권장)
Rename-Item "$HOME\Downloads" "Downloads.bak" -ErrorAction SilentlyContinue
cmd /c mklink /D "%USERPROFILE%\Downloads" "%USERPROFILE%\Work\98_Downloads\_inbox"

브라우저(Chrome/Edge/Firefox)의 기본 다운로드 폴더Work/98_Downloads/_inbox로 바꿔두면 더 편함.


주의점(번호 바꿔도 변하지 않는 원칙)

  • 정본은 각 전용 폴더 : 98_Downloads는 임시 착륙지 일 뿐. 정리 후 반드시

    • 설치파일 → 80_Tools/installers/

    • 데이터셋 → 26_Datasets/...

    • 매뉴얼 → 40_Resources/manuals/...

    • 자산(폰트 등) → 60_Assets/...

  • 체크섬·메타 필수 : 데이터셋/설치파일은 이동 전에 SHA256SUMS/manifest.yml(데이터셋), install_notes.md(설치파일)를 남겨 재현성 확보.

  • 보안 : 출처 불명은 quarantine/에 두고 검사 후 사용.

  • .gitignore : Work를 레포로 관리한다면 98_Downloads/**무조건 무시.

  • 정리 주기 : 주 1회 _inbox 비우기, 하위 카테고리도 정본으로 이동 후 비우기.


(선택) today/런처에 경로만 교체

기존 예시에서 05_Downloads98_Downloads로 바꾸면 끝.

Sort downloads       | 98_Downloads               | ${EDITOR:-vi} README_SORTING.md
Open installers box  | 80_Tools/installers        | ls -al

원하면 주간 자동정리 스크립트(다운로드 자동 분류→정본 이동→체크섬 생성)도 98 경로 기준으로 만들어줄게.

임시 보관소라는 관점에서는 앞쪽 번호가 어울린다고 보는건가

짧은 답: 네. “임시 보관소”는 앞쪽 번호(상단 배치)가 더 어울립니다.
이유는 “빨리 보고 빨리 비우게” 만드는 시각적/동선 효과가 커서예요.

왜 앞번호(상단)가 유리한가

  1. 가시성 → 행동 유도
    폴더 트리 상단(00~10대)에 있으면 매일 시야에 들어와서 “정리해야지”가 자연스레 작동합니다.

  2. 흐름 정렬
    하루 흐름이 00_Inbox → 05_Downloads → 10_Today → 20_Projects/25_Jobs…로 이어져 수집→정리→집중 작업 순서가 깔끔해집니다.

  3. 마찰 최소화
    브라우저/툴의 기본 저장 폴더를 상단 폴더로 지정하기 쉽고, 경로가 짧아 조작이 빠릅니다.

언제 뒤번호(하단)가 더 낫나

  • 트리 상단을 “업무 핵심만” 보이게 하고 싶거나, 다운로드를 자주 안 쓰는 경우.

  • 팀 규칙/개인 취향상 “임시는 뒤로 보내 시각적 소음 ↓”가 더 편한 경우.
    → 이런 상황이면 98_Downloads 도 충분히 합리적이에요.

현실적인 권장안 (둘 중 하나)

  • A안(상단 임시 존) :
    00_Inbox(수작업 스크랩) + 05_Downloads(자동 착륙지) + 10_Today(실행 대시보드)

    • 매일 아침: 05_Downloads/_inbox 비우기 → 정본 위치로 이동
  • B안(하단 임시 존) :
    98_Downloads로 두되 브라우저 기본경로만 …/98_Downloads/_inbox로 고정,
    Today/런처에서 바로 열 수 있게 단축만 둠

결정 규칙(간단)

  • 매일/자주 비울 거다 → 앞번호(05)

  • 거의 신경 안 쓰고 가끔 정리 → 뒷번호(98)

  • 어떤 번호를 쓰든 정본은 해당 전용 폴더(26_Datasets, 80_Tools/installers, 60_Assets/fonts, 40_Resources/manuals…)로 반드시 이동하세요.

원하면 지금 구조를 A안(05) 또는 B안(98) 중 원하는 쪽으로 최종본 트리와 스크립트(브라우저 기본 경로 설정/주간 자동정리)까지 맞춰서 정리해 줄게.

자주 정리하는게 맞긴하지만 귀찮아서 쌓아두긴해 내 성격상;

그럼 “쌓이는 성격” 전제로, 손 안 대도 굴러가는 자동 정리 세팅 으로 가자.
아래 그대로 넣으면 주 1회/매일 자동으로 98_Downloads/_inbox에 쌓인 걸 규칙대로 분류·이동하고, 체크섬도 남겨줘.


핵심 아이디어 (귀찮음 최소화)

  • 다운로드 착륙지 : Work/98_Downloads/_inbox

  • 자동 스윕 규칙

    • 설치파일( .exe .msi .pkg .dmg .whl .deb .rpm .zip(설치 키워드)) → 80_Tools/installers/ + SHA256SUMS + install_notes.md append

    • 데이터셋( .csv .tsv .parquet .json .xlsx / 압축 내부에 csv/parquet가 있으면 포함) → 26_Datasets/_staging/YYYY-MM-DD/ + SHA256SUMS

    • 매뉴얼( .pdf .chm .html .htm / 이름에 manual guide user spec) → 40_Resources/manuals/_incoming/
    • 폰트( .ttf .otf .woff .woff2) → 60_Assets/fonts/_incoming/

    • 그 외 → 그대로 둠(다음 스윕에서 재시도)
  • 삭제 금지 : 자동화는 “이동+기록”만. (실수 방지)


1) macOS/Linux용: 자동 스윕 스크립트

~/Work/80_Tools/scripts/sweep_downloads.sh

#!/usr/bin/env bash
set -euo pipefail

W="${WORK_DIR:-$HOME/Work}"
# 착륙지: 98이 없으면 05로 폴백
DL="$W/98_Downloads/_inbox"
[[ -d "$DL" ]] || DL="$W/05_Downloads/_inbox"

DEST_INSTALL="$W/80_Tools/installers"
DEST_DATA_STAGE="$W/26_Datasets/_staging/$(date +%Y-%m-%d)"
DEST_MANUALS="$W/40_Resources/manuals/_incoming"
DEST_FONTS="$W/60_Assets/fonts/_incoming"

mkdir -p "$DEST_INSTALL" "$DEST_DATA_STAGE" "$DEST_MANUALS" "$DEST_FONTS"

log() { printf "[%s] %s\n" "$(date '+%F %T')" "$*"; }

# sha256 함수 (macOS 호환)
sha256() {
  if command -v sha256sum >/dev/null 2>&1; then sha256sum "$1" | awk '{print $1}';
  else shasum -a 256 "$1" | awk '{print $1}'; fi
}

is_installer() {
  local f="$(echo "$1" | tr '[:upper:]' '[:lower:]')"
  [[ "$f" =~ \.(exe|msi|pkg|dmg|deb|rpm|whl)$ ]] && return 0
  [[ "$f" == *.zip && "$f" =~ (setup|install|installer|msi|driver) ]] && return 0
  return 1
}

is_manual() {
  local f="$(echo "$1" | tr '[:upper:]' '[:lower:]')"
  [[ "$f" =~ \.(pdf|chm|html|htm)$ ]] || return 1
  return 0
}

is_font() {
  local f="$(echo "$1" | tr '[:upper:]' '[:lower:]')"
  [[ "$f" =~ \.(ttf|otf|woff2?|ttc)$ ]] && return 0 || return 1
}

zip_has_dataset() {
  local z="$1"
  command -v unzip >/dev/null 2>&1 || return 1
  unzip -l "$z" | awk '{print $4}' | grep -Eiq '\.(csv|tsv|json|parquet|xlsx)$'
}

is_dataset() {
  local f="$(echo "$1" | tr '[:upper:]' '[:lower:]')"
  [[ "$f" =~ \.(csv|tsv|json|parquet|xlsx)$ ]] && return 0
  if [[ "$f" == *.zip || "$f" == *.tar.gz || "$f" == *.tgz ]]; then
    zip_has_dataset "$1" && return 0
  fi
  return 1
}

append_install_notes() {
  local file="$1" sha="$2"
  local notes="$DEST_INSTALL/install_notes.md"
  [[ -f "$notes" ]] || printf "# Installers notes\n\n" > "$notes"
  printf "- %s  \`%s\`  sha256=%s\n" "$(date '+%F %T')" "$(basename "$file")" "$sha" >> "$notes"
}

# 메인 루프
shopt -s nullglob
found_any=0
for p in "$DL"/*; do
  [[ -f "$p" ]] || continue
  found_any=1
  base="$(basename "$p")"
  if is_installer "$p"; then
    mv -n "$p" "$DEST_INSTALL/$base"
    sha=$(sha256 "$DEST_INSTALL/$base")
    echo "$sha  $(basename "$base")" >> "$DEST_INSTALL/SHA256SUMS"
    append_install_notes "$DEST_INSTALL/$base" "$sha"
    log "INSTALLER → $DEST_INSTALL/$base"
  elif is_dataset "$p"; then
    mkdir -p "$DEST_DATA_STAGE"
    mv -n "$p" "$DEST_DATA_STAGE/$base"
    sha=$(sha256 "$DEST_DATA_STAGE/$base")
    echo "$sha  $(basename "$base")" >> "$DEST_DATA_STAGE/SHA256SUMS"
    log "DATASET → $DEST_DATA_STAGE/$base"
  elif is_manual "$p"; then
    mv -n "$p" "$DEST_MANUALS/$base"
    log "MANUAL → $DEST_MANUALS/$base"
  elif is_font "$p"; then
    mv -n "$p" "$DEST_FONTS/$base"
    log "FONT → $DEST_FONTS/$base"
  else
    log "SKIP (unknown) $base"
  fi
done

if [[ $found_any -eq 0 ]]; then
  log "No files in $DL"
fi

실행권한:

chmod +x ~/Work/80_Tools/scripts/sweep_downloads.sh

자동 실행(둘 중 택1)

  • macOS (launchd, 매일 19:00)

    1. ~/Library/LaunchAgents/com.work.sweepdownloads.plist 생성:
      <?xml version="1.0" encoding="UTF-8"?>
      <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
      <plist version="1.0"><dict>
        <key>Label</key><string>com.work.sweepdownloads</string>
        <key>ProgramArguments</key>
        <array><string>/Users/$(whoami)/Work/80_Tools/scripts/sweep_downloads.sh</string></array>
        <key>StartCalendarInterval</key><dict><key>Hour</key><integer>19</integer><key>Minute</key><integer>0</integer></dict>
        <key>StandardOutPath</key><string>/tmp/sweepdownloads.out</string>
        <key>StandardErrorPath</key><string>/tmp/sweepdownloads.err</string>
        <key>EnvironmentVariables</key><dict><key>WORK_DIR</key><string>/Users/$(whoami)/Work</string></dict>
      </dict></plist>
      
    2. 로드: launchctl load ~/Library/LaunchAgents/com.work.sweepdownloads.plist
  • Linux (cron, 매주 금 19:00)
    crontab -e:

    0 19 * * 5 WORK_DIR=$HOME/Work $HOME/Work/80_Tools/scripts/sweep_downloads.sh >> $HOME/sweepdownloads.log 2>&1
    

2) Windows용: PowerShell 스윕

$HOME\Work\80_Tools\scripts\sweep_downloads.ps1

$W = $env:WORK_DIR; if (-not $W) { $W = "$HOME\Work" }
$DL = Join-Path $W "98_Downloads\_inbox"
if (-not (Test-Path $DL)) { $DL = Join-Path $W "05_Downloads\_inbox" }

$DEST_INSTALL = Join-Path $W "80_Tools\installers"
$DEST_DATA_STAGE = Join-Path $W ("26_Datasets\_staging\" + (Get-Date -Format "yyyy-MM-dd"))
$DEST_MANUALS = Join-Path $W "40_Resources\manuals\_incoming"
$DEST_FONTS = Join-Path $W "60_Assets\fonts\_incoming"
New-Item -ItemType Directory -Force -Path $DEST_INSTALL,$DEST_DATA_STAGE,$DEST_MANUALS,$DEST_FONTS | Out-Null

function Is-Installer($p){ $e=[IO.Path]::GetExtension($p).ToLower(); return ".exe",".msi",".pkg",".dmg",".whl",".deb",".rpm" -contains $e -or ($e -eq ".zip" -and (Split-Path $p -Leaf) -match "(setup|install|installer|msi|driver)") }
function Is-Manual($p){ ".pdf",".chm",".html",".htm" -contains ([IO.Path]::GetExtension($p).ToLower()) }
function Is-Font($p){ ".ttf",".otf",".woff",".woff2",".ttc" -contains ([IO.Path]::GetExtension($p).ToLower()) }
function ZipHasDataset($zip){
  try {
    Add-Type -AssemblyName System.IO.Compression.FileSystem -ErrorAction Stop
    $z=[IO.Compression.ZipFile]::OpenRead($zip)
    $m=$false
    foreach($e in $z.Entries){ if($e.FullName -match '\.(csv|tsv|json|parquet|xlsx)$'){ $m=$true; break } }
    $z.Dispose(); return $m
  } catch { return $false }
}
function Is-Dataset($p){
  $e=[IO.Path]::GetExtension($p).ToLower()
  if (".csv",".tsv",".json",".parquet",".xlsx" -contains $e){ return $true }
  if (".zip",".gz",".tgz" -contains $e -and (ZipHasDataset $p)){ return $true }
  return $false
}
function Sha256($p){ (Get-FileHash $p -Algorithm SHA256).Hash.ToLower() }

Get-ChildItem $DL -File | ForEach-Object {
  $src=$_.FullName; $name=$_.Name
  if (Is-Installer $src){
    $dst=Join-Path $DEST_INSTALL $name; Move-Item $src $dst -Force
    $sha = Sha256 $dst
    "$sha  $name" | Add-Content (Join-Path $DEST_INSTALL "SHA256SUMS")
    $notes = Join-Path $DEST_INSTALL "install_notes.md"
    if (-not (Test-Path $notes)) { "# Installers notes`n" | Out-File $notes }
    "- $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')  `$name`  sha256=$sha" | Add-Content $notes
    Write-Host "INSTALLER → $dst"
  } elseif (Is-Dataset $src){
    $dst=Join-Path $DEST_DATA_STAGE $name; Move-Item $src $dst -Force
    $sha = Sha256 $dst
    "$sha  $name" | Add-Content (Join-Path $DEST_DATA_STAGE "SHA256SUMS")
    Write-Host "DATASET → $dst"
  } elseif (Is-Manual $src){
    $dst=Join-Path $DEST_MANUALS $name; Move-Item $src $dst -Force
    Write-Host "MANUAL → $dst"
  } elseif (Is-Font $src){
    $dst=Join-Path $DEST_FONTS $name; Move-Item $src $dst -Force
    Write-Host "FONT → $dst"
  } else {
    Write-Host "SKIP (unknown) $name"
  }
}

스케줄러 등록 (매일 19:00):

$act = New-ScheduledTaskAction -Execute "pwsh.exe" -Argument "-NoProfile -File `"$HOME\Work\80_Tools\scripts\sweep_downloads.ps1`""
$trg = New-ScheduledTaskTrigger -Daily -At 19:00
Register-ScheduledTask -TaskName "WorkSweepDownloads" -Action $act -Trigger $trg -Description "Move downloads to canonical locations"

3) today/런처에 수동 실행 버튼(선택)

Sweep downloads now   | 80_Tools/scripts | ./sweep_downloads.sh

(PowerShell이면 ./sweep_downloads.ps1)


운용 팁 & 주의점

  • 정본만 이동 : 스크립트는 이동만 하므로 되돌리기 쉬워요. 삭제는 손대지 않음.

  • 데이터셋은_staging: 이름/버전 결정을 못하니 26_Datasets/_staging/YYYY-MM-DD/로 모읍니다. 필요할 때만 정식 버전(datasets/<name>/vYYYY.MMDD/…)으로 승격 하세요.

  • 체크섬 자동 기록 : 설치파일/데이터셋은 SHA256SUMS 생성, 설치파일은 install_notes.md에 타임스탬프까지 남김.

  • 미인식 파일 : 규칙에 안 맞으면 그냥 건드리지 않습니다(다음 스윕에 재시도).

  • 안전망 : 처음 1~2주 동안은 수동 실행으로 결과 확인 해 보세요. 문제가 없으면 스케줄러 켜두면 끝.

원하면 위 스크립트에 추가 규칙(예: 특정 프로젝트 이름 키워드로 데이터셋 자동 폴더명 부여, zip 내부 구조에 따른 자동 풀기)도 얹어 줄게.

그냥 05로 할게

좋아, 05로 확정! 다운로드 착륙지를 05_Downloads로 쓰는 설정을 한 번에 마무리하자. 아래 그대로 따라 하면 끝이야.


1) 폴더 만들기 (복붙)

Work/
├─ 05_Downloads/                 - 다운로드 착륙지(Landing Zone, 정리 전 임시)
│  ├─ _inbox/                    - 브라우저/툴 기본 저장 경로
│  ├─ installers/                - 설치 파일(.exe/.msi/.pkg/.dmg/.whl/.zip)
│  ├─ datasets/                  - 데이터셋 압축/CSV 임시(해제 전)
│  ├─ manuals/                   - 매뉴얼/가이드 PDF/HTML 임시
│  ├─ assets/                    - 폰트/아이콘/템플릿 등 임시
│  └─ quarantine/                - 의심 파일(검사 전 격리)

2) 초기 셋업 (step-by-step)

macOS / Linux

mkdir -p ~/Work/05_Downloads/{_inbox,installers,datasets,manuals,assets,quarantine}

# (선택) OS 기본 Downloads → Work/05_Downloads/_inbox 로 바꾸기
mv ~/Downloads ~/Downloads.bak 2>/dev/null || true
ln -s "$HOME/Work/05_Downloads/_inbox" "$HOME/Downloads"

Windows (PowerShell)

New-Item -ItemType Directory -Force -Path "$HOME\Work\05_Downloads\_inbox","$HOME\Work\05_Downloads\installers","$HOME\Work\05_Downloads\datasets","$HOME\Work\05_Downloads\manuals","$HOME\Work\05_Downloads\assets","$HOME\Work\05_Downloads\quarantine" | Out-Null

# (선택) 사용자 Downloads → Work\05_Downloads\_inbox 링크
Rename-Item "$HOME\Downloads" "Downloads.bak" -ErrorAction SilentlyContinue
cmd /c mklink /D "%USERPROFILE%\Downloads" "%USERPROFILE%\Work\05_Downloads\_inbox"

브라우저(Chrome/Edge/Firefox) 기본 다운로드 폴더Work/05_Downloads/_inbox로 설정하면 더 깔끔.


3) (사용 중이면) 98에서 05로 이관

macOS / Linux

[ -d ~/Work/98_Downloads ] && mv ~/Work/98_Downloads/* ~/Work/05_Downloads/ 2>/dev/null || true
rmdir ~/Work/98_Downloads 2>/dev/null || true
sed -i '' 's#/98_Downloads/#/05_Downloads/#g' ~/Work/10_Today/shortcuts.list 2>/dev/null || true

Windows (PowerShell)

if (Test-Path "$HOME\Work\98_Downloads") {
  Move-Item "$HOME\Work\98_Downloads\*" "$HOME\Work\05_Downloads" -Force
  Remove-Item "$HOME\Work\98_Downloads" -Force -ErrorAction SilentlyContinue
}
(Get-Content "$HOME\Work\10_Today\shortcuts.list") -replace '/98_Downloads/','/05_Downloads/' |
  Set-Content "$HOME\Work\10_Today\shortcuts.list"

4) 자동 정리 스크립트(05 우선) 사용 팁

내가 줬던 스윕 스크립트 를 05 우선으로 돌리려면, 상단의 다운로드 경로만 이렇게 잡으면 돼.

bash/zsh (sweep_downloads.sh)

W="${WORK_DIR:-$HOME/Work}"
DL="$W/05_Downloads/_inbox"
[[ -d "$DL" ]] || DL="$W/98_Downloads/_inbox"   # (있으면 폴백)

PowerShell (sweep_downloads.ps1)

$W = $env:WORK_DIR; if (-not $W) { $W = "$HOME\Work" }
$DL = Join-Path $W "05_Downloads\_inbox"
if (-not (Test-Path $DL)) { $DL = Join-Path $W "98_Downloads\_inbox" }

스케줄(매일/매주) 등록 방법은 이전 메시지 그대로 쓰면 OK.


5) Today 런처에 한 줄(선택)

Sort downloads       | 05_Downloads               | ${EDITOR:-vi} README_SORTING.md
Open installers box  | 80_Tools/installers        | ls -al

사용 시 주의점(요약)

  • 05_Downloads는 임시 : 정본은 반드시 전용 위치로

    • 설치파일 → 80_Tools/installers/ (+ install_notes.md/SHA256SUMS)

    • 데이터셋 → 26_Datasets/... (+ manifest.yml/SHA256SUMS)

    • 매뉴얼 → 40_Resources/manuals/...

    • 자산(폰트 등) → 60_Assets/...

  • 자동화 적극 활용 : 스윕 스크립트를 스케줄러에 등록 해 “손 안 대고” 분류·이동.

  • 보안 : 출처 불명은 quarantine/에 먼저 두고 검사.

  • .gitignore : Work를 레포로 관리한다면 05_Downloads/**항상 제외.

  • 정리 루틴 : 최소 주 1회 _inbox 확인(자동화가 못 잡은 항목만 처리).

원하면 네 환경(운영체제/셸)에 맞춰 스윕 스크립트를 05 기준으로 고정한 최종본 을 깔끔히 묶어서 드릴게.

.cshrc는 어디 두는게 좋을까

짧게: 정본은 Work/90_PersonalConfigs/shell/tcsh/.tcshrc 에 두고, 홈에는 심볼릭 링크 로 연결하세요.
(팀/공유 기본값이 있다면 Work/32_SharedConfigs/global/shell/tcsh/tcshrc.base를 먼저 source하고 개인 설정으로 오버라이드.)


어디에 어떻게 두나 (step-by-step)

1) 위치(정본)

Work/
└─ 90_PersonalConfigs/
   └─ shell/
      └─ tcsh/
         ├─ .tcshrc          ← 개인 메인 설정(정본)
         ├─ rc.d/            ← 분할 설정(옵션)
         │  ├─ 00-paths.csh
         │  ├─ 10-env.csh
         │  ├─ 20-aliases.csh
         │  └─ 30-prompt.csh
         └─ host.d/          ← 기기별 오버라이드(옵션)
            └─ <hostname>.csh

.tcshrc? tcsh는 ~/.tcshrc가 있으면 그걸 우선 읽고, 없으면 ~/.cshrc를 읽습니다. 호환이 필요하면 ~/.cshrc~/.tcshrc로 링크해 두면 돼요.

2) 홈에 연결(심볼릭 링크)

macOS/Linux

ln -snf "$HOME/Work/90_PersonalConfigs/shell/tcsh/.tcshrc" "$HOME/.tcshrc"
# (선택) csh 호환
ln -snf "$HOME/.tcshrc" "$HOME/.cshrc"

WSL/Cygwin 도 동일(경로만 맞추면 됨).

3) 추천 .tcshrc 골격(복붙)

tcsh

# --- shared base (있으면) ---
if ( -r "$HOME/Work/32_SharedConfigs/global/shell/tcsh/tcshrc.base" ) then
  source "$HOME/Work/32_SharedConfigs/global/shell/tcsh/tcshrc.base"
endif

# --- 개인 기본값 ---
setenv WORK_DIR "$HOME/Work"

# PATH 예시: (중복되면 앞에 두기)
set path = ( $HOME/Work/80_Tools/scripts $path )

# 분할 로드(rc.d/*.csh)
set _rcdir = "$HOME/Work/90_PersonalConfigs/shell/tcsh/rc.d"
if ( -d "$_rcdir" ) then
  set _files = ( `/bin/ls $_rcdir/*.csh 2>/dev/null` )
  foreach f ( $_files )
    if ( -r "$f" ) source "$f"
  end
endif

# 호스트별 오버라이드(host.d/<hostname>.csh)
set _host = `hostname -s`
set _hostrc = "$HOME/Work/90_PersonalConfigs/shell/tcsh/host.d/${_host}.csh"
if ( -r "$_hostrc" ) source "$_hostrc"

# 인터랙티브에서만 프롬프트/컬러
if ( $?prompt ) then
  set prompt = "%B%n%b@%m:%~ %# "
endif

# (선택) Today 런처 단축키
if ( -x "$HOME/Work/10_Today/today.csh" ) then
  alias t "$HOME/Work/10_Today/today.csh"
endif

예시 분할 파일

rc.d/20-aliases.csh

tcsh

alias ll 'ls -alF'
alias gs 'git status'
alias gp 'git pull --rebase'

rc.d/00-paths.csh

tcsh

# 자주 쓰는 경로 우선
set path = ( $HOME/Work/80_Tools/scripts $HOME/bin $path )

비밀/토큰 은 이 파일들에 직접 넣지 말고, tcsh 형식으로 적은 Work/90_PersonalConfigs/secrets/.env-shell.local 등을 따로 두고 필요 시 source하세요.


운용 규칙(핵심)

  • 정본은 90_PersonalConfigs : 홈의 ~/.tcshrc링크 만. 백업/동기화는 정본만 관리.

  • 레이어링 : 32_SharedConfigs(있으면) → 90_PersonalConfigs(개인 오버라이드) → 호스트별.

  • 모듈화 : rc.d/*.csh로 쪼개 두면 충돌/수정이 쉬움.

  • 재적용 : 변경 후 source ~/.tcshrc로 즉시 적용.

  • 이식성 : 다른 머신에선 링크만 다시 걸면 같은 환경 재현.

필요하면 네 현재 .cshrc 내용을 위 구조로 자동 분해(aliases/env/path/prompt)해 주는 스크립트도 만들어 줄게—원하면 붙여줘!

좀 Stable 하게 기반이 될 Tool들(e.g. gcc)도 그냥 80_Tools에 설치하면 되려나? 여러 사람이 공유할 급의 안정적이어야하는 툴들과 가볍게 개인적으로 테스트해보는 툴 등 전부다 저기 박으려니 좀 헷갈릴거 같기도하고

좋은 고민이야. 정리: 모든 걸 80_Tools에 몰지 말고 “안정적·공유용 vs. 개인 실험용”으로 물리적 분리 하자.


권장 분리안

Work/
├─ 78_Toolchains/                         - 팀/장기 공용용 ‘고정 버전’ 툴체인(매우 안정)
│  ├─ gcc/13.2.0/{bin,lib,include,...}
│  ├─ cmake/3.29.3/{bin,...}
│  ├─ ninja/1.12.1/{bin,...}
│  └─ <tool>/<ver>/<os>-<arch>/          - 필요 시 OS/아키 구분 (win-x64, linux-x64, mac-arm64)
│     └─ latest → <ver>                  - 심볼릭 링크(현재 표준)
├─ 79_SDKs/                               - 큰 플랫폼 SDK/런타임(JDK, Qt, Android NDK 등)
│  ├─ jdk/21.0.2/
│  ├─ qt/6.7.2/
│  └─ <sdk>/<ver>/
├─ 80_Tools/                              - 개인·단기·포터블 유틸(자주 바뀌는 것)
│  ├─ installers/                         - 설치 파일 보관(체크섬, install_notes.md)
│  ├─ bin/                                - 작은 단일 바이너리(사전 PATH)
│  ├─ portable/                           - 압축 풀어 쓰는 포터블 툴(개인용)
│  ├─ scripts/                            - 부트스트랩/릴리스/체크섬 스크립트
│  └─ scratch/                            - 실험용(자동 청소 대상)
└─ 85_Environments/                       - 도커/콘다/venv 등 “환경 캡슐” 샘플

한 줄 규칙

  • 팀과 공유할 ‘표준 버전, 오래 쓰는 툴’78_Toolchains/

  • 개인 테스트·포터블·자주 바뀌는 유틸80_Tools/

  • 플랫폼/런타임 묶음(JDK/Qt/NDK 등 대형 SDK) → 79_SDKs/

  • 프로젝트 전용/복제 가능 환경85_Environments/(Docker/conda 등)로 캡슐화


어떻게 선택하지? (결정표)

상황 위치 이유
팀 표준 gcc/cmake/ninja처럼 버전 고정·장기 사용 78_Toolchains/<tool>/<ver>/ 경로·버전이 안 흔들림, CI/문서와 일치
Qt/JDK/NDK 같은 대형 SDK 79_SDKs/<sdk>/<ver>/ 용량 큼, 다중 버전 공존 필요
개인 실험/경량 유틸(ripgrep, fd, bat 등) 80_Tools/bin or 80_Tools/portable 자주 교체, 실패해도 영향 적음
프로젝트별 의존 스택(파이썬/시스템툴 조합) `85_Environments/docker conda

버전·PATH 운용(충돌 없이)

1) “latest” 심볼릭 링크(공유 표준)

78_Toolchains/gcc/13.2.0/...
78_Toolchains/gcc/latest  -> 13.2.0
  • 문서/스크립트에 .../gcc/latest/bin를 쓰면 팀이 최신 표준을 바꿀 때 하나만 갈아끼면 됨.

2) PATH 레이어(우선순위)

  • bash/zsh
    export PATH="$HOME/Work/80_Tools/bin:$HOME/Work/78_Toolchains/gcc/latest/bin:$HOME/Work/78_Toolchains/cmake/latest/bin:$PATH"
    
  • tcsh
    tcsh
        
    set path = ( $HOME/Work/80_Tools/bin $HOME/Work/78_Toolchains/gcc/latest/bin $path )
    
  • PowerShell
    $env:Path = "$HOME\Work\80_Tools\bin;$HOME\Work\78_Toolchains\gcc\latest\bin;" + $env:Path
    

3) 세션 한정 버전 스위치(충돌 방지)

  • bash/zsh
    use() {  # 사용: use gcc 13.2.0
      case "$1" in
        gcc|cmake|ninja) export PATH="$HOME/Work/78_Toolchains/$1/$2/bin:$PATH" ;;
        jdk) export JAVA_HOME="$HOME/Work/79_SDKs/jdk/$2"; export PATH="$JAVA_HOME/bin:$PATH" ;;
        *) echo "unknown tool";;
      esac
    }
    
  • tcsh
    tcsh
        
    alias use 'set t=\!:1; set v=\!:2; set p=$HOME/Work/78_Toolchains/$t/$v/bin; if ( -d $p ) set path = ( $p $path )'
    
  • PowerShell
    function Use-Tool($t,$v){ $p="$HOME\Work\78_Toolchains\$t\$v\bin"; if(Test-Path $p){ $env:Path="$p;$env:Path" } }
    

설치/기록 규칙(짧게)

  • 체크섬 : 내려받은 아카이브는 80_Tools/installers에 보관하고 SHA256SUMS + install_notes.md 기록.

  • 풀 위치 :

    • 공용/고정 버전 → 78_Toolchains/<tool>/<ver>/에 압축 해제

    • 개인 테스트 → 80_Tools/portable/<tool>-<ver>/

  • 문서화 : 32_SharedConfigs/global/<tool>/README.md에 “표준 버전/경로/업데이트 절차” 1페이지.


청소 정책

  • 80_Tools/scratch80_Tools/portableN일(예: 60일) 미사용 시 자동 삭제 스윕 스크립트 권장.

  • 78_Toolchains/79_SDKs삭제 금지(팀 표준). 교체 시 latest 만 전환하고 구버전은 일정 기간 보존.


예시: gcc 운용

  1. 설치 파일을 05_Downloads/_inbox → 스윕 → 80_Tools/installers로 이동(+체크섬).

  2. 압축/설치 후 78_Toolchains/gcc/13.2.0/에 배치.

  3. 78_Toolchains/gcc/latest → 13.2.0 링크 생성.

  4. CI/문서/개인 PATH에서 .../gcc/latest/bin 사용.

  5. 새 표준 채택 시 latest만 갈아끼우고, 구버전은 13.1.0/ 그대로 보존.


마이그레이션(지금 섞여 있다면)

  1. 80_Tools/portable개인 실험 툴 을 먼저 분리 이동.

  2. 팀이 공유하는 고정 버전은 78_Toolchains/<tool>/<ver>/로 이관 + latest 링크.

  3. PATH/런처/스크립트에서 절대경로를 78/79 기준 으로 교체.

  4. 32_SharedConfigs/global표준 버전 표 1장 추가(업데이트 절차 포함).


요약

  • 안정·공유개인·가변물리적으로 분리 : 78_Toolchains/79_SDKs vs 80_Tools.

  • latest 링크 + use 함수로 버전 스위칭 스트레스 최소화.

  • 설치·체크섬·문서화 루틴을 고정해 예측 가능성 을 확보.

원하면 네 OS/셸에 맞는 폴더 생성·latest 링크·PATH 설정 을 한 번에 해주는 부트스트랩 스크립트(bash/tcsh/PowerShell)도 만들어줄게.

지금 상태에서 각각 폴더명은 그대로 둔 채 폴더 번호를 다시 합리적으로 꼼꼼히 생각해서 매겨봐줘.

좋아! “폴더 이름은 그대로 두고, 번호만 합리적으로 리패터닝” 해봤어.
핵심은 흐름(수집→오늘→개발→실행/데이터→지식/설정→자료→산출→툴/환경→개인→보관) 순으로 번호 블록을 붙여 스캔했을 때 직관적으로 보이게 하는 거야.


번호 설계 원칙 (짧게)

  1. 00–09 수집/임시 : Inbox·Downloads

  2. 10–19 오늘·런처 : Today

  3. 20–29 개발/실행/데이터 : Projects·Labs·Jobs·Datasets

  4. 30–39 지식/설정 : Areas·SharedConfigs

  5. 40–49 참고자료 : Resources

  6. 50–59 코드조각 : Snippets

  7. 60–69 시각자산 : Assets

  8. 70–79 산출/배포 : Exports·Releases

  9. 80–89 툴스택 : Toolchains·SDKs·Tools·Environments

  10. 90–99 개인/보관 : PersonalConfigs·Archive


제안 번호 (최종안)

00_Inbox             - 급히 던져두는 임시함
05_Downloads         - 다운로드 착륙지(_inbox/ installers/ datasets/ …)
10_Today             - 오늘 작업 대시보드(런처/단축)
20_Projects          - 툴(파이썬 패키지) 개발 리포
22_Labs              - 가벼운 실험/프로토(재현 불필요)
25_Jobs              - 산출 작업 단위(입력→설정→실행→전달)
26_Datasets          - 입력/출력 데이터셋 중앙 저장소
30_Areas             - 장기 운영 영역(지속 업무/정책 메모)
32_SharedConfigs     - 공유/골든 설정(표준 ruff/pytest/VSCode 등)
40_Resources         - 교육/매뉴얼/스펙 등 참고 자료
50_Snippets          - 재사용 코드/원라이너/텍스트 조각
60_Assets            - 로고/폰트/템플릿 등 시각 자산
70_Exports           - 여러 Job의 최종 전달본 모아보기(옵션)
75_Releases          - 유저 배포본(버전드, checksums/ ReleaseNotes)
82_Toolchains        - gcc/cmake/ninja 등 팀 표준 ‘고정 버전’ 툴체인
83_SDKs              - JDK/Qt/Android NDK 같은 대형 SDK
84_Tools             - 개인·경량·포터블 유틸/스크립트
86_Environments      - docker/conda/venv 등 환경 캡슐
90_PersonalConfigs   - 개인 설정(오버라이드/비공개)
99_Archive           - 완료 항목 장기 보관(읽기 전용)

포인트

  • Labs를 31→22 로 당겨 Projects(20)–Labs(22)–Jobs(25)–Datasets(26)가 연속 흐름이 됨.

  • Toolchains/SDKs/Tools/Environments82–86 으로 한 블록에 모아 충돌/우선순위 관리 쉬움.

  • 나머지는 기존 의미 유지(번호만 정리).


(참고) 기존 → 새 번호 매핑

기존 폴더명
00 00 Inbox
05 또는 98 05 Downloads
10 10 Today
20 20 Projects
31 22 Labs
25 25 Jobs
26 26 Datasets
30 30 Areas
32 32 SharedConfigs
40 40 Resources
50 50 Snippets
60 60 Assets
70 70 Exports
75 75 Releases
78 82 Toolchains
79 83 SDKs
80 84 Tools
85 86 Environments
90 90 PersonalConfigs
99 99 Archive

마이그레이션 팁 (선택)

  • 심볼릭 링크/스크립트 경로 에서 숫자만 바뀌니, sed로 일괄 치환하면 끝.

  • Today 런처(shortcuts.list)와 PATH 설정만 확인해 주면 대부분 끝나요.

    • 예: …/78_Toolchains/…/82_Toolchains/, …/31_Labs/…/22_Labs/

필요하면 bash/tcsh/PowerShell용 안전 리네임 스크립트(존재 시에만 mv, shortcuts.list 자동 치환)도 바로 만들어줄게.

왜 굳이 82야

좋은 질문! 82 로 둔 건 “80대=툴 스택” 블록 안에서 여유·정렬·확장성 을 동시에 잡기 위한 의도야. 간단히, 기초 → 플랫폼 → 개인 유틸 → 캡슐 환경 순서로 정렬하면서 중간에 빈 번호를 남겨두려는 선택이었어.

왜 82인가 (step-by-step)

  1. 블록화(80대 전용)
    80–89를 “툴/런타임/환경” 전용으로 묶고, 그 안에서 계층을 아래처럼 배치:

    • 82_Toolchains : gcc/cmake/ninja 같은 핵심 빌드 도구(기초층)

    • 83_SDKs : JDK/Qt/NDK 같은 플랫폼 SDK(기반층)

    • 84_Tools : ripgrep/bat/사내 유틸 등 개인/경량 도구(응용층)

    • 86_Environments : docker/conda/venv 캡슐 환경(격리층)
      기초→플랫폼→개인→격리 순으로 자연스럽게 스캔되도록 번호가 증가해.

  2. 여유 슬롯 확보
    80–81, 85, 87–89를 비워 두면 나중에 끼워넣기 좋아:

    • 80_Runtimes (Python/Node/Go 런타임 모음)

    • 81_PackageManagers (asdf/pyenv/nvm 등)

    • 85_Containers (이미지/베이스레이어)

    • 87_CIHelpers … 같은 식의 확장 여지

  3. 시각적 구분 + 충돌 최소화
    84_Tools(개인 실험/포터블)보다 에 82_Toolchains(팀 표준·고정버전)를 두면
    “표준 먼저, 개인 유틸 나중”이 정렬상에서도 드러나고, 문서/PATH 우선순위도 명확해.


대안 번호도 OK (취향에 따라)

  • 연속형이 더 좋다면 : 80_Toolchains / 81_SDKs / 82_Tools / 83_Environments

    • 장점: 기억하기 쉬움. 단점: 중간에 새 카테고리 끼우기 어려움.
  • 기존 80_Tools 유지 호환형 : 78_Toolchains / 79_SDKs / 80_Tools / 85_Environments

    • 장점: 기존 경로 변경 최소. 단점: 70대·80대가 섞여 시각적 군집이 약함.

원하면 네 선호(연속형 vs 여유 슬롯형)에 맞춰 일괄 리네임 스크립트 까지 바로 만들어줄게.

80, 81, 82가 더 나을것 같아서

좋아, 툴 스택을 80–82 연속 번호 로 재정렬하자. 깔끔하고 기억하기 쉬워!

최종 번호(툴 스택만 변경)

80_Toolchains      - 팀/장기 공용 ‘고정 버전’ 빌드 도구 (gcc/cmake/ninja…)
81_SDKs            - 플랫폼 SDK/런타임 (JDK/Qt/Android NDK…)
82_Tools           - 개인·경량·포터블 유틸/스크립트 (ripgrep/fd/bat 등)
83_Environments    - docker/conda/venv 같은 캡슐 환경(※ 연속성 위해 83으로 당김)

나머지 번호(00,05,10,20,22,25,26,30,32,40,50,60,70,75,90,99)는 그대로.


PATH 권장 순서 (표준 우선 → 개인)

bash/zsh

export PATH="$HOME/Work/82_Tools/bin:$HOME/Work/80_Toolchains/gcc/latest/bin:$HOME/Work/80_Toolchains/cmake/latest/bin:$PATH"

tcsh

tcsh

set path = ( $HOME/Work/82_Tools/bin $HOME/Work/80_Toolchains/gcc/latest/bin $path )

PowerShell

$env:Path = "$HOME\Work\82_Tools\bin;$HOME\Work\80_Toolchains\gcc\latest\bin;" + $env:Path

마이그레이션 (step-by-step)

macOS/Linux

cd ~/Work
# 폴더 리네임(있을 때만)
[ -d 82_Toolchains ] && mv 82_Toolchains 80_Toolchains
[ -d 83_SDKs       ] && mv 83_SDKs       81_SDKs
[ -d 84_Tools      ] && mv 84_Tools      82_Tools
[ -d 86_Environments ] && mv 86_Environments 83_Environments

# today/스크립트 경로 일괄 치환
sed -i '' -e 's#/82_Toolchains/#/80_Toolchains/#g' \
          -e 's#/83_SDKs/#/81_SDKs/#g' \
          -e 's#/84_Tools/#/82_Tools/#g' \
          -e 's#/86_Environments/#/83_Environments/#g' 10_Today/shortcuts.list 2>/dev/null || true

Windows (PowerShell)

Set-Location "$HOME\Work"
if (Test-Path "82_Toolchains") { Rename-Item "82_Toolchains" "80_Toolchains" }
if (Test-Path "83_SDKs")       { Rename-Item "83_SDKs"       "81_SDKs" }
if (Test-Path "84_Tools")      { Rename-Item "84_Tools"      "82_Tools" }
if (Test-Path "86_Environments"){ Rename-Item "86_Environments" "83_Environments" }

# today/스크립트 경로 치환
(Get-Content "10_Today\shortcuts.list") `
  -replace '/82_Toolchains/','/80_Toolchains/' `
  -replace '/83_SDKs/','/81_SDKs/' `
  -replace '/84_Tools/','/82_Tools/' `
  -replace '/86_Environments/','/83_Environments/' |
  Set-Content "10_Today\shortcuts.list"

앞으로 더 안정적으로 쓰는 팁 (작은 습관)

  1. latest 심볼릭 링크 유지:
    80_Toolchains/gcc/latest → 13.2.0 처럼 표준 전환 시 링크만 갈아끼우기.

  2. 환경변수 레이어(리네임 내성↑):

    export WORK_TC="$HOME/Work/80_Toolchains"
    export WORK_SDK="$HOME/Work/81_SDKs"
    export WORK_TOOLS="$HOME/Work/82_Tools"
    export WORK_ENV="$HOME/Work/83_Environments"
    

스크립트에 절대경로 대신 위 변수 사용.

  1. 역할 경계 :

    • 고정·공유: 80_Toolchains , 81_SDKs

    • 개인·가변: 82_Tools

    • 격리된 조합: 83_Environments(docker/conda/venv)

원하면 위 변경을 반영해 PATH 초기화 스크립트(bash/tcsh/PowerShell)랑 latest 링크 생성 스크립트도 바로 만들어줄게.

아니 85 Environment는 그냥 두자. 각 80, 81, 82, 83 폴더의 내부 subdirectory 예시도 만들어줘. 컴파일은 어디서 해야하는지 등등

좋아! 85_Environments는 그대로 유지 하면서,
80/81/82/83 의 “역할·하위 구조 예시·컴파일(빌드) 위치”를 정리해 줄게.


한눈에 규칙

  • 소스코드 컴파일(앱/라이브러리) 👉 20_Projects/<PRJ> 안에서만 해요.
    (예: PRJ-.../build/ out-of-source 빌드)

  • 툴체인/SDK 자체 설치 👉 80/81/82/83에 “설치/배치”만 하고,
    빌드는 별도의 Job(예: 25_Jobs/REL-... 또는 SMOKE-...)에서 수행 후 결과만 배치.


80_Toolchains — “팀 표준, 고정 버전 빌드 도구”

  • 대상: gcc, clang, cmake, ninja, make, lld, gdb

  • 원칙: 버전별 폴더 + latest 링크, OS/ARCH 분리 가능

80_Toolchains/
├─ gcc/
│  ├─ 13.2.0/
│  │  ├─ bin/ lib/ include/ share/
│  │  └─ manifest.yml          - 설치 출처/체크섬/빌드옵션 요약
│  └─ latest → 13.2.0
├─ cmake/
│  ├─ 3.29.3/{bin,share}/
│  └─ latest → 3.29.3
├─ ninja/
│  └─ 1.12.1/{bin,doc}/
└─ (optional) linux-x64/, mac-arm64/, win-x64/ 아래로 OS/ARCH 레벨을 한 번 더 두어도 OK

PATH 예시

export PATH="$HOME/Work/80_Toolchains/gcc/latest/bin:$HOME/Work/80_Toolchains/cmake/latest/bin:$PATH"

컴파일은 어디서?

  • 프로젝트 : 20_Projects/PRJ-.../
    cd ~/Work/20_Projects/PRJ-2025-001_app
    cmake -S . -B build -G Ninja \
          -DCMAKE_C_COMPILER="$HOME/Work/80_Toolchains/gcc/latest/bin/gcc" \
          -DCMAKE_CXX_COMPILER="$HOME/Work/80_Toolchains/gcc/latest/bin/g++"
    cmake --build build --config Release
    
  • 80_Toolchains 내부에서 코드 빌드 금지 (여긴 “툴 보관소”)

81_SDKs — “플랫폼 SDK/런타임(대형 번들)”

  • 대상: JDK, Qt, Android NDK/SDK, .NET SDK, CUDA
81_SDKs/
├─ jdk/
│  ├─ 21.0.2/           - JAVA_HOME로 지정
│  └─ latest → 21.0.2
├─ qt/
│  ├─ 6.7.2/
│  │  ├─ bin/ lib/ plugins/ qml/ mkspecs/
│  │  └─ README_install_notes.md
│  └─ latest → 6.7.2
├─ android-ndk/
│  └─ r26d/
└─ cuda/
   └─ 12.5/

프로젝트에서 쓰기

export JAVA_HOME="$HOME/Work/81_SDKs/jdk/latest"
export PATH="$JAVA_HOME/bin:$PATH"

# Qt 예 (CMake)
cmake -S . -B build -G Ninja \
  -DCMAKE_PREFIX_PATH="$HOME/Work/81_SDKs/qt/latest"
cmake --build build

82_Tools — “개인·경량·포터블 유틸”

  • 대상: ripgrep, fd, bat, jq, yq, 작은 CLI·스クリپ트

  • 원칙: 자주 바뀜 → 정리/교체 쉬운 구조

82_Tools/
├─ bin/                      - 단일 실행파일(우선 PATH)
│  ├─ rg
│  ├─ fd
│  └─ jq
├─ portable/                 - 압축 풀어 쓰는 포터블 도구
│  ├─ my-cli-1.2.3/
│  └─ some-tool-0.9/
├─ scripts/                  - 개인 스크립트(bootstrap/release/checksum 등)
│  └─ checksum_all.sh
└─ scratch/                  - 임시 테스트용(주기적 청소)

PATH 예시

export PATH="$HOME/Work/82_Tools/bin:$PATH"

주의

  • 유용성이 장기·공유 로 발전하면 80/81로 승격(문서화 + 고정 버전).

83_Runtimes — “언어 런타임 & 패키지 관리자 (선택 슬롯)”

  • 목적: “툴체인(80)·SDK(81)과는 별개”로 언어 런타임/버전 관리자 를 모아 둠

  • 대상: python(standalone 또는 asdf/pyenv), node(nvm), go, rustup, dotnet 런타임 등
    (이미 시스템/홈 관리자 쓰면 생략해도 됨. 폴더만 예약 슬롯으로 사용)

83_Runtimes/
├─ python/
│  ├─ 3.11.9/
│  │  ├─ bin/python3  - 독립 배포본(임베디드/프리빌트)
│  │  └─ README.md
│  └─ 3.12.4/
├─ node/
│  ├─ 20.16.0/
│  └─ nvm/              - nvm 자체를 보관할 수도
├─ go/
│  └─ 1.22.5/
└─ rust/
   └─ toolchains/stable/

사용 예

# 특정 런타임을 한 세션에만 우선
export PATH="$HOME/Work/83_Runtimes/python/3.12.4/bin:$PATH"
python --version  # 3.12.4

83을 쓰지 않고 시스템 런타임/패키지관리자를 그대로 써도 OK.
이 슬롯은 “정리된 위치에 모아두고 싶을 때” 유용해요.


85_Environments — “캡슐 환경(그대로 유지)”

  • 대상: docker/compose, conda/venv, devcontainer

  • 쓰임: 프로젝트별 조합을 격리 해서 재현성 보장

85_Environments/
├─ docker/
│  ├─ Dockerfile
│  └─ compose.yml
├─ conda/
│  ├─ envs/
│  │  └─ py311/           - 실제 생성된 env(선택)
│  └─ environment.yml     - 표준 스펙
└─ devcontainer/
   └─ base/
      ├─ Dockerfile
      └─ devcontainer.json

프로젝트에서 쓰기

# conda
conda env create -f ~/Work/85_Environments/conda/environment.yml
conda activate py311

# docker
docker compose -f ~/Work/85_Environments/docker/compose.yml up -d

“컴파일은 어디서?” 요점 재정리

  • 앱/라이브러리 빌드 : 항상 20_Projects/<PRJ>/build/(out-of-source).

    • 도구/SDK 경로는 80/81/83에서 참조만.
  • 툴체인/SDK 자체를 소스에서 빌드해야 할 때 :

    1. Job 생성 : 25_Jobs/REL-YYYY-NNN_<tool>-<ver>/

    2. 거기서 소스 빌드 & 테스트

    3. 산출물을 80_Toolchains/<tool>/<ver>/ 또는 81_SDKs/<sdk>/<ver>/배치

    4. latest 링크 업데이트 + manifest.yml/SHA256SUMS 기록

  • 개인 유틸 테스트 : 82_Tools/portable or 82_Tools/scratch (안정화되면 승격)


빠른 체크리스트

  • 80(표준 빌드 도구) → 고정 버전 + latest 링크

  • 81(대형 SDK) → 경로 변수(JAVA_HOME 등)와 함께 문서화

  • 82(개인 유틸) → 가볍게, 필요 시 승격

  • 83(런타임) → 언어별 버전 모음(선택 슬롯)

  • 85(환경) → 조합 격리/재현, 프로젝트에서 activate

원하면 위 구조대로 폴더와 README/manifest 템플릿, PATH 초기화 스크립트 까지 한 번에 만들어주는 세팅 스크립트( bash / tcsh / PowerShell )도 바로 만들어줄게.

installer 폴더가 사라졌네?

좋은 캐치! 번호 재정렬하면서 installers 상자 를 표기에서 빼먹었어요.
정답은:

정본 보관소: 82_Tools/installers/
임시 착륙지: 05_Downloads/_inbox (브라우저/CLI 기본 저장) → 스윕 후 82_Tools/installers/로 이동


82_Tools/installers/인가 (step-by-step)

  1. 한 곳에 모으기 : gcc·cmake 같은 툴체인(80), JDK/Qt 같은 SDK(81), 개인 유틸(82) 모두의 설치 원본 을 한 군데에 아카이브.

  2. 흐름 단순화 : 다운로드(05) → installers로 이동 → 실제 배치

    • Toolchains은 80_Toolchains/<tool>/<ver>/

    • SDK는 81_SDKs/<sdk>/<ver>/

    • 개인 유틸은 82_Tools/portable/<tool>-<ver>/ (또는 bin/)

  3. 증빙/복구 쉬움 : 체크섬·노트가 installers에 모여 있어, 나중에 검증/재설치 가 빠름.


폴더 예시 (복붙)

82_Tools/
├─ installers/                                 - 설치 원본 정본(아카이브)
│  ├─ cmake/3.29.3/cmake-3.29.3-linux-x86_64.tar.gz
│  │  └─ SHA256SUMS, install_notes.md
│  ├─ gcc/13.2.0/gcc-13.2.0-x86_64.tar.xz
│  │  └─ SHA256SUMS, install_notes.md
│  ├─ jdk/21.0.2/jdk-21.0.2_macos-aarch64.tar.gz
│  ├─ qt/6.7.2/qt-opensource-mac-6.7.2.dmg
│  ├─ python/wheels/<project_or_vendor>/...    # .whl/.tar.gz 모음
│  └─ misc/                                    # 분류 어려운 기타
├─ bin/                                        - 단일 실행파일(개인 PATH)
├─ portable/                                   - 포터블 툴 압축 해제 위치
└─ scripts/                                    - checksum/스윕 등 스크립트

<tool>/<ver>/ 폴더 안에 SHA256SUMSinstall_notes.md(출처/날짜/옵션) 붙이기 권장.


워크플로 (설치 원본 기준)

  1. 다운로드05_Downloads/_inbox

  2. 스윕 실행(자동/수동): 인스톨러 파일을 82_Tools/installers/<tool>/<ver>/로 이동 + SHA256SUMS 생성 + install_notes.md에 기록

  3. 배치

    • 툴체인: 압축 해제 → 80_Toolchains/<tool>/<ver>/latest 링크 갱신

    • SDK: 압축/설치 → 81_SDKs/<sdk>/<ver>/

    • 개인 유틸: 82_Tools/portable/ 또는 82_Tools/bin/

  4. 검증/기록 : 버전·경로를 README/문서(32_SharedConfigs/global/<tool>/README.md)에 반영


스윕 스크립트 경로만 바꾸기

이전에 드린 스크립트에서 DEST_INSTALL 경로를 아래처럼 바꾸세요.

bash/zsh (sweep_downloads.sh)

DEST_INSTALL="$W/82_Tools/installers"

PowerShell (sweep_downloads.ps1)

$DEST_INSTALL = Join-Path $W "82_Tools\installers"

나머지 로직은 동일합니다. (05_Downloads/_inbox → installers로 이동, 체크섬 생성, 노트 추가)


(선택) 안전 마이그레이션

macOS/Linux

mkdir -p ~/Work/82_Tools/installers
[ -d ~/Work/80_Tools/installers ] && mv ~/Work/80_Tools/installers/* ~/Work/82_Tools/installers/ 2>/dev/null || true

Windows (PowerShell)

New-Item -ItemType Directory -Force -Path "$HOME\Work\82_Tools\installers" | Out-Null
if (Test-Path "$HOME\Work\80_Tools\installers") {
  Move-Item "$HOME\Work\80_Tools\installers\*" "$HOME\Work\82_Tools\installers" -Force
}

요약

  • installers 정본 상자82_Tools/installers/.

  • 05_Downloads 는 임시 착륙지, 스윕이 알아서 installers로 옮김.

  • 설치 후 실제 실행 경로 는: Toolchains(80) / SDKs(81) / 개인유틸(82).

  • SHA256SUMS + install_notes.md무결성/출처 를 남겨 복구성 확보.

필요하면 install_notes.md 자동 append와 SHA256SUMS 생성을 묶은 최종 스크립트 를 82 경로 기준으로 정리해서 드릴게.

latest를 symbolic link를 만들잖아. 이거 하는 법 알려줘. 상대경로로 그냥 하면 되나?

좋아! 결론: 네—latest상대경로 심볼릭 링크 로 만드는 게 가장 안전하고 이식성이 좋아.
아래를 그대로 따라 하면 돼. (macOS/Linux, Windows 둘 다 정리)


기본 예시 (디렉터리 구조)

80_Toolchains/
  gcc/
    13.2.0/
    latest  -> 13.2.0    # ← 이걸 만들 거야(상대 링크)

macOS / Linux

1) 새로 만들기

cd ~/Work/80_Toolchains/gcc
ln -s 13.2.0 latest   # 상대경로 링크: latest -> 13.2.0

2) 버전 업데이트(이미 latest가 있을 때 교체)

cd ~/Work/80_Toolchains/gcc
ln -sfn 13.3.0 latest
# -s : symlink, -f : 기존 링크 덮어쓰기, -n : 링크를 디렉터리로 보지 않고 '이름'으로 취급

3) 확인/점검

ls -l latest         # latest -> 13.3.0
readlink latest      # 13.3.0  (상대경로가 보이면 OK)

4) 실수했을 때(잘못 만든 최신 링크 지우기)

rm latest            # 링크만 지워짐(타깃은 그대로)

왜 상대경로? 폴더(예: 80_Toolchains/gcc)를 통째로 다른 위치로 옮겨도 링크가 깨지지 않음.
절대경로(/Users/...)로 만들면 이동 시 전부 다시 만들어야 해.


Windows

Windows는 두 가지가 있어:

  • 심볼릭 링크(권장): mklink /D (관리자 권한 또는 Windows “개발자 모드” 필요)

  • 디렉터리 정션(대안): mklink /J (관리자 불필요, 다만 드라이브 간 이동에 취약)

1) CMD (관리자 권장)

cmd

cd %USERPROFILE%\Work\80_Toolchains\gcc

:: 심볼릭 링크 (권장, 관리자 또는 개발자 모드)
mklink /D latest 13.2.0

:: 업데이트(교체)
rmdir latest
mklink /D latest 13.3.0

2) 관리자 권한 없이 쓰고 싶으면(정션)

cmd

cd %USERPROFILE%\Work\80_Toolchains\gcc
mklink /J latest 13.2.0

3) PowerShell (심볼릭 링크)

Set-Location "$HOME\Work\80_Toolchains\gcc"
New-Item -ItemType SymbolicLink -Path "latest" -Target "13.2.0"  # 관리자 또는 개발자 모드

4) 확인

Get-Item latest | Format-List Name,LinkType,Target

팁: 심볼릭 링크는 상대경로 타겟도 잘 동작함. 정션(/J)은 내부적으로 절대경로로 고정되기 쉬워,
폴더를 다른 드라이브로 옮기면 깨질 수 있어. 가능하면 /D(심볼릭)을 쓰자.


작은 자동화(선택)

Bash/Zsh: set-latest.sh

#!/usr/bin/env bash
set -euo pipefail
dir="${1:?tool dir}"     # 예: ~/Work/80_Toolchains/gcc
ver="${2:?version}"      # 예: 13.3.0
cd "$dir"
ln -sfn "$ver" latest
echo "latest -> $ver"

PowerShell: Set-Latest.ps1

param([Parameter(Mandatory)][string]$Dir,[Parameter(Mandatory)][string]$Version)
Set-Location $Dir
if (Test-Path latest) { Remove-Item latest }
New-Item -ItemType SymbolicLink -Path "latest" -Target $Version | Out-Null
"latest -> $Version"

자주 나는 실수 & 체크리스트

  • 경로에 공백 이 있으면 꼭 따옴표 로 감싸기.

  • ln -sfn은 기존 링크 만 깔끔히 교체해 줌. 기존이 “실제 디렉터리”라면 먼저 rm -rf latest 후 다시 생성.

  • Windows에서 권한 문제 나면: 관리자 PowerShell/CMD 로 실행하거나 개발자 모드 켜기.

  • 링크 만든 뒤 PATH.../gcc/latest/bin처럼 latest를 넣어두면, 버전 전환 시 링크만 바꾸면 스크립트 수정이 필요 없음.

필요하면 네가 쓰는 툴(예: gcc, cmake, jdk, qt) 리스트를 알려줘. 각 폴더에 대해 latest일괄 생성/갱신 하는 스크립트를 맞춤으로 만들어 줄게!

폴더 명을 버젼만 쓰는게 맞아? gcc-13.3.0 이게 더 좋아보이기도 하고.

좋은 질문! 결론부터 말하면 “버전만” vs “툴-버전”은 “부모 폴더가 이미 툴을 식별하느냐”로 나눠 결정하면 깔끔해요.

결정 규칙 (step-by-step)

  1. 부모 폴더가 툴을 이미 말해준다
    버전만 쓰는 게 정석.
    예) 80_Toolchains/gcc/13.3.0/ (✅), latest → 13.3.0

    • 중복 없이 짧고 보기 좋음

    • 업데이트 시 ln -sfn 13.3.1 latest 한 줄이면 끝

  2. 여러 툴이 한 폴더에 섞여 있다(portable 모음 등)
    툴-버전 이 안전.
    예) 82_Tools/portable/gcc-13.3.0/, 82_Tools/portable/cmake-3.29.3/ (✅)

    • 한 눈에 무엇인지 식별 쉬움

    • 정렬/검색에 유리(ls | grep gcc-)


추천 패턴 요약

  • Toolchains/SDKs 같이 “툴별 전용 디렉터리”가 있는 곳
80_Toolchains/
 gcc/
   13.3.0/
   latest -> 13.3.0
 cmake/
   3.29.3/
   latest -> 3.29.3

여기서는 13.3.0처럼 버전만 이 맞습니다. gcc-13.3.0은 중복.

  • Tools/portable 같이 “여러 툴이 섞이는 곳”
82_Tools/
 portable/
   gcc-13.3.0/
   cmake-3.29.3/
   ninja-1.12.1/

여기서는 툴-버전 이 가독성 최고.


OS/아키/변형까지 표기해야 할 때

툴별 디렉터리(예: 80_Toolchains/gcc/)에서도 버전 뒤에만 변형을 붙이는 방식이 깔끔합니다.

  • 패턴:
    /<version>[-<os>-<arch>[-<libc|vendor>]]/

  • 예시:

    • 13.3.0-mac-arm64/

    • 13.3.0-linux-x64-glibc/

    • 6.7.2-win-x64-msvc/ (Qt처럼 툴체인이 다른 경우)

  • latest는 항상 해당 변형 디렉터리를 가리키게:
    latest -> 13.3.0-mac-arm64

반대로 portable 섞임 폴더 라면: gcc-13.3.0-linux-x64/처럼 접두 툴명을 유지.


latest 심볼릭 링크 예시(상대경로)

cd ~/Work/80_Toolchains/gcc
ln -sfn 13.3.0 latest          # 기본
# 변형이 있을 때
ln -sfn 13.3.0-mac-arm64 latest
  • 상대경로 링크 를 권장(폴더를 통째로 옮겨도 안 깨짐).

실제 트리 예시(혼합 사례)

80_Toolchains/
  gcc/
    13.3.0-linux-x64/
    13.3.0-mac-arm64/
    latest -> 13.3.0-mac-arm64
  cmake/
    3.29.3/
    latest -> 3.29.3

81_SDKs/
  jdk/
    21.0.2/
    latest -> 21.0.2
  qt/
    6.7.2-win-x64-msvc/
    latest -> 6.7.2-win-x64-msvc

82_Tools/
  bin/                   # 단일 바이너리
    rg
    fd
  portable/              # 섞여 있으므로 접두어-버전
    gcc-13.3.0-linux-x64/
    cmake-3.29.3/
    ninja-1.12.1/

운영 팁(간단 룰)

  • 툴별 전용 디렉터리면 → 버전만

  • 섞여 있으면 → 툴-버전

  • 변형이 필요하면 → 버전 뒤에만 붙이기(13.3.0-mac-arm64)

  • latest는 상대심볼릭

  • 스크립트에는 경로 하드코딩 대신 환경변수 사용(예: WORK_TC, WORK_SDK, WORK_TOOLS)으로 리네임 내성 ↑

원하면 지금 쓰는 폴더들 기준으로 자동 리네이머(중복 접두 제거, 변형 접미 추가, latest 생성까지) 스크립트를 만들어줄게—사용 OS/셸만 알려줘!

ln -s 를 써서 심볼릭을 했는데 -sfn는 뭐가 달라?

짧게:

  • -s = 심볼릭 링크 로 만들어

  • -f = 기존 목적지(linkname)가 있으면 지우고 다시 만들어

  • -n = linkname이 “디렉터리를 가리키는 심볼릭 링크”여도 디렉터리로 취급하지 말고 그 “링크 그 자체”를 교체

그래서 ln -sfn 새버전 latest 는 “latest가 무엇이든(특히 디렉터리를 가리키는 기존 심볼릭)” 강제로 최신 링크로 갈아끼우는 안전한 한 줄 이에요.


-n이 필요하죠?

기존에 latest -> 13.2.0/ 같은 디렉터리 심볼릭 이 있을 때,
ln -sf 13.3.0 latest 는 플랫폼/상황에 따라 latest디렉터리로 따라가 서 그 안에 뭔가 만들려고 시도할 수 있어요(의도 아님).
-n을 주면 latest“그냥 파일(링크) 이름”으로만 보고 그 링크 자체를 교체 합니다.

macOS/BSD에서는 -n-h(symlink를 따라가지 않음)과 동일한 의미입니다.
GNU coreutils(리눅스)에서도 -n/--no-dereference가 같은 역할을 합니다.


자주 쓰는 패턴

새로 만들 때

ln -s 13.3.0 latest           # latest -> 13.3.0 (상대링크 권장)

기존 latest를 새 버전으로 교체(가장 안전)

ln -sfn 13.3.1 latest         # 기존 symlink를 강제로 교체

확인

ls -l latest      # latest -> 13.3.1
readlink latest   # 13.3.1

비교 요약

명령 동작
ln -s T L L이 없을 때만 심볼릭 L → T 생성(이미 있으면 실패)
ln -sf T L L이 파일/링크면 삭제 후 재생성. L이 디렉터리(또는 그를 가리키는 링크)일 땐 의도와 다르게 디렉터리로 따라갈 수 있음
ln -sfn T L L이 디렉터리를 가리키는 심볼릭 이더라도 따라가지 않고 L 자체를 교체(의도대로 최신 링크 업데이트)

주의: L이 실제 디렉터리 라면 -f라도 지우지 않습니다. 그런 경우는 rm -rf L로 직접 지운 뒤 다시 만드세요.


실전 팁

  • 상대경로(예: ln -s 13.3.0 latest)로 만들어 두면 상위 폴더를 통째로 옮겨도 링크가 안 깨집니다.

  • 슬래시 주의 : 13.3.0/ 처럼 타깃에 /를 붙이면 디렉터리로 간주되어 옵션 동작이 미묘해질 수 있으니, 그냥 13.3.0으로 쓰는 걸 추천.

  • Windows는 mklink /D latest 13.3.0(또는 PowerShell New-Item -ItemType SymbolicLink)로 만들고, 교체는 rmdir latest 후 다시 mklink가 정석입니다.

원하면 네 툴 폴더들(gcc, cmake, jdk…)을 순회하며 latest를 일괄 갱신하는 작은 스크립트(bash/tcsh/PowerShell)도 바로 만들어줄게.

이미 빌드된 폴더들을 그냥 cp -rf 로 옮겨도 상관없나

요약부터: 그냥cp -rf로 통째 복사하는 건 비추예요.
안전하게 옮기려면 같은 디스크면mv, 다른 디스크/장치면 rsync -a(또는 cp -a/-pPR)를 쓰고, “옮겨도 되는지”를 종류별로 판단해야 합니다.


1) 언제 “그냥 옮겨도” 되나? (Relocatable OK)

  • 포터블/압축 해제형 CLI(tar.gz로 배포된 cmake/ninja 등)

  • 헤더-only/스크립트-only(특정 절대경로에 묶이지 않은 것)

  • 자체 RPATH가 상대형 이거나 정적 링크 바이너리
    → 이런 건 보통 위치 독립적이라 폴더만 옮겨도 동작합니다.

2) 옮기면 깨지기 쉬운 것 (Relocatable 위험)

  • Python venv / conda env : 내부 shebang과 경로가 절대경로로 박혀 있어요.
    권장 : venv는 다시 만들기, conda는 conda-pack 같은 도구 사용.

  • C/C++ 툴체인·라이브러리절대 RPATH / install prefix 를 가질 때
    readelf -d/patchelf(Linux), otool -l/install_name_tool(macOS)로 확인·수정 필요.

  • Qt/GTK 등 프레임워크 앱 : 플랫폼 러ntime 경로/툴(deploy 도구) 의존.
    macdeployqt/windeployqt로 번들링한 산출만 위치 독립이 됨.

  • Windows에 “인스톨러로 설치된” 툴 : 레지스트리/서비스/시스템 PATH 의존.
    → Program Files에 깔린 건 복사 말고 재설치 가 안전.


3) 안전한 복사/이동 커맨드

같은 디스크(파티션)라면 → 이동이 정답

  • Linux/macOS
    mv /old/path/gcc/13.2.0 /new/path/gcc/
    
    • 장점 : 빠름(메타데이터만 갱신), 권한/타임스탬프/링크 보존.

다른 디스크/장치로 복사해야 한다면

  • Linux
    rsync -aHAX --info=progress2 /old/path/ /new/path/
    # 또는 최소: rsync -a /old/path/ /new/path/
    # cp 대안: cp -a /old/path /new/path
    
  • macOS (BSD cp는 -a가 약함)
    rsync -a /old/path/ /new/path/
    # 또는: cp -pPR /old/path /new/path   # -p(속성) -P(심볼릭 보존) -R(재귀)
    # 또는: ditto /old/path /new/path     # xattrs/리소스 포크까지 잘 보존
    
  • Windows
    robocopy "C:\old\path" "D:\new\path" /MIR /COPY:DATSO /DCOPY:DAT /SL
    # /SL: 심볼릭 링크를 '대상'이 아니라 '링크 자체'로 복사
    

cp -rf는 위험?
-r은 재귀 복사지만 메타데이터(권한/타임스탬프/링크/확장속성)를 제대로 안 지켜요.
또한 심볼릭 링크를 따라가 실제 내용을 복사해 버릴 수 있어 구조가 바뀝니다.
-a(archive)나 -pPR/rsync -a를 쓰세요.


4) 옮긴 뒤 “고장 체크” 빠른 점검표

공통

  • bin/툴 --version 실행

  • 심볼릭 링크 가 그대로인지: find . -type l -ls (링크가 파일로 “복제”되어 있지 않은지)

  • 타임스탬프 유지 여부(증분 빌드 트리거 방지): stat로 몇 개 샘플 확인

Linux(ELF)

ldd bin/somebinary                  # 의존 so 확인
patchelf --print-rpath bin/somebinary
  • 절대 RPATH가 이전 경로를 가리키면 동작 불가 → patchelf --set-rpath로 수정.

macOS(Mach-O)

otool -L bin/somebinary             # 로드 라이브러리 경로
otool -l bin/somebinary | grep -A2 LC_RPATH
  • 필요 시 install_name_tool -change/-add_rpath로 경로 수정.

Python/conda

  • venv는 다시 생성 권장:
    python3 -m venv .venv && . .venv/bin/activate && pip install -r requirements.txt
    
  • conda는 conda-pack 으로 묶어서 옮긴 뒤 재배치 :
    conda-pack -n myenv -o myenv.tar.gz
    mkdir -p /new/env && tar -xzf myenv.tar.gz -C /new/env
    /new/env/bin/conda-unpack
    

Windows

  • 포터블 앱이면 OK. 인스톨러 기반(레지스트리 사용) 툴은 재설치 권장.

5) latest 링크는?

폴더 위치가 바뀌면 상대링크 로 다시 잡는 게 안전:

cd /new/path/gcc
ln -sfn 13.3.0 latest   # 상대경로 심볼릭

결론 (실무 룰)

  1. 같은 디스크면mv, 다른 디스크면 rsync -a (mac은 cp -pPR/ditto도 OK).

  2. venv/conda, 인스톨러 기반 툴 은 복사 대신 재생성/재설치.

  3. 바이너리는 RPATH/의존 라이브러리 를 점검(필요 시 patchelf/install_name_tool).

  4. 복사 후에는 latest 심볼릭 과 PATH만 다시 확인.

원하면 네가 실제로 옮기려는 폴더(예: gcc/13.2.0, qt/6.7.2) 기준으로 안전 명령어 세트 를 구체적으로 써 줄게.

이동하나 카피하나 똑같은거 아닌가

짧게: 아니요.

  • 같은 디스크/파일시스템이면 mv는 거의 이름만 바꾸는(renaming) 메타데이터 연산 → 빠르고 원형(권한/타임스탬프/하드링크 등) 그대로.

  • 다른 디스크/파티션이면 mv도 내부적으로 복사 후 원본 삭제 라서 사실상 cp와 비슷하지만, cp -rf메타데이터·심볼릭 처리 가 부정확할 수 있어 위험.

아래를 기준으로 골라 써요.


step-by-step 판단

  1. 같은 파일시스템?mv

    • 장점: 0-copy(초고속), 원본 inode/권한/타임스탬프/xattr/하드링크 그대로 , 원자적(atomic) rename.

    • 예: mv /work/old/gcc/13.2.0 /work/80_Toolchains/gcc/

  2. 다른 파일시스템(또는 드라이브)?rsync -a(또는 cp -a)

    • rsync -a가 표준 답: 권한/타임스탬프/심볼릭링크/하드링크를 보존.

    • 예 (Linux/macOS):
      rsync -a /old/path/ /new/path/    # 끝에 슬래시 주의
      # 대안: macOS는 cp -pPR 또는 ditto / robocopy(Windows)
      
    • 끝나면 원본을 직접 지우기(rm -rf /old/path)—검증 후.

cp -rf는 비추?
-r은 심볼릭 링크를 따라가서 내용까지 복사 할 수 있고, xattr/ACL/타임스탬프 보존이 깨질 수 있어요. 최소 cp -a(Linux)나 cp -pPR/ditto(macOS)를 써야 안전.


빠른 체크(같은 FS인지)

  • Linux : stat -c %d <path> 두 경로의 숫자가 같으면 같은 FS

  • macOS : stat -f %d <path>

  • 간단 함수:

    samefs() {
      if stat -c %d / >/dev/null 2>&1; then
        [ "$(stat -c %d "$1")" = "$(stat -c %d "$2")" ]
      else
        [ "$(stat -f %d "$1")" = "$(stat -f %d "$2")" ]
      fi
    }
    # 사용: samefs /src /dst && mv /src /dst || rsync -a /src/ /dst/
    

도구/빌드 폴더에 대한 실무 팁

  • 포터블 툴체인/SDK(압축 풀어 쓰는 형태) : 위 규칙대로 옮기면 대체로 OK.

  • Python venv/conda : 내부 절대경로 때문에 복사/이동 후 깨짐 → venv는 다시 만들고, conda는 conda-pack 사용 권장.

  • ELF/Mach-O 바이너리 : RPATH/install_name이 절대경로면 이동 후 실패 →

    • Linux: patchelf --print-rpath bin/...로 확인, 필요시 --set-rpath.

    • macOS: otool -L/install_name_tool로 수정.

  • Windows “인스톨러 설치” 앱 : 레지스트리/서비스 의존 → 재설치 가 안전.


마지막 한 줄 규칙

  • 같은 FSmv (최고)

  • 다른 FSrsync -a / cp -a (검증 후 원본 삭제)

  • cp -rf는 지양 (링크/메타데이터 깨질 위험)

  • 옮긴 뒤엔 latest 심볼릭실행 체크(--version)로 검증!

today.csh 별로인데? 가상환경 소싱하도록 하고 싶은데 커맨드로 venv_user (내 가상환경 소싱하는 alias) 등록하니 그런 커맨드가 없대

좋은 포인트야. 증상은 “today.csh비대화(non-interactive) 셸 에서 커맨드를 실행하고, 네 alias(venv_user)인터랙티브에서만 로드 되기 때문”이에요. 게다가 Python venv는 tcsh에선 activate.cshsource해야 하는데, 이건 tcsh에서만 먹습니다(= sh/bash에서 실행하면 에러).

아래 중 편한 해법 하나 골라 써!


왜 alias가 안 먹나

  • today.csh가 내부에서 shtcsh -f -c "..." 같은 비대화 셸 로 실행 → ~/.tcshrc의 alias가 로드되지 않음.

  • source셸 내장 이라 tcsh 로 실행해야 함. (bash로 돌리면 당연히 “없는 커맨드”)


해결 A) shortcuts.list에서 한 줄로 venv 활성화 후 실행

프로젝트마다 venv가 있다면 tcsh로 실행 하고 activate.cshsource하세요.

My App (venv) | 20_Projects/PRJ-2025-001_app | tcsh -c 'source .venv/bin/activate.csh; ./scripts/run.sh'
  • conda를 쓴다면:
My App (conda) | 20_Projects/PRJ-2025-001_app | tcsh -c 'source ~/miniconda3/etc/profile.d/conda.csh; conda activate myenv; ./scripts/run.sh'

포인트: 반드시 tcsh -c 로 돌려야 source가 먹습니다.
venv는 bin/activate.csh를 쓰고, bash용 bin/activate를 쓰면 tcsh에선 실패해요.


해결 B) 래퍼 스크립트 를 만들어서 언제나 작동하게

10_Today/wrappers/run_in_venv.csh (tcsh용, venv 전용)

tcsh

#!/bin/tcsh -f
# 사용: run_in_venv.csh <venv_dir> <커맨드...>
if ( $#argv < 1 ) then
  echo "usage: run_in_venv.csh <venv_dir> [command ...]"
  exit 2
endif
set venv = "$1"; shift
if ( ! -f "$venv/bin/activate.csh" ) then
  echo "activate.csh not found in $venv/bin"; exit 3
endif
source "$venv/bin/activate.csh"
if ( $#argv == 0 ) then
  exec tcsh -i
else
  # 남은 인자를 하나의 커맨드로 실행
  set cmd = "$*"
  exec tcsh -c "$cmd"
endif

권한 주기:

tcsh

chmod +x ~/Work/10_Today/wrappers/run_in_venv.csh

shortcuts.list 예시:

Run PRJ in venv | 20_Projects/PRJ-2025-001_app | ../../10_Today/wrappers/run_in_venv.csh .venv './scripts/run.sh'
Open tcsh@venv  | 20_Projects/PRJ-2025-001_app | ../../10_Today/wrappers/run_in_venv.csh .venv

conda 버전(run_in_conda.csh):

tcsh

#!/bin/tcsh -f
# 사용: run_in_conda.csh <env_name> <커맨드...>
source ~/miniconda3/etc/profile.d/conda.csh
if ( $#argv < 1 ) then
  echo "usage: run_in_conda.csh <env_name> [command ...]"; exit 2
endif
set env = "$1"; shift
conda activate "$env"
if ( $#argv == 0 ) then
  exec tcsh -i
else
  exec tcsh -c "$*"
endif

해결 C) alias 대신 실행 파일venv_user를 만들기

alias는 비대화 셸에서 안 불러와져요. 아예 스크립트 로 만들어 PATH에 두면 어디서든 호출 가능.

82_Tools/bin/venv_user (tcsh 스크립트):

tcsh

#!/bin/tcsh -f
# 기본 venv 경로를 하드코딩하거나, 인자로 받게 하자
set venv = "$HOME/Work/20_Projects/PRJ-2025-001_app/.venv"
if ( "$1" != "" ) set venv = "$1"; shift
if ( ! -f "$venv/bin/activate.csh" ) then
  echo "activate.csh not found in $venv/bin"; exit 3
endif
source "$venv/bin/activate.csh"
if ( $#argv == 0 ) then
  exec tcsh -i
else
  exec tcsh -c "$*"
endif
chmod +x ~/Work/82_Tools/bin/venv_user

PATH에 82_Tools/bin이 있다면 shortcuts.list는 이렇게:

Run via venv_user | 20_Projects/PRJ-2025-001_app | venv_user .venv './scripts/run.sh'

자주 걸리는 함정 체크리스트

  • tcsh 전용 활성화 : activate.cshsource해야 한다.

  • 셸 지정 : tcsh -c '...'로 실행(기본 sh로 돌리면 실패).

  • 지속성 기대 금지 : today 런처가 하위 셸 에서 실행하므로, 활성화 상태는 그 실행에만 적용됨.
    오래 머무는 셸이 필요하면 위 래퍼로 exec tcsh -i를 열도록.

  • 경로 공백 : 패스/커맨드는 따옴표로 감싸자.

  • conda : conda.cshsource한 뒤 conda activate 해야 함.

원하면 지금 쓰는 today.csh를 살짝 수정해서 항상 tcsh로 실행 하고, 에러/로그 출력도 깔끔하게 보는 버전으로 리팩터링해줄게.

흠 단순히 tcsh에서 작업 폴더로 이동 + command 실행 -> 이후 tcsh 세션 유지 이런 flow가 아닌가보네

맞아—지금 러너는 “비대화 셸에서 실행 → 종료”라서 네가 원하는
(1) 작업 폴더로 이동 → (2) venv/conda 활성화 → (3) 커맨드 실행 → (4) 셸 유지 흐름이 안 나와.
해결법은 마지막에 exec tcsh -i인터랙티브 셸로 전환 해 머무르게 하는 거야.

아래 셋 중 편한 걸 골라 써.


옵션 A) 한 줄로 해결 (shortcuts.list용)

실행 후 셸을 유지하려면 끝에 exec tcsh -i가 핵심!

venv 사용 예

Label | 20_Projects/PRJ-2025-001_app | tcsh -c 'source .venv/bin/activate.csh; ./scripts/run.sh; exec tcsh -i'

conda 사용 예

Label | 20_Projects/PRJ-2025-001_app | tcsh -c 'source ~/miniconda3/etc/profile.d/conda.csh; conda activate myenv; ./scripts/run.sh; exec tcsh -i'

포인트: tcsh -c '...' 안에서 필요한 걸 실행한 뒤 그 프로세스를 인터랙티브 tcsh로 교체 하니, 환경이 보존된 채 셸이 남아있어.


옵션 B) 재사용 래퍼 스크립트 (추천)

Work/10_Today/wrappers/enter.csh

tcsh

#!/bin/tcsh -f
# 사용: enter.csh <path> [--venv <venvdir> | --conda <envname>] [-- cmd ...]
if ( $#argv < 1 ) then
  echo "usage: enter.csh <path> [--venv DIR | --conda NAME] [-- cmd ...]"; exit 2
endif

set cwd = "$1"; shift
cd "$cwd" || exit 3

# 옵션 파싱
set use_venv = ""; set use_conda = ""; set i = 1
while ( $i <= $#argv )
  if ( "$argv[$i]" == "--venv" ) then
    @ i++; set use_venv = "$argv[$i]"
  else if ( "$argv[$i]" == "--conda" ) then
    @ i++; set use_conda = "$argv[$i]"
  else if ( "$argv[$i]" == "--" ) then
    @ i++; break
  else
    break
  endif
  @ i++
end
@ cmd_start = $i

# 환경 활성화
if ( "$use_venv" != "" ) then
  if ( ! -f "$use_venv/bin/activate.csh" ) then
    echo "venv activate.csh not found: $use_venv/bin/activate.csh"; exit 4
  endif
  source "$use_venv/bin/activate.csh"
else if ( "$use_conda" != "" ) then
  if ( -f ~/miniconda3/etc/profile.d/conda.csh ) then
    source ~/miniconda3/etc/profile.d/conda.csh
  endif
  conda activate "$use_conda"
endif

# 커맨드가 있으면 실행
if ( $cmd_start <= $#argv ) then
  set cmd = "$argv[$cmd_start-]"
  tcsh -c "$cmd"
endif

# 여기서 셸에 '머무르기'
exec tcsh -i

권한:

tcsh

chmod +x ~/Work/10_Today/wrappers/enter.csh

shortcuts.list 예시

PRJ venv & stay  | 20_Projects/PRJ-2025-001_app | ../../10_Today/wrappers/enter.csh . --venv .venv -- ./scripts/run.sh
Just enter venv   | 20_Projects/PRJ-2025-001_app | ../../10_Today/wrappers/enter.csh . --venv .venv
PRJ conda & stay  | 20_Projects/PRJ-2025-001_app | ../../10_Today/wrappers/enter.csh . --conda myenv -- ./scripts/run.sh

옵션 C) 전역 커맨드로 고정 (venv_user)

Work/82_Tools/bin/venv_user (PATH에 들어가게)

tcsh

#!/bin/tcsh -f
# 사용: venv_user <project_path> <venv_dir> [-- cmd ...]
set proj="$1"; set venv="$2"; shift; shift
cd "$proj" || exit 3
source "$venv/bin/activate.csh"
if ( "$1" == "--" ) shift
if ( $#argv ) then
  tcsh -c "$*"
endif
exec tcsh -i

권한:

tcsh

chmod +x ~/Work/82_Tools/bin/venv_user

Label | / | venv_user "$HOME/Work/20_Projects/PRJ-2025-001_app" ".venv" -- ./scripts/run.sh

흔한 함정 체크

  • 반드시tcsh로 실행해야 source .../activate.csh가 먹음. (bash로 돌리면 실패)

  • 마지막에 exec tcsh -i가 있어야 환경을 들고 머무름.

  • runner가 이미 경로로 cd해 준다면 enter.csh<path>.로 쓰면 됨.

  • 경로에 공백 있으면 따옴표 필수.

이대로 쓰면 “작업 폴더 이동 → 가상환경 활성화 → 커맨드 실행 → tcsh 유지”가 딱 그 흐름으로 돌아갈 거야.

그냥 내가 원하는 흐름대로 할 순 없어? 작업명 | 작업 폴더(절대 경로) | 작업 경로로 현재 쉘에서 cd로 이동 후 실행할 커맨드드들(비어있을 수도 있음)

가능해! 핵심은 “현재 셸(tcsh)의 상태를 바꾸려면 실행이 아니라 source 해야 한다”는 점이야.
아래 스크립트를 쓰면, 현재 tcsh에서 cd로 이동하고 (필요하면) 명령을 실행 한 뒤 그 상태로 계속 머물러.


1) 원하는 형식의 리스트 파일

~/Work/10_Today/shortcuts.list (예: 절대경로 + 선택 명령)

# label | abs path | commands (optional)
My App(run) | /Users/me/Work/20_Projects/PRJ-2025-001_app | source .venv/bin/activate.csh; ./scripts/run.sh
Just Go     | /Users/me/Work/26_Datasets/datasets/ad_events/v2025.0826/processed |
  • 3번째 칸은 비워도 됨(그냥 폴더만 이동).

  • 명령이 여러 개면 ;로 이어서 쓰면 현재 셸 에서 그대로 실행됨.


2) tcsh 전용 러너 (현재 셸에서 cd + 실행 + 유지)

~/Work/10_Today/jump.csh

tcsh

#!/bin/tcsh -f
# 사용: source ~/Work/10_Today/jump.csh <번호|라벨 일부>
# 동작: shortcuts.list에서 매칭 항목을 찾아 "현재 셸"에서 cd 후 (있으면) 명령을 실행.
# 중요: 반드시 source로 호출해야 현재 셸에 반영됨!

set _list = "$HOME/Work/10_Today/shortcuts.list"
if ( ! -r "$_list" ) then
  echo "not found: $_list"; exit 1
endif

# 인자 없으면 번호 목록을 보여주고 종료
if ( $#argv == 0 ) then
  awk -F'\\|' 'BEGIN{i=0}
    $0 ~ /^[[:space:]]*#/ {next}
    NF>=2 {
      i++; for (k=1;k<=NF;k++){ gsub(/^[ \t]+|[ \t]+$/,"",$k) }
      printf("%2d) %-24s  -> %s\n", i, $1, $2)
    }' "$_list"
  echo 'usage: source ~/Work/10_Today/jump.csh <번호|라벨 일부>'
  exit 0
endif

# 선택 로직: 숫자 인덱스 또는 라벨 부분 일치(대소문자 무시, 첫 매칭)
set _key = "$*"

# dir
set _dir = "`awk -F'\\|' -v key=\"$_key\" '
  BEGIN{IGNORECASE=1; i=0}
  $0 ~ /^[[:space:]]*#/ {next}
  NF>=2 {
    for(k=1;k<=NF;k++){ gsub(/^[ \t]+|[ \t]+$/,"",$k) }
    i++
    if ( (key ~ /^[0-9]+$/ && i==key) || index($1,key) ) { print $2; exit }
  }' \"$_list\"`"

# cmd (optional)
set _cmd = "`awk -F'\\|' -v key=\"$_key\" '
  BEGIN{IGNORECASE=1; i=0}
  $0 ~ /^[[:space:]]*#/ {next}
  NF>=2 {
    for(k=1;k<=NF;k++){ gsub(/^[ \t]+|[ \t]+$/,"",$k) }
    i++
    if ( (key ~ /^[0-9]+$/ && i==key) || index($1,key) ) { if (NF>=3) print $3; exit }
  }' \"$_list\"`"

if ( "$_dir" == "" ) then
  echo "not found: $_key"; exit 2
endif
if ( ! -d "$_dir" ) then
  echo "no such dir: $_dir"; exit 3
endif

# 현재 셸에서 이동
cd "$_dir"

# 명령이 있으면 현재 셸에서 실행(환경 유지)
if ( "$_cmd" != "" ) then
  eval "$_cmd"
endif

# 여기서 끝. source로 불렀기 때문에 셸은 계속 유지됨.

사용법

  1. .tcshrc에 바로가기 추가:
tcsh

alias j 'source ~/Work/10_Today/jump.csh'
  1. 사용 예:
tcsh

j                 # 목록 보기
j 1               # 1번으로 이동(+명령 실행)
j "My App"        # 라벨 부분 매칭으로 이동(+명령 실행)

중요: 반드시 source로 호출해야 현재 셸 에서 cd/환경변경이 반영돼요.
(위 alias j가 바로 그걸 해줍니다.)


팁 (venv/conda)

  • venv 활성화는 명령 칸에 그냥 넣으면 돼요:
    My App | /abs/PRJ | source .venv/bin/activate.csh; ./scripts/run.sh
    
  • conda:
    PRJ(conda) | /abs/PRJ | source ~/miniconda3/etc/profile.d/conda.csh; conda activate myenv; ./scripts/run.sh
    

안전장치

  • #로 시작하는 줄은 주석/비활성 처리.

  • 라벨에 공백 OK. 경로나 명령에 공백이 있어도 위 스크립트가 그대로 잡아줍니다.

  • 번호/라벨 중 첫 매칭 1건 만 실행(중복 라벨은 피하세요).


원하면 이 러너에 fzf 선택(있으면), 디렉터리 자동 완성 , 실패 로그 같은 기능도 얹어줄 수 있어.

그런데 사용 방식은 이전에 너가 한거처럼 번호 묻고 인덱스 넣고 엔터하면 그걸 실행하면 좋겠어. 등록할때도 마찬가지로 라벨 묻고 답하고, 커맨드 묻고 답하면 그 후 등록되는 식이면 좋겠어

좋아, 너가 원하는 번호 선택 → 실행 / 대화형 등록 흐름으로 딱 맞춘 tcsh 러너를 만들어줄게.
핵심은 현재 셸에서source로 실행해야 cd/venv 활성화가 그대로 유지된다는 점!


1) shortcuts.list 포맷 (그대로 복붙)

~/Work/10_Today/shortcuts.list

# label | abs path | commands (optional, ;로 구분)
My App (venv run) | /Users/me/Work/20_Projects/PRJ-2025-001_app | source .venv/bin/activate.csh; ./scripts/run.sh
Just Go           | /Users/me/Work/26_Datasets/datasets/ad_events/v2025.0826/processed |

2) 인터랙티브 러너 (번호 실행 + 대화형 등록)

~/Work/10_Today/jmenu.csh

tcsh

#!/bin/tcsh -f
# jmenu.csh — tcsh용 “번호 선택 실행 + 대화형 등록” 러너
# 사용: source ~/Work/10_Today/jmenu.csh

set _list = "$HOME/Work/10_Today/shortcuts.list"
if ( ! -e "$_list" ) then
  echo "# label | abs path | commands (optional)" > "$_list"
endif

# 리스트 출력 함수
alias _jlist 'awk -F"\\|" '"'"'BEGIN{i=0}
  $0 ~ /^[[:space:]]*#/ {next}
  NF>=2 {
    for (k=1;k<=NF;k++){ gsub(/^[ \t]+|[ \t]+$/,"",$k) }
    if ($1=="") next
    i++; printf("%2d) %-28s -> %s\n", i, $1, $2)
  }'"'"' '$_list

# N번째 항목의 필드 가져오기(1=label, 2=dir, 3=cmd)
alias _jget 'awk -F"\\|" -v idx="\!:1" -v fld="\!:2" '"'"'BEGIN{i=0}
  $0 ~ /^[[:space:]]*#/ {next}
  NF>=2 {
    for (k=1;k<=NF;k++){ gsub(/^[ \t]+|[ \t]+$/,"",$k) }
    if ($1=="") next
    i++; if (i==idx){ if(fld==1)print $1; else if(fld==2)print $2; else if(fld==3 && NF>=3)print $3; exit }
  }'"'"' '$_list

echo ""
echo "== TODAY MENU =="
echo "[R]un (번호로 실행) / [A]dd (등록) / [E]dit / [Q]uit  [Enter=R]"
echo ""
_jlist
echo ""
echo -n "Action [R/A/E/Q]: "
set act = "$<"
if ( "$act" == "" ) set act = "R"
set act = `echo "$act" | tr '[:lower:]' '[:upper:]'`

if ( "$act" == "E" ) then
  set ed = "$EDITOR"
  if ( "$ed" == "" ) set ed = "vi"
  $ed "$_list"
  echo "편집 완료."
  goto END
else if ( "$act" == "A" ) then
  echo -n "Label (띄어쓰기 가능, '|' 금지): "
  set lab = "$<"
  if ( "$lab" == "" ) then
    echo "취소: 라벨이 비어있음."
    goto END
  endif
  if ( "$lab" =~ "*|*" ) then
    echo "취소: '|' 문자는 사용할 수 없음."
    goto END
  endif

  echo -n "Absolute path (비어있으면 현재 경로 사용): "
  set dir = "$<"
  if ( "$dir" == "" ) set dir = "$cwd"
  # 상대경로면 절대경로로 보정
  if ( "$dir" !~ "/*" ) set dir = "$cwd/$dir"
  if ( ! -d "$dir" ) then
    echo -n "디렉터리가 없습니다. 만들까요? [y/N]: "
    set ans = "$<"
    if ( "$ans" == "y" || "$ans" == "Y" ) then
      mkdir -p "$dir"
    else
      echo "취소."
      goto END
    endif
  endif

  echo -n "Commands (옵션, 여러 개는 ';'로 연결): "
  set cmd = "$<"

  # 줄 추가
  if ( "$cmd" == "" ) then
    echo "$lab | $dir |" >> "$_list"
  else
    echo "$lab | $dir | $cmd" >> "$_list"
  endif
  echo "등록 완료:"
  echo "  $lab | $dir | $cmd"
  echo ""
  echo "지금 실행할까요? [y/N]: "
  set runnow = "$<"
  if ( "$runnow" != "y" && "$runnow" != "Y" ) goto END

  # 방금 추가한 항목 번호 계산
  set idx = `_jlist | wc -l`
  # fallthrough to 실행
  goto RUN

else if ( "$act" == "R" ) then
  echo -n "실행할 번호: "
  set idx = "$<"
  if ( "$idx" == "" ) then
    echo "취소: 번호가 비어있음."
    goto END
  endif
  if ( "$idx" !~ "^[0-9][0-9]*$" ) then
    echo "취소: 숫자를 입력하세요."
    goto END
  endif
  # 실행으로 이동
  goto RUN

else
  echo "종료."
  goto END
endif

RUN:
# 필드 추출
set label = "`_jget $idx 1`"
set dest  = "`_jget $idx 2`"
set cmds  = "`_jget $idx 3`"

if ( "$label" == "" || "$dest" == "" ) then
  echo "해당 번호를 찾을 수 없습니다."
  goto END
endif
if ( ! -d "$dest" ) then
  echo "경로가 없습니다: $dest"
  goto END
endif

# 현재 셸에서 이동 + (있으면) 명령 실행
cd "$dest"
if ( "$cmds" != "" ) then
  echo "% 실행: $cmds"
  eval "$cmds"
endif
echo "% 위치: $cwd  (라벨: $label)"
# 스크립트 종료 후에도 현재 셸은 계속 유지됨(이 파일은 source로 불러야 함)

END:

꼭 이렇게 실행하세요 (현재 셸 유지)

.tcshrc에 단축키:

tcsh

alias jm 'source ~/Work/10_Today/jmenu.csh'

이후:

tcsh

jm         # 메뉴 표시 → Action 입력 → 번호 선택 → 실행 → 셸 유지

사용 예 (venv/conda)

  • venv 활성화 후 실행:

    • Commands: source .venv/bin/activate.csh; ./scripts/run.sh
  • conda:

    • Commands: source ~/miniconda3/etc/profile.d/conda.csh; conda activate myenv; ./scripts/run.sh

포인트 (중요)

  • 반드시source로 실행(alias jm 'source ...') → 현재 셸에서 cd/환경 변경이 살아있음.

  • 번호 선택은 주석( # )과 빈 줄 제외 순서로 자동 번호가 매겨집니다.

  • 등록(Add)도 질문→답 형식으로 진행하고, 끝나면 즉시 실행할지 물어봐요.

  • 경로에 공백/세미콜론이 있으면 따옴표 로 감싸주세요.

원하면 이 러너에 삭제/이동(번호 기반 재정렬) , fzf 선택 지원 도 추가해 줄 수 있어.

alias _jlist 에서부터 unmatched "'" 뜨고 종료돼. 좀 쉽게 하는 법 없나 파이썬 같은걸로

맞아, tcsh 따옴표 지옥 피하려면 Python으로 “번호 선택/등록 → 현재 셸에서 cd+실행” 흐름을 만드는 게 제일 깔끔해. 아래 그대로 쓰면 돼.


0) 핵심 아이디어

  • Python 스크립트가 메뉴/등록을 처리하고, 실행할 tcsh 코드~/.cache/jmenu_out.csh에 써둠

  • 현재 셸에서는 작은 래퍼(jm.csh)를source 해서 그 코드를 실행 → cd/venv 활성화가 현재 셸에 그대로 반영


1) 리스트 파일 포맷 (그대로 사용)

~/Work/10_Today/shortcuts.list

# label | abs path | commands (optional, 여러 개는 ; 로 연결)
My App (venv run) | /Users/me/Work/20_Projects/PRJ-2025-001_app | source .venv/bin/activate.csh; ./scripts/run.sh
Just Go           | /Users/me/Work/26_Datasets/datasets/ad_events/v2025.0826/processed |

2) Python 메뉴/등록 스크립트

~/Work/10_Today/jmenu.py

#!/usr/bin/env python3
import os, sys

LIST_PATH = os.path.expanduser('~/Work/10_Today/shortcuts.list')
OUT_PATH  = os.path.expanduser('~/.cache/jmenu_out.csh')

def load_items():
    items=[]
    if not os.path.exists(LIST_PATH):
        return items
    with open(LIST_PATH, encoding='utf-8') as f:
        for line in f:
            s=line.strip()
            if not s or s.lstrip().startswith('#'): continue
            parts=[p.strip() for p in s.split('|')]
            if len(parts)<2: continue
            label=parts[0]; path=parts[1]
            cmd=parts[2] if len(parts)>=3 else ''
            items.append({'label':label,'path':path,'cmd':cmd})
    return items

def print_menu(items):
    print("\n== TODAY MENU ==")
    if not items: print("(no entries yet)")
    for i,it in enumerate(items,1):
        print(f"{i:2d}) {it['label']:<28} -> {it['path']}")
    print()

def write_out(path, cmd):
    os.makedirs(os.path.dirname(OUT_PATH), exist_ok=True)
    with open(OUT_PATH, 'w', encoding='utf-8') as w:
        w.write('# generated by jmenu.py\n')
        w.write(f'cd "{path}"\n')
        if cmd: w.write(cmd.rstrip() + '\n')
    print(f"[jmenu] wrote {OUT_PATH}")

def save_item(label, path, cmd):
    os.makedirs(os.path.dirname(LIST_PATH), exist_ok=True)
    with open(LIST_PATH, 'a', encoding='utf-8') as w:
        w.write(f"{label} | {path} | {cmd}\n")

def main():
    items=load_items()
    print_menu(items)
    act=input("Action [R]un / [A]dd / [E]dit / [Q]uit (default R): ").strip().upper() or 'R'
    if act=='Q': return 0
    if act=='E':
        editor=os.environ.get('EDITOR','vi')
        os.execvp(editor,[editor,LIST_PATH])

    if act=='A':
        lab=input("Label: ").strip()
        if not lab or '|' in lab:
            print("Invalid label."); return 1
        default_pwd=os.environ.get('PWD', os.getcwd())
        dir_=input(f"Absolute path [{default_pwd}]: ").strip() or default_pwd
        if not os.path.isabs(dir_): dir_=os.path.abspath(dir_)
        if not os.path.isdir(dir_):
            mk=input("Directory not found. Create? [y/N]: ").strip().lower()
            if mk=='y': os.makedirs(dir_, exist_ok=True)
            else: print("Canceled."); return 1
        cmd=input("Commands (optional; use ';' to chain): ").strip()
        save_item(lab, dir_, cmd)
        print("Added.")
        if input("Run now? [y/N]: ").strip().lower()=='y':
            write_out(dir_, cmd)
        return 0

    if not items:
        print("No entries to run."); return 1
    try:
        idx=int(input("Number to run: ").strip())
    except Exception:
        print("Invalid number."); return 1
    if not (1<=idx<=len(items)):
        print("Out of range."); return 1
    it=items[idx-1]
    path=it['path']
    if not os.path.isabs(path): path=os.path.abspath(path)
    write_out(path, it['cmd'])
    print(f"{it['label']}")
    return 0

if __name__=='__main__':
    sys.exit(main())

3) tcsh 래퍼 (현재 셸에 반영)

~/Work/10_Today/jm.csh

tcsh

#!/bin/tcsh -f
# 현재 셸에서 source 해야 cd/환경이 유지됨
python3 ~/Work/10_Today/jmenu.py
if ( -r ~/.cache/jmenu_out.csh ) then
  source ~/.cache/jmenu_out.csh
endif

권한:

tcsh

chmod +x ~/Work/10_Today/jm.csh

.tcshrc에 단축키:

tcsh

alias jm 'source ~/Work/10_Today/jm.csh'

4) 사용법

jm          # 메뉴가 뜸 → R/A/E 선택 → 번호 입력 → 실행
  • 등록(Add) : 라벨/경로/커맨드 차례로 묻고 저장. “Run now?”에 y면 즉시 실행 스크립트가 만들어져 현재 셸에 반영됨.

  • 실행(Run) : 번호만 넣으면 됨.

  • 유지 : 별도 exec tcsh -i 필요 없음. “현재 셸에서 source” 하므로 venv/conda 활성화가 그대로 남아있음.

venv 예시 커맨드: source .venv/bin/activate.csh; ./scripts/run.sh
conda 예시: source ~/miniconda3/etc/profile.d/conda.csh; conda activate myenv; ./scripts/run.sh


이렇게 하면 tcsh 인용/따옴표 문제 없이 번호 선택/등록 이 깔끔하게 돌아가고, 네가 원한 “작업 폴더로 이동 → 명령 실행 → 셸 유지” 흐름을 그대로 쓸 수 있어.

unmatched error는 왜 뜬걸까

맞아요—그 “unmatched ' ” 에러는 tcsh의 따옴표(quote) 규칙 때문에 납니다.

왜 그랬냐면 (핵심)

  • 보통 alias name '...명령...' 처럼 단일 인용부호(')로 alias 본문을 감싸요.

  • 그런데 alias 본문 안에서 또 awk -F'\|' 같이 다시 ' 를 사용 하면,
    tcsh는 바깥 ' 가 거기서 닫혔다고 해석 합니다.
    → 결과적으로 열린 ' 와 닫힌 ' 의 짝이 안 맞아 “unmatched '”가 터져요.

  • tcsh단일 인용부호를 내부에서 이스케이프할 수 없습니다.
    (sh 계열에서 쓰는 '\'' 같은 꼼수도 tcsh에선 통하지 않아요.)

작은 재현 예:

tcsh

alias bad 'awk -F'\|' '{print $1}''   # ← 여기서 unmatched '

간단한 해결법 3가지

  1. alias 바깥을 " (이중인용부호)로 감싸고 , awk 프로그램은 ' 로 유지
    tcsh
         
    alias _jlist "awk -F'\\|' 'BEGIN{i=0} {print $0}' $_list"
    
    • 바깥은 " 이라 내부의 '...'문자 그대로 awk로 전달됩니다.

    • \\| 는 awk로 \|가 전달되도록 한 이스케이프입니다(필드 구분자에 ‘ ’ literal).
  2. awk 스크립트를 파일로 분리 (가장 안전)
    tcsh
         
    # ~/Work/10_Today/jlist.awk
    BEGIN { i=0 }
    $0 !~ /^[[:space:]]*#/ && NF>=2 {
      gsub(/^[ \t]+|[ \t]+$/,"",$1); gsub(/^[ \t]+|[ \t]+$/,"",$2);
      i++; printf("%2d) %-28s -> %s\n", i, $1, $2)
    }
    
    tcsh
         
    alias _jlist "awk -F'\\|' -f ~/Work/10_Today/jlist.awk $_list"
    
  3. (추천) 아예 tcsh를 안 건드리고 Python으로 처리
    이미 드린 jmenu.py + jm.csh 방식이 이 문제를 원천 차단합니다.
    (파싱/등록/번호 선택은 파이썬이 하고, 현재 셸 반영은 source ~/.cache/jmenu_out.csh로 해결)

추가로 흔한 함정

  • history 확장(!) : tcsh는 " 안에서도 !를 히스토리로 해석합니다.
    awk 코드에 !가 들어간다면 alias 바깥을 '...'로, awk 본문은 -f 파일로 빼는 게 안전합니다.

  • backslash 처리 : " 안에서는 \, ", $, !만 특별 취급되고 나머지 \는 그대로 전달됩니다.
    그래서 -F"\\|"처럼 두 번 적어야 awk로 \|가 전달돼요.


정리

  • 에러 원인: 단일 인용부호를 중첩 해서 tcsh 파서가 문자열 경계를 오해했기 때문.

  • 해결: 바깥은 "…", 안쪽 awk는 '…' 패턴으로 바꾸거나, awk 스크립트를 파일로 분리 ,
    또는 Python 러너 를 사용해 quotes 지옥을 회피하세요.

원하면, 기존 tcsh-only 버전을 문자열 안전하게 고친 _jlist/_jget alias 전체를 만들어서 드릴게.

오케이 일단 작업 폴더 구성으로 다시 돌아가자. 00_README.txt 로 구성할려고 해 01_Inbox 최종 구조 다시 정리해줘.

좋아! 00_README.txt + 01_Inbox 기준으로 최종 구조를 다시 정리했어.
(좌측은 폴더/파일명(영문) , - 오른쪽은 설명(한글). 하위 예시 포함)

Work/                                           - 1인 개발용 작업 루트
├─ 00_README.txt                                - 전체 폴더 규칙/운영 요약(하단 템플릿 참고)
├─ 01_Inbox/                                    - 수작업 임시함(스크린샷/메모/임시 파일)
├─ 05_Downloads/                                - 다운로드 착륙지(정리 전 임시)
│  ├─ _inbox/                                   - 브라우저/툴 기본 저장 경로
│  ├─ installers/                               - 설치 파일(.exe/.msi/.pkg/.dmg/.whl/.zip)
│  ├─ datasets/                                 - 데이터셋 압축/CSV 임시(해제 전)
│  ├─ manuals/                                  - 매뉴얼/가이드 PDF/HTML 임시
│  ├─ assets/                                   - 폰트/아이콘/템플릿 등 임시
│  └─ quarantine/                               - 의심 파일(검사 전 격리)
├─ 10_Today/                                    - 오늘 작업 대시보드(콘솔 런처/단축)
│  ├─ shortcuts.list                            - "라벨 | 경로 | 명령" 목록
│  └─ wrappers/                                 - 실행 래퍼 스크립트(예: enter.csh)
├─ 20_Projects/                                 - 툴(파이썬 패키지) 개발(코드 수명 중심)
│  └─ PRJ-YYYY-NNN_name/                        - 예: PRJ-2025-001_sample_app
│     ├─ src/<package_name>/                    - 패키지 소스
│     ├─ tests/                                 - pytest
│     ├─ scripts/                               - build/lint/test/run 스크립트
│     ├─ examples/{data,scripts,docs}/          - 배포용 최소 실행 예제
│     ├─ issues/BUG-YYYY-NNN/                   - 버그/개선 노트
│     ├─ docs/                                  - 설계·ADR·가이드
│     └─ pyproject.toml, README.md, .gitignore, .editorconfig
├─ 22_Labs/                                     - 가벼운 실험/프로토(재현 불필요)
│  └─ jupyter/                                  - 스크래치 노트북(예: regex_scratch.ipynb)
├─ 25_Jobs/                                     - 산출 작업 단위(프로세스 수명 중심)
│  ├─ _active/                                  - 진행 중 작업(최대 12개 유지)
│  ├─ _templates/                               - 복제용 스캐폴드(JOB/BUG/SMOKE/LAB/EX/REL)
│  ├─ JOB/2025/                                 - 일반 산출 작업
│  ├─ BUG/2025/                                 - 배포 버그 재현/검증
│  ├─ SMOKE/2025/                               - 새 툴 스모크/feasibility
│  ├─ LAB/2025/                                 - 재현형 교육 실습(Job 형태)
│  ├─ EX/2025/                                  - 배포 예제 패키징
│  └─ REL/2025/                                 - 릴리스 준비/검증
├─ 26_Datasets/                                 - 데이터셋 중앙 저장소(입력/출력 자산)
│  ├─ registry/                                 - 카탈로그(색인: catalog.csv, README.md)
│  ├─ datasets/<name>/vYYYY.MMDD/               - 입력 데이터셋(버전)
│  │  ├─ raw/ interim/ processed/ samples/      - 원본/중간/정제/샘플
│  │  ├─ docs/                                  - README, dataset_card.md
│  │  ├─ manifest.yml                           - 출처/스키마/체크섬/라이선스
│  │  └─ SHA256SUMS                             - 무결성 체크섬
│  ├─ derived/<artifact>/vYYYY.MMDD/            - 재사용 가치 있는 출력물(승격본)
│  │  ├─ data/ metrics/ docs/                   - 결과/지표/문서
│  │  ├─ manifest.yml                           - 계보(lineage)/메타
│  │  └─ SHA256SUMS
│  └─ cache/                                    - 언제 지워도 되는 캐시
├─ 30_Areas/                                    - 장기 운영 영역(지속 업무/정책)
│  ├─ worklog/YYYY/YY-MM/DATE.md                - 일일/주간 5줄 로그
│  ├─ environments/                             - 공통 환경 전략(파이썬/OS 정책)
│  └─ knowledge_base/{tips,cheatsheets,howtos}/ - 축적 지식: 팁/치트시트/가이드
├─ 32_SharedConfigs/                            - 공유/골든 설정(표준 ruff/pytest/VSCode 등)
│  ├─ global/{vscode,ruff,pytest,pyinstaller,pyside6,jupyter}/
│  └─ projects/<project_slug>/                  - 특정 프로젝트 기본설정
├─ 40_Resources/                                - 참고 자료(교육/매뉴얼/스펙—설정 제외)
│  ├─ edu/{courses,tutorials,papers/{to_read,reading_notes,summaries}}/
│  ├─ manuals/<vendor>/<product>/<version>/     - 매뉴얼/가이드
│  └─ reference/                                - 표준/스펙 문서 등 읽을거리
├─ 50_Snippets/{sql,text,bash}/                 - 재사용 코드/원라이너/문구 조각
├─ 60_Assets/                                   - 로고/폰트/템플릿 등 시각 자산
│  └─ fonts/<Family>/vX.Y/{desktop,web,variable,license,specimen}/
├─ 70_Exports/                                  - 여러 Job의 최종 전달본 모아보기(선택)
├─ 75_Releases/                                 - 유저 배포 전용(버전드)
│  └─ <project_slug>/
│     ├─ vX.Y.Z/{installers,wheels,portable,docs,licenses,checksums,ReleaseNotes.md}
│     └─ latest/                                - 최신 버전 포인터(심볼릭)
├─ 80_Toolchains/                               - 고정 버전 빌드 도구(gcc/cmake/ninja…)
│  ├─ gcc/{13.3.0, latest->13.3.0}/             - latest는 상대 심볼릭 링크
│  ├─ cmake/{3.29.3, latest->3.29.3}/
│  └─ ninja/{1.12.1, latest->1.12.1}/
├─ 81_SDKs/                                     - 플랫폼 SDK/런타임(JDK/Qt/NDK/CUDA…)
│  ├─ jdk/{21.0.2, latest->21.0.2}/
│  └─ qt/{6.7.2-win-x64-msvc, latest->6.7.2-win-x64-msvc}/
├─ 82_Tools/                                    - 개인·경량·포터블 유틸
│  ├─ installers/<tool>/<ver>/                  - 설치 원본 정본 + SHA256SUMS, install_notes.md
│  ├─ bin/                                      - 단일 실행 파일(PATH 포함)
│  ├─ portable/<tool>-<ver>/                    - 압축 풀어 쓰는 포터블
│  ├─ scripts/                                  - bootstrap/release/checksum 등
│  └─ scratch/                                  - 임시 테스트(주기적 청소)
├─ 83_Runtimes/                                 - 언어 런타임 모음(옵션: python/node/go/rust…)
├─ 85_Environments/                             - 도커/콘다/venv/devcontainer “환경 캡슐”
│  ├─ conda/environment.yml, venv/README.md
│  ├─ docker/Dockerfile, compose.yml
│  └─ devcontainer/base/{Dockerfile, devcontainer.json}
├─ 90_PersonalConfigs/                          - 개인 설정(오버라이드/비공개)
│  ├─ shell/{bash,zsh,tcsh,powershell}/         - 예: shell/tcsh/.tcshrc (홈에 심링크)
│  ├─ editors/vscode/{settings.user.json,keybindings.user.json}
│  ├─ git/.gitconfig.local
│  ├─ python/{pip.conf,poetry.toml,pypirc}
│  ├─ tools/                                    - 툴 개인 프리셋
│  ├─ secrets/README.md                         - (실비밀은 두지 말 것)
│  └─ .gitignore                                - *.local, secrets/*, *.pem 등 제외
└─ 99_Archive/                                  - 완료 Project/Job/자료 장기 보관(읽기 전용)

00_README.txt 템플릿(짧게 복붙)

# Work 폴더 운영 규칙(요약)
1) 단일 정본 원칙:
   - 코드: 20_Projects / 실행 작업: 25_Jobs / 데이터셋: 26_Datasets
   - 링크/경로만 참조, 복사본 금지
2) Today는 대시보드:
   - 원본 이동 금지, shortcuts.list로만 실행
3) 다운로드 정리:
   - 05_Downloads/_inbox → installers/datasets/manuals/assets로 분류
   - 설치 원본은 82_Tools/installers로 이동 + SHA256SUMS/notes
4) 데이터 버전/무결성:
   - vYYYY.MMDD, manifest.yml + SHA256SUMS 필수
5) 설정 레이어:
   - Project 로컬 → 90_PersonalConfigs(개인) → 32_SharedConfigs(global/projects)
6) 보안:
   - 비밀은 90_PersonalConfigs/secrets만, 코드에 하드코딩 금지
7) 릴리스:
   - 75_Releases/<proj>/vX.Y.Z + checksums/ReleaseNotes, latest 심링크
8) 청소 루틴:
   - 매일: 01_Inbox/05_Downloads 정리
   - 주 1회: 25_Jobs/_active 슬림화, Today 정리
   - 월 1회: 26_Datasets 카탈로그/무결성 점검

사용 시 주요 주의점(핵심)

  • 임시와 정본 분리 : 01_Inbox/05_Downloads는 임시, 정본은 각 전용 폴더.

  • 데이터 재현성 : 26_Datasets는 버전·메타(Manifest/Checksums)와 함께 관리.

  • 툴 스택 분리 : 표준(80/81) ↔ 개인(82) ↔ 캡슐(85) 구분, latest는 상대 심볼릭.

  • 프로젝트 빌드 위치 : 항상 20_Projects/<PRJ>/build(out-of-source).

  • PATH/런처 관리 : Today의 shortcuts.list +(선택) jm 러너로 빠른 점프/실행.

원하면 이 구조를 실제 폴더/README/샘플 파일 까지 한 번에 생성하는 스크립트(bash/tcsh/PowerShell)도 만들어줄게.

그런데 내가 일하다보면 “이건 어디에 어떤식으로 넣어야하지?” 궁금할 때가 있어. 그 때마다 여기에 물어보니 번거로우니, local LLM에 물으면서 일하고 싶어. local LLM (가칭 work directory manager)에 넣어줄 시스템 프롬프트 작성을 도와줘. local LLM은 GPT-OSS 120B 모델이야. 폴더 구조와 주의 사항 등등 local LLM system prompt에 넣어줄 프롬프트 작성을 부탁해.

아래 블록을 그대로 local LLM의 System Prompt 로 넣어 주세요.
(폴더명은 영어, 설명/규칙은 한국어. 루트는 기본 ~/Work로 가정합니다.)

[SYSTEM PROMPT] Work Directory Manager (WDM)

역할:
- 당신은 “Work Directory Manager(WDM)”입니다. 사용자가 생성/수집한 모든 산출물·파일·설정·데이터를 아래의 표준 워크스페이스 트리에 따라 **어디에, 어떤 이름/버전으로, 어떤 절차로** 배치해야 하는지 즉답합니다.
- 목표: (1) 정본 위치의 일관성, (2) 재현성/추적성(버전·메타·체크섬), (3) 임시와 정본의 분리, (4) 최소 마찰 워크플로.

전제:
- 작업 루트는 기본 `~/Work` (사용자가 다르게 말하면 그 경로를 루트로 사용).
- 운영체제는 macOS/Linux/Windows를 혼용할 수 있음. 경로/명령 예시는 OS별로 제시.
- 심볼릭 링크는 가능한 **상대경로**를 권장.

폴더 트리(정의):
- `00_README.txt` : 운영 규칙 요약 문서(반드시 최신화).
- `01_Inbox/` : 수작업 스크랩/메모/스크린샷 임시함(정리 전).
- `05_Downloads/` : 다운로드 착륙지(정리 전 임시).
  - `_inbox/` : 브라우저/CLI 기본 저장 경로.
  - `installers/` `datasets/` `manuals/` `assets/` `quarantine/`
- `10_Today/` : 오늘 작업 대시보드(런처/단축/래퍼).
  - `shortcuts.list` : `라벨 | 절대경로 | 명령들(옵션)` 형식.
  - `wrappers/` : 실행 보조 스크립트(예: enter.csh).
- `20_Projects/` : 툴/앱(파이썬 패키지 포함) **코드 정본**.
  - `PRJ-YYYY-NNN_name/` (예: `PRJ-2025-001_sample_app`)
  - `src/<pkg>/`, `tests/`, `scripts/`, `examples/`, `docs/`, `pyproject.toml` …
- `22_Labs/` : 가벼운 실험/프로토(재현 불필요). 예: `jupyter/regex_scratch.ipynb`
- `25_Jobs/` : 산출 작업(프로세스 수명 중심).
  - `_active/`(진행 중 ≤12개), `_templates/`, `JOB/연도/`, `BUG/연도/`, `SMOKE/연도/`, `LAB/연도/`, `EX/연도/`, `REL/연도/`
- `26_Datasets/` : 데이터셋 **정본**(입력/승격 출력).
  - `registry/`(카탈로그), `datasets/<name>/vYYYY.MMDD/{raw,interim,processed,samples,docs,manifest.yml,SHA256SUMS}`
  - `derived/<artifact>/vYYYY.MMDD/{data,metrics,docs,manifest.yml,SHA256SUMS}`
  - `cache/`(언제든 삭제 가능)
- `30_Areas/` : 장기 운영(정책/워크로그/공통 환경 전략).
  - `knowledge_base/{tips,cheatsheets,howtos}/`(축적 지식)
- `32_SharedConfigs/` : **공유/골든 설정**(팀 표준).
  - `global/{vscode,ruff,pytest,pyinstaller,pyside6,jupyter}/`
  - `projects/<project_slug>/`
- `40_Resources/` : 참고 자료(교육/매뉴얼/스펙—설정 제외).
  - `edu/`, `manuals/<vendor>/<product>/<version>/`, `reference/`
- `50_Snippets/{sql,text,bash}/` : 재사용 코드/원라이너/문구 조각.
- `60_Assets/` : 로고/폰트/템플릿 등 시각 자산.
  - `fonts/<Family>/vX.Y/{desktop,web,variable,license,specimen}/`
- `70_Exports/` : 여러 Job의 최종 전달본 모아보기(선택).
- `75_Releases/<project>/vX.Y.Z/` : 유저 배포 전용(최신은 `latest` 심링크).
  - `installers,wheels,portable,docs,licenses,checksums,ReleaseNotes.md`
- `80_Toolchains/` : 고정 버전 빌드 도구(gcc/cmake/ninja…)
  - `<tool>/<version>/` + `latest -> <version>`(상대 심링크)
- `81_SDKs/` : 플랫폼 SDK/런타임(JDK/Qt/NDK/CUDA…)
  - `<sdk>/<version>/` + `latest -> <version(`
- `82_Tools/` : 개인/경량/포터블 유틸
  - `installers/<tool>/<ver>/`(SHA256SUMS, install_notes.md)
  - `bin/`, `portable/<tool>-<ver>/`, `scripts/`, `scratch/`
- `83_Runtimes/` : 언어 런타임 모음(옵션: python/node/go/rust…)
- `85_Environments/` : docker/conda/venv/devcontainer **환경 캡슐**
  - `conda/environment.yml`, `docker/Dockerfile`, `devcontainer/...`
- `90_PersonalConfigs/` : **개인 설정/오버라이드/비공개**
  - `shell/{bash,zsh,tcsh,powershell}/` (예: `shell/tcsh/.tcshrc` — 홈에 심링크)
  - `editors/vscode/...`, `git/.gitconfig.local`, `python/pip.conf…`, `tools/`, `secrets/README.md`, `.gitignore`
- `99_Archive/` : 완료 항목 장기 보관(읽기 전용)

핵심 원칙:
1) **단일 정본 원칙**: 코드 정본은 `20_Projects`, 실행·산출 흐름은 `25_Jobs`, 데이터 정본은 `26_Datasets`. 복사본 금지, 필요 시 링크/경로 참조.
2) **임시↔정본 분리**: `01_Inbox`/`05_Downloads`는 착륙지. 정리 후 전용 위치로 이동.
3) **재현성**: 데이터는 `vYYYY.MMDD` 버전, `manifest.yml` + `SHA256SUMS` 필수. 툴체인/SDK는 `latest` 상대 심링크.
4) **보안**: 비밀/자격증명은 `90_PersonalConfigs/secrets/` 외 금지. 코드엔 환경변수로 주입.
5) **빌드 위치**: 앱/라이브러리 컴파일은 항상 `20_Projects/<PRJ>/build`(out-of-source). 80/81/83은 “보관/참조”만.
6) **PATH/런처**: 실행은 `10_Today/shortcuts.list` + 래퍼로. 현재 셸 상태를 바꿀 땐 `source` 사용.

네이밍 규칙:
- 프로젝트: `PRJ-YYYY-NNN_name`
- 작업(Job): `JOB|BUG|SMOKE|LAB|EX|REL-YYYY-NNN_title`
- 데이터셋 버전: `vYYYY.MMDD` (예: `v2025.0826`)
- 파일: `YYYY-MM-DD_title_vNNN.ext` 권장
- Toolchains/SDKs: `<tool>/<version>/` (portable 혼합 폴더에선 `tool-version/`)

데이터셋 관리 규칙:
- 입력: `26_Datasets/datasets/<name>/vYYYY.MMDD/{raw,interim,processed,samples,docs,manifest.yml,SHA256SUMS}`
- 파생(승격): `26_Datasets/derived/<artifact>/vYYYY.MMDD/{data,metrics,docs,manifest.yml,SHA256SUMS}`
- 캐시: `26_Datasets/cache/` (언제든 삭제)
- `manifest.yml`(요약): name/kind/version/owner/created_at/source/schema/pii/license/files[].path/bytes/sha256, (derived면) lineage(inputs/code/job)/metrics
- 체크섬: 버전 루트에 `SHA256SUMS` (형식: `<sha256>  <상대경로>`)

툴/SDK 배치:
- 설치 원본은 `82_Tools/installers/<tool>/<ver>/`에 보관 + `SHA256SUMS`, `install_notes.md`
- 실제 사용 경로: `80_Toolchains/<tool>/<ver>/`, `81_SDKs/<sdk>/<ver>/` (필요 시 `latest` 심링크)
- 개인·가변 유틸: `82_Tools/bin` 또는 `82_Tools/portable/<tool>-<ver>/`
- 런타임 모음(옵션): `83_Runtimes/<lang>/<ver>/`
- 캡슐 환경: `85_Environments/(docker|conda|venv|devcontainer)`

릴리스:
- `75_Releases/<project>/vX.Y.Z/` (checksums/, ReleaseNotes.md 포함)
- `latest/`는 해당 버전을 가리키는 **상대 심링크**로 유지

결정 절차(의사결정 트리):
1) **항목 분류**(단 하나 선택):
   - Code(소스/패키지) → 20_Projects
   - Work unit(실행/분석/보고) → 25_Jobs
   - Dataset(입력/출력/승격/캐시) → 26_Datasets
   - Toolchain/SDK/Runtime/Tool → 80/81/82/83
   - Config(공유/개인) → 32_SharedConfigs / 90_PersonalConfigs
   - Manual/Spec/Edu/Reference → 40_Resources
   - Asset(font/logo/template) → 60_Assets
   - Snippet(짧은 코드/문구) → 50_Snippets
   - Release artifact → 75_Releases
   - Export(deliverables pool) → 70_Exports
   - Temporary capture → 01_Inbox / 05_Downloads/_inbox
2) **임시냐 정본이냐**: 다운로드/임시면 05로, 정본이면 전용 위치.
3) **버전·메타 필요 여부**: 데이터셋/릴리스/설치원본은 버전·체크섬·메타 필수.
4) **프로젝트 참조 규칙**: 대용량/공유 데이터는 프로젝트로 복사 금지, **경로 참조/링크**만.
5) **공유 vs 개인 설정**: 팀 표준(32), 개인 오버라이드(90). 홈 설정은 90 정본→홈 심링크.
6) **이동 방식**: 같은 FS면 `mv`, 다른 FS면 `rsync -a`(macOS는 `cp -pPR`/`ditto` 가능). `cp -rf` 지양.

애매할 때의 기본값(질문 최소화):
- “다운로드된 설치 파일” → `82_Tools/installers/<tool>/<ver>/` (분류 불가 시 `misc/`)
- “데이터 압축/표” → `26_Datasets/_staging/YYYY-MM-DD/` 로 임시 수용 후 정식 네이밍/버전 부여
- “문서(PDF/guide)” → `40_Resources/manuals/<vendor>/<product>/<version>/`
- “폰트/브랜딩” → `60_Assets/fonts/<Family>/vX.Y/…`
- “어디에도 안 맞음 + 일단 보관” → `01_Inbox` (주기 정리 권장)

출력 형식(반드시 준수):
1) **Recommended Path(s)**: 절대경로 1~2개 (필요 시 버전/폴더 생성 제안)
2) **Why**: 2~4줄 근거(규칙 조항 번호/원칙 참조)
3) **Ready-to-Run**: OS별 명령 세트
   - macOS/Linux: `mkdir -p … && mv … …` 또는 `rsync -a …`
   - Windows: PowerShell `New-Item …; Move-Item …` 또는 `robocopy`
   - (데이터셋이면) `manifest.yml`/`SHA256SUMS` 초기 템플릿 한 줄 포함
4) **Follow-ups**(선택): `10_Today/shortcuts.list` 추가 라인, `latest` 심링크 명령, `.gitignore` 힌트 등
5) **If Ambiguous**: 필요한 단 1~2개의 질문만 하고, 답 없으면 안전한 기본값 적용 선언

예시 응답 1 — “CSV 데이터셋(입력) 파일”:
- Recommended Path: `~/Work/26_Datasets/datasets/ad_events/v2025.0829/raw/`
- Why: (원칙 3) 데이터 정본은 26에 버전/메타와 함께, (결정 3) 입력은 raw→processed 단계.
- Ready-to-Run (macOS/Linux):

mkdir -p ~/Work/26_Datasets/datasets/ad_events/v2025.0829/raw
mv ~/Downloads/ad_2025_0829.csv ~/Work/26_Datasets/datasets/ad_events/v2025.0829/raw/
cd ~/Work/26_Datasets/datasets/ad_events/v2025.0829 && : > SHA256SUMS &&
find . -type f ! -name 'SHA256SUMS' ! -name '.*' -print0 | xargs -0 shasum -a 256 | sed 's# # #' » SHA256SUMS
printf '%s\n' "name: ad_events\nkind: dataset\nversion: v2025.0829\n…" > manifest.yml

- Follow-ups: 처리 후 `processed/` 생성, 소용량 `samples/` 작성 권장.

예시 응답 2 — “gcc 13.3.0 포터블 툴체인”:
- Recommended Path: `~/Work/80_Toolchains/gcc/13.3.0/` (+ `latest -> 13.3.0`)
- Why: (툴/SDK 배치) 표준 툴체인은 80에 버전별 폴더, latest 심링크.
- Ready-to-Run:

mkdir -p ~/Work/80_Toolchains/gcc
tar -xf ~/Work/82_Tools/installers/gcc/13.3.0/gcc-13.3.0.tar.xz -C ~/Work/80_Toolchains/gcc/
mv ~/Work/80_Toolchains/gcc/gcc-13.3.0 ~/Work/80_Toolchains/gcc/13.3.0
(cd ~/Work/80_Toolchains/gcc && ln -sfn 13.3.0 latest)

- Follow-ups: PATH에 `.../gcc/latest/bin` 추가.

예시 응답 3 — “개인 tcsh 설정 파일(.tcshrc)”:
- Recommended Path: `~/Work/90_PersonalConfigs/shell/tcsh/.tcshrc` (홈엔 심링크)
- Why: 개인 오버라이드는 90, 홈은 링크만.
- Ready-to-Run (macOS/Linux):

mkdir -p ~/Work/90_PersonalConfigs/shell/tcsh
mv ~/.tcshrc ~/Work/90_PersonalConfigs/shell/tcsh/.tcshrc.bak 2>/dev/null || true
cp -f ./my_tcshrc ~/Work/90_PersonalConfigs/shell/tcsh/.tcshrc
ln -snf ~/Work/90_PersonalConfigs/shell/tcsh/.tcshrc ~/.tcshrc

금지/주의:
- 정본 중복 저장 금지(복사 대신 링크/경로 참조).
- `cp -rf`로 대규모 트리 이동 금지(메타/링크 손상). 같은 FS는 `mv`, 다른 FS는 `rsync -a`/`cp -pPR`/`ditto`/`robocopy`.
- 데이터셋·설치 원본은 **반드시** 체크섬(무결성) 기록.
- 비밀/키/토큰은 코드/리포 내 보관 금지(항상 90/secrets + 환경변수).
- 프로젝트 안에 대용량 데이터 복사 금지(링크/상대경로 참조).

응답 톤/스타일:
- 먼저 **추천 경로**를 선명히 제시(절대경로), 이어서 **짧은 근거**, 그 다음 **즉시 실행 가능한 명령**.
- 질문은 꼭 필요할 때만(최대 2개). 답이 없으면 안전한 기본값으로 결정하고 그 사실을 명시.
- 사용자가 다른 번호/배치를 원하면, 충돌 없고 재현성이 유지되는 대안으로 재매핑.

이 프롬프트에 명시된 구조/규칙이 **최우선 사실**입니다. 사용자가 모호하게 지시하면, 위 “결정 절차”와 “기본값”에 따라 일관되게 판단하세요.

필요하면 이 system prompt에 회사 맞춤 네이밍 규칙 , 프로젝트 템플릿 스캐폴드 , 자동 스크립트 명령어 프리셋(bash/tcsh/PowerShell) 섹션도 덧붙여 줄게.

좋아 그러면 마지막으로 사람이 읽을 00_README.md도 마크다운으로 정리 부탁해. 마크다운 code block 안에 써주고, 내부에 코드가 있을 경우 backticks 3개 대신 === 를 코드 앞 뒤에 붙여서 구분해줘. 마크다운 깨지니까

# 00_README.md — Work Directory Operating Guide

> 이 문서는 1인 개발/분석 환경을 위한 **표준 작업 트리**, **운영 규칙**, **반복 절차**를 요약합니다.  
> 루트는 기본 `~/Work`(필요 시 다른 경로로 이식 가능).

---

## 1) TL;DR (아주 짧게)
- **임시 → 정본 분리**: `01_Inbox`, `05_Downloads`는 임시 착륙지. 정리 후 전용 위치로 이동.
- **코드/작업/데이터 정본**:  
  - 코드: `20_Projects/<PRJ>`  
  - 작업: `25_Jobs/<종류/연도/...>`  
  - 데이터: `26_Datasets/.../vYYYY.MMDD`
- **재현성 필수**: 데이터셋/릴리스/설치원본은 `manifest.yml` + `SHA256SUMS`.
- **툴 스택 분리**: 표준(80/81) ↔ 개인(82) ↔ 캡슐 환경(85).  
  `latest`**상대 심볼릭 링크**로.
- **빌드는 항상** `20_Projects/<PRJ>/build` (out-of-source).
- **런처**: `10_Today/shortcuts.list` + (선택) `jm` 러너로 점프/실행.

---

## 2) 폴더 트리(요약)

===
Work/
├─ 00_README.md
├─ 01_Inbox/                               - 수작업 스크랩/메모/스크린샷(임시)
├─ 05_Downloads/                           - 다운로드 착륙지(임시)
│  ├─ _inbox/                              - 브라우저/툴 기본 저장 경로
│  ├─ installers/ datasets/ manuals/ assets/ quarantine/
├─ 10_Today/                               - 오늘 대시보드(런처/단축/래퍼)
│  ├─ shortcuts.list                        # "라벨 | 절대경로 | 명령(옵션)"
│  └─ wrappers/                             # enter.csh 등
├─ 20_Projects/                            - 툴/앱(파이썬 패키지) 코드 정본
│  └─ PRJ-YYYY-NNN_name/
│     ├─ src/<pkg>/  tests/  scripts/  examples/  docs/
│     └─ pyproject.toml  README.md
├─ 22_Labs/                                - 가벼운 실험/프로토(재현 불필요)
├─ 25_Jobs/                                - 산출 작업(프로세스 수명 중심)
│  ├─ _active/  _templates/
│  ├─ JOB/2025/  BUG/2025/  SMOKE/2025/  LAB/2025/  EX/2025/  REL/2025/
├─ 26_Datasets/                            - 데이터셋 정본
│  ├─ registry/
│  ├─ datasets/<name>/vYYYY.MMDD/{raw,interim,processed,samples,docs,manifest.yml,SHA256SUMS}
│  ├─ derived/<artifact>/vYYYY.MMDD/{data,metrics,docs,manifest.yml,SHA256SUMS}
│  └─ cache/
├─ 30_Areas/                               - 장기 운영(정책/워크로그/지식)
│  └─ knowledge_base/{tips,cheatsheets,howtos}/
├─ 32_SharedConfigs/                       - 공유/골든 설정(팀 표준)
│  ├─ global/{vscode,ruff,pytest,pyinstaller,pyside6,jupyter}/
│  └─ projects/<project_slug>/
├─ 40_Resources/                           - 참고 자료(교육/매뉴얼/스펙—설정 제외)
│  ├─ edu/  manuals/<vendor>/<product>/<version>/  reference/
├─ 50_Snippets/{sql,text,bash}/            - 재사용 코드/원라이너/문구 조각
├─ 60_Assets/                              - 로고/폰트/템플릿 등
│  └─ fonts/<Family>/vX.Y/{desktop,web,variable,license,specimen}/
├─ 70_Exports/                             - 여러 Job의 전달본 모아보기(선택)
├─ 75_Releases/<project>/vX.Y.Z/           - 유저 배포(ReleaseNotes/체크섬 포함)
│  └─ latest -> vX.Y.Z                     # 상대 심볼릭
├─ 80_Toolchains/                          - 고정 버전 빌드 도구(gcc/cmake/ninja…)
│  ├─ gcc/{13.3.0, latest->13.3.0}/
│  ├─ cmake/{3.29.3, latest->3.29.3}/
│  └─ ninja/{1.12.1, latest->1.12.1}/
├─ 81_SDKs/                                - 플랫폼 SDK/런타임(JDK/Qt/NDK/CUDA…)
│  ├─ jdk/{21.0.2, latest->21.0.2}/
│  └─ qt/{6.7.2-win-x64-msvc, latest->6.7.2-win-x64-msvc}/
├─ 82_Tools/                               - 개인·경량·포터블 유틸
│  ├─ installers/<tool>/<ver>/ (SHA256SUMS, install_notes.md)
│  ├─ bin/  portable/<tool>-<ver>/  scripts/  scratch/
├─ 83_Runtimes/                            - 언어 런타임 모음(옵션)
├─ 85_Environments/                        - docker/conda/venv/devcontainer
│  ├─ conda/environment.yml  docker/Dockerfile  devcontainer/...
├─ 90_PersonalConfigs/                     - 개인 설정/오버라이드/비공개
│  ├─ shell/{bash,zsh,tcsh,powershell}/  editors/vscode/  git/  python/  tools/  secrets/
└─ 99_Archive/                             - 완료 항목 장기 보관(읽기 전용)
===

---

## 3) 네이밍 & 버전 규칙
- **프로젝트**: `PRJ-YYYY-NNN_slug` (예: `PRJ-2025-001_sample_app`)
- **작업(Job)**: `JOB|BUG|SMOKE|LAB|EX|REL-YYYY-NNN_title`
- **데이터셋 버전**: `vYYYY.MMDD` (예: `v2025.0829`)
- **portable 폴더**(혼합): `tool-version` (예: `gcc-13.3.0-linux-x64`)
- **파일**: `YYYY-MM-DD_title_vNNN.ext` 권장

---

## 4) 운영 원칙 (필수)
1) **단일 정본 원칙**  
   - 코드: `20_Projects`, 작업: `25_Jobs`, 데이터: `26_Datasets`  
   - 복사본 금지, 필요 시 링크/경로 참조.
2) **임시 ↔ 정본 분리**  
   - `01_Inbox/05_Downloads/_inbox`는 임시. 정리 후 전용 위치로 이동.
3) **재현성**  
   - 데이터/릴리스/설치원본: `manifest.yml` + `SHA256SUMS` 필수.  
   - Toolchains/SDKs는 `latest` 상대 심링크.
4) **보안**  
   - 비밀/키는 `90_PersonalConfigs/secrets/`만(레포 금지). 환경변수로 주입.
5) **빌드 위치**  
   - 항상 `20_Projects/<PRJ>/build` (out-of-source). 80/81/83은 “보관/참조”만.
6) **이동 규칙**  
   - 같은 파일시스템: `mv` (빠르고 안전)  
   - 다른 파일시스템: `rsync -a` 또는 macOS `cp -pPR`/`ditto`, Windows `robocopy`  
   - `cp -rf` 지양(메타/링크 파손 위험).

---

## 5) 반복 루틴
- **매일**: `05_Downloads/_inbox` → installers/datasets/manuals/assets로 분류.  
- **주 1회**: `25_Jobs/_active` 슬림화, `10_Today` 단축 정비.  
- **월 1회**: `26_Datasets` 카탈로그 갱신/무결성 점검.

---

## 6) Today 런처 사용
- `10_Today/shortcuts.list` 포맷:

===
# label | abs path | commands (optional; ';'로 연결)
My App (venv) | /Users/me/Work/20_Projects/PRJ-2025-001_app | source .venv/bin/activate.csh; ./scripts/run.sh
Just Go       | /Users/me/Work/26_Datasets/datasets/ad_events/v2025.0829/processed |
===

- (선택) `jm` 러너: 번호 선택/등록 → **현재 셸에서 cd + 실행 + 환경 유지**.

---

## 7) 데이터셋: `manifest.yml` & `SHA256SUMS`

**템플릿(입력 데이터셋)**

===
name: <dataset_name>
kind: dataset
version: vYYYY.MMDD
created_at: 2025-08-29T00:00:00+09:00
owner: you@company.com
source:
  type: <external|internal|manual>
  detail: "<설명/링크>"
schema:
  format: <parquet|csv|json|image|...>
  rows: <int or unknown>
  columns:
    - {name: <col1>, type: <type>}
pii_level: <none|low|medium|high>
license: <internal|...>
files:
  - {path: <relative/file>, bytes: <int>, sha256: "<optional>"}
notes: "<전처리/주의사항>"
===

**파생(derived) 추가 필드**

===
kind: derived
lineage:
  inputs:
    - {name: <dataset_a>, version: vYYYY.MMDD, path: "../../../datasets/<dataset_a>/vYYYY.MMDD/processed"}
  code: {repo: "<PRJ-...>", commit: "<hash or tag>"}
  job:  {id: "JOB-YYYY-NNN_title"}
metrics:
  records_after_filters: <int>
  sanity_checks:
    - "rule: pass/fail"
===

**체크섬 생성**

- macOS/Linux:

===
cd <버전 루트>
: > SHA256SUMS
find . -type f ! -name 'SHA256SUMS' ! -name '.*' -print0 \
| xargs -0 shasum -a 256 | sed 's#  #  #' >> SHA256SUMS
# 검증: awk '{print $2}' SHA256SUMS | xargs -I{} shasum -a 256 "{}"
===

- Windows PowerShell:

===
$root = "<버전 루트>"
Set-Location $root
Remove-Item -Force SHA256SUMS -ErrorAction SilentlyContinue
Get-ChildItem -Recurse -File -Force | Where-Object {
  $_.Name -ne 'SHA256SUMS' -and -not $_.Name.StartsWith('.')
} | ForEach-Object {
  $h=(Get-FileHash $_.FullName -Algorithm SHA256).Hash.ToLower()
  $rel=$_.FullName.Substring($root.Length+1).Replace('\','/')
  "$h  $rel"
} | Set-Content -NoNewline SHA256SUMS
===

---

## 8) Toolchains/SDKs 배치 & `latest` 링크

**설치 원본 보관**: `82_Tools/installers/<tool>/<ver>/` (+ `SHA256SUMS`, `install_notes.md`)  
**배치 경로**:  
- 툴체인: `80_Toolchains/<tool>/<version>/`  
- SDK: `81_SDKs/<sdk>/<version>/`  
- 개인 유틸: `82_Tools/bin` 또는 `82_Tools/portable/<tool>-<ver>/`

**심볼릭 링크**

- macOS/Linux:

===
cd ~/Work/80_Toolchains/gcc
ln -sfn 13.3.0 latest    # 상대 링크 권장
===

- Windows (관리자 CMD):

===
cd %USERPROFILE%\Work\80_Toolchains\gcc
rmdir latest 2>nul
mklink /D latest 13.3.0
===

**PATH 예시**

===
# bash/zsh
export PATH="$HOME/Work/82_Tools/bin:$HOME/Work/80_Toolchains/gcc/latest/bin:$PATH"

# tcsh
set path = ( $HOME/Work/82_Tools/bin $HOME/Work/80_Toolchains/gcc/latest/bin $path )

# PowerShell
$env:Path = "$HOME\Work\82_Tools\bin;$HOME\Work\80_Toolchains\gcc\latest\bin;" + $env:Path
===

---

## 9) 이동/복사 규칙(안전)
- **같은 파일시스템**: `mv` (메타데이터/링크 보존, 원자적 rename)
- **다른 파일시스템**: `rsync -a`  
  - macOS 대안: `cp -pPR` 또는 `ditto`  
  - Windows: `robocopy /MIR /COPY:DATSO /DCOPY:DAT /SL`
- **주의**: `cp -rf` 지양(심볼릭을 따라가 복제/메타 손상 위험)

---

## 10) 보안 & 비밀
- 비밀/키/토큰/인증서는 `90_PersonalConfigs/secrets/`에만.  
- 레포/문서/노트북에 직접 저장 금지. 환경변수나 파일 경로로 주입.

---

## 11) 흔한 FAQ
- **폰트는 어디?**`60_Assets/fonts/<Family>/vX.Y/{desktop,web,...}` (라이선스 동봉)  
- **릴리스 산출물은?**`75_Releases/<project>/vX.Y.Z/` (+ checksums/ReleaseNotes, `latest` 링크)  
- **교육 실험/프로토?** → 단발성: `22_Labs/`, 재현·배포 가치 있으면 `25_Jobs/LAB/…` 승격  
- **데이터셋 초기 투입?** → 정식 이름/버전 미정이면 `26_Datasets/_staging/YYYY-MM-DD/`

---

## 12) 부록: 빠른 스캐폴드

**새 프로젝트(PRJ) 뼈대**

===
mkdir -p ~/Work/20_Projects/PRJ-2025-001_sample_app/{src/sample_app,tests,scripts,examples,docs}
printf '%s\n' "[tool.black]" > ~/Work/20_Projects/PRJ-2025-001_sample_app/pyproject.toml
===

**새 데이터셋 버전**

===
base=~/Work/26_Datasets/datasets/ad_events/v2025.0829
mkdir -p $base/{raw,interim,processed,samples,docs}
printf '%s\n' "name: ad_events\nkind: dataset\nversion: v2025.0829" > $base/manifest.yml
===

**Today 단축 추가 예시**

===
echo "My App | $HOME/Work/20_Projects/PRJ-2025-001_sample_app | source .venv/bin/activate.csh; ./scripts/run.sh" >> ~/Work/10_Today/shortcuts.list
===

---

_이 문서는 실제 운영 중 배운 내용을 수시로 업데이트하세요. (변경 시 상단 날짜 갱신 권장)_

작업 폴더 관련 내용은 어느 폴더에 넣어야해?

작업 폴더 관련 내용은 주로 폴더 운영 규칙 에 해당하므로, 00_README.txt 또는 00_README.md 파일에 포함되는 것이 가장 적합합니다. 이 파일은 작업 환경과 폴더 구조를 이해하는 데 중요한 역할을 하며, 작업 공간을 어떻게 구성하고 사용할지에 대한 규칙을 명확히 정리할 수 있습니다.

작업 폴더 관련 내용을 넣을 폴더:

  1. 00_README.txt (또는 00_README.md)

    • 이 파일은 루트 폴더 에 위치하며, 작업 폴더 구성에 대한 전체적인 설명과 규칙 을 담고 있습니다. 사용자가 이 파일을 통해 작업 환경에 대한 기본 정보를 쉽게 얻을 수 있습니다.
  2. 32_SharedConfigs/

    • 폴더 구조를 포함한 규칙이 계속해서 팀 단위로 사용되는 설정 과 연결될 수 있다면, 이곳에 기본 환경 설정 을 담은 템플릿이나 예시를 포함시킬 수도 있습니다. 예를 들어, 팀이 공유하는 vscode 설정이나 shell 환경 설정 등을 넣는 폴더입니다.
  3. 25_Jobs/

    • 작업 프로세스산출물에 대한 규칙 을 다루는 부분은 25_Jobs/에 포함될 수 있습니다. 이 폴더는 작업 흐름과 관련된 디렉터리/프로세스 에 대한 구체적인 템플릿이나 예시를 담는 데 사용됩니다.
  4. 10_Today/

    • 오늘 작업할 단축 명령 이나 실행 스크립트 를 다룰 경우 10_Today/shortcuts.list에 관련 내용을 추가하고, 워크플로우를 관리 할 수 있도록 관련 스크립트를 관리할 수 있습니다.

최종적으로 작업 폴더 관련 내용은 00_README.md에 넣는 것이 가장 직관적이고 체계적입니다. 이 파일에서 폴더 구성운영 원칙 을 모두 정리해두면, 사용자는 작업 환경에 대한 전반적인 이해를 쉽게 얻을 수 있습니다.

예를 들어 LLM 프롬프트는

LLM 프롬프트 에 작업 폴더 관련 내용을 포함하려면, 폴더 구조운영 규칙명확하고 간결하게 설명해야 합니다. 아래는 local LLM (가칭 Work Directory Manager)이 작업 폴더를 관리할 수 있도록 돕는 시스템 프롬프트 예시 입니다. 이 프롬프트는 작업 폴더 관련 규칙폴더 구조 를 쉽게 이해하고 관리할 수 있게 구성되었습니다.


Local LLM 시스템 프롬프트 예시: Work Directory Manager (WDM)

[SYSTEM PROMPT] Work Directory Manager (WDM)

역할:
- 당신은 "Work Directory Manager(WDM)"입니다. 사용자가 생성/수집한 모든 산출물·파일·설정·데이터를 아래의 표준 워크스페이스 트리에 따라 **어디에, 어떤 이름/버전으로, 어떤 절차로** 배치해야 하는지 즉답합니다.
- 목표: (1) 정본 위치의 일관성, (2) 재현성/추적성(버전·메타·체크섬), (3) 임시와 정본의 분리, (4) 최소 마찰 워크플로.

전제:
- 작업 루트는 기본 `~/Work` (사용자가 다르게 말하면 그 경로를 루트로 사용).
- 운영체제는 macOS/Linux/Windows를 혼용할 수 있음. 경로/명령 예시는 OS별로 제시.
- 심볼릭 링크는 가능한 **상대경로**를 권장.

폴더 트리(정의):
- `00_README.md` : 운영 규칙 요약 문서(반드시 최신화).
- `01_Inbox/` : 수작업 스크랩/메모/스크린샷 임시함(정리 전).
- `05_Downloads/` : 다운로드 착륙지(정리 전 임시).
  - `_inbox/` : 브라우저/CLI 기본 저장 경로.
  - `installers/` `datasets/` `manuals/` `assets/` `quarantine/`
- `10_Today/` : 오늘 작업 대시보드(런처/단축/래퍼).
  - `shortcuts.list` : `라벨 | 절대경로 | 명령들(옵션)` 형식.
  - `wrappers/` : 실행 보조 스크립트(예: enter.csh).
- `20_Projects/` : 툴/앱(파이썬 패키지 포함) **코드 정본**.
  - `PRJ-YYYY-NNN_name/` (예: `PRJ-2025-001_sample_app`)
  - `src/<pkg>/`, `tests/`, `scripts/`, `examples/`, `docs/`, `pyproject.toml` …
- `22_Labs/` : 가벼운 실험/프로토(재현 불필요). 예: `jupyter/regex_scratch.ipynb`
- `25_Jobs/` : 산출 작업(프로세스 수명 중심).
  - `_active/`(진행 중 ≤12개), `_templates/`, `JOB/연도/`, `BUG/연도/`, `SMOKE/연도/`, `LAB/연도/`, `EX/연도/`, `REL/연도/`
- `26_Datasets/` : 데이터셋 **정본**(입력/승격 출력).
  - `registry/`(카탈로그), `datasets/<name>/vYYYY.MMDD/{raw,interim,processed,samples,docs,manifest.yml,SHA256SUMS}`
  - `derived/<artifact>/vYYYY.MMDD/{data,metrics,docs,manifest.yml,SHA256SUMS}`
  - `cache/`(언제든 삭제 가능)
- `30_Areas/` : 장기 운영(정책/워크로그/공통 환경 전략).
  - `knowledge_base/{tips,cheatsheets,howtos}/`(축적 지식)
- `32_SharedConfigs/` : **공유/골든 설정**(팀 표준).
  - `global/{vscode,ruff,pytest,pyinstaller,pyside6,jupyter}/`
  - `projects/<project_slug>/`
- `40_Resources/` : 참고 자료(교육/매뉴얼/스펙—설정 제외).
  - `edu/`, `manuals/<vendor>/<product>/<version>/`, `reference/`
- `50_Snippets/{sql,text,bash}/` : 재사용 코드/원라이너/문구 조각.
- `60_Assets/` : 로고/폰트/템플릿 등 시각 자산.
  - `fonts/<Family>/vX.Y/{desktop,web,variable,license,specimen}/`
- `70_Exports/` : 여러 Job의 최종 전달본 모아보기(선택).
- `75_Releases/<project>/vX.Y.Z/` : 유저 배포 전용(최신은 `latest` 심링크).
  - `installers,wheels,portable,docs,licenses,checksums,ReleaseNotes.md`
- `80_Toolchains/` : 고정 버전 빌드 도구(gcc/cmake/ninja…)
  - `<tool>/<version>/` + `latest -> <version>`(상대 심링크)
- `81_SDKs/` : 플랫폼 SDK/런타임(JDK/Qt/NDK/CUDA…)
  - `<sdk>/<version>/` + `latest -> <version(`
- `82_Tools/` : 개인/경량/포터블 유틸
  - `installers/<tool>/<ver>/`(SHA256SUMS, install_notes.md)
  - `bin/`, `portable/<tool>-<ver>/`, `scripts/`, `scratch/`
- `83_Runtimes/` : 언어 런타임 모음(옵션: python/node/go/rust…)
- `85_Environments/` : docker/conda/venv/devcontainer **환경 캡슐**
  - `conda/environment.yml`, `docker/Dockerfile`, `devcontainer/...`
- `90_PersonalConfigs/` : **개인 설정/오버라이드/비공개**
  - `shell/{bash,zsh,tcsh,powershell}/` (예: `shell/tcsh/.tcshrc` — 홈에 심링크)
  - `editors/vscode/`, `git/`, `python/`, `tools/`, `secrets/README.md`, `.gitignore`
- `99_Archive/` : 완료 항목 장기 보관(읽기 전용)

핵심 원칙:
1) **단일 정본 원칙**: 코드 정본은 `20_Projects`, 실행·산출 흐름은 `25_Jobs`, 데이터 정본은 `26_Datasets`. 복사본 금지, 필요 시 링크/경로 참조.
2) **임시↔정본 분리**: `01_Inbox`/`05_Downloads`는 임시, 정리 후 전용 위치로 이동.
3) **재현성**: 데이터는 `vYYYY.MMDD` 버전, `manifest.yml` + `SHA256SUMS` 필수. 툴체인/SDK는 `latest` 상대 심링크.
4) **보안**: 비밀/자격증명은 `90_PersonalConfigs/secrets/` 외 금지. 코드엔 환경변수로 주입.
5) **빌드 위치**: 항상 `20_Projects/<PRJ>/build`(out-of-source). 80/81/83은 “보관/참조”만.
6) **PATH/런처 관리**: Today의 `shortcuts.list` +(선택) `jm` 러너로 빠른 점프/실행.

---

## 11) 빠른 질문 예시:

- **데이터셋은 어디에?**  
  `26_Datasets/datasets/<name>/vYYYY.MMDD/{raw,interim,processed,samples,docs,manifest.yml,SHA256SUMS}`

- **새 툴은 어디에?**  
  `82_Tools/installers/<tool>/<ver>/` (SHA256SUMS/설치 노트 포함)

- **정리 전 다운로드 파일은?**  
  `05_Downloads/` 아래 적절한 폴더(예: `installers/`, `assets/`, `datasets/`)

- **소스 코드 위치는?**  
  `20_Projects/<PRJ_NAME>/src/` — out-of-source 빌드, 실행 파일은 `20_Projects/<PRJ_NAME>/build/`

---

## 12) 작업 폴더 추가/변경 시 참고 사항:

1. **새 프로젝트 폴더 추가**:
   - `20_Projects/<PRJ_NAME>/src/`, `tests/`, `docs/` 폴더를 추가합니다.
   - 빌드는 `build/` 폴더에서 실행하고, 산출물은 `build/`로 분리해두세요.

2. **새 데이터셋 추가**:
   - `26_Datasets/datasets/<name>/vYYYY.MMDD/`에 `raw`, `interim`, `processed` 폴더를 만들고, `manifest.yml`과

응 이걸 어느 폴더에 넣어두고 싶어

00_README.md 파일은 루트 폴더~/Work에 두는 것이 가장 적합합니다. 이 파일은 작업 환경과 폴더 구조에 대한 전체적인 규칙 을 설명하는 중요한 문서로, 작업을 시작하기 전에 누구나 참고할 수 있어야 하기 때문입니다.

따라서, 해당 파일을 ~/Work/00_README.md 위치에 두는 것이 좋습니다.

이유:

  1. 중앙 집중식 문서 : 00_README.md는 모든 작업 폴더 구조와 운영 규칙을 한눈에 파악할 수 있게 도와줍니다. 작업을 시작하기 전에 폴더 구조를 잘못 사용하거나 헷갈릴 일이 없도록 안내 역할을 합니다.

  2. 확장성 : 추후 새로운 규칙이나 워크플로우가 추가되거나 수정될 때, 이 파일을 통해 모든 팀원이 쉽게 업데이트된 내용을 공유 할 수 있습니다.

  3. 편리한 접근 : ~/Work는 작업 루트이므로 누구나 쉽게 접근 가능 하고, 파일도 루트에 위치시켜야 폴더나 프로젝트를 분류할 때 혼동이 없을 것입니다.


최종 결론:

00_README.md 파일은 ~/Work 폴더에 두고, 이를 통해 작업 폴더와 규칙을 관리하세요.

README는 사람이 읽는거지 LLM을 위한 글을 넣기는 좀 부적절하거지 않아?

맞아요, README.md는 사람이 읽기 위한 문서이고, LLM 프롬프트 는 시스템과의 상호작용을 위해 정해진 규칙과 규격을 명시 해야 하기 때문에 LLM 프롬프트를README에 넣는 것은 부적절합니다.

따라서, LLM 프롬프트는 00_README.md가 아닌 90_PersonalConfigs32_SharedConfigs 내에 별도의 구성 파일 로 두는 것이 더 나은 방법입니다. 특히 LLM을 위한 시스템 프롬프트작업 공간 관련 설정90_PersonalConfigs/llm_config/ 같은 폴더를 만들어 두는 것이 적합할 수 있습니다.

추천 폴더 구성:

  1. 90_PersonalConfigs/llm_config/
    이 폴더는 LLM과 관련된 모든 설정 파일과 시스템 프롬프트를 관리하는 곳으로 사용됩니다.

  2. 32_SharedConfigs/llm_config/
    팀 단위로 공유할 LLM 프롬프트나 설정을 두기 위해 32_SharedConfigs 폴더 안에 두는 방법도 가능합니다. 이렇게 하면 다른 사람과 공유할 수 있습니다.

예시 경로:

  • 90_PersonalConfigs/llm_config/system_prompt.txt

  • 32_SharedConfigs/llm_config/system_prompt.txt

시스템 프롬프트 예시 내용:

[SYSTEM PROMPT] Work Directory Manager (WDM)

역할:
- 당신은 "Work Directory Manager(WDM)"입니다. 사용자가 생성/수집한 모든 산출물·파일·설정·데이터를 아래의 표준 워크스페이스 트리에 따라 **어디에, 어떤 이름/버전으로, 어떤 절차로** 배치해야 하는지 즉답합니다.
- 목표: (1) 정본 위치의 일관성, (2) 재현성/추적성(버전·메타·체크섬), (3) 임시와 정본의 분리, (4) 최소 마찰 워크플로.

전제:
- 작업 루트는 기본 `~/Work` (사용자가 다르게 말하면 그 경로를 루트로 사용).
- 운영체제는 macOS/Linux/Windows를 혼용할 수 있음. 경로/명령 예시는 OS별로 제시.
- 심볼릭 링크는 가능한 **상대경로**를 권장.
...

결론:

  • LLM 프롬프트90_PersonalConfigs/llm_config/ 또는 32_SharedConfigs/llm_config/와 같은 폴더에 두는 것이 적절합니다.

  • 00_README.md는 작업 환경 및 폴더 규칙을 설명하는 사람을 위한 문서 로만 사용합니다.

이렇게 하면 작업과 관련된 시스템 프롬프트 및 설정 을 명확하게 분리할 수 있습니다!

파이썬 기본 버젼은 어디 설치해

짧게: 기본(레퍼런스) 파이썬은83_Runtimes/python/<version>/에 설치하고,
셸에선 83_Runtimes/python/latest/bin을 PATH 맨 앞에 두세요.
프로젝트별 실행 환경은 각 프로젝트의.venv/(또는 85_Environments/conda)로 분리합니다.


83_Runtimes인가

  • 런타임 전용 슬롯 이라 시스템 전역(/usr/local 등) 오염 X

  • 버전 공존 + latest 심볼릭으로 손쉬운 전환

  • 80_Toolchains(빌드 도구)와 82_Tools(개인 유틸)와 역할 분리


권장 배치

83_Runtimes/
└─ python/
   ├─ 3.12.5/               # 실제 인터프리터(설치 본체)
   ├─ 3.11.9/
   └─ latest -> 3.12.5      # 상대 심볼릭 링크

PATH 설정 (기본 python3 지정)

  • bash/zsh
    export PATH="$HOME/Work/83_Runtimes/python/latest/bin:$PATH"
    
  • tcsh
    tcsh
        
    set path = ( $HOME/Work/83_Runtimes/python/latest/bin $path )
    
  • PowerShell
    $env:Path = "$HOME\Work\83_Runtimes\python\latest\Scripts;$HOME\Work\83_Runtimes\python\latest;" + $env:Path
    

설치 방법 (step-by-step)

macOS / Linux (공식 tarball 또는 pyenv로 빌드)

  1. 디렉터리 준비
mkdir -p ~/Work/83_Runtimes/python
  1. (A안) 공식 tarball /프리빌트 압축 해제 → 버전 폴더로 이동
tar -xf Python-3.12.5-<플랫폼>.tar.* -C ~/Work/83_Runtimes/python/
mv ~/Work/83_Runtimes/python/Python-3.12.5* ~/Work/83_Runtimes/python/3.12.5

(B안) pyenv로 빌드 후 결과를 옮겨 배치해도 됩니다.
3) latest 링크 만들기

cd ~/Work/83_Runtimes/python && ln -sfn 3.12.5 latest
  1. PATH 반영 후 확인
python3 --version   # 3.12.5

Windows

  1. 사용자 영역 에 설치(관리자 권장 X)

    • 설치 경로를 C:\Users\<you>\Work\83_Runtimes\python\3.12.5로 지정

    • “Add to PATH” 체크는 꺼두고, 위의 PowerShell PATH로 제어

  2. latest는 Windows에선 심볼릭 또는 정션:

cmd

cd %USERPROFILE%\Work\83_Runtimes\python
rmdir latest 2>nul
mklink /D latest 3.12.5
  1. 확인:
python --version

프로젝트별 환경 정책

  • 기본 원칙: 전역 인터프리터(83_Runtimes)는 “도구”일 뿐.
    실제 의존성은 프로젝트마다 격리.

옵션 1) 각 프로젝트 로컬 venv (권장, 가볍고 빠름)

20_Projects/PRJ-.../
└─ .venv/               # 이 폴더는 이동/복사 비권장(절대경로 내장)

생성:

cd ~/Work/20_Projects/PRJ-foo
python3 -m venv .venv
. .venv/bin/activate   # tcsh이면: source .venv/bin/activate.csh
pip install -r requirements.txt

옵션 2) 85_Environments/conda (무거워도 편의성↑)

  • 공용 이름의 env 관리, 데이터과학 툴에 유리
conda env create -f ~/Work/85_Environments/conda/environment.yml
conda activate myenv

전역 유틸(스크립트/CLI) 다룰 때

  • pipx 로 전역 CLI를 82_Tools/bin에 깔끔히 분리:
    export PIPX_HOME="$HOME/Work/82_Tools/pipx"
    export PIPX_BIN_DIR="$HOME/Work/82_Tools/bin"
    pipx ensurepath
    pipx install ruff
    
  • 전역 pip는 가급적 사용하지 않기(충돌 방지). 필요 시 90_PersonalConfigs/python/pip.conf에 정책 명시.

버전 전환/업그레이드

  1. 새 버전 추가: 83_Runtimes/python/3.13.0/

  2. latest만 갈아끼우기:

cd ~/Work/83_Runtimes/python && ln -sfn 3.13.0 latest
  1. 스크립트/CI는 항상 .../python/latest를 참조하도록 유지

주의사항 (중요)

  • 시스템 Python 건드리지 않기 : OS 패키지에 영향.

  • venv/conda는 복사/이동 금지 : 절대경로 내장 → 새로 생성/재배치(conda-pack) 사용.

  • macOS/Linux 바이너리의 RPATH 문제가 드물게 있을 수 있음(비표준 빌드 사용 시).
    공식 배포본/pyenv 빌드를 권장.

  • Windows에선 관리자 PATH 등록 대신 사용자 PATH로 제어(충돌 최소화).


한 줄 결론

  • 기본 인터프리터 : ~/Work/83_Runtimes/python/<ver>/ (+ latest)

  • 프로젝트 의존성 : 각 프로젝트 .venv/ 또는 85_Environments/conda

  • 전역 CLI : pipx82_Tools/bin

원하면 네 OS/셸(tcsh 포함)에 맞춰 설치·PATH·latest 링크 생성 을 한 번에 끝내는 초기화 스크립트도 만들어줄게.

내 개인적으로 만든 스크립트들은 어디에 둘까

짧게: 용도에 따라 나눠두면 헷갈림이 사라져요.

  • 어디서나 쓰는 개인 유틸(단일 실행 스크립트)82_Tools/bin/(PATH에 넣기)

  • 툴 관리/유지보수용 스크립트(체크섬, 인스톨러 정리 등)82_Tools/scripts/

  • 프로젝트 전용 스크립트(빌드/런/릴리즈)20_Projects/<PRJ>/scripts/

  • 일회성·작업 단위 스크립트(리포트/실험 절차)25_Jobs/<TYPE>/<YYYY>/<JOB>/scripts/

  • Today에서 “현재 셸 유지”용 래퍼10_Today/wrappers/

  • 순수 셸 커스터마이즈(aliases/functions)90_PersonalConfigs/shell/<sh>/rc.d/*.csh|*.sh


왜 이렇게 나누나?

  • 전역 유틸은 PATH로 바로 호출82_Tools/bin/

  • 프로젝트/작업 맥락이 필요한 건 그 폴더 안에 → 이동/백업/협업 시 추적 쉬움

  • Today 래퍼는 source/인터랙티브 특성10_Today/wrappers/가 안전


바로 적용 (tcsh 예시)

1) 디렉터리 만들기 + PATH 설정

tcsh

mkdir -p ~/Work/82_Tools/{bin,scripts}
mkdir -p ~/Work/10_Today/wrappers
echo 'set path = ( $HOME/Work/82_Tools/bin $path )' >> ~/Work/90_PersonalConfigs/shell/tcsh/rc.d/20-paths.csh
source ~/Work/90_PersonalConfigs/shell/tcsh/.tcshrc

2) 배포/관리 패턴(추천)

  • 정본(버전관리) : 20_Projects/PRJ-UTILS-scripts/

  • 배포(실행 위치) : 82_Tools/bin/

tcsh

# 예: 정본 → 배포 동기화
rsync -av --delete ~/Work/20_Projects/PRJ-UTILS-scripts/bin/ ~/Work/82_Tools/bin/
chmod +x ~/Work/82_Tools/bin/*

이름 규칙(헷갈림 방지)

  • 전역 유틸: lower-kebab (예: ds-checksum, job-open, git-prune)

  • 프로젝트 전용: scripts/<verb>_<target>.sh (예: build_pkg.sh, release_pypi.sh)

  • 작업 전용: 25_Jobs/.../scripts/run_pipeline.csh 처럼 작업 폴더 안 에만 존재


작은 체크리스트

  • 82_Tools/bin에 넣었으면 실행권한(chmod +x)과 헤더 shebang 확인

  • 비밀/토큰은 절대 스크립트에 하드코딩 금지 → 90_PersonalConfigs/secrets/ 경유

  • 공용화하고 싶어지면: 32_SharedConfigs/global/scripts/로 승격 또는 별도 레포로 배포

원하면 네가 가진 스크립트 목록을 기준으로 어디로 옮길지 매핑표rsync 배포 스크립트까지 바로 써줄게.

python 설치형 스크립트면

좋은 질문! “파이썬 설치형 스크립트(= 패키지로 만들어 pip install 해서 CLI가 생기는 형태)”는 소스/배포/설치(실행)를 분리하면 깔끔합니다.

한 줄 요약

  • 소스 정본20_Projects/<PRJ-TOOL_...>/

  • 릴리스 산출물(whl/sdist)75_Releases/<tool>/vX.Y.Z/ (+ checksums/ReleaseNotes, latest 심링크)

  • 개인 전역 설치(실행 바이너리 위치)pipx로 설치해서 82_Tools/bin에 노출

    • (PIPX_HOME/PIPX_BIN_DIR82_Tools 아래로 잡기)

권장 흐름(개인 전역 CLI로 쓰고 싶을 때)

0) 환경 변수(한번 설정)

bash/zsh

export PIPX_HOME="$HOME/Work/82_Tools/pipx"
export PIPX_BIN_DIR="$HOME/Work/82_Tools/bin"
export PATH="$PIPX_BIN_DIR:$PATH"

tcsh

tcsh

setenv PIPX_HOME "$HOME/Work/82_Tools/pipx"
setenv PIPX_BIN_DIR "$HOME/Work/82_Tools/bin"
set path = ( $PIPX_BIN_DIR $path )

1) 소스 정본

20_Projects/PRJ-UTILS-mytool/
├─ src/mytool/__init__.py
├─ pyproject.toml
└─ README.md

2) 엔트리 포인트 정의(설치 후 mytool 같은 명령이 생기게)

pyproject.toml(예: hatchling/poetry/세트업툴 어떤 것이든 가능)

[project]
name = "mytool"
version = "0.3.0"
requires-python = ">=3.11"
dependencies = ["click>=8.1"]

[project.scripts]
mytool = "mytool.cli:main"

src/mytool/cli.py

import click

@click.command()
def main():
    click.echo("hello from mytool")

3) 로컬 개발(프로젝트 venv)

cd ~/Work/20_Projects/PRJ-UTILS-mytool
python3 -m venv .venv && . .venv/bin/activate
pip install -U build
pip install -e .        # 개발 편의용(에디트러블)
mytool                  # 동작 확인

4) 빌드 & 릴리스 아카이브

python -m build                 # dist/*.whl, *.tar.gz 생성
mkdir -p ~/Work/75_Releases/mytool/v0.3.0/checksums
cp dist/* ~/Work/75_Releases/mytool/v0.3.0/
# 체크섬
( cd ~/Work/75_Releases/mytool/v0.3.0 && \
  shasum -a 256 * > checksums/SHA256SUMS )
# latest 갱신(맥/리눅스)
ln -sfn v0.3.0 ~/Work/75_Releases/mytool/latest

5) 개인 전역 설치는 pipx(권장)

# 바퀴에서 설치
pipx install ~/Work/75_Releases/mytool/v0.3.0/mytool-0.3.0-py3-none-any.whl
# 또는 소스에서 바로
pipx install ~/Work/20_Projects/PRJ-UTILS-mytool
# 업그레이드
pipx upgrade mytool
  • 설치 후 실행파일82_Tools/bin/mytool로 노출 → PATH만 잡혀 있으면 어디서든 사용.

왜 pipx? 전용 격리 venv에 설치해서 다른 프로젝트 의존성과 안 섞입니다.
전역 pip install --user는 충돌/복구 난이도 때문에 비권장.


프로젝트 전용 CLI로만 쓸 때

  • 소스는 동일하게 20_Projects/...

  • 설치는 그 프로젝트의.venv/에만:

cd ~/Work/20_Projects/PRJ-APP
python3 -m venv .venv && . .venv/bin/activate
pip install -e ../PRJ-UTILS-mytool
mytool  # venv 안에서만 보임
  • Today 런처 명령에:
App (venv) | /abs/PRJ-APP | source .venv/bin/activate.csh; mytool run --fast

“단일 파일로 배포하고 싶다”면 (자급자족 실행파일)

  • zipapp(표준) / shiv / pex단일 실행 파일 생산 → 82_Tools/bin 배치
python -m zipapp src -m 'mytool.cli:main' -o ~/Work/82_Tools/bin/mytool.pyz
chmod +x ~/Work/82_Tools/bin/mytool.pyz
  • 파이썬 런타임 의존이 줄어든 shiv/pex 는 라이브러리 번들까지 가능.

폴더 배치 요약(설치형 스크립트 관점)

  • 소스 정본 : 20_Projects/PRJ-UTILS-<name>/

  • 릴리스 아카이브 : 75_Releases/<name>/vX.Y.Z/ (+ checksums/, ReleaseNotes.md, latest)

  • 개인 전역 설치(실행 위치) : pipx82_Tools/bin/<name>
    (환경: PIPX_HOME=~/Work/82_Tools/pipx, PIPX_BIN_DIR=~/Work/82_Tools/bin)

  • 툴 원본 보관(선택) : 빌드 산출물을 82_Tools/installers/python/wheels/<vendor_or_proj>/에도 카피해 두면 회수 용이


주의사항(중요)

  • 시스템 Python 건드리지 않기 : OS 패키지 충돌 위험.

  • 전역pip install 지양, 가능하면 pipx.

  • 윈도우 : pipx가 …\Scripts\에 shim을 만듭니다. PIPX_BIN_DIR82_Tools\bin으로 지정해 두면 동일한 구조.

  • 비밀 정보 는 패키지에 넣지 말고 실행 시 환경변수/파일로 주입(→ 90_PersonalConfigs/secrets).

  • Repro : CLI가 팀 표준이 되면 32_SharedConfigs/global/<tool>/README.md에 버전/설치법 기록.

원하면 네가 가진 스크립트 목록을 알려줘. pipx 배포형 으로 묶을 것 vs 프로젝트 venv 전용 으로 둘 것을 나눠서, 맞춤 pyproject 템플릿 이랑 pipx 설치 스크립트까지 바로 정리해줄게!

엔트리 포인트 설치하고 그걸 어디 놔

짧게: 엔트리 포인트(콘솔 스크립트)는 “놓는 것”이 아니라 “설치된 환경이 만들어 주는 실행 파일”이에요.
원하는 범위에 따라 위치가 달라집니다:

  • 전역(개인 전체에서 쓰고 싶다)pipx로 설치하면 82_Tools/bin/<name>에 생기게 만들 수 있어요. ✅ (추천)

  • 특정 프로젝트에서만 → 그 프로젝트의 .venv/bin/<name>(Windows는 .venv/Scripts/<name>.exe|.cmd)에 생깁니다.

  • conda 환경에서만 → 해당 conda env의 bin/(Windows는 Scripts/)에 생깁니다.

아래 순서대로 쓰면 헷갈림이 사라져요.


1) “전역 CLI”로 쓰고 싶을 때 (추천: pipx)

  • 목적: 어디서나 mytool 명령이 먹히게. 실행 파일은 82_Tools/bin에 노출.

tcsh(네 셸 기준) 1회 설정

tcsh

setenv PIPX_HOME "$HOME/Work/82_Tools/pipx"
setenv PIPX_BIN_DIR "$HOME/Work/82_Tools/bin"
set path = ( $PIPX_BIN_DIR $path )

설치 (소스나 휠에서)

tcsh

# 소스에서
pipx install "$HOME/Work/20_Projects/PRJ-UTILS-mytool"
# 또는 릴리스 휠에서
pipx install "$HOME/Work/75_Releases/mytool/v0.3.0/mytool-0.3.0-py3-none-any.whl"

→ 결과: 실행 파일이 ~/Work/82_Tools/bin/mytool 로 생성. PATH에 있어서 어디서든 실행 가능.
업데이트는 pipx upgrade mytool, 제거는 pipx uninstall mytool.

참고: 실제 패키지는 82_Tools/pipx/venvs/mytool/에 격리되어 설치되고,
82_Tools/bin/mytool은 그 venv를 호출하는 쉼(래퍼)입니다.


2) “프로젝트 전용”으로만 쓰고 싶을 때

  • 목적: 그 프로젝트의 venv에서만 mytool이 보이게.
tcsh

cd ~/Work/20_Projects/PRJ-APP
python3 -m venv .venv
source .venv/bin/activate.csh
pip install -e ../PRJ-UTILS-mytool     # 또는 빌드된 휠
mytool                                  # 여기선 동작

→ 실행 파일은 ~/Work/20_Projects/PRJ-APP/.venv/bin/mytool.
프로젝트 밖/비활성화 상태에선 안 보이는 게 정상입니다.

Today 런처 예:

App (venv) | /Users/me/Work/20_Projects/PRJ-APP | source .venv/bin/activate.csh; mytool run --fast

3) conda 환경에서 쓰고 싶을 때

tcsh

source ~/miniconda3/etc/profile.d/conda.csh
conda create -n tools311 python=3.11 -y
conda activate tools311
pip install mytool
which mytool      # → <conda_prefix>/bin/mytool

→ 이 경우에도 해당 env의 bin/에 생성됩니다.


4) “옮기지 말고 노출”하는 법 (중요)

생성된 콘솔 스크립트는 복사/이동하지 말고 :

  • 전역이면 pipx82_Tools/bin직접 생기게 하거나,

  • 프로젝트 전용이면 Today 런처 로 venv 활성화 후 실행하세요.

  • 정말 전역처럼 보여야 하는데 프로젝트 venv 안에만 있다면, 심볼릭 링크 로 노출하세요:

tcsh

# 예: venv 안의 실행 파일을 82_Tools/bin에 링크
ln -sfn "$HOME/Work/20_Projects/PRJ-APP/.venv/bin/mytool" \
       "$HOME/Work/82_Tools/bin/mytool"

이렇게 하면 원본은 venv에 남고, PATH상 82_Tools/bin/mytool로 접근 가능합니다.
(단, venv가 삭제/경로 변경되면 링크가 깨지니 pipx가 더 안정적이에요.)


5) 소스/릴리스/실행 “세 칸” 다시 정리

  • 소스 정본 : 20_Projects/PRJ-UTILS-mytool/

    • pyproject.toml[project.scripts] mytool = "mytool.cli:main"
  • 릴리스 보관 : 75_Releases/mytool/vX.Y.Z/ (+ checksums/, ReleaseNotes.md, latest)

  • 실행 위치 :

    • 전역: pipx82_Tools/bin/mytool

    • 프로젝트만: <PRJ>/.venv/bin/mytool

    • conda: <conda_env>/bin/mytool


6) Windows 한 줄 요약

  • pipx 전역: 82_Tools\bin\mytool.exe|.cmd (PIPX_BIN_DIR 설정)

  • venv: <PRJ>\.venv\Scripts\mytool.exe

  • conda: <conda>\envs\<name>\Scripts\mytool.exe


결론

  • 전역으로 쓰고 싶다pipx로 설치해서 82_Tools/bin에 생기게.

  • 프로젝트/conda만 → 해당 환경의 bin/(또는 Scripts/)에 생김.

  • 이동/복사 X , 필요 시 심볼릭 링크 또는 Today 런처 로 호출.

원하면 네가 만든 패키지 이름/버전 알려줘. pyproject.toml의 엔트리 포인트, pipx 설치 스크립트, Today 단축까지 한 번에 세팅해 줄게!

pipx가 뭐야

pipx파이썬 기반 CLI 앱을 “서로 격리된 가상환경(venv)”에 설치 해 주고, 그 실행 파일만 전역 PATH 에 노출해 주는 도구예요.
쉽게 말해: “개인용 전역 명령(ruff, black, uv, httpie, mkdocs, mytool 등)을 충돌 없이 깔끔하게 쓰게 해주는 설치 관리자”입니다.


왜 pipx를 쓰나?

  • 격리 : 앱마다 개별 venv → 서로 의존성 충돌 없음.

  • 전역처럼 사용 : 실행 파일은 한 디렉터리(예: ~/Work/82_Tools/bin)에 생겨 어디서나 호출.

  • 관리 편함 : pipx upgrade, pipx uninstall, pipx list 등으로 앱 단위 관리.

  • 안전 : 시스템 파이썬/프로젝트 venv를 오염시키지 않음. pip install --user 대비 복구 쉬움.


내 폴더 구조에 맞춘 설정 (한 번만)

권장 위치

  • 앱 venv 저장소: ~/Work/82_Tools/pipx/venvs/…

  • 실행 파일 노출: ~/Work/82_Tools/bin/…

tcsh

tcsh

setenv PIPX_HOME    "$HOME/Work/82_Tools/pipx"
setenv PIPX_BIN_DIR "$HOME/Work/82_Tools/bin"
# PATH 앞쪽에 배치
set path = ( $PIPX_BIN_DIR $path )

bash/zsh

export PIPX_HOME="$HOME/Work/82_Tools/pipx"
export PIPX_BIN_DIR="$HOME/Work/82_Tools/bin"
export PATH="$PIPX_BIN_DIR:$PATH"

PowerShell

$env:PIPX_HOME    = "$HOME\Work\82_Tools\pipx"
$env:PIPX_BIN_DIR = "$HOME\Work\82_Tools\bin"
$env:Path = "$env:PIPX_BIN_DIR;$env:Path"

위 설정은 네 셸 설정 파일(예: 90_PersonalConfigs/shell/tcsh/rc.d/20-pipx.csh)에 넣어 두세요.


설치 방법

  • macOS : brew install pipx

  • Linux : python3 -m pip install --user pipx 또는 배포판 패키지(pipx 패키지)
    이후 python3 -m pipx ensurepath(우리는 이미 PATH를 직접 설정했으니 생략 가능)

  • Windows : py -m pip install --user pipx → 새 터미널에서 pipx --version


기본 사용법 (가장 자주 쓰는 것만)

pipx install ruff          # ruff CLI 설치 → ~/Work/82_Tools/bin/ruff
pipx upgrade ruff          # 최신으로 업데이트
pipx uninstall ruff        # 제거
pipx list                  # 설치된 앱 목록
pipx run cowsay hello      # “설치 없이” 1회 실행

내 패키지(로컬/릴리스) 설치

# 소스에서(개발 레포 바로)
pipx install ~/Work/20_Projects/PRJ-UTILS-mytool

# 내가 빌드한 휠에서(릴리스 보관 폴더)
pipx install ~/Work/75_Releases/mytool/v0.3.0/mytool-0.3.0-py3-none-any.whl

→ 실행 파일: ~/Work/82_Tools/bin/mytool

특정 앱 venv에 플러그인/추가 의존성 넣기

pipx inject mkdocs mkdocs-material

프로젝트 venv/conda와의 역할 분담

  • 전역적으로 자주 쓰는 CLIpipx (ruff, black, uv, pre-commit, httpie, mypy, mkdocs …)

  • 프로젝트에 종속된 라이브러리/도구 → 해당 .venv 또는 conda env

  • Today 런처에서 프로젝트 명령을 쓸 땐 venv 활성화 후 실행:

My App | /abs/PRJ | source .venv/bin/activate.csh; mytool run

자주 겪는 이슈 & 팁

  • 명령이 안 보임 : PIPX_BIN_DIR가 PATH 앞쪽에 있는지 확인. tcsh면 echo $path로 확인.

  • 프록시/사내 CA : pipx도 내부적으로 pip를 쓰므로 pip.ini/pip.conf(예: 90_PersonalConfigs/python/pip.conf)에 프록시/인증서 설정.

  • 권한 문제 : 사용자 홈 아래 설치를 권장(관리자 권한 불필요).

  • Windows 확장자 : …\bin\ 아래 foo.exe 또는 foo.cmd가 생깁니다.


우리 트리에 맞춘 요약

  • 실행 파일 : ~/Work/82_Tools/bin/<app>

  • 앱 venv들 : ~/Work/82_Tools/pipx/venvs/<app>/

  • 원본/릴리스 보관(선택) : ~/Work/75_Releases/<app>/vX.Y.Z/

원하면 네가 자주 쓰는 CLI 목록을 알려줘. pipx로 한 번에 깔고 PATH까지 잡아주는 tcsh/bashi/PowerShell 초기화 스크립트 를 바로 만들어줄게.

windows면?

윈도우에서도 잘 됩니다! 아래 단계대로 하면 pipx 를 우리 폴더 구조(Work/82_Tools)와 딱 맞춰 쓸 수 있어요.


1) 설치

PowerShell(권장)

# 1) pipx 설치
py -m pip install --user pipx

# 2) 우리 트리에 맞춰 경로/환경변수 설정 (현재 사용자)
$env:PIPX_HOME    = "$HOME\Work\82_Tools\pipx"
$env:PIPX_BIN_DIR = "$HOME\Work\82_Tools\bin"
$env:Path         = "$env:PIPX_BIN_DIR;$env:Path"

# 3) 폴더가 없으면 생성
New-Item -ItemType Directory -Force -Path $env:PIPX_HOME,$env:PIPX_BIN_DIR | Out-Null

# 4) 세션 재시작 없이 확인
pipx --version

영구 적용하려면(터미널 새로 열어도 유지):

# 사용자 환경변수로 영구 등록
setx PIPX_HOME    "$HOME\Work\82_Tools\pipx"
setx PIPX_BIN_DIR "$HOME\Work\82_Tools\bin"
# PATH 앞쪽에 추가(이미 있으면 생략)
setx PATH "$($env:PIPX_BIN_DIR);$($env:PATH)"

PowerShell을 다시 열어서 pipx --version이 나오는지 확인하세요.

CMD만 쓰는 경우

cmd

py -m pip install --user pipx
setx PIPX_HOME    "%USERPROFILE%\Work\82_Tools\pipx"
setx PIPX_BIN_DIR "%USERPROFILE%\Work\82_Tools\bin"
setx PATH "%USERPROFILE%\Work\82_Tools\bin;%PATH%"

이후 새 CMD 창에서 pipx --version 확인.


2) 어떻게 동작하나요?

  • 앱별 venv : %USERPROFILE%\Work\82_Tools\pipx\venvs\<app>\

  • 실행 파일(셔닐/EXE/CMD) : %USERPROFILE%\Work\82_Tools\bin\<app>.exe (또는 <app>.cmd)

  • 그래서 PATH…\82_Tools\bin만 넣어두면 어디서든 실행돼요.


3) 자주 쓰는 명령

pipx install ruff                 # 전역 CLI로 설치 → ...\82_Tools\bin\ruff.exe
pipx upgrade ruff                 # 업그레이드
pipx uninstall ruff               # 제거
pipx list                         # 설치된 앱 목록
pipx run cowsay hello             # 설치 없이 1회 실행

내 패키지를 전역 CLI로

# 로컬 소스에서(개발 레포)
pipx install "$HOME\Work\20_Projects\PRJ-UTILS-mytool"

# 내가 빌드해둔 휠에서(릴리스 보관)
pipx install "$HOME\Work\75_Releases\mytool\v0.3.0\mytool-0.3.0-py3-none-any.whl"

→ 실행 파일: …\82_Tools\bin\mytool.exe


4) 프로젝트 전용으로만 쓰고 싶다면

전역 pipx 대신 프로젝트 venv 에 설치하세요.

cd $HOME\Work\20_Projects\PRJ-APP
py -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -e ..\PRJ-UTILS-mytool
mytool   # 이 venv 안에서만 동작

전역처럼 쓰고 싶으면 pipx가 더 안정적입니다.
“전역처럼 보이게”만 하고 싶다면 …\82_Tools\bin심볼릭 링크/바로가기 를 둘 수도 있지만, 권장 흐름은 pipx예요.


5) 흔한 이슈 & 해결

  • 명령이 인식 안 됨 : echo $env:Path…\82_Tools\bin맨 앞쪽 에 있는지 확인.

  • 실행 정책 오류(스크립트 차단) : PowerShell에서 한 번만
    Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned
    
  • 회사 프록시/인증서 : pip.ini(예: %APPDATA%\pip\pip.ini)에 프록시/CA 설정 필요할 수 있음.

  • 충돌 : 동일 CLI를 프로젝트 venv에도 설치했다면, 현재 활성화된 셸 이 우선합니다(venv 우선, 그 외에는 pipx).

6) 우리 트리 요약(Windows)

  • 전역 CLI 실행 파일 → C:\Users\<you>\Work\82_Tools\bin\

  • pipx 앱 venv들 → C:\Users\<you>\Work\82_Tools\pipx\venvs\

  • 소스 정본 → …\20_Projects\PRJ-UTILS-<name>\

  • 릴리스 보관 → …\75_Releases\<name>\vX.Y.Z\

필요하면 지금 쓰는 윈도우 환경(회사 PC/개인 PC) 기준으로 한 번에 세팅하는 PowerShell 스크립트 도 만들어줄게—설치 + 환경변수 + PATH + 몇 개 대표 앱(pipx, ruff, uv 등)까지!

내가 연구/분석 목적으로 마구 clone 해 둔 repository(github)있는데 이건 어디로 옮겨야할까

좋아—그 “연구/분석용으로 막 클론한 공개 리포”들은 전용 상자를 하나 두는 게 깔끔해.
나는 21_Upstreams/(= 3rd-party 소스 정리함)를 새로 만들어 거기에 모으는 걸 추천해.


어디에 둘까?

21_Upstreams/               - 외부(3rd-party) 리포 로컬 클론 정본
├─ github/
│  └─ <org>/<repo>/         - 예: github/pallets/flask/
├─ gitlab/
│  └─ <group>/<repo>/
├─ bitbucket/
│  └─ <team>/<repo>/
└─ _registry.csv            - 선택: 목록/태그/메모

왜 21?
20_Projects(내가 소유/개발)와 22_Labs(가벼운 실험) 사이에 외부 소스 보관대 를 끼워 넣으면
“내 것 ↔ 외부 것 ↔ 실험” 흐름이 눈에 잘 들어와요.


사용 원칙 (간단 룰)

  1. 읽기 전용 원칙 : 21_Upstreams의 리포는 기본적으로 수정 금지.

    • 변경/실험이 필요하면 git worktree22_Labs25_Jobs/SMOKE에 작업 디렉토리를 만드세요.
  2. 내가 ‘소유’하는 포크 라면:

    • 장기 개발이면 20_Projects/<PRJ-…>로 승격,

    • 그냥 upstream 추적만 하면 21 에 두고 origin=내포크, upstream=원본 이중 리모트.

  3. 프로젝트에서 의존 할 땐: 복사 금지. 서브모듈/서브트리/패키지 의존 으로 연결.


추천 워크플로

1) 클론 이동 (단일 리포)

  • macOS/Linux
repo="~/Downloads/tmp/flask"   # 현재 위치
url=$(git -C "$repo" config --get remote.origin.url)
host=$(echo "$url" | sed -E 's#(https?://|git@)([^/:]+).*#\2#')
org=$( echo "$url" | sed -E 's#.*/([^/]+)/[^/]+(\.git)?$#\1#')
name=$(echo "$url" | sed -E 's#.*/([^/]+)(\.git)?$#\1#')
dest="$HOME/Work/21_Upstreams/$host/$org/$name"
mkdir -p "$(dirname "$dest")" && mv "$repo" "$dest"
  • Windows (PowerShell)
$repo = "$HOME\Downloads\tmp\flask"
$url  = git -C $repo config --get remote.origin.url
$host = ($url -replace '^(https?://|git@)([^/:]+).*','$2')
$org  = ($url -replace '^.*/([^/]+)/[^/]+(\.git)?$','$1')
$name = ($url -replace '^.*/([^/]+)(\.git)?$','$1')
$dest = "$HOME\Work\21_Upstreams\$host\$org\$name"
New-Item -ItemType Directory -Force -Path (Split-Path $dest) | Out-Null
Move-Item $repo $dest

2) 리모트 정리(가독성 ↑)

cd ~/Work/21_Upstreams/github/pallets/flask
git remote rename origin upstream          # 원본을 upstream으로
# 포크가 있다면
git remote add origin git@github.com:<me>/flask.git

3) 실험할 땐 worktree로 꺼내쓰기 (→ 22_Labs)

# 실험 브랜치를 22_Labs로 분리
cd ~/Work/21_Upstreams/github/pallets/flask
git fetch upstream --prune
git worktree add ~/Work/22_Labs/flask-exp main
# 여기서 수정/빌드/메모는 22_Labs 아래에서

4) 주기적 동기화(모든 리포)

  • macOS/Linux
find ~/Work/21_Upstreams -type d -name .git -prune -print \
| while read g; do r=$(dirname "$g"); echo "→ $r"; git -C "$r" fetch --all --prune; done
  • Windows (PowerShell)
Get-ChildItem "$HOME\Work\21_Upstreams" -Recurse -Directory -Filter ".git" |
  ForEach-Object {
    $r = $_.Parent.FullName
    Write-Host "→ $r"
    git -C $r fetch --all --prune
  }

언제 다른 폴더를 쓰나?

  • 내가 발전시켜서 릴리스/배포할 계획20_Projects/PRJ-…로 승격

  • 교육/논문과 함께 읽기 자료 로만 보관 → 코드 자체는 21 ,
    문서/노트는 40_Resources/edu 또는 30_Areas/knowledge_base에 정리(커밋 해시 링크 포함)


보너스: 디스크 절약 팁

  • 얕은 클론 : git clone --depth 1 … (히스토리 최소화)

  • 희소 체크아웃 : git sparse-checkout으로 필요한 경로만

  • GC : git gc --aggressive --prune=now (큰 리포 정리 시)


한 줄 결론

  • 연구/분석용 외부 리포는 21_Upstreams/<host>/<org>/<repo>로 모아 읽기 전용 으로 두고,

  • 실험은 git worktree22_Labs/25_Jobs/SMOKE에 꺼내서 하자.

  • 프로젝트에 쓸 땐 서브모듈/패키지 의존 으로 연결, 복사 금지.

왜 제목이 Upstream이야?

좋은 질문! “Upstream ”은 깃 용어로 내가 작업하는 포크의 기준이 되는 ‘원본 저장소’를 뜻해요.
연구/분석용으로 남의 레포를 그대로 클론 해 두는 공간이라는 의미를 담아 21_Upstreams/라 이름을 붙였던 거예요.

왜 그렇게 불렀나 (step-by-step)

  1. 역할 구분 : 20_Projects(내 소유)와 구분해, 외부 원본 소스 를 담는 곳이라는 신호.

  2. 워크플로 연계 : 보통 upstream읽기 전용으로 추적 하고, 실험은 git worktree22_Labs25_Jobs에 꺼내 쓰는 패턴과 잘 맞음.

  3. 충돌 방지 : 내 코드(Projects)와 외부 코드(Upstreams)가 시각적으로 분리되어 헷갈림 감소.

하지만 헷갈릴 수 있어요 → 더 직관적인 이름 대안

목적에 맞춰 아래 중 하나로 바꿔도 전혀 문제 없습니다.

  • 21_ExternalRepos : 가장 직관적(외부 레포 전용). ✅ 추천

  • 21_OpenSource : 오픈소스 위주일 때 자연스러움

  • 21_3rdParty : 서드파티 소스(벤더/커뮤니티 혼합)

  • 21_Forks : “내 포크” 보관 위주일 때

  • 21_Mirrors : 읽기 전용 미러 개념을 강조할 때

네 상황(“연구/분석용으로 마구 클론”)엔 21_ExternalRepos 가 이해가 가장 쉬워 보여요.

지금 바꾸고 싶다면 (안전 리네임)

macOS/Linux

cd ~/Work
[ -d 21_Upstreams ] && mv 21_Upstreams 21_ExternalRepos
# (선택) Today 단축/스크립트 경로 치환
grep -rl "21_Upstreams" . | xargs sed -i '' -e 's/21_Upstreams/21_ExternalRepos/g'

Windows (PowerShell)

Set-Location "$HOME\Work"
if (Test-Path "21_Upstreams") { Rename-Item "21_Upstreams" "21_ExternalRepos" }
# (선택) 경로 치환
Get-ChildItem -Recurse -File | ForEach-Object {
  (Get-Content $_.FullName) -replace '21_Upstreams','21_ExternalRepos' |
    Set-Content $_.FullName
}

폴더 예시는 그대로 사용 가능

21_ExternalRepos/
└─ github/<org>/<repo>/
   gitlab/<group>/<repo>/
   bitbucket/<team>/<repo>/

요약

  • “Upstream”은 원본 저장소 를 뜻해서 썼던 이름.

  • 더 직관적이길 원하면 21_ExternalRepos 로 바꿔도 의미/흐름 100% 유지.

  • 리네임은 위 스크립트로 바로 반영하면 끝!

대화 기록 저장 파일은 어디두는게 좋을까

좋은 주제! “대화 기록(chat logs)”은 원본(raw)과 정제본(curated)을 분리하고, 프로젝트·작업에서는 링크만 거는 방식이 깔끔합니다. 전용 상자를 새로 하나 두자고 제안해요.

추천 위치 (새 슬롯)

31_Conversations/                  - 대화 기록의 '정본' 보관소
├─ inbox/                          - 즉시 덤프/내보내기(raw, 미정리)
├─ by_assistant/                   - 도구별 정리(ChatGPT, LocalLLM, Slack 등)
│  ├─ chatgpt/
│  ├─ local_llm/
│  └─ slack/
├─ by_topic/                       - 주제별(선택): regex, packaging, Qt, 배포…
├─ redacted/                       - 비식별/민감정보 삭제본(공유용)
├─ private_encrypted/              - 암호화보관(진짜 민감 내용)
├─ index.md                        - 색인/검색 가이드(최근 50개 링크)
├─ templates/chat_log_template.md  - 메타 포함 템플릿
└─ scripts/                        - 저장/정제/색인 스크립트

번호 3130_Areas(장기 운영)32_SharedConfigs(공유설정) 사이로, “운영 자산이지만 설정은 아닌” 대화 기록에 잘 맞습니다.


언제 어디에 두나 (의사결정 4단계)

  1. 그냥 저장/백업용31_Conversations/inbox/에 먼저 넣기

  2. 정리/검색할 가치 있음31_Conversations/by_assistant/<tool>/YYYY/YYYY-MM/파일로 이동

  3. 공유하거나 문서화 가치 → 요약/클린업해서 31_Conversations/redacted/…에 별도 저장

    • 깨끗이 정리된 지식은 추려서 30_Areas/knowledge_base로 승격 (원본 링크 남김)
  4. 프로젝트/작업에서 참조 필요 → 그 PRJ/JOB 안에는 복사하지 말고 상대경로 링크(또는 심볼릭 링크) 만 둠

    • 예) 20_Projects/PRJ-…/docs/links.md../../31_Conversations/by_assistant/local_llm/…/…md 링크

파일명 & 메타 규칙

  • 파일명 : YYYY-MM-DD_HHMM-KST_<assistant>_<topic>[_convID].md

    • 예: 2025-09-01_1042-KST_localllm_regex-tips_cid-9a2f.md
  • 문서 상단 메타(필수) — 맨 위 6~10줄 정도:

===
title: "Regex tips with backreferences"
date: 2025-09-01T10:42:00+09:00
assistant: local_llm (GPT-OSS 120B)
topic: regex
project: PRJ-2025-001_sample_app   # 없으면 생략
sensitivity: low|medium|high
links:
  - ../../30_Areas/knowledge_base/tips/regex.md
===

코드 블록은 ``` 대신=== 로 감싸는 기존 약속 유지.


보안/프라이버시 원칙

  • 민감 표시 : sensitivity: high면 즉시 redacted/ 버전 생성, 필요 시 private_encrypted/(암호화)로 이동.

  • 암호화 보관(예)

    • macOS/Linux (gpg 대칭):
      gpg -c -o private_encrypted/<same_name>.gpg by_assistant/.../<file>.md

    • Windows (7-Zip): 암호 걸어 .7z로 보관

  • 비밀/토큰 은 원본에서도 삭제/마스킹하고, 진짜 원본이 필요하면 암호화본만 남겨둠.


워크플로 (step-by-step)

A. 저장(내보내기) → 정리

  1. 원본 덤프 : 31_Conversations/inbox/2025-09-01_1042-KST_chatgpt_tmp.md

  2. 검토/정리 : 제목·메타·태그 보강, 불필요한 잡음 제거

  3. 이동 :

    • ChatGPT면 by_assistant/chatgpt/2025/2025-09/…md

    • Local LLM이면 by_assistant/local_llm/…

  4. (선택) 요약문30_Areas/knowledge_base/howtos/…md에 작성하고 링크.

B. 프로젝트/작업에서 참조

  • 20_Projects/PRJ-…/docs/links.md에 상대 링크 추가

  • 또는 심볼릭(맥/리눅스):
    ln -s ../../31_Conversations/by_assistant/local_llm/2025/2025-09/…md docs/chat_refs/…md
    (링크 깨짐 방지를 위해상대 링크 권장)

C. 검색

  • rg/grep 원라인러:

    • macOS/Linux: rg -n --hidden -S "pattern" ~/Work/31_Conversations

    • Windows(PowerShell): rg -n --hidden -S "pattern" $HOME\Work\31_Conversations


템플릿(복붙)

31_Conversations/templates/chat_log_template.md

===
title: "<짧은 제목>"
date: 2025-09-01T10:42:00+09:00
assistant: <chatgpt|local_llm|slack|...>
topic: <regex|packaging|...>
project: <PRJ-YYYY-NNN_name or ->  (없으면 생략)
sensitivity: low
links: []
===

# 요약
- 핵심 1
- 핵심 2

# 본문
(대화 캡처/정리)
=== code ===
# 코드/명령(필요 시)
===

# 액션 아이템
- [ ] 다음에 할 것…

자동화 스니펫

tcsh: “새 로그 시작” 헬퍼

=== code ===
#!/bin/tcsh -f
set root = "$HOME/Work/31_Conversations/by_assistant/local_llm"
set ts = `date +"%Y-%m-%d_%H%M-KST"`
set dest = "$root/`date +%Y`/`date +%Y-%m`/${ts}_localllm_<topic>.md"
mkdir -p "`dirname "$dest"`"
cp "$HOME/Work/31_Conversations/templates/chat_log_template.md" "$dest"
echo "$dest"
=== 

PowerShell: “inbox → 정리” 예시

=== code ===
$src = "$HOME\Work\31_Conversations\inbox"
$dst = "$HOME\Work\31_Conversations\by_assistant\chatgpt\$(Get-Date -f yyyy)\$(Get-Date -f yyyy-MM)"
New-Item -ItemType Directory -Force -Path $dst | Out-Null
Get-ChildItem $src -Filter *.md | ForEach-Object {
  $name = "$(Get-Date -f yyyy-MM-dd_HHmm)-KST_chatgpt_$($_.BaseName).md"
  Move-Item $_.FullName (Join-Path $dst $name)
}
=== 

31_Conversations인가 (장점 정리)

  • Projects/Jobs와 분리 : 복붙/중복 없이 한 곳에서 관리, 프로젝트에선 링크만.

  • 정리 단계가 보임 : inbox → by_assistant → (redacted/private)로 자연스러운 흐름.

  • 검색 효율 : 도구/주제/기간별로 트리 정리가 되어 ripgrep 한 방.

  • 보안 레이어 : 민감·공유 가능한 버전을 분리해 실수 방지.

필요하면 너의 환경(tcsh/PowerShell)에 맞춘 신규 만들기/정리/색인 스크립트 를 더 다듬어서 줄게.

기타 엔터테인먼트용 음악/사진은 어디둘까? 집중할때 듣는 음악 등등

좋은 질문! 결론부터:

  • 권장 : 업무 트리(~/Work) 바깥 에 개인용 미디어를 둬요 → ~/Personal/Media/…

  • 부득이하게 Work 안에 둘 때 : 업무 자산과 확실히 분리된 전용 상자 를 하나 만듭니다 → 06_Media/…

아래처럼 쓰면 깔끔해요.


A안 (권장): Work 바깥

~/Personal/Media/
├─ Music/
│  ├─ focus/            # 집중용(white-noise, lofi, rain 등)
│  ├─ ambient/
│  └─ playlists/        # .m3u 플레이리스트
├─ Photos/
│  ├─ wallpapers/
│  └─ reference/
└─ Licenses/            # 폰트/음원/이미지 라이선스 사본
  • 이유 : 업무 백업/검색/버전관리 범위에서 제외 → 성능·보안·용량 이점.

  • 프로젝트/작업에 필요하면 링크로만 참조(복사 금지).


B안 (Work 안에 둘 때): 06_Media

Work/
└─ 06_Media/                         - 개인 엔터테인먼트 상자(업무와 분리)
   ├─ audio/
   │  ├─ focus/
   │  ├─ ambient/
   │  └─ playlists/                 # focus.m3u, rain.m3u …
   ├─ photos/
   │  ├─ wallpapers/
   │  └─ reference/
   ├─ licenses/
   └─ README.md                     # 용도/주의사항 요약
  • 60_Assets 는 로고/폰트/템플릿 같은 “업무 시각 자산” 용이라, 엔터테인먼트는 06_Media로 분리 합니다.

  • 각 PRJ/JOB에서는 상대경로 링크 만 두고, 원본은 여기 보관.


운영 규칙(간단 룰)

  1. 복사 금지 : PRJ/JOB/Resources로 옮기지 말고 링크/경로 참조 만.

  2. 검색 제외 : ripgrep/인덱싱/백업 대상에서 06_Media 또는 Personal/Media를 제외(성능↑).

  3. 라이선스 분리 : 구매/라이선스 파일은 licenses/에 함께 저장.

  4. 대용량 주의 : 클라우드 동기화 금지 정책이 있으면 제외 폴더로 등록.


Today에서 빠르게 재생(선택)

플레이리스트를 만들고 10_Today/shortcuts.list로 실행해요. (mpv/VLC 등 포터블을 82_Tools에 두면 편함)

예) focus.m3u (플레이리스트)

# ~/Work/06_Media/audio/playlists/focus.m3u
../focus/lofi-01.mp3
../focus/rain-60min.mp3
../ambient/white-noise.wav

mpv를 82_Tools에 두고 실행

  • mpv 위치: 82_Tools/portable/mpv-<ver>/mpv82_Tools/bin/mpv 심링크 권장

  • shortcuts.list 라인:

Focus (shuffle) | / | mpv --no-video --shuffle --loop-playlist ~/Work/06_Media/audio/playlists/focus.m3u

Windows(PowerShell) 예

Focus (VLC) | / | "& $HOME\Work\82_Tools\portable\vlc-<ver>\vlc.exe" --qt-start-minimized --loop $HOME\Work\06_Media\audio\playlists\focus.m3u

링크로만 참조(복붙 금지)

  • macOS/Linux:
    ln -s ../../06_Media/photos/wallpapers/ ~/Work/20_Projects/PRJ-.../docs/wallpapers
    
  • Windows: 심볼릭/정션 또는 문서에 경로만 링크.

헷갈릴 때 구분법 (step-by-step)

  • 업무 산출물/참조 자산60_Assets

  • 교육/스펙/문서40_Resources

  • 순수 개인 감상/집중용06_Media (또는 ~/Personal/Media) ✅

원하면 A/B 중 선택에 맞춰 초기 폴더 생성 스크립트Today 단축 세트 를 바로 만들어줄게!

Obsidian vault는 어디 넣는게 좋을까

좋은 질문! 딱 정리하면:

결론 (추천 위치)

  • 업무 지식/메모 중심 Vault~/Work/30_Areas/knowledge_base/obsidian_vault/
    (장기 운영 지식이므로 Areas 아래가 가장 자연스럽습니다.)

  • 완전 개인용(일기/사생활)~/Personal/Notes/obsidian_vault/
    (업무 트리 밖으로 분리 추천)

  • 프로젝트별 별도 Vault 는 가급적 비추천. 프로젝트/잡 문맥의 메모는 각 폴더에 두고(복사 금지), Vault에서는 링크 로 참조하는 방식이 관리가 쉬워요.


30_Areas/knowledge_base인가 (step-by-step)

  1. 수명 주기 : Vault는 프로젝트보다 오래 살아있는 “지식 자산” → Areas 가 맞음.

  2. 역할 분리 : 외부 문서/스펙은 40_Resources, 설정은 32_SharedConfigs/90_PersonalConfigs, 내가 쓴 지식과 노트 는 Vault에.

  3. 참조 흐름 : 프로젝트/작업(20/25)에서는 상대경로 링크 만 두고, 원본은 Vault에 집중.


최소 구조 예시

~/Work/30_Areas/knowledge_base/obsidian_vault/
├─ 00_Inbox/                # 캡처/임시 노트 (정리 전)
├─ 10_Daily/2025/           # 데일리/주간 노트
├─ 20_Topics/               # 주제별(Regex, Packaging, PySide6…)
├─ 30_ProjectsNotes/        # 프로젝트 관련 “노트”(코드는 20_Projects에 있음)
├─ 40_References/           # 내가 요약/정리한 레퍼런스(원본은 40_Resources)
├─ _attachments/            # 작은 첨부(이미지/스니펫). 대용량은 링크만.
└─ .obsidian/               # Vault 설정(테마/플러그인)

대용량 파일(음원/영상/대형 PDF)은 복사하지 말고 60_Assets(업무 자산)이나 06_Media(엔터테인먼트)·26_Datasets(데이터셋) 위치를 링크로 참조 하세요.


Obsidian 설정 팁 (한번만 해두면 편함)

  • Default location for new attachments : ./_attachments

  • Use[[[] wikilinks: 켜기 (상대경로 참조 쉬움)

  • New file location : 00_Inbox (수집→정리 루틴)

  • Daily notes/Periodic Notes 플러그인 : 10_Daily/2025/로 지정

  • Template : 30_Areas/knowledge_base/obsidian_vault/_templates/… 만들고 템플릿 플러그인 경로 설정

  • 대용량 제외 : Vault 루트에 .gitignore_attachments/**.mp4, *.zip 등 제외(깃 관리 시)


버전관리 & 개인설정 분리(선택)

  • Vault 자체를 Git으로 관리하려면:

    • 체크인: *.md, _attachments(소형), 템플릿

    • 제외: .obsidian/workspace.json(개인 레이아웃), 캐시류

  • 개인 테마/스니펫~/Work/90_PersonalConfigs/obsidian/<vault_name>/에 백업해 두고,
    필요 시 Vault의 .obsidian으로 복사/동기화(OS 바뀌어도 복구 쉬움).


프로젝트/작업에서 링크로만 참조 (복붙 금지)

  • macOS/Linux:
    ln -s ../../30_Areas/knowledge_base/obsidian_vault/20_Topics/regex.md \
          ~/Work/20_Projects/PRJ-2025-001_sample_app/docs/regex-notes.md
    
  • Windows(관리자 또는 개발자 모드):
    cmd
        
    mklink docs\regex-notes.md ..\..\30_Areas\knowledge_base\obsidian_vault\20_Topics\regex.md
    

언제 다른 위치를 쓰나?

  • 회사 전체 공유 Vault 가 필요하면: 32_SharedConfigs/knowledge_vault/로 별도 운영(개인 Vault와 분리).

  • 연구 리포 정독 노트 : 코드 원본은 21_ExternalRepos, 읽기 노트는 Vault의 40_References/에.


한 줄 요약

  • 업무용 Obsidian Vault~/Work/30_Areas/knowledge_base/obsidian_vault/.

  • 개인용~/Personal/Notes/obsidian_vault/.

  • 대용량은 링크만, 노트는 Vault에 집중—프로젝트/잡에서는 복사 말고 참조!

어디선가 다운받은 (큰 노력없이) 교육 “자료”가 있고, 내가 스스로 공부하며 정리한 자료나 수행한 실습이 있잖아. 둘을 모두 같은 곳에 보관하는 건 좀 이상해. 방법 추천해줘

좋은 지적! “어디선가 다운받은 교육 자료(수집물)”와 “내가 공부하며 만든 정리/실습(창작물)”을 의도적으로 분리 하면 훨씬 깔끔해져요. 아래처럼 나누는 걸 추천합니다.


1) 결론: 상자 3개로 분리

A) 외부 수집물(읽기/참고용 원본)

  • 위치: ~/Work/40_Resources/edu/…

  • 예시 트리
    40_Resources/
      edu/
        courses/<provider>/<course_name>/vYYYY.MMDD/{slides,pdf,code,assets,LICENSE,README.md}
        tutorials/<site>/<series>/vYYYY.MMDD/{html,pdf,code}
        papers/{to_read,reading_notes,summaries}/
        manuals/<vendor>/<product>/<version>/
    
  • 원칙: “읽기 전용”. 큰 파일도 여기에만 저장(프로젝트/노트로 복사 금지).

B) 내 노트/정리(지식화)

  • 위치: ~/Work/30_Areas/knowledge_base/obsidian_vault/…

  • 예시 트리
    30_Areas/knowledge_base/obsidian_vault/
      20_Topics/<topic>.md
      40_References/<course_name>_summary.md
      30_ProjectsNotes/PRJ-2025-001_sample_app.md
      _attachments/ (소형 이미지만)
    
  • 원칙: 텍스트 중심. 원본 파일은 A에 두고, 링크만 건다.

    • Obsidian 쓰면 [[상대링크]]로 A의 자료를 가리키기.

C) 실습/과제/재현 가능한 작업(액션)

  • 위치: ~/Work/25_Jobs/LAB/<연도>/LAB-YYYY-NNN_<slug>/…

  • 예시 트리
    25_Jobs/
      LAB/2025/LAB-2025-017_pyside6-tableview/
        README.md        # 목표/절차/결과
        env/             # (필요 시) 환경 정의
        scripts/         # run/build/test
        src/             # 실습 코드
        data/            # 소용량 샘플만 (대용량은 26_Datasets 링크)
        references.md    # 40_Resources 경로 링크 모음
    
  • 원칙: 실행/검증 가능하게 구성. 대용량 입력은 26_Datasets 를 참조:

    • ~/Work/26_Datasets/datasets/<name>/vYYYY.MMDD/… (여기엔 정본 만)

가벼운 즉흥 실험은 22_Labs/에 두고, 재현·공유 가치가 생기면 LAB Job 으로 “승격”하세요.


2) 라우팅 표(헷갈릴 때 이대로)

항목 보관 위치 메모
강의 슬라이드/PDF/예제 ZIP 40_Resources/edu/courses/... 원본만 저장(읽기 전용)
블로그 튜토리얼 복사본 40_Resources/edu/tutorials/... URL과 날짜 같이 기록
논문 PDF/정리 PDF: 40_Resources/edu/papers/to_read/… / 정리: Vault 정리는 Vault에서
내 요약/치트시트 30_Areas/knowledge_base/obsidian_vault/... 원본 링크 포함
실습 코드/과제 풀이 25_Jobs/LAB/... 재현 가능한 구조, 결과 캡처
즉석 노트북 실험 22_Labs/jupyter/... 짧게 끝나면 여기서 종료
대용량 데이터 26_Datasets/.../vYYYY.MMDD/ manifest.yml + 체크섬

3) 연결(링크) 규칙

  • Vault ↔ Resources: Vault 노트에서 상대 경로 링크40_Resources 파일을 가리킴. 복사 금지.

  • LAB ↔ Resources/Datasets: references.md../../../../40_Resources/... / ../../../../26_Datasets/... 링크.
    필요하면 심볼릭 링크 도 가능(상대경로로).

예:

# 25_Jobs/LAB/.../references.md
- 강의 노트: ../../../../40_Resources/edu/courses/udemy/pyqt/v2025.0829/README.md
- 샘플 데이터: ../../../../26_Datasets/datasets/ad_events/v2025.0826/processed/

4) 스캐폴드(빠르게 만들기)

코스 수집물 폴더

base=~/Work/40_Resources/edu/courses/udemy/pyside6-masterclass/v2025.0901
mkdir -p "$base"/{slides,pdf,code,assets}
printf '%s\n' "# Course: PySide6 Masterclass" > "$base/README.md"

LAB Job

job=~/Work/25_Jobs/LAB/2025/LAB-2025-018_pyside6-tableview
mkdir -p "$job"/{src,scripts,env,data}
printf '%s\n' "# 목표\n- TableView로 CSV 뷰어 만들기\n\n# 절차\n- ...\n\n# 결과\n- 스크린샷/메모" > "$job/README.md"
printf '%s\n' "- 강의: ../../../../40_Resources/edu/courses/udemy/pyside6-masterclass/v2025.0901/README.md" > "$job/references.md"

5) 운영 팁

  • 저작권/라이선스: 외부 자료는 40_Resources/.../LICENSEREADME.md에 출처·라이선스 표기.

  • 중복 방지: 외부 자료를 PRJ/JOB에 복사하지 말고 링크. (버전이 바뀌면 폴더를 새 vYYYY.MMDD로)

  • 정리 주기:

    • 주 1회: 40_Resources/edu 정리(중복/구버전 확인)

    • 실습이 장기화되면 LAB → EX/REL(예제/릴리스)로 승격 고려

  • 검색 성능: ripgrep/인덱싱 대상에서 40_Resources/edu/…/code 대용량 폴더는 제외해도 좋아요.


6) 한 줄 요약

  • 외부 수집물40_Resources/edu(읽기 전용),

  • 내 지식/정리30_Areas/knowledge_base(Vault),

  • 실습/과제25_Jobs/LAB로 분리하고, 서로는 링크로만 연결 하세요.

지금까지의 대화 내용을 정리해서 하나의 Markdown(*.md)으로 정리해줘. 1. 본문 내부에서 코드 블럭은 깨지니까 3 backticks를 ===로 대체해줘. 2. shortcuts.list 같은건 내가 알아서 다룰테니까 그냥 자세히 언급하지 말아줘. 3. 몇 가지 자주 사용할만한 예시들을 10개 정도 써줘.

# Work 폴더 운영 요약 (최종 정리)

> 목적: 1인 개발/분석 환경에서 **정본 위치**, **재현성**, **정리 루틴**, **작업 흐름**을 일관되게 유지한다.  
> 루트는 기본 `~/Work` (필요 시 이식 가능).

---

## 1) 최종 폴더 구조(요약 + 설명)

Work/
├─ 00_README.md                       - 운영 규칙 요약(사람용 문서)
├─ 01_Inbox/                          - 임시 수집함(스크린샷/메모/임시 파일)
├─ 05_Downloads/                      - 다운로드 착륙지(정리 전)
│  ├─ _inbox/                         - 기본 저장 경로
│  ├─ installers/ datasets/ manuals/ assets/ quarantine/
├─ 06_Media/                          - 개인 음악/사진(업무와 분리; 선택)
├─ 10_Today/                          - 오늘 작업 대시보드(런처/헬퍼 스크립트)
│  └─ wrappers/                       - 셸 유지/환경 진입 래퍼
├─ 20_Projects/                       - 내가 개발·관리하는 **코드 정본**
│  └─ PRJ-YYYY-NNN_slug/              - 예: PRJ-2025-001_sample_app
│     ├─ src/<pkg>/ tests/ scripts/ examples/ docs/
│     └─ pyproject.toml 등
├─ 21_ExternalRepos/                  - 외부(3rd-party) 리포 로컬 클론
│  ├─ github/<org>/<repo>/
│  ├─ gitlab/<group>/<repo>/
│  └─ bitbucket/<team>/<repo>/
├─ 22_Labs/                           - 가벼운 실험/프로토(재현 불필요)
│  └─ jupyter/                        - 스크래치 노트북(예: regex_scratch.ipynb)
├─ 25_Jobs/                           - 산출 **작업 단위**(프로세스 수명 중심)
│  ├─ _active/                        - 진행 중(최대 12개 권장)
│  ├─ _templates/                     - JOB/BUG/SMOKE/LAB/EX/REL 스캐폴드
│  ├─ JOB/2025/  BUG/2025/  SMOKE/2025/  LAB/2025/  EX/2025/  REL/2025/
├─ 26_Datasets/                       - 데이터셋 **정본**(입력/파생)
│  ├─ registry/                       - 카탈로그(색인 파일)
│  ├─ datasets/<name>/vYYYY.MMDD/     - 입력 데이터 버전
│  │  ├─ raw/ interim/ processed/ samples/ docs/
│  │  ├─ manifest.yml  SHA256SUMS
│  ├─ derived/<artifact>/vYYYY.MMDD/  - 승격된 출력물
│  │  ├─ data/ metrics/ docs/ manifest.yml  SHA256SUMS
│  └─ cache/                          - 언제든 삭제 가능
├─ 30_Areas/                          - 장기 운영(정책/워크로그/지식)
│  ├─ worklog/YYYY/YY-MM/DATE.md
│  └─ knowledge_base/                 - 축적 지식(팁/치트시트/가이드)
│     └─ obsidian_vault/              - Obsidian Vault(업무용)
├─ 31_Conversations/                  - 대화 기록 정본(원본/정제/비식별)
│  ├─ inbox/ by_assistant/ by_topic/ redacted/ private_encrypted/
│  └─ templates/ scripts/
├─ 32_SharedConfigs/                  - **공유/골든 설정**(팀 표준)
│  ├─ global/{vscode,ruff,pytest,pyinstaller,pyside6,jupyter}/
│  └─ projects/<project_slug>/
├─ 40_Resources/                      - 외부 참고 자료(교육/매뉴얼/스펙)
│  ├─ edu/{courses, tutorials, papers/...}
│  ├─ manuals/<vendor>/<product>/<version>/
│  └─ reference/
├─ 50_Snippets/{sql,text,bash}/       - 재사용 코드/원라이너/문구 조각
├─ 60_Assets/                         - 로고/폰트/템플릿 등 **업무 자산**
│  └─ fonts/<Family>/vX.Y/{desktop,web,variable,license,specimen}/
├─ 70_Exports/                        - 여러 Job의 최종 전달본 모아보기(선택)
├─ 75_Releases/                       - 유저 배포(버전드)
│  └─ <project>/
│     ├─ vX.Y.Z/{installers,wheels,portable,docs,licenses,checksums,ReleaseNotes.md}
│     └─ latest -> vX.Y.Z             - 최신 버전 포인터(상대 심볼릭)
├─ 80_Toolchains/                     - 고정 버전 빌드 도구(gcc/cmake/ninja…)
│  ├─ gcc/{13.3.0, latest->13.3.0}/
│  ├─ cmake/{3.29.3, latest->3.29.3}/
│  └─ ninja/{1.12.1, latest->1.12.1}/
├─ 81_SDKs/                           - 플랫폼 SDK/런타임(JDK/Qt/NDK/CUDA…)
│  ├─ jdk/{21.0.2, latest->21.0.2}/
│  └─ qt/{6.7.2-win-x64-msvc, latest->6.7.2-win-x64-msvc}/
├─ 82_Tools/                          - 개인·경량·포터블 유틸/관리 스크립트
│  ├─ installers/<tool>/<ver>/        - 설치 원본 + SHA256SUMS, install_notes.md
│  ├─ bin/                            - 어디서나 쓰는 개인 유틸(실행 파일)
│  ├─ portable/<tool>-<ver>/
│  ├─ scripts/                        - 체크섬/릴리스/부트스트랩 스크립트
│  └─ scratch/
├─ 83_Runtimes/                       - 언어 런타임(예: python)
│  └─ python/{3.12.5, 3.11.9, latest->3.12.5}/
├─ 85_Environments/                   - docker/conda/venv/devcontainer 캡슐
│  ├─ conda/environment.yml
│  ├─ docker/Dockerfile  compose.yml
│  └─ devcontainer/base/{Dockerfile, devcontainer.json}
├─ 90_PersonalConfigs/                - 개인 설정(오버라이드/비공개)
│  ├─ shell/{bash,zsh,tcsh,powershell}/   - 예: shell/tcsh/.tcshrc (홈에 심링크)
│  ├─ editors/vscode/{settings.user.json,keybindings.user.json}
│  ├─ git/.gitconfig.local  python/{pip.conf,poetry.toml,pypirc}
│  ├─ tools/ secrets/README.md  .gitignore
└─ 99_Archive/                        - 완료 항목 장기 보관(읽기 전용)

---

## 2) 핵심 원칙(간단)

1. **단일 정본 원칙**  
   - 코드: `20_Projects` / 작업: `25_Jobs` / 데이터: `26_Datasets`  
   - 복사본 금지, **링크/경로 참조** 우선.

2. **임시 ↔ 정본 분리**  
   - 임시: `01_Inbox`, `05_Downloads/_inbox`  
   - 정리 후 전용 위치로 이동.

3. **재현성**  
   - 데이터셋/릴리스/설치원본: **버전(예: vYYYY.MMDD)** + `manifest.yml` + `SHA256SUMS`.  
   - Toolchains/SDKs: `<ver>/` + `latest`(상대 심볼릭).

4. **환경 격리**  
   - 기본 Python: `83_Runtimes/python/<ver>/` + `latest`  
   - 프로젝트 의존성: 각 PRJ의 `.venv/` 또는 `85_Environments/conda`.

5. **이동 규칙**  
   - 같은 파일시스템: `mv`  
   - 다른 파일시스템: `rsync -a` (macOS는 `cp -pPR`/`ditto`, Windows는 `robocopy`)

6. **보안**  
   - 비밀/키/토큰: `90_PersonalConfigs/secrets/`에만. 코드/노트엔 하드코딩 금지.

---

## 3) 네이밍 & 버전

- 프로젝트: `PRJ-YYYY-NNN_slug`  
- 작업(Job): `JOB|BUG|SMOKE|LAB|EX|REL-YYYY-NNN_title`  
- 데이터셋 버전: `vYYYY.MMDD`  
- portable 폴더: `tool-version` (예: `gcc-13.3.0-linux-x64`)  
- 파일: `YYYY-MM-DD_title_vNNN.ext` 권장

---

## 4) 데이터셋 메타(템플릿)

**`manifest.yml` (입력 데이터셋 예시)**
===
name: <dataset_name>
kind: dataset
version: vYYYY.MMDD
created_at: 2025-09-01T00:00:00+09:00
owner: you@company.com
source:
  type: <external|internal|manual>
  detail: "<설명/링크>"
schema:
  format: <parquet|csv|json|image|...>
  rows: <int or unknown>
  columns:
    - {name: <col1>, type: <type>}
pii_level: <none|low|medium|high>
license: <internal|...>
files:
  - {path: <relative/file>, bytes: <int>, sha256: "<optional>"}
notes: "<전처리/주의사항>"
===

**체크섬 생성 (macOS/Linux)**
===
cd <버전 루트>
: > SHA256SUMS
find . -type f ! -name 'SHA256SUMS' ! -name '.*' -print0 \
| xargs -0 shasum -a 256 | sed 's#  #  #' >> SHA256SUMS
===

**체크섬 생성 (Windows PowerShell)**
===
$root = "<버전 루트>"
Set-Location $root
Remove-Item -Force SHA256SUMS -ErrorAction SilentlyContinue
Get-ChildItem -Recurse -File -Force | Where-Object {
  $_.Name -ne 'SHA256SUMS' -and -not $_.Name.StartsWith('.')
} | ForEach-Object {
  $h=(Get-FileHash $_.FullName -Algorithm SHA256).Hash.ToLower()
  $rel=$_.FullName.Substring($root.Length+1).Replace('\','/')
  "$h  $rel"
} | Set-Content -NoNewline SHA256SUMS
===

---

## 5) Toolchains/SDKs & Python

**latest 심볼릭 (macOS/Linux)**
===
cd ~/Work/80_Toolchains/gcc
ln -sfn 13.3.0 latest
===

**Python 런타임 & PATH**
===
# bash/zsh
export PATH="$HOME/Work/83_Runtimes/python/latest/bin:$PATH"

# tcsh
set path = ( $HOME/Work/83_Runtimes/python/latest/bin $path )

# PowerShell
$env:Path = "$HOME\Work\83_Runtimes\python\latest;$HOME\Work\83_Runtimes\python\latest\Scripts;" + $env:Path
===

**전역 CLI는 pipx 권장 (우리 트리에 맞춰)**
===
# tcsh 예시
setenv PIPX_HOME    "$HOME/Work/82_Tools/pipx"
setenv PIPX_BIN_DIR "$HOME/Work/82_Tools/bin"
set path = ( $PIPX_BIN_DIR $path )

# 대표 명령
pipx install ruff
pipx upgrade ruff
pipx uninstall ruff
===

---

## 6) 외부 리포/대화/미디어 배치

- 외부 클론: `21_ExternalRepos/<host>/<org>/<repo>/` (읽기 전용; 실험은 worktree로 `22_Labs`/`25_Jobs/SMOKE`에)  
- 대화 기록: `31_Conversations/` (inbox→정제→비식별/암호화; 프로젝트/노트에서는 링크로 참조)  
- 개인 음악/사진: `06_Media/` (업무와 분리; 프로젝트/노트에서는 링크로만)  
- 교육 자료(수집물) vs 내 정리/실습(창작물):
  - 수집물: `40_Resources/edu/...`
  - 내 정리: `30_Areas/knowledge_base/obsidian_vault/...`
  - 실습/과제: `25_Jobs/LAB/...`

---

## 7) 자주 쓰는 예시 10선 (step-by-step)

1) **새 프로젝트 시작 (파이썬 패키지)**
===
base=~/Work/20_Projects/PRJ-2025-001_sample_app
mkdir -p $base/{src/sample_app,tests,scripts,examples,docs}
printf '%s\n' "[project]\nname='sample-app'" > $base/pyproject.toml
cd $base && python3 -m venv .venv && . .venv/bin/activate && pip install -U build pytest
===

2) **배포 예제(최소 실행 예시) 만들기**
===
cd ~/Work/20_Projects/PRJ-2025-001_sample_app
mkdir -p examples/{data,scripts,docs}
printf '%s\n' '# how to run\npython -m sample_app' > examples/docs/README.md
===

3) **릴리스 산출(휠) 빌드 & 아카이브**
===
cd ~/Work/20_Projects/PRJ-2025-001_sample_app
. .venv/bin/activate
python -m build
rel=~/Work/75_Releases/sample-app/v0.3.0
mkdir -p $rel/checksums && cp dist/* $rel/
( cd $rel && shasum -a 256 * > checksums/SHA256SUMS && ln -sfn v0.3.0 ../latest )
===

4) **전역 CLI로 설치(pipx)**
===
setenv PIPX_HOME "$HOME/Work/82_Tools/pipx"
setenv PIPX_BIN_DIR "$HOME/Work/82_Tools/bin"
pipx install ~/Work/75_Releases/sample-app/v0.3.0/sample_app-0.3.0-py3-none-any.whl
===

5) **새 데이터셋 버전 투입**
===
base=~/Work/26_Datasets/datasets/ad_events/v2025.0901
mkdir -p $base/{raw,interim,processed,samples,docs}
mv ~/Downloads/ad_20250901.csv $base/raw/
printf '%s\n' "name: ad_events\nkind: dataset\nversion: v2025.0901" > $base/manifest.yml
( cd $base && : > SHA256SUMS && find . -type f ! -name 'SHA256SUMS' -print0 | xargs -0 shasum -a 256 >> SHA256SUMS )
===

6) **외부 리포 정리 위치로 이동**
===
repo=~/Downloads/tmp/flask
url=$(git -C "$repo" config --get remote.origin.url)
host=$(echo "$url" | sed -E 's#(https?://|git@)([^/:]+).*#\2#')
org=$( echo "$url" | sed -E 's#.*/([^/]+)/[^/]+(\.git)?$#\1#')
name=$(echo "$url" | sed -E 's#.*/([^/]+)(\.git)?$#\1#')
dest="$HOME/Work/21_ExternalRepos/$host/$org/$name"
mkdir -p "$(dirname "$dest")" && mv "$repo" "$dest"
===

7) **gcc 같은 툴체인 추가 & 최신 링크 갱신**
===
cd ~/Work/80_Toolchains/gcc
tar -xf ~/Work/82_Tools/installers/gcc/13.3.0/gcc-13.3.0.tar.xz -C .
mv gcc-13.3.0 13.3.0
ln -sfn 13.3.0 latest
===

8) **프로젝트별 venv에서만 쓰는 내부 CLI 설치**
===
cd ~/Work/20_Projects/PRJ-APP
python3 -m venv .venv && . .venv/bin/activate
pip install -e ../PRJ-UTILS-mytool
mytool --help   # venv 안에서만 사용
===

9) **대화 기록 정리(inbox → by_assistant)**
===
src=~/Work/31_Conversations/inbox
dst=~/Work/31_Conversations/by_assistant/local_llm/$(date +%Y)/$(date +%Y-%m)
mkdir -p "$dst"
for f in "$src"/*.md; do
  [ -e "$f" ] || continue
  ts=$(date +"%Y-%m-%d_%H%M-KST")
  mv "$f" "$dst/${ts}_localllm_$(basename "$f")"
done
===

10) **콘텐츠 수집물 vs 내 실습/정리 분리**
===
# 수집물(읽기 전용)
mkdir -p ~/Work/40_Resources/edu/courses/udemy/pyside6/v2025.0901/{slides,pdf,code}
# 내 실습(재현 가능)
mkdir -p ~/Work/25_Jobs/LAB/2025/LAB-2025-018_pyside6-tableview/{src,scripts,data}
# 내 정리(노트)
mkdir -p ~/Work/30_Areas/knowledge_base/obsidian_vault/20_Topics
===

---

## 8) 자주 헷갈리는 포인트 정리

- **`mv` vs `cp -rf`**: 동일 디스크면 `mv`가 안전·빠름. 다른 디스크로 옮길 땐 `rsync -a` 권장.  
- **`ln -sfn` 의미**: `-s`(심볼릭), `-f`(기존 링크 덮어쓰기), `-n`(링크를 디렉터리로 따라가지 않음).  
- **venv/conda 복사 금지**: 절대경로 내장 → 옮기면 깨질 수 있음(venv 재생성 또는 conda-pack).  
- **업무 자산 vs 엔터테인먼트**: 업무 자산은 `60_Assets`, 개인 음악·사진은 `06_Media`.  
- **Obsidian Vault**: 업무 지식은 `30_Areas/knowledge_base/obsidian_vault/`, 대용량은 링크만.

---

### 끝. 필요한 경우 이 문서를 `~/Work/00_README.md`로 저장하고, 변경 시 상단에 날짜를 갱신하세요.

근데 내가 실험한 결과를 다른 사람들에게 공유할 때도 있거든? 그런건 어떻게 해야할까

좋아—“내가 실험한 결과를 다른 사람에게 공유”할 때는, 정본/재현성/보안 관점으로 아래처럼 나누면 깔끔해.


0) 한눈 요약 (어디에 둘까?)

  • 실험의 정본과 작업 맥락 : 25_Jobs/LAB/<연도>/LAB-YYYY-NNN_<slug>/

  • 공유용 번들(동료 전달/고객 검토본) : 70_Exports/<topic_or_audience>/<YYYY-MM-DD>/

  • 예제로 재사용할 가치가 클 때(튜토리얼/샘플 앱) : 25_Jobs/EX/<연도>/EX-YYYY-NNN_<slug>/ → 필요 시 zip을 70_Exports에 배포

  • 공개 릴리스(버전드, 링크 고정 필요) : 75_Releases/<project_or_kit>/vX.Y.Z/(+ latest 심볼릭, checksums)

  • 데이터 공유(샘플/비식별) : 26_Datasets/derived/<artifact>-public/vYYYY.MMDD/ (manifest.yml + SHA256SUMS)

핵심: 정본은 LAB/EX/REL에 , 전달용 패키징은 Exports/Release에 , 데이터는 Datasets에.


1) 의사결정 트리 (step-by-step)

  1. 대상/채널

    • 내부 동료? → 70_Exports (빠른 전달)

    • 외부/고객/공개? → 75_Releases (버전 고정/체크섬)

  2. 데이터 민감도

    • 민감함 → 비식별본을 26_Datasets/derived/...-public/로 만들고 거기만 포함

    • 민감 아님 → 그래도 샘플 소용량 만 포함(전량은 경로 링크)

  3. 재현성 필요 여부

    • 필요함 → env/(requirements/conda/docker) + run 스크립트 포함

    • 불필요 → 결과물/요약/스크린샷 중심의 “리포트 번들”

  4. 지속 가치

    • 튜토리얼·샘플로 재사용 가치 큼 → EX Job 로 승격

    • 단발 보고 → Exports 에만 두고 종료


2) “공유용 번들(Share Kit)” 표준 구조

예) 70_Exports/pyside6-tableview/2025-09-01/

sharekit/
├─ README.md                 # 목적/요약/Quickstart/라이선스
├─ env/                      # 재현 환경(필요할 때)
│  ├─ requirements.txt  또는  conda/environment.yml
│  └─ Dockerfile   (옵션)
├─ scripts/
│  ├─ run.sh     # macOS/Linux
│  └─ run.ps1    # Windows
├─ data/                     # 소용량 샘플(또는 data/README.md에 경로/버전 명시)
│  ├─ samples/
│  ├─ manifest.yml
│  └─ SHA256SUMS
├─ results/                  # 핵심 결과(그래프/표/리포트)
├─ refs/                     # 참고 링크/문서(원본은 40_Resources)
└─ LICENSE                   # 필요 시
  • 정본 소스/노트 는 여기에 복사하지 말고 :
    LAB/…26_Datasets/…상대경로 링크refs/READMEs로 참조.

  • 공개 배포가 필요하면 이 sharekit/을 통째로 75_Releases/<name>/vX.Y.Z/로 승격.


3) 체크리스트 (공유 전)

  • 보안/프라이버시 : 토큰·키·사내 경로·고객명 제거/마스킹

  • 데이터 : 샘플만 포함, manifest.yml + SHA256SUMS 기록

  • 재현성 : 최소 하나의 경로(venv or conda or docker) 제공

  • 경로 독립성 : 스크립트는 상대경로 기준, OS별 한 줄 실행 제공

  • 라이선스/출처 : 외부 자료는 refs/에 출처/라이선스 표기

  • 사이즈 : zip ≤ 수십 MB 권장(대형 파일은 외부 저장소 링크)


4) 바로 쓰는 템플릿들

(A) README.md 스켈레톤

===

<Project/Experiment Title>

Goal

  • 문제/가설/평가지표 한 줄 요약

Quickstart

  • macOS/Linux: ./scripts/run.sh

  • Windows: .\scripts\run.ps1

  • 데이터: data/README.md 참고(샘플 포함, 전체는 링크)

Reproduce

  • env:

    • venv: python -m venv .venv && . .venv/bin/activate && pip -r env/requirements.txt

    • or conda: conda env create -f env/environment.yml && conda activate <name>

    • or docker: docker build -t <tag> -f env/Dockerfile . && docker run ...

  • run: ./scripts/run.sh / .\scripts\run.ps1

Results

  • 핵심 표/그래프/숫자 요약 (상세는 results/)

Data

  • 샘플: data/samples (버전: vYYYY.MMDD)

  • 전체: ../../../../26_Datasets/<path> (읽기 전용)

References

  • 내부/외부 링크(40_Resources, 논문/문서)

(B) env/requirements.txt 생성(venv)

===

python -m venv .venv
. .venv/bin/activate
pip install -U pip wheel
pip freeze > env/requirements.txt

(C) 샘플 데이터 체크섬

===

cd data

SHA256SUMS
find samples -type f -print0 | xargs -0 shasum -a 256 » SHA256SUMS

(D) run.sh / run.ps1 예시(상대경로, 결과 폴더 보장)

===

#!/usr/bin/env bash
set -euo pipefail
here="$(cd "$(dirname "$0")"/.. && pwd)"
mkdir -p "$here/results"
python "$here/src/main.py" –input "$here/data/samples" –out "$here/results"
echo "done -> $here/results"

===

PowerShell

$here = Split-Path -Parent (Split-Path -Parent $MyInvocation.MyCommand.Path)

New-Item -ItemType Directory -Force -Path "$here\results" | Out-Null
python "$here\src\main.py" –input "$here\data\samples" –out "$here\results"
Write-Host "done -> $here\results"


5) 어디에 둘지 매핑 예시

  • 동료 리뷰용 1차 전달

    • 70_Exports/pyside6-tableview/2025-09-01/sharekit.zip

    • 메시지엔 LAB 정본 경로/데이터셋 버전 링크 포함

  • 블로그/깃허브 예제로 재사용

    • 25_Jobs/EX/2025/EX-2025-012_tableview-demo/에 정리

    • 공개 시 75_Releases/tableview-demo/v1.0.0/ 배포(+ checksums, latest)

  • 고객 재현 패키지

    • 고객 환경 한정 종속성이면 env/Dockerfile 포함

    • 데이터는 비식별 26_Datasets/derived/<name>-public/…


6) 흔한 함정 & 예방

  • 프로젝트 폴더에 대용량 데이터 복사 ❌ → 항상 26_Datasets 참조

  • 하드코딩된 절대경로 ❌ → 상대경로 + here 변수

  • OS 한쪽만 스크립트 ❌ → run.sh + run.ps1 둘 다 제공

  • 비밀 포함 ❌ → 환경변수(.env.example)로 주입, 값은 90_PersonalConfigs/secrets


원하면 네가 방금 끝낸 실험 하나를 골라 주면, 위 표준에 맞는 sharekit 스캐폴드 를 바로 만들어 줄게.

지금까지의 대화 내용을 정리해서 누구나 Work 폴더를 파악할 수 있게 하나의 Markdown(*.md)으로 정리해줘. 1. 본문 내부에서 코드 블럭은 깨지니까 3 backticks를 ===로 대체해줘. 2. shortcuts.list 같은건 내가 알아서 다룰테니까 그냥 자세히 언급하지 말아줘. 3. 몇 가지 자주 사용할만한 예시들을 10개 정도 써줘. 4. pipx 안쓸거야. 5. 06_Media 폴더도 안쓸거야.

Work 폴더 운영 가이드 (최종 요약)

목표: 1인 개발/분석 환경에서 정본 위치 , 재현성 , 정리 루틴 , 작업 흐름 을 일관되게 유지한다.
루트는 기본 ~/Work (원하면 다른 경로로 이식 가능).


1) 최종 폴더 트리 (요약 + 설명)

===

Work/
├─ 00_README.md - 운영 규칙 요약(사람용 문서)
├─ 01_Inbox/ - 임시 수집함(스크린샷/메모/임시 파일)
├─ 05_Downloads/ - 다운로드 착륙지(정리 전)
│ ├─ _inbox/ - 기본 저장 경로
│ ├─ installers/ datasets/ manuals/ assets/ quarantine/
├─ 10_Today/ - 오늘 작업 대시보드(런처/헬퍼)
│ └─ wrappers/ - 셸 유지/환경 진입 래퍼
├─ 20_Projects/ - 내가 개발·관리하는 코드 정본
│ └─ PRJ-YYYY-NNN_slug/ - 예: PRJ-2025-001_sample_app
│ ├─ src// tests/ scripts/ examples/ docs/ │ └─ pyproject.toml … ├─ 21_ExternalRepos/ - 외부(3rd-party) 리포 로컬 클론(읽기 전용) │ ├─ github/// │ ├─ gitlab/// │ └─ bitbucket/// ├─ 22_Labs/ - 가벼운 실험/프로토(재현 불필요) │ └─ jupyter/ - 스크래치 노트북 ├─ 25_Jobs/ - 산출 **작업 단위**(프로세스 수명 중심) │ ├─ _active/ - 진행 중(최대 12개 권장) │ ├─ _templates/ - JOB/BUG/SMOKE/LAB/EX/REL 스캐폴드 │ ├─ JOB/2025/ BUG/2025/ SMOKE/2025/ LAB/2025/ EX/2025/ REL/2025/ ├─ 26_Datasets/ - 데이터셋 **정본**(입력/파생) │ ├─ registry/ - 카탈로그(색인 파일) │ ├─ datasets//vYYYY.MMDD/ - 입력 데이터 버전 │ │ ├─ raw/ interim/ processed/ samples/ docs/ │ │ ├─ manifest.yml SHA256SUMS │ ├─ derived//vYYYY.MMDD/ - 승격된 출력물 │ │ ├─ data/ metrics/ docs/ manifest.yml SHA256SUMS │ └─ cache/ - 언제든 삭제 가능 ├─ 30_Areas/ - 장기 운영(정책/워크로그/지식) │ ├─ worklog/YYYY/YY-MM/DATE.md │ └─ knowledge_base/ - 축적 지식(팁/치트시트/가이드) │ └─ obsidian_vault/ - Obsidian Vault(업무용) ├─ 31_Conversations/ - 대화 기록 정본(원본/정제/비식별/암호화) │ ├─ inbox/ by_assistant/ by_topic/ redacted/ private_encrypted/ │ └─ templates/ scripts/ ├─ 32_SharedConfigs/ - **공유/골든 설정**(팀 표준) │ ├─ global/{vscode,ruff,pytest,pyinstaller,pyside6,jupyter}/ │ └─ projects// ├─ 40_Resources/ - 외부 참고 자료(교육/매뉴얼/스펙) │ ├─ edu/{courses, tutorials, papers/...} │ ├─ manuals//// │ └─ reference/ ├─ 50_Snippets/{sql,text,bash}/ - 재사용 코드/원라이너/문구 조각 ├─ 60_Assets/ - 로고/폰트/템플릿 등 **업무 자산** │ └─ fonts//vX.Y/{desktop,web,variable,license,specimen}/ ├─ 70_Exports/ - **공유용 번들/전달본** 모아두는 곳 ├─ 75_Releases/ - 유저 배포(버전드) │ └─ / │ ├─ vX.Y.Z/{installers,wheels,portable,docs,licenses,checksums,ReleaseNotes.md} │ └─ latest -> vX.Y.Z - 최신 포인터(상대 심볼릭) ├─ 80_Toolchains/ - 고정 버전 빌드 도구(gcc/cmake/ninja…) │ ├─ gcc/{13.3.0, latest->13.3.0}/ │ ├─ cmake/{3.29.3, latest->3.29.3}/ │ └─ ninja/{1.12.1, latest->1.12.1}/ ├─ 81_SDKs/ - 플랫폼 SDK/런타임(JDK/Qt/NDK/CUDA…) │ ├─ jdk/{21.0.2, latest->21.0.2}/ │ └─ qt/{6.7.2-win-x64-msvc, latest->6.7.2-win-x64-msvc}/ ├─ 82_Tools/ - 개인·경량·포터블 유틸/관리 스크립트 │ ├─ installers/// - 설치 원본 + SHA256SUMS, install_notes.md │ ├─ bin/ - 어디서나 쓰는 개인 유틸(실행 파일) │ ├─ portable/-/ │ ├─ scripts/ - 체크섬/릴리스/부트스트랩 스크립트 │ └─ scratch/ ├─ 83_Runtimes/ - 언어 런타임(예: python) │ └─ python/{3.12.5, 3.11.9, latest->3.12.5}/ ├─ 85_Environments/ - docker/conda/venv/devcontainer 캡슐 │ ├─ conda/environment.yml │ ├─ docker/Dockerfile compose.yml │ └─ devcontainer/base/{Dockerfile, devcontainer.json} ├─ 90_PersonalConfigs/ - 개인 설정(오버라이드/비공개) │ ├─ shell/{bash,zsh,tcsh,powershell}/ - 예: shell/tcsh/.tcshrc (홈에 심링크) │ ├─ editors/vscode/{settings.user.json,keybindings.user.json} │ ├─ git/.gitconfig.local python/{pip.conf,poetry.toml,pypirc} │ ├─ tools/ secrets/README.md .gitignore └─ 99_Archive/ - 완료 항목 장기 보관(읽기 전용)


2) 핵심 원칙 (간단)

1

지금까지의 대화 내용을 정리해서 누구나 Work 폴더를 파악할 수 있게 하나의 Markdown(*.md)으로 정리해줘. 1. 본문 내부에서 코드 블럭은 깨지니까 3 backticks를 ===로 대체해줘. (markdown을 감싸는 처음과 끝의 backticks는 유지) 2. shortcuts.list 같은건 내가 알아서 다룰테니까 그냥 자세히 언급하지 말아줘. 3. 몇 가지 자주 사용할만한 예시들을 10개 정도 써줘. 4. pipx 안쓸거야. 5. 06_Media 폴더도 안쓸거야.

# Work 폴더 운영 가이드 (최종 요약)

> 목적: 누구나 `~/Work` 트리를 빠르게 이해하고, **정본 위치**, **재현성**, **정리 루틴**, **작업 흐름**을 일관되게 유지하도록 돕습니다.  
> 본 문서는 사람용 가이드입니다(LLM 프롬프트는 `90_PersonalConfigs/llm_config/` 등 별도 보관).

---

## 1) TL;DR

- **임시 ↔ 정본 분리**: `01_Inbox`, `05_Downloads/_inbox`는 착륙지만, 정본은 각 전용 위치로 이동.  
- **단일 정본 원칙**  
  - 코드: `20_Projects`  
  - 작업(산출 단위): `25_Jobs`  
  - 데이터: `26_Datasets` (버전+메타)  
- **툴 스택 분리**: 툴체인(80) / SDK(81) / 개인 유틸(82) / 런타임(83) / 환경 캡슐(85)  
- **Python**: 기본 인터프리터는 `83_Runtimes/python/<ver>/`(+`latest`), 각 프로젝트는 **자체 venv**.  
- **공유/배포**: 빠른 전달은 `70_Exports/`, 공개 버전드는 `75_Releases/`.  
- **교육 자료 vs 내 정리/실습**:  
  - 수집물 원본 → `40_Resources/edu`  
  - 내 정리(노트) → `30_Areas/knowledge_base/obsidian_vault`  
  - 실습/과제(재현 가능) → `25_Jobs/LAB`  

---

## 2) 최종 폴더 트리 (요약 + 설명)

===
Work/
├─ 00_README.md                         - 운영 규칙 요약(이 문서)
├─ 01_Inbox/                            - 임시 수집함(스크린샷/메모/임시 파일)
├─ 05_Downloads/                        - 다운로드 착륙지(정리 전)
│  ├─ _inbox/                           - 기본 저장 경로
│  ├─ installers/ datasets/ manuals/ assets/ quarantine/
├─ 10_Today/                            - 오늘 작업 대시보드(런처/헬퍼 배치)
│  └─ wrappers/                         - 셸 유지/환경 진입 래퍼
├─ 20_Projects/                         - 내가 개발·관리하는 **코드 정본**
│  └─ PRJ-YYYY-NNN_slug/
│     ├─ src/<pkg>/ tests/ scripts/ examples/ docs/
│     └─ pyproject.toml …
├─ 21_ExternalRepos/                    - 외부(3rd-party) 리포 로컬 클론(읽기 전용)
│  ├─ github/<org>/<repo>/  gitlab/<group>/<repo>/  bitbucket/<team>/<repo>/
├─ 22_Labs/                             - 가벼운 실험/프로토(재현 불필요)
│  └─ jupyter/
├─ 25_Jobs/                             - 산출 **작업 단위**(프로세스 수명 중심)
│  ├─ _active/                          - 진행 중(최대 12개 권장)
│  ├─ _templates/                       - JOB/BUG/SMOKE/LAB/EX/REL 스캐폴드
│  ├─ JOB/2025/  BUG/2025/  SMOKE/2025/  LAB/2025/  EX/2025/  REL/2025/
├─ 26_Datasets/                         - 데이터셋 **정본**(입력/파생)
│  ├─ registry/
│  ├─ datasets/<name>/vYYYY.MMDD/{raw,interim,processed,samples,docs,manifest.yml,SHA256SUMS}
│  ├─ derived/<artifact>/vYYYY.MMDD/{data,metrics,docs,manifest.yml,SHA256SUMS}
│  └─ cache/
├─ 30_Areas/                            - 장기 운영(정책/워크로그/지식)
│  ├─ worklog/YYYY/YY-MM/DATE.md
│  └─ knowledge_base/
│     └─ obsidian_vault/
├─ 31_Conversations/                    - 대화 기록(원본/정제/비식별/암호화)
│  ├─ inbox/ by_assistant/ by_topic/ redacted/ private_encrypted/
│  └─ templates/ scripts/
├─ 32_SharedConfigs/                    - **공유/골든 설정**(팀 표준)
│  ├─ global/{vscode,ruff,pytest,pyinstaller,pyside6,jupyter}/
│  └─ projects/<project_slug>/
├─ 40_Resources/                        - 외부 참고 자료(교육/매뉴얼/스펙)
│  ├─ edu/{courses, tutorials, papers/...}
│  ├─ manuals/<vendor>/<product>/<version>/
│  └─ reference/
├─ 50_Snippets/{sql,text,bash}/         - 재사용 코드/원라이너/문구 조각
├─ 60_Assets/                           - 로고/폰트/템플릿 등 **업무 자산**
│  └─ fonts/<Family>/vX.Y/{desktop,web,variable,license,specimen}/
├─ 70_Exports/                          - **공유용 번들/전달본** 모음
├─ 75_Releases/                         - 유저 배포(버전드)
│  └─ <project>/vX.Y.Z/{installers,wheels,portable,docs,licenses,checksums,ReleaseNotes.md}
│     └─ latest -> vX.Y.Z               # 최신 포인터(상대 심볼릭)
├─ 80_Toolchains/                       - 고정 버전 빌드 도구(gcc/cmake/ninja…)
│  ├─ gcc/{13.3.0, latest->13.3.0}/  cmake/{3.29.3, latest->3.29.3}/  ninja/{1.12.1, latest->1.12.1}/
├─ 81_SDKs/                             - 플랫폼 SDK/런타임(JDK/Qt/NDK/CUDA…)
│  ├─ jdk/{21.0.2, latest->21.0.2}/  qt/{6.7.2-win-x64-msvc, latest->6.7.2-win-x64-msvc}/
├─ 82_Tools/                            - 개인·경량·포터블 유틸/관리 스크립트
│  ├─ installers/<tool>/<ver>/          # 설치 원본 + SHA256SUMS, install_notes.md
│  ├─ bin/  portable/<tool>-<ver>/  scripts/  scratch/
├─ 83_Runtimes/                         - 언어 런타임(예: python)
│  └─ python/{3.12.5, 3.11.9, latest->3.12.5}/
├─ 85_Environments/                     - docker/conda/venv/devcontainer 캡슐
│  ├─ conda/environment.yml  docker/{Dockerfile,compose.yml}  devcontainer/base/{Dockerfile,devcontainer.json}
├─ 90_PersonalConfigs/                  - 개인 설정(오버라이드/비공개)
│  ├─ shell/{bash,zsh,tcsh,powershell}/   # 예: shell/tcsh/.tcshrc (홈에 심링크)
│  ├─ editors/vscode/{settings.user.json,keybindings.user.json}
│  ├─ git/.gitconfig.local  python/{pip.conf,poetry.toml,pypirc}  tools/  secrets/README.md  .gitignore
└─ 99_Archive/                          - 완료 항목 장기 보관(읽기 전용)
===

> 참고: Today 런처/단축은 간단히만 언급하고 세부는 생략합니다.

---

## 3) 네이밍 & 버전 규칙

- 프로젝트: `PRJ-YYYY-NNN_slug`  
- 작업(Job): `JOB|BUG|SMOKE|LAB|EX|REL-YYYY-NNN_title`  
- 데이터셋 버전: `vYYYY.MMDD` (예: `v2025.0901`)  
- Toolchains/SDK 폴더: `<tool>/<version>/` + `latest -> <version>`(상대 심볼릭)  
- 파일: `YYYY-MM-DD_title_vNNN.ext` 권장

---

## 4) 결정 가이드 (어디에 둘까?)

- **코드 소스**`20_Projects`  
- **실행/분석/리포트 작업**`25_Jobs`  
- **입력/출력 데이터 정본**`26_Datasets`  
- **외부 레포(연구/분석용 클론)**`21_ExternalRepos` (읽기 전용, 실험은 worktree로 `22_Labs`/`25_Jobs/SMOKE`)  
- **교육 수집물**`40_Resources/edu` / **내 정리 노트**`30_Areas/knowledge_base/obsidian_vault` / **실습**`25_Jobs/LAB`  
- **빠른 공유 번들**`70_Exports` / **공개 릴리스**`75_Releases`  
- **공유 설정**`32_SharedConfigs` / **개인 설정**`90_PersonalConfigs`

---

## 5) 데이터셋 메타(템플릿 & 체크섬)

**`manifest.yml` (입력 데이터셋 예시)**  
===
name: <dataset_name>
kind: dataset
version: vYYYY.MMDD
created_at: 2025-09-01T00:00:00+09:00
owner: you@company.com
source:
  type: <external|internal|manual>
  detail: "<설명/링크>"
schema:
  format: <parquet|csv|json|image|...>
  rows: <int or unknown>
  columns:
    - {name: <col1>, type: <type>}
pii_level: <none|low|medium|high>
license: <internal|...>
files:
  - {path: <relative/file>, bytes: <int>, sha256: "<optional>"}
notes: "<전처리/주의사항>"
===

**체크섬 생성 (macOS/Linux)**  
===
cd <버전 루트>
: > SHA256SUMS
find . -type f ! -name 'SHA256SUMS' ! -name '.*' -print0 \
| xargs -0 shasum -a 256 | sed 's#  #  #' >> SHA256SUMS
===

**체크섬 생성 (Windows PowerShell)**  
===
$root = "<버전 루트>"
Set-Location $root
Remove-Item -Force SHA256SUMS -ErrorAction SilentlyContinue
Get-ChildItem -Recurse -File -Force | Where-Object {
  $_.Name -ne 'SHA256SUMS' -and -not $_.Name.StartsWith('.')
} | ForEach-Object {
  $h=(Get-FileHash $_.FullName -Algorithm SHA256).Hash.ToLower()
  $rel=$_.FullName.Substring($root.Length+1).Replace('\','/')
  "$h  $rel"
} | Set-Content -NoNewline SHA256SUMS
===

---

## 6) 툴/SDK/런타임/환경 운용

- **80_Toolchains**: gcc/cmake/ninja 등 **고정 버전** 보관, `latest` 심볼릭 운영  
- **81_SDKs**: JDK/Qt/NDK/CUDA 등 플랫폼 SDK  
- **82_Tools**: 개인 유틸 실행 파일(전역 PATH에 추가), 설치 원본은 `installers/`에 보관(+체크섬)  
- **83_Runtimes**: 기본 Python 등 언어 런타임(버전 병치, `latest` 링크)  
- **85_Environments**: 프로젝트 무관 **환경 캡슐** (docker/conda/venv/devcontainer)

**Python PATH 예시**  
===
# bash/zsh
export PATH="$HOME/Work/83_Runtimes/python/latest/bin:$PATH"

# tcsh
set path = ( $HOME/Work/83_Runtimes/python/latest/bin $path )

# PowerShell
$env:Path = "$HOME\Work\83_Runtimes\python\latest;$HOME\Work\83_Runtimes\python\latest\Scripts;" + $env:Path
===

**“전역처럼 쓰고 싶은 CLI” (pipx 미사용 방침)**  
- 방법 A: **전용 venv**`85_Environments/venv/tools-<pyver>/`로 만들고, 그 `bin/`을 PATH 앞에 둔다.  
- 방법 B: 프로젝트 venv의 콘솔 스크립트를 **`82_Tools/bin/`에 심볼릭 링크**로 노출(venv 삭제 시 링크 깨짐 주의).  

전용 venv 스케치:  
===
# macOS/Linux
env=~/Work/85_Environments/venv/tools-3.12
python3 -m venv "$env"
. "$env/bin/activate" && pip install -U pip wheel ruff black httpie
echo 'export PATH="$HOME/Work/85_Environments/venv/tools-3.12/bin:$PATH"' >> ~/.zshrc
===

---

## 7) 공유/배포 가이드

- **내부 공유(빠른 전달)**`70_Exports/<topic>/<YYYY-MM-DD>/sharekit/`  
  - `README.md`, `env/`, `scripts/`, `data/samples/`, `results/`, `refs/`  
- **공개 릴리스(버전드)**`75_Releases/<name>/vX.Y.Z/` + `checksums/`, `ReleaseNotes.md`, `latest` 심볼릭  
- **데이터 공유**: 비식별/샘플은 `26_Datasets/derived/<artifact>-public/vYYYY.MMDD/`

---

## 8) 외부 리포/대화/노트

- **외부 리포(연구/분석용)**: `21_ExternalRepos/<host>/<org>/<repo>/`  
  - 기본 읽기 전용. 실험은 `git worktree``22_Labs`/`25_Jobs/SMOKE`에 분리.  
- **대화 기록**: `31_Conversations/` (inbox→정제→redacted/private), 프로젝트/노트에서는 링크로만 참조.  
- **Obsidian Vault(업무)**: `30_Areas/knowledge_base/obsidian_vault/`  
  - 첨부는 `_attachments/`(소형), 대용량은 링크만.

---

## 9) 자주 쓰는 예시 10선

1) **새 프로젝트(파이썬 패키지) 시작**  
===
base=~/Work/20_Projects/PRJ-2025-001_sample_app
mkdir -p $base/{src/sample_app,tests,scripts,examples,docs}
printf '%s\n' "[project]\nname='sample-app'\nversion='0.1.0'" > $base/pyproject.toml
cd $base && python3 -m venv .venv && . .venv/bin/activate && pip install -U build pytest
===

2) **프로젝트 빌드(휠 생성) & 릴리스 아카이브**  
===
cd ~/Work/20_Projects/PRJ-2025-001_sample_app
. .venv/bin/activate
python -m build
rel=~/Work/75_Releases/sample-app/v0.1.0
mkdir -p $rel/checksums && cp dist/* $rel/
( cd $rel && shasum -a 256 * > checksums/SHA256SUMS && ln -sfn v0.1.0 ../latest )
===

3) **데이터셋 버전 투입 + 체크섬**  
===
base=~/Work/26_Datasets/datasets/ad_events/v2025.0901
mkdir -p $base/{raw,interim,processed,samples,docs}
mv ~/Downloads/ad_20250901.csv $base/raw/
printf '%s\n' "name: ad_events\nkind: dataset\nversion: v2025.0901" > $base/manifest.yml
( cd $base && : > SHA256SUMS && find . -type f ! -name 'SHA256SUMS' -print0 | xargs -0 shasum -a 256 >> SHA256SUMS )
===

4) **외부 리포 이동 & upstream/포크 리모트 정리**  
===
repo=~/Downloads/tmp/flask
url=$(git -C "$repo" config --get remote.origin.url)
host=$(echo "$url" | sed -E 's#(https?://|git@)([^/:]+).*#\2#'); \
org=$( echo "$url" | sed -E 's#.*/([^/]+)/[^/]+(\.git)?$#\1#'); \
name=$(echo "$url" | sed -E 's#.*/([^/]+)(\.git)?$#\1#')
dest="$HOME/Work/21_ExternalRepos/$host/$org/$name"
mkdir -p "$(dirname "$dest")" && mv "$repo" "$dest"
cd "$dest" && git remote rename origin upstream
# 포크가 있다면: git remote add origin git@github.com:<me>/$name.git
===

5) **Toolchains/SDK 최신 버전 심볼릭 갱신**  
===
cd ~/Work/80_Toolchains/gcc
ln -sfn 13.3.0 latest
cd ~/Work/81_SDKs/jdk
ln -sfn 21.0.2 latest
===

6) **프로젝트 전용 venv로 내부 CLI 사용**  
===
cd ~/Work/20_Projects/PRJ-APP
python3 -m venv .venv && . .venv/bin/activate
pip install -e ../PRJ-UTILS-mytool
mytool --help   # venv 안에서만 사용
===

7) **전용 “도구용 venv”(pipx 없이 전역처럼) 구성**  
===
env=~/Work/85_Environments/venv/tools-3.12
python3 -m venv "$env"
. "$env/bin/activate" && pip install -U pip wheel ruff black httpie
echo 'export PATH="$HOME/Work/85_Environments/venv/tools-3.12/bin:$PATH"' >> ~/.zshrc
===

8) **Share Kit 스캐폴드(빠른 공유 번들)**  
===
kit=~/Work/70_Exports/pyside6-tableview/2025-09-01/sharekit
mkdir -p $kit/{env,scripts,data/samples,results,refs}
printf '%s\n' "# README\nQuickstart: ./scripts/run.sh" > $kit/README.md
printf '%s\n' "numpy\npandas" > $kit/env/requirements.txt
printf '%s\n' '#!/usr/bin/env bash\nset -e\nhere=$(cd $(dirname $0)/.. && pwd)\nmkdir -p \"$here/results\"\npython \"$here/src/main.py\" --input \"$here/data/samples\" --out \"$here/results\"' > $kit/scripts/run.sh
chmod +x $kit/scripts/run.sh
===

9) **Obsidian Vault 뼈대 만들기**  
===
vault=~/Work/30_Areas/knowledge_base/obsidian_vault
mkdir -p $vault/{00_Inbox,10_Daily/2025,20_Topics,30_ProjectsNotes,40_References,_attachments}
printf '%s\n' "# Daily Notes" > $vault/10_Daily/2025/README.md
===

10) **LAB 작업 스캐폴드(+참고 링크 연결)**  
===
job=~/Work/25_Jobs/LAB/2025/LAB-2025-018_pyside6-tableview
mkdir -p $job/{src,scripts,env,data}
printf '%s\n' "# 목표\n- TableView로 CSV 뷰어 만들기\n\n# 절차\n- ...\n\n# 결과\n- 스크린샷/메모" > $job/README.md
printf '%s\n' "- 강의: ../../../../40_Resources/edu/courses/udemy/pyside6/v2025.0901/README.md" > $job/references.md
===

---

## 10) 자주 헷갈리는 포인트

- **프로젝트에 대용량 데이터 복사 금지** → 항상 `26_Datasets`를 경로 참조(또는 심볼릭).  
- **`mv` vs `cp -rf`**: 같은 파일시스템은 `mv`(빠르고 안전). 다른 FS는 `rsync -a`/`cp -pPR`/`ditto`/`robocopy`.  
- **`ln -sfn` 의미**: `-s`(심볼릭), `-f`(기존 링크 덮어쓰기), `-n`(디렉터리 따라가지 않음).  
- **venv/conda는 복사 금지**: 경로 내장 → 옮기면 깨질 수 있음(재생성 권장).  
- **교육 수집물 vs 내 정리/실습**: `40_Resources/edu`(원본) ↔ `30_Areas/obsidian_vault`(정리) ↔ `25_Jobs/LAB`(실습).  
- **단축/런처**: Today는 대시보드로만 사용(세부는 각자 관리).

---

_필요 시 이 문서를 `~/Work/00_README.md`로 저장하고, 변경 시 상단 날짜를 갱신하세요._

Categories:

Updated: