knowledge(마스터): 소요량·계수·로직에 구분·상세구분 — 표·줄마다 칸 · 갈래 목록은 서버가 줌

- 장 파일 137 개의 표 3,028 · 로직 1,351 줄에 구분(원문 + 부문 · 「건설품셈 공통」) · 상세구분(「03장 토공사」) 칸을 직접 둠 · 파일 머리의 부문·차례는 목록 차례로 남김
- 열 차례 — 표는 키 · 원문번호 · 구분 · 상세구분 · 이름 · 기준 · 출처 · 비고 · 조건 · 범위규칙 · 값칸 · 줄 · 주 · 그룹(맨 뒤) · 로직은 소유 다음에 비고
- 서버 — GET /subs?group= 이 구분·상세구분 목록(장 차례대로) · GET /tables 가 파일을 가로질러 구분·상세구분·찾기로 거르고 쪽 나눔 · GET /logics 도 구분·상세구분으로 거름 · 새 줄은 서버가 갈래를 채움 · 죽은 book 칸 걷어냄
- check_master 가 구분·상세구분이 파일 머리·이름과 맞는지 봄 · adopt 가 빌더 줄에 갈래를 찍어 되돌리기 시험 글자까지 같음 · _틀.md · 화면 계약 · 화면 트리 · 시험 같이 고침

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JgUhN55Z3BCYhUJTjwTNfj
This commit is contained in:
2026-09-20 16:30:48 +09:00
co-authored by Claude Opus 5
parent 9de61eb251
commit 10418ccbd4
154 changed files with 8227 additions and 8046 deletions
-33
View File
@@ -42,36 +42,3 @@ export function renderTree(nodes: TreeNode[], make: MakeRow, depth = 0): HTMLEle
return el("div", { className: "m01-tree__branch", children: [row, kids] });
});
}
/** 파일 목록 → 원문 › 부문 › 장 — 장 이름이 「공통 03장 …」 이면 부문 「공통」 */
export function bookTree<T extends { book: string | null; chapter: string }>(
items: T[],
leaf: (item: T, division: string) => TreeNode,
id: (parts: string[]) => string,
count: (list: T[]) => number,
): TreeNode[] {
const books = new Map<string, Map<string, T[]>>();
for (const it of items) {
const division = /^(\S+) \d+장/.exec(it.chapter)?.[1] ?? "";
const divs = books.get(it.book ?? "") ?? new Map<string, T[]>();
divs.set(division, [...(divs.get(division) ?? []), it]);
books.set(it.book ?? "", divs);
}
return [...books].map(([book, divs]) => ({
id: id([book]),
label: book,
count: count([...divs.values()].flat()),
children: [...divs].flatMap(([division, list]) =>
division
? [
{
id: id([book, division]),
label: division,
count: count(list),
children: list.map((it) => leaf(it, division)),
},
]
: list.map((it) => leaf(it, "")),
),
}));
}