Compare commits

...

4 Commits

Author SHA1 Message Date
9e9eae0920 fix(installer): config zip 경로 단수화 소스 반영 (v0.4.29)
이전 커밋(082dae5)은 file/configs→config 폴더 rename 만 담기고 실제 소스
변경이 누락됐다. resolveManifestRelative subDir 를 'config' 로, 관련
타입 주석/로케일 힌트/버전(0.4.29)까지 반영.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-08-11 00:23:48 +09:00
082dae5a90 fix(installer): config zip 다운로드 경로를 /file/config (단수)로 정정 (v0.4.29)
설치기가 /file/configs (복수)에서 받으려 해 서버의 file/config (단수)에
올린 zip 을 못 찾아 HTTP 404 로 실패했다. 마인크래프트 config 폴더 및
운영 서버 디렉터리 규칙에 맞춰 단수 config 로 통일.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-08-11 00:23:18 +09:00
7508f3b11b fix(installer): 다운로드 HTTP 오류에 실패한 URL 표시 (v0.4.28)
fetchBuffer/downloadStream 이 4xx/5xx 에 "HTTP 404" 처럼 상태코드만 던져,
어떤 파일(mods/resourcepack/map/config/server)이 없는지 알 수 없었다.
에러 메시지에 실패 URL 을 붙여 config 미업로드 등 원인을 바로 식별 가능하게 함.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-08-11 00:08:59 +09:00
bed47e88a0 docs: Fabric 로더 힌트를 meta 프로필 JSON 방식으로 정정
관리자 편집기 platformLoaderHint 가 아직 "fabric-installer CLI 설치"라고
설명하고 있었으나, 실제 설치기는 자바 없이 Fabric Meta profile JSON 을 받아
.minecraft/versions 에 직접 저장한다. UI 설명을 실제 동작에 맞춤.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-08-10 23:47:48 +09:00
5 changed files with 7 additions and 7 deletions

View File

@@ -117,7 +117,7 @@
"platformDownloadUrl": "플랫폼 설치파일 URL", "platformDownloadUrl": "플랫폼 설치파일 URL",
"platformDownloadHint": "도메인 없이 입력하면 manifest.json 도메인의 <code>/file/platforms/&lt;파일명&gt;</code>으로 해석됩니다.", "platformDownloadHint": "도메인 없이 입력하면 manifest.json 도메인의 <code>/file/platforms/&lt;파일명&gt;</code>으로 해석됩니다.",
"platformLoaderVersion": "Fabric Loader 버전", "platformLoaderVersion": "Fabric Loader 버전",
"platformLoaderHint": "선택한 마인크래프트 버전 기준 Fabric Loader 목록입니다. 설치기는 최신 fabric-installer 를 받아 자동으로 CLI 설치합니다.", "platformLoaderHint": "선택한 마인크래프트 버전 기준 Fabric Loader 목록입니다. 설치기는 자바 없이 Fabric Meta 의 프로필 JSON 을 받아 .minecraft/versions 에 직접 저장합니다.",
"platformLoaderEmpty": "호환 로더 없음", "platformLoaderEmpty": "호환 로더 없음",
"platformLoaderPickMc": "마인크래프트 버전을 먼저 선택하세요", "platformLoaderPickMc": "마인크래프트 버전을 먼저 선택하세요",
"platformLoaderLoadFailed": "로더 목록 로드 실패: {{message}}", "platformLoaderLoadFailed": "로더 목록 로드 실패: {{message}}",
@@ -135,7 +135,7 @@
"mapPath": "맵 파일 (.zip)", "mapPath": "맵 파일 (.zip)",
"mapPathHint": "/file/maps/ 아래 zip 파일 이름.", "mapPathHint": "/file/maps/ 아래 zip 파일 이름.",
"configPath": "config 파일 (.zip)", "configPath": "config 파일 (.zip)",
"configPathHint": "/file/configs/ 아래 zip 파일 이름. 게임 폴더 루트에 그대로 풀립니다(보통 zip 안에 config/ 폴더).", "configPathHint": "/file/config/ 아래 zip 파일 이름. 게임 폴더 루트에 그대로 풀립니다(보통 zip 안에 config/ 폴더).",
"serverPath": "서버 파일 (.zip)", "serverPath": "서버 파일 (.zip)",
"serverPathHint": "/file/servers/ 아래 zip 파일 이름. 멀티 모드 전용.", "serverPathHint": "/file/servers/ 아래 zip 파일 이름. 멀티 모드 전용.",
"modsFolder": "모드 폴더 이름", "modsFolder": "모드 폴더 이름",

View File

@@ -1,6 +1,6 @@
{ {
"name": "minecraft-music-quiz-installer", "name": "minecraft-music-quiz-installer",
"version": "0.4.27", "version": "0.4.29",
"description": "마인크래프트 음악퀴즈 간편설치기 + 관리 사이트", "description": "마인크래프트 음악퀴즈 간편설치기 + 관리 사이트",
"main": "dist/installer/main.js", "main": "dist/installer/main.js",
"scripts": { "scripts": {

View File

@@ -152,7 +152,7 @@ function fetchBuffer(url: string, redirects = 0, attempt = 0): Promise<Buffer> {
} }
if (code >= 400) { if (code >= 400) {
response.resume() response.resume()
reject(new Error(`HTTP ${code}`)) reject(new Error(`HTTP ${code}: ${url}`))
return return
} }
const chunks: Buffer[] = [] const chunks: Buffer[] = []
@@ -627,7 +627,7 @@ function downloadStream(
res.resume() res.resume()
fileStream.close(() => { fileStream.close(() => {
signal.removeEventListener('abort', onAbort) signal.removeEventListener('abort', onAbort)
if (!settled) { settled = true; reject(new Error(`HTTP ${sc}`)) } if (!settled) { settled = true; reject(new Error(`HTTP ${sc}: ${url}`)) }
}) })
return return
} }
@@ -775,7 +775,7 @@ async function downloadConfigZip(pack: PackDefinition, customRoot: string): Prom
sendLog(t('log.skipConfigZip')) sendLog(t('log.skipConfigZip'))
return return
} }
const url = resolveManifestRelative(pack.configPath, 'configs') const url = resolveManifestRelative(pack.configPath, 'config')
await downloadAndExtractZip(url, t('log.labelConfigFile'), customRoot) await downloadAndExtractZip(url, t('log.labelConfigFile'), customRoot)
} }

View File

@@ -42,7 +42,7 @@ export interface PackDefinition {
/** /file/maps/<mapPath> 에서 받아 .mc_custom/saves 로 풀 zip 파일 이름. */ /** /file/maps/<mapPath> 에서 받아 .mc_custom/saves 로 풀 zip 파일 이름. */
mapPath: string mapPath: string
/** /**
* /file/configs/<configPath> 에서 받아 게임 폴더(.mc_custom) 루트에 그대로 푸는 zip * /file/config/<configPath> 에서 받아 게임 폴더(.mc_custom) 루트에 그대로 푸는 zip
* 파일 이름. 보통 zip 안에 `config/` 폴더를 담는다. 빈 문자열이면 받지 않는다. * 파일 이름. 보통 zip 안에 `config/` 폴더를 담는다. 빈 문자열이면 받지 않는다.
*/ */
configPath: string configPath: string