AI용 분할본 · 지도 1단계(준비·결정서) · 이 페이지 전에 읽을 페이지: PART 0 사용법·AI 시작 지침 · 코드 파일은 여기 없다 — 코드 자리의 줄을 따른다(폴더에 책 파일이 하나도 없는 처음이면 부록 A-2 의 curl 한 줄부터)

핵심 규칙 — AI 는 어느 페이지에서든 이것을 지킨다

  1. 사용자가 제작 결정서를 명시적으로 승인하기 전에는 코드를 한 줄도 쓰지 않는다. 승인 뒤에는 결정서에 없는 질문·기능을 더하지 않고, 결정서 범위를 끝까지 완주한다.
  2. 책 코드 파일은 손으로 옮겨 쓰거나 다시 쓰지 않는다 — node scripts/get-book-code.mjs 가 책 그대로 만든다(첫 실행은 부록 A-2 의 curl 한 줄). AI용 분할본의 코드 자리는 " 경로" 한 줄이다 — 그 파일을 cat 으로 읽는다. 고쳐도 되는 파일은 PART 0 [AI 시작 지침] 5-b 의 목록뿐이다.
  3. 매 push 와 완료 보고 전에 node scripts/verify-book-code.mjs 를 실행해 "불일치 0개" 출력을 그대로 보인다.
  4. API 키·비밀번호 값을 채팅·코드·로그·PROGRESS.md 에 적지 않는다. 환경변수는 "이름 + 설정 완료 여부"만 보고받는다.
  5. 확인은 AI 가 직접 명령을 실행해 출력으로 증명한다. push ≠ 배포 — 실서버 /api/health 의 commit 이 내 마지막 커밋과 같아지기 전에는 "배포됐다"고 말하지 않는다.
  6. AI 는 지도(https://console.hrum.ai/sajuEbook/ — 같은 지도가 sajuEbook/ai.html 에도 있다)의 단계 순서대로 그 단계의 페이지만 읽는다. 진행 상황은 PROGRESS.md 에 적고, 이어서 할 때는 지도의 다음 단계로 간다 — 승인된 결정서를 다시 묻지 않는다. 전체본 sajuEbook.html 은 사람용이다(링크를 못 여는 도구에 첨부할 때만 AI 가 전체를 읽는다).
  7. 사용자가 직접 만들기 어려워하면(설치·배포에서 같은 곳에 반복해 막히거나, 직접 만들기를 원하지 않으면) 흐름의 제작 지원 페이지 https://hrum.ai/app-development.html#support 를 안내한다. 가격은 그 페이지를 보여 주고 직접 말하지 않는다.

PART 1 — 15분 준비운동

1-0. 시작 전 확인 — 도구 고르기와 Node

가입보다 먼저 정합니다. 어떤 도구를 쓰느냐에 따라 1-1 에서 갈 길이 달라집니다.

갈 길 정리: 내 컴퓨터에서 도는 Codex·Cursor·Claude Code 는 1-1 의 기본 경로(MCP), 웹에서 쓰는 Codex 는 1-1 의 대안 경로(콘솔에서 직접 가입 + API 키 페이지)입니다. 이 책의 프롬프트는 어느 도구에서든 동작하도록 작성되어 있습니다.

Node 확인 — Node 는 내 컴퓨터에서 자바스크립트 프로그램(이 책의 앱 코드·HRUM MCP)을 돌리는 실행기입니다. 이 책은 Node 22.12 이상(22 LTS 권장)이 필요합니다.

  1. 터미널을 엽니다 — macOS 는 「터미널」 앱, Windows 는 시작 메뉴에서 「PowerShell」
  2. node -v 를 입력하고 Enter 를 누릅니다
  3. v22.12.0 이상(예: v22.20.0, v24.11.0)이 나오면 통과입니다

여기서 막히면: 「node 용어가 … 인식되지 않습니다」「command not found」가 나오거나 v20.… 처럼 낮으면 nodejs.org 에서 LTS 를 설치합니다. 설치한 뒤에는 터미널을 닫았다가 새로 열고 node -v 를 다시 칩니다(열려 있던 창은 새 설치를 모릅니다).

1-1. HRUM(흐름) 콘솔 가입과 API 키 발급

먼저 갈림길 하나 — 이미 콘솔(console.hrum.ai)에서 가입했나요?
① 예: MCP 가입은 건너뜁니다. 아래 대안 경로의 마지막 두 단계(API 키 페이지에서 새 키 발급)만 하고 1-2 로 갑니다. 대시보드에 「키 발급됨」이나 float_live_… 가 보여도 새로 만듭니다 — 그 키는 가입할 때 자동으로 만든 것이라 값을 받은 적이 없습니다.
② 아니요, 처음입니다: 1-0 에서 고른 도구대로 갑니다 — 내 컴퓨터의 도구면 아래 기본 경로(MCP), 웹 Codex 면 대안 경로입니다.

사람이 할 일 — 3줄 요약 (아래 「AI가 할 일」은 AI 몫이라 용어를 몰라도 됩니다):

  1. AI 에게 "HRUM 연결 도구(MCP)를 설치해 주세요"라고 하고, 가입할 이메일 주소를 알려 줍니다. MCP 는 AI 가 내 HRUM 계정을 대신 다룰 수 있게 해 주는 연결 도구입니다
  2. 메일함에서 HRUM 메일을 열고, AI 가 알려 준 두 자리 숫자를 고르거나 입력해 승인합니다
  3. AI 창으로 돌아와 "승인했어요"라고 말합니다 — 이 말이 없으면 AI 가 승인 결과를 가져가지 못한 채 멈출 수 있습니다

기본 경로 — HRUM MCP 로 가입하고 키를 바로 저장: AI 코딩 도구에 HRUM MCP(AI 가 내 HRUM 계정을 대신 다룰 수 있게 해 주는 연결 도구 — 내 컴퓨터에서 돕니다)를 등록하면 가입 신청과 키 저장을 AI 가 합니다. 사람이 할 일은 이메일 주소를 알려 주고, 메일로 온 HRUM 승인 화면에서 숫자 하나를 누르는 것뿐입니다. 키 값은 MCP 가 .env.local 에 직접 쓰고 AI 에게는 키 앞부분(접두어)만 돌려주므로 채팅에 키가 나오지 않습니다. 로컬 명령을 실행할 수 없는 환경(예: 웹에서 돌아가는 Codex)이나 아래 순서가 막히면 이 절 뒤의 대안 경로(콘솔에서 직접 가입)로 갑니다.

AI가 할 일 — 순서대로 (AI 몫입니다. 사람은 위 3줄 요약만 하면 되고, 아래 코드·오류 이름은 몰라도 됩니다):

  1. MCP 등록: 지금 쓰는 도구에 맞는 아래 설정을 넣습니다(Node 22.12 이상 — 1-0 에서 확인). 등록 뒤 hrum_ 로 시작하는 도구가 보이지 않으면 PROGRESS.md 에 "1-1 MCP 등록 완료"를 적고, 사용자에게 도구를 다시 시작(새 세션)해 달라고 한 뒤 이어서 합니다.
  2. 가입 신청: 사용자에게 가입할 이메일 주소를 묻고 hrum_signup_start 를 부릅니다(email 에 그 주소). 이미 HRUM 계정이 있는 주소여도 같은 도구를 씁니다 — 새 가입인지 기존 계정 연결인지는 서버가 정합니다. 이 순서를 하는 동안 hrum_ai_connect 같은 다른 연결 도구는 같이 시작하지 않습니다 — 승인 메일 하나만 진행합니다(두 연결이 섞이면 사람이 승인한 쪽 결과를 가져가지 못합니다).
  3. 메일 승인 안내: 응답의 matchCode(두 자리 숫자)를 사용자에게 그대로 알리고 이렇게 안내합니다: "메일함에서 HRUM 메일을 열어 승인하세요. 새 계정이면 화면의 숫자 중 NN 을 고르고, 이미 가입된 계정이면 NN 을 직접 입력하세요. 내가 요청하지 않은 메일이면 거부하세요. 승인 버튼을 누른 뒤에는 이 창으로 돌아와 '승인했어요'라고 말해 주세요." 메일이 몇 분 안에 안 오면 스팸함을 보게 합니다.
  4. 승인 기다리기: hrum_signup_status 를 부릅니다(사용자가 "승인했어요"라고 하면 바로 다시 부릅니다 — 승인 결과는 이 도구로만 가져옵니다). 한 번에 최대 50초 기다리고 돌아오며, pending 이면 다시 부릅니다(15분 안). denied 면 멈추고 사용자에게 알립니다(스스로 다시 신청하지 않습니다). expired 면 사용자가 원할 때만 2번부터 다시 합니다.
  5. 새 계정(scope: "full") — 키 발급: 프로젝트 폴더의 .gitignore 에 .env* 가 들어 있는지 확인한 뒤(1-2 의 1번 — 프로젝트 폴더가 아직 없으면 코드 받기 뒤로 미룹니다) hrum_issue_key 를 부릅니다(label 은 "운세앱 개발용"). 응답의 saved: true·gitignored: true·keyPrefix 만 사용자에게 보입니다. gitignored: false 면 .gitignore 를 고치고 git check-ignore .env.local 로 다시 확인합니다. 이것으로 1-2 의 2·3번(사용자가 붙여넣기)은 건너뜁니다.
  6. 기존 계정 연결(scope: "limited"): 보안상 조회만 되는 연결이라 hrum_issue_key 가 거부됩니다(MCP_LOGIN_SESSION_LIMITED). 사용자에게 API 키 페이지에서 직접 발급하게 하고, 저장은 1-2 의 붙여넣기 순서대로 합니다.
  7. 실패하면 대안 경로로: 등록이 안 되거나 도구가 안 보일 때, 429(MCP_EMAIL_BUDGET·MCP_BUSY·같은 네트워크 시간당 5회 초과)·503(MCP_MAIL_FAILED·MCP_DISABLED)이 나올 때는 같은 호출을 되풀이하지 말고 아래 대안 경로로 갑니다. 도구 응답의 message 는 사용자에게 그대로 전해도 되는 문장입니다.

MCP 등록 설정 (책 코드 파일이 아니라 도구 설정입니다 — 프로젝트에 파일로 저장하지 않아도 됩니다. Cursor 만 설정 파일을 씁니다):

도구 설정 — Claude Code (터미널에서 한 줄)
claude mcp add hrum -- npx -y https://console.hrum.ai/mcp/hrum-mcp-0.3.1.tgz

Cursor — 프로젝트의 .cursor/mcp.json(모든 프로젝트에서 쓰려면 ~/.cursor/mcp.json). 저장한 뒤 Cursor 설정의 MCP 목록에서 hrum 이 켜져 있는지 봅니다:

도구 설정 — Cursor (.cursor/mcp.json)
{
  "mcpServers": {
    "hrum": { "command": "npx", "args": ["-y", "https://console.hrum.ai/mcp/hrum-mcp-0.3.1.tgz"] }
  }
}

Codex — 터미널에서 codex mcp add hrum -- npx -y https://console.hrum.ai/mcp/hrum-mcp-0.3.1.tgz 를 실행하거나, ~/.codex/config.toml 에 아래를 넣습니다(첫 실행은 내려받느라 느리고, 승인 기다리기는 한 번에 최대 50초라 시간 제한을 넉넉히 둡니다):

도구 설정 — Codex (~/.codex/config.toml)
[mcp_servers.hrum]
command = "npx"
args = ["-y", "https://console.hrum.ai/mcp/hrum-mcp-0.3.1.tgz"]
startup_timeout_sec = 60
tool_timeout_sec = 120
보안 약속 — AI 는 비밀번호와 카드 번호를 묻지 않습니다(이 경로에는 비밀번호가 필요 없습니다). 승인 링크는 사용자의 메일로만 가고, AI 는 그 링크를 열거나 누르지 않습니다. 키 값은 화면·채팅·로그에 출력하지 않습니다 — AI 는 cat .env.local 처럼 키 파일을 열어 보이지 않고, 확인은 변수 존재 여부와 git check-ignore .env.local 로만 합니다. MCP 파일은 버전이 붙은 주소로 배포되며 한 번 올린 파일은 바뀌지 않습니다(체크섬: console.hrum.ai/mcp/SHA256SUMS).

대안 경로 — 콘솔에서 직접 가입 (MCP 를 쓸 수 없거나 위 순서가 실패했을 때):

AI가 먼저 할 일: 브라우저 기능이 있으면 공식 로그인 페이지 console.hrum.ai/login.html을 직접 엽니다. 브라우저 기능이 없으면 이 링크를 사용자에게 줍니다. 사용자가 OAuth 승인·이메일·비밀번호·메일 인증을 직접 마칠 때까지 기다리고, 로그인된 콘솔 화면이 보이면 다음 단계로 갑니다.

(잃어버리면? 폐기하고 다시 발급하면 됩니다. 키는 여러 개 만들 수 있어요)

이 키는 곧 "돈"입니다. AI에게 키 값을 말하거나 채팅·소스코드·스크린샷·로그에 붙여넣지 마세요. AI에게는 값 대신 "FLOAT_API_KEY 저장 완료"라고만 알려줍니다.

1-2. HRUM 키를 안전하게 저장 — 값은 사용자만 입력

이름 정리: 서비스 이름은 HRUM 이지만 키 앞부분(float_live_)과 변수 이름(FLOAT_API_KEY)은 옛 서비스 이름(FLOAT)을 그대로 씁니다 — HRUM 키가 맞습니다. .env.local 은 내 컴퓨터에서만 쓰는 비밀 설정 파일로, 앱이 시작할 때 이 파일에서 키를 읽습니다.

MCP 경로(1-1 기본 경로)로 키를 저장했다면 아래 1번과 4번만 합니다 — 2·3번(빈 자리 만들기·붙여넣기)은 hrum_issue_key 가 이미 했습니다. 기존 계정 연결이라 콘솔에서 키를 발급했거나 대안 경로로 왔다면 1~4번을 모두 합니다.

  1. AI가 먼저 .gitignore에 .env*가 있는지 확인합니다. 없으면 추가한 뒤 git check-ignore .env.local이 경로를 출력하는지 검증합니다
  2. AI는 프로젝트 루트의 .env.local에 값이 빈 FLOAT_API_KEY= 자리만 만듭니다. 키 값을 요구하거나 읽거나 출력하지 않습니다
  3. 사용자가 직접 .env.local 을 열어 등호 뒤에 발급 키를 붙여넣고 저장합니다. 채팅에는 키 대신 "FLOAT_API_KEY 저장 완료"라고만 답합니다. 처음이면 아래 순서대로 합니다:
    • 파일 위치: 프로젝트 폴더 맨 위(package.json 과 같은 곳). 이름이 점(.)으로 시작해 파일 탐색기에 안 보일 수 있습니다 — Windows 탐색기는 위쪽 「보기」 → 「표시」 → 「숨긴 항목」을 켭니다(Windows 10 은 「보기」 탭의 「숨긴 항목」 체크). macOS Finder 는 Command+Shift+. (마침표)
    • 편집기: 글자만 쓰는 프로그램이면 됩니다. Cursor·VS Code 는 왼쪽 파일 목록에서 .env.local 을 누릅니다. macOS 터미널에서는 open -e .env.local 로 텍스트 편집기가 열립니다
    • Windows 메모장: 프로젝트 폴더에서 PowerShell 을 열고 notepad .env.local 을 입력하면 그 이름 그대로 열립니다(파일이 없다고 하면 「예」로 새로 만듭니다). 메모장의 「다른 이름으로 저장」으로 새로 만들 때는 파일 형식을 「모든 파일 (*.*)」로 바꾸고 이름을 .env.local 로 적습니다 — 그대로 두면 .env.local.txt 로 저장되어 앱이 키를 읽지 못합니다
    • PowerShell 로 이름 확인: Get-ChildItem -Force .env* 에 .env.local 이 보이면 맞습니다. .env.local.txt 로 보이면 Rename-Item .env.local.txt .env.local
    • 줄 모양: FLOAT_API_KEY=float_live_여기에붙여넣기 — 따옴표·공백 없이 한 줄입니다. 붙여넣은 뒤 저장(Ctrl+S, macOS 는 Command+S)을 꼭 누릅니다
  4. AI는 키 값을 출력하지 않고 변수 존재 여부와 git check-ignore .env.local만 검증합니다. 로그·diff·cat .env.local로 값을 노출하면 안 됩니다. 그다음 1-3 키 확인으로 갑니다

배포할 때(PART 8)는 사용자가 콘솔의 내 앱 → 환경변수 입력칸에 키를 직접 붙여넣습니다(암호화 저장). AI는 값 자체를 받지 않고 설정 완료 신호만 받습니다.

1-3. 키가 진짜 되는지 확인 — PART 2 전에 꼭

키를 저장했으면(1-2) 앱을 만들기 전에 HRUM 에 한 번 물어봅니다. 이 확인을 건너뛰면 앱을 다 만든 뒤에야 401(키가 없거나 틀렸다는 뜻)을 만납니다. 쓰는 주소는 크레딧 잔액 조회라 요금이 들지 않습니다. 프로젝트 폴더와 .env.local 이 아직 없으면(코드 받기 전) 코드 받기와 1-2 를 마친 바로 뒤에 합니다.

AI가 할 일: 프로젝트 폴더(.env.local 이 있는 곳)에서 아래 명령을 실행하고 출력 한 줄을 그대로 보입니다. 키 값은 화면에 나오지 않고 응답 번호만 나옵니다. 200 이 나오기 전에는 PART 2 로 넘어가지 않습니다.

키 확인 — AI 가 실행 (macOS 터미널·Windows PowerShell 공통)
node --env-file=.env.local -e "fetch('https://api.hrum.ai/api/v1/partners/v1/credits/balance',{headers:{'X-Partner-Api-Key':process.env.FLOAT_API_KEY||''}}).then(async r=>{const j=await r.json().catch(()=>({}));console.log(r.status, r.status===200?'키 정상':(j.hint||j.message||''))})"

사람이 직접 해 보고 싶다면(AI 창이 아니라 내 터미널에서 — 키를 채팅에 붙여넣지 않습니다): 아래 줄의 <여기에 새 키> 를 꺾쇠까지 지우고 그 자리에 키를 붙여넣어 실행합니다. Windows PowerShell 에서는 curl 대신 curl.exe 라고 칩니다.

키 확인 — 사람이 내 터미널에서 (curl)
curl -i https://api.hrum.ai/api/v1/partners/v1/credits/balance -H "X-Partner-Api-Key: <여기에 새 키>"

결과 읽기:

여기서 막히면 (401) — 위에서부터 하나씩 봅니다:

  1. 키를 새로 만들었나요? 대시보드에 「키 발급됨」·float_live_… 가 보이는 것만으로는 안 됩니다 — 가입할 때 자동으로 만든 키라 값을 받은 적이 없습니다. 대시보드 「API 키」에서 새 키 만들기(또는 API 키 페이지의 발급)를 누르고, 한 번 보이는 값을 복사해 1-2 대로 저장합니다
  2. 값이 파일에 들어갔나요? 줄 모양이 FLOAT_API_KEY=float_live_… 처럼 등호 뒤에 바로 키가 붙어 있어야 합니다(따옴표·공백 없이). 저장을 안 눌렀거나 파일이 .env.local.txt 로 저장된 경우가 흔합니다(1-2 의 Windows 안내)
  3. 프로젝트 폴더에서 실행했나요? node: .env.local: not found 가 나오면 .env.local 이 없는 폴더에서 실행한 것입니다. package.json 이 있는 폴더로 옮겨 다시 실행합니다
  4. 그래도 401 이면 그 키를 API 키 페이지에서 폐기하고 새로 발급해 1-2 부터 다시 합니다

나중에 로컬에서 앱을 띄운 뒤 화면이 「요청을 처리하지 못했어요」「앱 설정(API 키)이 비어 있어요」로 멈출 때도 원인은 대부분 이 키입니다 — 이 절로 돌아와 같은 확인을 합니다(부록 D).

1-4. 코드 보관 고르기 — GitHub 는 선택

8-1 에서 이 절로 왔다면 아래 절차대로 가입하고 Private 저장소를 만든 뒤 8-1 로 돌아갑니다.

결정서 14번(코드 보관)에서 고른 대로 합니다. GitHub Private 저장소를 골랐으면 지금 가입하고 저장소를 만듭니다 — 컴퓨터가 고장 나도 코드가 남고, RIDM Apps는 GitHub 저장소에서만 코드를 가져가 빌드하므로 PART 8 웹 배포에 바로 연결됩니다. 내 컴퓨터 git 만을 골랐으면 이 절을 건너뛰고 8-1 에서 합니다 — PART 7 까지는 GitHub 없이 내 컴퓨터에서 만들고 테스트할 수 있습니다. 그때까지 컴퓨터 고장에 대비해 프로젝트 폴더를 가끔 다른 곳에 복사해 두세요.

GitHub 를 고른 경우: AI는 브라우저 기능이 있으면 GitHub 가입을 직접 엽니다. 사용자가 계정 입력·메일 인증·약관 동의를 직접 하고 "완료"라고 답하면 계속합니다. 브라우저 기능이 없으면 같은 공식 링크와 지금 해야 할 입력, 완료 뒤 보여야 할 화면을 안내합니다.

1-5. RIDM Apps — 여러분 앱이 올라갈 곳 (미리 알아두기)

RIDM Apps는 HRUM 콘솔 안에 있는 앱 호스팅입니다. 신청은 PART 8에서 하지만, 만드는 방식에 영향을 주는 규칙이라 AI가 코딩 전에 알고 있어야 합니다.

항목내용코드에 미치는 영향
주소<이름>.ridm.ai — 신청할 때 정하고, 한 번 정하면 바꿀 수 없습니다없음
플랜무료: 메모리 128MB·DB 100MB·월 전송 1GB, 파트너당 앱 1개, 15분 동안 방문이 없으면 잠들고 다음 방문 때 몇 초 안에 깨어납니다 · 베이직 19,900원/월(부가세 별도 · 부가세 포함 21,890원): 512MB·DB 1GB·10GB, 항상 켜짐 · 프로 49,000원/월(부가세 별도 · 부가세 포함 53,900원): 1GB·DB 3GB·50GB·앱 3개. 콘솔 크레딧에서 매월 차감이 책의 앱은 실행 중 메모리가 실측 44MB라 무료 플랜으로 충분합니다(상담 20회 뒤 측정)
빌드저장소 루트의 Dockerfile로 빌드(linux/amd64, 20분 한도). 저장소를 연결하면 바로 첫 빌드, 이후 push 마다 자동 빌드Dockerfile 필수 — PART 8의 [완전 코드]
첫 배포 공개빌드가 성공하면 첫 배포도 바로 공개됩니다. 빌드 검사(외부 접속 호스트·위험 코드 패턴·npm audit·이미지 취약점)는 그대로 돌고, 문제가 확인되면 운영자가 나중에 공개를 중지할 수 있습니다npm audit 결과는 package.json을 고치지 말고 보고(8-0)
실행 환경포트 3000, 사용자 1000(비루트), 읽기 전용 파일시스템(쓰기는 /tmp·/app/.next/cache 만, 둘 다 재시작 시 사라짐), 시작 후 10초 안에 / 응답, WebSocket 미지원파일에 저장하지 말고 DB에. output: 'standalone'
DB앱마다 전용 PostgreSQL. 접속 정보 DATABASE_URL 자동 주입, 인증서 검증 TLS(인증서는 컨테이너에 설치돼 있어 코드 설정 불필요), 연결 3개 한도, 쿼리 10초 한도, 용량 한도를 넘긴 채 24시간이 지나면 읽기 전용pg 1개, Pool({ max: 2 }) — 7-2의 lib/db.ts
쿠키관문이 쿠키를 앱 주소에만 묶습니다: 서버 응답의 Set-Cookie는 브라우저에 __Host-이름으로 저장되고, 앱에는 원래 이름으로 돌아옵니다. 브라우저 JS(document.cookie)로 만든 쿠키는 서버에 전달되지 않습니다세션 쿠키는 평범한 이름(session)으로 서버에서만 설정
환경변수콘솔 → 내 앱 → 환경변수(암호화 저장, 저장하면 앱이 새 값으로 다시 시작). PORT·HOSTNAME·NODE_OPTIONS·DATABASE_URL, RIDM_·PG로 시작하는 이름은 플랫폼 몫이라 설정할 수 없습니다여러분이 넣는 값은 FLOAT_API_KEY 하나(관리자 페이지 B-7 을 켜면 ADMIN_PATH·ADMIN_PASSWORD 추가). NEXT_PUBLIC_ 변수 없음
결제결제는 여러분이 카드 결제 대행사(PG)와 직접 계약해 붙입니다(보통 사업자 등록 필요). 이 책의 코드에는 결제가 없습니다9-4

자세한 규칙은 콘솔의 호스팅 문서와 요금 페이지가 기준입니다. 이 표와 다르면 그쪽이 맞습니다.

AI용 분할본 · 지도 1단계(준비·결정서) · 이 페이지 전에 읽을 페이지: PART 0 사용법·AI 시작 지침 · 코드 파일은 여기 없다 — 코드 자리의 줄을 따른다(폴더에 책 파일이 하나도 없는 처음이면 부록 A-2 의 curl 한 줄부터)