# HRUM(흐름) > HRUM(흐름) — 운영: 플로트 주식회사(FLOAT Co., Ltd.). 기본 주소 https://hrum.ai (사이트·문서) · https://api.hrum.ai (API) · https://console.hrum.ai (콘솔: 가입·API 키·결제) (기존 api.float.do·console.float.do 도 그대로 동작) > 사주 분석·AI 리딩·기억하는 LLM(RIDM Memory)을 하나의 API로 제공하는 한국 B2B SaaS. 만든 앱은 RIDM Apps 호스팅으로 공개하고, 코드 없이 사주·운세 블록을 골라 앱을 조립하는 편집기 「바로」도 있다(미리보기 단계). 코드로 만든 호스팅 앱은 이용자 결제(흐름 결제)와 판매 대금 정산도 된다(바로로 만든 앱 안의 결제받기는 준비 중). 종량제 과금, 가입 시 무료 크레딧 제공. 국내 특허 등록(제10-3009272호), 과기정통부 GPU 지원사업 선정, Hugging Face 공개 모델 보유. ## AI 도우미 안내 (먼저 읽기) hrum.ai 링크만 받은 AI 코딩 도구는 이 순서로 진행한다. 단계별 상세 지침은 고른 책의 지도 페이지에 있고, 이 절은 그 요약이다. 책별 단계 지도 전체는 [llms-full.txt](https://hrum.ai/llms-full.txt)에 있다. 1. 어떤 앱인지 먼저 사용자에게 묻고 책을 고른다. 고른 책의 지도(첫 페이지)를 열고, 단계 순서대로 지금 단계의 페이지만 읽는다. 애매하면 통합 운세 책으로 간다([책 고르기](https://hrum.ai/ebook/)). - 사주·운세(만세력·궁합·자미두수·별자리·타로·꿈해몽) 앱 → [통합 운세 책](https://hrum.ai/sajuEbook/). 주제 하나만이면 단독판: [사주만](https://hrum.ai/sajuEbook/saju/) · [자미두수만](https://hrum.ai/sajuEbook/ziwei/) · [점성술만](https://hrum.ai/sajuEbook/astro/) · [타로만](https://hrum.ai/sajuEbook/tarot/) · [꿈해몽만](https://hrum.ai/sajuEbook/dream/) - 기억하는 캐릭터 채팅 → [AI앱 책](https://hrum.ai/aiEbook/) - AI 없는 회원제 웹앱(로그인·DB·게시판·메모) → [그냥 앱 책](https://hrum.ai/hostingEbook/) - 토스 앱 안의 앱인토스 미니앱 → [토스 미니앱 책](https://hrum.ai/tossEbook/) 2. HRUM API 키는 사용자가 직접 발급한다. [콘솔](https://console.hrum.ai/login.html)에 가입·이메일 인증 → [API 키 화면](https://console.hrum.ai/apikeys.html)에서 발급(발급 직후 한 번만 보인다). 키 값을 채팅으로 달라고 하지 않고, 저장했는지만 묻는다. 그냥 앱 책은 키가 필요 없다. 3. API는 서버에서 부른다. 모든 요청은 `https://api.hrum.ai/api/v1/partners/v1/` 아래 경로, 키는 `X-Partner-Api-Key` 헤더. 주요 경로: `POST /api/v1/partners/v1/manseryeok` ([만세력](https://hrum.ai/docs.html#saju-api)) · `/api/v1/partners/v1/reading` ([AI 사주 리딩](https://hrum.ai/docs.html#reading-api)) · `/api/v1/partners/v1/compat` ([궁합](https://hrum.ai/docs.html#compat-api)) · `/api/v1/partners/v1/ziwei-chart` ([자미두수](https://hrum.ai/docs.html#ziwei-api)) · `/api/v1/partners/v1/natal-chart` ([네이탈 차트](https://hrum.ai/docs.html#natal-api)) · `/api/v1/partners/v1/tarot` ([타로](https://hrum.ai/docs.html#tarot-api)) · `/api/v1/partners/v1/today` ([오늘의 운세](https://hrum.ai/docs.html#today-api)) · `/api/v1/partners/v1/dream` ([꿈해몽](https://hrum.ai/docs.html#dream-api)) · `/api/v1/partners/v1/chat/completions` ([기억하는 AI 채팅](https://hrum.ai/docs.html#ridm-memory-api)). 첫 호출 순서는 [시작 가이드](https://hrum.ai/getting-started.html), 전체는 [API 가이드](https://hrum.ai/docs.html). 4. 공개는 RIDM Apps로 한다. GitHub 저장소를 연결하고 푸시하면 빌드되어 공개된다([배포 흐름](https://hrum.ai/hosting-docs.html#flow)). 키는 저장소가 아니라 앱 환경변수 `HRUM_API_KEY`에 넣는다([환경변수](https://hrum.ai/hosting-docs.html#env)). 앱 상세의 「AI 연결」을 켠 앱은 플랫폼이 키를 넣으므로 직접 넣지 않는다. 비밀값은 [비밀키 안전 규칙](https://hrum.ai/hosting-docs.html#env-safety)대로 다룬다. 5. 토스 앱 안의 미니앱: 코드로 만들면 [토스 미니앱 책](https://hrum.ai/tossEbook/) — 키를 지키는 서버를 RIDM Apps에 두고 미니앱은 그 서버만 부른다. 코드 없이 만들면 [바로](https://hrum.ai/baro.html) 편집기([편집기 열기](https://console.hrum.ai/baro-app-editor.html))의 배포 화면에서 「앱인토스 미니앱 꾸러미」를 받아 앱인토스 콘솔에 올린다. 앱인토스 가입·검수·출시는 사용자가 직접 한다. 6. 자주 하는 실수 - API 키를 브라우저·앱 코드·미니앱·저장소·채팅·로그에 넣기 — 키는 서버 환경변수에만 둔다. - 헤더 이름을 다르게 쓰기 — `X-Partner-Api-Key`가 아니면 인증 오류. - Python `urllib` 기본 User-Agent로 부르기 — 보안 규칙에 막힌다. `User-Agent` 헤더를 직접 넣는다. - 모르는 출생 시각을 아무 값으로 채우기 — `hour`·`minute`를 비우면 시주를 빼고 계산한다. - 잔액 부족을 `code` 값으로만 판단하기 — 응답 상태 코드로 판단한다([에러 코드](https://hrum.ai/docs.html#errors)). - 사용자가 제작 결정서를 승인하기 전에 코드를 쓰거나, 책 코드를 손으로 다시 쓰기 — 책 코드는 `get-book-code`가 책 그대로 만든다. - 푸시하자마자 배포됐다고 말하기 — 실서버 `/api/health`의 commit이 마지막 커밋과 같아진 뒤에 말한다. ## 바로가기 (이 문서에 나오는 링크 전부) - [HRUM 사이트](https://hrum.ai) - [HRUM 콘솔](https://console.hrum.ai) - [llms-full.txt](https://hrum.ai/llms-full.txt) - [책 고르기](https://hrum.ai/ebook/) - [통합 운세 책](https://hrum.ai/sajuEbook/) - [사주만](https://hrum.ai/sajuEbook/saju/) - [자미두수만](https://hrum.ai/sajuEbook/ziwei/) - [점성술만](https://hrum.ai/sajuEbook/astro/) - [타로만](https://hrum.ai/sajuEbook/tarot/) - [꿈해몽만](https://hrum.ai/sajuEbook/dream/) - [AI앱 책](https://hrum.ai/aiEbook/) - [그냥 앱 책](https://hrum.ai/hostingEbook/) - [토스 미니앱 책](https://hrum.ai/tossEbook/) - [콘솔](https://console.hrum.ai/login.html) - [API 키 화면](https://console.hrum.ai/apikeys.html) - [만세력](https://hrum.ai/docs.html#saju-api) - [AI 사주 리딩](https://hrum.ai/docs.html#reading-api) - [궁합](https://hrum.ai/docs.html#compat-api) - [자미두수](https://hrum.ai/docs.html#ziwei-api) - [네이탈 차트](https://hrum.ai/docs.html#natal-api) - [타로](https://hrum.ai/docs.html#tarot-api) - [오늘의 운세](https://hrum.ai/docs.html#today-api) - [꿈해몽](https://hrum.ai/docs.html#dream-api) - [기억하는 AI 채팅](https://hrum.ai/docs.html#ridm-memory-api) - [시작 가이드](https://hrum.ai/getting-started.html) - [API 가이드](https://hrum.ai/docs.html) - [배포 흐름](https://hrum.ai/hosting-docs.html#flow) - [환경변수](https://hrum.ai/hosting-docs.html#env) - [비밀키 안전 규칙](https://hrum.ai/hosting-docs.html#env-safety) - [바로](https://hrum.ai/baro.html) - [편집기 열기](https://console.hrum.ai/baro-app-editor.html) - [에러 코드](https://hrum.ai/docs.html#errors) - [사주 API 소개](https://hrum.ai/saju-api.html) - [만세력 API 소개](https://hrum.ai/manseryeok-api.html) - [궁합 API 소개](https://hrum.ai/compat-api.html) - [사주 풀이 API 소개](https://hrum.ai/saju-reading-api.html) - [오늘의 운세 API 소개](https://hrum.ai/today-api.html) - [자미두수 API 소개](https://hrum.ai/ziwei-api.html) - [점성술 API 소개](https://hrum.ai/astrology-api.html) - [평생 사주 API 소개](https://hrum.ai/lifetime-api.html) - [꿈해몽 API 소개](https://hrum.ai/dream-api.html) - [타로 API 소개](https://hrum.ai/tarot-api.html) - [운 흐름 API 소개](https://hrum.ai/saju-flow-api.html) - [앱 호스팅 소개](https://hrum.ai/app-hosting.html) - [배포 가이드](https://hrum.ai/hosting-docs.html) - [도메인 찾기](https://hrum.ai/domain-search.html) - [AI로 콘솔 관리하기](https://hrum.ai/docs.html#console-ai) - [HRUM MCP 패키지](https://console.hrum.ai/mcp/hrum-mcp-0.3.2.tgz) - [AI 사주 리딩 포함 항목](https://hrum.ai/docs.html#reading-modules) - [AI 사주 리딩 — AI 하나만 따로](https://hrum.ai/docs.html#reading-only) - [hrum.ai/tarot/cards/v2/SOURCES.md](https://hrum.ai/tarot/cards/v2/SOURCES.md) - [타로 Waite 근거 kb](https://hrum.ai/docs.html#tarot-kb) - [점성술 토탈 API](https://hrum.ai/docs.html#astrology-api) - [운 흐름 API](https://hrum.ai/docs.html#saju-flow-api) - [사주↔MBTI 비교 API](https://hrum.ai/docs.html#saju-mbti-api) - [꿈해몽 고전 근거](https://hrum.ai/docs.html#dream-kb) - [관상·손금 측정](https://hrum.ai/docs.html#face-palm-measure-api) - [hrum.ai/samples/face-palm/](https://hrum.ai/samples/face-palm/) - [평생사주 API](https://hrum.ai/docs.html#lifetime-api) - [이미지 생성 — 비동기 응답 (선택)](https://hrum.ai/docs.html#image-generations-async) - [요금](https://hrum.ai/pricing.html) - [플레이그라운드](https://hrum.ai/playground.html) - [상태 페이지](https://hrum.ai/status.html) - [앱에서 결제 받기](https://hrum.ai/hosting-docs.html#payments) - [AI로 비밀키 넣기](https://hrum.ai/hosting-docs.html#env-ai) - [부록 F](https://hrum.ai/hostingEbook/appendix-f.html) - [전체본 (/sajuEbook.html)](https://hrum.ai/sajuEbook.html) - [hrum.ai/get-book-code.mjs](https://hrum.ai/get-book-code.mjs) - [전체본 (/sajuEbook/saju/book.html)](https://hrum.ai/sajuEbook/saju/book.html) - [hrum.ai/sajuEbook/saju/get-book-code.mjs](https://hrum.ai/sajuEbook/saju/get-book-code.mjs) - [전체본 (/sajuEbook/ziwei/book.html)](https://hrum.ai/sajuEbook/ziwei/book.html) - [hrum.ai/sajuEbook/ziwei/get-book-code.mjs](https://hrum.ai/sajuEbook/ziwei/get-book-code.mjs) - [전체본 (/sajuEbook/astro/book.html)](https://hrum.ai/sajuEbook/astro/book.html) - [hrum.ai/sajuEbook/astro/get-book-code.mjs](https://hrum.ai/sajuEbook/astro/get-book-code.mjs) - [전체본 (/sajuEbook/tarot/book.html)](https://hrum.ai/sajuEbook/tarot/book.html) - [hrum.ai/sajuEbook/tarot/get-book-code.mjs](https://hrum.ai/sajuEbook/tarot/get-book-code.mjs) - [전체본 (/sajuEbook/dream/book.html)](https://hrum.ai/sajuEbook/dream/book.html) - [hrum.ai/sajuEbook/dream/get-book-code.mjs](https://hrum.ai/sajuEbook/dream/get-book-code.mjs) - [전체본 (/aiEbook.html)](https://hrum.ai/aiEbook.html) - [캐릭터 채팅 책 코드 받기 스크립트 (get-book-code.mjs)](https://hrum.ai/aiEbook/get-book-code.mjs) - [전체본 (/hostingEbook.html)](https://hrum.ai/hostingEbook.html) - [회원제 웹앱 책 코드 받기 스크립트 (get-book-code.mjs)](https://hrum.ai/hostingEbook/get-book-code.mjs) - [전체본 (/tossEbook.html)](https://hrum.ai/tossEbook.html) - [토스 미니앱 책 코드 받기 스크립트 (get-book-code.mjs)](https://hrum.ai/tossEbook/get-book-code.mjs) - [inta.float.do](https://inta.float.do) ## 비용 아끼기 (꼭 읽기) - 모든 성공한 요청은 각각 과금된다. 같은 생년월일시·같은 옵션의 계산 결과(만세력·자미두수·궁합·점성술·평생 사주 등)는 다시 불러도 같으므로, 앱을 만들 때 첫 응답을 DB에 저장하고(요청 본문 해시를 키로) 다음부터는 저장한 값을 쓸 것. 같은 입력으로 API를 다시 부르지 말 것. - 오늘의 사주·운 흐름처럼 날짜에 따라 바뀌는 결과는 날짜(한국 시각)도 키에 넣어 하루 단위로 다시 쓴다. AI 리딩은 같은 질문이라도 문장이 달라질 수 있으니, 보여 준 답은 저장해 두고 다시 보여 줄 때는 저장본을 쓴다. ## 상품 & 문서 - [개발자 시작 가이드](https://hrum.ai/getting-started.html): 콘솔 가입·이메일 인증 → API 키 발급(발급 직후 한 번만 표시) → 만세력 첫 호출(curl·Python requests·Node fetch, 헤더 `X-Partner-Api-Key`) → 응답 `{success, data}` → 크레딧 과금 → 에러 코드별 처리와 재시도 - [사주 API 소개](https://hrum.ai/saju-api.html): 계산형(만세력·자미두수·궁합·점성술 토탈·운 흐름·오늘의 사주·꿈해몽·타로)과 풀이형(평생 사주·AI 사주 리딩·사주 리포트) 엔드포인트 한눈에 보기 - [만세력 API 소개](https://hrum.ai/manseryeok-api.html): POST /manseryeok — 원국 4주·원국 분석(용신·격국·신강약)·대운·세운·사주 정체성, 출생 시각 미상 처리, 요청·응답 예시, 가격 - [궁합 API 소개](https://hrum.ai/compat-api.html): POST /compat — 사주 궁합·관계표·별자리 궁합·띠 궁합·종합 점수, 옵션(details·flow·MBTI), 요청·응답 예시, 가격 - [사주 풀이 API 소개](https://hrum.ai/saju-reading-api.html): POST /reading·/reading/memory·/reading/report — AI 사주 리딩·이어서 상담·리포트, 함께 넣는 항목(자미두수·점성술·꿈해몽·타로), 요청·응답 예시, 토큰 가격 - [오늘의 운세 API 소개](https://hrum.ai/today-api.html): POST /today(상품명 오늘의 사주) — 일진×일간 관계·좋은 시간·피할 시간·행운 색·활동 적합도, 날짜·날씨 옵션, 요청·응답 예시, 가격 - [자미두수 API 소개](https://hrum.ai/ziwei-api.html): POST /ziwei-chart — 12궁 명반·14주성·생년사화·대한·유년, 풀이 문단 옵션, 출생 시각 필수, 요청·응답 예시, 가격 - [점성술 API 소개](https://hrum.ai/astrology-api.html): POST /astrology(점성술 토탈) — 10개 천체·하우스·애스펙트·품위·풀이 문단, 트랜싯·진행·시너스트리, 요청·응답 예시, 가격 - [평생 사주 API 소개](https://hrum.ai/lifetime-api.html): POST /lifetime — 7개 주제 풀이 문단, 주제 하나만, 별자리·자미두수 층, 요청·응답 예시, 가격 - [꿈해몽 API 소개](https://hrum.ai/dream-api.html): POST /dream — 꿈 이야기에서 찾은 상징 낱말(풀이 문장 없음), 요청·응답 예시, 가격(찾은 상징이 없으면 과금 없음) - [타로 API 소개](https://hrum.ai/tarot-api.html): POST /tarot — 78장 덱 카드 뽑기·스프레드·seed 재현·카드 이미지, 요청·응답 예시, 가격 - [운 흐름 API 소개](https://hrum.ai/saju-flow-api.html): POST /saju-flow — 대운·세운·월운 누적선(`line`)·글자별 몫(`share`)·5신 이름·형충회합·합 풀림·궁합 겹쳐 보기 입력, 범위·월운·출생지 옵션, 요청·응답 예시, 가격 - [앱 호스팅 소개](https://hrum.ai/app-hosting.html): RIDM Apps — GitHub 연결로 빌드·배포, `<이름>.ridm.ai` 공개, 앱마다 전용 PostgreSQL DB, 무료 플랜부터 (상세는 [배포 가이드](https://hrum.ai/hosting-docs.html)) - [도메인 찾기](https://hrum.ai/domain-search.html): 로그인 없이 원하는 주소(도메인)가 비어 있는지와 실시간 가격을 확인. 고른 주소는 콘솔에서 크레딧으로 구매하고 RIDM Apps 앱에 연결 비용 없이 연결(등록된 도메인은 환불 불가) - [조립형 앱 만들기(바로) 소개](https://hrum.ai/baro.html): 코드 없이 사주·운세 블록을 골라 순서·문구·테마를 정하면 app.json 이 만들어지고, 배포 꾸러미(zip)를 받아 RIDM Apps에 공개. 지금 되는 것과 준비 중인 것, 자주 묻는 질문 (아래 「바로」 절) - [API 가이드](https://hrum.ai/docs.html): Quickstart, RIDM Memory API, AI 사주 리딩·리포트·만세력·평생사주·자미두수·오늘의 사주·꿈해몽·점성술 토탈·궁합·성격유형·이미지 생성 API — curl/Python/JavaScript 예제 포함 - [에러 코드](https://hrum.ai/docs.html#errors): 모든 API 공통 에러 표 + API마다 그 API에서만 나오는 코드 표. 검사 순서 = 보안 규칙(403, 본문 HTML, error 1010 — 막힌 기본 User-Agent, 예: Python `urllib`. API 키 검사 전이라 401이 아님) → 서비스 보호 상한(429, code 없음) → API 키(401) → 기능 미개방(404 `*_not_enabled`) → 요청 제한(429 `RATE_LIMIT_EXCEEDED`, `Retry-After`) → 본문 검사(400, 표에 없는 필드도 400) → 잔액(402 `INSUFFICIENT_BALANCE`. 만세력·점성술·운 흐름처럼 호출 전 잔액 검사가 없는 API는 code 없는 402). DB 연결 장애는 503 `SERVICE_DEGRADED`(`Retry-After: 30`). 오류 본문 `{success:false, statusCode, code?, message, timestamp}` — 분기는 statusCode·code로, message 문구에 의존하지 말 것 - [AI로 콘솔 관리하기](https://hrum.ai/docs.html#console-ai): AI 코딩 도구가 콘솔을 대신 관리하는 API `/api/v1/partners/v1/console-ai/*`. 인증 = 콘솔 관리 토큰(`Authorization: Bearer hrum_cm_…`, 30일, 기본 권한 조회만 — 쓰기 권한 `keys`·`credit`·`hosting`·`seller`·`hosting_ops` 는 발급 동의 화면에서 사람이 하나씩 체크 — `hosting_ops`(AI 운영 토큰)만은 작업마다 동의 없이 /console-ai/hosting/apps/{id}/… 를 부름, 아래 「앱 환경변수·비밀키 넣기」, 콘솔 API 키 화면에서 언제든 취소, 계정당 10개). 조회: GET /me·/token·/status(시작 체크리스트)·/keys·/credit·/credit/transactions·/usage·/hosting·/seller·/payouts. 쓰기는 권한 + 사람 동의가 둘 다 필요: ① POST /consents `{action, payload}` → `{code, consentUrl, expiresAt, action, display}` ② 사용자가 링크를 열어 「AI가 요청함」과 요청 원문(금액·대상)을 보고 「동의」 ③ GET /consents/{code} 로 approved 확인 ④ 쓰기 본문에 같은 payload + `consentCode`. 동의 코드는 1회용·10분·요청 해시 고정(바꾸면 409 `CONSENT_MISMATCH`). action ↔ 경로: key_issue POST /keys · key_rotate POST /keys/{id}/rotate · key_revoke POST /keys/{id}/revoke · credit_topup_link POST /credit/topup-link `{planKey}` · credit_refund_preview POST /credit/refund-preview · hosting_apply POST /hosting/apply `{planKey, subdomain, recurringConsent?}` · hosting_cancel POST /hosting/apps/{id}/cancel · seller_apply_link POST /seller/apply-link. 첫 토큰은 인증 없이 `token_issue` 로 요청하고 응답 `pollSecret` 을 `X-Consent-Poll-Secret` 헤더로 보내 승인 뒤 첫 조회에서 한 번만 토큰을 받음. 에러 `code`: MGMT_TOKEN_INVALID(401)·MGMT_SCOPE_DENIED(403, `scope`)·CONSENT_REQUIRED(400)·CONSENT_PENDING(409)·CONSENT_DENIED(403)·CONSENT_EXPIRED(410)·CONSENT_USED(409)·CONSENT_MISMATCH(409)·CONSENT_NOT_FOUND(404)·INVALID_CONSENT_PAYLOAD·UNKNOWN_FIELD(400)·CONSENT_RATE_LIMITED(429)·MGMT_TOKEN_LIMIT(409). 카드번호·셀러 본인정보는 AI 경로로 받지 않음(토스 결제창·콘솔 화면에서 사람이 직접 입력, 정해진 항목 밖 필드는 400 `UNKNOWN_FIELD`). MCP: `claude mcp add hrum -- npx -y https://console.hrum.ai/mcp/hrum-mcp-0.3.2.tgz` — 도구 hrum_ai_connect·hrum_ai_connect_status·hrum_status·hrum_keys_list·hrum_credit·hrum_credit_history·hrum_usage·hrum_hosting_status·hrum_seller_status·hrum_payouts_list·hrum_consent_request·hrum_consent_status·hrum_key_issue·hrum_key_rotate·hrum_key_revoke·hrum_topup_link·hrum_refund_preview·hrum_hosting_apply·hrum_hosting_cancel·hrum_seller_apply_link (토큰·API 키·poll secret 은 모델에 안 보이고 설정 폴더·`.env.local` 에만 저장) - [AI 사주 리딩 포함 항목](https://hrum.ai/docs.html#reading-modules): 사주 AI 한 상품에 점성술(`birth` 있으면 기본), 자미두수(출생 시각까지 있으면 기본), 꿈해몽(`dream` 꿈 내용을 보내면), 타로(`tarot: {count|spread}` 를 보내면, 뽑힌 카드·이미지 주소가 응답 `tarot`)이 다 들어감. `/reading`·`/reading/memory` 에서 `exclude: ["ziwei"|"astro"|"dream"|"tarot"]` 로 빼면 그 항목의 근거와 고정 요금이 빠짐. 가격 = 토큰 가격 + 포함 항목별 고정 요금(각 항목의 단독 계산형 엔드포인트 1회 가격), 응답에 `modulesUsed`·`moduleFees`. 오늘 일진은 따로 넣지 않아도 모든 풀이에 기본 반영(추가 요금 없음, 예전 `exclude: ["today"]` 는 무시). 각 항목은 /ziwei-chart·/astrology(점성술 토탈)·/dream·/tarot 로 따로도 씀 - [AI 사주 리딩 — AI 하나만 따로](https://hrum.ai/docs.html#reading-only): 사주 AI 안의 사주·자미두수·점성술·타로·꿈해몽 AI 중 하나만 부르려면 `/reading` 에 `only: "saju"|"ziwei"|"astro"|"tarot"|"dream"`. 가격 = 토큰 가격(질문 + 그 AI의 근거 블록만) + 그 항목 고정 요금 1개(`saju` 는 0). `tarot`(옵션 필요)·`dream`(꿈 내용 필요)은 `birth` 불필요, `ziwei` 는 출생 시각 필요. `exclude` 와 함께 보내면 400. 응답에 `only`·`modulesUsed`·`moduleFees`(타로는 `tarot`) - [타로 API](https://hrum.ai/docs.html#tarot-api): POST /tarot — `count`(1~10) 또는 `spread`(single·past-present-future·choice·celtic-condensed·future-prediction) 중 하나로 78장 덱에서 카드를 뽑아 정·역방향·키워드·뜻·카드 이미지 URL(WebP, 영구 캐시 — 그림은 1909 Rider-Waite(Pamela Colman Smith, 퍼블릭 도메인) 원판 스캔, 출처 원장 https://hrum.ai/tarot/cards/v2/SOURCES.md)을 돌려줌. LLM 없음, 호출당 고정 요금(장수 무관), `seed` 로 재현, `lang` ko·en·ja·th. 타로만 쓰거나, 결과를 LLM API로 해석하거나, 사주 AI(`tarot`)와 조합 - [타로 Waite 근거 kb](https://hrum.ai/docs.html#tarot-kb): /tarot 응답에 `kb` 추가 — 카드마다 Waite 『The Pictorial Key to the Tarot』(1910, PD) 정·역방향 뜻의 규칙 ID(`R-TAROT-*`)·원문 인용(quote·location·foundAt)·status(Waite가 안 적은 자리는 `disputed`). `method: "celtic-cross"`(Waite 켈트식 10장, 자리별 근거 `positionRule`). 요금 그대로. 열리기 전엔 `method` 를 보내면 404 `tarot_kb_not_enabled` - [점성술 토탈 API](https://hrum.ai/docs.html#astrology-api): POST /astrology — 한 번 호출로 점성술 계산 전부(만세력처럼 하나로). 기본 `natal`: 출생 입력(/natal-chart 와 같음)으로 태양~명왕성·교점·앵글(시각+좌표 있을 때만 — 규칙 키는 Asc·MC, DSC/IC 는 값으로만)·하우스(`houseSystems` 생략 시 `["placidus"]`, 극권 출생지는 포르피리로 대신하고 `fallbackFrom: "placidus"` 표시)·애스펙트(`orbs` leo1928 기본|heindel1919, `minorAspects` 기본 false)·품위·규칙 키 `features`(각 키에 `orb`·`outOfSign` 속성, 시각 정밀도 `meta:time_known|time_hour_level|time_unknown`, 시각 미상이면 달이 낀 출생 각에 `uncertain`). `timing: {orbDegrees(필수 0.5~10), at?, progressions?(기본 true), yearLength?(기본 tropical, tropical|julian)}` 를 보내면 트랜싯(`tSa_nSu_cj`)·2차 진행(`pSu_nJu_tr`)이 `timing` 에, `partner: {출생 입력}` 을 보내면 두 사람 사이 각(`aVe_bMa_cj` — 상대 시각+좌표가 있으면 상대 Asc·MC 도 계산해 넣음, 앵글은 합·충 6°)·고전 6쌍 별자리 관계(`astro_syn` `Su_Mo_se`, 상위 2개)·모든 점 쌍 별자리 관계(`syn_sign` `aAsc_bAsc_ss`)가 `synastry` 에 추가. HRUM 이 미리 써 둔 풀이 문단 `readings`(품위·애스펙트 — 서술이 있는 키만, 나머지는 건너뜀, `lang` 없는 문단은 ko)도 항상 들어 있음(추가 요금 없음, 서술을 못 읽으면 차트는 그대로 주고 `readings` 빈 배열 + `readingsUnavailable: true`). 만세력과 같은 1회 ₩50(블록을 추가해도 동일), LLM 없음. 네이탈 차트(/natal-chart)는 판매 종료 — 점성술은 이 상품 하나로. 천체마다 signName·degreeInSign(0~30°)·house(체계별 번호)가 붙어 한 번 호출로 차트를 다 그릴 수 있음. 마이너 품위·리셉션·행운점·하우스 주인·진행 앵글은 제공 안 함 - [운 흐름 API](https://hrum.ai/docs.html#saju-flow-api): POST /saju-flow — 한 사람 출생 입력(`birthDate`·`birthTime`·`calendar`·`gender`·`range`·`monthsOfYear`, 출생지 `birthLatitude`·`birthLongitude`·`country`·`birthTimePrecision`은 만세력과 같은 필드)으로 대운·세운·월운 그래프용 숫자("운 글자를 얹은 일간 쪽 점수" 누적선 `line` + 글자별 몫 `share`) · 5신 이름 · 운↔원국 형충회합 목록(규칙 ID 포함) · 합 풀림(`hapPulim[].reasonCode` 7종 enum + `params`로 화면 문구를 만들고, `reasonFallback` 엔진 한국어 문장은 모르는 코드일 때만) · 대운수 `startAge`(출생일 한국 0시 기준, R-SAJU-UN-038) · `engineVersion` `saju-flow-6`, `kbVersion` `2026.10.11-7` · 궁합 겹쳐 보기 입력(`compatInputs`). `monthsOfYear` 생략 = 지금(KST)이 속한 사주 연도, 연도 지정 = 그 사주 연도(입춘~다음 입춘 전), `null` = 월운 없음. LLM 없음, 좋고 나쁨을 재지 않는 값. 위치를 보내면 만세력과 같은 진태양시 보정 원국 위에 그리고, 안 보내면 만세력 기본 처리(지금은 보정 없음)를 따르며 응답 `assumedLocation`으로 알려 줌(위치를 보냈으면 `null`). 1회 ₩50(만세력과 같음), 실패는 과금 없음 - [사주↔MBTI 비교 API](https://hrum.ai/docs.html#saju-mbti-api): POST /saju-mbti — 출생 입력(만세력과 같은 필드) + `mbti`(4글자 "INFJ" 또는 축별 0~100 `{E_I,S_N,T_F,J_P}`, 100=E·S·T·J)로 원국(출생시간 모르면 3주)과 MBTI 4축마다 사주 쪽 경향(`sajuLean`, 걸린 규칙 ID `R-MBTI-*`)·입력과의 비교(`comparison`: same「사주와 같은 방향」·different「사주와 다른 면을 키운 것」·neutral). 맞다/틀리다·궁합 판정 없음, 현대 해석이며 규칙은 현대 문헌과 대조한 문헌판(`interim: false`, `kbStatus` `literature`, `kbVersion` `2026.10.16-2`). LLM 없음, 1회 ₩10(사주 정체성과 같음), 실패는 과금 없음 - [꿈해몽 고전 근거](https://hrum.ai/docs.html#dream-kb): POST /dream 응답에 `kbMatches` — 꿈 내용에 나온 대상과 맞는 해몽 KB 규칙(R-DREAM, 돈황본 『周公解夢書』 P.3908·『古今圖書集成』 夢部 원문 기록). 항목마다 `ruleId`·`polarity`(positive|negative|neutral)·`statement`(원문이 그렇게 적었다는 기록, 예언 아님)·`quote`(원문 한 줄·출처·위치). 흉한 기록은 `includeNegative: true` 일 때만. 같은 입력이면 같은 결과. 열리기 전에는 응답에 없음, 요금은 열 때 안내. /dream `items` 는 HRUM 자체 꿈 상징 어휘집(일상 명사와 동의어·활용형, 뜻·길흉 없음)에서 찾은 상징 낱말 — 항목마다 `keywords` 하나 + `score`(두드러진 순), `mode` 는 `glossary`|`none`. 풀이 문장 없음 - [관상·손금 측정](https://hrum.ai/docs.html#face-palm-measure-api): POST /face-measure · /palm-measure — 사진 대신 MediaPipe 좌표(얼굴 478점 `face_landmarker` / 손 21점 `hand_landmarker` + 손금 선 폴리라인 `creases`)를 보내면 측정 키(비율·각도·구역, `face-norm-1`/`palm-norm-1`)와 그 값에 맞는 관상·손금 KB 규칙 `kbMatches`(R-FACE·R-PALM, 원문 기록·`polarity`·`quote`)를 돌려줌. LLM 없음, 같은 좌표면 같은 결과. 원문이 수치·비교를 직접 주는 규칙만(우리 임계값 규칙은 PoC 전이라 제외). 흉한 기록은 `includeNegative: true` 일 때만(꿈해몽과 같은 이름). 모델 버전은 허용 목록(밖이면 400 `MEASURE_MODEL_VERSION_MISMATCH`). 고개 10° 넘음·얼굴 너무 작음은 400, 눈 감음·웃음 등은 해당 키만 null+사유. 발제선 `hairline`은 선택(없으면 null `hairline_missing`, 추정 안 함). 손금 선 조각은 파트너가 이어서 보냄(서버는 안 이음, `label` 또는 `autoLabel`). 좌표는 로그·DB에 남기지 않음. 사진은 받지 않음. 측정 키가 하나 이상일 때만 과금(손등 사진 `back_of_hand`면 손금은 ₩0, 빠진 키 수는 `missingSections`) — 관상·손금 각 ₩30/호출(부가세 별도, 부가세 포함 ₩33). 모델 버전·좌표 개수(478/21)·정규화가 다르면 400, 아직 열리지 않았으면 404 `face_measure_not_enabled`/`palm_measure_not_enabled`. 문서에 없는 필드는 400. 좌표 추출 참조 코드: https://hrum.ai/samples/face-palm/ (출시 전에는 비공개) - [자미두수 명반 API](https://hrum.ai/docs.html#ziwei-api): POST /ziwei-chart — 생년월일시로 12궁 명반(주성·보좌성 밝기·생년사화·오행국·명궁/신궁·대한·유년). 응답 `features` = 명반 사실을 자미 규칙 키 문자열로(`star:紫微@命`·`hua:祿=太陽@子女`·`cs:命=胎`·`limit:小限@辰` 등, 잡성·장생12·소한·운한 사화·명주·신주 포함, 세 별 co/meet·잡성 관계 키는 빠짐 — 두 쌍·별 위치로 판정). 자미 규칙 근거 카드(해석 DB)에서 공개 원문으로 확인되지 않은 인용(`match: "PARTIAL"`이면서 원문 위치 `foundAt`이 없는 것)은 `quote`·`location` 없이 `citation: "pending"`(출처 확인 중)으로 내려감, 규칙 문장·`sourceId`·EXACT 인용·원문 위치가 확인된 PARTIAL 인용은 그대로 - [평생사주 API](https://hrum.ai/docs.html#lifetime-api): POST /lifetime — 생년월일(시)로 7개 주제(성격·재물·일·연애·건강·대인관계·조언) 풀이 문단. `layers: ["astro","ziwei"]` 로 별자리(태양·달·상승궁)·자미두수 층 추가(층당 +₩20). 자미두수 층 = 명궁 주성 문단(`ziwei_ming`) + 주제별 궁 주성 문단(`ziwei_palace`: 재물=재백궁·일=관록궁·연애=부처궁·건강=질액궁, key 예 `cr_tj`), 출생 시각 없으면 빠짐(₩0). 출생 입력은 만세력과 같음(`calendar`·`isLeapMonth`·`birthLatitude`/`birthLongitude`·`country`·`zaSiRule`·`birthTimePrecision`, 전부 선택). 좌표는 사주 문단·층 모두 진태양시 보정에 쓰임(2026-10-11부터). INTA 앱과 같은 문단이 필요하면 `country: "KR"` - [궁합 API](https://hrum.ai/docs.html#compat-api): POST /compat — 두 사람 생년월일(시)로 사주 궁합(일주·8글자·권위자 분석)·속궁합 기호표·별자리 궁합·띠 궁합·종합 점수(`headerBreakdown`). 사람마다 선택 입력 `personXCalendar`(`lunar`)·`personXIsLeapMonth`·`personXCountry`·`personXZaSiRule`·`personXBirthTimePrecision`·좌표(만세력 API와 같은 규칙, 2026-10-11). 진태양시 보정은 좌표나 국가를 보낼 때만 — INTA 앱과 같은 결과는 `personXCountry: "KR"` + `exact`. 안 보내면 이전과 같은 응답. 2026-10-16(`engineVersion` `compat-2`)부터 관계표 `relations`(자리 `positions`·언어 무관 키 `kind` 14종 yukhap·banhap·samhap·banghap·chung·hyung·hae·pa·wonjin·stemHap·stemChung·napeumSaeng·napeumBihwa·napeumGeuk·`tier` gather/clash/heavyClash/listOnly·근거 `ruleIds`·`chars`, 판정어 없음)와 `p2Score`(0~100 = round(71.6+5×Σ)를 0~100으로 자름, 71.6 = 관계 없을 때의 중립점(실회원 원전 축 평균, 2026-10-16), 1단위 = 5점, 생시 유무와 무관, 원전 아닌 표시 척도 가정 — KB R-SAJU-COMPAT-113)(예: 1990-09-04 14:30 남 × 1992-02-20 10:15 여 → 월지·일지 申寅충, 일간 壬丙충, 연주 납음 생, 巳午未 방합 → Σ −3 → `p2Score` 57, 연애 `headerBreakdown.average` 62)가 붙고 `headerBreakdown.classic` = `p2Score`. 같은 날부터 결혼 목적(`marriage_stability`) 종합 점수의 `classic` 가중치 0.25 → 0.05(나머지 sixAxis 0.19·authority 0.3167·full8 0.3167·natal 0.1267). `classic1995`는 지원 종료 예정(안: 2026-11-16 공지, 2026-12-31까지 유지, 2027-01-01부터 null). INTA 앱 화면의 대표 점수(큰 숫자) = `headerBreakdown.average`(`saju.score.total`은 흐름 고유 점수라 다름). 2026-10-27부터 화면과 같은 6축 `saju.iljuAxes`(일주 궁합표 그대로, `saju.axes`와 계산이 다름)가 항상 붙음. 기존 필드 값·`engineVersion`은 그대로. 호출당 ₩20(옵션 포함) - [이미지 생성 — 비동기 응답 (선택)](https://hrum.ai/docs.html#image-generations-async): POST /images/generations 에 `Prefer: respond-async` 헤더를 보낸 요청만, 60초 안에 끝나지 않으면 202 + `{id: "imgjob_…", object: "image.job", status: "pending", pollUrl, retryAfter}`(`Location`·`Retry-After` 헤더), 생성은 최대 240초 계속. 헤더가 없으면 예전 동기 동작 그대로(80초, 504). GET /partners/v1/jobs/{id} 로 조회 → `succeeded`(`result` = 동기 200 본문) | `failed`(`error` = 동기 오류 본문, 과금 없음). 조회는 일일 한도 제외·API 키당 2초 1회(초과 429 `IMAGE_JOB_POLL_RATE_LIMITED`). 결과가 나온 순간 1회만 과금, 24시간 보관, 16MB 초과 결과는 `IMAGE_JOB_RESULT_TOO_LARGE`(과금 없음), 다른 파트너 ID는 404 `IMAGE_JOB_NOT_FOUND` - [요금](https://hrum.ai/pricing.html): 만세력 ₩50/호출 종량제, LLM은 토큰 과금, 리딩 speed 티어(value 선택 시 20% 할인) - [플레이그라운드](https://hrum.ai/playground.html): 가입 없이 무료 체험 - [상태 페이지](https://hrum.ai/status.html): 실시간 API 상태 ## 바로 (조립형 앱 만들기) 상세: [바로 소개](https://hrum.ai/baro.html) · 편집기 https://console.hrum.ai/baro-app-editor.html (콘솔 로그인 필요, 미리보기 단계, 검색 비노출) · [앱 호스팅](https://hrum.ai/app-hosting.html) - 블록: 만세력·오늘의 운세·궁합·꿈해몽·AI 대화. 블록을 놓고 순서를 바꾸면 맨 위 블록이 첫 화면. 문구는 정해 둔 칸만 바꾸고, 건강·생사 단정이나 부풀린 말은 저장 거절. 테마는 라이트·다크 대비 검사를 통과한 것만 - 초안: 편집 중인 브라우저에만 저장, 앱 내용은 서버로 보내지 않음. 다른 기기에서는 app.json 을 내려받아 불러온다 - 공개: 배포 꾸러미(zip = `app.json` + `Dockerfile` + `README.md`)를 브라우저에서 받아 GitHub 저장소로 만들고 RIDM Apps에 연결 → 빌드 뒤 `<이름>.ridm.ai` - API 키: 블록이 결과를 보여 주려면 앱 컨테이너에 `HRUM_API_KEY` 가 있어야 한다. 콘솔 「API 키」에서 발급한 키를 RIDM Apps 환경변수 `HRUM_API_KEY` 에 넣거나, 앱 상세의 「AI 연결」을 켠 앱이면 플랫폼이 넣는다(「AI 연결」이 켜진 앱은 직접 넣을 수 없음). 키가 없으면 화면은 뜨고 결과 자리에 안내 문구가 나온다(호출·과금 없음) - 비용: 편집기에서 만드는 동안 크레딧 차감 없음. 공개한 앱이 블록을 부르면 그 앱 키의 크레딧에서 해당 API 요금이 차감. 호스팅은 무료 플랜부터 - 준비 중: 견본 데이터로 그리는 실제 앱 화면 미리보기, 바로로 만든 앱 안에서 이용자에게 결제받기(흐름 결제), 판매 대금 정산. 코드로 만든 앱은 지금도 [앱에서 결제 받기](https://hrum.ai/hosting-docs.html#payments)대로 결제받는다 - AI 대화 블록: 앱 방문자와 대화하는 블록(한국어 앱, 앱당 하나) - 없음: 대화를 오래 기억하는 채팅 블록. 그런 앱은 AI 코딩 도구로 코드를 써서 만든다 → [AI앱 — 기억하는 캐릭터 채팅](https://hrum.ai/aiEbook/) ## 앱 환경변수·비밀키 넣기 (RIDM Apps) 상세: [배포 가이드 — 환경변수](https://hrum.ai/hosting-docs.html#env) · [AI로 비밀키 넣기](https://hrum.ai/hosting-docs.html#env-ai) · 전자책 [부록 F](https://hrum.ai/hostingEbook/appendix-f.html) ### 공통 규칙 (서버가 검사) - 이름: `^[A-Z_][A-Z0-9_]{0,63}$` (대문자·숫자·밑줄, 숫자로 시작 불가, 64자 이하) - 예약 이름(설정 불가): `PORT`·`HOSTNAME`·`NODE_OPTIONS`·`DATABASE_URL`, `RIDM_`·`PG` 로 시작하는 이름. `HRUM_API_KEY` 는 「AI 연결」이 켜진 앱이면 플랫폼이 넣어서 설정 불가, 꺼진 앱이면 콘솔 「API 키」에서 발급한 내 키를 직접 넣는다(다른 계정의 키·앱 전용 키는 거부). 직접 넣은 값이 있으면 「AI 연결」을 켜기 전에 지운다 - 값: 비어 있으면 안 됨, 줄바꿈(\r·\n·NUL) 불가, UTF-8 2048바이트 이하. 앱당 50개 - 쓰기 전용: 값은 저장 즉시 암호화되고 어떤 API·화면으로도 다시 읽을 수 없음(목록은 이름만) - 저장·삭제하면 앱이 새 값으로 다시 시작됨. 해지된(해지 진행 중) 앱은 변경 불가 - 넣기·지우기 1분 30회, 목록 1분 60회 ### 사람 순서 (콘솔) — 어떤 이름이든 가능 1. https://console.hrum.ai 로그인 → 왼쪽 메뉴 「내 앱」 2. 앱 카드의 「환경변수」 칸: 저장된 이름이 값 대신 `••••••••` 로 표시 3. 「이름 (예: STRIPE_SECRET_KEY)」 칸에 이름(입력하면 대문자·밑줄로 바뀜), 「값」 칸(가려진 입력)에 값 → 「저장」 → 「환경변수를 저장했어요: <이름>. 앱이 곧 다시 시작돼요.」. 같은 이름으로 다시 저장 = 값 교체 4. 지우기: 그 줄의 「삭제」 → 확인 창 「삭제」(앱 재시작, 값은 되살릴 수 없음) 5. 값 옮기기: 비밀번호 관리자·macOS 키체인에서 복사해 바로 붙여넣기, 붙여넣은 뒤 클립보드 비우기(`pbcopy < /dev/null`), 채팅·메일·문서에 값을 적지 않기, 브라우저의 비밀번호 저장 제안은 거절 ### AI 순서 (AI 운영 토큰 = `hosting_ops` 권한의 콘솔 관리 토큰) - HRUM MCP 0.2.1 에는 환경변수 도구가 없음 → HTTP 로 직접 부른다. 기본 주소 https://api.hrum.ai - AI 경로로 설정 가능한 이름: `_KEY`·`_SECRET`·`_TOKEN`·`_PASSWORD`·`_PASSWD`·`_PASS`·`_SALT`·`_CLIENT_ID` 로 끝나는 이름만(예: `STRIPE_SECRET_KEY`·`MASTER_KEY`). 그래도 거절: 접미 `_URL`·`_URI`·`_ENDPOINT`·`_HOST`·`_PROXY`, 접두 `NODE_`·`LD_`·`DYLD_`·`PYTHON`·`JAVA_`·`_JAVA_`·`JDK_`·`RUBY`·`PERL`·`GIT_`·`NPM_CONFIG_`·`GLOBAL_AGENT_`·`AWS_ENDPOINT_URL`, 이름 `HTTP_PROXY`·`HTTPS_PROXY`·`ALL_PROXY`·`NO_PROXY`·`NODE_USE_ENV_PROXY`·`NODE_TLS_REJECT_UNAUTHORIZED`·`NODE_EXTRA_CA_CERTS`·`NODE_OPTIONS`·`SSL_CERT_FILE`·`SSL_CERT_DIR`·`REQUESTS_CA_BUNDLE`·`CURL_CA_BUNDLE`·`PATH`·`IFS`·`ENV`·`BASH_ENV`·`GCONV_PATH`·`SSLKEYLOGFILE`·`AWS_CA_BUNDLE`·`OPENAI_API_BASE`. 그 밖의 이름(예: `ADMIN_PATH`·`SMTP_HOST`)은 사람에게 콘솔(위 순서)로 넘긴다. 삭제는 AI 경로로도 가능(예약 이름 제외) - 토큰 발급(30일): ① 인증 없이 `POST /api/v1/partners/v1/console-ai/consents` `{"action":"token_issue","payload":{"scopes":["hosting_ops"],"label":"<이름>"}}` → `data` 에 `code`·`consentUrl`·`userCode`(8자리)·`pollSecret`·`expiresAt` ② 사용자에게 `consentUrl` 과 `userCode` 만 보인다(`pollSecret` 은 보이지 않음) ③ 사람이 콘솔 로그인 상태로 링크를 열고(10분 안) 「확인 코드」 에 8자리 입력 + `hosting_ops` 체크 + 「동의」 ④ `GET /api/v1/partners/v1/console-ai/consents/{code}` 헤더 `X-Consent-Poll-Secret: ` → 승인 뒤 첫 응답 `data.token.value`(`hrum_cm_…`)를 딱 한 번 받는다 — 출력하지 말고 비밀 저장소(키체인·권한 600 파일)에 바로 저장 ⑤ 회수: 콘솔 「API 키」 화면 「AI 콘솔 관리 토큰」 → 「취소」(즉시 무효). 계정당 살아 있는 토큰 10개 - 인증: `Authorization: Bearer hrum_cm_…`. `hosting_ops` 만 가진 토큰은 호스팅 밖 console-ai 경로(크레딧·키 목록·정산 등)에서 403 `MGMT_SCOPE_DENIED`(`scope: "read"`) - 앱 id(UUID): `GET /api/v1/partners/v1/console-ai/hosting` → `data.apps[].id` - 목록: `GET /api/v1/partners/v1/console-ai/hosting/apps/{appId}/env` → `{"success":true,"data":{"env":{"names":[...]}}}` - 넣기·바꾸기: `PUT /api/v1/partners/v1/console-ai/hosting/apps/{appId}/env/{NAME}` 본문 `{"value":"..."}` → 바뀐 이름 목록 - 지우기: `DELETE /api/v1/partners/v1/console-ai/hosting/apps/{appId}/env/{NAME}` → 바뀐 이름 목록 - 사람이 브라우저로 쓰는 콘솔 경로 `PUT`·`DELETE /api/v1/partners/v1/console/hosting/apps/{appId}/env/{NAME}`, `GET .../env`(이름만)도 있음(콘솔 로그인 세션 또는 HRUM MCP 전체 권한 세션). MCP 세션으로 바꾸면 AI 운영 토큰과 같은 이름 규칙이 적용됨 - 예시(bash·zsh, 값은 표준 입력, 토큰은 헤더 파일 — 둘 다 명령줄 인자·셸 기록에 남지 않음): ``` HRUM_CM_TOKEN=$(security find-generic-password -s hrum-console-ops -w) VALUE=$(security find-generic-password -s myapp-STRIPE_SECRET_KEY -w) printf '%s' "$VALUE" | jq -Rs '{value: .}' | curl -s -X PUT \ -H @<(printf 'Authorization: Bearer %s' "$HRUM_CM_TOKEN") \ -H 'Content-Type: application/json' --data-binary @- \ "https://api.hrum.ai/api/v1/partners/v1/console-ai/hosting/apps/$APP_ID/env/STRIPE_SECRET_KEY" \ | jq '.data.env.names // .' unset VALUE ``` ### 안전 규칙 (AI 도구가 지킬 것) - 사용자에게 값을 채팅에 붙여 달라고 하지 않는다. 키체인·비밀번호 관리자에 넣어 달라고 하고 항목 이름만 묻는다 - 사용자가 값을 채팅에 붙였어도 다시 출력하지 않는다. 대화 기록에 남았으니 발급처에서 새로 발급해 교체하라고 권한다 - 값은 셸 변수로 읽어 표준 입력으로 넘긴다. `curl -d "<값>"`·`echo <값>`·`set -x` 처럼 명령줄·로그에 남는 방법 금지 - 값을 코드·커밋·`.env` 커밋·PROGRESS.md·로그·화면에 적지 않는다. 보고는 "이름 + 저장 여부"만 - AI 경로가 거절한 이름은 우회하지 말고 사람에게 콘솔로 넘긴다 - 운영 토큰도 같은 비밀값으로 다룬다. 작업이 끝나면 콘솔에서 취소하라고 알린다 - 사례: 판매 관리 앱을 만들던 AI 도구가 앱의 마스터 키를 환경변수로 넣으려 했으나 그때는 AI 운영 경로가 없어 멈췄다. 지금은 `MASTER_KEY` 처럼 `_KEY` 로 끝나는 이름은 AI 운영 토큰으로, 나머지는 사람이 콘솔로 넣는다 ### 오류 (본문 `{success:false, statusCode, message, timestamp}` — 환경변수 오류는 `code` 없음) | 상태 | message | 원인 → 해결 | |---|---|---| | 400 | 이름은 대문자·숫자·밑줄만 쓸 수 있고, 숫자로 시작할 수 없습니다 (최대 64자) | 이름 규칙 → 고쳐서 다시 | | 400 | 플랫폼이 쓰는 이름이라 설정할 수 없습니다: <이름> | 예약 이름 → 다른 이름 | | 400 | AI 연결이 자동으로 넣는 이름이라 직접 설정할 수 없습니다: HRUM_API_KEY | 이 앱은 「AI 연결」 이 켜져 있어 플랫폼이 넣는다 → 그대로 두거나, 직접 넣으려면 「AI 연결」 을 끈다 | | 400 | 이 계정에서 발급한 API 키만 넣을 수 있어요. 콘솔 「API 키」에서 발급한 키를 넣어 주세요 | 다른 계정의 키 → 내 콘솔 키로 | | 400 | AI 연결이 앱마다 만든 키는 넣을 수 없어요. 콘솔 「API 키」에서 발급한 키를 넣어 주세요 | 앱 전용 키 → 콘솔 「API 키」 의 키로 | | 400 | API 키 앞뒤에 공백이 있거나 보이지 않는 문자가 섞여 있어요. 콘솔 「API 키」에서 복사한 키를 그대로 넣어 주세요 | `HRUM_API_KEY` 값의 앞뒤 공백·제어 문자 → 키만 다시 붙여 넣기 | | 400 | 실행 환경을 바꾸는 이름이라 AI 경로(AI 운영 토큰·MCP)로는 설정할 수 없습니다. 콘솔에서 직접 설정해 주세요: <이름> | 사람이 콘솔에서 | | 400 | AI 경로(AI 운영 토큰·MCP)로는 _KEY·_SECRET·_TOKEN·_PASSWORD·_PASSWD·_PASS·_SALT·_CLIENT_ID로 끝나는 이름만 설정할 수 있습니다. 다른 이름은 콘솔에서 설정해 주세요: <이름> | 이름을 바꾸거나 사람이 콘솔에서 | | 400 | 값을 입력해 주세요 | 빈 값 | | 400 | 값에 줄바꿈을 넣을 수 없습니다 | 여러 줄 값(PEM 등) → base64 한 줄로 넣고 앱에서 풀기 | | 400 | 값은 2048바이트까지입니다 | 큰 값은 DB·외부 비밀 저장소에 | | 400 | Validation failed (uuid is expected) | 앱 id 가 UUID 아님 → `data.apps[].id` | | 401 | `MGMT_TOKEN_INVALID` | 토큰 없음·만료·취소 → 새로 발급 | | 403 | `MGMT_SCOPE_DENIED` (`scope: "hosting_ops"`) | 토큰에 `hosting_ops` 없음 → 체크해서 새로 발급 | | 404 | 앱을 찾을 수 없습니다 | 다른 계정의 앱·삭제된 앱 → 앱 id 확인 | | 404 | 없는 환경변수입니다 | 지우려는 이름이 없음 → 목록 확인 | | 409 | 해지된 앱은 환경변수를 바꿀 수 없습니다 | 해지 진행 중인 앱 | | 409 | 환경변수는 앱당 50개까지입니다 | 안 쓰는 이름을 지우고 다시 | | 429 | (요청 제한) | 넣기·지우기 1분 30회 → 잠시 뒤 다시 | | 503 | 환경변수 저장소가 준비되지 않았습니다 | 서버 쪽 문제 → 잠시 뒤 다시, 계속되면 문의 | ## 전자책 — 바이브코딩 시리즈 3권 (AI 코딩 도구로 앱 만들기) - [책 고르기](https://hrum.ai/ebook/): 세 권 중 고르는 첫 페이지. 첫 문단이 AI 안내 — 사주·운세(자미두수·별자리·타로·꿈해몽 포함)·옛 시작 문장(/ebook/ 을 열고 … 사주앱)·PROGRESS.md 의 옛 /ebook/ 주소 → 통합 운세 책, 주제 하나만(사주만·자미두수만·점성술만·타로만·꿈해몽만) 요청 → 그 단독판, AI 챗봇·캐릭터 → AI 캐릭터 책, 회원제·DB·게시판 → 회원제 웹앱 책, 애매하면 사주책 - [통합 운세 AI 솔루션](https://hrum.ai/sajuEbook/): 내 캐릭터가 상담하는 운세 앱 — 만세력·자미두수 명반·나의 별자리·타로 뽑기·꿈해몽 화면을 탭으로 묶고, 화면마다 그 주제의 AI 가 기억하며 상담한다(궁합·관리자 선택 기능 포함). HRUM API 키 필요. 첫 페이지 = 사람용 소개 + AI용 단계 지도(같은 지도가 /sajuEbook/ai.html 에도 있다). 코드 본문은 `https://hrum.ai/get-book-code.mjs` 가 로컬 파일로 만든다 · [전체본](https://hrum.ai/sajuEbook.html)(사람용 한 페이지 책, /ebook.html 과 같은 파일) - [사주만 판](https://hrum.ai/sajuEbook/saju/): 통합 운세 책과 같은 코드에서 사주만 남긴 단독판(만세력·사주 상담·궁합·관리자). 코드는 `https://hrum.ai/sajuEbook/saju/get-book-code.mjs` · [전체본](https://hrum.ai/sajuEbook/saju/book.html) - [자미두수만 판](https://hrum.ai/sajuEbook/ziwei/): 12궁 명반 화면(/ziwei-chart — 출생 시각 필수) + 명반으로 답하는 상담(only: ziwei). 코드는 `https://hrum.ai/sajuEbook/ziwei/get-book-code.mjs` · [전체본](https://hrum.ai/sajuEbook/ziwei/book.html) - [점성술만 판](https://hrum.ai/sajuEbook/astro/): 나의 별자리 화면(/astrology 점성술 토탈 — 10개 천체 별자리·도수·하우스 + 시각·도시가 있으면 상승궁·MC + 풀이 문단) + 차트로 답하는 상담(only: astro). 코드는 `https://hrum.ai/sajuEbook/astro/get-book-code.mjs` · [전체본](https://hrum.ai/sajuEbook/astro/book.html) - [타로만 판](https://hrum.ai/sajuEbook/tarot/): 타로 뽑기 화면(/tarot — 스프레드·카드 이미지) + 뽑은 카드로 답하는 상담(only: tarot, 같은 seed). 생년월일 없음. 코드는 `https://hrum.ai/sajuEbook/tarot/get-book-code.mjs` · [전체본](https://hrum.ai/sajuEbook/tarot/book.html) - [꿈해몽만 판](https://hrum.ai/sajuEbook/dream/): 꿈해몽 화면(/dream — 상징 낱말 매칭, 못 찾으면 0원) + 그 꿈으로 답하는 상담(only: dream). 생년월일 없음. 코드는 `https://hrum.ai/sajuEbook/dream/get-book-code.mjs` · [전체본](https://hrum.ai/sajuEbook/dream/book.html) - [AI앱 — 기억하는 캐릭터 채팅](https://hrum.ai/aiEbook/): 캐릭터를 고르면 그 말투로 대화하는 채팅 서비스. 기억 방식은 세션형(대화마다 새로) · RIDM 무한세션(계속 기억) · RIDM 세션 단위(새 대화마다 기억을 따로) 중 선택. HRUM API 키 필요. 코드는 `https://hrum.ai/aiEbook/get-book-code.mjs` · [전체본](https://hrum.ai/aiEbook.html) - [그냥 앱 — 호스팅+DB 회원제 웹앱](https://hrum.ai/hostingEbook/): 가입·로그인·회원별 메모·관리자 페이지가 있는 웹앱. HRUM API 키 없이 RIDM Apps 호스팅과 DB만 쓴다. 코드는 `https://hrum.ai/hostingEbook/get-book-code.mjs` · [전체본](https://hrum.ai/hostingEbook.html) - [앱인토스 미니앱 — 오늘의 운세](https://hrum.ai/tossEbook/): HRUM API 와 RIDM Apps 서버로 앱인토스 미니앱 「오늘의 운세」를 만든다. HRUM API 키는 서버(RIDM Apps)에만 두고, 미니앱 화면 번들은 앱인토스 콘솔에 올린다. 앱인토스 콘솔 가입·검수·출시는 사용자가 직접 한다. HRUM API 키 필요. 코드는 `https://hrum.ai/tossEbook/get-book-code.mjs` · [전체본](https://hrum.ai/tossEbook.html) - 사주책·AI앱 책의 1-1 에 HRUM MCP 자동 가입 단계가 있다(AI 도구가 가입 신청·키 저장, 사람은 메일 승인만). 콘솔 수동 가입은 대안 경로로 남아 있다 - AI 코딩 도구는 고른 책의 지도(/<책>/)부터 단계 순서대로 해당 장 페이지만 읽는다. 전체본은 지도를 열 수 없을 때만 첨부본으로 읽는다 ## 레퍼런스 - 실서비스: AI 사주 앱 인타(INTA) — https://inta.float.do — 같은 API 스택으로 구동 ## 책별 단계 지도 (전자책 AI용 지도에서 추출) 각 책의 첫 페이지(지도)에 있는 핵심 규칙·단계 지도·페이지 목록이다. 진행할 때는 고른 책의 지도 링크를 열어 최신 내용을 따른다. 금액은 요금표(https://hrum.ai/pricing.html)를 본다. ### 통합 운세 책 (사주·운세 앱) 지도: https://hrum.ai/sajuEbook/ 여기부터 AI용 지도 — AI 코딩 도구는 이 아래를 따른다 핵심 규칙 — AI 는 어느 페이지에서든 이것을 지킨다 - 사용자가 제작 결정서를 명시적으로 승인하기 전에는 코드를 한 줄도 쓰지 않는다. 승인 뒤에는 결정서에 없는 질문·기능을 더하지 않고, 결정서 범위를 끝까지 완주한다. - 책 코드 파일은 손으로 옮겨 쓰거나 다시 쓰지 않는다 — `node scripts/get-book-code.mjs` 가 책 그대로 만든다(첫 실행은 부록 A-2 의 curl 한 줄). AI용 분할본의 코드 자리는 " 경로" 한 줄이다 — 그 파일을 cat 으로 읽는다. 고쳐도 되는 파일은 PART 0 [AI 시작 지침] 5-b 의 목록뿐이다. - 매 push 와 완료 보고 전에 `node scripts/verify-book-code.mjs` 를 실행해 "불일치 0개" 출력을 그대로 보인다. - API 키·비밀번호 값을 채팅·코드·로그·PROGRESS.md 에 적지 않는다. 환경변수는 "이름 + 설정 완료 여부"만 보고받는다. - 확인은 AI 가 직접 명령을 실행해 출력으로 증명한다. push ≠ 배포 — 실서버 /api/health 의 commit 이 내 마지막 커밋과 같아지기 전에는 "배포됐다"고 말하지 않는다. - AI 는 지도(https://console.hrum.ai/sajuEbook/ — 같은 지도가 sajuEbook/ai.html 에도 있다)의 단계 순서대로 그 단계의 페이지만 읽는다. 진행 상황은 PROGRESS.md 에 적고, 이어서 할 때는 지도의 다음 단계로 간다 — 승인된 결정서를 다시 묻지 않는다. 전체본 sajuEbook.html 은 사람용이다(링크를 못 여는 도구에 첨부할 때만 AI 가 전체를 읽는다). - 사용자가 직접 만들기 어려워하면(설치·배포에서 같은 곳에 반복해 막히거나, 직접 만들기를 원하지 않으면) 흐름의 제작 지원 페이지 https://hrum.ai/app-development.html#support 를 안내한다. 가격은 그 페이지를 보여 주고 직접 말하지 않는다. #### AI용 지도 — 통합 운세 AI 솔루션 이 지도는 AI 코딩 도구가 읽는 분할본의 첫 페이지입니다. 아래 단계 순서대로, 지금 단계에 적힌 페이지만 열어 읽습니다. 다음 단계 페이지는 지금 단계의 "끝났다는 증거"(명령 출력)를 사용자에게 보인 뒤에 엽니다. 각 페이지 머리에 핵심 규칙과 "이 페이지 전에 읽을 페이지"가 있습니다. - 처음 시작: 0단계 [PART 0 사용법·AI 시작 지침](https://hrum.ai/sajuEbook/part0.html) 의 [AI 시작 지침]부터. - 진행 중인 프로젝트(결정서 승인됨·프로젝트 폴더에 PROGRESS.md 있음): PROGRESS.md 를 먼저 읽고 거기 적힌 다음 단계로 간다 — 승인된 결정서를 다시 묻지 않는다. PROGRESS.md 의 단계 번호는 옛 판 기준일 수 있다 — PART 이름으로 이 표와 맞춰 보고, 이어 가기 전에 `node scripts/verify-book-code.mjs` 부터 실행한다. 규칙을 잊지 않도록 0단계 [PART 0 사용법·AI 시작 지침](https://hrum.ai/sajuEbook/part0.html) 는 다시 읽는다. - 막히면: 어느 단계에서든 막히면 [부록 D 트러블슈팅](https://hrum.ai/sajuEbook/appendix-d.html) 를 연다 — 조치 뒤 그 단계의 증거를 다시 보인다. - 코드: 분할본에는 코드 본문이 없다. 코드 자리는 한 줄 — 2단계에서 get-book-code 가 전체본에서 받아 만든 로컬 파일을 cat 으로 읽는다. - 전체본 https://hrum.ai/sajuEbook.html 은 사람용이다. 분할 모드의 AI 는 열지 않는다 — 이 지도를 열 수 없는 도구만 사용자가 첨부한 전체본을 처음부터 끝까지 읽는다. #### 단계 지도 - 0. 규칙 | [PART 0 사용법·AI 시작 지침](https://hrum.ai/sajuEbook/part0.html) | 명령 없음 — 핵심 규칙과 [AI 시작 지침] 0~7 을 읽었다(사용자에게 보낼 첫 메시지는 1단계 페이지를 읽은 뒤의 0.5 질문) | 1단계 - 1. 준비·결정서 | [PART 1 계정 준비](https://hrum.ai/sajuEbook/part1.html) [PART 2 기본기](https://hrum.ai/sajuEbook/part2.html) [PART 3 컨셉·페르소나](https://hrum.ai/sajuEbook/part3.html) [PART 4 결정서·마스터 스펙](https://hrum.ai/sajuEbook/part4.html) [PART 9 원가·가격·결제](https://hrum.ai/sajuEbook/part9.html) | 0.5 질문 → 4-0 결정 항목을 한 메시지로 → [제작 결정서]에 대한 사용자의 명시적 승인("승인"·"이대로 진행")과 PROGRESS.md 의 결정서 사본. 유료화는 9-4 대로 결정서에 적는다. 계정 게이트(PART 1)는 사용자의 "완료" 답(MCP 경로면 `hrum_issue_key` 의 `saved: true`·`gitignored: true` 출력) | 2단계 - 2. 코드 받기 | [부록 A 스펙·코드 받기(A-2)](https://hrum.ai/sajuEbook/appendix-a.html) | `node -v` → v22.12 이상 · 빈 폴더에서 A-2 의 curl 한 줄 → `git init -b main` → `node scripts/verify-book-code.mjs` → "불일치 0개" · `npm install` 오류 없음 | 3단계 - 3. 화면 | [PART 5 운세 화면](https://hrum.ai/sajuEbook/part5.html) [PART 6 상담 채팅](https://hrum.ai/sajuEbook/part6.html) [부록 C API 요약표](https://hrum.ai/sajuEbook/appendix-c.html) | 수정 허용 파일만 결정서대로 고친 뒤 `npm run build` 에러 0 · `npx vitest run` 전부 통과 · `node scripts/verify-book-code.mjs` → "불일치 0개" | 4단계 - 4. 보안·테스트 | [PART 7 보안·테스트](https://hrum.ai/sajuEbook/part7.html) | `npm run check` 전부 통과 + DB 테스트 한 줄(5-f) · `node scripts/smoke-live.mjs http://localhost:3000 --quick` 실패 0개 · `grep -r "float_live_" app/ components/ lib/` 출력 없음 | 5단계 - 5. 배포 | [PART 8 배포](https://hrum.ai/sajuEbook/part8.html) | `curl -s -A "Mozilla/5.0" https://이름.ridm.ai/api/health` 의 commit = `git rev-parse HEAD` · `node scripts/smoke-live.mjs https://이름.ridm.ai` 실패 0개 | 6단계(결정서에 선택 기능이 없으면 완료 보고 5-f) - 6. 선택 기능 — 결정서에 고른 것만 | [부록 B 레시피 B-1~B-6](https://hrum.ai/sajuEbook/appendix-b.html) [부록 B-7 관리자 페이지](https://hrum.ai/sajuEbook/appendix-b7.html) (결정서에 테이블 추가·가족 원국·리포트 보관이 있으면) [부록 E 앱 DB 테이블 늘리기](https://hrum.ai/sajuEbook/appendix-e.html) | 고른 레시피마다 그 레시피의 완료 기준 · 다시 `npm run check` 통과 · push 뒤 health commit 일치 · `node scripts/smoke-live.mjs https://이름.ridm.ai` 실패 0개(B-2 를 붙였으면 --compat) | 완료 보고(PART 0 5-f) - 7. 운영·개정 — 필요할 때만 | [부록 D 트러블슈팅](https://hrum.ai/sajuEbook/appendix-d.html) [부록 E 앱 DB 테이블 늘리기](https://hrum.ai/sajuEbook/appendix-e.html) | 개정: verify 가 "다름"이면 PART 0 지침 5-b 의 네 단계(옛 판에서 이어 오면: 예전 책대로 lib/db.ts 의 SCHEMA 에 덧붙인 테이블은 lib/schema-extra.ts 로 옮기고(부록 E), 프록시·app/api/history 에 넣었던 기능(원국 여러 개·대화 기록 저장)은 lib/app-hooks.ts 로 옮긴다(부록 E-0·E-1).) → `npm run check` 통과 → push. 막힘: 부록 D 조치 뒤 그 단계의 증거를 다시 보인다. 테이블 추가: 부록 E 뒤 `npm run check`(테스트 DB 가 있으면 TEST_DATABASE_URL 과 함께) | 해당 단계로 돌아간다 #### 섹션 번호 → 페이지 본문이 "8-2 참조"처럼 다른 섹션을 가리키면 이 표로 페이지를 찾는다. [AI 시작 지침] 0~7(5-b 개정 절차·5-f 완료 보고 포함)은 [PART 0 사용법·AI 시작 지침](https://hrum.ai/sajuEbook/part0.html) 에 있다. - 1-0 | 시작 전 확인 — 도구 고르기와 Node | [PART 1 계정 준비](https://hrum.ai/sajuEbook/part1.html) - 1-1 | HRUM 콘솔 가입과 API 키 발급 | [PART 1 계정 준비](https://hrum.ai/sajuEbook/part1.html) - 1-2 | HRUM 키를 안전하게 저장 — 값은 사용자만 입력 | [PART 1 계정 준비](https://hrum.ai/sajuEbook/part1.html) - 1-3 | 키가 진짜 되는지 확인 — PART 2 전에 꼭 | [PART 1 계정 준비](https://hrum.ai/sajuEbook/part1.html) - 1-4 | 코드 보관 고르기 — GitHub 는 선택 | [PART 1 계정 준비](https://hrum.ai/sajuEbook/part1.html) - 1-5 | RIDM Apps — 여러분 앱이 올라갈 곳 (미리 알아두기) | [PART 1 계정 준비](https://hrum.ai/sajuEbook/part1.html) - 2-1 | 바이브코딩이 실패하는 세 가지 이유 | [PART 2 기본기](https://hrum.ai/sajuEbook/part2.html) - 2-2 | 마법의 문장들 (불평 사전) | [PART 2 기본기](https://hrum.ai/sajuEbook/part2.html) - 3-1 | 컨셉 한 줄 공식 | [PART 3 컨셉·페르소나](https://hrum.ai/sajuEbook/part3.html) - 3-2 | 페르소나 설계 공식 (앱 캐릭터의 기준) | [PART 3 컨셉·페르소나](https://hrum.ai/sajuEbook/part3.html) - 3-3 | 완성 페르소나 예시 3종 (그대로 써도 됨) | [PART 3 컨셉·페르소나](https://hrum.ai/sajuEbook/part3.html) - 3-4 | 디자인 고르기 — 갤러리에서 훔쳐오는 법 | [PART 3 컨셉·페르소나](https://hrum.ai/sajuEbook/part3.html) - 4-0 | 개발 전 필수 결정 — AI가 코드를 치기 전에 반드시 물어야 하는 것들 (기술 + 창작 4 + 코드 보관) | [PART 4 결정서·마스터 스펙](https://hrum.ai/sajuEbook/part4.html) - 4-1 | 붙여넣기 전에 채울 것 (4-0의 결정서 하나에서 그대로 옮겨 담기) | [PART 4 결정서·마스터 스펙](https://hrum.ai/sajuEbook/part4.html) - 4-2 | 마스터 스펙 프롬프트 (부록 A에 전문 — 여기선 실행) | [PART 4 결정서·마스터 스펙](https://hrum.ai/sajuEbook/part4.html) - 4-3 | 나왔는지 검증 (완료 기준 체크) | [PART 4 결정서·마스터 스펙](https://hrum.ai/sajuEbook/part4.html) - 5-0 | 모든 화면이 쓰는 호출 헬퍼와 이 앱의 주제 | [PART 5 운세 화면](https://hrum.ai/sajuEbook/part5.html) - 5-1 | 기본 사주판 (필수) | [PART 5 운세 화면](https://hrum.ai/sajuEbook/part5.html) - 5-2 | 심화 위젯 골라 담기 (원하는 것만) | [PART 5 운세 화면](https://hrum.ai/sajuEbook/part5.html) - 5-3 | 자미두수 명반 화면 | [PART 5 운세 화면](https://hrum.ai/sajuEbook/part5.html) - 5-4 | 나의 별자리 화면 (네이탈 차트) | [PART 5 운세 화면](https://hrum.ai/sajuEbook/part5.html) - 5-5 | 타로 뽑기 화면 | [PART 5 운세 화면](https://hrum.ai/sajuEbook/part5.html) - 5-6 | 꿈해몽 화면 | [PART 5 운세 화면](https://hrum.ai/sajuEbook/part5.html) - 6-1 | 두 가지 상담 모드 (앱 성격에 따라 선택) | [PART 6 상담 채팅](https://hrum.ai/sajuEbook/part6.html) - 6-2 | 사주 상담 채팅 [메인 레시피] | [PART 6 상담 채팅](https://hrum.ai/sajuEbook/part6.html) - 6-3 | 페르소나를 채팅에 입히기 | [PART 6 상담 채팅](https://hrum.ai/sajuEbook/part6.html) - 6-4 | 흔한 함정 | [PART 6 상담 채팅](https://hrum.ai/sajuEbook/part6.html) - 7-1 | 실화 하나 | [PART 7 보안·테스트](https://hrum.ai/sajuEbook/part7.html) - 7-2 | 3중 방어선 | [PART 7 보안·테스트](https://hrum.ai/sajuEbook/part7.html) - 7-3 | 셀프 보안 점검 (배포 전 3분) | [PART 7 보안·테스트](https://hrum.ai/sajuEbook/part7.html) - 7-3-1 | 배포 전 보안 점검표 — 프록시·입력·한도 (3분) | [PART 7 보안·테스트](https://hrum.ai/sajuEbook/part7.html) - 7-3-2 | AI에게 코드를 시킬 때 같이 붙여 넣을 보안 지시문 · 검수 체크리스트 | [PART 7 보안·테스트](https://hrum.ai/sajuEbook/part7.html) - 7-4 | 그래도 유출됐다면 (1분 응급처치) | [PART 7 보안·테스트](https://hrum.ai/sajuEbook/part7.html) - 7-5 | 자동 테스트 — 타임아웃·동시 중복 요청·로그인 (브라우저 쓰로틀 금지) | [PART 7 보안·테스트](https://hrum.ai/sajuEbook/part7.html) - 7-6 | 배포 전 기록·격리 체크 (3분) | [PART 7 보안·테스트](https://hrum.ai/sajuEbook/part7.html) - 8-0 | 배포 파일 — 저장소 루트에 둔다 | [PART 8 배포](https://hrum.ai/sajuEbook/part8.html) - 8-1 | GitHub에 올리기 — 웹 배포에 필요 | [PART 8 배포](https://hrum.ai/sajuEbook/part8.html) - 8-2 | RIDM Apps 신청과 연결 | [PART 8 배포](https://hrum.ai/sajuEbook/part8.html) - 8-3 | 배포 후 스모크 테스트 | [PART 8 배포](https://hrum.ai/sajuEbook/part8.html) - 8-4 | 앱 운영하기 | [PART 8 배포](https://hrum.ai/sajuEbook/part8.html) - 8-5 | 출시 방법 고르기 — 웹 · 앱 · 토스 미니앱 (선택 · 결정서 범위 밖) | [PART 8 배포](https://hrum.ai/sajuEbook/part8.html) - 8-6 | 내 도메인으로 열기 — 사서 앱에 연결하기 (선택 · 결정서 범위 밖) | [PART 8 배포](https://hrum.ai/sajuEbook/part8.html) - 8-7 | 검색에 잘 나오게 — SEO 점검 스킬 돌리기 (선택 · 결정서 범위 밖) | [PART 8 배포](https://hrum.ai/sajuEbook/part8.html) - 9-1 | 상담 1회 원가 (실측 기준) | [PART 9 원가·가격·결제](https://hrum.ai/sajuEbook/part9.html) - 9-1-1 | 사주보기·연애운·금전운·신년운세 — 만드는 길과 저장해서 아끼는 법 | [PART 9 원가·가격·결제](https://hrum.ai/sajuEbook/part9.html) - 9-2 | 크레딧 관리 | [PART 9 원가·가격·결제](https://hrum.ai/sajuEbook/part9.html) - 9-3 | 수익화 아이디어 3단계 | [PART 9 원가·가격·결제](https://hrum.ai/sajuEbook/part9.html) - 9-4 | 결제 붙이기 — PG사와 직접 계약 | [PART 9 원가·가격·결제](https://hrum.ai/sajuEbook/part9.html) - 9-4-1 | 다른 길 — HRUM 지급대행으로 정산받기 | [PART 9 원가·가격·결제](https://hrum.ai/sajuEbook/part9.html) - 9-5 | 대성공하면? — 이 구조가 버티는 범위와 증축 시점 | [PART 9 원가·가격·결제](https://hrum.ai/sajuEbook/part9.html) - A-2 | 나머지 뼈대 파일 ([완전 코드] — 한 페이지형 예시) | [부록 A 스펙·코드 받기(A-2)](https://hrum.ai/sajuEbook/appendix-a.html) - B-1 | 오늘의 운세 위젯 (아침에 열게 만드는 훅) | [부록 B 레시피 B-1~B-6](https://hrum.ai/sajuEbook/appendix-b.html) - B-2 | 궁합 보기 (바이럴 기능) | [부록 B 레시피 B-1~B-6](https://hrum.ai/sajuEbook/appendix-b.html) - B-3 | 성격유형 미니 테스트 (가입 전 미끼) | [부록 B 레시피 B-1~B-6](https://hrum.ai/sajuEbook/appendix-b.html) - B-4 | 페르소나 갈아끼우기 (같은 앱, 다른 장사) | [부록 B 레시피 B-1~B-6](https://hrum.ai/sajuEbook/appendix-b.html) - B-5 | 대운 타임라인 (인생 그래프) | [부록 B 레시피 B-1~B-6](https://hrum.ai/sajuEbook/appendix-b.html) - B-6 | 사주 리포트 — "990 사주" 방식 (리포트형 상품) | [부록 B 레시피 B-1~B-6](https://hrum.ai/sajuEbook/appendix-b.html) - B-7 | 관리자 페이지 (회원 관리·정지·요약 숫자) | [부록 B-7 관리자 페이지](https://hrum.ai/sajuEbook/appendix-b7.html) - E-0 | 원국을 여러 개 저장하기 (가족·지인) | [부록 E 앱 DB 테이블 늘리기](https://hrum.ai/sajuEbook/appendix-e.html) - E-1 | 대화 기록을 우리 DB에도 남기기 (기억 "불필요"를 고른 앱만) | [부록 E 앱 DB 테이블 늘리기](https://hrum.ai/sajuEbook/appendix-e.html) - E-2 | 리포트 보관 (saju_reports) | [부록 E 앱 DB 테이블 늘리기](https://hrum.ai/sajuEbook/appendix-e.html) - E-3 | 용량과 점검 | [부록 E 앱 DB 테이블 늘리기](https://hrum.ai/sajuEbook/appendix-e.html) - E-4 | 이 구조의 숨은 장점 | [부록 E 앱 DB 테이블 늘리기](https://hrum.ai/sajuEbook/appendix-e.html) ### 사주만 (단독판) 지도: https://hrum.ai/sajuEbook/saju/ 핵심 규칙과 섹션 번호 표는 통합 운세 책과 같다(페이지 주소만 이 판의 것). #### 단계 지도 - 0. 규칙 | [PART 0 사용법·AI 시작 지침](https://hrum.ai/sajuEbook/saju/part0.html) | 명령 없음 — 핵심 규칙과 [AI 시작 지침] 0~7 을 읽었다(사용자에게 보낼 첫 메시지는 1단계 페이지를 읽은 뒤의 0.5 질문) | 1단계 - 1. 준비·결정서 | [PART 1 계정 준비](https://hrum.ai/sajuEbook/saju/part1.html) [PART 2 기본기](https://hrum.ai/sajuEbook/saju/part2.html) [PART 3 컨셉·페르소나](https://hrum.ai/sajuEbook/saju/part3.html) [PART 4 결정서·마스터 스펙](https://hrum.ai/sajuEbook/saju/part4.html) [PART 9 원가·가격·결제](https://hrum.ai/sajuEbook/saju/part9.html) | 0.5 질문 → 4-0 결정 항목을 한 메시지로 → [제작 결정서]에 대한 사용자의 명시적 승인("승인"·"이대로 진행")과 PROGRESS.md 의 결정서 사본. 유료화는 9-4 대로 결정서에 적는다. 계정 게이트(PART 1)는 사용자의 "완료" 답(MCP 경로면 `hrum_issue_key` 의 `saved: true`·`gitignored: true` 출력) | 2단계 - 2. 코드 받기 | [부록 A 스펙·코드 받기(A-2)](https://hrum.ai/sajuEbook/saju/appendix-a.html) | `node -v` → v22.12 이상 · 빈 폴더에서 A-2 의 curl 한 줄 → `git init -b main` → `node scripts/verify-book-code.mjs` → "불일치 0개" · `npm install` 오류 없음 | 3단계 - 3. 화면 | [PART 5 만세력 화면](https://hrum.ai/sajuEbook/saju/part5.html) [PART 6 상담 채팅](https://hrum.ai/sajuEbook/saju/part6.html) [부록 C API 요약표](https://hrum.ai/sajuEbook/saju/appendix-c.html) | 수정 허용 파일만 결정서대로 고친 뒤 `npm run build` 에러 0 · `npx vitest run` 전부 통과 · `node scripts/verify-book-code.mjs` → "불일치 0개" | 4단계 - 4. 보안·테스트 | [PART 7 보안·테스트](https://hrum.ai/sajuEbook/saju/part7.html) | `npm run check` 전부 통과 + DB 테스트 한 줄(5-f) · `node scripts/smoke-live.mjs http://localhost:3000 --quick` 실패 0개 · `grep -r "float_live_" app/ components/ lib/` 출력 없음 | 5단계 - 5. 배포 | [PART 8 배포](https://hrum.ai/sajuEbook/saju/part8.html) | `curl -s -A "Mozilla/5.0" https://이름.ridm.ai/api/health` 의 commit = `git rev-parse HEAD` · `node scripts/smoke-live.mjs https://이름.ridm.ai` 실패 0개 | 6단계(결정서에 선택 기능이 없으면 완료 보고 5-f) - 6. 선택 기능 — 결정서에 고른 것만 | [부록 B 레시피 B-1~B-6](https://hrum.ai/sajuEbook/saju/appendix-b.html) [부록 B-7 관리자 페이지](https://hrum.ai/sajuEbook/saju/appendix-b7.html) (결정서에 테이블 추가·가족 원국·리포트 보관이 있으면) [부록 E 앱 DB 테이블 늘리기](https://hrum.ai/sajuEbook/saju/appendix-e.html) | 고른 레시피마다 그 레시피의 완료 기준 · 다시 `npm run check` 통과 · push 뒤 health commit 일치 · `node scripts/smoke-live.mjs https://이름.ridm.ai` 실패 0개(B-2 를 붙였으면 --compat) | 완료 보고(PART 0 5-f) - 7. 운영·개정 — 필요할 때만 | [부록 D 트러블슈팅](https://hrum.ai/sajuEbook/saju/appendix-d.html) [부록 E 앱 DB 테이블 늘리기](https://hrum.ai/sajuEbook/saju/appendix-e.html) | 개정: verify 가 "다름"이면 PART 0 지침 5-b 의 네 단계(옛 판에서 이어 오면: 예전 책대로 lib/db.ts 의 SCHEMA 에 덧붙인 테이블은 lib/schema-extra.ts 로 옮기고(부록 E), 프록시·app/api/history 에 넣었던 기능(원국 여러 개·대화 기록 저장)은 lib/app-hooks.ts 로 옮긴다(부록 E-0·E-1).) → `npm run check` 통과 → push. 막힘: 부록 D 조치 뒤 그 단계의 증거를 다시 보인다. 테이블 추가: 부록 E 뒤 `npm run check`(테스트 DB 가 있으면 TEST_DATABASE_URL 과 함께) | 해당 단계로 돌아간다 ### 자미두수만 (단독판) 지도: https://hrum.ai/sajuEbook/ziwei/ 핵심 규칙과 섹션 번호 표는 통합 운세 책과 같다(페이지 주소만 이 판의 것). #### 단계 지도 - 0. 규칙 | [PART 0 사용법·AI 시작 지침](https://hrum.ai/sajuEbook/ziwei/part0.html) | 명령 없음 — 핵심 규칙과 [AI 시작 지침] 0~7 을 읽었다(사용자에게 보낼 첫 메시지는 1단계 페이지를 읽은 뒤의 0.5 질문) | 1단계 - 1. 준비·결정서 | [PART 1 계정 준비](https://hrum.ai/sajuEbook/ziwei/part1.html) [PART 2 기본기](https://hrum.ai/sajuEbook/ziwei/part2.html) [PART 3 컨셉·페르소나](https://hrum.ai/sajuEbook/ziwei/part3.html) [PART 4 결정서·마스터 스펙](https://hrum.ai/sajuEbook/ziwei/part4.html) [PART 9 원가·가격·결제](https://hrum.ai/sajuEbook/ziwei/part9.html) | 0.5 질문 → 4-0 결정 항목을 한 메시지로 → [제작 결정서]에 대한 사용자의 명시적 승인("승인"·"이대로 진행")과 PROGRESS.md 의 결정서 사본. 유료화는 9-4 대로 결정서에 적는다. 계정 게이트(PART 1)는 사용자의 "완료" 답(MCP 경로면 `hrum_issue_key` 의 `saved: true`·`gitignored: true` 출력) | 2단계 - 2. 코드 받기 | [부록 A 스펙·코드 받기(A-2)](https://hrum.ai/sajuEbook/ziwei/appendix-a.html) | `node -v` → v22.12 이상 · 빈 폴더에서 A-2 의 curl 한 줄 → `git init -b main` → `node scripts/verify-book-code.mjs` → "불일치 0개" · `npm install` 오류 없음 | 3단계 - 3. 화면 | [PART 5 자미두수 명반 화면](https://hrum.ai/sajuEbook/ziwei/part5.html) [PART 6 상담 채팅](https://hrum.ai/sajuEbook/ziwei/part6.html) [부록 C API 요약표](https://hrum.ai/sajuEbook/ziwei/appendix-c.html) | 수정 허용 파일만 결정서대로 고친 뒤 `npm run build` 에러 0 · `npx vitest run` 전부 통과 · `node scripts/verify-book-code.mjs` → "불일치 0개" | 4단계 - 4. 보안·테스트 | [PART 7 보안·테스트](https://hrum.ai/sajuEbook/ziwei/part7.html) | `npm run check` 전부 통과 + DB 테스트 한 줄(5-f) · `node scripts/smoke-live.mjs http://localhost:3000 --quick` 실패 0개 · `grep -r "float_live_" app/ components/ lib/` 출력 없음 | 5단계 - 5. 배포 | [PART 8 배포](https://hrum.ai/sajuEbook/ziwei/part8.html) | `curl -s -A "Mozilla/5.0" https://이름.ridm.ai/api/health` 의 commit = `git rev-parse HEAD` · `node scripts/smoke-live.mjs https://이름.ridm.ai` 실패 0개 | 6단계(결정서에 선택 기능이 없으면 완료 보고 5-f) - 6. 선택 기능 — 결정서에 고른 것만 | [부록 B 레시피 B-4](https://hrum.ai/sajuEbook/ziwei/appendix-b.html) [부록 B-7 관리자 페이지](https://hrum.ai/sajuEbook/ziwei/appendix-b7.html) (결정서에 테이블 추가·가족 원국·리포트 보관이 있으면) [부록 E 앱 DB 테이블 늘리기](https://hrum.ai/sajuEbook/ziwei/appendix-e.html) | 고른 레시피마다 그 레시피의 완료 기준 · 다시 `npm run check` 통과 · push 뒤 health commit 일치 · `node scripts/smoke-live.mjs https://이름.ridm.ai` 실패 0개(B-2 를 붙였으면 --compat) | 완료 보고(PART 0 5-f) - 7. 운영·개정 — 필요할 때만 | [부록 D 트러블슈팅](https://hrum.ai/sajuEbook/ziwei/appendix-d.html) [부록 E 앱 DB 테이블 늘리기](https://hrum.ai/sajuEbook/ziwei/appendix-e.html) | 개정: verify 가 "다름"이면 PART 0 지침 5-b 의 네 단계(옛 판에서 이어 오면: 예전 책대로 lib/db.ts 의 SCHEMA 에 덧붙인 테이블은 lib/schema-extra.ts 로 옮기고(부록 E), 프록시·app/api/history 에 넣었던 기능(원국 여러 개·대화 기록 저장)은 lib/app-hooks.ts 로 옮긴다(부록 E-0·E-1).) → `npm run check` 통과 → push. 막힘: 부록 D 조치 뒤 그 단계의 증거를 다시 보인다. 테이블 추가: 부록 E 뒤 `npm run check`(테스트 DB 가 있으면 TEST_DATABASE_URL 과 함께) | 해당 단계로 돌아간다 ### 점성술만 (단독판) 지도: https://hrum.ai/sajuEbook/astro/ 핵심 규칙과 섹션 번호 표는 통합 운세 책과 같다(페이지 주소만 이 판의 것). #### 단계 지도 - 0. 규칙 | [PART 0 사용법·AI 시작 지침](https://hrum.ai/sajuEbook/astro/part0.html) | 명령 없음 — 핵심 규칙과 [AI 시작 지침] 0~7 을 읽었다(사용자에게 보낼 첫 메시지는 1단계 페이지를 읽은 뒤의 0.5 질문) | 1단계 - 1. 준비·결정서 | [PART 1 계정 준비](https://hrum.ai/sajuEbook/astro/part1.html) [PART 2 기본기](https://hrum.ai/sajuEbook/astro/part2.html) [PART 3 컨셉·페르소나](https://hrum.ai/sajuEbook/astro/part3.html) [PART 4 결정서·마스터 스펙](https://hrum.ai/sajuEbook/astro/part4.html) [PART 9 원가·가격·결제](https://hrum.ai/sajuEbook/astro/part9.html) | 0.5 질문 → 4-0 결정 항목을 한 메시지로 → [제작 결정서]에 대한 사용자의 명시적 승인("승인"·"이대로 진행")과 PROGRESS.md 의 결정서 사본. 유료화는 9-4 대로 결정서에 적는다. 계정 게이트(PART 1)는 사용자의 "완료" 답(MCP 경로면 `hrum_issue_key` 의 `saved: true`·`gitignored: true` 출력) | 2단계 - 2. 코드 받기 | [부록 A 스펙·코드 받기(A-2)](https://hrum.ai/sajuEbook/astro/appendix-a.html) | `node -v` → v22.12 이상 · 빈 폴더에서 A-2 의 curl 한 줄 → `git init -b main` → `node scripts/verify-book-code.mjs` → "불일치 0개" · `npm install` 오류 없음 | 3단계 - 3. 화면 | [PART 5 별자리 화면](https://hrum.ai/sajuEbook/astro/part5.html) [PART 6 상담 채팅](https://hrum.ai/sajuEbook/astro/part6.html) [부록 C API 요약표](https://hrum.ai/sajuEbook/astro/appendix-c.html) | 수정 허용 파일만 결정서대로 고친 뒤 `npm run build` 에러 0 · `npx vitest run` 전부 통과 · `node scripts/verify-book-code.mjs` → "불일치 0개" | 4단계 - 4. 보안·테스트 | [PART 7 보안·테스트](https://hrum.ai/sajuEbook/astro/part7.html) | `npm run check` 전부 통과 + DB 테스트 한 줄(5-f) · `node scripts/smoke-live.mjs http://localhost:3000 --quick` 실패 0개 · `grep -r "float_live_" app/ components/ lib/` 출력 없음 | 5단계 - 5. 배포 | [PART 8 배포](https://hrum.ai/sajuEbook/astro/part8.html) | `curl -s -A "Mozilla/5.0" https://이름.ridm.ai/api/health` 의 commit = `git rev-parse HEAD` · `node scripts/smoke-live.mjs https://이름.ridm.ai` 실패 0개 | 6단계(결정서에 선택 기능이 없으면 완료 보고 5-f) - 6. 선택 기능 — 결정서에 고른 것만 | [부록 B 레시피 B-4](https://hrum.ai/sajuEbook/astro/appendix-b.html) [부록 B-7 관리자 페이지](https://hrum.ai/sajuEbook/astro/appendix-b7.html) (결정서에 테이블 추가·가족 원국·리포트 보관이 있으면) [부록 E 앱 DB 테이블 늘리기](https://hrum.ai/sajuEbook/astro/appendix-e.html) | 고른 레시피마다 그 레시피의 완료 기준 · 다시 `npm run check` 통과 · push 뒤 health commit 일치 · `node scripts/smoke-live.mjs https://이름.ridm.ai` 실패 0개(B-2 를 붙였으면 --compat) | 완료 보고(PART 0 5-f) - 7. 운영·개정 — 필요할 때만 | [부록 D 트러블슈팅](https://hrum.ai/sajuEbook/astro/appendix-d.html) [부록 E 앱 DB 테이블 늘리기](https://hrum.ai/sajuEbook/astro/appendix-e.html) | 개정: verify 가 "다름"이면 PART 0 지침 5-b 의 네 단계(옛 판에서 이어 오면: 예전 책대로 lib/db.ts 의 SCHEMA 에 덧붙인 테이블은 lib/schema-extra.ts 로 옮기고(부록 E), 프록시·app/api/history 에 넣었던 기능(원국 여러 개·대화 기록 저장)은 lib/app-hooks.ts 로 옮긴다(부록 E-0·E-1).) → `npm run check` 통과 → push. 막힘: 부록 D 조치 뒤 그 단계의 증거를 다시 보인다. 테이블 추가: 부록 E 뒤 `npm run check`(테스트 DB 가 있으면 TEST_DATABASE_URL 과 함께) | 해당 단계로 돌아간다 ### 타로만 (단독판) 지도: https://hrum.ai/sajuEbook/tarot/ 핵심 규칙과 섹션 번호 표는 통합 운세 책과 같다(페이지 주소만 이 판의 것). #### 단계 지도 - 0. 규칙 | [PART 0 사용법·AI 시작 지침](https://hrum.ai/sajuEbook/tarot/part0.html) | 명령 없음 — 핵심 규칙과 [AI 시작 지침] 0~7 을 읽었다(사용자에게 보낼 첫 메시지는 1단계 페이지를 읽은 뒤의 0.5 질문) | 1단계 - 1. 준비·결정서 | [PART 1 계정 준비](https://hrum.ai/sajuEbook/tarot/part1.html) [PART 2 기본기](https://hrum.ai/sajuEbook/tarot/part2.html) [PART 3 컨셉·페르소나](https://hrum.ai/sajuEbook/tarot/part3.html) [PART 4 결정서·마스터 스펙](https://hrum.ai/sajuEbook/tarot/part4.html) [PART 9 원가·가격·결제](https://hrum.ai/sajuEbook/tarot/part9.html) | 0.5 질문 → 4-0 결정 항목을 한 메시지로 → [제작 결정서]에 대한 사용자의 명시적 승인("승인"·"이대로 진행")과 PROGRESS.md 의 결정서 사본. 유료화는 9-4 대로 결정서에 적는다. 계정 게이트(PART 1)는 사용자의 "완료" 답(MCP 경로면 `hrum_issue_key` 의 `saved: true`·`gitignored: true` 출력) | 2단계 - 2. 코드 받기 | [부록 A 스펙·코드 받기(A-2)](https://hrum.ai/sajuEbook/tarot/appendix-a.html) | `node -v` → v22.12 이상 · 빈 폴더에서 A-2 의 curl 한 줄 → `git init -b main` → `node scripts/verify-book-code.mjs` → "불일치 0개" · `npm install` 오류 없음 | 3단계 - 3. 화면 | [PART 5 타로 뽑기 화면](https://hrum.ai/sajuEbook/tarot/part5.html) [PART 6 상담 채팅](https://hrum.ai/sajuEbook/tarot/part6.html) [부록 C API 요약표](https://hrum.ai/sajuEbook/tarot/appendix-c.html) | 수정 허용 파일만 결정서대로 고친 뒤 `npm run build` 에러 0 · `npx vitest run` 전부 통과 · `node scripts/verify-book-code.mjs` → "불일치 0개" | 4단계 - 4. 보안·테스트 | [PART 7 보안·테스트](https://hrum.ai/sajuEbook/tarot/part7.html) | `npm run check` 전부 통과 + DB 테스트 한 줄(5-f) · `node scripts/smoke-live.mjs http://localhost:3000 --quick` 실패 0개 · `grep -r "float_live_" app/ components/ lib/` 출력 없음 | 5단계 - 5. 배포 | [PART 8 배포](https://hrum.ai/sajuEbook/tarot/part8.html) | `curl -s -A "Mozilla/5.0" https://이름.ridm.ai/api/health` 의 commit = `git rev-parse HEAD` · `node scripts/smoke-live.mjs https://이름.ridm.ai` 실패 0개 | 6단계(결정서에 선택 기능이 없으면 완료 보고 5-f) - 6. 선택 기능 — 결정서에 고른 것만 | [부록 B 레시피 B-4](https://hrum.ai/sajuEbook/tarot/appendix-b.html) [부록 B-7 관리자 페이지](https://hrum.ai/sajuEbook/tarot/appendix-b7.html) (결정서에 테이블 추가·가족 원국·리포트 보관이 있으면) [부록 E 앱 DB 테이블 늘리기](https://hrum.ai/sajuEbook/tarot/appendix-e.html) | 고른 레시피마다 그 레시피의 완료 기준 · 다시 `npm run check` 통과 · push 뒤 health commit 일치 · `node scripts/smoke-live.mjs https://이름.ridm.ai` 실패 0개(B-2 를 붙였으면 --compat) | 완료 보고(PART 0 5-f) - 7. 운영·개정 — 필요할 때만 | [부록 D 트러블슈팅](https://hrum.ai/sajuEbook/tarot/appendix-d.html) [부록 E 앱 DB 테이블 늘리기](https://hrum.ai/sajuEbook/tarot/appendix-e.html) | 개정: verify 가 "다름"이면 PART 0 지침 5-b 의 네 단계(옛 판에서 이어 오면: 예전 책대로 lib/db.ts 의 SCHEMA 에 덧붙인 테이블은 lib/schema-extra.ts 로 옮기고(부록 E), 프록시·app/api/history 에 넣었던 기능(원국 여러 개·대화 기록 저장)은 lib/app-hooks.ts 로 옮긴다(부록 E-0·E-1).) → `npm run check` 통과 → push. 막힘: 부록 D 조치 뒤 그 단계의 증거를 다시 보인다. 테이블 추가: 부록 E 뒤 `npm run check`(테스트 DB 가 있으면 TEST_DATABASE_URL 과 함께) | 해당 단계로 돌아간다 ### 꿈해몽만 (단독판) 지도: https://hrum.ai/sajuEbook/dream/ 핵심 규칙과 섹션 번호 표는 통합 운세 책과 같다(페이지 주소만 이 판의 것). #### 단계 지도 - 0. 규칙 | [PART 0 사용법·AI 시작 지침](https://hrum.ai/sajuEbook/dream/part0.html) | 명령 없음 — 핵심 규칙과 [AI 시작 지침] 0~7 을 읽었다(사용자에게 보낼 첫 메시지는 1단계 페이지를 읽은 뒤의 0.5 질문) | 1단계 - 1. 준비·결정서 | [PART 1 계정 준비](https://hrum.ai/sajuEbook/dream/part1.html) [PART 2 기본기](https://hrum.ai/sajuEbook/dream/part2.html) [PART 3 컨셉·페르소나](https://hrum.ai/sajuEbook/dream/part3.html) [PART 4 결정서·마스터 스펙](https://hrum.ai/sajuEbook/dream/part4.html) [PART 9 원가·가격·결제](https://hrum.ai/sajuEbook/dream/part9.html) | 0.5 질문 → 4-0 결정 항목을 한 메시지로 → [제작 결정서]에 대한 사용자의 명시적 승인("승인"·"이대로 진행")과 PROGRESS.md 의 결정서 사본. 유료화는 9-4 대로 결정서에 적는다. 계정 게이트(PART 1)는 사용자의 "완료" 답(MCP 경로면 `hrum_issue_key` 의 `saved: true`·`gitignored: true` 출력) | 2단계 - 2. 코드 받기 | [부록 A 스펙·코드 받기(A-2)](https://hrum.ai/sajuEbook/dream/appendix-a.html) | `node -v` → v22.12 이상 · 빈 폴더에서 A-2 의 curl 한 줄 → `git init -b main` → `node scripts/verify-book-code.mjs` → "불일치 0개" · `npm install` 오류 없음 | 3단계 - 3. 화면 | [PART 5 꿈해몽 화면](https://hrum.ai/sajuEbook/dream/part5.html) [PART 6 상담 채팅](https://hrum.ai/sajuEbook/dream/part6.html) [부록 C API 요약표](https://hrum.ai/sajuEbook/dream/appendix-c.html) | 수정 허용 파일만 결정서대로 고친 뒤 `npm run build` 에러 0 · `npx vitest run` 전부 통과 · `node scripts/verify-book-code.mjs` → "불일치 0개" | 4단계 - 4. 보안·테스트 | [PART 7 보안·테스트](https://hrum.ai/sajuEbook/dream/part7.html) | `npm run check` 전부 통과 + DB 테스트 한 줄(5-f) · `node scripts/smoke-live.mjs http://localhost:3000 --quick` 실패 0개 · `grep -r "float_live_" app/ components/ lib/` 출력 없음 | 5단계 - 5. 배포 | [PART 8 배포](https://hrum.ai/sajuEbook/dream/part8.html) | `curl -s -A "Mozilla/5.0" https://이름.ridm.ai/api/health` 의 commit = `git rev-parse HEAD` · `node scripts/smoke-live.mjs https://이름.ridm.ai` 실패 0개 | 6단계(결정서에 선택 기능이 없으면 완료 보고 5-f) - 6. 선택 기능 — 결정서에 고른 것만 | [부록 B 레시피 B-4](https://hrum.ai/sajuEbook/dream/appendix-b.html) [부록 B-7 관리자 페이지](https://hrum.ai/sajuEbook/dream/appendix-b7.html) (결정서에 테이블 추가·가족 원국·리포트 보관이 있으면) [부록 E 앱 DB 테이블 늘리기](https://hrum.ai/sajuEbook/dream/appendix-e.html) | 고른 레시피마다 그 레시피의 완료 기준 · 다시 `npm run check` 통과 · push 뒤 health commit 일치 · `node scripts/smoke-live.mjs https://이름.ridm.ai` 실패 0개(B-2 를 붙였으면 --compat) | 완료 보고(PART 0 5-f) - 7. 운영·개정 — 필요할 때만 | [부록 D 트러블슈팅](https://hrum.ai/sajuEbook/dream/appendix-d.html) [부록 E 앱 DB 테이블 늘리기](https://hrum.ai/sajuEbook/dream/appendix-e.html) | 개정: verify 가 "다름"이면 PART 0 지침 5-b 의 네 단계(옛 판에서 이어 오면: 예전 책대로 lib/db.ts 의 SCHEMA 에 덧붙인 테이블은 lib/schema-extra.ts 로 옮기고(부록 E), 프록시·app/api/history 에 넣었던 기능(원국 여러 개·대화 기록 저장)은 lib/app-hooks.ts 로 옮긴다(부록 E-0·E-1).) → `npm run check` 통과 → push. 막힘: 부록 D 조치 뒤 그 단계의 증거를 다시 보인다. 테이블 추가: 부록 E 뒤 `npm run check`(테스트 DB 가 있으면 TEST_DATABASE_URL 과 함께) | 해당 단계로 돌아간다 ### AI앱 책 (기억하는 캐릭터 채팅) 지도: https://hrum.ai/aiEbook/ 여기부터 AI용 지도 — AI 코딩 도구는 이 아래를 따른다 핵심 규칙 — AI 는 어느 페이지에서든 이것을 지킨다 - 사용자가 제작 결정서를 명시적으로 승인하기 전에는 코드를 한 줄도 쓰지 않는다. 승인 뒤에는 결정서에 없는 질문·기능을 더하지 않고, 결정서 범위를 끝까지 완주한다. - 책 코드 파일은 손으로 옮겨 쓰거나 다시 쓰지 않는다 — `node scripts/get-book-code.mjs` 가 책 그대로 만든다(첫 실행은 부록 A-2 의 curl 한 줄). AI용 분할본의 코드 자리는 " 경로" 한 줄이다 — 그 파일을 cat 으로 읽는다. 고쳐도 되는 파일은 PART 0 [AI 시작 지침] 5-b 의 목록뿐이다. - 매 push 와 완료 보고 전에 `node scripts/verify-book-code.mjs` 를 실행해 "불일치 0개" 출력을 그대로 보인다. - API 키·비밀번호 값을 채팅·코드·로그·PROGRESS.md 에 적지 않는다. 환경변수는 "이름 + 설정 완료 여부"만 보고받는다. - 확인은 AI 가 직접 명령을 실행해 출력으로 증명한다. push ≠ 배포 — 실서버 /api/health 의 commit 이 내 마지막 커밋과 같아지기 전에는 "배포됐다"고 말하지 않는다. - AI 는 지도(https://console.hrum.ai/aiEbook/ — 같은 지도가 aiEbook/ai.html 에도 있다)의 단계 순서대로 그 단계의 페이지만 읽는다. 진행 상황은 PROGRESS.md 에 적고, 이어서 할 때는 지도의 다음 단계로 간다 — 승인된 결정서를 다시 묻지 않는다. 전체본 aiEbook.html 은 사람용이다(링크를 못 여는 도구에 첨부할 때만 AI 가 전체를 읽는다). - 기억 방식은 결정서에서 고른 하나 — ① 세션형 · ② RIDM 무한세션 메모리형 · ③ RIDM 세션 단위 메모리형 — 이고, lib/chat-settings.ts 의 CHAT_MODE 한 줄('session' · 'ridm-infinite' · 'ridm-session')로만 정한다. RIDM 기억 범위는 HRUM 에 보내는 user 키가 정하며, 그 키는 서버가 로그인 세션의 회원 id 로 만든다(lib/app-hooks.ts) — 브라우저가 보낸 값으로 만들지 않는다. "기억"이라고 말할 때는 어느 방식의 기억인지 함께 말한다. - 사용자가 직접 만들기 어려워하면(설치·배포에서 같은 곳에 반복해 막히거나, 직접 만들기를 원하지 않으면) 흐름의 제작 지원 페이지 https://hrum.ai/app-development.html#support 를 안내한다. 가격은 그 페이지를 보여 주고 직접 말하지 않는다. #### AI용 지도 — 기억하는 AI 캐릭터 채팅 서비스 이 지도는 AI 코딩 도구가 읽는 분할본의 첫 페이지입니다. 아래 단계 순서대로, 지금 단계에 적힌 페이지만 열어 읽습니다. 다음 단계 페이지는 지금 단계의 "끝났다는 증거"(명령 출력)를 사용자에게 보인 뒤에 엽니다. 각 페이지 머리에 핵심 규칙과 "이 페이지 전에 읽을 페이지"가 있습니다. - 처음 시작: 0단계 [PART 0 사용법·AI 시작 지침](https://hrum.ai/aiEbook/part0.html) 의 [AI 시작 지침]부터. - 진행 중인 프로젝트(결정서 승인됨·프로젝트 폴더에 PROGRESS.md 있음): PROGRESS.md 를 먼저 읽고 거기 적힌 다음 단계로 간다 — 승인된 결정서를 다시 묻지 않는다. 이어 가기 전에 `node scripts/verify-book-code.mjs` 부터 실행한다. 규칙을 잊지 않도록 0단계 [PART 0 사용법·AI 시작 지침](https://hrum.ai/aiEbook/part0.html) 는 다시 읽는다. - 기억 방식: 이 책의 앱은 결정서에서 고른 하나 — ① 세션형(`session`) · ② RIDM 무한세션 메모리형(`ridm-infinite`) · ③ RIDM 세션 단위 메모리형(`ridm-session`) — 로 동작한다. 차이는 [PART 4 결정서·기억 방식 3종](https://hrum.ai/aiEbook/part4.html) 의 4-1 표에 있고, 코드는 `lib/chat-settings.ts` 의 `CHAT_MODE` 한 줄로 정한다. RIDM 기억 범위는 HRUM 에 보내는 `user` 키가 정한다. - 막히면: 어느 단계에서든 막히면 [부록 D 트러블슈팅](https://hrum.ai/aiEbook/appendix-d.html) 를 연다 — 조치 뒤 그 단계의 증거를 다시 보인다. - 코드: 분할본의 코드 자리는 한 줄 — 2단계에서 get-book-code 가 만든 로컬 파일을 cat 으로 읽는다. - 이 책의 범위: HRUM AI 채팅(리셀 모델 또는 RIDM 기억) + RIDM Apps 호스팅 + 앱 전용 DB. 사용자가 사주 앱이나 AI 없는 회원제 웹앱을 원하면 이 책이 아니라 [전자책 선택 페이지](https://hrum.ai/ebook/)에서 맞는 책으로 간다. - 전체본 https://hrum.ai/aiEbook.html 은 사람용 — 분할 모드의 AI 는 열지 않는다(지도를 못 여는 도구만 첨부된 전체본을 처음부터 읽는다). #### 단계 지도 - 0. 규칙 | [PART 0 사용법·AI 시작 지침](https://hrum.ai/aiEbook/part0.html) | 명령 없음 — 핵심 규칙과 [AI 시작 지침] 0~7 을 읽었다(사용자에게 보낼 첫 메시지는 1단계 페이지를 읽은 뒤의 4-0 질문) | 1단계 - 1. 준비·결정서 | [PART 1 계정 준비](https://hrum.ai/aiEbook/part1.html) [PART 2 기본기](https://hrum.ai/aiEbook/part2.html) [PART 3 컨셉·캐릭터](https://hrum.ai/aiEbook/part3.html) [PART 4 결정서·기억 방식 3종](https://hrum.ai/aiEbook/part4.html) [PART 9 원가·크레딧·결제](https://hrum.ai/aiEbook/part9.html) | 4-0 결정 항목을 한 메시지로(기억 방식은 4-1 표로 세 가지를 나란히) → [제작 결정서]에 대한 사용자의 명시적 승인("승인"·"이대로 진행")과 PROGRESS.md 의 결정서 사본(기억 방식 ①/②/③ 과 CHAT_MODE 값 포함). 유료화는 9-4 대로 결정서에 적는다. 계정 게이트(PART 1)는 사용자의 "완료" 답(MCP 경로면 `hrum_issue_key` 의 `saved: true`·`gitignored: true` 출력) | 2단계 - 2. 코드 받기 | [부록 A 스펙·코드 받기(A-2)](https://hrum.ai/aiEbook/appendix-a.html) | `node -v` → v22.12 이상 · 새 프로젝트 폴더(1단계 PROGRESS.md 만 있어도 됨)에서 A-2 의 curl 한 줄 → 마지막 줄 "[완전 코드] N개 — 새로 만듦 N · 책 원문으로 되돌림 0 · 책과 다름 0" · `git init -b main` · 1-2 키 저장(`git check-ignore .env.local` 이 경로 출력) · `npm install` 오류 없음 · `node scripts/verify-book-code.mjs` → "[완전 코드] N개 확인 — 불일치 0개" | 3단계 - 3. 채팅 | [PART 5 채팅 서버](https://hrum.ai/aiEbook/part5.html) [PART 6 채팅 화면·지난 대화·탈퇴](https://hrum.ai/aiEbook/part6.html) [부록 C HRUM 채팅 API 요약](https://hrum.ai/aiEbook/appendix-c.html) | 결정서대로 `lib/chat-settings.ts`(CHAT_MODE·DAILY_CHAT_LIMIT·MODELS)·`lib/persona-list.ts`·화면 파일만 고친 뒤 `grep -n "CHAT_MODE: ChatMode" lib/chat-settings.ts` 가 결정서의 기억 방식 · `npm run build` 에러 0 · `npx vitest run` 전부 통과 · `node scripts/verify-book-code.mjs` → "불일치 0개" | 4단계 - 4. 보안·테스트 | [PART 7 보안](https://hrum.ai/aiEbook/part7.html) [PART 7 테스트·로컬 실행](https://hrum.ai/aiEbook/part7b.html) | `npm run check` 전부 통과 + DB 테스트 한 줄(5-f — 테스트 DB 가 있으면 세 기억 방식 테스트까지 skipped 0) · 7-6 대로 앱을 띄우고 `node scripts/smoke-live.mjs http://localhost:3000 --quick` 실패 0개(3000 이 쓰이면 띄운 포트의 주소) · `grep -r "float_live_" app/ components/ lib/` 출력 없음 | 5단계 - 5. 배포 | [PART 8 배포](https://hrum.ai/aiEbook/part8.html) | `curl -s -A "Mozilla/5.0" https://이름.ridm.ai/api/health` 의 commit = `git rev-parse HEAD` · 콘솔에 HRUM_API_KEY 설정 완료 뒤 `node scripts/smoke-live.mjs https://이름.ridm.ai` 실패 0개("대화 방식" 항목 = 결정서의 기억 방식) | 6단계(결정서에 선택 기능이 없으면 완료 보고 5-f) - 6. 선택 기능 — 결정서에 고른 것만 | [부록 B 선택 기능 B-4·B-7](https://hrum.ai/aiEbook/appendix-b.html) | 고른 레시피마다 그 레시피의 완료 기준 · 다시 `npm run check` 통과 · push 뒤 health commit 일치 · `node scripts/smoke-live.mjs https://이름.ridm.ai` 실패 0개(B-7 을 켰으면 --admin) | 완료 보고(PART 0 5-f) - 7. 운영·개정 — 필요할 때만 | [부록 D 트러블슈팅](https://hrum.ai/aiEbook/appendix-d.html) [부록 E 앱 DB 테이블 늘리기](https://hrum.ai/aiEbook/appendix-e.html) | 개정: verify 가 "다름"이면 PART 0 지침 5-b 의 네 단계 → `npm run check` 통과 → push. 막힘: 부록 D 조치 뒤 그 단계의 증거를 다시 보인다. 테이블 추가: 부록 E 뒤 `npm run check`(테스트 DB 가 있으면 TEST_DATABASE_URL 과 함께) | 해당 단계로 돌아간다 #### 섹션 번호 → 페이지 본문이 "5-4 참조"처럼 다른 섹션을 가리키면 이 표로 페이지를 찾는다. [AI 시작 지침] 0~7(5-b 수정 허용 파일·개정 절차, 5-f 완료 보고 포함)은 [PART 0 사용법·AI 시작 지침](https://hrum.ai/aiEbook/part0.html) 에 있다. - 1-0 | 시작 전 확인 — 도구 고르기와 Node | [PART 1 계정 준비](https://hrum.ai/aiEbook/part1.html) - 1-1 | HRUM 콘솔 가입과 API 키 발급 | [PART 1 계정 준비](https://hrum.ai/aiEbook/part1.html) - 1-2 | HRUM 키를 안전하게 저장 — 값은 사용자만 입력 | [PART 1 계정 준비](https://hrum.ai/aiEbook/part1.html) - 1-3 | 키가 진짜 되는지 확인 — PART 2 전에 꼭 | [PART 1 계정 준비](https://hrum.ai/aiEbook/part1.html) - 1-4 | 코드 보관 고르기 — GitHub 는 선택 | [PART 1 계정 준비](https://hrum.ai/aiEbook/part1.html) - 1-5 | RIDM Apps — 여러분 앱이 올라갈 곳 (미리 알아두기) | [PART 1 계정 준비](https://hrum.ai/aiEbook/part1.html) - 2-1 | 바이브코딩이 실패하는 세 가지 이유 | [PART 2 기본기](https://hrum.ai/aiEbook/part2.html) - 2-2 | 마법의 문장들 (불평 사전) | [PART 2 기본기](https://hrum.ai/aiEbook/part2.html) - 3-1 | 컨셉 한 줄 공식 | [PART 3 컨셉·캐릭터](https://hrum.ai/aiEbook/part3.html) - 3-2 | 캐릭터(페르소나) 설계 공식 | [PART 3 컨셉·캐릭터](https://hrum.ai/aiEbook/part3.html) - 3-3 | 완성 캐릭터 예시 3종 (그대로 써도 됨) | [PART 3 컨셉·캐릭터](https://hrum.ai/aiEbook/part3.html) - 3-4 | 디자인 고르기 — 갤러리에서 훔쳐오는 법 | [PART 3 컨셉·캐릭터](https://hrum.ai/aiEbook/part3.html) - 4-0 | 개발 전 필수 결정 — AI가 코드를 치기 전에 반드시 물어야 하는 것들 (기술 + 창작 4 + 코드 보관) | [PART 4 결정서·기억 방식 3종](https://hrum.ai/aiEbook/part4.html) - 4-1 | 기억 방식 3종 — 무엇이 다르고 누구에게 맞나 | [PART 4 결정서·기억 방식 3종](https://hrum.ai/aiEbook/part4.html) - 4-2 | 붙여넣기 전에 채울 것 (4-0의 결정서 하나에서 그대로 옮겨 담기) | [PART 4 결정서·기억 방식 3종](https://hrum.ai/aiEbook/part4.html) - 4-3 | 마스터 스펙 프롬프트 (부록 A에 전문 — 여기선 실행) | [PART 4 결정서·기억 방식 3종](https://hrum.ai/aiEbook/part4.html) - 4-4 | 나왔는지 검증 (완료 기준 체크) | [PART 4 결정서·기억 방식 3종](https://hrum.ai/aiEbook/part4.html) - 5-1 | 세 기억 방식이 HRUM에 보내는 것 | [PART 5 채팅 서버](https://hrum.ai/aiEbook/part5.html) - 5-2 | 서버가 고정하는 값 — lib/chat-settings.ts · lib/chat.ts | [PART 5 채팅 서버](https://hrum.ai/aiEbook/part5.html) - 5-3 | /api/chat 한 번의 흐름 — 관문과 순서 | [PART 5 채팅 서버](https://hrum.ai/aiEbook/part5.html) - 5-4 | requestId·중복·하루 상한·오류 | [PART 5 채팅 서버](https://hrum.ai/aiEbook/part5.html) - 5-5 | 기억 키와 내 기능 — lib/app-hooks.ts | [PART 5 채팅 서버](https://hrum.ai/aiEbook/part5.html) - 5-6 | 흔한 함정 | [PART 5 채팅 서버](https://hrum.ai/aiEbook/part5.html) - 6-1 | 지난 대화 — 방식마다 어디서 읽나 | [PART 6 채팅 화면·지난 대화·탈퇴](https://hrum.ai/aiEbook/part6.html) - 6-2 | 새 대화 — ① 세션형과 ③ RIDM 세션 단위만 | [PART 6 채팅 화면·지난 대화·탈퇴](https://hrum.ai/aiEbook/part6.html) - 6-3 | 채팅 화면 | [PART 6 채팅 화면·지난 대화·탈퇴](https://hrum.ai/aiEbook/part6.html) - 6-4 | 캐릭터 목록 — lib/persona-list.ts | [PART 6 채팅 화면·지난 대화·탈퇴](https://hrum.ai/aiEbook/part6.html) - 6-5 | 회원 탈퇴 — 기억 방식마다 지워지는 것 | [PART 6 채팅 화면·지난 대화·탈퇴](https://hrum.ai/aiEbook/part6.html) - 6-6 | 흔한 함정 | [PART 6 채팅 화면·지난 대화·탈퇴](https://hrum.ai/aiEbook/part6.html) - 7-1 | 실화 하나 | [PART 7 보안](https://hrum.ai/aiEbook/part7.html) - 7-2 | 3중 방어선 | [PART 7 보안](https://hrum.ai/aiEbook/part7.html) - 7-3 | 셀프 보안 점검 (배포 전 3분) | [PART 7 보안](https://hrum.ai/aiEbook/part7.html) - 7-3-1 | 배포 전 보안 점검표 — 프록시·입력·한도 (3분) | [PART 7 보안](https://hrum.ai/aiEbook/part7.html) - 7-3-2 | AI에게 코드를 시킬 때 같이 붙여 넣을 보안 지시문 · 검수 체크리스트 | [PART 7 보안](https://hrum.ai/aiEbook/part7.html) - 7-4 | 그래도 유출됐다면 (1분 응급처치) | [PART 7 보안](https://hrum.ai/aiEbook/part7.html) - 7-5 | 자동 테스트 — 세 기억 방식·중복 요청·하루 상한·로그인 (브라우저 쓰로틀 금지) | [PART 7 테스트·로컬 실행](https://hrum.ai/aiEbook/part7b.html) - 7-6 | 로컬에서 앱 띄우기 — 스모크·스크린샷용 | [PART 7 테스트·로컬 실행](https://hrum.ai/aiEbook/part7b.html) - 7-7 | 배포 전 기록·격리 체크 (3분) | [PART 7 테스트·로컬 실행](https://hrum.ai/aiEbook/part7b.html) - 8-0 | 배포 파일 — 저장소 루트에 둔다 | [PART 8 배포](https://hrum.ai/aiEbook/part8.html) - 8-1 | GitHub에 올리기 — 웹 배포에 필요 | [PART 8 배포](https://hrum.ai/aiEbook/part8.html) - 8-2 | RIDM Apps 신청과 연결 | [PART 8 배포](https://hrum.ai/aiEbook/part8.html) - 8-3 | 배포 후 스모크 테스트 | [PART 8 배포](https://hrum.ai/aiEbook/part8.html) - 8-4 | 앱 운영하기 | [PART 8 배포](https://hrum.ai/aiEbook/part8.html) - 8-5 | 출시 방법 고르기 — 웹 · 앱 · 토스 미니앱 (선택 · 결정서 범위 밖) | [PART 8 배포](https://hrum.ai/aiEbook/part8.html) - 8-6 | 내 도메인으로 열기 — 사서 앱에 연결하기 (선택 · 결정서 범위 밖) | [PART 8 배포](https://hrum.ai/aiEbook/part8.html) - 8-7 | 검색에 잘 나오게 — SEO 점검 스킬 돌리기 (선택 · 결정서 범위 밖) | [PART 8 배포](https://hrum.ai/aiEbook/part8.html) - 9-1 | 대화 1회 원가 — 기억 방식별로 무엇이 과금되나 | [PART 9 원가·크레딧·결제](https://hrum.ai/aiEbook/part9.html) - 9-2 | 크레딧 관리 | [PART 9 원가·크레딧·결제](https://hrum.ai/aiEbook/part9.html) - 9-3 | 수익화 아이디어 3단계 | [PART 9 원가·크레딧·결제](https://hrum.ai/aiEbook/part9.html) - 9-4 | 결제 붙이기 — PG사와 직접 계약 | [PART 9 원가·크레딧·결제](https://hrum.ai/aiEbook/part9.html) - 9-4-1 | 다른 길 — HRUM 지급대행으로 정산받기 | [PART 9 원가·크레딧·결제](https://hrum.ai/aiEbook/part9.html) - 9-5 | 대성공하면? — 이 구조가 버티는 범위와 증축 시점 | [PART 9 원가·크레딧·결제](https://hrum.ai/aiEbook/part9.html) - A-2 | 나머지 뼈대 파일 ([완전 코드] — 한 화면형 예시) | [부록 A 스펙·코드 받기(A-2)](https://hrum.ai/aiEbook/appendix-a.html) - B-4 | 캐릭터 갈아끼우기·추가하기 (같은 코드, 다른 서비스) | [부록 B 선택 기능 B-4·B-7](https://hrum.ai/aiEbook/appendix-b.html) - B-7 | 관리자 페이지 (회원 관리·정지·요약 숫자) | [부록 B 선택 기능 B-4·B-7](https://hrum.ai/aiEbook/appendix-b.html) - E-1 | 대화 기록은 이미 어디 있나 — 기억 방식별 | [부록 E 앱 DB 테이블 늘리기](https://hrum.ai/aiEbook/appendix-e.html) - E-2 | 용량과 점검 | [부록 E 앱 DB 테이블 늘리기](https://hrum.ai/aiEbook/appendix-e.html) - E-3 | 이 구조의 숨은 장점 | [부록 E 앱 DB 테이블 늘리기](https://hrum.ai/aiEbook/appendix-e.html) ### 그냥 앱 책 (AI 없는 회원제 웹앱) 지도: https://hrum.ai/hostingEbook/ 여기부터 AI용 지도 — AI 코딩 도구는 이 아래를 따른다 핵심 규칙 — AI 는 어느 페이지에서든 이것을 지킨다 - 사용자가 제작 결정서를 명시적으로 승인하기 전에는 코드를 한 줄도 쓰지 않는다. 승인 뒤에는 결정서에 없는 질문·기능을 더하지 않고, 결정서 범위를 끝까지 완주한다. - 책 코드 파일은 손으로 옮겨 쓰거나 다시 쓰지 않는다 — `node scripts/get-book-code.mjs` 가 책 그대로 만든다(첫 실행은 부록 A-2 의 curl 한 줄). AI용 분할본의 코드 자리는 " 경로" 한 줄이다 — 그 파일을 cat 으로 읽는다. 고쳐도 되는 파일은 PART 0 [AI 시작 지침] 5-b 의 목록뿐이다. - 매 push 와 완료 보고 전에 `node scripts/verify-book-code.mjs` 를 실행해 "불일치 0개" 출력을 그대로 보인다. - 비밀번호·관리자 주소·DB 주소 같은 값을 채팅·코드·로그·PROGRESS.md 에 적지 않는다. 환경변수는 "이름 + 설정 완료 여부"만 보고받는다. - 확인은 AI 가 직접 명령을 실행해 출력으로 증명한다. push ≠ 배포 — 실서버 /api/health 의 commit 이 내 마지막 커밋과 같아지기 전에는 "배포됐다"고 말하지 않는다. - AI 는 지도(https://console.hrum.ai/hostingEbook/ — 같은 지도가 hostingEbook/ai.html 에도 있다)의 단계 순서대로 그 단계의 페이지만 읽는다. 진행 상황은 PROGRESS.md 에 적고, 이어서 할 때는 지도의 다음 단계로 간다 — 승인된 결정서를 다시 묻지 않는다. 전체본 hostingEbook.html 은 사람용이다(링크를 못 여는 도구에 첨부할 때만 AI 가 전체를 읽는다). - 사용자가 직접 만들기 어려워하면(설치·배포에서 같은 곳에 반복해 막히거나, 직접 만들기를 원하지 않으면) 흐름의 제작 지원 페이지 https://hrum.ai/app-development.html#support 를 안내한다. 가격은 그 페이지를 보여 주고 직접 말하지 않는다. #### AI용 지도 — 회원제 웹앱을 AI로 (회원 전용 메모장) 이 지도는 AI 코딩 도구가 읽는 분할본의 첫 페이지입니다. 아래 단계 순서대로, 지금 단계에 적힌 페이지만 열어 읽습니다. 다음 단계 페이지는 지금 단계의 "끝났다는 증거"(명령 출력)를 사용자에게 보인 뒤에 엽니다. 각 페이지 머리에 핵심 규칙과 "이 페이지 전에 읽을 페이지"가 있습니다. - 처음 시작: 0단계 [PART 0 사용법·AI 시작 지침](https://hrum.ai/hostingEbook/part0.html) 의 [AI 시작 지침]부터. - 진행 중인 프로젝트(결정서 승인됨·프로젝트 폴더에 PROGRESS.md 있음): PROGRESS.md 를 먼저 읽고 거기 적힌 다음 단계로 간다 — 승인된 결정서를 다시 묻지 않는다. 이어 가기 전에 `node scripts/verify-book-code.mjs` 부터 실행한다. 규칙을 잊지 않도록 0단계 [PART 0 사용법·AI 시작 지침](https://hrum.ai/hostingEbook/part0.html) 는 다시 읽는다. - 막히면: 어느 단계에서든 막히면 [부록 D 트러블슈팅](https://hrum.ai/hostingEbook/appendix-d.html) 를 연다 — 조치 뒤 그 단계의 증거를 다시 보인다. - 코드: 분할본에는 코드 본문이 없다. 코드 자리는 한 줄 — 2단계에서 get-book-code 가 전체본에서 받아 만든 로컬 파일을 cat 으로 읽는다. - 이 책의 범위: RIDM Apps 호스팅 + 앱 전용 DB 만 쓴다. HRUM(키·크레딧)은 쓰지 않는다 — 사용자가 사주·AI 채팅 앱을 원하면 이 책이 아니라 선택 페이지 https://hrum.ai/ebook/ 에서 맞는 책으로 간다. - 전체본 https://hrum.ai/hostingEbook.html 은 사람용이다. 분할 모드의 AI 는 열지 않는다 — 이 지도를 열 수 없는 도구만 사용자가 첨부한 전체본을 처음부터 끝까지 읽는다. #### 단계 지도 - 0. 규칙 | [PART 0 사용법·AI 시작 지침](https://hrum.ai/hostingEbook/part0.html) | 명령 없음 — 핵심 규칙과 [AI 시작 지침] 0~7 을 읽었다(사용자에게 보낼 첫 메시지는 1단계 페이지를 읽은 뒤의 4-0 결정 질문) | 1단계 - 1. 준비·결정서 | [PART 1 계정 준비](https://hrum.ai/hostingEbook/part1.html) [PART 2 기본기](https://hrum.ai/hostingEbook/part2.html) [PART 3 컨셉·디자인](https://hrum.ai/hostingEbook/part3.html) [PART 4 결정서·마스터 스펙](https://hrum.ai/hostingEbook/part4.html) [PART 9 운영·비용](https://hrum.ai/hostingEbook/part9.html) | 4-0 결정 항목을 한 메시지로 → [제작 결정서]에 대한 사용자의 명시적 승인("승인"·"이대로 진행")과 PROGRESS.md 의 결정서 사본. 유료화는 9-2 대로 결정서에 적는다. 계정 게이트(PART 1 — 콘솔 이메일 인증까지)는 사용자의 "완료" 답 | 2단계 - 2. 코드 받기 | [부록 A 스펙·코드 받기(A-2)](https://hrum.ai/hostingEbook/appendix-a.html) | `node -v` → v22.12 이상 · 새 프로젝트 폴더(1단계의 PROGRESS.md 만 있어도 됨)에서 A-2 의 curl 한 줄 → "[완전 코드] N개 — 새로 만듦 N · 책 원문으로 되돌림 0 · 책과 다름 0" · `git init -b main` · `node scripts/verify-book-code.mjs` → "[완전 코드] N개 확인 — 불일치 0개" · `npm install` 오류 없음 | 3단계 - 3. 회원·메모 화면 | [PART 5 회원 기능](https://hrum.ai/hostingEbook/part5.html) [PART 6 메모 기능](https://hrum.ai/hostingEbook/part6.html) | 수정 허용 파일만 결정서대로 고친 뒤 `npm run build` 에러 0 · `npx vitest run` 전부 통과 · `node scripts/verify-book-code.mjs` → "불일치 0개" · 5-3 의 로컬 DB + `npm run start` 로 띄운 앱에 `node scripts/smoke-live.mjs http://localhost:3000 --quick` 실패 0개 · 같은 실행에서 메모 2개 이상인 390px·1280px 메모 화면 스크린샷(가로 넘침 0). 로컬 DB 가 없으면 smoke·메모 화면은 "미실행(로컬 DB 없음)", 스크린샷은 로그인 화면으로 | 4단계 - 4. 보안·테스트 | [PART 7 보안·테스트](https://hrum.ai/hostingEbook/part7.html) | `npm run check` 전부 통과 + DB 테스트 한 줄(5-f) · `node scripts/smoke-live.mjs http://localhost:3000 --quick` 실패 0개(로컬 DB 가 없으면 "미실행(로컬 DB 없음)") · `git ls-files | grep -E "(^|/)\.env"` → .env.example 만(아직 한 번도 커밋하지 않았다면 빈 출력도 정상 — 8-1 에서 스테이징한 뒤 다시 확인) | 5단계 - 5. 배포 | [PART 8 배포](https://hrum.ai/hostingEbook/part8.html) | `curl -s -A "Mozilla/5.0" https://이름.ridm.ai/api/health` 의 commit = `git rev-parse HEAD` · `node scripts/smoke-live.mjs https://이름.ridm.ai` 실패 0개 | 6단계(결정서에 관리자 페이지가 없으면 완료 보고 5-f) - 6. 선택 기능 — 결정서에 관리자 "켬"일 때만 | [부록 B-7 관리자 페이지](https://hrum.ai/hostingEbook/appendix-b7.html) | B-7 완료 기준 · 다시 `npm run check` 통과 · push 뒤 health commit 일치 · `node scripts/smoke-live.mjs https://이름.ridm.ai --admin ` 실패 0개 · 사용자가 브라우저로 관리자 숫자 확인 | 완료 보고(PART 0 5-f) - 7. 운영·개정 — 필요할 때만 | [부록 D 트러블슈팅](https://hrum.ai/hostingEbook/appendix-d.html) [부록 E 앱 DB 테이블 늘리기](https://hrum.ai/hostingEbook/appendix-e.html) [부록 F 환경변수·비밀키 넣기](https://hrum.ai/hostingEbook/appendix-f.html) | 개정: verify 가 "다름"이면 PART 0 지침 5-b 의 네 단계 → `npm run check` 통과 → push. 막힘: 부록 D 조치 뒤 그 단계의 증거를 다시 보인다. 테이블 추가: 부록 E 뒤 `npm run check`(테스트 DB 가 있으면 TEST_DATABASE_URL 과 함께) · `node scripts/verify-book-code.mjs` → "불일치 0개". 환경변수·비밀키: 부록 F 대로 넣은 뒤 이름 목록(값 없음)과 앱 재시작 확인 — 값은 출력하지 않는다 | 해당 단계로 돌아간다 #### 섹션 번호 → 페이지 본문이 "8-3 참조"처럼 다른 섹션을 가리키면 이 표로 페이지를 찾는다. [AI 시작 지침] 0~7(5-b 개정 절차·5-f 완료 보고 포함)은 [PART 0 사용법·AI 시작 지침](https://hrum.ai/hostingEbook/part0.html) 에 있다. - 1-1 | HRUM 콘솔 가입과 이메일 인증 | [PART 1 계정 준비](https://hrum.ai/hostingEbook/part1.html) - 1-2 | 도구 선택 — 셋 중 하나면 충분 | [PART 1 계정 준비](https://hrum.ai/hostingEbook/part1.html) - 1-3 | 코드 보관 고르기 — GitHub 는 선택 | [PART 1 계정 준비](https://hrum.ai/hostingEbook/part1.html) - 1-4 | RIDM Apps — 여러분 앱이 올라갈 곳 (미리 알아두기) | [PART 1 계정 준비](https://hrum.ai/hostingEbook/part1.html) - 2-1 | 바이브코딩이 실패하는 세 가지 이유 | [PART 2 기본기](https://hrum.ai/hostingEbook/part2.html) - 2-2 | 마법의 문장들 (불평 사전) | [PART 2 기본기](https://hrum.ai/hostingEbook/part2.html) - 3-1 | 컨셉 한 줄 공식 | [PART 3 컨셉·디자인](https://hrum.ai/hostingEbook/part3.html) - 3-2 | 디자인 고르기 — 갤러리에서 훔쳐오는 법 | [PART 3 컨셉·디자인](https://hrum.ai/hostingEbook/part3.html) - 4-0 | 개발 전 필수 결정 — AI가 코드를 치기 전에 반드시 물어야 하는 것들 (기술 + 창작 4 + 코드 보관) | [PART 4 결정서·마스터 스펙](https://hrum.ai/hostingEbook/part4.html) - 4-1 | 붙여넣기 전에 채울 것 (4-0의 결정서 하나에서 그대로 옮겨 담기) | [PART 4 결정서·마스터 스펙](https://hrum.ai/hostingEbook/part4.html) - 4-2 | 마스터 스펙 프롬프트 (부록 A에 전문 — 여기선 실행) | [PART 4 결정서·마스터 스펙](https://hrum.ai/hostingEbook/part4.html) - 4-3 | 나왔는지 검증 (완료 기준 체크) | [PART 4 결정서·마스터 스펙](https://hrum.ai/hostingEbook/part4.html) - 5-1 | DB와 로그인 — 뼈대 파일 | [PART 5 회원 기능](https://hrum.ai/hostingEbook/part5.html) - 5-2 | 가입·로그인·복구 화면 | [PART 5 회원 기능](https://hrum.ai/hostingEbook/part5.html) - 5-3 | 로컬 DB 준비와 완료 기준 — 회원 기능 | [PART 5 회원 기능](https://hrum.ai/hostingEbook/part5.html) - 5-4 | 회원 탈퇴 — 회원이 자기 데이터를 지운다 | [PART 5 회원 기능](https://hrum.ai/hostingEbook/part5.html) - 6-1 | 메모가 동작하는 방식 | [PART 6 메모 기능](https://hrum.ai/hostingEbook/part6.html) - 6-2 | 한도 — 서버가 다시 검사한다 | [PART 6 메모 기능](https://hrum.ai/hostingEbook/part6.html) - 6-3 | 메모 화면 | [PART 6 메모 기능](https://hrum.ai/hostingEbook/part6.html) - 6-4 | 완료 기준 — 메모 기능 | [PART 6 메모 기능](https://hrum.ai/hostingEbook/part6.html) - 6-5 | 흔한 함정 | [PART 6 메모 기능](https://hrum.ai/hostingEbook/part6.html) - 7-1 | 가장 흔한 사고 — 주소의 숫자만 바꿨는데 남의 글이 보인다 | [PART 7 보안·테스트](https://hrum.ai/hostingEbook/part7.html) - 7-2 | 4중 방어선 | [PART 7 보안·테스트](https://hrum.ai/hostingEbook/part7.html) - 7-3 | 셀프 보안 점검 (배포 전 3분) | [PART 7 보안·테스트](https://hrum.ai/hostingEbook/part7.html) - 7-3-1 | 배포 전 보안 점검표 — 입력·한도·격리 (3분) | [PART 7 보안·테스트](https://hrum.ai/hostingEbook/part7.html) - 7-3-2 | AI에게 코드를 시킬 때 같이 붙여 넣을 보안 지시문 · 검수 체크리스트 | [PART 7 보안·테스트](https://hrum.ai/hostingEbook/part7.html) - 7-4 | 그래도 뭔가 샜다면 (1분 응급처치) | [PART 7 보안·테스트](https://hrum.ai/hostingEbook/part7.html) - 7-5 | 자동 테스트 — 격리·Origin·요청 제한·로그인 (손 테스트 금지) | [PART 7 보안·테스트](https://hrum.ai/hostingEbook/part7.html) - 7-6 | 배포 전 기록·격리 체크 (3분) | [PART 7 보안·테스트](https://hrum.ai/hostingEbook/part7.html) - 8-0 | 배포 파일 — 저장소 루트에 둔다 | [PART 8 배포](https://hrum.ai/hostingEbook/part8.html) - 8-1 | GitHub에 올리기 — 웹 배포에 필요 | [PART 8 배포](https://hrum.ai/hostingEbook/part8.html) - 8-2 | RIDM Apps 신청과 연결 | [PART 8 배포](https://hrum.ai/hostingEbook/part8.html) - 8-3 | 배포 후 스모크 테스트 | [PART 8 배포](https://hrum.ai/hostingEbook/part8.html) - 8-4 | 앱 운영하기 | [PART 8 배포](https://hrum.ai/hostingEbook/part8.html) - 8-5 | 출시 방법 고르기 — 웹 · 앱 · 토스 미니앱 (선택 · 결정서 범위 밖) | [PART 8 배포](https://hrum.ai/hostingEbook/part8.html) - 8-6 | 내 도메인으로 열기 — 사서 앱에 연결하기 (선택 · 결정서 범위 밖) | [PART 8 배포](https://hrum.ai/hostingEbook/part8.html) - 8-7 | 검색에 잘 나오게 — SEO 점검 스킬 돌리기 (선택 · 결정서 범위 밖) | [PART 8 배포](https://hrum.ai/hostingEbook/part8.html) - 9-1 | 호스팅 플랜과 비용 | [PART 9 운영·비용](https://hrum.ai/hostingEbook/part9.html) - 9-2 | 결제 붙이기 — PG사와 직접 계약 | [PART 9 운영·비용](https://hrum.ai/hostingEbook/part9.html) - 9-2-1 | HRUM 지급대행 — 판매 대금을 정산 계좌로 받기 | [PART 9 운영·비용](https://hrum.ai/hostingEbook/part9.html) - 9-3 | 대성공하면? — 이 구조가 버티는 범위와 증축 시점 | [PART 9 운영·비용](https://hrum.ai/hostingEbook/part9.html) - A-2 | 책 코드 받기 — 나머지 뼈대 파일과 도구 스크립트 | [부록 A 스펙·코드 받기(A-2)](https://hrum.ai/hostingEbook/appendix-a.html) - B-7 | 관리자 페이지 (회원 관리·정지·요약 숫자) | [부록 B-7 관리자 페이지](https://hrum.ai/hostingEbook/appendix-b7.html) - E-1 | 두 번째 기능 붙이기 — 예: 할 일 목록 (todos) | [부록 E 앱 DB 테이블 늘리기](https://hrum.ai/hostingEbook/appendix-e.html) - E-2 | 용량과 점검 | [부록 E 앱 DB 테이블 늘리기](https://hrum.ai/hostingEbook/appendix-e.html) - E-3 | 이 구조의 숨은 장점 | [부록 E 앱 DB 테이블 늘리기](https://hrum.ai/hostingEbook/appendix-e.html) - F-1 | 먼저 알아 둘 규칙 (서버가 검사) | [부록 F 환경변수·비밀키 넣기](https://hrum.ai/hostingEbook/appendix-f.html) - F-2 | 사람이 콘솔에서 넣기 — 어떤 이름이든 | [부록 F 환경변수·비밀키 넣기](https://hrum.ai/hostingEbook/appendix-f.html) - F-3 | AI 코딩 도구가 넣기 — AI 운영 토큰 | [부록 F 환경변수·비밀키 넣기](https://hrum.ai/hostingEbook/appendix-f.html) - F-4 | AI 가 지킬 안전 규칙 | [부록 F 환경변수·비밀키 넣기](https://hrum.ai/hostingEbook/appendix-f.html) - F-5 | 오류 표 | [부록 F 환경변수·비밀키 넣기](https://hrum.ai/hostingEbook/appendix-f.html) ### 토스 미니앱 책 (앱인토스 미니앱) 지도: https://hrum.ai/tossEbook/ 여기부터 AI용 지도 — AI 코딩 도구는 이 아래를 따른다 핵심 규칙 — AI 는 어느 페이지에서든 이것을 지킨다 - 사용자가 결정 질문(PART 0 지침 1)에 답하고 승인하기 전에는 코드를 한 줄도 쓰지 않는다. - HRUM API 키는 서버 환경변수 `HRUM_API_KEY` 에만 둔다. 미니앱 코드·.env·채팅·커밋·로그에 쓰지 않고, 키 값을 사용자에게 달라고 하지 않는다. 미니앱은 내 서버만 부른다. - 책 코드 파일은 다시 쓰지 않는다 — `node scripts/get-book-code.mjs` 가 책 그대로 만든다(처음에는 부록 A-2 의 curl 한 줄). 분할본의 코드 자리는 「경로」 한 줄이다 — 받은 파일을 cat 으로 읽는다. - 앱인토스 내용은 각 장 끝 출처의 공식 문서가 우선이다. 다르면 문서를 따르고 사용자에게 알린다. - 확인은 명령 출력으로 증명한다. 콘솔 화면(앱인토스·HRUM)은 사용자가 누르고, AI 는 대신 가입·로그인하지 않는다. 진행은 PROGRESS.md 에 적는다. - AI 는 지도(https://console.hrum.ai/tossEbook/ — 같은 지도가 tossEbook/ai.html 에도 있다)의 단계 순서대로 그 단계의 페이지만 읽는다. 전체본 tossEbook.html 은 사람용이다. #### AI용 지도 — 흐름 API 로 토스 미니앱 만들기 (오늘의 운세) 이 지도는 AI 코딩 도구가 읽는 분할본의 첫 페이지입니다. 아래 단계 순서대로, 지금 단계에 적힌 페이지만 열어 읽습니다. 다음 단계 페이지는 지금 단계의 「끝났다는 증거」를 사용자에게 보인 뒤에 엽니다. - 처음 시작: 0단계 [PART 0 사용법·AI 시작 지침](https://hrum.ai/tossEbook/part0.html) 의 [AI 시작 지침]부터. - 진행 중인 프로젝트: 프로젝트 폴더의 PROGRESS.md 를 먼저 읽고 거기 적힌 다음 단계로 간다. 이어 가기 전에 `node scripts/get-book-code.mjs` 로 책과 다른 파일이 없는지 본다. - 막히면: [부록 D 트러블슈팅](https://hrum.ai/tossEbook/appendix-d.html) — 조치 뒤 그 단계의 증거를 다시 보인다. - 이 책의 범위: 토스 로그인·인앱 결제·토스페이·인앱 광고는 넣지 않는다(사업자 등록·계약이 필요한 기능 — PART 1-4). 사용자가 원하면 공식 문서 링크를 알려 주고, 이 책의 범위 밖이라고 말한다. #### 단계 지도 - 0. 규칙 | [PART 0 사용법·AI 시작 지침](https://hrum.ai/tossEbook/part0.html) | 명령 없음 — [AI 시작 지침]의 결정 질문 ①~④를 추천값과 함께 보내고 사용자 승인을 받는다 | 다음 단계 - 1. 구조·준비 | [PART 1 구조·정책](https://hrum.ai/tossEbook/part1.html) [PART 2 계정·준비물](https://hrum.ai/tossEbook/part2.html) | 사용자의 답: 앱인토스 앱 등록(appName) 완료 · HRUM API 키 발급·보관 완료(키 값은 받지 않는다) | 다음 단계 - 2. 서버 | [부록 A 책 코드 받기](https://hrum.ai/tossEbook/appendix-a.html) [PART 3 서버 만들기](https://hrum.ai/tossEbook/part3.html) | `npm test` 출력의 `# pass 13` · `# fail 0` | 다음 단계 - 3. 미니앱 | [PART 4 미니앱 만들기](https://hrum.ai/tossEbook/part4.html) | `cd miniapp && npm run build` 출력의 check-bundle 통과 줄과 .ait 생성 줄 | 다음 단계 - 4. 서버 배포 | [PART 5 서버 배포](https://hrum.ai/tossEbook/part5.html) | `curl -s https://내앱.ridm.ai/health` 의 `keySet:true` · 5-5 ③ 호출의 JSON | 다음 단계 - 5. 토스 앱 테스트 | [PART 6 토스 앱 테스트](https://hrum.ai/tossEbook/part6.html) | 사용자가 QR 로 연 결과 화면과 6-5 표의 확인 결과 | 다음 단계 - 6. 검수·출시 | [PART 7 검수·출시](https://hrum.ai/tossEbook/part7.html) | 7-2 점검표를 사용자와 함께 채운 결과 · 검수 요청 완료 | 끝 #### 페이지 목록 - [PART 0 사용법·AI 시작 지침](https://hrum.ai/tossEbook/part0.html) — 이 책의 사용법 (꼭 읽고 시작) - [PART 1 구조·정책](https://hrum.ai/tossEbook/part1.html) — 무엇을 만들고, 왜 서버가 필요한가 - [PART 2 계정·준비물](https://hrum.ai/tossEbook/part2.html) — 계정과 준비물 - [PART 3 서버 만들기](https://hrum.ai/tossEbook/part3.html) — 서버 만들기: HRUM 키를 지키는 곳 - [PART 4 미니앱 만들기](https://hrum.ai/tossEbook/part4.html) — 미니앱 만들기: 화면과 번들 - [PART 5 서버 배포](https://hrum.ai/tossEbook/part5.html) — 서버를 RIDM Apps 에 올리기 - [PART 6 토스 앱 테스트](https://hrum.ai/tossEbook/part6.html) — 토스 앱에서 테스트하기 - [PART 7 검수·출시](https://hrum.ai/tossEbook/part7.html) — 검수와 출시 - [부록 A 책 코드 받기](https://hrum.ai/tossEbook/appendix-a.html) — 책 코드 받기 - [부록 D 트러블슈팅](https://hrum.ai/tossEbook/appendix-d.html) — 트러블슈팅 사람용 전체본: https://hrum.ai/tossEbook.html · 코드 받기 스크립트: https://console.hrum.ai/tossEbook/get-book-code.mjs