{
  "path": "/AIWK_COMMON/plan/aiwk_ext4_plan.json",
  "version": "v047",
  "title": "AIWK EXT4 final roadmap and staged manual test plan v043",
  "progress_percent": 70,
  "principles": [
    "content.js 최소화",
    "창별 독립 기능",
    "수동 테스트 JSON 기반",
    "전체 > zone/group > window 순서로 skin/effect 상속",
    "삭제는 안정화 전까지 논리 삭제/휴지통 처리",
    "placeholder는 title tooltip으로 자동 노출",
    "접힌 창은 자체 복구 메뉴 또는 더블클릭으로 반드시 펼칠 수 있어야 한다",
    "3단 아이콘 위치는 일반 창 위치와 별도 관리한다",
    "차트/D3/기존 기능은 패키지화하여 팔레트에서 추가한다",
    "축소 단계에서는 resize 핸들을 완전히 숨겨 메뉴 클릭을 방해하지 않는다",
    "창은 주기 tick으로 중앙 전역 명령을 감지하고 수행한다",
    "1단 접기는 하단/body만 숨기는 접기 상태로 고정한다",
    "2단 접기는 D3/Node 연결 가능한 노드 형태로 발전시킨다",
    "3단 아이콘은 제어창 팔레트/아이콘 목록에 모아 클릭해 사용하는 방향으로 간다",
    "매크로/창 작업은 중앙 명령으로 pause/break/stop 신호를 받을 수 있어야 한다",
    "기존 WSS group 용어는 유지하고, route 뒤쪽은 폴더식 route로 묶는다.",
    "각 창의 ☰ 햄버거 메뉴는 고정 진입점이며 2단 메뉴로 기능 설정/접기/구조/패키지를 관리한다.",
    "group→net 일괄 치환은 금지한다. 필요 시 호환 레이어를 둔다.",
    "WEB(home.yjm.kr/aiwk/index.php)와 EXT4를 동시에 띄워 서로 상태/통신/오류를 검사한다.",
    "ChatGPT 도메인 폴더는 domains/chatgpt/chatgpt.com/folders/chatGPT/ 아래에 둔다.",
    "도메인 계층은 COMMON → domain_family → full_domain → folder → window/module 순서로 상속한다.",
    "도메인 상위 공통부는 선택이다. 있으면 하위가 상속하고 없으면 건너뛴다.",
    "도메인 기능 파일명은 dev_key_feature_key.* 형식을 사용한다. 예: yjm_chatgpt_diagnostic.json",
    "ChatGPT 전달은 #prompt-textarea 자동 입력까지만 하고 전송 버튼은 사용자가 직접 누른다.",
    "인스타 계정 지표 수집 MVP는 기존 EXT 분석본을 받은 뒤 연결한다. v040에서는 폴더/모듈/규칙 자리만 만든다.",
    "도메인 로딩은 JSON 매핑 필수 방식이 아니라 폴더 존재 기반 자동 상속 방식으로 한다.",
    "도메인 전체 공통은 AIWK_COMMON/domains/ 바로 아래에 둔다.",
    "현재 host 기준 부모 후보만 로드하고 형제 도메인은 절대 로드하지 않는다.",
    "예: i.yjm.kr 로딩 순서 = domains/ → domains/yjm/ → domains/yjm.kr/ → domains/i.yjm.kr/.",
    "JSON/i18n은 하위 폴더 값이 상위 폴더 값을 덮어쓴다.",
    "JS/CSS는 상위 폴더부터 하위 폴더 순서로 로드한다.",
    "의미 있는 폴더에는 ai_read.md를 둘 수 있으며, 이는 실행 대상이 아니라 AI/개발자용 안내 파일이다."
  ],
  "phases": [
    {
      "id": "p01-core-window",
      "title": "core/window stable MVP",
      "status": "in_progress",
      "percent": 82,
      "notes": "전역 버전, 창 생성, 드래그, 리사이즈, 닫기, 3단 접기, 접힌 창 복구 메뉴, resize 방해 제거, 위치 저장"
    },
    {
      "id": "p02-popup-control-restore",
      "title": "접속창 제어와 새로고침 복원",
      "status": "in_progress",
      "percent": 60,
      "notes": "접속 후 popup을 닫지 않고 전체 1단/2단/3단/펼침/숨김/보임/종료를 바로 테스트 가능하게 유지"
    },
    {
      "id": "p03-manual-test-manager",
      "title": "수동 테스트 관리자",
      "status": "in_progress",
      "percent": 60,
      "notes": "JSON 항목 추가/삭제/완료/오류/휴지통, 완료 시점/소요시간/오류횟수 저장"
    },
    {
      "id": "p04-skin-effect-cascade",
      "title": "skin/effect cascade",
      "status": "planned",
      "percent": 10,
      "notes": "전체 기본 skin, zone skin, window skin 우선순위 적용. dark/light/purple 확장"
    },
    {
      "id": "p09-template-skin-builder",
      "title": "template/skin builder and per-window selection",
      "status": "planned",
      "percent": 8,
      "notes": "Tailwind 유틸 + aiwk_ext4_base.css + skin.css를 기준으로 전체 > zone > window 상속. 제어창에서 스킨추가, 템플릿생성, 창별 skin/template 선택 UI를 만든다."
    },
    {
      "id": "p10-palette-package-node-red",
      "title": "palette/package like Node-RED",
      "status": "planned",
      "percent": 5,
      "notes": "기본 패키지와 추가 패키지를 팔레트에 표시하고, 차트/D3/기존 기능을 패키지화해 창 또는 zone/workflow에 하나씩 추가한다."
    },
    {
      "id": "p05-domain-js-css-html-on",
      "title": "domain profile js(on)/css/html 기능 설치",
      "status": "planned",
      "percent": 5,
      "notes": "도메인별 기능을 서버 저장/설치/사용 여부 토글"
    },
    {
      "id": "p06-market-auth-license",
      "title": "module market/auth/license",
      "status": "planned",
      "percent": 3,
      "notes": "무료/유료, 사용자 등록, 권한, 설치/제거/업데이트 관리"
    },
    {
      "id": "p07-d3-node-editor",
      "title": "D3.js 노드화/워크플로우 편집기",
      "status": "planned",
      "percent": 0,
      "notes": "D3 node graph로 접힌 창을 노드로 보고 선 연결, 모듈 의존성, 실행 흐름, WSS/Node-RED/창 연결 상태를 시각화하고 편집"
    },
    {
      "id": "p08-reward-rank",
      "title": "level/reward/rank engine",
      "status": "planned",
      "percent": 5,
      "notes": "수동 테스트 완료 시 레벨/보상 누적, 계정별 공개 순위는 나중 서버 연동"
    },
    {
      "id": "p11-window-command-tick",
      "title": "window global command tick and safe macro break",
      "status": "in_progress",
      "percent": 22,
      "notes": "각 창이 주기 tick으로 최신 전역 명령을 감지한다. 전체 접기/숨김은 이 명령 체계를 사용하고, 향후 macro_break/pause/stop으로 확장한다."
    },
    {
      "id": "p12-d3-node-fold-connection",
      "title": "D3 node connection on folded windows",
      "status": "planned",
      "percent": 5,
      "notes": "2단 접기 상태를 노드 연결 가능한 형태로 만들고, 3단 아이콘/제어창 팔레트와 D3.js 선긋기/의존성 그래프를 연결한다."
    },
    {
      "id": "p13-control-palette-icon-dock",
      "title": "control panel palette and 3-step icon dock",
      "status": "planned",
      "percent": 4,
      "notes": "제어창에 기본 패키지/추가 패키지 팔레트를 두고 3단 접힌 창 아이콘을 모아 클릭해 사용한다. Node-RED 팔레트 개념을 따른다."
    },
    {
      "id": "p06b-skin-template-menu-entry",
      "title": "Skin/template menu entry per window",
      "status": "active",
      "progress_percent": 48,
      "notes": "창별 ☰ 메뉴에서 스킨 변경/템플릿 변경을 선택하고, 추후 전체>zone>window 상속 엔진으로 연결한다."
    },
    {
      "id": "p13-folder-route-window-menu",
      "title": "folder route and two-level window menu",
      "status": "in_progress",
      "percent": 35,
      "notes": "group은 유지하고 /뒤쪽은 폴더식 route로 명명. 각 창 ☰ 메뉴를 2단 메뉴로 정리하고 기능 설정 도구를 붙인다."
    },
    {
      "id": "p10-web-ext-mutual-diagnostic",
      "title": "WEB + EXT4 상호 진단",
      "status": "in_progress",
      "percent": 25,
      "notes": "home.yjm.kr/aiwk/index.php를 WEB1 진단 콘솔로 두고, EXT4 A1과 WSS/Tab BUS/진단 JSON을 주고받는 구조."
    },
    {
      "id": "p11-chatgpt-report-bridge",
      "title": "ChatGPT 진단 결과 전달",
      "status": "in_progress",
      "percent": 30,
      "notes": "ChatGPT 탭의 #prompt-textarea에 AIWK_DIAG_JSON_START/END 형식으로 자동 입력한다. 실제 전송은 사용자가 직접 누른다."
    },
    {
      "id": "p12-domain-hierarchy-loader",
      "title": "도메인 계층 로딩 규칙",
      "status": "planned",
      "percent": 15,
      "notes": "domains/{domain_family}/{full_domain}/folders/{folder}/ 구조. 상위 공통 설정과 하위 세부 설정을 상속/확장한다."
    },
    {
      "id": "p13-instagram-account-metrics-mvp",
      "title": "인스타 계정 게시물 지표 수집 MVP",
      "status": "planned",
      "percent": 5,
      "notes": "계정 URL 300~500줄 입력 후 계정별 약 1분 지연으로 게시물 하트/조회/등록일/공유/댓글 수집 및 PHP 저장 호출. 기존 EXT 분석본 연결 예정."
    },
    {
      "id": "v041-domain-module-tab-settings",
      "title": "도메인 자동감지와 탭별 모듈 설치/사용 상태 관리",
      "status": "current",
      "items": [
        "현재 URL host로 대표도메인 감지",
        "domains/index.json -> representative index.json -> modules.json 로딩",
        "설치하기/사용하기/수동/자동/테스트 상태 localStorage 또는 chrome.storage 저장",
        "tab_id별 설정 저장/복제/삭제",
        "도메인 모듈 JS 수동 주입 테스트"
      ]
    },
    {
      "id": "v042-home-web-ext-chatgpt-diagnostic",
      "title": "home.yjm.kr WEB+EXT4 상호진단 및 ChatGPT 로그전달",
      "status": "implemented",
      "items": [
        "home.yjm.kr 대표도메인 모듈 yjm_web_ext_selftest 추가",
        "popup home 셀프테스트 버튼",
        "popup ChatGPT 로그전달 버튼",
        "WEB 콘솔 EXT4 수신 진단 표시",
        "diagnostic_log.json.php 서버 로그 저장 API",
        "persistent client token profile vault"
      ]
    }
  ],
  "current_notes": [
    "v033: 헤더의 v배지와 별도 동그라미 접기 메뉴를 제거하고 ☰ 창 메뉴로 단일화한다",
    "v033: 창 메뉴에 스킨 변경/템플릿 변경 진입점을 넣고, 실제 상속형 스킨/템플릿 엔진은 다음 단계에서 확장한다",
    "v033: 접힌 상태 메뉴는 nowrap/overflow hidden/text-overflow ellipsis를 기본으로 한다",
    "v041: 현재 URL 기준 도메인 자동감지, representative domain index.json/modules.json 탐색, 모듈 설치/사용/수동/자동 상태를 tab_id별로 저장하는 구조를 추가했다.",
    "도메인 구조는 AIWK_COMMON/domains/{service_or_group}/{representative_domain}/ 이 대표도메인 공통 위치이며, 그 아래 $folders는 가변 하위 폴더다. 인스타에서는 계정명이 될 수 있다.",
    "EXT와 WEB의 최종 테스트 구조는 home.yjm.kr/aiwk WEB 콘솔 + EXT4 + ChatGPT 탭 전달 + 2차 home Tab BUS 관제 경로로 간다.",
    "1차 실무 MVP에 Instagram 계정 지표 수집을 포함한다. 추출 로직은 기존 EXT 샘플을 연결하고, v041은 설치/사용/실행 자리까지 만든다."
  ],
  "fast_mvp_order": [
    "v036: 2단 노드 상태는 텍스트를 줄바꿈하지 않고 overflow hidden/clip으로 앞부분만 보이게 한다.",
    "v036: 3단 아이콘 상태는 client_id가 아니라 기능 아이콘과 order 번호를 표시한다. client_id는 2단까지만 보인다.",
    "v036: 제어창 팔레트에서 기본 패키지/추가 패키지를 하나씩 추가하고, 추가된 창은 3단 아이콘으로 도킹/관리하는 구조를 빠른 MVP로 잡는다.",
    "v036: ApexCharts, dashboard, Instagram/TikTok hooking, D3 node graph를 패키지 후보로 등록한다.",
    "v036: 서버 저장은 최종 배포 파일 JSON으로 내려받아 초기 배포에 포함하는 방식으로 설계한다.",
    "v040: WEB+EXT4 상호진단 콘솔과 ChatGPT 전달용 JSON 입력 구조",
    "v041: WSS/token/tab_id/same_route 안정화 마무리",
    "v042: 도메인 계층 로더와 모듈 선택 localStorage 저장",
    "v043: 인스타 account metrics 기존 EXT 분석본 연결 준비",
    "v044: 인스타 계정 리스트 수집/표시/PHP 저장 호출 MVP"
  ],
  "packages": [
    {
      "id": "pkg.apex_chart.basic",
      "type": "basic",
      "emoji": "📈",
      "order": 10,
      "title": "ApexCharts 기본 차트",
      "status": "planned",
      "goal": "차트 창/대시보드 창에서 데이터 소스를 선택해 바로 표시한다."
    },
    {
      "id": "pkg.dashboard.basic",
      "type": "basic",
      "emoji": "📊",
      "order": 20,
      "title": "대시보드 기본 패키지",
      "status": "planned",
      "goal": "여러 차트/표/상태 위젯을 zone에 배치한다."
    },
    {
      "id": "pkg.site.instagram_hook",
      "type": "addon",
      "emoji": "💬",
      "order": 30,
      "title": "Instagram 후킹 패키지",
      "status": "planned",
      "goal": "썸네일/게시물 추출, 좋아요/댓글 보조, DB 저장을 도메인 프로필 기반으로 분리한다."
    },
    {
      "id": "pkg.site.tiktok_hook",
      "type": "addon",
      "emoji": "🎵",
      "order": 40,
      "title": "TikTok 후킹 패키지",
      "status": "planned",
      "goal": "영상/댓글/게시물 추출 보조를 도메인 프로필 기반으로 분리한다."
    },
    {
      "id": "pkg.d3.node_graph",
      "type": "addon",
      "emoji": "🕸",
      "order": 90,
      "title": "D3 Node Graph",
      "status": "planned",
      "goal": "2단 노드와 3단 아이콘을 선으로 연결하고 workflow를 시각화한다."
    }
  ],
  "notes": [
    "v036 판단: 실제 차트/인스타/틱톡 후킹 구현은 아직 넣지 않는다. 먼저 패키지 JSON과 팔레트 구조를 고정해야 확장 중 꼬이지 않는다.",
    "v036: 창 왼쪽 ☰ 메뉴에 메뉴 수정 항목을 추가하고, 창 제목/2단 짧은 제목/3단 아이콘/order를 창별로 저장한다.",
    "v036: 2단 노드 상태는 메뉴 수정에서 지정한 짧은 제목을 우선 표시하고, 없으면 overflow hidden/clip으로 앞부분만 표시한다.",
    "v036: 메뉴 수정은 editor 이상 권한으로 두고, 실제 메뉴 항목 추가/삭제/2단 서브메뉴 편집기는 다음 단계에서 패키지/팔레트 관리와 연결한다.",
    "v042: home.yjm.kr/aiwk를 WEB+EXT4 셀프 크로스 테스트 기준 도메인으로 추가했다. EXT4 popup에서 home 셀프테스트와 ChatGPT 로그전달 버튼을 제공한다.",
    "v042: client_id/token은 tab_id에만 묶지 않고 AIWK_CLIENT_PROFILE_VAULT_V042에 지속 프로필로 저장한다. 선택하면 현재 tab_id로 복제해서 사용한다.",
    "v043: domains/index.json 매핑 의존을 끊고, 현재 host 기준 /domains/ → root → base_domain → host 순서의 폴더 자동 상속 로더로 변경했다.",
    "v043: home.yjm.kr 전용 모듈은 AIWK_COMMON/domains/home.yjm.kr/ 위치로 복사했으며, yjm/home.yjm.kr 방식은 새 로더 기준에서 사용하지 않는다.",
    "v043: 각 주요 폴더에 ai_read.md를 추가하여 폴더 역할/상속/주의사항을 빠르게 확인할 수 있게 했다."
  ],
  "fast_plan": [],
  "v036_summary": [
    {
      "id": "v036-project-stage-route-rules",
      "title": "project/stage1/stage2/win/route 규격 확정",
      "status": "planned-done",
      "progress_pct": 52,
      "notes": [
        "무한 그룹 중첩 금지",
        "통신 group 용어 대신 net 사용",
        "업무 묶음은 stage1/stage2 사용",
        "WSS는 net.room.client_id까지만 중계"
      ]
    }
  ],
  "updated_at": "2026-06-03T04:50:00+09:00",
  "v039_notes": [
    "WSS 테스트창 tab_id/token/auth 표시 및 token 전달 누락 수정",
    "popup tab_id별 client_id/token/authPayload 세트 저장",
    "저장된 client_id 선택 시 매칭 token 자동 로드",
    "저장 항목 삭제 버튼 추가",
    "active tab_id가 없으면 fallback tab_id 생성"
  ],
  "mvp_progress_percent": 85,
  "progress": {
    "overall_percent": 70,
    "mvp_percent": 85,
    "note": "v047 테스트 완료 창 자동복원 제외 + 접속창 버튼 배치 정리"
  },
  "v044": {
    "summary": "WEB1 debug bridge, WEB1 log relay, ChatGPT direct relay split, WEB runtime shim."
  },
  "v045": {
    "title": "WEB1 버튼 설명/통신 펄스/디버그 허브",
    "status": "done",
    "items": [
      "popup 버튼 설명과 툴팁 정리",
      "client_id 역할명 가이드",
      "WSS/BUS/NR 송수신 창 테두리 펄스",
      "도메인 모듈 disabled 표시",
      "popup 디버그 JSON 갱신/복사",
      "side panel 디버그는 보류"
    ]
  },
  "versions": {
    "v046": {
      "title": "WSS/BUS/NR popup unified controls",
      "done": [
        "접속창에 WSS/BUS/NR 접속/끊기/접속유지 추가",
        "토큰 로그인 성공 전 통신 제어 disabled",
        "개별 통신창은 버튼보다 상태 색상 중심으로 정리",
        "BUS unregister 및 auto keep 기초 추가",
        "Node-RED N1 선택 연결 상태 제어 추가"
      ]
    },
    "v047": {
      "title": "cleanup completed test windows and popup primary button layout",
      "done": [
        "저장/접속/종료 버튼을 token 바로 아래로 이동",
        "WSS/BUS/NR 제어를 기본 접속 버튼 아래로 배치",
        "테스트 완료/레거시 창을 자동복원 목록에서 제외",
        "필요 시 테스트창은 수동 테스트 관리 또는 메뉴에서 다시 여는 흐름 유지"
      ],
      "next": [
        "WEB1 ↔ CHAT1 ↔ A1 ↔ N1 registry/list/send 상호 통신 테스트",
        "진단 JSON 요약/상세 분리"
      ]
    }
  }
}