egovframe-scaffold-mcp 0.34.0 → 0.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/README.en.md +3 -2
  2. package/README.md +90 -20
  3. package/package.json +5 -2
package/README.en.md CHANGED
@@ -75,7 +75,8 @@ Resources: `egovframe://catalog/components`, `…/components/{id}`, `…/templat
75
75
  ## How it stays trustworthy
76
76
 
77
77
  - **Pinned sources**: component catalog (official v5.0.6 tag, commit, archive sha256), Initializr zip templates (commit, sha256, size), config templates (commit, per-file sha256, CRLF-safe), migration rules derived from `egovframe-runtime` tags v3.10.0 / v4.3.0-Final / v5.0.2-Final and `egovframe-common-components` v3.10.0 / v5.0.6, dependency baseline extracted from the official 5.x parent poms (5.0.2), `spring-boot-dependencies` 3.5.6 and the RTE 5.0.2 module poms — every pom with url and sha256. `sync_egovframe_templates` reports when any of these drifts upstream.
78
- - **Release gate**: `npm run prepublishOnly` runs the build and ~25 offline suites (over 1,100 assertions) on ubuntu and windows × Node 18/20/22; an integration job downloads real upstream assets, compiles generated CRUD and a migrated 3.10 project with JDK 17, and checks that every migration target coordinate exists in the Maven repositories.
78
+ - **Release gate**: `npm run prepublishOnly` runs the build and ~28 offline suites (over 1,300 assertions) on ubuntu and windows × Node 18/20/22; an integration job downloads real upstream assets, compiles generated CRUD and a migrated 3.10 project with JDK 17, checks that every migration target coordinate exists in the Maven repositories, watches upstream drift of the bundled rules and baseline, and validates `server.json` against the MCP Registry.
79
+ - **Automated releases** (v0.35+): once a PR is merged and CI passes on `main`, `release.yml` publishes to npm with OIDC trusted publishing (provenance attached, no tokens), tags the verified commit, creates the GitHub Release from the changelog and publishes to the MCP Registry with GitHub OIDC — only when the version in `package.json`, `server.json` and the changelog agree and the version is not released yet.
79
80
  - **Protocol metadata**: every tool carries ko/en `title` and MCP annotations (`readOnlyHint`, `destructiveHint`, `idempotentHint`, `openWorldHint`); the five diagnostic tools also declare `outputSchema` and return `structuredContent`.
80
81
  - **Safety**: transactions with structured rollback reports, `dryRun` everywhere, allowed roots with realpath checks, zip-slip guards, process-tree kill on build timeouts.
81
82
 
@@ -92,7 +93,7 @@ Auto items (coordinates, package prefixes and renames, javax→jakarta packages
92
93
 
93
94
  ## MCP Registry
94
95
 
95
- The server is described for the [MCP Registry](https://registry.modelcontextprotocol.io) by `server.json` (`io.github.EricSeokgon/egovframe-scaffold-mcp`) and the matching `mcpName` in `package.json`. Publishing happens after the npm release with `mcp-publisher login github && mcp-publisher publish`.
96
+ The server is described for the [MCP Registry](https://registry.modelcontextprotocol.io) by `server.json` (`io.github.EricSeokgon/egovframe-scaffold-mcp`) and the matching `mcpName` in `package.json`. CI publishes it right after the npm release (`mcp-publisher login github-oidc && mcp-publisher publish`); `mcp-publisher validate` runs in CI on every change.
96
97
 
97
98
  ## License
98
99
 
package/README.md CHANGED
@@ -13,11 +13,11 @@
13
13
  Claude, VS Code(Copilot), Cursor 등 MCP를 지원하는 AI 도구에서 **대화 중 즉시** 표준프레임워크
14
14
  프로젝트를 만들고 공통컴포넌트·AI 계층을 조립할 수 있습니다. 기존 프로젝트 진단, 리포트, 안전한 upstream 재동기화도 지원합니다.
15
15
 
16
- 현재 v0.34.0은 **도구 27종(title·annotations·구조화 출력 5종), 공식 템플릿 22종, 설정 템플릿 21종, 5.x 전환 규칙(RTE 18모듈·클래스 331종 + 공통컴포넌트 1,089종 근거)과 적용·검증, 의존성 기준(공식 parent 관리 좌표 139종+계열 6종+Spring Boot BOM 1,473종+RTE 전이 58종)과 규칙·기준 drift 감시, 네트워크 진단·AGENTS.md 생성, 공통컴포넌트 카탈로그 190항목(리프 176종+그룹 14종)**을 제공합니다.
16
+ 현재 v0.35.0은 **도구 27종(title·annotations·구조화 출력 5종), 공식 템플릿 22종, 설정 템플릿 21종, 5.x 전환 규칙(RTE 18모듈·클래스 331종 + 공통컴포넌트 1,089종 근거)과 적용·검증, 의존성 기준(공식 parent 관리 좌표 139종+계열 6종+Spring Boot BOM 1,473종+RTE 전이 58종)과 규칙·기준 drift 감시, 네트워크 진단·AGENTS.md 생성, 공통컴포넌트 카탈로그 190항목(리프 176종+그룹 14종)**을 제공합니다.
17
17
 
18
- ## 진행 현황 (2026-10-03)
18
+ ## 진행 현황 (2026-10-04)
19
19
 
20
- - **소스 기준**: v0.34.0(`package.json`), 도구 27종·공식 템플릿 22종·설정 템플릿 21종·카탈로그 190항목.
20
+ - **소스 기준**: v0.35.0(`package.json`), 도구 27종·공식 템플릿 22종·설정 템플릿 21종·카탈로그 190항목.
21
21
  - **안전성 기준선 완료**: [PR #7](https://github.com/EricSeokgon/egovframe-scaffold-mcp/pull/7)~[#16](https://github.com/EricSeokgon/egovframe-scaffold-mcp/pull/16)을 반영해 provenance·strict assertion·safe remove와 프로젝트 생성/레시피/직접 조립/AI 조립/업그레이드 transaction을 갖췄습니다.
22
22
  - **v0.22.0 추가**: `EGOVFRAME_ALLOWED_ROOTS`를 19개 도구 진입점에 적용해 `..`·symlink/junction 이탈을 차단하고, 실패 시 rollback 결과를 구조화해 반환합니다. [PR #16](https://github.com/EricSeokgon/egovframe-scaffold-mcp/pull/16)은 7파일(+340/−31), 로컬 16종 스위트 전체 통과 후 병합됐습니다.
23
23
  - **v0.23.0 추가**: `build_egovframe_project` — 생성한 프로젝트를 실제로 빌드(maven/gradle·mvnw/gradlew 자동 감지)하고 컴파일·테스트 오류를 파일/라인 단위로 구조화해 생성→검증 루프를 완성합니다. 타임아웃·로그 상한·허용 root·dryRun 포함. [PR #18](https://github.com/EricSeokgon/egovframe-scaffold-mcp/pull/18)은 4파일(+458/−3), 오프라인 40단언과 실제 spawn 경로를 검증했습니다.
@@ -32,6 +32,7 @@ Claude, VS Code(Copilot), Cursor 등 MCP를 지원하는 AI 도구에서 **대
32
32
  - **v0.30.0 추가**: `migrate_egovframe_project` 2단계(`apply=true`) — 진단의 auto 항목을 하나의 transaction 으로 실제 치환합니다(dryRun 기본, 원본 `migration-backup/` 보관, `migration-plan.json`, 실패 시 복구). 3.10 좌표·javax 픽스처를 적용한 뒤 JDK 17 `mvn compile` 통과를 CI 에서 확인합니다. `check_egovframe_dependencies` — 공식 5.x parent 2종에서 추출한 기준(관리 좌표 139종 + BOM 계열 7종, `catalog/dependency-baseline.json`)과 의존성을 대조해 기준 충족/미만/parent 관리/전환 대상/교체 필요/기준 없음으로 분류하고, 보안 설정(sec.security·CSRF·XSS 필터·보안 헤더·HTTPS 저장소) 존재 여부를 근거와 함께 보고합니다. 기본 오프라인, `offline=false` 면 OSV 취약점 조회(설계: [docs/design-dependency-check.md](docs/design-dependency-check.md)).
33
33
  - **v0.31.0 추가**: 운영 편의 — `diagnose_egovframe_network`(도구가 쓰는 호스트 7종에 DNS·HEAD 프로브, 실패 종류 분류, HTTPS_PROXY+NODE_USE_ENV_PROXY·IPv4 우선·사내 CA 처방을 bash/cmd/PowerShell 명령으로), 모든 다운로드 실패 메시지에 같은 처방 한 줄 부착, `generate_agents_md`(진단 결과로 AI 코딩 도구용 AGENTS.md, ko/en), 영문 README(`README.en.md`)와 `EGOVFRAME_LANG=en` 영문 도구 설명, MCP Registry 메타데이터(`server.json`·`mcpName`). 기획 3개 버전(v0.29–v0.31)이 모두 완료됐습니다.
34
34
  - **v0.32.0 추가**: MCP 프로토콜 현대화 — 도구 27종을 `registerTool` 로 전환해 `title`(ko/en)과 annotations(`readOnlyHint` 14종·`destructiveHint` 4종·`idempotentHint`·`openWorldHint`)를 `tools/list` 에 노출하고, `format=json` 을 제공하던 5종(`diagnose_egovframe_project`·`validate_egovframe_project`·`migrate_egovframe_project`·`check_egovframe_dependencies`·`diagnose_egovframe_network`)은 `outputSchema` 와 `structuredContent` 를 함께 돌려줍니다(기존 `text` 유지). 테스트 이식성 가드(`scripts/check-test-portability.mjs`, 게이트 포함)와 플랫폼 주입 단언으로 Windows 전용 실패 재발을 막습니다.
35
+ - **v0.35.0 추가**: 릴리스 자동화 — `main` 에서 CI 가 성공하면 `release.yml` 이 네 조건(`server.json` 버전 일치·변경 이력 항목·태그 없음·npm 미배포)을 검사해 npm(OIDC trusted publishing, provenance 자동) → 그 커밋에 태그 → GitHub Release(변경 이력에서 추출) → MCP Registry(GitHub OIDC) 순으로 게시합니다. 사람은 PR 병합만 합니다. 게이트에 `test:release`(판정 함수·릴리스 노트·`npm pack` 내용·크기 상한)와 `server.json` 설명 100자 제한(레지스트리 검증 조건 — 실제 `mcp-publisher validate` 로 발견한 결함 수정)을 추가했습니다.
35
36
  - **v0.34.0 추가**: 의존성 기준 완성 + 규칙·기준 drift 감시 — `check_egovframe_dependencies` 의 기준에 **Spring Boot BOM 전체**(`spring-boot-dependencies` 3.5.6 직접 항목 + BOM import 44종을 한 단계 풀어 1,473 좌표)와 **RTE 모듈 18종의 전이 의존성**(58 좌표, 어느 모듈이 끌어오는지)을 더해 항목마다 기준 출처(parent 직접·계열·Boot BOM·RTE 전이·전환 규칙)를 표시하고, 국내 벤더·기관 배포 좌표는 `vendor` 로, EOL·이전 좌표(옛 MySQL/Oracle 드라이버·Jackson 1·xmlbeans·Ehcache 2·HttpClient 4·ANTLR 3·Spring Social)는 교체 규칙으로 분류해 공식 공통컴포넌트 3.10 pom 의 '기준 없음'을 17 → 1 로 줄였습니다. `sync_egovframe_templates` 가 동봉 규칙·기준의 upstream drift(`egovframe-runtime`·공통컴포넌트 새 태그, 공식 parent 새 버전, 고정 pom sha256 변화)를 갱신 절차와 함께 보고합니다. 기준 parent 를 5.0.2 로 올렸습니다.
36
37
  - **v0.33.0 추가**: `migrate_egovframe_project` 3단계 — `verify=true` 가 compile 을 실행해 컴파일 오류를 수동 항목과 연결하고 "처리하면 해결될 오류 수" 순 작업 목록을 냅니다(javac `symbol:`/`location:` 파싱). 규칙 카탈로그(schemaVersion 2)에 공통컴포넌트 3.x→5.x 대응표(`egovframe-common-components` v3.10.0↔v5.0.6, 제거 54·이동 4)를 추가해 `egovframework.com.*` 제거·이동 클래스를 진단하고, 3.x 공통컴포넌트 소스가 섞인 프로젝트에는 컴포넌트 단위 재조립 권고(`skipComponents` 로 치환 제외)를 냅니다.
37
38
  - **다음 계획**: v0.34 의존성 기준 완성·drift 감시. [다음 버전 기획](#다음-버전-기획-v032v034) 참조.
@@ -292,6 +293,7 @@ curl "https://registry.modelcontextprotocol.io/v0.1/servers?search=io.github.Eri
292
293
  - 조립 레벨: 실제 공통컴포넌트 저장소로 bbs+login+sec.security(+cmm) 843파일 조립, message·IDGN·웹 자산·공용 fragment·Maven 좌표·선별 DB 스크립트·충돌 전체 거부·파일/SQL/매니페스트 fault-injection rollback·상위 symlink 경계 검증 (`npm run test:components`)
293
294
  - 수명주기 레벨: 설치 매니페스트 기록, 중복 설치 거부, 의존 컴포넌트 제거 보호, 제거·검증 동작 (`npm run test:components`)
294
295
  - 프로토콜 레벨: 빌드된 서버를 실제 프로세스로 띄워 MCP initialize / tools/list 핸드셰이크, `serverInfo.version`↔`package.json` 일치, 핵심 도구 노출, `jdk` 패턴 제약 노출 확인 (`npm run test:handshake`, 네트워크 불필요)
296
+ - 릴리스 레벨: 배포 판정(버전·`server.json`·변경 이력·태그·npm 네 조건)과 릴리스 노트 추출, `npm pack --dry-run` 의 tarball 내용(포함·제외·크기 상한), `server.json` 설명 100자 제한 (`npm run test:release`·`npm run test:registry`, 네트워크 불필요); CI 통합이 `mcp-publisher validate` 로 레지스트리 스키마를 실제 검증
295
297
  - 플랫폼 레벨: CI가 릴리스 게이트를 ubuntu·windows × Node 18·20·22 매트릭스로 실행하고, 공식 저장소를 내려받는 통합 테스트는 ubuntu/Node 20에서 실행합니다. 타임아웃 시 프로세스 트리 종료는 POSIX·Windows 모두 실제 프로세스로 검증합니다 (`npm run test:build`).
296
298
  - 레시피 레벨: `catalog/recipes.json`의 컴포넌트 id·의존성·템플릿 제공 컴포넌트 정합 검증 (`npm run test:recipes`, 네트워크 불필요). 공식 `simple-backend`의 기존 `cmm`을 보존하고 board-login의 bbs 88파일·login 41파일·SQL 4건(총 133파일)을 조립한 뒤 검증하며, 컴포넌트 이후 fault injection의 전체 staging rollback도 확인 (`npm run test:recipe-transaction`)
297
299
  - 진단 레벨: 픽스처(pom·DbType·컴포넌트 패키지)로 `diagnose_egovframe_project`의 빌드·버전·DbType·컴포넌트 지문·의존성 검출 검증 (`npm run test:diagnose`, 네트워크 불필요)
@@ -327,7 +329,7 @@ curl "https://registry.modelcontextprotocol.io/v0.1/servers?search=io.github.Eri
327
329
 
328
330
  v0.31.0까지 프로젝트·CRUD 생성, 검증된 공통컴포넌트 실행 자산 조립, 안전성 기반(테스트 판정 강제·사용자 파일 보호·전 도구 트랜잭션·허용 root·구조화 rollback 보고), 생성→검증 루프(실제 빌드·오류 구조화·테스트 리포트 구조화), 공식 템플릿 카탈로그 단일화와 커버리지 확대(22종 중 21종), 설정 파일 생성, 5.x 전환(진단·적용), 의존성 점검, 운영 편의(네트워크 진단·AGENTS.md·영문 설명·레지스트리 메타데이터)를 완료했습니다.
329
331
 
330
- 다음 세 버전(v0.32–v0.34)의 범위는 [다음 버전 기획](#다음-버전-기획-v032v034)에 있습니다. Homebrew 탭은 계속 후순위입니다.
332
+ v0.32–v0.34 로 MCP 프로토콜 현대화, 5.x 전환 3단계(검증)와 공통컴포넌트 대응표, 의존성 기준 완성과 규칙·기준 drift 감시를 마쳤습니다. 다음 세 버전(v0.35–v0.37)의 범위는 [다음 버전 기획](#다음-버전-기획-v035v037)에 있습니다. Homebrew 탭은 계속 후순위입니다.
331
333
 
332
334
  | 버전 | 핵심 기능 | 목표 |
333
335
  |---|---|---|
@@ -346,10 +348,76 @@ v0.31.0까지 프로젝트·CRUD 생성, 검증된 공통컴포넌트 실행 자
346
348
  | **v0.32 완료** | MCP 프로토콜 현대화 | `registerTool` 전환(deprecated `tool()` 0건), 도구 27종에 ko/en `title`·annotations(readOnly 14·destructive 4·openWorld), 5종 `outputSchema`+`structuredContent`, 테스트 이식성 검사 스크립트(게이트)와 플랫폼 주입 단언 |
347
349
  | **v0.33 완료** | `migrate_egovframe_project` 3단계: 검증 | `verify=true` 로 compile 오류 ↔ 수동 항목 연결 작업 목록(javac symbol/location 파싱, 연결 4단계), 공통컴포넌트 3.x→5.x 대응표(제거 54·이동 4, schemaVersion 2)와 재조립 권고·`skipComponents` |
348
350
  | **v0.34 완료** | 의존성 기준 완성 + drift 감시 | Spring Boot BOM 전체(1,473종)·RTE 모듈 전이 의존성(58종)을 기준에 포함하고 항목마다 기준 출처 표시, `vendor` 분류·EOL 좌표 교체 규칙으로 공통컴포넌트 3.10 pom 의 `unknown` 17 → 1, `sync_egovframe_templates` 가 규칙·기준 카탈로그의 upstream drift(새 태그·새 parent·pom sha256)와 갱신 절차 보고 |
351
+ | **v0.35 완료** | 릴리스 자동화 (배포 공급망) | `release.yml`: `main` 의 CI 성공 → 네 조건 검사 → npm(OIDC trusted publishing, provenance) → 그 커밋에 태그 → GitHub Release(변경 이력 추출) → MCP Registry(OIDC). `test:release`(판정·노트·tarball 내용·크기), `server.json` 설명 100자 제한, CI 통합의 `mcp-publisher validate` |
352
+ | **v0.36 계획** | 해석된 의존성 트리 + SBOM | `check_egovframe_dependencies(resolve=true)` 가 빌드 도구로 전이 의존성까지 해석해 기준·OSV 대조, 새 도구 `generate_egovframe_sbom` 이 CycloneDX 1.6 SBOM(빌드 파일 변경 없이)과 기준 판정·취약점을 함께 생성 |
353
+ | **v0.37 계획** | 전환 준비도 평가서 + 회귀 코퍼스 | 진단·전환·의존성·보안·SBOM 을 한 번에 묶은 평가 리포트(`generate_egovframe_report` 확장), 공식 3.x/4.x 자산으로 전환·점검 결과를 고정하는 회귀 코퍼스(4.x→5.x 경로 포함) |
349
354
 
350
- ## 다음 버전 기획 (v0.32–v0.34)
355
+ ## 다음 버전 기획 (v0.35–v0.37)
351
356
 
352
- v0.31.0 까지 끝난 상태(2026-10-02, 도구 27종, 테스트 약 1,100건)에서 다음 세 릴리스를 아래 순서로 진행합니다. 공통 원칙은 이전과 같습니다 — 규칙은 데이터로, 근거는 공식 저장소에서, 쓰기 도구는 dryRun·transaction, 각 버전은 "완료 정의"를 만족해야 릴리스합니다. 선행 조사 근거는 맨 아래 "선행 조사 결과 (2026-10-02)"에 있습니다.
357
+ v0.34.0 까지 끝난 상태(2026-10-04, 도구 27종, 테스트 약 1,300건, npm 0.33.1 배포·0.34.0 배포 대기)에서 다음 세 릴리스를 아래 순서로 진행합니다. 공통 원칙은 이전과 같습니다 — 규칙은 데이터로, 근거는 공식 저장소에서, 쓰기 도구는 dryRun·transaction, 각 버전은 "완료 정의"를 만족해야 릴리스합니다. 이번 세 버전의 공통 주제는 **배포와 운영을 사람 손에서 떼어 내는 것**(v0.35), **선언된 의존성이 아니라 실제로 실리는 의존성을 보는 것**(v0.36), **지금까지 만든 분석을 한 장의 평가서와 회귀 코퍼스로 묶는 것**(v0.37)입니다. 선행 조사 근거는 맨 아래 "선행 조사 결과 (2026-10-04)"에 있습니다.
358
+
359
+ ### v0.35.0 — 릴리스 자동화 (배포 공급망)
360
+
361
+ **목표**: v0.29–v0.34 여섯 번의 릴리스에서 태그를 잘못된 커밋에 단 일(2회), npm 배포를 빠뜨린 일(0.32.0·0.33.0), Windows 게이트 실패 상태로 병합한 일(2회)이 모두 사람이 명령을 순서대로 치는 과정에서 났습니다. `main` 에 병합되면 나머지(게이트 재확인 → 태그 → npm → GitHub Release → MCP Registry)는 CI 가 하고, 사람은 PR 병합만 합니다. 배포물에는 provenance 가 붙어 "이 npm 패키지는 이 저장소의 이 커밋에서 이 워크플로가 만들었다"를 소비자가 검증할 수 있게 합니다.
362
+
363
+ **범위 (포함)**
364
+ - `.github/workflows/release.yml`: CI 워크플로가 `main` 에서 성공한 뒤(`workflow_run`)에만 실행. `package.json` 버전을 읽어 (a) `server.json` 두 `version` 과 같고, (b) README 변경 이력에 그 버전 항목이 있고, (c) 태그 `vX.Y.Z` 가 아직 없고, (d) npm 에 그 버전이 없을 때만 진행합니다. 네 조건 중 하나라도 어긋나면 이유를 적고 성공 종료(병합마다 도는 워크플로가 빨간불이 되지 않게).
365
+ - npm: **trusted publishing(OIDC)** 으로 토큰 없이 `npm publish --access public`. 공개 저장소·공개 패키지이므로 provenance 가 자동으로 붙습니다. 요구 조건은 npm CLI 11.5.1+·Node 22.14+·`id-token: write`·self-hosted 러너 금지이며, npmjs.com 의 패키지 설정에서 trusted publisher(저장소 `EricSeokgon/egovframe-scaffold-mcp`, 워크플로 파일명 `release.yml`)를 **저장소 소유자가 한 번 등록**해야 합니다(README 절차에 적음).
366
+ - 태그·Release: 배포가 성공한 **그 `main` 커밋**에 `vX.Y.Z` 태그를 만들고, `scripts/release-notes.mjs` 가 README 변경 이력에서 해당 버전 항목을 뽑아 GitHub Release 본문으로 씁니다(태그가 병합 전 커밋에 달리는 사고가 구조적으로 사라집니다).
367
+ - MCP Registry: `mcp-publisher login github-oidc` → `mcp-publisher publish`(`io.github.EricSeokgon/*` 네임스페이스는 GitHub OIDC 로 소유 증명, 비밀 없음). npm 에 패키지가 먼저 있어야 하므로 npm 단계 뒤에 둡니다. 첫 실행이 곧 "MCP Registry 첫 등록"(보류 항목)이 됩니다.
368
+ - 패키지 내용 검사: `npm pack --dry-run --json` 으로 tarball 에 `dist/`·`catalog/`·`server.json`·`README*`·`LICENSE` 만 들어가고 `test/`·`scripts/`·`.github/` 가 없는지, 크기 상한(현재 약 1.2MB → 2MB)을 넘지 않는지 게이트에서 단언(`test:package`). `test:registry` 에 "변경 이력에 현재 버전 항목 존재" 단언 추가(변경 이력 누락을 게이트가 막음).
369
+ - README 릴리스 절차를 "PR 병합 → CI 가 나머지 수행 → `npm view`·Release 페이지 확인" 3단계로 줄이고, 수동 절차는 비상용으로만 남깁니다.
370
+
371
+ **범위 (제외)**: 브랜치 보호 설정(저장소 설정이라 코드로 못 함 — 보류 항목에 유지), Homebrew 탭, Windows 서명
372
+
373
+ **검증 기준**: `test:package`·`test:registry` 게이트 통과. 워크플로는 실제 병합으로만 검증할 수 있으므로 v0.35.0 자체는 마지막 수동 릴리스로 내고, 병합 직후 `release.yml` 의 "조건 불충족 → 성공 종료" 경로(이미 태그·npm 이 있음)를 로그로 확인합니다. v0.36.0 부터 자동 배포. 배포 뒤 `npm view egovframe-scaffold-mcp --json` 의 `dist.attestations` 와 GitHub Release·MCP Registry 검색 결과를 확인합니다.
374
+
375
+ **완료 정의**: 도구 27종(변화 없음), `release.yml` 병합, npmjs.com trusted publisher 등록(소유자 수동 1회, README 에 체크리스트), v0.36.0 이 사람 명령 없이 npm·태그·Release·Registry 에 게시
376
+
377
+ **결과(2026-10-04) — 완료**: `release.yml`(`workflow_run: CI` 성공 후, `workflow_dispatch` 로 수동 재실행 가능) + `scripts/release-check.mjs`(네 조건 판정, `GITHUB_OUTPUT`) + `scripts/release-notes.mjs`(변경 이력 항목 → Release 본문에 설치 스니펫·검증 안내) + `test/release.mjs` 32단언. 기획과 달라진 점: (1) `mcp-publisher validate` 를 실제로 돌려 보니 `server.json` 의 `description` 이 레지스트리 상한 100자를 넘어 첫 등록이 실패할 상태였습니다 — 98자로 줄이고 `test:registry` 가 100자 이하를 단언하며, CI 통합과 `release.yml` 이 npm 게시 **전에** `validate` 를 돌립니다(npm 에 없는 버전도 스키마 검증은 통과함을 확인). (2) 레지스트리 게시 단계는 `continue-on-error` 로 두어 npm·태그·Release 가 끝난 뒤의 실패가 릴리스 자체를 되돌리지 않게 하고 경고로 남깁니다. (3) 릴리스 노트는 변경 이력 항목의 "(1) (2)" 번호 앞에서 단락을 나눠 읽기 쉽게 합니다. 바이너리는 `mcp-publisher v1.8.1`(자산 이름 `mcp-publisher_<os>_<arch>.tar.gz`, 버전 접두 없음)로 고정했습니다. v0.35.0 자체는 마지막 수동 릴리스이며, 병합 뒤 `release.yml` 이 "태그·npm 이미 있음 → 배포 안 함" 으로 성공 종료하는지 확인합니다.
378
+
379
+ ### v0.36.0 — 해석된 의존성 트리 + SBOM
380
+
381
+ **목표**: `check_egovframe_dependencies` 는 pom 에 **적힌** 의존성만 봅니다. 공식 `egovframe-web` 템플릿은 선언 19건·조치 0건이지만, Maven 으로 실제 해석하면 런타임에 **69개 artifact** 가 실리고 그중 11개가 기준 미만, 9개가 기준 밖, 8개에 OSV 권고가 붙어 있습니다(선행 조사). 전이 의존성까지 보는 `resolve=true` 와, 2027년부터 공공기관 SW 등록에 요구될 SBOM 을 표준 형식(CycloneDX 1.6)으로 만들어 주는 도구를 추가합니다.
382
+
383
+ **범위 (포함)**
384
+ - `check_egovframe_dependencies(resolve=true, resolveScope="runtime"|"all", timeoutMs)`: `build_egovframe_project` 의 러너(타임아웃·프로세스 트리 종료·래퍼 감지)로 Maven `org.apache.maven.plugins:maven-dependency-plugin:3.8.1:tree -DoutputFile -DoutputType=text`(pom 변경 없이 좌표를 완전히 적어 호출) 또는 Gradle `dependencies --configuration runtimeClasspath` 를 실행해 트리를 파싱합니다. 결과 `findings` 에 `origin: "declared" | "transitive"` 와 `via`(트리 경로, 예 `egovframe-rte-ptl-mvc → spring-webmvc`)를 붙이고, 해석된 집합 전체를 기존 분류기(parent → 계열 → Boot BOM/RTE 전이, v0.34)로 판정합니다. `summary` 는 선언/해석을 나눠 세고, 선언한 버전과 해석된 버전이 다른 좌표(가까운 선언이 이김)는 `resolvedDiffers` 로 따로 보입니다. `offline=false` 면 OSV 조회도 해석된 집합에 대해 합니다. 빌드 도구가 없거나 해석이 실패하면 선언 기준 결과에 이유를 붙여 돌려줍니다(기존 동작 유지).
385
+ - 새 도구 `generate_egovframe_sbom(projectDir, format="cyclonedx-json", outputPath="sbom/bom.cdx.json", enrich=true, offline=true, dryRun=true)`: Maven 은 `org.cyclonedx:cyclonedx-maven-plugin:2.9.3:makeAggregateBom`(멀티 모듈 합산, pom 변경 없음), Gradle 은 `--init-script` 로 `cyclonedx-gradle-plugin` 3.4.1 을 적용(빌드 파일 변경 없음)해 CycloneDX **1.6 JSON** 을 만듭니다. `enrich=true` 면 component 마다 `properties` 에 `egovframe:status`(기준 판정)·`egovframe:basis`·`egovframe:baseline` 을 붙이고, `offline=false` 면 OSV 결과를 CycloneDX `vulnerabilities[]`(`affects` 로 component 참조)로 넣습니다. 출력은 프로젝트 안 경로만 허용, 기존 파일은 `overwrite=true` 가 아니면 거부, transaction·dryRun(요약만) 적용. 응답은 component 수·직접/전이 수·판정 집계·취약점 수·파일 경로.
386
+ - 도구 메타: `generate_egovframe_sbom` 은 `openWorldHint`(빌드 도구가 저장소 접근)·비파괴(새 파일만, overwrite 는 명시)·`outputSchema` 선언. 영문 설명·README·AGENTS.md 생성기(사용 가능 도구 목록)에 반영.
387
+ - 기준 카탈로그 소급: 선행 조사에서 드러난 공통컴포넌트 4.3.2 pom 의 `project:*` groupId(system scope 로 로컬 jar 를 붙이는 관행)는 `vendor` 로 분류하고 사유에 "system scope 로컬 jar — SBOM 에서 공급자 확인 필요" 를 적습니다.
388
+
389
+ **범위 (제외)**: SPDX 형식(요구가 생기면 CycloneDX → SPDX 변환기로), 취약점 DB 동봉, 라이선스 정책 판정(SBOM 에 라이선스는 플러그인이 넣는 그대로)
390
+
391
+ **검증 기준**: 공식 `egovframe-web` 템플릿(자리표시자 채운 pom)에서 `resolve=true` 가 60개 이상 해석·`transitive` 표시·`via` 경로 존재, SBOM 이 `bomFormat: CycloneDX`·`specVersion: 1.6`·component 60개 이상·모든 component 에 `purl`(`pkg:maven/…`)·`enrich` 속성 존재; `offline=false` 로 `vulnerabilities[]` 가 OSV 결과와 같은 수; Gradle 템플릿(`egovframe-boot-web` 를 Gradle 로 변환한 픽스처 또는 공식 Gradle 샘플)에서 init script 경로 통과; 오프라인 테스트는 트리 파서(Maven·Gradle 출력 픽스처)와 SBOM 보강을 가짜 러너로 단언; CI 통합에 실제 Maven 해석·SBOM 생성 추가
392
+
393
+ **완료 정의**: 도구 28종, `test:dependencies` 에 해석 경로 단언, 신규 `test:sbom`(오프라인)·`test:sbom-live`(CI), `docs/design-dependency-check.md` 에 해석·SBOM 절, README 에 SBOM 사용 예
394
+
395
+ ### v0.37.0 — 전환 준비도 평가서 + 회귀 코퍼스
396
+
397
+ **목표**: 공공 SI 현장에서 "이 3.x/4.x 시스템을 5.x 로 옮기면 무엇이 얼마나 걸리고, 지금 공급망 상태는 어떤가"를 묻는 데 답하려면 지금은 도구 다섯 개를 차례로 불러야 합니다. 한 번의 호출로 평가서를 만들고, 공식 3.x/4.x 자산에 대한 결과를 코퍼스로 고정해 규칙·기준이 바뀔 때 회귀를 잡습니다.
398
+
399
+ **범위 (포함)**
400
+ - `generate_egovframe_report(sections=["assessment"], resolve=false, offline=true)`: 기존 리포트(진단)에 평가서 절을 추가 — (1) 프로젝트 개요(빌드 도구·RTE 세대·parent·Java·공통컴포넌트), (2) 전환 범위(`migrate_egovframe_project` 진단 요약: auto/manual, 종류별, 파일 수, 재조립 권고 컴포넌트, 예상 수동 작업 목록 상위 N), (3) 의존성(기준 판정 집계·조치 목록·`resolve=true` 면 전이 포함·OSV), (4) 보안 설정 점검, (5) SBOM 요약(만들었으면 경로·component 수), (6) **등급과 근거**: 전환 난이도(수동 항목 수·재조립 컴포넌트 수·제거 클래스 참조 수를 구간으로)와 공급망 상태(기준 미만·교체 필요·취약점 수)를 각각 A–D 로 매기되, 등급 산식을 리포트 안에 그대로 적어 사람이 재계산할 수 있게 합니다. Markdown 과 `format=json`(`outputSchema`), 선택적으로 `outputPath` 에 파일로 저장(transaction·dryRun).
401
+ - 회귀 코퍼스 `test:migrate-corpus`(CI 통합): 공식 `egovframe-common-components` **v3.10.0**(1,148 java)과 **v4.3.2**(1,295 java, 4.x 좌표 `org.egovframe.rte:org.egovframe.rte.*`) 소스 트리 전체에 진단·적용(dryRun)·의존성 점검을 돌려 종류별 건수·`unknown`·재조립 권고·적용 계획 수를 `catalog/migration-corpus.json` 에 기대값으로 고정하고 ±허용 범위 안인지 단언합니다. 4.x→5.x 경로는 지금까지 단위 픽스처로만 검증했으므로 실제 자산으로 처음 확인하는 셈입니다. 코퍼스 결과는 평가서 등급 산식의 구간을 정하는 근거로도 씁니다.
402
+ - 코퍼스가 드러내는 결함 수정(선행 조사에서 이미 하나: 4.3.2 pom 의 `project:*` system scope jar 11건이 `unknown` — v0.36 에서 `vendor` 로 소급; 그 밖에 `javax.faces` 등 미처리 Jakarta 좌표가 있으면 매핑에 추가).
403
+
404
+ **범위 (제외)**: 비용·공수 산정(사람·조직마다 다름 — 건수와 등급까지만), PDF/HWP 출력(Markdown 을 변환하는 것은 호출자의 몫)
405
+
406
+ **검증 기준**: 코퍼스 2종(3.10.0·4.3.2) 기대값 고정 후 게이트·CI 통과, 평가서가 공식 5.x 템플릿에서 "전환 범위 0·등급 A", 3.10 자산에서 수동 항목·재조립 권고가 등급 근거로 나타남, `format=json` 이 `outputSchema` 통과, 등급 산식 재계산 테스트
407
+
408
+ **완료 정의**: 도구 28종(평가서는 기존 도구 확장), `catalog/migration-corpus.json`, `docs/design-assessment-report.md`, README 에 평가서 예시
409
+
410
+ ### 보류·운영 항목
411
+
412
+ - **npm trusted publisher 등록(소유자 1회, v0.36 첫 자동 배포 전)**: npmjs.com → 패키지 `egovframe-scaffold-mcp` → Settings → Trusted publishing → GitHub Actions: owner `EricSeokgon`, repository `egovframe-scaffold-mcp`, workflow filename `release.yml`(environment 비움). 등록 전에는 `release.yml` 의 npm 단계가 실패합니다(태그·Release 도 그 뒤 단계라 만들어지지 않음 — 등록 후 Actions 에서 `Release` 워크플로를 `Run workflow` 로 다시 실행하면 됩니다).
413
+ - **MCP Registry 첫 등록**: v0.36.0 자동 배포가 OIDC 로 수행합니다(현재 레지스트리 검색 결과 0건). v0.35.0 을 수동으로 올리려면 `mcp-publisher login github && mcp-publisher publish`(server.json 은 검증 통과 상태).
414
+ - **브랜치 보호**: #33·#36 이 Windows gate 실패 상태로 병합됐습니다. `main` 규칙에 "Require status checks to pass"(gate 6 + integration)를 켜 두면 재발하지 않습니다.
415
+ - **기준 없음 잔여**: 공통컴포넌트 3.10 pom 의 `xerces:xercesImpl` 은 공개 기준이 없어 그대로 둡니다(JDK 내장 파서로 충분하면 제거 권고를 규칙에 넣을 수 있음).
416
+ - Homebrew 탭, Initializr upstream 이슈 3건 제출, 응답 본문 영문화(`EGOVFRAME_LANG=en` 은 현재 도구 설명만)는 계속 후순위입니다.
417
+
418
+ ## 이전 기획 (v0.32–v0.34, 완료)
419
+
420
+ v0.31.0 까지 끝난 상태(2026-10-02, 도구 27종, 테스트 약 1,100건)에서 다음 세 릴리스를 아래 순서로 진행했습니다. 세 버전 모두 2026-10-03 까지 완료했으며 기획 원문은 기록으로 남기고 결과를 항목 아래에 적었습니다. 공통 원칙은 이전과 같습니다 — 규칙은 데이터로, 근거는 공식 저장소에서, 쓰기 도구는 dryRun·transaction, 각 버전은 "완료 정의"를 만족해야 릴리스합니다. 선행 조사 근거는 맨 아래 "선행 조사 결과 (2026-10-02)"에 있습니다.
353
421
 
354
422
  ### v0.32.0 — MCP 프로토콜 현대화 + 테스트 플랫폼 중립 가드
355
423
 
@@ -404,13 +472,6 @@ v0.31.0 까지 끝난 상태(2026-10-02, 도구 27종, 테스트 약 1,100건)
404
472
 
405
473
  **결과(2026-10-03) — 완료**: 기준 파일 `schemaVersion` 2 에 `boot`(spring-boot-dependencies 3.5.6 직접 362 + import 44종 → 1,473 좌표, 충돌 1건은 Maven 순서대로 직접 항목 유지)와 `rteTransitive`(모듈 18종 pom → 58 좌표, 버전·scope·`via`)를 넣었고 크기는 150KB 입니다. 기획과 달라진 점: (1) 표준프레임워크 저장소가 `maven-metadata.xml`·디렉터리 목록을 막아 두어 "최신 parent 버전" 대신 다음 patch 3개·minor·major 후보를 HEAD 로 탐침합니다 — 이 탐침이 기준(5.0.1)보다 새 parent 5.0.2 를 찾아 이번에 기준을 5.0.2 로 올렸습니다(차이는 RTE 버전뿐). (2) 태그 조회는 GitHub API 가 막히면 태그 페이지(HTML)로 대체합니다(`GITHUB_TOKEN` 이 있으면 API 에 씀). (3) 계열 규칙이 `org.springframework.social`·`.ldap` 까지 `org.springframework` 로 묶던 결함을 고쳐 groupId 정확 일치(jackson 만 하위 포함)로 좁히고 달력형 릴리스 트레인(`spring-cloud-dependencies`)은 계열에서 뺐습니다. (4) 공통컴포넌트 3.10 pom 의 `unknown` 17건 가운데 공개 기준이 있을 수 없는 국내 벤더·기관 배포 6건은 새 분류 `vendor`(사유 표시)로, EOL·이전 좌표 8건은 전환 규칙 `libraries` 에 교체 규칙을 추가해(`migrate_egovframe_project` 의 manual 항목으로도 나옵니다) 남은 `unknown` 은 `xerces:xercesImpl` 1건입니다. 검증: 공식 `egovframe-boot-web`·`egovframe-web` 템플릿 pom `unknown` 0, drift 테스트는 오프라인 주입 26단언 + CI 통합 실제 조회, 기준 생성은 `--cache`/`--offline` 으로 재현 가능(같은 입력 → 같은 파일).
406
474
 
407
- ### 보류·운영 항목
408
-
409
- - **MCP Registry 첫 등록**: npm 은 0.33.1 까지 배포됐습니다(0.33.0 은 Windows 게이트 결함으로 건너뜀). `mcp-publisher login github && mcp-publisher publish` 로 MCP Registry 에 첫 등록을 합니다(현재 레지스트리 검색 결과 0건).
410
- - **브랜치 보호**: #33 과 #36 이 Windows gate 실패 상태로 병합됐습니다. `main` 규칙에 "Require status checks to pass"(gate 6 + integration)를 켜 두면 재발하지 않습니다.
411
- - **기준 없음 잔여**: 공통컴포넌트 3.10 pom 의 `xerces:xercesImpl` 은 공개 기준이 없어 그대로 둡니다(JDK 내장 파서로 충분하면 제거 권고를 규칙에 넣을 수 있음).
412
- - Homebrew 탭, Initializr upstream 이슈 3건 제출은 계속 후순위입니다.
413
-
414
475
  ## 이전 기획 (v0.29–v0.31, 완료)
415
476
 
416
477
  v0.28.1 까지의 상태에서 다음 세 릴리스를 아래 순서로 진행합니다. 각 항목은 "완료 정의"를 만족해야 릴리스합니다. 기획 시점(2026-09-26)의 조사 근거는 맨 아래 "선행 조사 결과"에 있습니다. v0.29.0 은 2026-09-27 에 완료했으며 기획 원문은 기록으로 남기고 결과를 항목 아래에 적었습니다.
@@ -467,16 +528,24 @@ v0.28.1 까지의 상태에서 다음 세 릴리스를 아래 순서로 진행
467
528
 
468
529
  **결과(2026-09-30) — 완료**: 도구 27종. 네트워크 진단은 호스트 7종(기획의 5종 + `repo1.maven.org`·`api.osv.dev`)을 실제로 프로브하고 실패를 8종으로 분류하며, Node 가 `--use-env-proxy` 를 지원하는지 런타임에서 감지해 `NODE_USE_ENV_PROXY=1` 처방을 냅니다. 기존 다운로드 경로(`fetchWithTimeout`)는 실패 시 같은 분류와 처방 한 줄을 오류에 붙입니다. 영문은 `README.en.md` 와 `EGOVFRAME_LANG=en` 도구 설명(27종 전부, handshake 테스트가 누락을 막음)으로 제공하고 응답은 한국어를 유지합니다. MCP Registry 는 `server.json`·`mcpName` 과 정합 테스트까지 준비했고 실제 게시(`mcp-publisher publish`)는 npm 배포 뒤 저장소 소유자가 실행합니다. Homebrew 탭은 후순위 그대로입니다.
469
530
 
470
- ### 릴리스 절차 (매 버전 공통)
531
+ ### 릴리스 절차 (v0.35+, 매 버전 공통)
471
532
 
472
- 1. `main` 최신화 후 기능 브랜치 생성 → 패치 적용(`git am`) 또는 직접 커밋
533
+ 1. `main` 최신화 후 기능 브랜치 생성 → 패치 적용(`git am`) 또는 직접 커밋. 버전은 `package.json`·`server.json`(두 곳) 을 함께 올리고 README 변경 이력에 `- **X.Y.Z** — …` 항목을 쓴다(`test:release` 가 셋을 단언)
473
534
  2. `npm ci && npm run prepublishOnly` 로컬 통과(Windows 클론은 `core.autocrlf` 무관하게 통과해야 함). 테스트 기대값은 플랫폼 중립이어야 한다 — 플랫폼 분기 함수는 `platform` 을 주입해 양쪽을 단언하고, `npm run check:portability` 가 0건이어야 한다
474
- 3. 푸시 → PR → CI 7개(ubuntu·windows × Node 18/20/22 + integration) 전부 통과 → squash 병합
475
- 4. `main` 에서 `node -p "require('./package.json').version"` 으로 버전 확인 **후** 태그(`vX.Y.Z`)를 `main` 커밋에 생성·푸시
476
- 5. `npm publish` → `npm view egovframe-scaffold-mcp dist-tags.latest` 로 확인
477
- 6. (v0.31+) `server.json` 의 두 `version` 이 새 버전과 같은지 `npm run test:registry` 로 확인했으므로, 필요하면 `mcp-publisher publish` 로 MCP Registry 갱신
535
+ 3. 푸시 → PR → CI 7개(ubuntu·windows × Node 18/20/22 + integration) 전부 통과 → squash 병합. **여기까지가 사람의 일입니다.**
536
+ 4. 병합 뒤 `main` 의 CI 가 성공하면 `Release` 워크플로(`.github/workflows/release.yml`)가 `scripts/release-check.mjs` 로 네 조건(`server.json` 버전 일치·변경 이력 항목·태그 없음·npm 미배포)을 확인하고 npm(OIDC trusted publishing, provenance 자동) → 그 `main` 커밋에 `vX.Y.Z` 태그 → GitHub Release(`scripts/release-notes.mjs`) → MCP Registry(GitHub OIDC) 순으로 게시합니다. 조건이 안 맞으면 이유를 적고 성공 종료합니다(문서만 바꾼 병합은 아무것도 게시하지 않음)
537
+ 5. 확인: Actions 의 `Release` 요약, `npm view egovframe-scaffold-mcp version`, Releases 페이지, 레지스트리 검색. 레지스트리 단계만 실패하면 경고가 남고 `mcp-publisher login github && mcp-publisher publish` 로 수동 게시
538
+
539
+ 비상용 수동 절차(워크플로를 쓸 수 없을 때): `main` 에서 `node -p "require('./package.json').version"` 으로 버전 확인 **후** 태그를 `main` 커밋에 생성·푸시 → `npm publish` → `mcp-publisher publish`. 태그는 반드시 병합된 `main` 커밋에 답니다(v0.25.2·v0.28.0·v0.28.1·v0.30.0·v0.33.0 에서 잘못 단 적이 있어 자동화했습니다).
540
+
541
+ ### 선행 조사 결과 (2026-10-04)
478
542
 
479
- 태그는 반드시 병합된 `main` 커밋에 답니다. 병합 전 커밋이나 로컬 병합 커밋에 태그가 달리면 지우고 다시 답니다(v0.25.2·v0.28.0·v0.28.1 에서 각각 한 번씩 겪었습니다).
543
+ - **npm trusted publishing**: 2025-07-31 GA. npm CLI 11.5.1+·Node 22.14+, 워크플로 `permissions: id-token: write`, npmjs.com 에 trusted publisher(조직/사용자·저장소·워크플로 파일명·선택 environment) 등록. 공개 저장소·공개 패키지면 provenance 자동 첨부(`provenance=false` 로 끌 수 있음). self-hosted 러너 미지원, `workflow_call` 재사용 워크플로는 호출 워크플로 이름으로 검사되므로 단일 파일 `release.yml` 로 둡니다.
544
+ - **MCP Registry**: `mcp-publisher login github-oidc` 로 비밀 없이 로그인(`id-token: write`), `io.github.<owner>/*` 네임스페이스는 GitHub 계정 소유로 증명. 바이너리는 `github.com/modelcontextprotocol/registry/releases` 에서 OS/ARCH 별 tar.gz. npm 에 `mcpName` 이 있는 패키지가 **먼저** 게시돼 있어야 하므로 npm 단계 뒤에 실행. 저장소에는 아직 검색 결과 0건.
545
+ - **해석된 의존성**: 공식 `egovframe-web` 템플릿 pom(자리표시자만 채움)에 `maven-dependency-plugin:3.8.1:list -DincludeScope=runtime` → **67 artifact**, `cyclonedx-maven-plugin:2.9.3:makeBom -DschemaVersion=1.6` → pom 변경 없이 186KB JSON, component 69(purl·MD5/SHA 해시·라이선스 포함). 해석 집합을 v0.34 분류기로 판정하면 parent 직접 23·계열 13·RTE 전이 9·Boot BOM 4 가 `ok`, 기준 미만 11(RTE 5.0.0 7 + Boot BOM 4), 기준 없음 9(commons-collections 3·commons-logging·antlr 런타임 등), OSV 권고가 붙는 component 8(spring-webmvc/-core/-web/-webflux/-expression 6.2.11, log4j-core/-api 2.25.3, commons-configuration2 2.11.0). 선언만 보던 결과(조치 0)와 크게 다릅니다. 플러그인 최신: maven-dependency-plugin 3.11.0, cyclonedx-maven-plugin 2.9.3, cyclonedx-gradle-plugin 3.4.1(검증한 버전으로 고정).
546
+ - **SBOM 정책**: 과기정통부·국정원 SW 공급망 보안 로드맵(2026-06)은 2027년부터 공공기관이 도입 SW 의 SBOM 을 통합관리체계에 등록·공급망 위험을 상시 점검하고 공공 IT 사업에서 SBOM 과 취약점 대응 절차 제출을 요구하도록 단계화했습니다(형식은 SPDX/CycloneDX 를 특정하지 않음 — CycloneDX 1.6 JSON 을 기본으로 두고 SPDX 는 변환으로 대응).
547
+ - **4.x 자산**: `egovframe-common-components` 는 v4.3.2 가 4.x 마지막 태그(java 1,295개, 의존성 70건). pom 에 현행 진단을 돌리면 4.x 좌표 9·Jakarta 8·라이브러리 8·제거 모듈 1(auto 19·manual 11) 이 잡히고, 의존성 점검은 `project:*` groupId 의 system scope 로컬 jar 10건(ojdbc6·altibase·tibero5·cubrid·goldilocks8·smeapi·gpki 2·onepass)과 `javax.faces:javax.faces-api` 가 `unknown` 으로 남아 v0.36 소급·v0.37 코퍼스의 첫 수정 대상입니다.
548
+ - **릴리스 사고 기록(동기)**: v0.30.0 태그가 병합 전 커밋에(복구), v0.33.0 태그가 로컬 main 커밋에(복구), 0.32.0·0.33.0 npm 미배포(0.33.0 은 Windows 게이트 결함으로 의도적 건너뜀), #33·#36 Windows 게이트 실패 상태 병합. 모두 수동 절차 단계에서 발생.
480
549
 
481
550
  ### 선행 조사 결과 (2026-10-02)
482
551
 
@@ -505,6 +574,7 @@ v0.28.1 까지의 상태에서 다음 세 릴리스를 아래 순서로 진행
505
574
 
506
575
  ## 변경 이력
507
576
 
577
+ - **0.35.0** — 릴리스 자동화(배포 공급망; 도구 27종 유지, 서버 동작 변화 없음). (1) `.github/workflows/release.yml`: `main` 에서 CI 워크플로가 성공한 뒤(`workflow_run`, 수동 `workflow_dispatch` 가능) `scripts/release-check.mjs` 가 `package.json` 버전으로 네 조건 — `server.json` 두 `version` 일치, README 변경 이력에 해당 항목 존재, 원격 태그 `vX.Y.Z` 없음, npm 에 그 버전 없음 — 을 검사해 모두 맞을 때만 배포합니다(아니면 이유를 적고 성공 종료). 배포는 `mcp-publisher validate` → `npm publish --access public`(npm trusted publishing: OIDC·토큰 없음·공개 패키지라 provenance 자동; Node 22·npm 최신) → npm 반영 확인(재시도) → 검증된 `main` 커밋에 주석 태그 생성·푸시 → `scripts/release-notes.mjs` 가 변경 이력 항목에서 만든 본문(번호 단락·설치 스니펫·검증 안내)으로 GitHub Release → `mcp-publisher login github-oidc && mcp-publisher publish`(실패해도 릴리스는 유지, 경고) 순서입니다. 선행 조건은 npmjs.com 의 trusted publisher 1회 등록(`release.yml`). (2) `server.json` 의 `description` 이 MCP Registry 상한(100자)을 넘어 첫 등록이 실패할 상태였던 것을 `mcp-publisher validate` 로 발견해 98자로 줄였고 `test:registry` 가 100자 이하를 단언합니다. CI 통합 job 에 `mcp-publisher validate` 단계 추가. (3) 신규 `test:release`(게이트, 32단언): 판정 함수(조건별 거부·이유 누적), 변경 이력 항목 추출·릴리스 노트 렌더링, 현재 버전 항목 존재, `npm pack --dry-run` 의 tarball 내용(dist·catalog·설정 템플릿·README·LICENSE 포함, test·scripts·src·.github·소스맵 제외, 압축 600KB·풀면 2MB 상한). 스크립트 `release:check`·`release:notes`. README 릴리스 절차를 "PR 병합까지가 사람의 일" 로 고치고 수동 절차는 비상용으로 남겼습니다. `server.json` 0.35.0.
508
578
  - **0.34.0** — 의존성 기준 완성 + 규칙·기준 drift 감시(도구 27종 유지, 기존 파라미터 호환). (1) `catalog/dependency-baseline.json` schemaVersion 2: 생성기가 Boot parent 의 상위와 같은 버전의 `spring-boot-dependencies`(Maven Central)를 받아 직접 항목과 BOM import 44종을 한 단계 풀어 `boot.managed`(1,473 좌표, Maven 해석 순서로 직접 항목 우선)에, `egovframe-runtime` 모듈 pom 18종(+root)의 test·optional 제외 의존성을 `rteTransitive.managed`(58 좌표, 버전·scope·끌어오는 모듈)에 기록합니다. 모든 pom 은 url·sha256 고정, `--cache`/`--offline` 으로 재현 가능, 파일 150KB. 기준 parent 를 5.0.2 로 올렸습니다(5.0.1 과의 차이는 RTE 버전). (2) `check_egovframe_dependencies`: 대조 순서 parent 직접 → 계열 → (Boot parent) Boot BOM → RTE 전이 / (그 밖) RTE 전이 → Boot BOM, 항목마다 `basis`(parent·family·boot-bom·rte-transitive·migration-rules) 표시, Markdown 에 출처 집계·출처 열. RTE 전이 버전보다 낮게 명시하면 충돌 가능 사유와 함께 기준 미만. Boot parent 프로젝트의 버전 없는 의존성은 Boot BOM 기준 버전을 함께 보입니다. 새 분류 `vendor`(국내 DBMS·GPKI·mGov 등 벤더·기관 배포 좌표, `catalog/migration-mapping.json` 의 `vendorCoordinates`, 사유 표시). 계열 규칙은 groupId 정확 일치(jackson 만 하위 groupId 포함)로 좁혀 `org.springframework.social` 같은 별도 프로젝트를 Spring 계열로 오판하던 결함을 고쳤고, 달력형 릴리스 트레인(`spring-cloud-dependencies` 2025.0.0)은 계열에서 빼 `releaseTrains` 에 적습니다. (3) 전환 규칙 `libraries` 에 EOL·이전 좌표 교체 규칙 8건 추가 — `mysql:mysql-connector-java`→`com.mysql:mysql-connector-j`, `ojdbc:ojdbc`→`com.oracle.database.jdbc:ojdbc11`, `org.codehaus.jackson:*`(Jackson 1), `xmlbeans:xbean`, `net.sf.ehcache:ehcache*`(Spring 6 에서 EhCache 2 지원 제거), `org.apache.httpcomponents:httpclient`(Spring 6 은 HttpClient 5), `org.antlr:antlr`(제거된 spring-modules-validation 의 전이), `org.springframework.social:*`. `migrate_egovframe_project` 진단에도 manual 항목으로 나옵니다. 공식 공통컴포넌트 v3.10.0 pom 의 '기준 없음' 17 → 1(`xerces:xercesImpl`), 공식 `egovframe-boot-web`·`egovframe-web` 템플릿 pom 0. (4) `sync_egovframe_templates` 에 `catalogs` 절(`src/catalog-drift.ts`): `egovframe-runtime`·`egovframe-common-components` 태그 목록(GitHub API → 실패 시 태그 페이지 HTML, `GITHUB_TOKEN` 선택)에서 규칙 `toTag` 보다 새 태그, 공식 parent 2종의 다음 patch 3개·minor·major 후보 HEAD 탐침(저장소가 `maven-metadata.xml`·목록을 막아 둠), parent pom·Boot BOM pom sha256 변화를 보고하고 변화가 있으면 갱신 절차를 붙입니다. 조회 실패는 항목별 오류로 남기고 drift 로 치지 않으며 파일은 고치지 않습니다. 영문 도구 설명·리소스 설명 갱신. 테스트: `test:dependencies` 68 → 104단언, `test:migration-rules` 613 → 628, 신규 `test:catalog-drift` 26단언(게이트)·`test:catalog-drift-live`(CI 통합, `GITHUB_TOKEN` 전달), `test:dependencies-live` 에 공식 템플릿·3.10 pom 기준 단언 4건. 설계: [docs/design-dependency-check.md](docs/design-dependency-check.md). `server.json` 0.34.0.
509
579
  - **0.33.1** — Windows 빌드 오류 경로 수정. Maven·Gradle 컴파일 오류 파서가 `:` 를 파일명 경계로 보아 `C:\work\A.java` 를 `:\work\A.java` 로 잘라내던 문제를 고쳤습니다(드라이브 문자를 경로의 일부로 인식). 이 때문에 Windows 에서 `build_egovframe_project`·`test_egovframe_project` 의 오류 파일 경로가 깨지고 `migrate_egovframe_project(verify=true)` 가 오류를 수동 항목과 연결하지 못했으며, 릴리스 게이트 `test:migrate` 가 Windows 에서 실패했습니다(v0.33.0 CI windows 게이트 3건 실패의 원인). `test:migrate` 에 Windows 드라이브 경로 단언 3건 추가(162 → 165). 기능 변화 없음.
510
580
  - **0.33.0** — 5.x 전환 3단계(검증) + 공통컴포넌트 대응표(도구 27종 유지). (1) `migrate_egovframe_project(verify=true)`: 진단 뒤 `compile` 을 실행해 컴파일 오류를 진단 항목과 연결합니다 — 같은 파일의 심볼 일치(`cannot find symbol … class Mapper` ↔ `class-removed Mapper`, `package X does not exist` ↔ 접두 일치, 수동 항목 우선) → 같은 파일 라인 ±3 의 수동 항목 → 규칙 카탈로그의 제거 클래스·`egovframework.rte`/`javax` 패키지 부재(적용 미완 안내) → 미분류. 수동 항목별 "해결될 오류 수" 내림차순 작업 목록을 만들고 오류와 무관한 수동 항목도 0건으로 붙여 빠짐이 없게 합니다. `parseBuildErrors` 가 javac 후속 줄 `symbol:`·`location:` 을 `BuildError.symbol/location` 으로 붙입니다(Maven·Gradle). 빌드 파일이 없으면 검증을 건너뛰고 이유를 적습니다. (2) 규칙 카탈로그 schemaVersion 2: 생성기가 `egovframe-common-components` v3.10.0 ↔ v5.0.6 소스 트리를 두 번째 근거로 비교해 `packages.components`(제거 54·이동 4·추가 52, commit 고정)를 기록합니다. 진단이 `egovframework.com.*` 참조 중 대응표의 제거 클래스는 `component-class-removed`(manual, 대체 `EgovMybaitsUtil`→`EgovMybatisUtil` 큐레이션), 이동 클래스는 `component-class-moved`(auto) 로 보고하며, 대응표에 없는 클래스는 사용자 코드일 수 있어 보고하지 않습니다. (3) 재조립 권고: 감지된 공통컴포넌트 디렉터리 안에 3.x 전환 항목이 있으면 컴포넌트당 `component-reassemble`(manual) 1건을 내고, `skipComponents=true` 면 그 디렉터리의 자동 항목을 수동으로 돌려 치환에서 뺍니다. 구조화 출력 스키마에 verify 필드 추가, 영문 도구 설명 갱신. 테스트: `test:migrate` 132 → 162단언, `test:migration-rules` 605단언, `test:migrate-integration` 에 실제 컴파일 오류 연결 3건. 설계: [docs/design-migration.md](docs/design-migration.md) 3단계 절. `server.json` 0.33.0.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "egovframe-scaffold-mcp",
3
- "version": "0.34.0",
3
+ "version": "0.35.0",
4
4
  "mcpName": "io.github.EricSeokgon/egovframe-scaffold-mcp",
5
5
  "description": "전자정부 표준프레임워크(eGovFrame) 프로젝트·CRUD 스캐폴딩과 검증된 공통컴포넌트 완전 조립 MCP 서버",
6
6
  "license": "Apache-2.0",
@@ -20,7 +20,9 @@
20
20
  "generate:config-catalog": "node scripts/generate-config-catalog.mjs",
21
21
  "generate:migration-rules": "node scripts/generate-migration-rules.mjs",
22
22
  "generate:dependency-baseline": "node scripts/generate-dependency-baseline.mjs",
23
- "prepublishOnly": "npm run build && npm run check:portability && npm run test:output-schemas && npm run test:catalog && npm run test:catalog-sync && npm run test:template-catalog && npm run test:catalog-drift && npm run test:config && npm run test:migration-rules && npm run test:migrate && npm run test:dependencies && npm run test:network && npm run test:agents-md && npm run test:registry && npm run test:ai && npm run test:recipes && npm run test:diagnose && npm run test:docs && npm run test:report && npm run test:upgrade && npm run test:remove && npm run test:transaction && npm run test:allowed-roots && npm run test:explain && npm run test:ci && npm run test:build && npm run test:test && npm run test:pom && npm run test:crud && npm run test:handshake",
23
+ "release:check": "node scripts/release-check.mjs",
24
+ "release:notes": "node scripts/release-notes.mjs",
25
+ "prepublishOnly": "npm run build && npm run check:portability && npm run test:output-schemas && npm run test:catalog && npm run test:catalog-sync && npm run test:template-catalog && npm run test:catalog-drift && npm run test:config && npm run test:migration-rules && npm run test:migrate && npm run test:dependencies && npm run test:network && npm run test:agents-md && npm run test:registry && npm run test:release && npm run test:ai && npm run test:recipes && npm run test:diagnose && npm run test:docs && npm run test:report && npm run test:upgrade && npm run test:remove && npm run test:transaction && npm run test:allowed-roots && npm run test:explain && npm run test:ci && npm run test:build && npm run test:test && npm run test:pom && npm run test:crud && npm run test:handshake",
24
26
  "test:ai": "node test/ai.mjs",
25
27
  "generate:ai-catalog": "node scripts/generate-ai-catalog.mjs",
26
28
  "test:ai-assembly": "node test/ai-assembly.mjs",
@@ -57,6 +59,7 @@
57
59
  "test:network-live": "node test/network-live.mjs",
58
60
  "test:agents-md": "node test/agents-md.mjs",
59
61
  "test:registry": "node test/registry.mjs",
62
+ "test:release": "node test/release.mjs",
60
63
  "test:output-schemas": "node test/output-schemas.mjs",
61
64
  "check:portability": "node scripts/check-test-portability.mjs",
62
65
  "test:handshake": "node test/handshake.mjs"