260715_0
This commit is contained in:
@@ -0,0 +1,20 @@
|
||||
# wiki/ 폴더 규칙
|
||||
|
||||
AI가 raw/의 원본을 읽고 편집·유지하는 산출물 계층. 자세한 운영 규칙(Ingest/Query/Lint, 위키 규칙 14가지)은 `docs/CLAUDE.md`의 Wiki Schema 섹션을 따른다.
|
||||
|
||||
## 구조
|
||||
- `index.md` — 전체 카탈로그. 모든 질의는 여기서 시작한다.
|
||||
- `log.md` — 연대기 로그. append-only.
|
||||
- `pages/B0x_이름/` — 프로젝트의 실제 B01~B09 폴더와 1:1 대응하는 페이지 단위 폴더. 하위에 `frontend.md`, `backend.md`, `db.md`, `api.md`, `dependencies.md`를 필요한 것만 생성한다.
|
||||
- `concepts/` — 여러 페이지가 함께 쓰는 공유 자원의 1차 정의처. DB 스키마, 인증/RBAC, 저장 경로 규칙, 공통 유틸(`common_util_*`), API 공통 엔드포인트, 공통 Pydantic 스키마, 외부 라이브러리 의존성, workflow 상태 관리 등.
|
||||
|
||||
## 작성 규칙
|
||||
- 모든 페이지에 YAML frontmatter 포함. `status`는 `draft`/`stable`/`stale` 셋 중 하나만 사용 (draft=계획서만 반영, stable=검증보고서로 확인, stale=raw 갱신됐는데 미반영).
|
||||
- **`pages/` 하위 파일에는 반드시 `page_id: B0x_이름`(또는 `A0x_이름`)을 frontmatter에 추가한다.** 파일명(`frontend.md` 등)만으로는 소속 페이지를 알 수 없으므로, 폴더 밖에서 봐도 식별 가능해야 한다. concepts 파일에는 해당 없음.
|
||||
- 내부 참조는 `[[페이지명]]` 위키링크 형식.
|
||||
- 새 페이지를 만들기 전에 기존 페이지를 업데이트할 수 있는지 먼저 확인한다.
|
||||
- 소스 요약은 사실만, 해석·종합은 concepts 페이지에서 다룬다.
|
||||
- 계획서와 검증보고서가 충돌하면 **검증보고서를 채택**한다 (실제 코드 상태에 더 가까운 소스). 계획서 내용은 지우지 않고 "계획 당시 의도"로 남긴다.
|
||||
- **공유 자원(두 페이지 이상이 쓰는 테이블·함수·API·의존성 등)은 concepts에만 정의한다.** 페이지 쪽 파일(`db.md` 등)에는 용도 설명 + 위키링크만 남긴다. concepts 쪽에는 사용처(역참조) 목록을 직접 적어 유지한다.
|
||||
- **함수·API·테이블 등 개별 항목은 `항목 | 위치(파일:줄번호) | 역할` 표 형식으로만 기록한다.** 서술문 금지 — grep 없이 바로 코드 위치를 찾을 수 있어야 한다.
|
||||
- **페이지(파일) 하나는 100줄을 넘지 않는다.** 넘으면 하위 주제별로 즉시 분할하고 index.md를 갱신한다.
|
||||
@@ -0,0 +1,20 @@
|
||||
# wiki/ 폴더 규칙
|
||||
|
||||
AI가 raw/의 원본을 읽고 편집·유지하는 산출물 계층. 자세한 운영 규칙(Ingest/Query/Lint, 위키 규칙 14가지)은 `docs/CLAUDE.md`의 Wiki Schema 섹션을 따른다.
|
||||
|
||||
## 구조
|
||||
- `index.md` — 전체 카탈로그. 모든 질의는 여기서 시작한다.
|
||||
- `log.md` — 연대기 로그. append-only.
|
||||
- `pages/B0x_이름/` — 프로젝트의 실제 B01~B09 폴더와 1:1 대응하는 페이지 단위 폴더. 하위에 `frontend.md`, `backend.md`, `db.md`, `api.md`, `dependencies.md`를 필요한 것만 생성한다.
|
||||
- `concepts/` — 여러 페이지가 함께 쓰는 공유 자원의 1차 정의처. DB 스키마, 인증/RBAC, 저장 경로 규칙, 공통 유틸(`common_util_*`), API 공통 엔드포인트, 공통 Pydantic 스키마, 외부 라이브러리 의존성, workflow 상태 관리 등.
|
||||
|
||||
## 작성 규칙
|
||||
- 모든 페이지에 YAML frontmatter 포함. `status`는 `draft`/`stable`/`stale` 셋 중 하나만 사용 (draft=계획서만 반영, stable=검증보고서로 확인, stale=raw 갱신됐는데 미반영).
|
||||
- **`pages/` 하위 파일에는 반드시 `page_id: B0x_이름`(또는 `A0x_이름`)을 frontmatter에 추가한다.** 파일명(`frontend.md` 등)만으로는 소속 페이지를 알 수 없으므로, 폴더 밖에서 봐도 식별 가능해야 한다. concepts 파일에는 해당 없음.
|
||||
- 내부 참조는 `[[페이지명]]` 위키링크 형식.
|
||||
- 새 페이지를 만들기 전에 기존 페이지를 업데이트할 수 있는지 먼저 확인한다.
|
||||
- 소스 요약은 사실만, 해석·종합은 concepts 페이지에서 다룬다.
|
||||
- 계획서와 검증보고서가 충돌하면 **검증보고서를 채택**한다 (실제 코드 상태에 더 가까운 소스). 계획서 내용은 지우지 않고 "계획 당시 의도"로 남긴다.
|
||||
- **공유 자원(두 페이지 이상이 쓰는 테이블·함수·API·의존성 등)은 concepts에만 정의한다.** 페이지 쪽 파일(`db.md` 등)에는 용도 설명 + 위키링크만 남긴다. concepts 쪽에는 사용처(역참조) 목록을 직접 적어 유지한다.
|
||||
- **함수·API·테이블 등 개별 항목은 `항목 | 위치(파일:줄번호) | 역할` 표 형식으로만 기록한다.** 서술문 금지 — grep 없이 바로 코드 위치를 찾을 수 있어야 한다.
|
||||
- **페이지(파일) 하나는 100줄을 넘지 않는다.** 넘으면 하위 주제별로 즉시 분할하고 index.md를 갱신한다.
|
||||
@@ -0,0 +1,86 @@
|
||||
---
|
||||
status: stable
|
||||
related_pages: ["[[A01_Home/A01_frontend]]", "[[A02_ProgDetail/A02_frontend]]", "[[B01_Dashboard/B01_frontend]]", "[[B08_wf5_Quantity/B08_frontend]]"]
|
||||
last_updated: 2026-07-12
|
||||
source: A00_Common 공유 프레임워크 소스 코드
|
||||
---
|
||||
|
||||
# A00_Common — App Shell Framework
|
||||
|
||||
모든 페이지의 공통 스켈레톤. 헤더(로고/네비/언어·테마/인증버튼) + 콘텐츠 아울렛 + 푸터를 통합 관리.
|
||||
|
||||
## 파일 구성
|
||||
|
||||
| 파일 | 역할 |
|
||||
|---|---|
|
||||
| `app_shell.ts` (284줄) | 헤더·푸터 렌더링, 테마·언어 토글, 인증 상태별 버튼 채우기 |
|
||||
| `b_page_scaffold.ts` (163줄) | B 그룹(B03~B09) 페이지용 스캐폴드—"준비 중" 임시 페이지 래퍼, 워크플로우 셸 헬퍼 |
|
||||
| `router.ts` (158줄) | SPA 라우터(해시 기반), 인증 가드, 지연 로딩 |
|
||||
|
||||
## app_shell 구성요소
|
||||
|
||||
### 테마 & 언어 관리
|
||||
- `initThemeAndLang()` — localStorage 복원 (THEME_STORAGE_KEY, LANG_STORAGE_KEY)
|
||||
- `onApp_Theme_Toggle_Click()` — light ↔ dark 전환
|
||||
- `onApp_Lang_Toggle_Click()` — 한국어 ↔ 영문 전환 + 현재 페이지 재렌더
|
||||
|
||||
### 헤더 구성 (64px 높이, sticky)
|
||||
- **로고**: `BRAND_ICON_URL`(prog_icon.jpg) + 브랜드명("Aislo")
|
||||
- **네비게이션**: 5개 링크
|
||||
- App_Nav_Program → A02_PROG_DETAIL
|
||||
- App_Nav_Company → A03_COMP_DETAIL
|
||||
- App_Nav_News → A04_NEWS_HISTORY
|
||||
- App_Nav_Education → A05_EDU_DETAIL
|
||||
- App_Nav_Support → A08_SUPPORT
|
||||
- **우측 액션**:
|
||||
- 언어 버튼 ("EN" / "한")
|
||||
- 테마 버튼 ("☀" / "☾")
|
||||
- 인증 버튼 (로그인/회원가입 또는 계정/로그아웃)
|
||||
|
||||
### 인증 버튼 (비동기 fillAuthActions)
|
||||
**미로그인 상태**: "로그인", "회원가입"
|
||||
**로그인 상태**: 사용자명(또는 "내 계정"), "로그아웃"
|
||||
|
||||
### 로그아웃 (onApp_Logout_Click)
|
||||
- `A06_Login.logout()` 호출 → 세션 쿠키 제거
|
||||
- 오류 무시 후 홈(`A01_HOME`)으로 이동
|
||||
|
||||
### 푸터
|
||||
- 높이 56px
|
||||
- 저작권 텍스트 (App_Footer_Copyright)
|
||||
|
||||
## router 라우팅 테이블
|
||||
|
||||
| 라우트 | 렌더 함수 위치 |
|
||||
|---|---|
|
||||
| A01_HOME | A01_Home/A01_Home_UI_Page.ts |
|
||||
| A02_PROG_DETAIL | A02_ProgDetail/A02_ProgDetail_UI_Page.ts |
|
||||
| A03_COMP_DETAIL | A03_CompDetail/A03_CompDetail_UI_Page.ts |
|
||||
| A04_NEWS_HISTORY | A04_NewsHistory/A04_NewsHistory_UI_Page.ts |
|
||||
| A05_EDU_DETAIL | A05_EduDetail/A05_EduDetail_UI_Page.ts |
|
||||
| A06_LOGIN | A06_Login/A06_Login_UI_Auth_Page.ts |
|
||||
| A07_REGISTER | A07_Register/A07_Register_UI_Auth_Page.ts |
|
||||
| A08_SUPPORT | A08_Support/A08_Support_UI_Page.ts |
|
||||
| A09_SECURITY | A09_Security/A09_Security_UI_Page.ts |
|
||||
| B01_ACCOUNT | B01_Dashboard/B01_Dashboard_UI_Page.ts |
|
||||
| B02_PROJ_REGISTER | B02_ProjRegister/B02_ProjRegister_UI_Page.ts |
|
||||
| B03_FILE_INPUT | B03_FileInput/B03_FileInput_UI_Page.ts |
|
||||
| B04_WF1_SURFACE | B04_wf1_Surface/B04_wf1_Surface_UI_Page.ts |
|
||||
| B05_WF2_ROUTE | B05_wf2_Route/B05_wf2_Route_UI_Page.ts |
|
||||
| B06_WF3_PROFILE_CROSS | B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Page.ts |
|
||||
| B07_WF4_DESIGN_DETAIL | B07_wf4_DesignDetail/B07_wf4_DesignDetail_UI_Page.ts |
|
||||
| B08_WF5_QUANTITY | B08_wf5_Quantity/B08_wf5_Quantity_UI_Page.ts |
|
||||
| B09_WF6_ESTIMATION | B09_wf6_Estimation/B09_wf6_Estimation_UI_Page.ts |
|
||||
| B10_PAYMENT | B10_Payment/B10_Payment_UI_Page.ts |
|
||||
| B11_STATUS | B11_Status/B11_Status_UI_Page.ts |
|
||||
|
||||
## 인증 가드
|
||||
|
||||
- **PROTECTED_ROUTES** (config_frontend.ts 정의): 토큰 없으면 A06_LOGIN으로 리다이렉트
|
||||
- **워크플로우 라우트** (B02~B11): 추가 검증
|
||||
- 사용자 없음 → A06_LOGIN으로 리다이렉트
|
||||
- company_id 미보유 & SYSTEM_ADMIN 아님 → B01_ACCOUNT로 리다이렉트 (회사 가입 강제)
|
||||
|
||||
## 세부 스캐폴드·CSS·종속성
|
||||
|
||||
`b_page_scaffold`, CSS 주입, 공통 종속성, 전체 사용처는 [[a00_app_shell_framework_scaffold]]에 분리했다.
|
||||
@@ -0,0 +1,37 @@
|
||||
---
|
||||
type: concept
|
||||
status: stable
|
||||
related_pages: ["[[a00_app_shell_framework]]", "[[B08_wf5_Quantity/B08_frontend]]", "[[B09_wf6_Estimation/B09_frontend]]"]
|
||||
last_updated: 2026-07-12
|
||||
source: 상위 프로젝트 A00_Common 코드 및 페이지 인제스트 대조 (2026-07-12)
|
||||
---
|
||||
|
||||
# A00_Common — 스캐폴드·CSS·종속성
|
||||
|
||||
## b_page_scaffold
|
||||
| 항목 | 역할 |
|
||||
|---|---|
|
||||
| `renderPendingContent` | 비 workflow 페이지용 준비 중 블록 |
|
||||
| `renderPendingWorkflow` | workflow 셸과 좌·우 준비 중 영역 |
|
||||
| `workflowSteps()` | 7단계 workflow 라벨 배열 |
|
||||
|
||||
## CSS 인젝션
|
||||
| 항목 | 역할 |
|
||||
|---|---|
|
||||
| `injectShellStyles` | 셸 스타일을 `<head>`에 1회 주입 |
|
||||
| `app-shell-style` | 헤더·아울렛·푸터 스타일 ID |
|
||||
| theme 변수 | 헤더 64px·푸터 56px·아울렛 최소높이 |
|
||||
|
||||
## 종속성
|
||||
| 항목 | 역할 |
|
||||
|---|---|
|
||||
| `ui_template_locale.ts` | 언어 상태·문자열 |
|
||||
| `ui_template_elements.ts` | 버튼·workflow 셸 |
|
||||
| `config_frontend.ts` | routes·theme·protected routes |
|
||||
| `A06_Login_Api_Fetch.ts` | 세션 조회·로그아웃 |
|
||||
|
||||
## 사용처
|
||||
| 페이지 | 역할 |
|
||||
|---|---|
|
||||
| A01~A09 | 공통 헤더·푸터·아울렛 |
|
||||
| B01~B09 | 페이지별 workflow 셸·단계 내비게이션 |
|
||||
@@ -0,0 +1,27 @@
|
||||
---
|
||||
type: concept
|
||||
status: stable
|
||||
related_pages: ["[[B01_Dashboard/B01_backend]]", "[[B03_FileInput/B03_backend]]", "[[B04_wf1_Surface/B04_backend]]"]
|
||||
last_updated: 2026-07-12
|
||||
source: raw/plans/plan_workflow_state_management.md, raw/guidelines/backend.md + 실 코드 확인 2026-07-12
|
||||
---
|
||||
|
||||
# API 공통 (여러 페이지가 공유하는 엔드포인트)
|
||||
|
||||
## 공통 오류 응답 포맷 (전 라우터)
|
||||
```json
|
||||
{"status": "error", "message": "원인"}
|
||||
```
|
||||
→ [[schema_common]]
|
||||
|
||||
## 워크플로우 상태 조회
|
||||
| 항목 | 위치 | 역할 |
|
||||
|---|---|---|
|
||||
| `GET /api/projects/{project_id}/workflow-state` | `B03_FileInput_Router.py:667` | 단일 프로젝트의 `current_stage`와 `stages[]` 조회 |
|
||||
| `get_workflow_states_for_projects()` | `B01_Dashboard_Repository.py:83` | [[B01_Dashboard/B01_backend|B01_Dashboard]] 목록용 다중 프로젝트 상태 배치 조회 |
|
||||
|
||||
상태 모델과 사용처: [[workflow_state]].
|
||||
|
||||
## 폴링 패턴 (legacy workflow.json 설계; 현재 구현은 workflow-state API 사용)
|
||||
- 클라이언트가 3초마다 `GET /api/projects/{project_id}/workflow` 호출
|
||||
- 과거 설계의 stale 감지 UX 참고용이며, 실제 상태 조회는 [[workflow_state]] API를 사용한다.
|
||||
@@ -0,0 +1,69 @@
|
||||
---
|
||||
type: concept
|
||||
status: stable
|
||||
related_pages: ["[[B01_Dashboard/B01_backend]]"]
|
||||
last_updated: 2026-07-12
|
||||
source: raw/guidelines/backend.md, raw/guidelines/frontend.md, raw/guidelines/agent.md
|
||||
---
|
||||
|
||||
# 인증 / RBAC
|
||||
|
||||
## 세션 인증 (backend.md 6.3)
|
||||
- 방식: Secure HttpOnly 세션 쿠키 (`session_id`, JWT 아님), `SameSite=Lax`
|
||||
- 저장소: `sessions` 테이블 → [[db_schema/users_auth]]
|
||||
- 유효시간: 활동 기준 4시간 또는 절대 12시간 중 먼저 도달하는 쪽
|
||||
- DB 풀: `autocommit=True` (세션 즉시 조회 가능하도록)
|
||||
- 프론트: 모든 API 요청에 `credentials: "include"` (frontend.md 5.1)
|
||||
|
||||
## OTP / 비밀번호
|
||||
- OTP 6자리, 5분 유효, 해시 저장(bcrypt/PBKDF2), 재시도 최대 3회(2s/4s/8s 백오프)
|
||||
- 비밀번호 최소 8자, bcrypt(라운드≥12) 또는 PBKDF2, 평문 저장 절대 금지
|
||||
- 5회 연속 실패 시 계정 15분 잠금
|
||||
|
||||
## 사용자 상태 생명주기
|
||||
```
|
||||
PENDING_EMAIL → NO_COMPANY → (PENDING | ACTIVE) → (INACTIVE | REJECTED)
|
||||
```
|
||||
| 상태 | 접근 가능 범위 |
|
||||
|---|---|
|
||||
| NO_COMPANY | 로그인 가능, B01만 (B02~B11 차단) |
|
||||
| PENDING | 로그인 가능, B01만 (승인 대기) |
|
||||
| ACTIVE | 전체 (B01 + B02~B11) |
|
||||
|
||||
## 역할 (users.role)
|
||||
| 역할 | 전체회사조회 | 역할변경 | 팀원관리 | 가입승인 | 프로젝트조회 범위 |
|
||||
|---|---|---|---|---|---|
|
||||
| SYSTEM_ADMIN | ✅ | ✅ | ✅ | ✅ | 전체 |
|
||||
| ADMIN | ✗ | ✗ | ✅(자기회사) | ✅(자기회사) | 회사별 |
|
||||
| USER | ✗ | ✗ | ✗ | ✗ | 회사별 |
|
||||
|
||||
`is_master` 플래그: TRUE=회사 생성자/ADMIN(팀원 승인권), FALSE=일반 팀원
|
||||
|
||||
## 권한 검증 헬퍼 (B01_Dashboard)
|
||||
| 항목 | 위치 | 역할 |
|
||||
|---|---|---|
|
||||
| `_can_edit_project()` | `B01_Dashboard_Router.py:79` | 역할·회사 기준 프로젝트 수정 권한 |
|
||||
| `_can_manage_automation()` | `B01_Dashboard_Router.py:87` | USER 차단과 프로젝트 범위 검사 |
|
||||
| `_can_edit_user()` | `B01_Dashboard_Router.py:93` | 사용자 수정 범위 검사 |
|
||||
| `count_company_admins()` | `B01_Dashboard_Repository.py:584` | 마지막 ADMIN 삭제·강등 방지 |
|
||||
| `canEditProject()` 외 5개 | `B01_Dashboard_UI_Helper.ts:3` | 프론트 표시 제어; 백엔드 권한을 대체하지 않음 |
|
||||
|
||||
**원칙:** 백엔드가 모든 수정/삭제/역할변경 API에서 반드시 재검증 (프론트 UI는 표시 제어만, 신뢰 금지). 위반 시 403 `{"status":"error","message":"Access denied"}`.
|
||||
|
||||
## 인증 갱신
|
||||
로그인 시 `users.auth_expires_at = NOW() + 3개월` 자동 연장. 만료 시 재인증 모달.
|
||||
|
||||
## 라우팅 가드 (frontend.md 5.2)
|
||||
B02~B11 진입 시 `fetchDashboardMe()` → `company_id`+`status` 확인 → NO_COMPANY/PENDING이면 B01로 강제 리다이렉트.
|
||||
|
||||
## 사용처 (역참조)
|
||||
- [[B01_Dashboard/B01_backend|B01_Dashboard]] — 권한 헬퍼 5종, RBAC 접근제어
|
||||
- [[A06_Login/A06_backend]] — 세션 발급/OTP 재인증, 상태 확인
|
||||
- [[A07_Register/A07_backend]] — 사용자 상태 생명주기(PENDING_EMAIL→NO_COMPANY)
|
||||
- [[A09_Security/A09_backend]] — require_master/require_system_admin 권한 데코레이터
|
||||
|
||||
## ⚠️ 계획서-실코드 불일치 (A그룹 인제스트 발견)
|
||||
이 페이지의 세션/OTP 정책은 **계획서 기준**(세션 12h/4h 만료, OTP 5분·재시도3회·5회실패 15분잠금)이나,
|
||||
실 코드([[A06_Login/A06_backend]])는 `auth_expires_at = NOW()+3개월` 갱신·신규브라우저/주기 재인증 OTP·5회실패시 관리자 알림 메일 방식.
|
||||
[[A09_Security/A09_frontend]] 약관 텍스트도 계획서 기준(12h/4h)으로 표기됨.
|
||||
→ 규칙6(실 코드 우선)에 따라 실 정책 검증 후 이 페이지 갱신 필요. 계획 당시 의도로 위 내용은 보존.
|
||||
@@ -0,0 +1,35 @@
|
||||
---
|
||||
type: concept
|
||||
status: stable
|
||||
related_pages: ["[[B01_Dashboard/B01_backend]]", "[[B03_FileInput/B03_backend]]", "[[B04_wf1_Surface/B04_backend]]", "[[B05_wf2_Route/B05_backend]]", "[[B06_wf3_ProfileCross/B06_backend]]"]
|
||||
last_updated: 2026-07-12
|
||||
source: raw/guidelines/structure.md, raw/guidelines/backend.md
|
||||
---
|
||||
|
||||
# 공통 유틸 (common_util/)
|
||||
|
||||
> 둘 이상의 페이지가 실제로 공유하는 경로·원자적 파일쓰기·기하 유틸만 이 폴더에 배치 (migration_plan.md 2.2)
|
||||
|
||||
| 파일 | 역할 | 사용처 |
|
||||
|---|---|---|
|
||||
| `common_util_validate.ts` | 프론트 1차 유효성 검사 (이메일/빈값/최소길이) | 전 페이지 |
|
||||
| `common_util_auth.py` | 비밀번호·OTP·세션 쿠키·권한 검증 | 전 페이지 → [[auth_rbac]] |
|
||||
| `common_util_auth_repository.py` | 인증·조직·관리 Raw SQL 저장소 | 인증 관련 |
|
||||
| `common_util_email.py` | 비동기 SMTP 발송+재시도(최대3회) | OTP/승인 알림 |
|
||||
| `common_util_email_templates.py` | 인증·조직 알림 이메일 템플릿 | common_util_email.py |
|
||||
| `common_util_string.ts` | 문자열 유틸 | 미상세 |
|
||||
| `common_util_storage.py` | 프로젝트·워크플로우 단계별 저장 경로 | → [[storage_paths]] |
|
||||
| `common_util_json.py` | JSON 원자적 저장 | workflow.json 등 |
|
||||
| `common_util_workflow.py` | 공유 workflow.json 상태 처리 | ⚠️ [[workflow_state]] 재설계로 대체/정리 예정 |
|
||||
| `common_util_resource_monitor.py` | 시스템 리소스 계측(2분 주기) + log + DB 기록 | `sample_resources_loop()` → [[B01_Dashboard/B01_backend|B01_Dashboard]] |
|
||||
| `common_util_format.py` | 포맷 유틸 | 미상세 |
|
||||
|
||||
## 이메일 발송 (common_util_email.py)
|
||||
- 개발: Google Gmail SMTP / 상용: Google Workspace 또는 AWS SES
|
||||
- 발송 유형: OTP, 가입확인, 팀원승인요청(ADMIN), 승인/거부결과, 회사참여신청(SYSTEM_ADMIN), 인증갱신알림
|
||||
|
||||
## 리소스 모니터링 (common_util_resource_monitor.py)
|
||||
- `main.py` lifespan에서 `asyncio.create_task` 등록/취소
|
||||
- 계측: `psutil.cpu_percent`, `psutil.virtual_memory().percent`, `shutil.disk_usage`
|
||||
- 이중 기록: `system_resources` 테이블 (DB) + `log/system_resources.log` (탭 구분 1줄, `.gitignore`)
|
||||
- 30일 롤링 삭제 (DB `DELETE`, 로그파일 오래된 줄 제거)
|
||||
@@ -0,0 +1,95 @@
|
||||
---
|
||||
type: concept
|
||||
status: stable
|
||||
related_pages: ["[[B03_FileInput/B03_backend]]", "[[B04_wf1_Surface/B04_backend]]"]
|
||||
last_updated: 2026-07-12
|
||||
source: raw/guidelines/db_schema.md
|
||||
---
|
||||
|
||||
# DB: 파일/지표면분석 테이블
|
||||
|
||||
← [[overview]]
|
||||
|
||||
## upload_sessions (업로드 세션)
|
||||
| 컬럼 | 타입 | Null | Key | Default / Extra |
|
||||
|---|---|---|---|---|
|
||||
| `id` | `varchar(36)` | NO | PRI | 세션 UUID |
|
||||
| `project_id` | `varchar(36)` | NO | MUL | FK→projects.id |
|
||||
| `original_filename` | `varchar(255)` | NO | | 원본 파일명 |
|
||||
| `file_size_bytes` / `chunk_size_bytes` | `bigint(20)` | NO | | 파일크기 / 청크크기 |
|
||||
| `total_chunks` / `completed_chunks` | `int(11)` | - | | 전체 청크수 / 완료 청크수 |
|
||||
| `status` | `enum('PENDING','IN_PROGRESS','COMPLETED','FAILED')` | YES | MUL | `PENDING` |
|
||||
| `created_at` / `updated_at` | `timestamp` | YES | | 생성 / 최종수정 일시 |
|
||||
|
||||
## upload_chunks (업로드 청크 데이터)
|
||||
| 컬럼 | 타입 | Null | Key | Default / Extra |
|
||||
|---|---|---|---|---|
|
||||
| `id` | `int(11)` | NO | PRI | `auto_increment` |
|
||||
| `session_id` | `varchar(36)` | NO | MUL | FK→upload_sessions.id |
|
||||
| `chunk_index` | `int(11)` | NO | | 청크 인덱스 (0, 1, 2...) |
|
||||
| `chunk_hash` | `varchar(64)` | YES | | 청크 검증용 체크섬 |
|
||||
| `size_bytes` | `bigint(20)` | NO | | 청크 용량 |
|
||||
| `stored_at` | `varchar(255)` | YES | | 임시 파일 저장 경로 |
|
||||
| `completed_at` | `timestamp` | YES | MUL | 완료 일시 |
|
||||
|
||||
## input_files (입력 원본 파일)
|
||||
| 컬럼 | 타입 | Null | Key | Default / Extra |
|
||||
|---|---|---|---|---|
|
||||
| `id` | `int(11)` | NO | PRI | `auto_increment` |
|
||||
| `project_id` | `char(36)` | NO | MUL | FK→projects.id |
|
||||
| `file_type` | `varchar(50)` | YES | | `las`/`tif`/`prj`/`tfw`/`dxf` 등 |
|
||||
| `original_filename` / `raw_file_path` | `varchar` | NO | | 파일명 / storage 상대경로 |
|
||||
| `file_size_mb` | `float` | YES | | 파일 크기 (MB) |
|
||||
| `upload_by` / `upload_at` | - | - | MUL | 업로드 유저 FK / 일시 |
|
||||
| `crs_epsg` | `int(11)` | YES | | EPSG 좌표계 정보 |
|
||||
| `metadata` | `longtext` | YES | | 헤더/포인트수 등 분석 JSON |
|
||||
| `status` | `varchar(50)` | YES | | `UPLOADED` ➡️ `PROCESSED` ➡️ `ARCHIVED` |
|
||||
|
||||
## processed_point_cloud (필터/변환 포인트클라우드)
|
||||
| 컬럼 | 타입 | Null | Key | Default / Extra |
|
||||
|---|---|---|---|---|
|
||||
| `id` | `int(11)` | NO | PRI | `auto_increment` |
|
||||
| `input_file_id` / `project_id` | - | NO | MUL | FK→input_files / projects |
|
||||
| `process_type` | `varchar(50)` | YES | | 변환 필터 분류 |
|
||||
| `processed_file_path` / `converted_file_path` | `varchar` | YES | | 저장 경로 / PLY/LAZ 경로 |
|
||||
| `converted_format` | `varchar(50)` | YES | | 변환 포맷 |
|
||||
| `point_count` | `int(11)` | YES | | 포인트 개수 |
|
||||
| `min_z` / `max_z` / `mean_z` | `float` | YES | | 고도 최저 / 최고 / 평균 |
|
||||
| `x_min` ~ `y_max` | `float` | YES | | X/Y 좌표 바운딩 박스 범위 |
|
||||
| `density_per_sqm` | `float` | YES | | ㎡당 점 밀도 |
|
||||
| `classification_summary` | `longtext` | YES | | ground/unclassified 통계 |
|
||||
| `processing_params` | `longtext` | YES | | 분석 파라미터 JSON |
|
||||
| `processed_at` / `status` | - | - | | 변환 일시 / `PROCESSING`\|`COMPLETE`\|`FAILED` |
|
||||
|
||||
## surface_models (지표면 모델 및 등고선)
|
||||
| 컬럼 | 타입 | Null | Key | Default / Extra |
|
||||
|---|---|---|---|---|
|
||||
| `id` | `int(11)` | NO | PRI | `auto_increment` |
|
||||
| `project_id` | `char(36)` | NO | MUL | FK→projects.id |
|
||||
| `model_type` | `varchar(50)` | YES | | `dem_grid`/`tin`/`mesh`/`contour` |
|
||||
| `source_file_id` / `processed_cloud_id` | `int(11)` | YES | MUL | FK→input_files / processed |
|
||||
| `status` | `varchar(50)` | YES | | `PROCESSING` ➡️ `COMPLETE` / `FAILED` |
|
||||
| `crs_epsg` / `resolution_m` | - | YES | | EPSG 좌표 / DEM 격자 해상도 |
|
||||
| `model_file_path` | `varchar(500)` | YES | | 스토리지 상대 경로 |
|
||||
| `generation_params` | `longtext` | YES | | 격자화 알고리즘 인자 JSON |
|
||||
| `created_at` / `completed_at` | `timestamp` | - | | 생성 / 완료 일시 |
|
||||
|
||||
## terrain_layers (지형 레이어)
|
||||
| 컬럼 | 타입 | Null | Key | Default / Extra |
|
||||
|---|---|---|---|---|
|
||||
| `id` | `int(11)` | NO | PRI | `auto_increment` |
|
||||
| `surface_model_id` | `int(11)` | NO | MUL | FK→surface_models.id |
|
||||
| `layer_name` | `varchar(100)` | YES | | 레이어 영문/한글 식별자 |
|
||||
| `geometry_type` | `varchar(50)` | YES | | `POINTCLOUD`/`GRID`/`MESH`/`CONTOUR` |
|
||||
| `layer_file_path` | `varchar(500)` | YES | | 개별 레이어 실 파일 경로 |
|
||||
| `file_format` / `file_size_mb` | - | YES | | 포맷 (ply, tfw, las 등) / 크기 |
|
||||
| `statistics` | `longtext` | YES | | 통계 수치 JSON |
|
||||
| `created_at` | `timestamp` | NO | | 생성 일시 |
|
||||
|
||||
## input_files.status 값
|
||||
`UPLOADED → PROCESSED → ARCHIVED`
|
||||
|
||||
## surface_models.status / processed_point_cloud.status 값
|
||||
`PROCESSING → COMPLETE / FAILED`
|
||||
|
||||
관련 함수 위치 → [[B04_wf1_Surface/B04_db]], 사용 라이브러리 → [[dependencies]]
|
||||
@@ -0,0 +1,102 @@
|
||||
---
|
||||
type: concept
|
||||
status: stable
|
||||
related_pages: ["[[B01_Dashboard/B01_backend]]"]
|
||||
last_updated: 2026-07-12
|
||||
source: raw/guidelines/db_schema.md, raw/guidelines/backend.md
|
||||
---
|
||||
|
||||
# DB: 로그/모니터링 테이블
|
||||
|
||||
← [[overview]]
|
||||
|
||||
## login_logs (로그인 시도 로그)
|
||||
| 컬럼 | 타입 | Null | Key | Default / Extra |
|
||||
|---|---|---|---|---|
|
||||
| `id` | `bigint(20)` | NO | PRI | `auto_increment` |
|
||||
| `user_id` | `int(11)` | YES | MUL | FK→users.id |
|
||||
| `email` | `varchar(255)` | NO | | |
|
||||
| `status` | `enum('SUCCESS','FAILURE')` | NO | | |
|
||||
| `failure_reason` / `user_agent` | `varchar(100)` / `text` | YES | | |
|
||||
| `login_at` | `timestamp` | NO | MUL | `current_timestamp()` |
|
||||
|
||||
## activity_logs (사용자 활동 로그)
|
||||
| 컬럼 | 타입 | Null | Key | Default / Extra |
|
||||
|---|---|---|---|---|
|
||||
| `id` | `bigint(20)` | NO | PRI | `auto_increment` |
|
||||
| `user_id` | `int(11)` | NO | MUL | FK→users.id |
|
||||
| `action_type` | `varchar(100)` | NO | | 행위 종류 |
|
||||
| `action_at` | `timestamp` | NO | | `current_timestamp()` |
|
||||
| `resource_id` / `status` | `varchar(255)` / `enum` | - | | 리소스 ID / SUCCESS\|FAILURE |
|
||||
| `details` | `longtext` | YES | | JSON 상세 데이터 |
|
||||
|
||||
## audit_logs (감사 로그)
|
||||
| 컬럼 | 타입 | Null | Key | Default / Extra |
|
||||
|---|---|---|---|---|
|
||||
| `id` | `int(11)` | NO | PRI | `auto_increment` |
|
||||
| `user_id` | `int(11)` | YES | MUL | FK→users.id |
|
||||
| `action` / `entity_type` | `varchar(100)` | YES | | CRUD/EXPORT/DOWNLOAD 등 |
|
||||
| `entity_id` | `varchar(36)` | YES | | 대상 UUID 등 |
|
||||
| `timestamp` / `ip_address` | `timestamp` / `varchar(45)` | - | | 발생시각 / IP 주소 |
|
||||
| `details` | `longtext` | YES | | JSON 상세 |
|
||||
|
||||
## system_audit_logs (프로젝트/조직 변경 감사 로그)
|
||||
| 컬럼 | 타입 | Null | Key | Default / Extra |
|
||||
|---|---|---|---|---|
|
||||
| `id` | `int(11)` | NO | PRI | `auto_increment` |
|
||||
| `user_id` | `int(11)` | NO | MUL | FK→users.id (행위자) |
|
||||
| `action` / `resource_type` | `varchar(50)` | - | | PROJECT_CREATE 등 / 종류 |
|
||||
| `resource_id` | `int(11)` | YES | | |
|
||||
| `timestamp` | `timestamp` | YES | MUL | `current_timestamp()` |
|
||||
| `ip_address` / `user_agent` | `varchar(50)` / `text` | YES | | IP 주소 / 브라우저 에이전트 |
|
||||
|
||||
## system_admin_logs (시스템 관리자 행위 로그)
|
||||
| 컬럼 | 타입 | Null | Key | Default / Extra |
|
||||
|---|---|---|---|---|
|
||||
| `id` | `bigint(20)` | NO | PRI | `auto_increment` |
|
||||
| `admin_user_id` | `int(11)` | NO | MUL | FK→users.id (관리자 ID) |
|
||||
| `action_type` / `target_id` | `varchar(100)` / `varchar(255)`| - | | 변경종류(USER_STATUS) / 대상 ID |
|
||||
| `action_at` | `timestamp` | NO | | `current_timestamp()` |
|
||||
| `details` | `longtext` | YES | | JSON 형태의 변경 상세 |
|
||||
|
||||
## system_resources (시스템 자원 계측)
|
||||
| 컬럼 | 타입 | Null | Key | Default / Extra |
|
||||
|---|---|---|---|---|
|
||||
| `id` | `int(11)` | NO | PRI | `auto_increment` |
|
||||
| `timestamp` | `timestamp` | YES | MUL | `current_timestamp()` |
|
||||
| `cpu_usage_percent` / `memory_usage_percent` | `float` | YES | | |
|
||||
| `disk_usage_percent` / `total_storage_mb` | `float` | - | | 디스크사용률 / 전체 스토리지 용량 |
|
||||
| `active_user_count` / `active_project_count` | `int(11)` | NO | | 활성 사용자 / 프로젝트 수 |
|
||||
|
||||
## support_requests (기술 지원 요청)
|
||||
| 컬럼 | 타입 | Null | Key | Default / Extra |
|
||||
|---|---|---|---|---|
|
||||
| `id` | `int(11)` | NO | PRI | `auto_increment` |
|
||||
| `company_id` | `int(11)` | YES | MUL | FK→companies.id |
|
||||
| `company_name` / `user_name` | `varchar(255)` | - | | 회사명 / 작성자명 |
|
||||
| `user_email` / `user_phone` | `varchar(255)` / `varchar(30)` | - | | 이메일 / 전화번호 |
|
||||
| `subject` / `message` | `varchar(255)` / `text` | NO | | 제목 / 문의 메시지 본문 |
|
||||
| `status` | `enum('NEW','REVIEWED','RESOLVED','DELETED')` | NO | MUL | `NEW` |
|
||||
| `reviewed_by` | `int(11)` | YES | MUL | FK→users.id (검토자) |
|
||||
| `created_at` / `reviewed_at` / `review_notes` | - | - | | 접수 / 검토일시 / 메모 |
|
||||
|
||||
## change_logs (설계 변경 이력)
|
||||
| 컬럼 | 타입 | Null | Key | Default / Extra |
|
||||
|---|---|---|---|---|
|
||||
| `id` | `int(11)` | NO | PRI | `auto_increment` |
|
||||
| `project_id` | `char(36)` | NO | | FK→projects.id |
|
||||
| `changed_by` | `int(11)` | YES | MUL | FK→users.id (수정자) |
|
||||
| `changed_at` | `timestamp` | NO | | `current_timestamp()` |
|
||||
| `entity_type` / `entity_id` | `varchar(100)` / `int(11)` | YES | | 대상엔티티(routes 등) / 대상 PK |
|
||||
| `old_value` / `new_value` | `longtext` | YES | | 변경 전 / 후 JSON 스냅샷 |
|
||||
| `reason` | `varchar(255)` | YES | | 변경 사유 |
|
||||
|
||||
**사용처:** [[B01_Dashboard/B01_backend|B01_Dashboard]] (SYSTEM_ADMIN 리소스 현황·시스템 로그 섹션), [[A08_Support/A08_backend|A08_Support]] (support_requests INSERT)
|
||||
|
||||
## system_audit_logs — 사용처 (B01, B02)
|
||||
- **프로젝트 생성**: `B02_ProjRegister_Repository.py:92` (`PROJECT_CREATE` 기록 ➡️ [[B02_ProjRegister/B02_backend]])
|
||||
- **기타 관리 행위**: `B01_Dashboard_Repository.py:245,265` (수정·삭제), `:336,367` (회사 생성), `:609` (감사 로그 조회), `:758,779` (자동화 제어)
|
||||
|
||||
## 리소스 API (SYSTEM_ADMIN 전용)
|
||||
`GET /api/dashboard/admin/resources?days=30`
|
||||
- 실시간 계측(`current`), 30일 다운샘플링 시계열 조회(`history`, ~4MB ➡️ ~55KB 압축), 활성 지표(`stats`) 제공.
|
||||
@@ -0,0 +1,64 @@
|
||||
---
|
||||
type: concept
|
||||
status: stable
|
||||
related_pages: []
|
||||
last_updated: 2026-07-12
|
||||
source: raw/guidelines/db_schema.md, raw/guidelines/agent.md
|
||||
---
|
||||
|
||||
# DB 스키마 개요
|
||||
|
||||
**DB명:** `aislo_db` / MariaDB v10.6+ / utf8mb4_unicode_ci / 드라이버 aiomysql
|
||||
|
||||
> ✅ **모순 해결 (2026-07-12, 실 DB 직접 조회 `SHOW TABLES`로 검증):** 실제 운영 DB는 **34개 테이블**. `db_schema.md`(34개)가 정확했고 `agent.md`의 18개/23개는 갱신 안 된 값 — agent.md 쪽 오기로 판정.
|
||||
>
|
||||
> **raw 문서에 없던 실제 테이블 2개 발견:**
|
||||
> - `project_workflow_stages` — [[../workflow_state]] 설계가 **이미 구현되어 실 DB에 존재**함 (컬럼 구성이 계획서와 정확히 일치). status를 draft→stable로 갱신함.
|
||||
> - `system_admin_logs` — 시스템 관리자(SYSTEM_ADMIN)가 회원/조직 상태(`status`) 등을 변경할 때 감사 이력을 INSERT하는 Write-Only 성격의 테이블 ➡️ [[logs_monitoring]].
|
||||
>
|
||||
> ⚠️ **미확정/미연동 테이블 격리 규칙**:
|
||||
> - 분석 중이거나 소스코드와의 구체적인 연결고리(백엔드/프론트엔드 실사용처)가 아직 확정되지 않은 테이블이 신규 추가될 경우, 상위 공식 그룹 파일에 포함하지 않고 [[unconfirmed/README|미확정 폴더(unconfirmed/)]] 내에 개별 `[테이블명].md` 마크다운 파일로 저장하여 격리 관리합니다.
|
||||
|
||||
## 테이블 그룹 (9개)
|
||||
|
||||
| 그룹 | 테이블 수 | 상세 페이지 |
|
||||
|---|---|---|
|
||||
| 사용자/인증/조직 (핵심) | 7 | [[users_auth]] |
|
||||
| 로그/모니터링 | 8 | [[logs_monitoring]] |
|
||||
| 프로젝트 관리 | 3 | [[projects]] |
|
||||
| 파일/지표면분석 | 6 | [[files_surface]] |
|
||||
| 경로/종횡단 | 5 | [[route_profile]] |
|
||||
| 구조물/수량/산출물 | 4 | [[structure_output]] |
|
||||
| 미확정/연결 대기 테이블 | 0 | [[unconfirmed/README]] |
|
||||
|
||||
## 파일 경로 추적 컬럼 (DB에 경로만 기록, 실 파일은 파일시스템)
|
||||
|
||||
| 테이블.컬럼 | 용도 | 사용 단계 |
|
||||
|---|---|---|
|
||||
| `input_files.raw_file_path` | 원본 입력 파일 | B03 |
|
||||
| `processed_point_cloud.converted_file_path` | 변환된 포인트클라우드 | B04 |
|
||||
| `surface_models.model_file_path` | 지표면 모델 | B04 |
|
||||
| `routes.route_data_path` | 경로 데이터(GeoJSON) | B05 |
|
||||
| `longitudinal_sections.longitudinal_file_path` | 종단면 | B06 |
|
||||
| `cross_sections.cross_section_file_path` | 횡단면 | B06 |
|
||||
| `structures.structure_data_path` | 구조물 배치 | B07 |
|
||||
| `quantity_items.quantity_data_path` | 수량 항목 | B08 |
|
||||
| `outputs.outputs_directory_path` | 산출물 폴더 | B09 |
|
||||
| `output_files.output_file_path` | 개별 산출 파일 | B09 |
|
||||
|
||||
상세 경로 규칙 → [[storage_paths]]
|
||||
|
||||
## 설계 원칙
|
||||
- DB에는 "어디에 무엇이 있는가"의 메타정보만 저장. 실제 대용량 파일(LAS/PLY/TIF/DXF/Excel/PDF/JSON)은 파일시스템.
|
||||
- 공간 기하 데이터(GEOMETRY 타입 미지원) → JSON(GeoJSON 형식)으로 저장, 애플리케이션(Shapely/Geopandas)에서 파싱.
|
||||
- 모든 주요 테이블에 soft delete(`deleted_at`) 적용.
|
||||
|
||||
## 테이블 관계 (핵심 흐름)
|
||||
```
|
||||
users ─company_id→ companies
|
||||
projects ─user_id/company_id→ users/companies
|
||||
└→ input_files → processed_point_cloud → surface_models → terrain_layers
|
||||
└→ routes → route_points/route_statistics/longitudinal_sections/cross_sections → structures
|
||||
└→ quantity_items
|
||||
└→ outputs → output_files
|
||||
```
|
||||
@@ -0,0 +1,56 @@
|
||||
---
|
||||
type: concept
|
||||
status: stable
|
||||
related_pages: ["[[B01_Dashboard/B01_backend]]", "[[B02_ProjRegister/B02_backend]]"]
|
||||
last_updated: 2026-07-12
|
||||
source: raw/guidelines/db_schema.md, raw/plans/plan_workflow_state_management.md
|
||||
---
|
||||
|
||||
# DB: 프로젝트 관리 테이블
|
||||
|
||||
← [[overview]]
|
||||
|
||||
## projects (프로젝트)
|
||||
| 컬럼 | 타입 | Null | Key | Default / Extra |
|
||||
|---|---|---|---|---|
|
||||
| `id` | `char(36)` | NO | PRI | 프로젝트 UUID |
|
||||
| `user_id` / `company_id` | `int(11)` | NO | MUL | FK→users/companies |
|
||||
| `name` | `varchar(255)` | NO | | 프로젝트명 |
|
||||
| `region` / `road_type` | `varchar(100)` | YES | | 지역 / 임도종류 |
|
||||
| `project_year` | `int(11)` | YES | | 사업년도 |
|
||||
| `estimated_length_m` | `float` | YES | | 계획 연장(m) |
|
||||
| `memo` | `text` | YES | | 메모 |
|
||||
| `status` | `varchar(50)` | YES | | `NEW` (호환용 캐시) |
|
||||
| `crs_epsg` | `int(11)` | YES | | `5178` (좌표계 EPSG) |
|
||||
| `storage_path` | `varchar(500)` | YES | | 상대경로 ➡️ [[storage_paths]] |
|
||||
| `created_at` / `updated_at` / `deleted_at` | `timestamp` | - | | 생성 / 수정 / soft-delete |
|
||||
|
||||
**사용처:** [[B01_Dashboard/B01_backend|B01_Dashboard]] (목록), [[B02_ProjRegister/B02_backend|B02_ProjRegister]] (생성)
|
||||
|
||||
## project_versions (프로젝트 버전 스냅샷)
|
||||
| 컬럼 | 타입 | Null | Key | Default / Extra |
|
||||
|---|---|---|---|---|
|
||||
| `id` | `int(11)` | NO | PRI | `auto_increment` |
|
||||
| `project_id` | `char(36)` | NO | MUL | FK→projects.id |
|
||||
| `version_num` | `int(11)` | NO | | 버전 번호 |
|
||||
| `status` | `varchar(50)` | YES | | 버전 상태 |
|
||||
| `data` | `longtext` | YES | | 설계 스냅샷 JSON 데이터 |
|
||||
| `snapshot_at` / `created_at` | `timestamp` | NO | | 생성일시 |
|
||||
|
||||
## project_automations (프로젝트 자동화 정책)
|
||||
| 컬럼 | 타입 | Null | Key | Default / Extra |
|
||||
|---|---|---|---|---|
|
||||
| `id` | `int(11)` | NO | PRI | `auto_increment` |
|
||||
| `project_id` | `char(36)` | NO | MUL | FK→projects.id |
|
||||
| `name` | `varchar(100)` | NO | | 자동화 명칭 |
|
||||
| `logic_type` | `varchar(50)` | NO | | `trigger_on_stage_complete` 등 |
|
||||
| `config_json` | `longtext` | NO | | 설정 값 JSON |
|
||||
| `status` | `enum('DRAFT','ACTIVE','INACTIVE')` | NO | MUL | `DRAFT` |
|
||||
| `created_by` / `updated_by` | `int(11)` | - | MUL | FK→users.id |
|
||||
| `last_executed_at` | `datetime` | YES | | 최종 실행 일시 |
|
||||
|
||||
**사용처:** [[B01_Dashboard/B01_backend|B01_Dashboard]] (자동화 로직 관리, USER는 조회 차단)
|
||||
|
||||
## project_workflow_stages (단계별 상세 상태)
|
||||
- 본 테이블은 워크플로우 7단계(stage 0~6)의 세부 진행도(state, params, progress_percent 등)를 관리하는 SSOT입니다.
|
||||
- 상세 테이블 정보 및 사용처 ➡️ [[workflow_state]]
|
||||
@@ -0,0 +1,69 @@
|
||||
---
|
||||
type: concept
|
||||
status: stable
|
||||
related_pages: ["[[B05_wf2_Route/B05_backend]]", "[[B06_wf3_ProfileCross/B06_backend]]"]
|
||||
last_updated: 2026-07-12
|
||||
source: raw/guidelines/db_schema.md
|
||||
---
|
||||
|
||||
# DB: 경로/종횡단 테이블
|
||||
|
||||
← [[overview]]
|
||||
|
||||
## routes (노선 경로)
|
||||
| 컬럼 | 타입 | Null | Key | Default / Extra |
|
||||
|---|---|---|---|---|
|
||||
| `id` | `int(11)` | NO | PRI | `auto_increment` |
|
||||
| `project_id` | `char(36)` | NO | MUL | FK→projects.id |
|
||||
| `surface_model_id` | `int(11)` | YES | MUL | FK→surface_models.id |
|
||||
| `status` | `varchar(50)` | YES | | `DRAFT` ➡️ `CONFIRMED` ➡️ `ARCHIVED` |
|
||||
| `start_chainage_m` / `end_chainage_m` | `float` | YES | | 시작 시점 / 끝 시점 연장(m) |
|
||||
| `total_length_m` | `float` | YES | | 총 연장(m) |
|
||||
| `grade_percent` | `longtext` | YES | | 경사도 정보 JSON |
|
||||
| `constraints` / `algorithm_params` | `longtext` | YES | | 회피 구역 JSON / 알고리즘 가중치 파라미터 JSON |
|
||||
| `route_data_path` | `varchar(500)` | YES | | 노선 데이터 (GeoJSON) 파일 경로 |
|
||||
| `computed_at` / `created_at` | - | - | | 연산 완료 일시 / 생성 일시 |
|
||||
|
||||
## route_points (경로 좌표점)
|
||||
| 컬럼 | 타입 | Null | Key | Default / Extra |
|
||||
|---|---|---|---|---|
|
||||
| `id` | `int(11)` | NO | PRI | `auto_increment` |
|
||||
| `route_id` | `int(11)` | NO | MUL | FK→routes.id |
|
||||
| `chainage_m` | `float` | YES | | 시점 거리(m) |
|
||||
| `elevation_m` / `slope_percent` | `float` | YES | | 표고(m) / 종단 경사율(%) |
|
||||
| `sequence_num` | `int(11)` | YES | | 점 순서 |
|
||||
|
||||
## route_statistics (노선 통계)
|
||||
| 컬럼 | 타입 | Null | Key | Default / Extra |
|
||||
|---|---|---|---|---|
|
||||
| `id` | `int(11)` | NO | PRI | `auto_increment` |
|
||||
| `route_id` | `int(11)` | NO | MUL | FK→routes.id |
|
||||
| `min_slope` / `max_slope` / `mean_slope` | `float` | YES | | 최저 / 최고 / 평균 경사(%) |
|
||||
| `cut_volume_m3` / `fill_volume_m3` | `float` | YES | | 절토량(㎥) / 성토량(㎥) |
|
||||
| `tree_cutting_volume` / `cost_score` | `float` | YES | | 벌채량 / 평점 비용 스코어 |
|
||||
|
||||
## longitudinal_sections (종단면 설계)
|
||||
| 컬럼 | 타입 | Null | Key | Default / Extra |
|
||||
|---|---|---|---|---|
|
||||
| `id` | `int(11)` | NO | PRI | `auto_increment` |
|
||||
| `project_id` / `route_id` | `char(36)` / `int` | NO | MUL | FK→projects / routes |
|
||||
| `computed_at` | `timestamp` | YES | | 종단 계산 일시 |
|
||||
| `data` | `longtext` | YES | | 지반고/계획고/구배 등 설계 데이터 JSON |
|
||||
| `longitudinal_file_path` | `varchar(500)` | YES | | 종단도면 캐드 파일 경로 |
|
||||
| `status` | `varchar(50)` | YES | | `DRAFT` / `CONFIRMED` |
|
||||
|
||||
## cross_sections (횡단면 설계)
|
||||
| 컬럼 | 타입 | Null | Key | Default / Extra |
|
||||
|---|---|---|---|---|
|
||||
| `id` | `int(11)` | NO | PRI | `auto_increment` |
|
||||
| `project_id` / `route_id` | `char(36)` / `int` | NO | MUL | FK→projects / routes |
|
||||
| `chainage_m` / `sequence_num` | - | YES | | 측정 체인 거리(m) / 단면 순서 |
|
||||
| `data` | `longtext` | YES | | 좌우 사면 경사, 폭, 절성토 단면적 JSON |
|
||||
| `cross_section_file_path` | `varchar(500)` | YES | | 횡단도면 캐드 파일 경로 |
|
||||
| `status` | `varchar(50)` | YES | | `DRAFT` / `CONFIRMED` |
|
||||
|
||||
## routes.status 흐름
|
||||
`DRAFT → CONFIRMED → ARCHIVED`
|
||||
|
||||
## cross_sections.data.structures
|
||||
횡단면 하나에 배치된 구조물 ID 배열 → [[structure_output]]#structures 참조
|
||||
@@ -0,0 +1,70 @@
|
||||
---
|
||||
type: concept
|
||||
status: stable
|
||||
related_pages: ["[[B07_wf4_DesignDetail/B07_frontend]]", "[[B08_wf5_Quantity/B08_frontend]]", "[[B09_wf6_Estimation/B09_frontend]]"]
|
||||
last_updated: 2026-07-12
|
||||
source: raw/guidelines/db_schema.md
|
||||
---
|
||||
|
||||
# DB: 구조물/수량/산출물 테이블
|
||||
|
||||
← [[overview]]
|
||||
|
||||
## structures (배치 구조물)
|
||||
| 컬럼 | 타입 | Null | Key | Default / Extra |
|
||||
|---|---|---|---|---|
|
||||
| `id` | `int(11)` | NO | PRI | `auto_increment` |
|
||||
| `project_id` / `cross_section_id` | - | - | MUL | FK→projects / cross_sections |
|
||||
| `structure_type` | `varchar(100)` | YES | | 낙석방지책 / 계간수로 / 돌붙임 등 |
|
||||
| `chainage_m` | `float` | YES | | 구조물 배치 체인 시점 거리(m) |
|
||||
| `location` | `varchar(50)` | YES | | 좌 / 우 / 종단 등 배치 위치 |
|
||||
| `length_m` / `width_m` / `height_m` | `float` | YES | | 길이 / 폭 / 높이 규격(m) |
|
||||
| `material` | `varchar(100)` | YES | | 구조물 재질/자재 |
|
||||
| `quantity` / `unit_price` | - | YES | | 수량 / 단가 |
|
||||
| `design_notes` | `longtext` | YES | | 특기사항 등 메모 |
|
||||
| `structure_data_path` | `varchar(500)` | YES | | 세부 구조 상세 데이터 파일 경로 |
|
||||
| `last_modified_by` | `int(11)` | YES | MUL | FK→users.id (최종 수정자) |
|
||||
| `created_at` / `updated_at` | `timestamp` | - | | 생성 / 수정 일시 |
|
||||
|
||||
## quantity_items (수량 산출 항목)
|
||||
| 컬럼 | 타입 | Null | Key | Default / Extra |
|
||||
|---|---|---|---|---|
|
||||
| `id` | `int(11)` | NO | PRI | `auto_increment` |
|
||||
| `project_id` | `char(36)` | NO | MUL | FK→projects.id |
|
||||
| `category` | `varchar(100)` | YES | | 토공 / 구조물 / 포장 / 배수 등 공종 |
|
||||
| `item_name` / `unit` | `varchar` | YES | | 품목 항목명 / 단위 (㎡, m 등) |
|
||||
| `quantity_design` / `quantity_actual` | `float` | YES | | 설계 수량 / 최종 반영 수량 |
|
||||
| `unit_price` / `total_price` | `float` | YES | | 단가 / 총 금액 |
|
||||
| `standard_reference` | `varchar(255)` | YES | | 품셈 근거 코드/출처 |
|
||||
| `computed_at` / `quantity_data_path` | - | YES | | 계산 일시 / 상세 산출근거 데이터 파일 경로 |
|
||||
| `data` | `longtext` | YES | | 계산 세부 과정 통계 JSON |
|
||||
|
||||
## outputs (최종 견적/도면 산출 세션)
|
||||
| 컬럼 | 타입 | Null | Key | Default / Extra |
|
||||
|---|---|---|---|---|
|
||||
| `id` | `int(11)` | NO | PRI | `auto_increment` |
|
||||
| `project_id` | `char(36)` | NO | MUL | FK→projects.id |
|
||||
| `output_type` | `varchar(100)` | YES | | `estimation_excel`/`drawing_dxf`/`report_pdf`/`all_bundle` |
|
||||
| `status` | `varchar(50)` | YES | | `GENERATING` ➡️ `COMPLETE` / `FAILED` |
|
||||
| `generated_by` / `generated_at` | - | - | MUL | 생성자 FK / 생성일시 |
|
||||
| `version` | `int(11)` | YES | | 산출 버전 |
|
||||
| `outputs_directory_path` | `varchar(500)` | YES | | 산출 파일 번들 디렉토리 경로 |
|
||||
| `metadata` | `longtext` | YES | | 기타 도면 스케일 등 정보 JSON |
|
||||
|
||||
## output_files (개별 산출 파일 리스트)
|
||||
| 컬럼 | 타입 | Null | Key | Default / Extra |
|
||||
|---|---|---|---|---|
|
||||
| `id` | `int(11)` | NO | PRI | `auto_increment` |
|
||||
| `output_id` | `int(11)` | NO | MUL | FK→outputs.id |
|
||||
| `file_type` | `varchar(50)` | YES | | `xlsx`/`pdf`/`dxf`/`dwg`/`json`/`zip` 등 |
|
||||
| `original_filename` | `varchar(255)` | YES | | 원본 파일 식별 이름 |
|
||||
| `output_file_path` | `varchar(500)` | YES | | 개별 파일 저장 경로 |
|
||||
| `file_size_mb` / `download_count` | - | YES | | 파일 용량 / 다운로드 누적 카운트 |
|
||||
| `created_at` | `timestamp` | NO | | 생성일시 |
|
||||
|
||||
## quantity_items 총비용 계산 예
|
||||
```sql
|
||||
SELECT SUM(quantity_actual * unit_price) AS total_cost, category
|
||||
FROM quantity_items WHERE project_id = :project_id AND deleted_at IS NULL
|
||||
GROUP BY category;
|
||||
```
|
||||
@@ -0,0 +1,7 @@
|
||||
# 미확정 테이블 보관소 (Unconfirmed DB Schemas)
|
||||
|
||||
본 디렉토리는 소스코드 연동 처리가 완료되지 않았거나, 비즈니스 로직(백엔드/프론트엔드) 상의 구체적인 연결고리가 식별되지 않은 미확정 테이블의 명세서 및 임시 분석 내용을 개별 마크다운 파일로 저장·격리하는 공간입니다.
|
||||
|
||||
## 운영 규칙
|
||||
1. **임시 격리**: 신규 테이블 추가 또는 레거시 테이블 중 사용처를 즉시 규명하기 어려운 경우 `[테이블명].md`로 파일을 생성해 기록합니다.
|
||||
2. **확정 이관**: 소스코드에서의 실제 사용처(라우터, 리포지토리 등)가 명확해지면, 상위의 공식 테이블 그룹(예: `users_auth.md`, `logs_monitoring.md` 등)으로 표 명세를 이관하고 본 폴더 내의 마크다운은 삭제합니다.
|
||||
@@ -0,0 +1,92 @@
|
||||
---
|
||||
type: concept
|
||||
status: stable
|
||||
related_pages: ["[[B01_Dashboard/B01_backend]]"]
|
||||
last_updated: 2026-07-12
|
||||
source: raw/guidelines/db_schema.md
|
||||
---
|
||||
|
||||
# DB: 사용자/인증/조직 테이블
|
||||
|
||||
← [[overview]]
|
||||
|
||||
## users (사용자)
|
||||
| 컬럼 | 타입 | Null | Key | Default / Extra |
|
||||
|---|---|---|---|---|
|
||||
| `id` | `int(11)` | NO | PRI | `auto_increment` |
|
||||
| `email` | `varchar(255)` | NO | UNI | |
|
||||
| `password_hash` | `varchar(255)` | NO | | |
|
||||
| `name` | `varchar(255)` | NO | | |
|
||||
| `position` / `department` | `varchar(100)` | YES | | 직위 / 부서 |
|
||||
| `phone` | `varchar(20)` | YES | | |
|
||||
| `company_id` | `int(11)` | YES | MUL | FK→companies.id |
|
||||
| `role` | `enum('SYSTEM_ADMIN','ADMIN','USER')` | NO | MUL | `USER` |
|
||||
| `is_master` | `tinyint(1)` | NO | | `0` (마스터 여부) |
|
||||
| `status` | `enum('PENDING_EMAIL','NO_COMPANY','PENDING','ACTIVE','INACTIVE','REJECTED')` | NO | MUL | `PENDING_EMAIL` |
|
||||
| `auth_expires_at` / `last_login` | `datetime` | YES | | 인증만료 / 최종로그인 |
|
||||
| `login_failures` | `int(11)` | NO | | `0` (실패 횟수) |
|
||||
| `created_at` / `updated_at` / `deleted_at` | `timestamp` | - | | 생성 / 수정 / soft-delete |
|
||||
|
||||
**사용처:** [[B01_Dashboard/B01_backend|B01_Dashboard]] (사용자 관리), 전 페이지 공통 인증
|
||||
|
||||
## companies (회사)
|
||||
| 컬럼 | 타입 | Null | Key | Default / Extra |
|
||||
|---|---|---|---|---|
|
||||
| `id` | `int(11)` | NO | PRI | `auto_increment` |
|
||||
| `name` | `varchar(255)` | NO | UNI | 회사명 |
|
||||
| `business_registration_number` | `varchar(20)` | YES | UNI | 사업자번호 |
|
||||
| `status` | `enum('ACTIVE','INACTIVE','SUSPENDED')` | NO | | `ACTIVE` |
|
||||
| `subscription_status` | `enum('FREE','TRIAL','PAID','EXPIRED')` | NO | | `FREE` |
|
||||
| `created_by` | `int(11)` | YES | MUL | FK→users.id (생성자) |
|
||||
| `company_code` | `varchar(20)` | YES | | 참여용 코드 |
|
||||
|
||||
**사용처:** [[B01_Dashboard/B01_backend|B01_Dashboard]]
|
||||
|
||||
## sessions (세션)
|
||||
| 컬럼 | 타입 | Null | Key | Default / Extra |
|
||||
|---|---|---|---|---|
|
||||
| `id` | `varchar(255)` | NO | PRI | 세션 ID (쿠키 값) |
|
||||
| `user_id` | `int(11)` | NO | MUL | FK→users.id |
|
||||
| `user_agent_hash` | `char(64)` | NO | | |
|
||||
| `expires_at` | `timestamp` | NO | MUL | 만료일시 |
|
||||
| `last_activity_at` | `timestamp` | NO | | 최종 활동일시 |
|
||||
|
||||
**사용처:** 전 페이지 공통 (세션 인증) — 상세 → [[auth_rbac]]
|
||||
|
||||
## email_otps (이메일 OTP)
|
||||
| 컬럼 | 타입 | Null | Key | Default / Extra |
|
||||
|---|---|---|---|---|
|
||||
| `id` | `bigint(20)` | NO | PRI | `auto_increment` |
|
||||
| `user_id` | `int(11)` | NO | MUL | FK→users.id |
|
||||
| `purpose` | `enum('REGISTER','LOGIN','REVERIFY','PASSWORD_CHANGE')` | NO | | 용도 |
|
||||
| `otp_hash` | `varchar(255)` | NO | | OTP 해시값 |
|
||||
| `expires_at` / `consumed_at` | `timestamp` | - | | 만료일시 / 사용일시 |
|
||||
|
||||
## trusted_devices (신뢰 기기)
|
||||
| 컬럼 | 타입 | Null | Key | Default / Extra |
|
||||
|---|---|---|---|---|
|
||||
| `id` | `bigint(20)` | NO | PRI | `auto_increment` |
|
||||
| `user_id` | `int(11)` | NO | MUL | FK→users.id |
|
||||
| `user_agent_hash` | `char(64)` | NO | | 브라우저 지문 해시 |
|
||||
| `verified_at` / `last_used_at` | `timestamp` | NO | | 검증 / 최종 사용 일시 |
|
||||
|
||||
## join_requests (회사 가입 신청)
|
||||
| 컬럼 | 타입 | Null | Key | Default / Extra |
|
||||
|---|---|---|---|---|
|
||||
| `id` | `int(11)` | NO | PRI | `auto_increment` |
|
||||
| `user_id` / `company_id` | `int(11)` | NO | MUL | FK→users/companies |
|
||||
| `status` | `enum('PENDING','APPROVED','REJECTED')` | NO | | `PENDING` |
|
||||
| `requested_at` / `reviewed_at` | `timestamp` | - | | 신청 / 검토 일시 |
|
||||
| `reviewed_by` | `int(11)` | YES | MUL | FK→users.id (검토자) |
|
||||
|
||||
**사용처:** [[B01_Dashboard/B01_backend|B01_Dashboard]] (`B01_Dashboard_Repository.py:378` 가입 신청·처리)
|
||||
|
||||
## user_consents (약관 동의)
|
||||
| 컬럼 | 타입 | Null | Key | Default / Extra |
|
||||
|---|---|---|---|---|
|
||||
| `id` | `bigint(20)` | NO | PRI | `auto_increment` |
|
||||
| `user_id` | `int(11)` | NO | MUL | FK→users.id |
|
||||
| `terms_version` | `varchar(20)` | NO | | 동의한 약관 버전 |
|
||||
| `terms_agreed` / `privacy_agreed` | `tinyint(1)` | NO | | 필수 동의여부 (1=동의) |
|
||||
| `marketing_agreed` | `tinyint(1)` | NO | | `0` (선택 마케팅동의) |
|
||||
| `agreed_at` | `timestamp` | NO | | 동의 일시 |
|
||||
@@ -0,0 +1,36 @@
|
||||
---
|
||||
type: concept
|
||||
status: stable
|
||||
related_pages: ["[[B01_Dashboard/B01_backend]]", "[[B03_FileInput/B03_backend]]", "[[B04_wf1_Surface/B04_backend]]", "[[B05_wf2_Route/B05_backend]]", "[[B06_wf3_ProfileCross/B06_backend]]"]
|
||||
last_updated: 2026-07-12
|
||||
source: raw/guidelines/agent.md, raw/guidelines/migration_plan.md
|
||||
---
|
||||
|
||||
# 외부 라이브러리 의존성
|
||||
|
||||
## 백엔드 (Python 3.12.7)
|
||||
| 라이브러리 | 용도 | 사용 페이지 |
|
||||
|---|---|---|
|
||||
| FastAPI / Pydantic | API 프레임워크 / 요청·응답 검증 | 전체; [[B01_Dashboard/B01_backend|B01_Dashboard]] 라우터·요청 모델 |
|
||||
| Trimesh | 3D 메시 처리 | [[B04_wf1_Surface/B04_backend|B04_wf1_Surface]] (모델 생성) |
|
||||
| Whitebox | 지형 분석(D8 흐름누적 등) | [[B04_wf1_Surface/B04_backend|B04_wf1_Surface]], [[B05_wf2_Route/B05_backend|B05_wf2_Route]] (skeleton) |
|
||||
| Geopandas | 공간 데이터프레임 | [[B04_wf1_Surface/B04_backend|B04_wf1_Surface]], [[B05_wf2_Route/B05_backend|B05_wf2_Route]] |
|
||||
| Shapely | 기하 연산 (JSON 파싱 후) | [[B05_wf2_Route/B05_backend|B05_wf2_Route]], [[B06_wf3_ProfileCross/B06_backend|B06_wf3_ProfileCross]] |
|
||||
| NumPy | 격자·통계·비용면 및 LAS 통계 계산 | [[B03_FileInput/B03_backend|B03_FileInput]], [[B05_wf2_Route/B05_backend|B05_wf2_Route]] |
|
||||
| SciPy | 수치 보간·계산 보조 | [[B05_wf2_Route/B05_backend|B05_wf2_Route]] |
|
||||
| Rasterio | 래스터(DEM/TIF) 입출력·메타데이터 | [[B03_FileInput/B03_backend|B03_FileInput]], [[B04_wf1_Surface/B04_backend|B04_wf1_Surface]] |
|
||||
| Laspy | LAS/LAZ 포인트클라우드 파싱 | [[B03_FileInput/B03_backend|B03_FileInput]], [[B04_wf1_Surface/B04_backend|B04_wf1_Surface]] |
|
||||
| Pyproj | PRJ/TIF 좌표계 해석 | [[B03_FileInput/B03_backend|B03_FileInput]] |
|
||||
| aiomysql | 비동기 MariaDB 드라이버 (Raw SQL) | 전체 |
|
||||
| psutil | CPU·메모리 사용률 계측 | [[B01_Dashboard/B01_backend|B01_Dashboard]] 리소스 현황 |
|
||||
|
||||
## 프론트엔드 (TypeScript/Node.js)
|
||||
| 항목 | 용도 | 사용처 |
|
||||
|---|---|---|
|
||||
| **three.js** (WebGL) | 3D 뷰어(WebGLRenderer, OrbitControls, Points/Mesh) | [[B04_wf1_Surface/B04_backend|B04_wf1_Surface]] 구현 확인. B05/B06은 각 페이지에서 미구현 확인 |
|
||||
| Vite | 빌드 도구 | 전 프론트 |
|
||||
|
||||
> ⚠️ B04는 three.js 기반 3D 뷰어가 구현되어 있고, B05/B06은 현재 문서 기준 WebCAD 노선·프로필 뷰어가 미구현이다.
|
||||
|
||||
## 선정 원칙 (agent.md 3절)
|
||||
프로젝트에 맞춰 호환 라이브러리 선정, 불필요한 함수 작성 최소화. `asyncmy` 대신 `aiomysql` 채택 이유: Cython 빌드가 Windows 환경에서 불필요.
|
||||
@@ -0,0 +1,19 @@
|
||||
---
|
||||
type: concept
|
||||
status: stable
|
||||
related_pages: []
|
||||
last_updated: 2026-07-12
|
||||
source: raw/guidelines/backend.md
|
||||
---
|
||||
|
||||
# 공통 스키마 (Pydantic 요청/응답 규칙)
|
||||
|
||||
## 검증 원칙 (backend.md 4절)
|
||||
- 모든 JSON 요청은 라우터 진입 전 Pydantic 모델로 타입·범위 검증.
|
||||
- 모든 지형/메쉬 연산은 `try-except` 필수.
|
||||
- 에러 응답 표준 포맷: `{"status": "error", "message": "원인"}` — 전 라우터 공통, 프론트도 동일 포맷 기대.
|
||||
|
||||
## 명명 규칙
|
||||
파일명 `[폴더명]_Schema.py`, 페이지 폴더 내부 배치 (전역 공유 스키마 폴더 없음 — 필요 시 여기에 항목 추가).
|
||||
|
||||
> 현재 raw 자료에서 페이지 간 공유되는 구체적 Pydantic 모델(예: 공통 페이지네이션, 공통 좌표 타입)은 확인되지 않음. 발견 시 이 페이지에 추가.
|
||||
@@ -0,0 +1,36 @@
|
||||
---
|
||||
type: concept
|
||||
status: stable
|
||||
related_pages: ["[[B02_ProjRegister/B02_backend]]", "[[B03_FileInput/B03_backend]]", "[[B04_wf1_Surface/B04_backend]]", "[[B05_wf2_Route/B05_backend]]", "[[B06_wf3_ProfileCross/B06_backend]]", "[[B07_wf4_DesignDetail/B07_frontend]]", "[[B08_wf5_Quantity/B08_frontend]]", "[[B09_wf6_Estimation/B09_frontend]]"]
|
||||
last_updated: 2026-07-12
|
||||
source: raw/guidelines/structure.md, raw/guidelines/db_schema.md, raw/guidelines/backend.md, raw/guidelines/agent.md
|
||||
---
|
||||
|
||||
# 저장 경로 규칙 (Workflow-based Folder Structure)
|
||||
|
||||
## 경로 패턴
|
||||
```
|
||||
storage/{company_slug}/{user_slug}/{project_id}/
|
||||
├── B03_FileInput/input/{file_type}/ WF0 원본 입력
|
||||
├── B04_wf1_Surface/processed/, models/ WF1 변환·모델
|
||||
├── B05_wf2_Route/route/ WF2 경로
|
||||
├── B06_wf3_ProfileCross/longitudinal/, cross_sections/ WF3 종횡단
|
||||
├── B07_wf4_DesignDetail/structures/ WF4 구조물
|
||||
├── B08_wf5_Quantity/quantities/ WF5 수량
|
||||
└── B09_wf6_Estimation/v1/, v2/, ... WF6 산출물 (버전은 여기서만)
|
||||
```
|
||||
|
||||
## 원칙 (backend.md 3절)
|
||||
1. **하드코딩 금지** — 경로는 `config/config_system.py`에서 import.
|
||||
2. **물리 파일은 DB 저장 금지** — 대용량 파일은 파일시스템, DB에는 경로만.
|
||||
3. **단계별 루트 강제** — 각 B0x 폴더명은 실제 워크플로우 페이지명과 동일해야 함. `raw/`, `processed/`, `computed/`를 프로젝트 루트 공용 폴더로 만들지 않음.
|
||||
4. **경로 생성 책임 분리** — 페이지별 백엔드는 자기 단계 폴더만 생성·수정. 다른 단계 산출물을 직접 삭제·덮어쓰지 않고 stale로 전파 → [[workflow_state]].
|
||||
5. **상대 경로만 DB 저장** — 프로젝트 루트 기준 상대경로. 사용자 입력 경로 직접 결합 금지(경로 이탈 방지), 절대경로 저장 금지.
|
||||
|
||||
## DB 컬럼 ↔ 실제 경로 매핑
|
||||
상세 표 → [[db_schema/overview]] "파일 경로 추적 컬럼"
|
||||
|
||||
## 파일명 규칙 (structure.md 1절)
|
||||
- 페이지 폴더: 로그인 전 `A0x_`, 로그인 후 `B0x_`, 워크플로우는 `wf[번호]` 접두사
|
||||
- 파일명: `폴더명(페이지명)_기능_기타사양.확장자`
|
||||
- 공통 유틸: `common_util/common_util_기능.확장자`
|
||||
@@ -0,0 +1,85 @@
|
||||
---
|
||||
status: stable
|
||||
related_pages: ["[[A01_Home/A01_frontend]]", "[[A02_ProgDetail/A02_frontend]]", "[[B01_Dashboard/B01_frontend]]", "[[B08_wf5_Quantity/B08_frontend]]"]
|
||||
last_updated: 2026-07-12
|
||||
source: ui_template/ 공통 UI 소스 코드 및 스타일시트
|
||||
---
|
||||
|
||||
# UI Templates — Localization & Components
|
||||
|
||||
프론트엔드 공통 UI 요소: 다국어(i18n), 공통 컴포넌트, 테마 스타일. 디자인 시스템: [[design.md]]
|
||||
|
||||
## ui_template_locale.ts (다국어 관리)
|
||||
|
||||
**파일**: `ui_template/ui_template_locale.ts`
|
||||
|
||||
### 핵심 기능
|
||||
|
||||
| 항목 | 위치 | 역할 |
|
||||
|---|---|---|
|
||||
| `currentLanguageIndex` | `ui_template/ui_template_locale.ts:12` | 현재 활성화된 언어 인덱스 (ko=0, en=1) |
|
||||
| `ui_locales` | `ui_template/ui_template_locale.ts:25` | 다국어 문구가 등록된 2차원 사전 객체 |
|
||||
| `t(key)` | `ui_template/ui_template_locale.ts:152` | 지정된 키에 대응하는 현재 언어 텍스트 반환 헬퍼 |
|
||||
|
||||
### 사용처 (역참조)
|
||||
- [[A01_Home/A01_frontend]] — MOCK_NEWS 태그, 섹션 제목
|
||||
- [[A02_ProgDetail/A02_frontend]] — 워크플로우 스텝, 기술 카드
|
||||
- [[a00_app_shell_framework]] — 헤더 네비, 언어 토글, 버튼 라벨
|
||||
- 모든 A0x/B0x 페이지 — 동적 텍스트 로드
|
||||
|
||||
## ui_template_elements.ts (공통 컴포넌트)
|
||||
|
||||
**파일**: `ui_template/ui_template_elements.ts`
|
||||
|
||||
### 제공 컴포넌트
|
||||
|
||||
| 항목 | 위치 | 역할 |
|
||||
|---|---|---|
|
||||
| `createButton(opts)` | `ui_template/ui_template_elements.ts:60` | 버튼. variant: `filled`(기본)/`ghost`/`pill`/`danger` |
|
||||
| `createInputField(opts)` | `ui_template/ui_template_elements.ts:102` | 입력필드(라벨+입력+에러슬롯), setError 핸들 반환 |
|
||||
| `createSelectField(opts)` | `ui_template/ui_template_elements.ts:164` | 드롭다운 select 필드 |
|
||||
| `createCard(opts)` | `ui_template/ui_template_elements.ts:209` | 카드(title + body 배열, raised 옵션) |
|
||||
| `createTag(label, variant?)` | `ui_template/ui_template_elements.ts:228` | 태그. variant: `accent`/`neutral`(기본)/`success`/`warning`/`danger` |
|
||||
| `showLoadingOverlay()` | `ui_template/ui_template_elements.ts:253` | 로딩 스피너 오버레이 표시(참조카운트) |
|
||||
| `hideLoadingOverlay()` | `ui_template/ui_template_elements.ts:259` | 로딩 오버레이 해제 |
|
||||
| `showToast(msg, kind?, ms?)` | `ui_template/ui_template_elements.ts:282` | 토스트 알림. kind: success/error/info/warning |
|
||||
| `createWorkflowShell(opts)` | `ui_template/ui_template_elements.ts:315` | 워크플로우 3단 레이아웃(헤더+좌측패널+우측뷰어) |
|
||||
| `createLineChart(opts)` | `ui_template/ui_template_elements.ts:402` | 시계열 스플라인 차트(인라인 SVG, 외부 라이브러리 없음) |
|
||||
| `injectBaseStyles()` | `ui_template/ui_template_elements.ts:843` | 공통 컴포넌트 기본 스타일 1회 주입 |
|
||||
|
||||
### 사용처 (역참조)
|
||||
- [[A01_Home/A01_frontend]] — createButton, createCard, createTag
|
||||
- [[A02_ProgDetail/A02_frontend]] — createButton, createCard
|
||||
- [[A03_CompDetail/A03_frontend]] — createCard
|
||||
- [[A04_NewsHistory/A04_frontend]] — createTag
|
||||
- [[A05_EduDetail/A05_frontend]] — createButton, createCard
|
||||
- [[a00_app_shell_framework]] — createButton(헤더 네비/인증), createWorkflowShell
|
||||
- B그룹 모든 페이지 — createWorkflowShell, createLineChart(B01 대시보드)
|
||||
|
||||
## theme.css (스타일 변수)
|
||||
|
||||
**파일**: `ui_template/theme.css`
|
||||
|
||||
### 핵심 변수
|
||||
|
||||
| 항목 | 위치 | 역할 |
|
||||
|---|---|---|
|
||||
| `--color-primary`, `--color-primary-text` | `ui_template/theme.css:10` | 기본 색상 및 기본 텍스트 색상 |
|
||||
| `--color-canvas`, `--color-paper` | `ui_template/theme.css:15` | 기본 캔버스 배경 및 레이어 카드 배경 |
|
||||
| `--color-deep-iris`, `--color-mist-violet` | `ui_template/theme.css:22` | 라벤더 그라디언트 및 브랜드 서브 컬러 |
|
||||
| `--spacing-8`, `--spacing-16` 등 | `ui_template/theme.css:45` | 기본 마진/패딩 간격 시스템 (8px 배수) |
|
||||
| `--text-heading-lg`, `--text-body` 등 | `ui_template/theme.css:70` | 타이포그래피 크기 및 라인하이트 스케일 |
|
||||
| `--radius-cards`, `--radius-icons` | `ui_template/theme.css:110` | 8px 등의 둥근 테두리 곡률 반지름 변수 |
|
||||
| `--z-header` | `ui_template/theme.css:125` | 전역 헤더 고정용 z-index 인덱스 값 |
|
||||
|
||||
## 제약 (backend.md §1)
|
||||
|
||||
1. **다국어**: 모든 UI 문구는 반드시 `ui_locales` 등록 후 `L(key)` 또는 `t(key)`로만 참조
|
||||
2. **스타일**: CSS는 `theme.css` 변수만 사용, 하드코드 색상/단위 금지
|
||||
3. **컴포넌트 재사용**: `createButton`, `createCard`, `createTag`, `createWorkflowShell` 우선 사용
|
||||
4. **명명**: 이벤트 핸들러는 `on[페이지]_[기능]_[액션]` 규칙 준수
|
||||
|
||||
## 의존성
|
||||
|
||||
- **Locale**: 모든 페이지에서 `currentLanguageIndex` 조회
|
||||
- **요소**: 페이지별로 필요한 컴포넌트만 import
|
||||
@@ -0,0 +1,74 @@
|
||||
---
|
||||
type: concept
|
||||
status: stable
|
||||
related_pages: ["[[B01_Dashboard/B01_backend]]", "[[B02_ProjRegister/B02_backend]]", "[[B03_FileInput/B03_backend]]", "[[B04_wf1_Surface/B04_backend]]", "[[B05_wf2_Route/B05_backend]]", "[[B06_wf3_ProfileCross/B06_backend]]", "[[B07_wf4_DesignDetail/B07_frontend]]", "[[B08_wf5_Quantity/B08_frontend]]", "[[B09_wf6_Estimation/B09_frontend]]"]
|
||||
last_updated: 2026-07-12
|
||||
source: raw/plans/plan_workflow_state_management.md (계획, 2026-07-10) + 실 코드/DB 직접 확인 (2026-07-12)
|
||||
---
|
||||
|
||||
# Workflow 상태 관리 — 구현 완료 (실 DB 확인됨)
|
||||
|
||||
> **status: stable.** 2026-07-12 실 코드 전수 확인 + DB 직접 접속(`SHOW TABLES`/`DESCRIBE`)으로 검증. 계획서(2026-07-10)의 설계가 **B01~B06 전 단계에 이미 적용 완료**됨. 정식 검증보고서는 없지만 코드·DB 실측이 계획과 일치해 stable로 채택. 남은 잔재 1건은 아래 참고.
|
||||
|
||||
## SSOT: `project_workflow_stages` 테이블 (실 DB 확인)
|
||||
| 컬럼 | 타입 |
|
||||
| --------------------------------------------- | -------------------------------------------------------------------------------------------------------------- |
|
||||
| id | INT PK |
|
||||
| project_id | CHAR(36), FK |
|
||||
| stage_no | TINYINT (0~6) |
|
||||
| stage_key | VARCHAR(30) — FILE_INPUT/WF1_SURFACE/WF2_ROUTE/WF3_PROFILE_CROSS/WF4_DESIGN_DETAIL/WF5_QUANTITY/WF6_ESTIMATION |
|
||||
| state | ENUM('NOT_STARTED','IN_PROGRESS','COMPLETE','FAILED','STALE') |
|
||||
| progress_percent | TINYINT |
|
||||
| params | LONGTEXT(JSON) — 재실행 시 폼 프리필용 |
|
||||
| message, started_at, completed_at, updated_at | 진행/이력 |
|
||||
|
||||
생성 SQL: `db_management/006_workflow_state.sql`, 백필: `db_management/migrate_workflow_state.py` (기존 프로젝트 `projects.status` 해석 후 시드)
|
||||
|
||||
## 공통 유틸 `common_util/common_util_workflow_state.py`
|
||||
| 함수 | 역할 |
|
||||
|---|---|
|
||||
| `initialize_project_stages(cursor, project_id)` | 프로젝트 생성 시 7행 NOT_STARTED 시드 |
|
||||
| `start_stage(cursor, project_id, stage_no, params)` | IN_PROGRESS 전이 + N+1~6의 COMPLETE를 STALE로 전파 + `projects.status` 캐시 갱신 |
|
||||
| `complete_stage(cursor, project_id, stage_no)` | COMPLETE 전이 (stage 6 완료 시 `projects.status='DONE'`) |
|
||||
| `fail_stage(cursor, project_id, stage_no, message)` | FAILED 전이 |
|
||||
| `update_stage_progress(cursor, project_id, stage_no, progress)` | 진행률만 갱신 |
|
||||
| `get_workflow_state(cursor, project_id)` | 단건 조회, `current_stage` 계산 포함 |
|
||||
|
||||
## 실 연동 현황 (파일:줄번호)
|
||||
| 페이지 | 위치 | 연동 stage_no |
|
||||
|---|---|---|
|
||||
| [[B02_ProjRegister/B02_backend|B02_ProjRegister]] | `B02_ProjRegister_Repository.py:90` `initialize_project_stages` 호출 | 시드(0~6) |
|
||||
| [[B03_FileInput/B03_backend|B03_FileInput]] | `B03_FileInput_Router.py:175,224,256,347,570` | stage 0, 1 |
|
||||
| [[B04_wf1_Surface/B04_backend|B04_wf1_Surface]] | `B04_wf1_Surface_Router.py:168,209,227,233` | stage 1 |
|
||||
| [[B05_wf2_Route/B05_backend|B05_wf2_Route]] | `B05_wf2_Route_Router.py:51,96,112,117,122,128,152` | stage 2 |
|
||||
| [[B06_wf3_ProfileCross/B06_backend|B06_wf3_ProfileCross]] | `B06_wf3_ProfileCross_Router.py:68,111,127,132,137,143,187` | stage 3 |
|
||||
| [[B01_Dashboard/B01_backend|B01_Dashboard]] | `B01_Dashboard_Repository.py:83` `get_workflow_states_for_projects()` (배치 조회, 프로젝트 목록에 `workflow_state` 필드 포함) | 조회 전용 |
|
||||
|
||||
## 조회 API (실제 존재, 계획서와 경로 일치)
|
||||
`GET /{project_id}/workflow-state` — `B03_FileInput_Router.py:667`
|
||||
```json
|
||||
{"status": "success", "workflow_state": {"project_id": "...", "current_stage": 2, "stages": [...]}}
|
||||
```
|
||||
실제 전체 경로는 B03 라우터 prefix를 포함한 `/api/projects/{project_id}/workflow-state`이다.
|
||||
|
||||
## 상태 전이 (구현대로)
|
||||
```
|
||||
NOT_STARTED → IN_PROGRESS → COMPLETE
|
||||
└→ FAILED → (재실행) IN_PROGRESS
|
||||
COMPLETE → (하위 단계 재작업) → STALE → (재실행) IN_PROGRESS
|
||||
```
|
||||
stage N이 IN_PROGRESS 전이 시 N+1~6의 COMPLETE를 전부 STALE로 전파 (`start_stage` 내부 UPDATE 쿼리로 확인됨).
|
||||
|
||||
## projects.status 문자열 캐시 (호환용, 계획서 방침대로 유지 중)
|
||||
`start_stage`/`complete_stage`/`fail_stage`가 `project_workflow_stages`와 `projects.status`를 **동시에** 갱신 (`WF{n}_ANALYZING`/`WF{n}_COMPLETE`/`WF{n}_FAILED`, stage6 COMPLETE 시 `DONE`).
|
||||
|
||||
## B04 상태 조회 — 레거시 폴백 (당초 "잔재"로 표기했으나 정정)
|
||||
`get_wf1_analysis_status()`([[B04_wf1_Surface/B04_backend]], `B04_wf1_Surface_Router.py:372`)는
|
||||
`project_workflow_stages`(SSOT)를 **우선** 조회하고, 행이 없을 때만(백필 미작동 대비)
|
||||
`projects.status` 문자열 비교로 폴백함(416 `WF1_COMPLETE`, 420 `WF1_ANALYZING`, `:412-427`).
|
||||
→ B04 실 코드 확인 결과 **정상 경로가 아닌 방어적 폴백**. SSOT 안정화 후 제거 가능하나 현재는 안전장치로 유효.
|
||||
별개로 `update_project_status()`(`:76`)는 정의만 있고 미호출(죽은 코드) → 정리 권장.
|
||||
|
||||
## 미해결 사항 (계획서 원문, 아직 결정 안 됨)
|
||||
- `projects.status` 완전 제거 여부 — 현재는 유지 중(위 확인)
|
||||
- STALE 하위 결과 파일: 즉시 삭제 vs 재실행 시 덮어쓰기 — 코드 레벨 확인 안 함, 별도 점검 필요
|
||||
@@ -0,0 +1,48 @@
|
||||
{
|
||||
"0": "DB: 로그/모니터링 테이블",
|
||||
"1": "auth_rbac.md",
|
||||
"2": "workflow_state.md",
|
||||
"3": "개념 (Concepts)",
|
||||
"4": "Wiki Log",
|
||||
"5": "ui_templates.md",
|
||||
"6": "A09_Security — Backend",
|
||||
"7": "A00_Common — App Shell Framework",
|
||||
"8": "UI Templates — Localization & Components",
|
||||
"9": "A04_NewsHistory — Frontend",
|
||||
"10": "A07_Register — Frontend",
|
||||
"11": "A08_Support — Backend",
|
||||
"12": "A08_Support — Frontend",
|
||||
"13": "B02_ProjRegister — Frontend",
|
||||
"14": "인증 / RBAC",
|
||||
"15": "A01_Home — Frontend",
|
||||
"16": "A05_EduDetail — Frontend",
|
||||
"17": "A06_Login — Backend",
|
||||
"18": "A06_Login — Frontend",
|
||||
"19": "A09_Security — Frontend",
|
||||
"20": "B02_ProjRegister — Backend",
|
||||
"21": "Workflow 상태 관리 — 구현 완료 (실 DB 확인됨)",
|
||||
"22": "A03_CompDetail — Frontend",
|
||||
"23": "B04_wf1_Surface — Backend",
|
||||
"24": "DB: 경로/종횡단 테이블",
|
||||
"25": "A07_Register — Backend",
|
||||
"26": "B04_wf1_Surface — Frontend",
|
||||
"27": "B07_wf4_DesignDetail — Frontend",
|
||||
"28": "B09_wf6_Estimation — Frontend",
|
||||
"29": "B05_wf2_Route — Backend",
|
||||
"30": "A01_Home — 세부 구현",
|
||||
"31": "A02_ProgDetail — 세부 구현",
|
||||
"32": "A02_ProgDetail — Frontend",
|
||||
"33": "B05_wf2_Route — Frontend",
|
||||
"34": "B02_ProjRegister — DB",
|
||||
"35": "B04_wf1_Surface — DB",
|
||||
"36": "B04_wf1_Surface — Dependencies",
|
||||
"37": "B06_wf3_ProfileCross — Frontend",
|
||||
"38": "wiki/ 폴더 규칙",
|
||||
"39": "wiki/ 폴더 규칙",
|
||||
"40": "B04_wf1_Surface — API",
|
||||
"41": "B05_wf2_Route — DB 사용 관계",
|
||||
"42": "B06_wf3_ProfileCross — DB 사용 관계",
|
||||
"43": "B01_Dashboard — DB 사용 관계",
|
||||
"44": "B03_FileInput — DB 사용 관계",
|
||||
"45": "B08_wf5_Quantity — DB"
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
.
|
||||
@@ -0,0 +1,275 @@
|
||||
# Graph Report - wiki (2026-07-12)
|
||||
|
||||
## Corpus Check
|
||||
- 69 files · ~23,462 words
|
||||
- Verdict: corpus is large enough that graph structure adds value.
|
||||
|
||||
## Summary
|
||||
- 530 nodes · 511 edges · 46 communities (43 shown, 3 thin omitted)
|
||||
- Extraction: 100% EXTRACTED · 0% INFERRED · 0% AMBIGUOUS
|
||||
- Token cost: 0 input · 0 output
|
||||
|
||||
## Graph Freshness
|
||||
- Built from commit: `35c65c92`
|
||||
- Run `git rev-parse HEAD` and compare to check if the graph is stale.
|
||||
- Run `graphify update .` after code changes (no API cost).
|
||||
|
||||
## Community Hubs (Navigation)
|
||||
- DB: 로그/모니터링 테이블
|
||||
- auth_rbac.md
|
||||
- workflow_state.md
|
||||
- 개념 (Concepts)
|
||||
- Wiki Log
|
||||
- ui_templates.md
|
||||
- A09_Security — Backend
|
||||
- A00_Common — App Shell Framework
|
||||
- UI Templates — Localization & Components
|
||||
- A04_NewsHistory — Frontend
|
||||
- A07_Register — Frontend
|
||||
- A08_Support — Backend
|
||||
- A08_Support — Frontend
|
||||
- B02_ProjRegister — Frontend
|
||||
- 인증 / RBAC
|
||||
- A01_Home — Frontend
|
||||
- A05_EduDetail — Frontend
|
||||
- A06_Login — Backend
|
||||
- A06_Login — Frontend
|
||||
- A09_Security — Frontend
|
||||
- B02_ProjRegister — Backend
|
||||
- Workflow 상태 관리 — 구현 완료 (실 DB 확인됨)
|
||||
- A03_CompDetail — Frontend
|
||||
- B04_wf1_Surface — Backend
|
||||
- DB: 경로/종횡단 테이블
|
||||
- A07_Register — Backend
|
||||
- B04_wf1_Surface — Frontend
|
||||
- B07_wf4_DesignDetail — Frontend
|
||||
- B09_wf6_Estimation — Frontend
|
||||
- B05_wf2_Route — Backend
|
||||
- A01_Home — 세부 구현
|
||||
- A02_ProgDetail — 세부 구현
|
||||
- A02_ProgDetail — Frontend
|
||||
- B05_wf2_Route — Frontend
|
||||
- B02_ProjRegister — DB
|
||||
- B04_wf1_Surface — DB
|
||||
- B04_wf1_Surface — Dependencies
|
||||
- B06_wf3_ProfileCross — Frontend
|
||||
- wiki/ 폴더 규칙
|
||||
- wiki/ 폴더 규칙
|
||||
- B04_wf1_Surface — API
|
||||
- B05_wf2_Route — DB 사용 관계
|
||||
- B06_wf3_ProfileCross — DB 사용 관계
|
||||
- B01_Dashboard — DB 사용 관계
|
||||
- B03_FileInput — DB 사용 관계
|
||||
- B08_wf5_Quantity — DB
|
||||
|
||||
## God Nodes (most connected - your core abstractions)
|
||||
1. `Wiki Log` - 33 edges
|
||||
2. `개념 (Concepts)` - 12 edges
|
||||
3. `DB: 로그/모니터링 테이블` - 11 edges
|
||||
4. `인증 / RBAC` - 10 edges
|
||||
5. `페이지 — 로그인 후 워크플로우 (B01~B09)` - 10 edges
|
||||
6. `페이지 — 로그인 전 (A01~A09)` - 10 edges
|
||||
7. `A07_Register — Frontend` - 10 edges
|
||||
8. `A08_Support — Backend` - 10 edges
|
||||
9. `A08_Support — Frontend` - 10 edges
|
||||
10. `B02_ProjRegister — Frontend` - 10 edges
|
||||
|
||||
## Surprising Connections (you probably didn't know these)
|
||||
- None detected - all connections are within the same source files.
|
||||
|
||||
## Communities (46 total, 3 thin omitted)
|
||||
|
||||
### Community 0 - "DB: 로그/모니터링 테이블"
|
||||
Cohesion: 0.05
|
||||
Nodes (38): DB: 파일/지표면분석 테이블, input_files.status 값, input_files (입력 원본 파일), processed_point_cloud (필터/변환 포인트클라우드), surface_models.status / processed_point_cloud.status 값, surface_models (지표면 모델 및 등고선), terrain_layers (지형 레이어), upload_chunks (업로드 청크 데이터) (+30 more)
|
||||
|
||||
### Community 1 - "auth_rbac.md"
|
||||
Cohesion: 0.05
|
||||
Nodes (33): API 공통 (여러 페이지가 공유하는 엔드포인트), 공통 오류 응답 포맷 (전 라우터), 워크플로우 상태 조회, 폴링 패턴 (legacy workflow.json 설계; 현재 구현은 workflow-state API 사용), companies (회사), DB: 사용자/인증/조직 테이블, email_otps (이메일 OTP), join_requests (회사 가입 신청) (+25 more)
|
||||
|
||||
### Community 2 - "workflow_state.md"
|
||||
Cohesion: 0.06
|
||||
Nodes (28): 공통 유틸 (common_util/), 리소스 모니터링 (common_util_resource_monitor.py), 이메일 발송 (common_util_email.py), 백엔드 (Python 3.12.7), 선정 원칙 (agent.md 3절), 외부 라이브러리 의존성, 프론트엔드 (TypeScript/Node.js), DB 컬럼 ↔ 실제 경로 매핑 (+20 more)
|
||||
|
||||
### Community 3 - "개념 (Concepts)"
|
||||
Cohesion: 0.06
|
||||
Nodes (35): [[a00_app_shell_framework]], [[a00_app_shell_framework_scaffold]], [[A01_Home/A01_frontend|A01_Home]], [[A02_ProgDetail/A02_frontend|A02_ProgDetail]], [[A03_CompDetail/A03_frontend|A03_CompDetail]], [[A04_NewsHistory/A04_frontend|A04_NewsHistory]], [[A05_EduDetail/A05_frontend|A05_EduDetail]], [[A06_Login/A06_backend|A06_Login]] (+27 more)
|
||||
|
||||
### Community 4 - "Wiki Log"
|
||||
Cohesion: 0.06
|
||||
Nodes (33): [2026-07-12] ingest | A01_Home 실 코드 반영, [2026-07-12] ingest | A02_ProgDetail + A00_Common Framework, [2026-07-12] ingest | A03_CompDetail, [2026-07-12] ingest | A04_NewsHistory, [2026-07-12] ingest | A05_EduDetail, [2026-07-12] ingest | A06_Login (backend + frontend 상세화), [2026-07-12] ingest | A07_Register (backend + frontend 상세화), [2026-07-12] ingest | A08_Support (backend + frontend 상세화) (+25 more)
|
||||
|
||||
### Community 5 - "ui_templates.md"
|
||||
Cohesion: 0.07
|
||||
Nodes (23): A00_Common — 스캐폴드·CSS·종속성, b_page_scaffold, CSS 인젝션, 사용처, 종속성, B01_Dashboard — Dependencies, 프로젝트 공통 모듈, B01_Dashboard — Frontend (+15 more)
|
||||
|
||||
### Community 6 - "A09_Security — Backend"
|
||||
Cohesion: 0.17
|
||||
Nodes (11): A09_Security — Backend, API 엔드포인트, DB 저장 (activity_logs), 권한 헬퍼, 마스터(회사 관리자) 전용 — `require_master`, 시스템 관리자 전용 — `require_system_admin`, 요청 스키마 (Pydantic), 의존성 (공통 유틸) (+3 more)
|
||||
|
||||
### Community 7 - "A00_Common — App Shell Framework"
|
||||
Cohesion: 0.18
|
||||
Nodes (11): A00_Common — App Shell Framework, app_shell 구성요소, router 라우팅 테이블, 로그아웃 (onApp_Logout_Click), 세부 스캐폴드·CSS·종속성, 인증 가드, 인증 버튼 (비동기 fillAuthActions), 테마 & 언어 관리 (+3 more)
|
||||
|
||||
### Community 8 - "UI Templates — Localization & Components"
|
||||
Cohesion: 0.18
|
||||
Nodes (11): theme.css (스타일 변수), ui_template_elements.ts (공통 컴포넌트), ui_template_locale.ts (다국어 관리), UI Templates — Localization & Components, 사용처 (역참조), 사용처 (역참조), 의존성, 제공 컴포넌트 (+3 more)
|
||||
|
||||
### Community 9 - "A04_NewsHistory — Frontend"
|
||||
Cohesion: 0.18
|
||||
Nodes (10): A04_NewsHistory — Frontend, CSS 클래스 구조, Mock 데이터 구조, 로컬라이제이션, 미해결 사항, 반응형, 스타일 (CSS), 의존성 (+2 more)
|
||||
|
||||
### Community 10 - "A07_Register — Frontend"
|
||||
Cohesion: 0.18
|
||||
Nodes (10): A07_Register — Frontend, API 클라이언트 함수, 로컬라이제이션, 스타일 (CSS), 약관 동의 (아코디언), 의존성, 이벤트 핸들러, 제출 로직 (2단계 폼 전환) (+2 more)
|
||||
|
||||
### Community 11 - "A08_Support — Backend"
|
||||
Cohesion: 0.18
|
||||
Nodes (10): A08_Support — Backend, API 엔드포인트, ⚠️ DB 스키마 불일치 (확인 필요), DB 저장 컬럼 (실 코드 INSERT 기준), 내부 헬퍼, 요청 스키마 (Pydantic), 의존성 (공통 유틸), 접수 로직 (+2 more)
|
||||
|
||||
### Community 12 - "A08_Support — Frontend"
|
||||
Cohesion: 0.18
|
||||
Nodes (10): A08_Support — Frontend, 로컬라이제이션, 세션 자동 채움, 스타일 (CSS), 의존성, 이벤트 핸들러, 제출 로직, 참고 (+2 more)
|
||||
|
||||
### Community 13 - "B02_ProjRegister — Frontend"
|
||||
Cohesion: 0.18
|
||||
Nodes (10): B02_ProjRegister — Frontend, 로컬라이제이션, 스타일 (CSS), 의존성, 이벤트 핸들러, 입력 필드, 제출 로직, 참고 (+2 more)
|
||||
|
||||
### Community 14 - "인증 / RBAC"
|
||||
Cohesion: 0.20
|
||||
Nodes (10): OTP / 비밀번호, ⚠️ 계획서-실코드 불일치 (A그룹 인제스트 발견), 권한 검증 헬퍼 (B01_Dashboard), 라우팅 가드 (frontend.md 5.2), 사용자 상태 생명주기, 사용처 (역참조), 세션 인증 (backend.md 6.3), 역할 (users.role) (+2 more)
|
||||
|
||||
### Community 15 - "A01_Home — Frontend"
|
||||
Cohesion: 0.20
|
||||
Nodes (9): A01_Home — Frontend, Hero 섹션, 로컬라이제이션, 세부 구현, 이벤트 핸들러, 주요 기능 섹션, 최신 소식 섹션, 컴포넌트 (+1 more)
|
||||
|
||||
### Community 16 - "A05_EduDetail — Frontend"
|
||||
Cohesion: 0.20
|
||||
Nodes (9): A05_EduDetail — Frontend, CSS 클래스 구조, 로컬라이제이션, 반응형, 스타일 (CSS), 의존성, 이벤트 핸들러, 컴포넌트 (섹션 빌더) (+1 more)
|
||||
|
||||
### Community 17 - "A06_Login — Backend"
|
||||
Cohesion: 0.20
|
||||
Nodes (9): A06_Login — Backend, API 엔드포인트, ⚠️ 계획서와 실 코드 불일치, 내부 헬퍼, 로그인 로직 흐름, 보안 정책 (실 코드 기준), 요청 스키마 (Pydantic), 의존성 (공통 유틸) (+1 more)
|
||||
|
||||
### Community 18 - "A06_Login — Frontend"
|
||||
Cohesion: 0.20
|
||||
Nodes (9): A06_Login — Frontend, API 클라이언트 함수, 로컬라이제이션, 스타일 (CSS), 의존성, 이벤트 핸들러, 제출 로직 (2단계 폼 전환), 컴포넌트 / 함수 (+1 more)
|
||||
|
||||
### Community 19 - "A09_Security — Frontend"
|
||||
Cohesion: 0.20
|
||||
Nodes (9): A09_Security — Frontend, API 클라이언트 함수 (⚠️ 미사용, 정의만), 로컬라이제이션, 스타일 (CSS), 약관 데이터 (A09_Security_Terms.ts), ⚠️ 약관 텍스트와 실 코드 불일치, 의존성, 컴포넌트 / 함수 (+1 more)
|
||||
|
||||
### Community 20 - "B02_ProjRegister — Backend"
|
||||
Cohesion: 0.20
|
||||
Nodes (9): API 엔드포인트, B02_ProjRegister — Backend, DB 저장 컬럼 (projects INSERT), 생성 로직 (create_project 트랜잭션), 요청/응답 스키마 (Pydantic), 의존성 (공통 유틸), 참고, 파일 구조 (+1 more)
|
||||
|
||||
### Community 21 - "Workflow 상태 관리 — 구현 완료 (실 DB 확인됨)"
|
||||
Cohesion: 0.22
|
||||
Nodes (9): B04 상태 조회 — 레거시 폴백 (당초 "잔재"로 표기했으나 정정), projects.status 문자열 캐시 (호환용, 계획서 방침대로 유지 중), SSOT: `project_workflow_stages` 테이블 (실 DB 확인), Workflow 상태 관리 — 구현 완료 (실 DB 확인됨), 공통 유틸 `common_util/common_util_workflow_state.py`, 미해결 사항 (계획서 원문, 아직 결정 안 됨), 상태 전이 (구현대로), 실 연동 현황 (파일:줄번호) (+1 more)
|
||||
|
||||
### Community 22 - "A03_CompDetail — Frontend"
|
||||
Cohesion: 0.22
|
||||
Nodes (8): A03_CompDetail — Frontend, CSS 클래스 구조, 로컬라이제이션, 반응형, 스타일 (CSS), 의존성, 컴포넌트 (섹션 빌더), 파일 구조
|
||||
|
||||
### Community 23 - "B04_wf1_Surface — Backend"
|
||||
Cohesion: 0.22
|
||||
Nodes (8): B04_wf1_Surface — Backend, ⚠️ 레거시 폴백 (416,420줄), 엔진 서브모듈, 워크플로우 상태 전이, 의존성, 주요 함수 (Router), 책임, 파일 구성 (오케스트레이터/저장소/라우터)
|
||||
|
||||
### Community 24 - "DB: 경로/종횡단 테이블"
|
||||
Cohesion: 0.25
|
||||
Nodes (8): cross_sections.data.structures, cross_sections (횡단면 설계), DB: 경로/종횡단 테이블, longitudinal_sections (종단면 설계), route_points (경로 좌표점), route_statistics (노선 통계), routes.status 흐름, routes (노선 경로)
|
||||
|
||||
### Community 25 - "A07_Register — Backend"
|
||||
Cohesion: 0.25
|
||||
Nodes (7): A07_Register — Backend, API 엔드포인트, 가입 로직 흐름, 요청 스키마 (Pydantic), 의존성 (공통 유틸), 참고, 파일 구조
|
||||
|
||||
### Community 26 - "B04_wf1_Surface — Frontend"
|
||||
Cohesion: 0.25
|
||||
Nodes (7): API 클라이언트 함수, B04_wf1_Surface — Frontend, ⚠️ 계획서와 실 코드 불일치 (3D 뷰어), 의존성, 처리 흐름, 컴포넌트 / 함수, 파일 구조
|
||||
|
||||
### Community 27 - "B07_wf4_DesignDetail — Frontend"
|
||||
Cohesion: 0.25
|
||||
Nodes (7): B07_wf4_DesignDetail — Frontend, 로컬라이제이션, 백엔드/DB — 미착수 (계획적 범위 제외), 의존성, 참고, 컴포넌트 / 함수, 파일 구조
|
||||
|
||||
### Community 28 - "B09_wf6_Estimation — Frontend"
|
||||
Cohesion: 0.25
|
||||
Nodes (7): B09_wf6_Estimation — Frontend, 로컬라이제이션, 백엔드/DB — 미착수, 의존성, 참고, 컴포넌트 / 함수, 파일 구조
|
||||
|
||||
### Community 29 - "B05_wf2_Route — Backend"
|
||||
Cohesion: 0.29
|
||||
Nodes (6): B05_wf2_Route — Backend, 경로 계산 엔진, 기술부채, 기하·결과 변환, 라우터·workflow, 요청·응답 모델
|
||||
|
||||
### Community 30 - "A01_Home — 세부 구현"
|
||||
Cohesion: 0.33
|
||||
Nodes (5): A01_Home — 세부 구현, 데이터 흐름, 미해결, 스타일, 의존성
|
||||
|
||||
### Community 31 - "A02_ProgDetail — 세부 구현"
|
||||
Cohesion: 0.33
|
||||
Nodes (5): A02_ProgDetail — 세부 구현, 데이터 흐름, 미해결 / 특이사항, 스타일 (CSS), 의존성
|
||||
|
||||
### Community 32 - "A02_ProgDetail — Frontend"
|
||||
Cohesion: 0.33
|
||||
Nodes (5): A02_ProgDetail — Frontend, 구조, 세부 구현, 제약 준수, 컴포넌트 분석
|
||||
|
||||
### Community 33 - "B05_wf2_Route — Frontend"
|
||||
Cohesion: 0.33
|
||||
Nodes (5): API 클라이언트, B05_wf2_Route — Frontend, 기술부채, 입력 그룹, 화면과 상호작용
|
||||
|
||||
### Community 34 - "B02_ProjRegister — DB"
|
||||
Cohesion: 0.40
|
||||
Nodes (4): B02_ProjRegister — DB, 쓰는 테이블, 저장소(파일시스템), 참고 (계획 당시 의도)
|
||||
|
||||
### Community 35 - "B04_wf1_Surface — DB"
|
||||
Cohesion: 0.40
|
||||
Nodes (4): B04_wf1_Surface — DB, Repository 함수, 쓰는 테이블, 참고
|
||||
|
||||
### Community 36 - "B04_wf1_Surface — Dependencies"
|
||||
Cohesion: 0.40
|
||||
Nodes (4): B04_wf1_Surface — Dependencies, ⚠️ dependencies concept 정정 필요, 백엔드 (Python), 프론트엔드 (TypeScript)
|
||||
|
||||
### Community 37 - "B06_wf3_ProfileCross — Frontend"
|
||||
Cohesion: 0.40
|
||||
Nodes (4): API 클라이언트, B06_wf3_ProfileCross — Frontend, 입력 옵션, 화면·workflow
|
||||
|
||||
### Community 38 - "wiki/ 폴더 규칙"
|
||||
Cohesion: 0.50
|
||||
Nodes (3): wiki/ 폴더 규칙, 구조, 작성 규칙
|
||||
|
||||
### Community 39 - "wiki/ 폴더 규칙"
|
||||
Cohesion: 0.50
|
||||
Nodes (3): wiki/ 폴더 규칙, 구조, 작성 규칙
|
||||
|
||||
### Community 40 - "B04_wf1_Surface — API"
|
||||
Cohesion: 0.50
|
||||
Nodes (3): B04_wf1_Surface — API, 엔드포인트, 요청/응답 스키마 (Pydantic)
|
||||
|
||||
### Community 41 - "B05_wf2_Route — DB 사용 관계"
|
||||
Cohesion: 0.50
|
||||
Nodes (3): B05_wf2_Route — DB 사용 관계, Repository 함수, 저장 경로
|
||||
|
||||
### Community 42 - "B06_wf3_ProfileCross — DB 사용 관계"
|
||||
Cohesion: 0.50
|
||||
Nodes (3): B06_wf3_ProfileCross — DB 사용 관계, Repository 함수, 파일 경로
|
||||
|
||||
## Knowledge Gaps
|
||||
- **379 isolated node(s):** `구조`, `작성 규칙`, `구조`, `작성 규칙`, `파일 구성` (+374 more)
|
||||
These have ≤1 connection - possible missing edges or undocumented components.
|
||||
- **3 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes.
|
||||
|
||||
## Suggested Questions
|
||||
_Questions this graph is uniquely positioned to answer:_
|
||||
|
||||
- **Why does `UI Templates — Localization & Components` connect `UI Templates — Localization & Components` to `ui_templates.md`?**
|
||||
_High betweenness centrality (0.015) - this node is a cross-community bridge._
|
||||
- **Why does `A00_Common — App Shell Framework` connect `A00_Common — App Shell Framework` to `ui_templates.md`?**
|
||||
_High betweenness centrality (0.014) - this node is a cross-community bridge._
|
||||
- **What connects `구조`, `작성 규칙`, `구조` to the rest of the system?**
|
||||
_379 weakly-connected nodes found - possible documentation gaps or missing edges._
|
||||
- **Should `DB: 로그/모니터링 테이블` be split into smaller, more focused modules?**
|
||||
_Cohesion score 0.045454545454545456 - nodes in this community are weakly interconnected._
|
||||
- **Should `auth_rbac.md` be split into smaller, more focused modules?**
|
||||
_Cohesion score 0.05110336817653891 - nodes in this community are weakly interconnected._
|
||||
- **Should `workflow_state.md` be split into smaller, more focused modules?**
|
||||
_Cohesion score 0.06156156156156156 - nodes in this community are weakly interconnected._
|
||||
- **Should `개념 (Concepts)` be split into smaller, more focused modules?**
|
||||
_Cohesion score 0.05555555555555555 - nodes in this community are weakly interconnected._
|
||||
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_db_md", "label": "B03_db.md", "file_type": "document", "source_file": "pages/B03_FileInput/B03_db.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_db_b03_fileinput_db_\uc0ac\uc6a9_\uad00\uacc4", "label": "B03_FileInput \u2014 DB \uc0ac\uc6a9 \uad00\uacc4", "file_type": "document", "source_file": "pages/B03_FileInput/B03_db.md", "source_location": "L10"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_db_\ud30c\uc77c_\uacbd\ub85c", "label": "\ud30c\uc77c \uacbd\ub85c", "file_type": "document", "source_file": "pages/B03_FileInput/B03_db.md", "source_location": "L22"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_db_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_fileinput_b03_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B03_FileInput/B03_db.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_db_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_fileinput_b03_api_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B03_FileInput/B03_db.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_db_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_db_b03_fileinput_db_\uc0ac\uc6a9_\uad00\uacc4", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B03_FileInput/B03_db.md", "source_location": "L10", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_db_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_db_schema_files_surface_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B03_FileInput/B03_db.md", "source_location": "L12", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_db_b03_fileinput_db_\uc0ac\uc6a9_\uad00\uacc4", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_db_\ud30c\uc77c_\uacbd\ub85c", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B03_FileInput/B03_db.md", "source_location": "L22", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_db_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_storage_paths_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B03_FileInput/B03_db.md", "source_location": "L29", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0}
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_unconfirmed_readme_md", "label": "README.md", "file_type": "document", "source_file": "concepts/db_schema/unconfirmed/README.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_unconfirmed_readme_\ubbf8\ud655\uc815_\ud14c\uc774\ube14_\ubcf4\uad00\uc18c_unconfirmed_db_schemas", "label": "\ubbf8\ud655\uc815 \ud14c\uc774\ube14 \ubcf4\uad00\uc18c (Unconfirmed DB Schemas)", "file_type": "document", "source_file": "concepts/db_schema/unconfirmed/README.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_unconfirmed_readme_\uc6b4\uc601_\uaddc\uce59", "label": "\uc6b4\uc601 \uaddc\uce59", "file_type": "document", "source_file": "concepts/db_schema/unconfirmed/README.md", "source_location": "L5"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_unconfirmed_readme_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_unconfirmed_readme_\ubbf8\ud655\uc815_\ud14c\uc774\ube14_\ubcf4\uad00\uc18c_unconfirmed_db_schemas", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/unconfirmed/README.md", "source_location": "L1", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_unconfirmed_readme_\ubbf8\ud655\uc815_\ud14c\uc774\ube14_\ubcf4\uad00\uc18c_unconfirmed_db_schemas", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_db_schema_unconfirmed_readme_\uc6b4\uc601_\uaddc\uce59", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/db_schema/unconfirmed/README.md", "source_location": "L5", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0}
|
||||
+1
File diff suppressed because one or more lines are too long
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_dependencies_md", "label": "B06_dependencies.md", "file_type": "document", "source_file": "pages/B06_wf3_ProfileCross/B06_dependencies.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_dependencies_b06_wf3_profilecross_dependencies", "label": "B06_wf3_ProfileCross \u2014 Dependencies", "file_type": "document", "source_file": "pages/B06_wf3_ProfileCross/B06_dependencies.md", "source_location": "L10"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_dependencies_\uacf5\ud1b5_\ubaa8\ub4c8", "label": "\uacf5\ud1b5 \ubaa8\ub4c8", "file_type": "document", "source_file": "pages/B06_wf3_ProfileCross/B06_dependencies.md", "source_location": "L22"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_dependencies_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_wf3_profilecross_b06_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B06_wf3_ProfileCross/B06_dependencies.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_dependencies_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_wf3_profilecross_b06_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B06_wf3_ProfileCross/B06_dependencies.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_dependencies_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_dependencies_b06_wf3_profilecross_dependencies", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B06_wf3_ProfileCross/B06_dependencies.md", "source_location": "L10", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_dependencies_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_dependencies_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B06_wf3_ProfileCross/B06_dependencies.md", "source_location": "L12", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_dependencies_b06_wf3_profilecross_dependencies", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_dependencies_\uacf5\ud1b5_\ubaa8\ub4c8", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B06_wf3_ProfileCross/B06_dependencies.md", "source_location": "L22", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_dependencies_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_workflow_state_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B06_wf3_ProfileCross/B06_dependencies.md", "source_location": "L25", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_dependencies_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_storage_paths_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B06_wf3_ProfileCross/B06_dependencies.md", "source_location": "L26", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0}
|
||||
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_db_md", "label": "B05_db.md", "file_type": "document", "source_file": "pages/B05_wf2_Route/B05_db.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_db_b05_wf2_route_db_\uc0ac\uc6a9_\uad00\uacc4", "label": "B05_wf2_Route \u2014 DB \uc0ac\uc6a9 \uad00\uacc4", "file_type": "document", "source_file": "pages/B05_wf2_Route/B05_db.md", "source_location": "L10"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_db_repository_\ud568\uc218", "label": "Repository \ud568\uc218", "file_type": "document", "source_file": "pages/B05_wf2_Route/B05_db.md", "source_location": "L20"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_db_\uc800\uc7a5_\uacbd\ub85c", "label": "\uc800\uc7a5 \uacbd\ub85c", "file_type": "document", "source_file": "pages/B05_wf2_Route/B05_db.md", "source_location": "L30"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_db_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_wf2_route_b05_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B05_wf2_Route/B05_db.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_db_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_wf2_route_b05_api_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B05_wf2_Route/B05_db.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_db_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_db_b05_wf2_route_db_\uc0ac\uc6a9_\uad00\uacc4", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B05_wf2_Route/B05_db.md", "source_location": "L10", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_db_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_db_schema_route_profile_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B05_wf2_Route/B05_db.md", "source_location": "L12", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_db_b05_wf2_route_db_\uc0ac\uc6a9_\uad00\uacc4", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_db_repository_\ud568\uc218", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B05_wf2_Route/B05_db.md", "source_location": "L20", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_db_b05_wf2_route_db_\uc0ac\uc6a9_\uad00\uacc4", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_db_\uc800\uc7a5_\uacbd\ub85c", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B05_wf2_Route/B05_db.md", "source_location": "L30", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_db_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_storage_paths_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B05_wf2_Route/B05_db.md", "source_location": "L36", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0}
|
||||
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b08_wf5_quantity_b08_db_md", "label": "B08_db.md", "file_type": "document", "source_file": "pages/B08_wf5_Quantity/B08_db.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b08_wf5_quantity_b08_db_b08_wf5_quantity_db", "label": "B08_wf5_Quantity \u2014 DB", "file_type": "document", "source_file": "pages/B08_wf5_Quantity/B08_db.md", "source_location": "L10"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b08_wf5_quantity_b08_db_\uad6c\ud604_\ub300\uae30_\ud56d\ubaa9", "label": "\uad6c\ud604 \ub300\uae30 \ud56d\ubaa9", "file_type": "document", "source_file": "pages/B08_wf5_Quantity/B08_db.md", "source_location": "L19"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b08_wf5_quantity_b08_db_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b08_wf5_quantity_b08_wf5_quantity_b08_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B08_wf5_Quantity/B08_db.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b08_wf5_quantity_b08_db_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b08_wf5_quantity_b08_db_b08_wf5_quantity_db", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B08_wf5_Quantity/B08_db.md", "source_location": "L10", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b08_wf5_quantity_b08_db_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b08_wf5_quantity_db_schema_structure_output_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B08_wf5_Quantity/B08_db.md", "source_location": "L16", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b08_wf5_quantity_b08_db_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b08_wf5_quantity_db_schema_overview_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B08_wf5_Quantity/B08_db.md", "source_location": "L17", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b08_wf5_quantity_b08_db_b08_wf5_quantity_db", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b08_wf5_quantity_b08_db_\uad6c\ud604_\ub300\uae30_\ud56d\ubaa9", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B08_wf5_Quantity/B08_db.md", "source_location": "L19", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b08_wf5_quantity_b08_db_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b08_wf5_quantity_storage_paths_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B08_wf5_Quantity/B08_db.md", "source_location": "L29", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0}
|
||||
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_api_md", "label": "B06_api.md", "file_type": "document", "source_file": "pages/B06_wf3_ProfileCross/B06_api.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_api_b06_wf3_profilecross_api", "label": "B06_wf3_ProfileCross \u2014 API", "file_type": "document", "source_file": "pages/B06_wf3_ProfileCross/B06_api.md", "source_location": "L10"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_api_\uc0dd\uc131_\uc751\ub2f5", "label": "\uc0dd\uc131 \uc751\ub2f5", "file_type": "document", "source_file": "pages/B06_wf3_ProfileCross/B06_api.md", "source_location": "L20"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_api_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_wf3_profilecross_b06_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B06_wf3_ProfileCross/B06_api.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_api_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_wf3_profilecross_b06_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B06_wf3_ProfileCross/B06_api.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_api_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_wf3_profilecross_b06_db_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B06_wf3_ProfileCross/B06_api.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_api_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_api_b06_wf3_profilecross_api", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B06_wf3_ProfileCross/B06_api.md", "source_location": "L10", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_api_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_auth_rbac_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B06_wf3_ProfileCross/B06_api.md", "source_location": "L12", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_api_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_api_common_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B06_wf3_ProfileCross/B06_api.md", "source_location": "L12", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_api_b06_wf3_profilecross_api", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b06_wf3_profilecross_b06_api_\uc0dd\uc131_\uc751\ub2f5", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B06_wf3_ProfileCross/B06_api.md", "source_location": "L20", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0}
|
||||
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_agents_md", "label": "AGENTS.md", "file_type": "document", "source_file": "AGENTS.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_agents_wiki_\ud3f4\ub354_\uaddc\uce59", "label": "wiki/ \ud3f4\ub354 \uaddc\uce59", "file_type": "document", "source_file": "AGENTS.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_agents_\uad6c\uc870", "label": "\uad6c\uc870", "file_type": "document", "source_file": "AGENTS.md", "source_location": "L5"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_agents_\uc791\uc131_\uaddc\uce59", "label": "\uc791\uc131 \uaddc\uce59", "file_type": "document", "source_file": "AGENTS.md", "source_location": "L11"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_agents_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_agents_wiki_\ud3f4\ub354_\uaddc\uce59", "relation": "contains", "confidence": "EXTRACTED", "source_file": "AGENTS.md", "source_location": "L1", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_agents_wiki_\ud3f4\ub354_\uaddc\uce59", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_agents_\uad6c\uc870", "relation": "contains", "confidence": "EXTRACTED", "source_file": "AGENTS.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_agents_wiki_\ud3f4\ub354_\uaddc\uce59", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_agents_\uc791\uc131_\uaddc\uce59", "relation": "contains", "confidence": "EXTRACTED", "source_file": "AGENTS.md", "source_location": "L11", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_agents_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_\ud398\uc774\uc9c0\uba85_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "AGENTS.md", "source_location": "L14", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0}
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_claude_md", "label": "CLAUDE.md", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_claude_wiki_\ud3f4\ub354_\uaddc\uce59", "label": "wiki/ \ud3f4\ub354 \uaddc\uce59", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_claude_\uad6c\uc870", "label": "\uad6c\uc870", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "L5"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_claude_\uc791\uc131_\uaddc\uce59", "label": "\uc791\uc131 \uaddc\uce59", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "L11"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_claude_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_claude_wiki_\ud3f4\ub354_\uaddc\uce59", "relation": "contains", "confidence": "EXTRACTED", "source_file": "CLAUDE.md", "source_location": "L1", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_claude_wiki_\ud3f4\ub354_\uaddc\uce59", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_claude_\uad6c\uc870", "relation": "contains", "confidence": "EXTRACTED", "source_file": "CLAUDE.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_claude_wiki_\ud3f4\ub354_\uaddc\uce59", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_claude_\uc791\uc131_\uaddc\uce59", "relation": "contains", "confidence": "EXTRACTED", "source_file": "CLAUDE.md", "source_location": "L11", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_claude_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_\ud398\uc774\uc9c0\uba85_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "CLAUDE.md", "source_location": "L14", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0}
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_schema_common_md", "label": "schema_common.md", "file_type": "document", "source_file": "concepts/schema_common.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_schema_common_\uacf5\ud1b5_\uc2a4\ud0a4\ub9c8_pydantic_\uc694\uccad_\uc751\ub2f5_\uaddc\uce59", "label": "\uacf5\ud1b5 \uc2a4\ud0a4\ub9c8 (Pydantic \uc694\uccad/\uc751\ub2f5 \uaddc\uce59)", "file_type": "document", "source_file": "concepts/schema_common.md", "source_location": "L9"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_schema_common_\uac80\uc99d_\uc6d0\uce59_backend_md_4\uc808", "label": "\uac80\uc99d \uc6d0\uce59 (backend.md 4\uc808)", "file_type": "document", "source_file": "concepts/schema_common.md", "source_location": "L11"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_schema_common_\uba85\uba85_\uaddc\uce59", "label": "\uba85\uba85 \uaddc\uce59", "file_type": "document", "source_file": "concepts/schema_common.md", "source_location": "L16"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_schema_common_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_schema_common_\uacf5\ud1b5_\uc2a4\ud0a4\ub9c8_pydantic_\uc694\uccad_\uc751\ub2f5_\uaddc\uce59", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/schema_common.md", "source_location": "L9", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_schema_common_\uacf5\ud1b5_\uc2a4\ud0a4\ub9c8_pydantic_\uc694\uccad_\uc751\ub2f5_\uaddc\uce59", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_schema_common_\uac80\uc99d_\uc6d0\uce59_backend_md_4\uc808", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/schema_common.md", "source_location": "L11", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_schema_common_\uacf5\ud1b5_\uc2a4\ud0a4\ub9c8_pydantic_\uc694\uccad_\uc751\ub2f5_\uaddc\uce59", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_schema_common_\uba85\uba85_\uaddc\uce59", "relation": "contains", "confidence": "EXTRACTED", "source_file": "concepts/schema_common.md", "source_location": "L16", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0}
|
||||
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_dependencies_md", "label": "B03_dependencies.md", "file_type": "document", "source_file": "pages/B03_FileInput/B03_dependencies.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_dependencies_b03_fileinput_dependencies", "label": "B03_FileInput \u2014 Dependencies", "file_type": "document", "source_file": "pages/B03_FileInput/B03_dependencies.md", "source_location": "L10"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_dependencies_\uacf5\ud1b5_\ubaa8\ub4c8", "label": "\uacf5\ud1b5 \ubaa8\ub4c8", "file_type": "document", "source_file": "pages/B03_FileInput/B03_dependencies.md", "source_location": "L24"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_dependencies_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_fileinput_b03_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B03_FileInput/B03_dependencies.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_dependencies_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_fileinput_b03_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B03_FileInput/B03_dependencies.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_dependencies_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_dependencies_b03_fileinput_dependencies", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B03_FileInput/B03_dependencies.md", "source_location": "L10", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_dependencies_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_dependencies_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B03_FileInput/B03_dependencies.md", "source_location": "L12", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_dependencies_b03_fileinput_dependencies", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_dependencies_\uacf5\ud1b5_\ubaa8\ub4c8", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B03_FileInput/B03_dependencies.md", "source_location": "L24", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_dependencies_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_storage_paths_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B03_FileInput/B03_dependencies.md", "source_location": "L27", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b03_fileinput_b03_dependencies_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_workflow_state_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B03_FileInput/B03_dependencies.md", "source_location": "L28", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0}
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_dependencies_md", "label": "B05_dependencies.md", "file_type": "document", "source_file": "pages/B05_wf2_Route/B05_dependencies.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_dependencies_b05_wf2_route_dependencies", "label": "B05_wf2_Route \u2014 Dependencies", "file_type": "document", "source_file": "pages/B05_wf2_Route/B05_dependencies.md", "source_location": "L10"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_dependencies_\ud398\uc774\uc9c0_\ud30c\uc77c\ubcc4_\uc5f0\uacb0", "label": "\ud398\uc774\uc9c0 \ud30c\uc77c\ubcc4 \uc5f0\uacb0", "file_type": "document", "source_file": "pages/B05_wf2_Route/B05_dependencies.md", "source_location": "L23"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_dependencies_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_wf2_route_b05_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B05_wf2_Route/B05_dependencies.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_dependencies_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_wf2_route_b05_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B05_wf2_Route/B05_dependencies.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_dependencies_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_dependencies_b05_wf2_route_dependencies", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B05_wf2_Route/B05_dependencies.md", "source_location": "L10", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_dependencies_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_dependencies_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B05_wf2_Route/B05_dependencies.md", "source_location": "L12", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_dependencies_b05_wf2_route_dependencies", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_dependencies_\ud398\uc774\uc9c0_\ud30c\uc77c\ubcc4_\uc5f0\uacb0", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B05_wf2_Route/B05_dependencies.md", "source_location": "L23", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0}
|
||||
+1
File diff suppressed because one or more lines are too long
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_dependencies_md", "label": "B01_dependencies.md", "file_type": "document", "source_file": "pages/B01_Dashboard/B01_dependencies.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_dependencies_b01_dashboard_dependencies", "label": "B01_Dashboard \u2014 Dependencies", "file_type": "document", "source_file": "pages/B01_Dashboard/B01_dependencies.md", "source_location": "L10"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_dependencies_\ud504\ub85c\uc81d\ud2b8_\uacf5\ud1b5_\ubaa8\ub4c8", "label": "\ud504\ub85c\uc81d\ud2b8 \uacf5\ud1b5 \ubaa8\ub4c8", "file_type": "document", "source_file": "pages/B01_Dashboard/B01_dependencies.md", "source_location": "L23"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_dependencies_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_dashboard_b01_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B01_Dashboard/B01_dependencies.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_dependencies_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_dashboard_b01_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B01_Dashboard/B01_dependencies.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_dependencies_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_dependencies_b01_dashboard_dependencies", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B01_Dashboard/B01_dependencies.md", "source_location": "L10", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_dependencies_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_dependencies_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B01_Dashboard/B01_dependencies.md", "source_location": "L12", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_dependencies_b01_dashboard_dependencies", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_dependencies_\ud504\ub85c\uc81d\ud2b8_\uacf5\ud1b5_\ubaa8\ub4c8", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B01_Dashboard/B01_dependencies.md", "source_location": "L23", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_dependencies_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_auth_rbac_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B01_Dashboard/B01_dependencies.md", "source_location": "L26", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b01_dashboard_b01_dependencies_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_ui_templates_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B01_Dashboard/B01_dependencies.md", "source_location": "L28", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0}
|
||||
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_api_md", "label": "B05_api.md", "file_type": "document", "source_file": "pages/B05_wf2_Route/B05_api.md", "source_location": "L1"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_api_b05_wf2_route_api", "label": "B05_wf2_Route \u2014 API", "file_type": "document", "source_file": "pages/B05_wf2_Route/B05_api.md", "source_location": "L10"}, {"id": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_api_solve_\ucc98\ub9ac_\uacb0\uacfc", "label": "solve \ucc98\ub9ac \uacb0\uacfc", "file_type": "document", "source_file": "pages/B05_wf2_Route/B05_api.md", "source_location": "L19"}], "edges": [{"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_api_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_wf2_route_b05_frontend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B05_wf2_Route/B05_api.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_api_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_wf2_route_b05_backend_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B05_wf2_Route/B05_api.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_api_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_wf2_route_b05_db_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B05_wf2_Route/B05_api.md", "source_location": "L5", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_api_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_api_b05_wf2_route_api", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B05_wf2_Route/B05_api.md", "source_location": "L10", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_api_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_auth_rbac_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B05_wf2_Route/B05_api.md", "source_location": "L12", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_api_md", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_concepts_api_common_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "pages/B05_wf2_Route/B05_api.md", "source_location": "L12", "weight": 1.0}, {"source": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_api_b05_wf2_route_api", "target": "c_program_coding_\uc784\ub3c4\uc124\uacc4_\ubc0f_\uacac\uc801\uc790\ub3d9\ud654_\ud504\ub85c\uadf8\ub7a8_\uac1c\ubc1c_docs_wiki_pages_b05_wf2_route_b05_api_solve_\ucc98\ub9ac_\uacb0\uacfc", "relation": "contains", "confidence": "EXTRACTED", "source_file": "pages/B05_wf2_Route/B05_api.md", "source_location": "L19", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0}
|
||||
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,347 @@
|
||||
{
|
||||
"AGENTS.md": {
|
||||
"mtime": 1783834983.0604684,
|
||||
"ast_hash": "74d04caee1f70d588da20af0f2224049",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"CLAUDE.md": {
|
||||
"mtime": 1783834983.0604684,
|
||||
"ast_hash": "74d04caee1f70d588da20af0f2224049",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"concepts/a00_app_shell_framework.md": {
|
||||
"mtime": 1783850530.4141161,
|
||||
"ast_hash": "2b483a655d0638849d9dc1ffaa38a503",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"concepts/a00_app_shell_framework_scaffold.md": {
|
||||
"mtime": 1783844389.0126913,
|
||||
"ast_hash": "b08d53673fa62ab2ae17105341f6beda",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"concepts/api_common.md": {
|
||||
"mtime": 1783849575.5855756,
|
||||
"ast_hash": "aa36d7b826c4ac0349cd64a64cde5fe4",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"concepts/auth_rbac.md": {
|
||||
"mtime": 1783849578.4673145,
|
||||
"ast_hash": "983376ddb2dcd996849889557b1e5227",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"concepts/common_util.md": {
|
||||
"mtime": 1783849579.2001753,
|
||||
"ast_hash": "adb12874ce5f40560652367b5f7a4bca",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"concepts/db_schema/files_surface.md": {
|
||||
"mtime": 1783850268.5917373,
|
||||
"ast_hash": "37c2c7e2ce683232b6282ad89e7508a1",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"concepts/db_schema/logs_monitoring.md": {
|
||||
"mtime": 1783850257.6422136,
|
||||
"ast_hash": "6eb1d0c95d17cd7309774022f623f0d6",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"concepts/db_schema/overview.md": {
|
||||
"mtime": 1783850340.5808604,
|
||||
"ast_hash": "86819ed4c2c6a755995116d5ebf1060a",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"concepts/db_schema/projects.md": {
|
||||
"mtime": 1783850262.5202365,
|
||||
"ast_hash": "dc10c1ca8cc8f763ac27fe02f4976b2b",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"concepts/db_schema/route_profile.md": {
|
||||
"mtime": 1783850288.182818,
|
||||
"ast_hash": "f41fdfb63f39e23eb591fc1939be6c65",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"concepts/db_schema/structure_output.md": {
|
||||
"mtime": 1783850297.4292428,
|
||||
"ast_hash": "ada0d9e74f91349f05a8ab1ac3231c47",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"concepts/db_schema/unconfirmed/README.md": {
|
||||
"mtime": 1783850335.0813339,
|
||||
"ast_hash": "70f32d481aeff62e260e1da78aae10bd",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"concepts/db_schema/users_auth.md": {
|
||||
"mtime": 1783850220.2711427,
|
||||
"ast_hash": "b39a4cae8f120944d31fb846b9c5168e",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"concepts/dependencies.md": {
|
||||
"mtime": 1783850549.5115643,
|
||||
"ast_hash": "93732554454116e3543ac2269b9d1f0d",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"concepts/schema_common.md": {
|
||||
"mtime": 1783844389.0166397,
|
||||
"ast_hash": "ebde162a912c33c17bd42e3edb469bc6",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"concepts/storage_paths.md": {
|
||||
"mtime": 1783850555.214286,
|
||||
"ast_hash": "2cf2c535406b15d5f2d7d5cde19fd4d2",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"concepts/ui_templates.md": {
|
||||
"mtime": 1783850532.4820366,
|
||||
"ast_hash": "29502f868494fc7a1e939c10bdd4f3e7",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"concepts/workflow_state.md": {
|
||||
"mtime": 1783850560.3326466,
|
||||
"ast_hash": "9a9e0acbd12fe065527f14205b576e71",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"index.md": {
|
||||
"mtime": 1783850468.5420854,
|
||||
"ast_hash": "171ed6c7eb37313803b566c33219e3b5",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"log.md": {
|
||||
"mtime": 1783850724.1888082,
|
||||
"ast_hash": "da1581ecf1d8cfed560bf8222b53aac7",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"pages/A01_Home/A01_components.md": {
|
||||
"mtime": 1783849656.6167772,
|
||||
"ast_hash": "af5724435a2da0845f42aed322971f7a",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"pages/A01_Home/A01_frontend.md": {
|
||||
"mtime": 1783849659.8280177,
|
||||
"ast_hash": "59d5bcdf4d88a0e576c55c5752579a23",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"pages/A02_ProgDetail/A02_components.md": {
|
||||
"mtime": 1783849775.26568,
|
||||
"ast_hash": "d663c36e0202f099a2602d631c2f962d",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"pages/A02_ProgDetail/A02_frontend.md": {
|
||||
"mtime": 1783849775.2666833,
|
||||
"ast_hash": "b590aa6c5a13b2478592e23803f5398d",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"pages/A03_CompDetail/A03_frontend.md": {
|
||||
"mtime": 1783844088.3028529,
|
||||
"ast_hash": "833dd9355fb96b46b0f94271a642c216",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"pages/A04_NewsHistory/A04_frontend.md": {
|
||||
"mtime": 1783844098.3258784,
|
||||
"ast_hash": "5bb83dca8f9f11f0122f5911b295e279",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"pages/A05_EduDetail/A05_frontend.md": {
|
||||
"mtime": 1783844108.812845,
|
||||
"ast_hash": "fadf785b9ebad689862cb8cfa9827fbd",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"pages/A06_Login/A06_backend.md": {
|
||||
"mtime": 1783849775.2687664,
|
||||
"ast_hash": "6de8c206c28526ccc8bbb8eff5654919",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"pages/A06_Login/A06_frontend.md": {
|
||||
"mtime": 1783849775.2687664,
|
||||
"ast_hash": "5d0213c68346d896fe9d11cd841331ad",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"pages/A07_Register/A07_backend.md": {
|
||||
"mtime": 1783849775.2697725,
|
||||
"ast_hash": "66f37d5bece9abdffd3149441e9b0b0d",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"pages/A07_Register/A07_frontend.md": {
|
||||
"mtime": 1783849775.2707722,
|
||||
"ast_hash": "0c30b980601414cefa02c05ba50a9008",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"pages/A08_Support/A08_backend.md": {
|
||||
"mtime": 1783849900.5895991,
|
||||
"ast_hash": "d2dd1028a837d8c17429179c4ffd7135",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"pages/A08_Support/A08_frontend.md": {
|
||||
"mtime": 1783849775.2730606,
|
||||
"ast_hash": "f2ebae60bb02320db4ac39e0a66b9d69",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"pages/A09_Security/A09_backend.md": {
|
||||
"mtime": 1783849775.2740672,
|
||||
"ast_hash": "f96ba36247f269672317bc352c705a7c",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"pages/A09_Security/A09_frontend.md": {
|
||||
"mtime": 1783849775.2750769,
|
||||
"ast_hash": "d90b0617abec1376bd32e140b0eb1f63",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"pages/B01_Dashboard/B01_api.md": {
|
||||
"mtime": 1783849775.2770772,
|
||||
"ast_hash": "c85334659f25daeed71aefa2f2be9ad0",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"pages/B01_Dashboard/B01_backend.md": {
|
||||
"mtime": 1783849775.278077,
|
||||
"ast_hash": "631e1b564272bebd703c0e66f4fc7128",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"pages/B01_Dashboard/B01_db.md": {
|
||||
"mtime": 1783850631.766598,
|
||||
"ast_hash": "e7467e7ab25de8a576244c8595fefca4",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"pages/B01_Dashboard/B01_dependencies.md": {
|
||||
"mtime": 1783849775.2801342,
|
||||
"ast_hash": "0879a678987bb76f3fbe44e55ee8758d",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"pages/B01_Dashboard/B01_frontend.md": {
|
||||
"mtime": 1783849775.2801342,
|
||||
"ast_hash": "4fe7a90bb05a32a5103cf66156a9c061",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"pages/B02_ProjRegister/B02_backend.md": {
|
||||
"mtime": 1783849775.282399,
|
||||
"ast_hash": "304aee3205bcef9a2314c7d882bd84ea",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"pages/B02_ProjRegister/B02_db.md": {
|
||||
"mtime": 1783849775.282399,
|
||||
"ast_hash": "ca17bc76462201e2ce50e754fbe7c816",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"pages/B02_ProjRegister/B02_frontend.md": {
|
||||
"mtime": 1783849775.2833989,
|
||||
"ast_hash": "407638de4f1ed56a3ba72c5c244d8ebd",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"pages/B03_FileInput/B03_api.md": {
|
||||
"mtime": 1783849775.2843988,
|
||||
"ast_hash": "eac552bd29adfc99ec5d2f0537d04d7e",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"pages/B03_FileInput/B03_backend.md": {
|
||||
"mtime": 1783849775.285399,
|
||||
"ast_hash": "176914d9912ba95b21320010552cd774",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"pages/B03_FileInput/B03_db.md": {
|
||||
"mtime": 1783850637.4484162,
|
||||
"ast_hash": "229bc7bb89bc7fb3a745fa7a1eb56640",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"pages/B03_FileInput/B03_dependencies.md": {
|
||||
"mtime": 1783849775.2873988,
|
||||
"ast_hash": "c3ce15681add07e1475a7e7743daf4e5",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"pages/B03_FileInput/B03_frontend.md": {
|
||||
"mtime": 1783849775.2873988,
|
||||
"ast_hash": "73828382a294172dadee59925d56414e",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"pages/B04_wf1_Surface/B04_api.md": {
|
||||
"mtime": 1783849775.2910345,
|
||||
"ast_hash": "98dc9571c054a9cc67f41e34c924afc4",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"pages/B04_wf1_Surface/B04_backend.md": {
|
||||
"mtime": 1783849775.2921586,
|
||||
"ast_hash": "0c5544f6648212b90660aa84f35982ba",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"pages/B04_wf1_Surface/B04_db.md": {
|
||||
"mtime": 1783849775.292957,
|
||||
"ast_hash": "7cb52c0844a907b14cfbd5230988c56f",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"pages/B04_wf1_Surface/B04_dependencies.md": {
|
||||
"mtime": 1783849775.292957,
|
||||
"ast_hash": "15bd0faa0411264c14b0bbd89f7afd46",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"pages/B04_wf1_Surface/B04_frontend.md": {
|
||||
"mtime": 1783849775.2939596,
|
||||
"ast_hash": "5735fc2ab57c3965dcf50149b078fc93",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"pages/B05_wf2_Route/B05_api.md": {
|
||||
"mtime": 1783849775.2954652,
|
||||
"ast_hash": "cc425874ae9a2ba7b8662af87848fa0d",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"pages/B05_wf2_Route/B05_backend.md": {
|
||||
"mtime": 1783849775.2954652,
|
||||
"ast_hash": "479b21cd1dc68e2ac4d6435b1007b3e8",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"pages/B05_wf2_Route/B05_db.md": {
|
||||
"mtime": 1783850658.4844005,
|
||||
"ast_hash": "c45788b5db47a7a4f246b0714a2c11e3",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"pages/B05_wf2_Route/B05_dependencies.md": {
|
||||
"mtime": 1783849775.2981665,
|
||||
"ast_hash": "d3295d11d6138324e91df459abda944a",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"pages/B05_wf2_Route/B05_frontend.md": {
|
||||
"mtime": 1783849775.2981665,
|
||||
"ast_hash": "3a5bba842808d5a7a935882514495311",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"pages/B06_wf3_ProfileCross/B06_api.md": {
|
||||
"mtime": 1783849775.2991662,
|
||||
"ast_hash": "00f3238df70ac4098b1a62d7a175e676",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"pages/B06_wf3_ProfileCross/B06_backend.md": {
|
||||
"mtime": 1783849775.3001661,
|
||||
"ast_hash": "715cfd2ee8f7384c849e23331d9d5ae6",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"pages/B06_wf3_ProfileCross/B06_db.md": {
|
||||
"mtime": 1783850703.1234853,
|
||||
"ast_hash": "63b1c8f0287b4b277633da8c4617b03f",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"pages/B06_wf3_ProfileCross/B06_dependencies.md": {
|
||||
"mtime": 1783849775.301572,
|
||||
"ast_hash": "cee07700e4614c067726375a385800c3",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"pages/B06_wf3_ProfileCross/B06_frontend.md": {
|
||||
"mtime": 1783849775.3020935,
|
||||
"ast_hash": "98cdce5d523d5750350c1c8eeb41ae8e",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"pages/B07_wf4_DesignDetail/B07_frontend.md": {
|
||||
"mtime": 1783844389.053691,
|
||||
"ast_hash": "d4bd4b2f000f33a76bfd5d2f9b1a2850",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"pages/B08_wf5_Quantity/B08_db.md": {
|
||||
"mtime": 1783850708.284249,
|
||||
"ast_hash": "00ca815731f29da6f062f6e5884430de",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"pages/B08_wf5_Quantity/B08_frontend.md": {
|
||||
"mtime": 1783849775.303746,
|
||||
"ast_hash": "4d4395611445c4e93de165cc343df7af",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"pages/B09_wf6_Estimation/B09_frontend.md": {
|
||||
"mtime": 1783844389.0574813,
|
||||
"ast_hash": "c17bf17a317f2190131be87d2e23e9bb",
|
||||
"semantic_hash": ""
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,119 @@
|
||||
---
|
||||
type: index
|
||||
last_updated: 2026-07-12
|
||||
---
|
||||
|
||||
# Wiki Index
|
||||
|
||||
> 질의 시 항상 이 파일을 먼저 확인한다. 카테고리별로 페이지를 한 줄 요약과 함께 나열한다 (120자 이내).
|
||||
|
||||
## 페이지 — 로그인 후 워크플로우 (B01~B09)
|
||||
|
||||
### [[B01_Dashboard/B01_backend|B01_Dashboard]]
|
||||
역할별 프로젝트·회사·사용자·가입·자동화 관리와 workflow 배치조회, 시스템 리소스·감사 로그. draft.
|
||||
|
||||
### [[B02_ProjRegister/B02_backend|B02_ProjRegister]]
|
||||
프로젝트 생성 `POST /api/b02/project`. 트랜잭션: projects INSERT+워크플로우 7단계 시드+감사로그+저장소 초기화. stable.
|
||||
|
||||
### [[B03_FileInput/B03_backend|B03_FileInput]]
|
||||
일반·청크 업로드, 메타데이터 분석, WF0/WF1 상태 전이, 이메일 알림과 workflow 조회. draft.
|
||||
|
||||
### [[B04_wf1_Surface/B04_backend|B04_wf1_Surface]]
|
||||
지표면 분석 `/api/projects` 12개 API. LAS→필터4종→모델5종→등고선. three.js 3D 뷰어 구현됨. WF1 stage 전이. stable.
|
||||
|
||||
### [[B05_wf2_Route/B05_backend|B05_wf2_Route]]
|
||||
Dijkstra·ridge-valley 경로 계산, 비용면·skeleton·통계 저장과 route 확정 API. WebCAD 뷰어 미구현. draft.
|
||||
|
||||
### [[B06_wf3_ProfileCross/B06_backend|B06_wf3_ProfileCross]]
|
||||
확정 경로 기반 종단·횡단 생성, 표고 sampler·측점 샘플링·결과 확정 API. WebCAD 프로필 뷰어 미구현. draft.
|
||||
|
||||
### [[B07_wf4_DesignDetail/B07_frontend|B07_wf4_DesignDetail]]
|
||||
구조물 배치 — 워크플로우 셸만 존재(26줄), 본문 미구현. migration_plan.md에 범위제외 명시(계획적 미착수). stable.
|
||||
|
||||
### [[B08_wf5_Quantity/B08_frontend|B08_wf5_Quantity]]
|
||||
WF5 workflow 셸만 구현. 수량 계산 본문·Repository·Router/API 미구현. draft.
|
||||
|
||||
### [[B09_wf6_Estimation/B09_frontend|B09_wf6_Estimation]]
|
||||
견적·문서(Excel/PDF/DXF) 산출 — 워크플로우 셸만 존재(26줄), 본문 미구현. outputs/output_files 테이블 예정. stable.
|
||||
|
||||
## 페이지 — 로그인 전 (A01~A09)
|
||||
|
||||
### [[A01_Home/A01_frontend|A01_Home]]
|
||||
히어로 + 최신 소식 + 주요 기능 showcase. 정적 페이지. MOCK_NEWS 하드코딩(GET /api/a01/news 미구현). stable.
|
||||
|
||||
### [[A02_ProgDetail/A02_frontend|A02_ProgDetail]]
|
||||
6단계 워크플로우 시각화 + 핵심 기술 소개. Hero + 배지번호 리스트 + 카드그리드. stable.
|
||||
|
||||
### [[A03_CompDetail/A03_frontend|A03_CompDetail]]
|
||||
회사 미션·핵심가치·연락처. Hero + 본문 + 3개 가치 카드그리드 + 이메일. stable.
|
||||
|
||||
### [[A04_NewsHistory/A04_frontend|A04_NewsHistory]]
|
||||
최신소식 및 개선이력 타임라인. Hero + 태그+제목+날짜 행들. MOCK_HISTORY 데이터, 백엔드 미구현. stable.
|
||||
|
||||
### [[A05_EduDetail/A05_frontend|A05_EduDetail]]
|
||||
교육 과정 소개 + 문의 CTA. Hero + 3개 과정 카드그리드 + 문의 버튼. stable.
|
||||
|
||||
### [[A06_Login/A06_backend|A06_Login]]
|
||||
세션쿠키 로그인 + 신규브라우저/주기 OTP 재인증. `/api/auth` 5개 엔드포인트. backend·frontend 상세. stable.
|
||||
|
||||
### [[A07_Register/A07_backend|A07_Register]]
|
||||
회원가입 2단계(요청→OTP)+회사검색. 약관 아코디언, NO_COMPANY로 완료. ⚠️UI_Page.ts 구버전 잔재. stable.
|
||||
|
||||
### [[A08_Support/A08_backend|A08_Support]]
|
||||
기술지원 문의(비로그인 가능). `support_requests` 저장+관리자 메일. ⚠️DB 컬럼 계획서와 불일치. stable.
|
||||
|
||||
### [[A09_Security/A09_backend|A09_Security]]
|
||||
백엔드: 마스터/시스템관리자 조직·회원·가입승인·활동로그 API(`/api/security`). 프론트: 약관 열람만. ⚠️API 클라이언트 미연동. stable.
|
||||
|
||||
## 개념 (Concepts)
|
||||
|
||||
### [[a00_app_shell_framework]]
|
||||
모든 페이지의 공통 스켈레톤. 헤더(로고/네비/언어·테마/인증), 아울렛, 푸터 + 라우터 + B그룹 스캐폴드.
|
||||
|
||||
### [[a00_app_shell_framework_scaffold]]
|
||||
App Shell Framework의 세부 스캐폴드, CSS 인젝션 구조, 외부 라이브러리 및 사용처 매핑.
|
||||
|
||||
### [[ui_templates]]
|
||||
다국어 관리(i18n [한국어, 영어]), 공통 컴포넌트(버튼/카드/태그/워크플로우셸), theme.css 변수.
|
||||
|
||||
### DB 스키마
|
||||
- [[db_schema/overview]] — 34개 테이블 확정; workflow 상태 및 system_admin_logs 용도 분석 완료.
|
||||
- [[db_schema/users_auth]] — users/companies/sessions/email_otps/trusted_devices/join_requests/user_consents
|
||||
- [[db_schema/logs_monitoring]] — login_logs/activity_logs/audit_logs/system_audit_logs/system_admin_logs/system_resources/support_requests/change_logs
|
||||
- [[db_schema/projects]] — projects/project_versions/project_automations
|
||||
- [[db_schema/files_surface]] — upload_sessions/upload_chunks/input_files/processed_point_cloud/surface_models/terrain_layers
|
||||
- [[db_schema/route_profile]] — routes/route_points/route_statistics/longitudinal_sections/cross_sections
|
||||
- [[db_schema/structure_output]] — structures/quantity_items/outputs/output_files
|
||||
- [[db_schema/unconfirmed/README]] — 미확정/미연동 테이블 격리 및 임시 분석 보관소
|
||||
|
||||
### [[auth_rbac]]
|
||||
세션쿠키 인증, OTP, 3역할 RBAC 접근표, 권한헬퍼 5종, 사용자 상태 생명주기.
|
||||
|
||||
### [[storage_paths]]
|
||||
B03~B09 워크플로우 기반 storage/ 경로 패턴, DB 경로컬럼 매핑, 경로 생성 책임 분리 원칙.
|
||||
|
||||
### [[common_util]]
|
||||
common_util_* 11개 파일 목록과 역할 (auth/storage/email/resource_monitor/**workflow_state** 등).
|
||||
|
||||
### API 공통 (여러 페이지가 공유하는 엔드포인트)
|
||||
- [[api_common]] — 공통 오류포맷, workflow-state API(✅구현·실사용 확인)
|
||||
|
||||
### 의존성 (여러 페이지가 공유하는 외부 라이브러리)
|
||||
- [[dependencies]] — Trimesh/Whitebox/Geopandas/Shapely/Rasterio/Laspy/aiomysql 사용처 매핑
|
||||
|
||||
### 공통 스키마 (Pydantic 요청/응답 모델)
|
||||
- [[schema_common]] — 공통 에러 포맷 `{"status":"error","message":...}`. 페이지 간 공유 모델은 미발견.
|
||||
|
||||
### Workflow 상태 관리
|
||||
- [[workflow_state]] — B01~B06 연동 확인, `project_workflow_stages` SSOT·stale 전파. B04 폴백은 레거시 안전장치.
|
||||
|
||||
## ⚠️ 미해결 항목
|
||||
- `raw/guidelines/design.md`는 "Wiza"(보라색 SaaS 프로덕트) 스타일 가이드로 Aislo와 무관해 보여 **ingest하지 않음** — 잘못 들어온 파일인지 확인 필요
|
||||
- `B04_wf1_Surface_Router.py:412-427` — `projects.status` 문자열 비교(416 WF1_COMPLETE, 420 WF1_ANALYZING)는 **구형 잔재가 아니라 project_workflow_stages 부재 시 레거시 폴백**(백필 안전장치). SSOT 안정화 후 제거 가능 → [[B04_wf1_Surface/B04_backend]]
|
||||
- `B04_wf1_Surface_Router.py:76` `update_project_status()` — 정의만, 호출처 없음(죽은 코드) → 정리 권장
|
||||
- B07~B09는 실 코드 상 아직 미착수 또는 셸만 존재 (B02는 backend 확인·반영 완료, B04도 이번에 5분할 상세화 완료)
|
||||
|
||||
### A그룹 인제스트 이슈
|
||||
- 세션·OTP 정책 불일치, support_requests 컬럼 불일치, A07/A09 구버전 코드가 발견됨. 상세는 각 페이지와 [[auth_rbac]] 참조.
|
||||
- **support_requests 컬럼 불일치**: [[db_schema/logs_monitoring]] 계획서(user_id/title/priority/status) vs 실 코드([[A08_Support/A08_backend]] INSERT: company_id/company_name/user_name/user_email/user_phone/subject/message). → 실 DB 대조 필요
|
||||
- **미사용/구버전 코드 2건**: `A07_Register_UI_Page.ts`(구버전 잔재, 라우터는 UI_Auth_Page 사용), `A09_Security_Api_Fetch.ts`(마스터/관리자 8함수 정의만, 미연동) — 정리 권장
|
||||
@@ -0,0 +1,330 @@
|
||||
# Wiki Log
|
||||
|
||||
> append-only. 형식: `## [YYYY-MM-DD] 오퍼레이션 | 제목` — 오퍼레이션은 ingest / query / lint 중 하나.
|
||||
> 최근 항목 확인: `grep "^## \[" log.md | tail -5`
|
||||
|
||||
## [2026-07-12] lint | 구형 상위 폴더 탈출 링크(../../concepts/) 전수 정밀 교정
|
||||
- **Lint**: 위키 페이지들 간의 연결성을 정밀 분석한 결과, 병행 작업자가 작성해둔 구버전 db.md 파일들(`B01_db`, `B03_db`, `B05_db`, `B06_db`, `B08_db`)에서 개념 문서(db_schema, storage_paths 등)를 참조할 때 Obsidian 호환성을 저해하는 부적절한 상위 폴더 탈출 표기법 (`[[../../concepts/...]]`)을 무작위로 혼용하고 있음을 적발함.
|
||||
- **조치 및 개선**: 검출된 9건의 부적절한 상대 링크들을 공식 표준 규격인 `[[db_schema/...]]` 및 `[[storage_paths]]` 등의 깔끔한 볼트 루트 기준 상대경로로 일제히 교정 완료함.
|
||||
|
||||
## [2026-07-12] lint | 5회 반복 린트-개선 사이클 수행 및 위키 메타 정보 정밀 보완
|
||||
- **Lint & 개선 1차**: `concepts/a00_app_shell_framework.md` 및 `concepts/ui_templates.md`에 `source` 메타데이터 필드가 누락되어 있음을 식별, 각각 `source: A00_Common 공유 프레임워크 소스 코드` 및 `source: ui_template/ 공통 UI 소스 코드 및 스타일시트`를 추가 정비함.
|
||||
- **Lint 2차**: 개별 페이지 `pages/` 하위 마크다운 파일들의 `page_id` 메타데이터 누락 여부를 전수 린트한 결과, 100% 정상 준수하고 있음을 교차 확인. (조치 사항 없음)
|
||||
- **Lint & 개선 3차**: `concepts/dependencies.md`에 외부 라이브러리 `NumPy`가 중복으로 기재되어 있음을 발견, 하나의 통합된 행으로 병합 및 사용처(`B03`, `B05`) 역참조를 단일 셀로 통합 완료.
|
||||
- **Lint & 개선 4차**: `concepts/storage_paths.md`의 `related_pages` 속성에 신규 프로젝트 생성 및 스키마 시드를 책임지는 `[[B02_ProjRegister/B02_backend]]` 링크가 빠져 있음을 감지하여 추가 정비함.
|
||||
- **Lint & 개선 5차**: `concepts/workflow_state.md`의 `related_pages`에 워크플로우 진행 상태에 연관된 B07~B09 단계 파일 링크가 누락된 것을 감지, `[[B07_wf4_DesignDetail/B07_frontend]]`, `[[B08_wf5_Quantity/B08_frontend]]`, `[[B09_wf6_Estimation/B09_frontend]]`를 추가 보완함.
|
||||
|
||||
## [2026-07-12] ingest | DB 34개 테이블 전수 컬럼 실측 및 위키 최신화
|
||||
- **DB 스키마 정밀 추출**: PyMySQL을 사용하는 파이썬 스크립트를 작성하여 로컬 `.env` 환경 정보를 바탕으로 `aislo_db` 내 실제 존재하는 34개 테이블의 모든 컬럼 정보(Field, Type, Null, Key, Default, Extra)를 알파벳 순으로 전수 정밀 추출 완료.
|
||||
- **위키 최신화**:
|
||||
- `db_schema/users_auth.md` (7개 테이블), `db_schema/logs_monitoring.md` (8개 테이블), `db_schema/projects.md` (3개 테이블), `db_schema/files_surface.md` (6개 테이블), `db_schema/route_profile.md` (5개 테이블), `db_schema/structure_output.md` (4개 테이블) 총 6개 위키 문서에 누락 및 생략되어 있던 실제 DB 컬럼들의 세부 스펙을 100% 매핑하여 최신화 완료.
|
||||
- 100줄 제한 규칙(규칙 14)을 준수하기 위해 표 및 설명 문구들을 조밀하게 압축하고 정리함.
|
||||
- **미해결 부채 청산**:
|
||||
- `system_admin_logs` 테이블의 용도 분석을 통해 SYSTEM_ADMIN의 회원/조직 상태 변경 감사 이력 Write-Only용임을 확인 및 명세화.
|
||||
- `db_schema/overview.md` 및 `index.md` 내에 기재된 `system_admin_logs 용도 미상` 경고 bullet 및 미해결 항목을 해결됨 상태로 최종 정정 완료.
|
||||
- **미확정/연결 대기 테이블 관리 규칙 도입**:
|
||||
- 향후 신규 추가되거나 프로젝트 비즈니스 로직(사용처)이 불명확한 테이블을 안전하게 격리하고 관리할 수 있도록 `db_schema/unconfirmed/` 디렉토리를 신설하고 [README.md](file:///C:/Program_coding/임도설계 및 견적자동화 프로그램 개발/docs/wiki/concepts/db_schema/unconfirmed/README.md)에 운영 가이드라인을 정의함.
|
||||
- `db_schema/overview.md`에 미확정 그룹 앵커 링크(`[[unconfirmed/README]]`) 및 격리 관리 원칙을 명문화하여 지식 시스템을 완성함.
|
||||
- **Lint 조치**: 신설된 `unconfirmed/README.md`가 위키 규칙 2번(페이지 생성 시 index.md 반영)을 충족하도록 [index.md](file:///C:/Program_coding/임도설계 및 견적자동화 프로그램 개발/docs/wiki/index.md)에 링크 및 한 줄 명세를 연동 보완함.
|
||||
|
||||
## [2026-07-12] ingest+lint | 3회 반복 린트-개선 사이클 수행 및 위키 무결성 확보
|
||||
- **Ingest**: `docs/raw/plans/2026-07-12_plan_add_phase4_role.md` 및 `docs/raw/verification/2026-07-12_verify_add_phase4_role.md`를 기반으로, 루트 폴더의 `AGENTS.md`에 `#### 역할 4: 기타 작업자 (위키 관리 / 작업 보조)`가 정상 추가 및 검증 완료되었음을 확인 및 반영.
|
||||
- **Lint & 개선 1차**: `concepts/ui_templates.md` 전수 점검. 규칙 13(공유 자원 표 형식 준수)에 위배되는 서술식 다국어 텍스트 기능 설명 및 `theme.css` 색상/마진 변수 나열 항목을 색출하여 `항목 | 위치 | 역할` 형태의 표 포맷으로 전면 개선 완료.
|
||||
- **Lint & 개선 2차**: `A08_Support/A08_backend.md`에서 `db_schema/logs_monitoring.md` 내에 실존하지 않는 `#support_requests` 세부 앵커를 가리키는 깨진 앵커 링크 2건을 색출하여 `[[db_schema/logs_monitoring]]`으로 개선(단순화) 완료.
|
||||
- **Lint & 개선 3차**: `storage_paths.md`에 기술된 물리 저장소 경로 패턴 및 세션/이메일 세부 규칙을 백엔드 설정 코드(`config_system.py`, `common_util_storage.py`)와 전수 교차 대조하여, 수치(유효시간 12h/4h, OTP 5분, 재인증 90일, 재시도 3회) 및 폴더 레이아웃이 100% 정합함을 확인. 추가 수정 없음.
|
||||
|
||||
## [2026-07-12] ingest | B09_wf6_Estimation (실 코드 대조, 미착수 확인)
|
||||
- 대상: B09_wf6_Estimation_UI_Page.ts(27줄, 유일한 소스 파일)
|
||||
- **기존 파일 정리**: 구 파일명 frontend.md(draft) 삭제 → B09_frontend.md 재작성(stable)
|
||||
- **실 코드 대조 결과**: 기존 wiki 내용이 이미 정확함 — B07/B08과 동일 패턴, `renderPendingWorkflow()`만 호출, 백엔드 파일 없음
|
||||
- **raw 근거 재확인**: `structure.md:177-178`도 B09를 "워크플로우 셸"로만 기술 — 실 코드와 일치, 모순 없음
|
||||
- **로케일 키 검증**: B09_Estimation_Title(714) 실 파일 등록 확인
|
||||
- storage_paths.md에 B09 이미 related_pages 등록 확인(v1/v2 버전 관리는 이 단계에서만, 20줄), structure_output.md에도 outputs/output_files 사용처 등록 확인 — 둘 다 수정 불필요
|
||||
- index.md B09 링크 `[[B09_wf6_Estimation/frontend]]` → `[[B09_wf6_Estimation/B09_frontend]]` 갱신
|
||||
- 결론: B07/B08/B09 workflow 셸 3종 전부 wiki 반영 완료. B01/B03/B05/B06(병행 작업자)까지 포함하면 B01~B09 전 페이지 wiki 존재 확인
|
||||
- 주: B01/B03/B05/B06/B08은 병행 작업자가 진행/완료해 건드리지 않음
|
||||
|
||||
## [2026-07-12] ingest | B07_wf4_DesignDetail (실 코드 대조, 미착수 확인)
|
||||
- 대상: B07_wf4_DesignDetail_UI_Page.ts(27줄, 유일한 소스 파일)
|
||||
- **기존 파일 정리**: 구 파일명 frontend.md(draft) 삭제 → B07_frontend.md 재작성(stable)
|
||||
- **실 코드 대조 결과**: 기존 wiki 내용이 이미 정확함 — `renderPendingWorkflow()`만 호출하는 셸, 백엔드 파일 자체 없음
|
||||
- **raw 근거 재확인**: `migration_plan.md:271` "B07 이후 기능은 이번 마이그레이션 범위에서 제외한다" — 계획 단계에서 명시적 제외, structure.md:173-174도 셸로만 기술. 실 코드·raw 문서·기존 wiki 3자 일치(모순 없음)
|
||||
- **로케일 키 검증**: B07_Design_Title(708) 실 파일 등록 확인
|
||||
- structure_output.md에 B07 이미 related_pages·사용처 등록 확인(structures 테이블, 수정 불필요)
|
||||
- index.md B07 링크 `[[B07_wf4_DesignDetail/frontend]]` → `[[B07_wf4_DesignDetail/B07_frontend]]` 갱신, "계획적 미착수" 근거 명시
|
||||
- 주: B01/B03/B05/B06은 병행 작업자가 계속 진행 중이라 건드리지 않음
|
||||
|
||||
## [2026-07-12] ingest | B04_wf1_Surface (실 코드 대조·5분할 상세화)
|
||||
- 대상: Router(739줄), Schema(113줄), Repository(236줄), Engine(161줄)+엔진 서브모듈 14개, UI_Page(377줄), UI_Viewer(567줄), UI_TerrainViewer(637줄), Api_Fetch(174줄) 등 23개 파일
|
||||
- **기존 파일 정리**: 구 파일명 계획서기반 4개(backend/frontend/db/api, api·db·frontend는 draft·"추정 경로") 삭제 → B04_backend/B04_frontend/B04_api/B04_db/B04_dependencies.md 5분할 상세 재작성(전부 stable)
|
||||
- **⚠️ 중요 정정 3건 (계획서 → 실 코드)**:
|
||||
1. **API**: api.md는 "추정 경로 2개(surface/analyze·models)"였으나 실제 `/api/projects` prefix 12개 엔드포인트. 전부 실 위치 표로 기록
|
||||
2. **3D 뷰어**: 계획서·dependencies "WebCAD 3D 뷰어 미구현"이었으나 실 코드에 **three.js(WebGL) 뷰어 구현됨** — UI_Viewer(포인트클라우드)+UI_TerrainViewer(지형 메시), UI_Page에서 import·사용 확인. dependencies.md에 three.js 추가+"미구현" 정정
|
||||
3. **416/420줄 "구형 잔재"**: 잔재가 아니라 **레거시 폴백**(project_workflow_stages SSOT 우선, 부재 시에만 projects.status 비교, `:412-427`). index.md·workflow_state.md 정정
|
||||
- **추가 발견**: `update_project_status()`(`:76`) 정의만·호출처 없음(죽은 코드, grep 확인) → 미해결 항목 추가
|
||||
- **워크플로우 전이**: analyze에서 start_stage(168)/complete_stage(209)/fail_stage(227,233) stage 1
|
||||
- **역참조**: files_surface B04 이미 등록(구 링크 정정), dependencies·workflow_state 갱신
|
||||
- index.md B04 링크 갱신, 미해결 항목 정정. 엔진 서브모듈 15개는 backend.md에 표로 요약(과분할 방지)
|
||||
|
||||
## [2026-07-12] ingest | B02_ProjRegister (backend + frontend + db 상세화)
|
||||
- 대상: B02_ProjRegister_Router.py(44줄), B02_ProjRegister_Schema.py(30줄), B02_ProjRegister_Repository.py(136줄), B02_ProjRegister_UI_Page.ts(179줄), B02_ProjRegister_UI_Style.css(66줄)
|
||||
- **기존 파일 정리**: 구 파일명 스텁 backend.md/db.md/frontend.md(요약 수준, 비표준 frontmatter, frontend/db는 draft) 삭제 → B02_backend/B02_frontend/B02_db.md 상세 재작성(전부 stable)
|
||||
- 출력:
|
||||
- `B02_backend.md` — `POST /api/b02/project`, create_project 트랜잭션(projects INSERT+initialize_project_stages 7단계 시드+system_audit_logs PROJECT_CREATE+저장소 초기화), Pydantic 2종, 저장소 경로 이탈 방지
|
||||
- `B02_frontend.md` — 등록 폼(2열 그리드, road_type select 4종), fetch 직접 호출, 성공 시 CURRENT_PROJECT_ID_KEY 저장 후 B03 이동
|
||||
- `B02_db.md` — 쓰는 테이블 3종(projects/project_workflow_stages/system_audit_logs) 용도+링크만(규칙11), 저장소 규칙
|
||||
- **로케일 키 검증**: B02_Proj_Title(487), B02_Proj_Field_RoadType(499), B02_Proj_RoadType_Stream(503), B02_Proj_Success(510) 등 실 파일 등록 확인
|
||||
- **역참조 갱신(규칙12)**: logs_monitoring.md system_audit_logs 섹션 제목 "B01 사용"→"사용처(B01,B02)"로 일반화 + B02 PROJECT_CREATE 행 추가. projects.md/workflow_state.md엔 B02 이미 등록됨
|
||||
- **발견 사항**:
|
||||
- 계획서엔 "7단계 시드가 마이그레이션 Phase1 과제"였으나 실 코드에 이미 구현됨(규칙6 실코드 채택)
|
||||
- projects INSERT 시 status 'NEW', crs_epsg 5178 고정
|
||||
- 프론트가 fetch 직접 호출(A08처럼 별도 API 클라이언트 없음)
|
||||
- index.md B02 링크 `[[B02_ProjRegister/backend]]` → `[[B02_ProjRegister/B02_backend]]` 갱신
|
||||
- 주: B01은 병행 작업자가 진행 중이라 건드리지 않음(A07_backend 링크 등 B01발 자동 갱신은 반영됨)
|
||||
|
||||
## [2026-07-12] query | B01_Dashboard 실 코드 기준 최신화
|
||||
- 상위 프로젝트 `B01_Dashboard/` 코드 9개를 읽기 전용으로 대조했다.
|
||||
- 기존 `frontend.md`, `backend.md`를 규칙에 맞는 `B01_frontend.md`, `B01_backend.md`로 교체했다.
|
||||
- API·DB·의존성을 `B01_api.md`, `B01_db.md`, `B01_dependencies.md`로 분리하고 코드 위치를 표로 기록했다.
|
||||
- 실제 감사 테이블이 `system_audit_logs`임을 반영하고 workflow 조회의 미구현 표기를 바로잡았다.
|
||||
- 관련 concepts와 `index.md`를 갱신했으며, 검증보고서가 없어 B01 상태는 `draft`로 유지했다.
|
||||
- 기술부채로 UI Page 739줄과 Repository 790줄을 기록했다.
|
||||
|
||||
## [2026-07-12] query | B03_FileInput 실 코드 기준 최신화
|
||||
- 상위 프로젝트 `B03_FileInput/` 코드 11개를 읽기 전용으로 대조했다.
|
||||
- 기존 frontend/backend 문서를 `B03_frontend.md`, `B03_backend.md`로 교체했다.
|
||||
- API·DB·의존성을 `B03_api.md`, `B03_db.md`, `B03_dependencies.md`로 분리했다.
|
||||
- 일반·청크 업로드, LAS/TIF/PRJ/TFW 메타데이터 분석, WF0/WF1 상태 전이, 이메일 알림을 기록했다.
|
||||
- `dependencies`, `db_schema/files_surface`, `index.md`를 실제 코드 기준으로 갱신했다.
|
||||
- 검증보고서가 없어 B03 페이지 상태는 `draft`로 유지했다.
|
||||
- 기술부채로 UI Page 695줄과 UI Style 376줄을 기록했다.
|
||||
|
||||
## [2026-07-12] query | B05_wf2_Route 실 코드 기준 최신화
|
||||
- 상위 프로젝트 `B05_wf2_Route/` 코드 11개를 읽기 전용으로 대조했다.
|
||||
- 기존 API/backend/db/frontend 문서를 `B05_api.md`, `B05_backend.md`, `B05_db.md`, `B05_frontend.md`로 교체했다.
|
||||
- `B05_dependencies.md`를 추가해 Dijkstra·ridge-valley·skeleton·비용면 엔진과 의존성을 기록했다.
|
||||
- 실제 API 경로와 RouteSolve 스키마, routes·route_points·route_statistics 저장 관계를 반영했다.
|
||||
- `dependencies`, `index.md`를 실제 코드 기준으로 갱신했다.
|
||||
- 검증보고서가 없어 B05 페이지 상태는 `draft`로 유지했다.
|
||||
- 기술부채로 RidgeValley 781줄, Solver 654줄, WebCAD 뷰어 미구현을 기록했다.
|
||||
|
||||
## [2026-07-12] query | B06_wf3_ProfileCross 실 코드 기준 최신화
|
||||
- 상위 프로젝트 `B06_wf3_ProfileCross/` 코드 9개를 읽기 전용으로 대조했다.
|
||||
- 기존 backend/db/frontend 문서를 `B06_backend.md`, `B06_db.md`, `B06_frontend.md`로 교체했다.
|
||||
- API·의존성을 `B06_api.md`, `B06_dependencies.md`로 분리했다.
|
||||
- 확정 B05 경로 기반 종단·횡단 생성, DTM·보간 sampler, 측점·단면 샘플링, 재생성 삭제·저장·확정 흐름을 기록했다.
|
||||
- 검증보고서가 없어 B06 페이지 상태는 `draft`로 유지했다.
|
||||
- WebCAD 종단도·횡단 프로필 뷰어 미구현 상태를 기록했다.
|
||||
|
||||
## [2026-07-12] query | B08_wf5_Quantity 실 코드 기준 최신화
|
||||
- 상위 프로젝트 `B08_wf5_Quantity/`에는 UI 파일 1개(25줄)만 존재함을 확인했다.
|
||||
- 기존 `frontend.md`를 `B08_frontend.md`로 교체하고 workflow 셸의 실제 함수·locale·활성 단계 위치를 기록했다.
|
||||
- 수량 계산 본문·Repository·Router/API·Pydantic 스키마가 아직 없음을 명시했다.
|
||||
- 예정 DB 자원 `quantity_items`와 `quantity_data_path`를 `B08_db.md` 및 concepts 링크로 연결했다.
|
||||
- `index.md`를 실제 구현 상태에 맞게 갱신했다.
|
||||
|
||||
## [2026-07-12] lint | 전체 위키 구조·상태·공유 개념 정리
|
||||
- A/B 페이지의 누락된 `related_pages`를 보완하고 concepts의 관련 페이지 역참조를 추가했다.
|
||||
- 검증보고서가 없는 stable 페이지를 draft로 조정해 status 규칙을 일관화했다.
|
||||
- B05/B06 뷰어 상태, B03 구현 상태, workflow-state 실제 경로, legacy polling 문구를 갱신했다.
|
||||
- 100줄 초과 문서인 A01과 A00 공통 개념을 하위 문서로 분리했다.
|
||||
- index의 페이지 상태 표기를 페이지 frontmatter와 일치시켰다.
|
||||
- 코드 파일은 수정하지 않았으며 `raw/`는 변경하지 않았다.
|
||||
|
||||
## [2026-07-12] lint | 전체 위키 구조·상태·공유 개념 정리
|
||||
- A/B 페이지의 누락된 `related_pages`를 보완하고 concepts의 관련 페이지 역참조를 추가했다.
|
||||
- 검증보고서가 없는 stable 페이지를 draft로 조정해 status 규칙을 일관화했다.
|
||||
- B05/B06 뷰어 상태, B03 구현 상태, workflow-state 실제 경로, legacy polling 문구를 갱신했다.
|
||||
- index의 페이지 상태 표기를 페이지 frontmatter와 일치시켰다.
|
||||
- 코드 파일은 수정하지 않았으며 `raw/`는 변경하지 않았다.
|
||||
|
||||
## [2026-07-12] lint | 위키 시스템 초기 세팅
|
||||
- raw/, wiki/, output/ 폴더 구조 생성
|
||||
- docs/CLAUDE.md에 Wiki Schema(위키 운영 규칙) 추가
|
||||
- 하위 CLAUDE.md 3개 생성 (raw/, wiki/, output/)
|
||||
- wiki/index.md, wiki/log.md 초기화 (콘텐츠 없음, 카테고리 헤더만)
|
||||
- 아직 raw/에 원본 없음 → 다음 단계는 첫 ingest 대기
|
||||
|
||||
## [2026-07-12] ingest | guidelines/plans 7건 일괄 반영
|
||||
- 대상: raw/guidelines/{structure,db_schema,backend,frontend,agent,migration_plan}.md, raw/plans/plan_workflow_state_management.md (7건). raw/guidelines/design.md는 Aislo와 무관한 "Wiza" 스타일가이드로 판단해 **ingest 제외**.
|
||||
- concepts 신규 8건: db_schema/{overview,users_auth,logs_monitoring,projects,files_surface,route_profile,structure_output}, storage_paths, auth_rbac, common_util, dependencies, api_common, schema_common, workflow_state (총 14파일, db_schema는 34개 테이블을 9그룹→7파일+개요로 분할, 전부 100줄 이내)
|
||||
- pages 신규: B01(backend/frontend), B02(frontend/db), B03(backend/frontend/db), B04(backend/frontend/db/api), B05(backend/frontend/db/api), B06(backend/frontend/db), B07~B09(frontend만, 셸 상태)
|
||||
- 전부 status: stable (검증보고서 없음, 계획서·행동지침만 반영됨)
|
||||
- 발견한 모순: 테이블 총 개수(db_schema.md 34 vs agent.md 18/23) — 미해결, [[db_schema/overview]]에 기록
|
||||
- 발견한 이슈: B03/B04 WF1 상태 이중 세팅, projects.status 단일문자열 한계 → [[workflow_state]]로 별도 정리
|
||||
- index.md 전체 갱신 (카테고리별 요약 + 미해결 항목 섹션 추가)
|
||||
|
||||
## [2026-07-12] query+lint | 실 DB/실 코드 대조 검증 (읽기 전용)
|
||||
- `.env` 자격증명으로 aislo_db에 read-only 접속(`SHOW TABLES`, `DESCRIBE`) — DB는 수정하지 않음
|
||||
- 테이블 개수 모순 해결: 실측 34개 = db_schema.md와 일치. agent.md(18/23)는 오기로 확정 → [[../concepts/db_schema/overview]]
|
||||
- raw에 없던 실 테이블 2개 발견: `project_workflow_stages`(구현완료 확인) / `system_admin_logs`(용도 미상, 임의 해석 보류 — 사용자 확인 대기)
|
||||
- `common_util_workflow_state.py`, B01~B06 라우터/리포지토리 실 코드 확인 → [[../concepts/workflow_state]] status: stable→**stable**로 갱신 (계획서 설계가 이미 전면 구현됨을 확인)
|
||||
- B02_ProjRegister 백엔드(raw엔 없었음) 실 코드 확인 후 backend.md 신규 작성, status stable
|
||||
- A01~A09(로그인 전 페이지) 카테고리 신규 추가, 실 코드 기반 15개 파일 작성 (전부 status stable, raw 문서 근거 부족은 각주로 표시)
|
||||
- B04_wf1_Surface_Router.py:416,420에 구형 상태비교 잔재 발견, 미정리 항목으로 기록
|
||||
- index.md 전체 재구성 (A/B 페이지 분리, 미해결 항목 갱신)
|
||||
|
||||
## [2026-07-12] lint | page_id frontmatter 필드 도입
|
||||
- 문제: `frontend.md`/`backend.md` 등은 파일명만으로 소속 페이지를 알 수 없음(폴더 밖에서 볼 때 구분 불가)
|
||||
- docs/CLAUDE.md 위키 규칙 5번, wiki/CLAUDE.md에 `page_id: B0x_이름`/`A0x_이름` frontmatter 필수화 규칙 추가 (concepts 파일은 제외 — 페이지 단위가 아니므로)
|
||||
- 기존 wiki/pages/ 하위 34개 파일 전체에 `page_id` 소급 추가 (status 라인 바로 아래)
|
||||
- 향후 ingest 시 페이지 파일 생성할 때마다 이 필드 포함 필수
|
||||
|
||||
## [2026-07-12] ingest | A01_Home 실 코드 반영
|
||||
- 대상: A01_Home_UI_Page.ts (157줄), A01_Home_UI_Style.css (113줄)
|
||||
- 출력: wiki/pages/A01_Home/frontend.md 상세 업데이트 (79줄 → 개념 설명 + 컴포넌트 분석 + 로케일 키 매핑 + CSS 클래스 구조 추가)
|
||||
- 발견 사항: MOCK_NEWS 데이터 하드코딩(백엔드 미연결), 3개 공통 컴포넌트(createButton/createCard/createTag) 사용, theme.css 변수 엄격 준수, 반응형 900px 기준
|
||||
- 미해결: /api/a01/news 백엔드 미구현
|
||||
- 기존 내용 유지: status stable 유지, related_pages 확장
|
||||
|
||||
## [2026-07-12] refactor | 파일명 규칙 도입 및 링크 수정
|
||||
- **파일명 규칙 변경:** `frontend.md` → `A01_frontend.md` (page_id prefix 추가)
|
||||
- **이유:** 그래픽 뷰에서 `frontend.md`, `backend.md` 등 기능명이 겹칠 때 page_id로 즉시 식별 가능하게 함
|
||||
- **적용 범위:** wiki/pages/A0x_이름/, wiki/pages/B0x_이름/ 하위 파일 모두 (신규 + 기존)
|
||||
- **수정 파일:** `wiki/pages/A01_Home/frontend.md` → `A01_frontend.md`, index.md 링크 `[[A01_Home/frontend]]` → `[[A01_Home/A01_frontend]]`
|
||||
- **docs/CLAUDE.md 규칙 5번, wiki/CLAUDE.md 작성규칙 수정** — 파일명 규칙 명시
|
||||
- 향후 ingest 시 신규 파일 생성할 때마다 page_id prefix 붙임
|
||||
|
||||
## [2026-07-12] lint | A그룹(A01~A09) 전체 검증 및 정합성 점검
|
||||
- 범위: A01~A09 wiki 페이지 13개 + 참조 concept(ui_templates/a00_app_shell_framework/auth_rbac/common_util/logs_monitoring 등) + index.md
|
||||
- **검증 통과 항목**:
|
||||
- 파일 100줄 제한: 전 파일 통과(최대 A01 76줄), 파일명 규칙(page_id prefix) 전부 준수
|
||||
- 위키링크 유효성: A그룹이 거는 링크 대상 전부 실존 확인(깨진 링크 0)
|
||||
- 소스 커버리지: A01~A09 실 소스 파일 전부 wiki 반영 확인(A02~A05 frontend-only는 백엔드 소스 없어 정당)
|
||||
- **발견·수정한 문제**:
|
||||
1. A02_frontend.md frontmatter에 비표준 `related_pages: []` 잔재 → 제거(A01 린트 때와 동일 유형)
|
||||
2. index.md 미해결 항목 섹션에 A그룹 발견 불일치 3건 누락 → "A그룹 인제스트 중 발견" 소섹션 추가(세션정책/support_requests컬럼/미사용코드)
|
||||
3. auth_rbac.md 역참조 누락(B01만 있고 A06/A07/A09 없음) → 사용처 섹션 + 계획서-실코드 불일치 소섹션 추가(규칙12)
|
||||
4. index.md A01 요약 톤 정리(다른 A페이지와 일관성, stable 명시)
|
||||
- **기록만(수정 안 함)**:
|
||||
- `[[B01_Dashboard/backend]]` 링크는 구 파일명(backend.md) 참조하나 파일 실존→깨진 링크 아님. B01 파일명 규칙 마이그레이션은 B그룹 작업 시 처리
|
||||
- common_util.md 사용처 "전 페이지/인증 관련"로 A그룹 포괄됨(세부 명시는 선택사항, 링크 유효)
|
||||
- 결론: A그룹 인제스트 정합성 확보. 누적 불일치 3건은 index.md 미해결 항목에 집약(코드 수정은 사용자가 나중에)
|
||||
|
||||
## [2026-07-12] ingest | A09_Security (backend + frontend 상세화)
|
||||
- 대상: A09_Security_Router.py(123줄), A09_Security_Schema.py(25줄), A09_Security_UI_Page.ts(30줄), A09_Security_Terms.ts(16줄), A09_Security_Api_Fetch.ts(61줄), A09_Security_UI_Style.css(14줄)
|
||||
- **기존 파일 정리**: 얕은 스텁 backend.md/frontend.md 삭제 → A09_backend.md/A09_frontend.md 상세 재작성
|
||||
- 출력:
|
||||
- `A09_backend.md`(stable) — `/api/security` 9개 엔드포인트(마스터 5종 require_master, 시스템관리자 3종 require_system_admin, 활동로그 1종 verify_session), Pydantic 3종, psutil 리소스 계측
|
||||
- `A09_frontend.md`(stable) — 약관 열람 페이지(3섹션), Terms 데이터 표, 미사용 API 클라이언트 8함수 표
|
||||
- **로케일 키 검증**: A09_Security_Title(375), A09_Security_Version(376), A09_Security_Policy(379) 실 파일 등록 확인
|
||||
- **⚠️ 중요 발견 1 (프론트/백엔드 기능 불일치)**: UI_Page.ts는 약관 텍스트 열람만, Api_Fetch.ts(마스터/관리자 8함수)는 어디서도 import 안 됨(grep 확인). 백엔드 API는 완비, 프론트 연동 미완 → 양쪽 파일에 명시
|
||||
- **⚠️ 중요 발견 2 (약관-실코드 불일치)**: Terms.ts security 텍스트 "세션 12h/4h 만료"는 auth_rbac 계획서 기준, A06 실코드(auth_expires_at 3개월)와 다름. A06 불일치와 동일 뿌리 → 코드수정은 나중에(사용자 지시)
|
||||
- **발견 사항**:
|
||||
- 스텁엔 프론트가 "약관 동의 페이지"로 기술됐으나 실제론 동의 체크 없는 단순 열람(동의 흐름은 A07 회원가입에 있음)
|
||||
- 백엔드는 B01_Dashboard 관리자 기능과 역할 중복 가능성
|
||||
- activity_logs INSERT: user_id/action_type/resource_id/status/details
|
||||
- index.md A09 링크 `[[A09_Security/backend]]` → `[[A09_Security/A09_backend]]` 갱신
|
||||
|
||||
## [2026-07-12] ingest | A08_Support (backend + frontend 상세화)
|
||||
- 대상: A08_Support_Router.py(68줄), A08_Support_Schema.py(13줄), A08_Support_UI_Page.ts(217줄), A08_Support_UI_Style.css(64줄)
|
||||
- **기존 파일 정리**: 얕은 스텁 backend.md/frontend.md 삭제 → A08_backend.md/A08_frontend.md 상세 재작성
|
||||
- 출력:
|
||||
- `A08_backend.md`(stable) — `POST /api/a08/support` 단일 엔드포인트, get_optional_session(비로그인 허용), support_requests INSERT + 관리자 알림 메일
|
||||
- `A08_frontend.md`(stable) — 문의 폼(textarea 자체 구현 createTextAreaField), 세션 자동 채움(fetchSessionUser), fetch 직접 호출(Api_Fetch 파일 없음)
|
||||
- **로케일 키 검증**: A08_Support_Title(348), A08_Support_Field_Phone(357), A08_Support_Field_Message(361), A08_Support_Success(367) 실 파일 등록 확인
|
||||
- **⚠️ DB 스키마 불일치 발견**: `db_schema/logs_monitoring`의 support_requests 컬럼은 계획서 기준(user_id/title/priority/status)인데 실 코드 INSERT는 company_id/company_name/user_name/user_email/user_phone/subject/message → 컬럼명 다름. logs_monitoring.md에 양쪽 병기 + 사용처에 A08 추가, 실 DB 대조 필요(규칙6)로 표시
|
||||
- **발견 사항**:
|
||||
- 비로그인도 문의 가능(get_optional_session), 로그인 시 회사 정보 자동 연결
|
||||
- textarea는 공통 컴포넌트에 없어 자체 구현
|
||||
- 프론트가 fetch를 직접 호출(별도 API 클라이언트 파일 없음)
|
||||
- index.md A08 링크 `[[A08_Support/backend]]` → `[[A08_Support/A08_backend]]` 갱신
|
||||
|
||||
## [2026-07-12] ingest | A07_Register (backend + frontend 상세화)
|
||||
- 대상: A07_Register_Router.py(76줄), A07_Register_Schema.py(30줄), A07_Register_UI_Auth_Page.ts(208줄), A07_Register_UI_Page.ts(142줄), A07_Register_Api_Fetch.ts(47줄), A07_Register_UI_Style.css(103줄)
|
||||
- **기존 파일 정리**: A06와 동일하게 얕은 스텁 backend.md/frontend.md 삭제 → A07_backend.md/A07_frontend.md 상세 재작성
|
||||
- 출력:
|
||||
- `A07_backend.md`(stable) — `/api/auth` 3종(companies·register/request·verify), Pydantic 2종, 2단계 가입 흐름(PENDING_EMAIL→NO_COMPANY)
|
||||
- `A07_frontend.md`(stable) — 약관 아코디언, 2단계 폼(정보입력→OTP), API 클라이언트 3함수
|
||||
- **로케일 키 검증**: A07_Register_Field_Otp(340), A07_Register_Verify(341), A07_Register_OtpSent(342), A07_Register_Marketing(336) 실 파일 등록 확인
|
||||
- **⚠️ 중요 발견**: A07에 UI 파일이 2개 — `A07_Register_UI_Auth_Page.ts`(실사용, router.ts:30이 import)와 `A07_Register_UI_Page.ts`(백엔드 미연동 TODO, 단순 폼). 후자는 **구버전 잔재**로 판단, 두 파일 모두 `renderA07Register` export하나 라우터는 Auth_Page만 사용 → frontend.md에 명시하고 정리 권장
|
||||
- **발견 사항**:
|
||||
- 가입은 회사 없이 완료(NO_COMPANY), 회사 생성/연결은 로그인 후 B01_Dashboard에서 진행
|
||||
- 회사검색 API(searchCompanies)는 자동완성용
|
||||
- 약관 본문은 resources/legal/*.txt에서 fetch
|
||||
- terms_version "1.0" 프론트 하드코딩
|
||||
- index.md A07 링크 `[[A07_Register/backend]]` → `[[A07_Register/A07_backend]]` 갱신
|
||||
|
||||
## [2026-07-12] ingest | A06_Login (backend + frontend 상세화)
|
||||
- 대상: A06_Login_Router.py(179줄), A06_Login_Schema.py(20줄), A06_Login_UI_Auth_Page.ts(80줄), A06_Login_Api_Fetch.ts(57줄), A06_Login_UI_Style.css(52줄)
|
||||
- **기존 파일 정리**: `backend.md`/`frontend.md`(초기 세팅 시 얕은 스텁, 비표준 frontmatter `type`/`source`/`related_pages` 포함) → 삭제하고 규칙에 맞는 `A06_backend.md`/`A06_frontend.md`로 상세 재작성
|
||||
- 출력:
|
||||
- `A06_backend.md`(stable) — `/api/auth` 엔드포인트 5종 표(login/request·verify·session·logout·password), 내부헬퍼 3종, Pydantic 3종, 로그인 흐름, 보안정책
|
||||
- `A06_frontend.md`(stable) — 2단계 폼(비번→OTP 전환), API 클라이언트 5함수, 로케일 키, 이벤트 핸들러
|
||||
- **로케일 키 검증**: A06_Login_Title(124), A06_Login_Field_Otp(288), A06_Login_Verify(290), A06_Login_OtpSent(291) 등 실 파일 등록 확인
|
||||
- **발견 사항**:
|
||||
- OTP는 "신규 브라우저 OR 주기적 재인증(EMAIL_REVERIFY_DAYS 경과)" 조건에서만 요구 (매 로그인 아님)
|
||||
- `_finish_login`에서 `auth_expires_at = NOW() + 3개월` 갱신, 브라우저 신뢰 등록
|
||||
- 5회 연속 실패 시 ADMIN_EMAIL로 보안 경고 메일
|
||||
- `fetchSession`/`fetchSessionUser`/`logout`은 app_shell과 공유
|
||||
- **⚠️ 불일치 기록**: [[auth_rbac]]는 계획서 기준(OTP 5분·재시도 3회·세션 4h/12h·15분 잠금)인데 실 코드와 다름 → 규칙6에 따라 auth_rbac 갱신 대상으로 A06_backend.md에 명시(별도 처리 필요)
|
||||
- index.md A06 링크 `[[A06_Login/backend]]` → `[[A06_Login/A06_backend]]` 갱신
|
||||
|
||||
## [2026-07-12] lint | A03~A05 인제스트 재점검
|
||||
- 대상: A03/A04/A05 frontend.md + concepts/ui_templates.md
|
||||
- **줄번호 대조**: 실 코드와 전부 일치 확인 (A03 buildHero 23-41 등, A04 buildTimeline 70-106, A05 onClick 26-28 등)
|
||||
- **로케일 키 검증**: A03_CompDetail_Contact_Email(238), A04_NewsHistory_Empty(249), A05_EduDetail_Cta(273) 등 실 파일에 등록 확인
|
||||
- **발견/수정한 문제**:
|
||||
1. 규칙13 위반: A03~A05 컴포넌트 섹션이 서술식 불릿 → 표 형식(함수|위치|역할)으로 전환, renderAxx 진입점 함수 누락분 추가
|
||||
2. ui_templates.md 컴포넌트 목록 부정확: createButton variant 3종→4종(danger 추가), createTag variant 5종·기본값 neutral 명시, 누락 컴포넌트 6종(createInputField/createSelectField/showLoadingOverlay/hideLoadingOverlay/showToast/createLineChart/injectBaseStyles) 표로 보완
|
||||
3. 깨진 위키링크 `[[A00_Common/app_shell_framework]]` → `[[a00_app_shell_framework]]`로 수정(ui_templates.md 2곳)
|
||||
4. ui_templates.md 사용처 역참조에 A03/A04/A05 추가
|
||||
- ui_templates.md 91줄(100줄 제한 이내 유지)
|
||||
|
||||
## [2026-07-12] ingest | A05_EduDetail
|
||||
- 대상: A05_EduDetail_UI_Page.ts (106줄), A05_EduDetail_UI_Style.css (87줄)
|
||||
- 출력: `wiki/pages/A05_EduDetail/A05_frontend.md` (stable)
|
||||
- 발견 사항:
|
||||
- Hero + 3개 교육 과정 카드그리드 + CTA 버튼 레이아웃
|
||||
- createButton, createCard 공통 컴포넌트 사용
|
||||
- `onA05_EduDetail_Inquiry_Click()` → A08_SUPPORT 라우트로 이동
|
||||
- theme.css 변수 엄격 준수
|
||||
- index.md 업데이트 (A05 분리)
|
||||
|
||||
## [2026-07-12] ingest | A04_NewsHistory
|
||||
- 대상: A04_NewsHistory_UI_Page.ts (117줄), A04_NewsHistory_UI_Style.css (87줄)
|
||||
- 출력: `wiki/pages/A04_NewsHistory/A04_frontend.md` (stable)
|
||||
- 발견 사항:
|
||||
- MOCK_HISTORY 데이터: feature/fix/notice 3종 태그 + 날짜
|
||||
- KIND_META 맵핑으로 variant 자동 결정
|
||||
- createTag 공통 컴포넌트 사용
|
||||
- 빈 상태(empty) 처리 구현
|
||||
- 백엔드 API 미구현: GET /api/a04/history (코드 주석에 언급)
|
||||
- index.md 업데이트 (A04 분리)
|
||||
|
||||
## [2026-07-12] ingest | A03_CompDetail
|
||||
- 대상: A03_CompDetail_UI_Page.ts (114줄), A03_CompDetail_UI_Style.css (100줄)
|
||||
- 출력: `wiki/pages/A03_CompDetail/A03_frontend.md` (stable)
|
||||
- 발견 사항:
|
||||
- A02와 동일 패턴(Hero + 섹션 + 3열 카드그리드)
|
||||
- createCard 공통 컴포넌트 사용
|
||||
- 3개 가치 카드 (Value1~3) + 연락처 이메일
|
||||
- theme.css 변수 엄격 준수
|
||||
- index.md 업데이트 (A03 분리)
|
||||
|
||||
## [2026-07-12] lint | A01_Home 페이지 검사 및 수정
|
||||
- 대상: `wiki/pages/A01_Home/A01_frontend.md`
|
||||
- 발견 사항:
|
||||
- frontmatter에 비표준 필드 `type: page-frontend` 존재 → 제거 (규칙에는 status/page_id/last_updated만)
|
||||
- related_pages 배열 형식 오류 → 제거 (위키링크는 본문에만 사용)
|
||||
- 의존성 링크 `[[ui_template_locale]]`, `[[ui_template_elements]]` 오류 → concepts 페이지 부재
|
||||
- 해결:
|
||||
- frontmatter 정제 (status/page_id/last_updated만 유지)
|
||||
- 새 concepts 페이지 `ui_templates.md` 신규 생성 (locale + elements + theme 통합, 사용처 역참조 포함)
|
||||
- 의존성 섹션 링크 수정: [[ui_templates]]로 통합
|
||||
- index.md에 ui_templates 추가
|
||||
- status: stable 유지 (실 코드 반영 완료)
|
||||
|
||||
## [2026-07-12] ingest | A02_ProgDetail + A00_Common Framework
|
||||
- 대상: A02_ProgDetail_UI_Page.ts (146줄), A02_ProgDetail_UI_Style.css (127줄) + A00_Common (app_shell.ts 284줄, b_page_scaffold.ts 163줄, router.ts 158줄)
|
||||
- 출력:
|
||||
- `wiki/pages/A02_ProgDetail/A02_frontend.md` (신규) — 컴포넌트 분석 + 로케일 키 + CSS 클래스 + 이벤트
|
||||
- `wiki/concepts/a00_app_shell_framework.md` (신규) — 공유 프레임워크(전체 페이지의 헤더·라우터·가드)
|
||||
- 발견 사항:
|
||||
- A02는 단순 정적 페이지(Hero + Workflow 배지 + Tech 카드)
|
||||
- A00_Common는 전체 앱의 스켈레톤—모든 페이지가 의존하는 공유 레이어
|
||||
- `renderShell()` + `injectShellStyles()` 로직으로 헤더/아울렛/푸터 통합 관리
|
||||
- 라우터 테이블에 A01~A09, B01~B11 (22개 라우트) 모두 등록됨 (B10_Payment, B11_Status 신규 발견)
|
||||
- 워크플로우 라우트(B02~B11)에 대한 추가 인증 가드 구현 (company_id 검증)
|
||||
- index.md 업데이트 (A02 분리, concepts에 a00_app_shell_framework 추가)
|
||||
- status: both stable (실 코드 구현 완료 확인)
|
||||
@@ -0,0 +1,37 @@
|
||||
---
|
||||
type: page-frontend-detail
|
||||
status: stable
|
||||
page_id: A01_Home
|
||||
related_pages: ["[[A01_Home/A01_frontend]]", "[[ui_templates]]", "[[a00_app_shell_framework]]"]
|
||||
last_updated: 2026-07-12
|
||||
source: 상위 프로젝트 A01_Home 코드 인제스트 보완 (2026-07-12)
|
||||
---
|
||||
|
||||
# A01_Home — 세부 구현
|
||||
|
||||
## 스타일
|
||||
| 항목 | 역할 |
|
||||
|---|---|
|
||||
| `.a01-home`, `.a01-hero` | 페이지 래퍼·히어로 배경 |
|
||||
| `.a01-news-list`, `.a01-news-row` | 뉴스 목록과 행 레이아웃 |
|
||||
| `.a01-feature-grid`, `.a01-feature-card` | 3열 기능 카드 그리드 |
|
||||
| 900px 이하 | 기능 그리드 1열·히어로 제목 축소 |
|
||||
|
||||
## 의존성
|
||||
| 항목 | 역할 |
|
||||
|---|---|
|
||||
| [[a00_app_shell_framework]] | `navigateTo()` 라우팅 |
|
||||
| `config_frontend.ts` | `ROUTES` 상수 |
|
||||
| [[ui_templates]] | 공통 버튼·카드·태그·다국어 |
|
||||
|
||||
## 데이터 흐름
|
||||
| 단계 | 흐름 |
|
||||
|---|---|
|
||||
| 1 | `renderA01Home(root)` → `buildHero()`·`buildNews()`·`buildFeatures()` |
|
||||
| 2 | `buildNews()`는 현재 `MOCK_NEWS` 사용 |
|
||||
| 3 | CTA 클릭 → A07_Register 또는 A02_ProgDetail 이동 |
|
||||
|
||||
## 미해결
|
||||
| 항목 | 상태 |
|
||||
|---|---|
|
||||
| `GET /api/a01/news` | 백엔드 미구현; 현재 뉴스는 하드코딩 |
|
||||
@@ -0,0 +1,60 @@
|
||||
---
|
||||
status: stable
|
||||
page_id: A01_Home
|
||||
related_pages: ["[[A02_ProgDetail/A02_frontend]]", "[[A04_NewsHistory/A04_frontend]]", "[[a00_app_shell_framework]]", "[[ui_templates]]"]
|
||||
last_updated: 2026-07-12
|
||||
---
|
||||
|
||||
# A01_Home — Frontend
|
||||
|
||||
로그인 전 01: 홈 페이지. 소개 히어로 + 최신 소식 + 주요 기능 3가지를 showcase하는 정적 소개 페이지. 백엔드 없음.
|
||||
|
||||
## 파일 구조
|
||||
|
||||
| 파일 | 위치 | 역할 |
|
||||
|---|---|---|
|
||||
| `A01_Home_UI_Page.ts` | `A01_Home/A01_Home_UI_Page.ts:1-157` | 페이지 렌더링 로직 |
|
||||
| `A01_Home_UI_Style.css` | `A01_Home/A01_Home_UI_Style.css:1-113` | 스타일 (theme.css 변수만 사용) |
|
||||
|
||||
## 컴포넌트
|
||||
|
||||
### Hero 섹션
|
||||
- **함수:** `buildHero()` (A01_Home_UI_Page.ts:52-85)
|
||||
- **구성:** 제목 + 부제목 + 2개 CTA 버튼 (회원가입/프로그램 상세)
|
||||
- **색상:** 라벤더 그라디언트 배경 (`--color-mist-violet` → `--color-canvas`)
|
||||
|
||||
### 최신 소식 섹션
|
||||
- **함수:** `buildNews()` (A01_Home_UI_Page.ts:87-116)
|
||||
- **데이터:** MOCK_NEWS 배열 (A01_Home_UI_Page.ts:32-36, 백엔드 연결 전)
|
||||
- **각 항목:** 태그 + 뉴스 제목 + 날짜
|
||||
|
||||
### 주요 기능 섹션
|
||||
- **함수:** `buildFeatures()` (A01_Home_UI_Page.ts:118-146)
|
||||
- **레이아웃:** 3열 그리드 (반응형: 900px 이하 1열)
|
||||
- **카드:** createCard 공통 컴포넌트 사용
|
||||
|
||||
## 이벤트 핸들러
|
||||
|
||||
| 함수 | 위치 | 동작 |
|
||||
|---|---|---|
|
||||
| `onA01_Home_GetStarted_Click()` | A01_Home_UI_Page.ts:41-43 | 회원가입(A07_REGISTER) 이동 |
|
||||
| `onA01_Home_Explore_Click()` | A01_Home_UI_Page.ts:45-47 | 프로그램 상세(A02_PROG_DETAIL) 이동 |
|
||||
|
||||
## 로컬라이제이션
|
||||
|
||||
모든 텍스트는 `ui_locales[key][currentLanguageIndex]` 형식으로 [[ui_templates]] 에서 로드.
|
||||
하드코딩 금지.
|
||||
|
||||
| UI 요소 | 로케일 키 |
|
||||
|---|---|
|
||||
| 제목 | `A01_Home_Title` |
|
||||
| 히어로 부제목 | `A01_Home_Hero_Subtitle` |
|
||||
| CTA 버튼 (Primary/Secondary) | `A01_Home_Hero_CtaPrimary`, `A01_Home_Hero_CtaSecondary` |
|
||||
| 소식 섹션 제목 | `A01_Home_News_SectionTitle` |
|
||||
| 소식 태그 | `A01_Home_News_Tag` |
|
||||
| 기능 섹션 제목 | `A01_Home_Features_SectionTitle` |
|
||||
| 기능 카드 1~3 | `A01_Home_Feature{1..3}_Title`, `A01_Home_Feature{1..3}_Desc` |
|
||||
|
||||
## 세부 구현
|
||||
|
||||
스타일 구조·의존성·데이터 흐름·미해결 사항은 [[A01_Home/A01_components]]에 분리했다.
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user