{
  "path": "/AIWK_COMMON/rules/aiwk_naming_rules.json",
  "version": "v124-domain-uri-folder-rule",
  "rules": [
    "domains 하단에는 오직 URI 기준 폴더만 둔다. domains/{HTTP_HOST[_PORT]}/{path...}/ 형식만 허용한다.",
    "HTTP_HOST 포트가 80/443이 아니면 ':'를 '_'로 치환한다. 예: n.yjm.kr:87 → domains/n.yjm.kr_87/.",
    "domains 루트에 common/shared/core/folders/account/service_family 같은 추상 폴더를 만들지 않는다.",
    "domains/chatgpt/chatgpt.com/folders/chatGPT/ 또는 domains/instagram/instagram.com/folders/account/ 구조는 폐기한다.",
    "도메인 전용 selector/default/사이트명 함수는 반드시 domains/{HTTP_HOST}/{path...}/ 하위에 둔다.",
    "domains 밖 AIWK_COMMON/core/modules에는 사이트명/도메인명/URL명을 가진 전용 기능을 만들지 않고 범용 API만 둔다.",
    "lib 성격 공용 JS는 yw- 로 시작한다.",
    "AIWK 전용 boot/adapter/runtime 파일은 aiwk_ 또는 aiwk- 접두를 쓴다.",
    "도메인 귀속 파일은 domains/<domain_key>/ 아래에 둔다. 운영 공용 ZIP에 host 전용 파일을 섞지 않는다.",
    "기존 WSS/인증/토큰의 group 용어는 유지한다. group→net 일괄 치환 금지.",
    "route 뒤쪽 /.../... 는 그룹이 아니라 folder_route, 즉 폴더식 논리 경로라고 부른다.",
    "folder_route는 실제 파일 폴더가 아니다. 실제 파일 경로는 dir/path/file_path/asset_dir/package_dir/domain_dir로 부른다.",
    "현재 내부 필드 project/stage1/stage2는 folder1/folder2/folder3 성격의 논리 폴더로 사용한다.",
    "singleton 1은 중복 불가 창, singleton 0은 중복 가능 창이다.",
    "햄버거 ☰ 메뉴는 각 창의 1차 고정 메뉴이며, 2단 메뉴로 기능/접기/구조/패키지를 확장한다.",
    "도메인 기능 파일명은 {dev_key}_{feature_key}.* 형식을 사용한다. 예: yjm_chatgpt_diagnostic.json",
    "같은 feature_key라도 dev_key가 다르면 별도 모듈 후보로 보여주고 사용자가 선택한다.",
    "모듈 사용/미사용 선택은 1차 localStorage, 2차 서버 PHP/JSON 저장으로 확장한다.",
    "ChatGPT 도메인 전달은 #prompt-textarea 입력까지만 하며 자동 전송 클릭은 하지 않는다.",
    "모듈 설치/사용 상태는 사용자 선택이며 먼저 tab_id별 local/chrome storage에 저장한다."
  ],
  "window_singleton_examples": [
    {
      "window_type": "control",
      "singleton": 1
    },
    {
      "window_type": "wss_system",
      "singleton": 1
    },
    {
      "window_type": "manual_test",
      "singleton": 1
    },
    {
      "window_type": "apex_chart",
      "singleton": 0
    },
    {
      "window_type": "d3_chart",
      "singleton": 0
    },
    {
      "window_type": "sns_post",
      "singleton": 0
    }
  ],
  "inherit_order": [
    "global",
    "project_or_folder1",
    "stage1_or_folder2",
    "stage2_or_folder3",
    "win"
  ],
  "inherit_targets": [
    "css",
    "js",
    "skin",
    "template",
    "permission",
    "visible",
    "order",
    "command"
  ],
  "updated_at": "2026-06-12T00:00:00+09:00",
  "domain_folder_examples": [
    "AIWK_COMMON/domains/chatgpt.com/g/index.js",
    "AIWK_COMMON/domains/nssb.green-net.or.kr/y/yyy_view.php/index.json.js",
    "AIWK_COMMON/domains/n.yjm.kr_87/aiwk/ws/index.js"
  ],
  "domain_structure_v041": {
    "representative_common": "AIWK_COMMON/domains/{service_or_group}/{representative_domain}/",
    "optional_custom_folder": "AIWK_COMMON/domains/{service_or_group}/{representative_domain}/$folders/",
    "example_instagram_common": "AIWK_COMMON/domains/instagram/www.instagram.com/yjm_account_metrics_collect.js",
    "example_instagram_account_custom": "AIWK_COMMON/domains/instagram/www.instagram.com/anymall1004/yjm_fan_manage.js"
  },
  "domain_folder_inheritance_v043": {
    "deprecated": true,
    "replaced_by": "domain_structure_v124",
    "reason": "family/root/base-domain/folders 방식은 혼란을 만들어 폐기"
  },
  "domain_structure_v124": {
    "rule": "AIWK_COMMON/domains/{HTTP_HOST[_PORT]}/{path...}/ only",
    "no_root_common": true,
    "port_rule": "80/443 기본 포트는 생략, 그 외 포트는 : 를 _ 로 치환",
    "examples": {
      "https://chatgpt.com/g/g-xxx/c/yyy": [
        "domains/chatgpt.com/",
        "domains/chatgpt.com/g/",
        "domains/chatgpt.com/g/g-xxx/",
        "domains/chatgpt.com/g/g-xxx/c/",
        "domains/chatgpt.com/g/g-xxx/c/yyy/"
      ],
      "http://n.yjm.kr:87/aiwk/ws": [
        "domains/n.yjm.kr_87/",
        "domains/n.yjm.kr_87/aiwk/",
        "domains/n.yjm.kr_87/aiwk/ws/"
      ]
    }
  }
}
