견적 기반 사양서/제안서 도구 (Phase 1~3 완료, 2026-05-27 트랙4 머지)
⚠️ 정리 이력
처음에 작업을 /견적서/ 모듈 안에 만들었으나, INVENTORY.md 의 5트랙 구조상 트랙4 /제안서/ 디렉토리가 이미 존재했음. 같은 날 4번째 중복 트랙을 만든 실수.
머지 작업 (2026-05-27):
/제안서/ 안으로 이전제안편집기.html, 제안서출력.html, 제안엔진.rpn.한선 보존제안서_*.html → 제안빌더_*.html, 제안편집기.html → 제안빌더_편집기.html제안엔진.{한선,rpn.한선} → 제안빌더.{한선,rpn.한선}/견적서/api/제안서 → /제안서/api/빌더_빌더:true 로 구분개요
docs.crowny.org/제안서 안에서 견적서 → 사양서 → (통합) 제안서를 자동 생성하는 도구 체인. 제미나이 플래시라이트 같은 약한 LLM이 호출하기만 해도 고품질 결과물이 나오도록 결정론적 도구로 설계.
견적서 (사람 입력)
└─ 공종/항목/단가/공급자/발주처
│
▼ 공종 1:1 → 섹션, 사양사전 키워드 매칭
사양서 (도구 자동 생성)
└─ 표준사양·인증·시공조건 자동 채움
│
▼ + 회사정보DB + LLM 입력(대상분석·추천사유)
제안서 (도구 자동 생성)
└─ 표지·요약·회사·분석·솔루션·사양·일정·견적요약 통합
무엇을 했나
Phase 1 — 사양서 (5 산출물)
data/사양사전.json— 14 카테고리, 15 규칙. 품명 키워드 → 표준사양·인증·시공조건한선씨/사양엔진.한선,사양엔진.rpn.한선— RPN 정통 동반 (헌법)/제안서/api/사양서/*— from-quote, save, load, list, delete, dict사양서_가로.html,사양서_세로.html— A4 출력. 세로형은 1품 1면 모드 토글사양편집기.html— 견적 선택 → 자동 생성 → 사양 키:값/인증/시공조건 편집
Phase 2 — 제안서 (6 산출물)
data/회사정보DB.json— 공급자 풀 정보 (소개/역량/차별점/실적/인증/보증)한선씨/제안엔진.한선,제안엔진.rpn.한선— 동반/제안서/api/빌더/*— from-quote(GET/POST), save, load, list, delete, companies제안서_가로.html,제안서_세로.html— 8 페이지 구성 (표지·요약·회사·분석·솔루션·사양·일정/견적·결제)제안편집기.html— 견적+회사+양식 선택 → 자동 → 대상분석·추천사유 편집
도구화의 핵심
LLM(제미나이 플래시)이 채울 것은 4개 필드 + 2개 텍스트만:
bashPOST /제안서/api/빌더/from-quote
{
"id": "<견적ID>",
"회사슬러그": "crowny-media",
"대상분석": {
"현황": "...", "요구사항": "...", "제약조건": "...", "기대효과": "..."
},
"차별점": ["...", "..."],
"추천사유": "..."
}
도구가 결정론적으로 채우는 부분:
- 표지 (제안번호·제목·부제·발주처·발행자)
- 요약 (한줄·핵심수치 4개: 공종수·기간·공급가액·합계)
- 회사정보 (회사정보DB.json에서 일괄)
- 핵심 사양 (사양사전.json 키워드 매칭 적용)
- 견적 요약 (공종별 소계·공급가액·부가세·합계)
- 일정 (6단계 표준)
- 결제·보증·특기사항
관련 파일
/Users/ef/CrownyDoc/
├── server-docs.js (1530-1860 라인 견적/사양/제안 API)
├── 견적서/
│ ├── data/
│ │ ├── 사양사전.json (14 카테고리, 15 규칙)
│ │ ├── 회사정보DB.json (crowny-media 1건)
│ │ ├── 사양서/{id}.json (저장소)
│ │ └── 제안서/{id}.json (저장소)
│ ├── 한선씨/
│ │ ├── 사양엔진.한선, .rpn.한선
│ │ └── 제안엔진.한선, .rpn.한선
│ ├── 사양서_가로.html, 사양서_세로.html
│ ├── 사양편집기.html
│ ├── 제안서_가로.html, 제안서_세로.html
│ └── 제안편집기.html
테스트 URL
사양서:
http://localhost:4100/제안서/사양편집기.html
http://localhost:4100/제안서/사양서_가로.html?from=qmphs2sglbq4t
http://localhost:4100/제안서/사양서_세로.html?from=qmphs2sglbq4t&일품일면=1
제안서:
http://localhost:4100/제안서/제안빌더_편집기.html
http://localhost:4100/제안서/제안빌더_서_가로.html?from=qmphs2sglbq4t
http://localhost:4100/제안서/제안빌더_서_세로.html?from=qmphs2sglbq4t
도구 API (LLM용):
GET /제안서/api/사양서/from-quote?id=<견적ID>
POST /제안서/api/빌더/from-quote body:{id,대상분석,차별점,추천사유,...}
GET /제안서/api/빌더/companies
GET /제안서/api/사양서/dict
Phase 3 — 도구화 (완료)
tools.json 매니페스트
/제안서/api/tools.json — 14개 도구 OpenAPI 풍 선언. LLM이 한 번에 읽어
어떤 도구가 있는지 파악. 필드 설명·예제·권장 흐름까지 포함.
/build — 단일 진입점 ★★
LLM이 단 한 번의 POST로 사양서+제안서 자동 생성+저장+URL 반환:
bashPOST /제안서/api/build
{
"from_quote": "<견적ID>",
"대상분석": { "현황":..., "요구사항":..., "제약조건":..., "기대효과":... },
"차별점": ["...", "..."],
"추천사유": "...",
"적용기술": ["..."]
}
→ {
"ok": true,
"견적": { "id":..., "합계":... },
"사양서": { "id":..., "사양번호":..., "URL":{"편집기","세로","가로"}, "섹션수":6 },
"제안서": { "id":..., "제안번호":..., "URL":{"편집기","세로","가로"}, "합계":... }
}
옵션:
type:사양서|제안서|둘다(기본: 둘다)회사슬러그: 회사정보DB 키 (기본: crowny-media)양식:세로형|가로형(기본: 세로형)저장:true|false(기본: true. false면 데이터만 반환)
검증 시나리오 (3가지 모두 통과)
- 최소 입력 — 현황 1줄 + 추천사유 1줄 → 9페이지 제안서 완성
- 권장 입력 — 4필드 + 차별점 4개 + 추천사유 + 적용기술 5개 → 완전 제안서
- 데이터만 —
저장:false로 호출 시 JSON만 반환 (저장 없음)
LLM 입장에서의 흐름
1. GET /제안서/api/tools.json ← 도구 목록 1회 확인
2. GET /견적서/api/list ← 견적 ID 선택
3. POST /제안서/api/build ← 본문성 필드만 채워서 한 번 호출
4. 반환된 URL을 사용자에게 안내
→ 약한 LLM(제미나이 플래시라이트)도 도구 호출만 하면 9페이지 고품질 제안서.
잔여 이슈 / 다음 단계
- 회사정보DB 다중 — crowny-media 외 다른 발행자 슬러그 추가
- 사양사전 확장 — 음향·조명·CCTV·네트워크·공조 카테고리
- 양식 추가 — 회신용 1페이지 요약, 입찰용 정식 양식
- PDF 서버측 렌더 — Chromium headless로 인쇄 결과 동일 PDF 생성