-
행을 추가해 필드를 입력하면 저장할 때 JSON으로 자동 변환됩니다.
+
?�을 추�????�드�??�력?�면 ?�?�할 ??JSON?�로 ?�동 변?�됩?�다.
- 빠른 입력:
+ 빠른 ?�력:
-
-
-
+
+
@@ -1241,15 +1241,15 @@
| Object list item fields (JSON) |
Description |
Pattern (Regex) |
- Examples (Enter 단위 구분) |
+ Examples (Enter ?�위 구분) |
Required |
- 삭제 |
+ ??�� |
-
+ 필드 추가
+
+ ?�드 추�?
@@ -1257,7 +1257,7 @@
@@ -1268,7 +1268,7 @@
@@ -1382,13 +1382,13 @@
const button = dg('docgenGenerateBtn');
select.disabled = true;
button.disabled = true;
- dg('docgenGrowToolHint').textContent = 'Gateway의 ToolMetadata 목록을 조회하고 있습니다.';
+ dg('docgenGrowToolHint').textContent = 'Gateway??ToolMetadata 목록??조회?�고 ?�습?�다.';
try {
const response = await fetch('/mcp/api/v1/tools/list', { cache: 'no-store' });
if (!response.ok) throw new Error(`Gateway HTTP ${response.status}`);
const payload = await response.json();
const tools = payload?.result?.tools;
- if (!Array.isArray(tools)) throw new Error('ToolMetadata 응답 형식이 올바르지 않습니다.');
+ if (!Array.isArray(tools)) throw new Error('ToolMetadata ?�답 ?�식???�바르�? ?�습?�다.');
state.tools = tools.slice().sort((a, b) =>
(a.categoryKey || '').localeCompare(b.categoryKey || '') ||
(a.name || '').localeCompare(b.name || '')
@@ -1397,19 +1397,19 @@
`
`
).join('');
select.disabled = state.tools.length === 0;
- dg('docgenGrowToolHint').textContent = `ToolMetadata에 등록된 ${state.tools.length}개 Tool을 모두 표시합니다.`;
+ dg('docgenGrowToolHint').textContent = `ToolMetadata???�록??${state.tools.length}�?Tool??모두 ?�시?�니??`;
if (state.tools.length) {
select.value = '0';
selectTool();
} else {
- showMetadataError('등록된 Tool이 없습니다.');
+ showMetadataError('?�록??Tool???�습?�다.');
}
} catch (error) {
state.tools = [];
state.selected = null;
showMetadataError(error.message);
- select.innerHTML = '
';
- dg('docgenGrowToolHint').innerHTML = `
${escapeHtml(error.message)} · Gateway 실행 상태를 확인하세요.`;
+ select.innerHTML = '
';
+ dg('docgenGrowToolHint').innerHTML = `
${escapeHtml(error.message)} · Gateway ?�행 ?�태�??�인?�세??`;
}
}
@@ -1420,7 +1420,7 @@
dg('docgenVersion').value = normalizeVersion(tool.semver || dg('docgenVersion').value || '1.0');
dg('docgenToolTitle').classList.remove('docgen-loading', 'docgen-error');
dg('docgenToolTitle').textContent = tool.displayName || tool.name;
- dg('docgenToolDescription').textContent = tool.description || '설명이 등록되지 않은 Tool입니다.';
+ dg('docgenToolDescription').textContent = tool.description || '?�명???�록?��? ?��? Tool?�니??';
dg('docgenCategoryTag').textContent = `Category · ${tool.categoryKey || '-'}`;
dg('docgenInterfaceTag').textContent = `Interface · ${tool.integrationType || '-'}`;
dg('docgenMetadataStatus').textContent = tool.enabled === false ? 'DISABLED' : 'READY';
@@ -1442,14 +1442,14 @@
const hasProgram = checks.program.checked || checks.process.checked || checks.revision.checked;
dg('docgenProgramFile').classList.toggle('docgen-disabled', !hasProgram);
dg('docgenInterfaceFile').classList.toggle('docgen-disabled', !checks.interface.checked);
- dg('docgenProgramFileName').textContent = `${toolName}_프로그램정의서_v${version}_${date}.xlsx`;
- dg('docgenInterfaceFileName').textContent = `${toolName}_인터페이스정의서_v${version}_${date}.xlsx`;
+ dg('docgenProgramFileName').textContent = `${toolName}_?�로그램?�의??v${version}_${date}.xlsx`;
+ dg('docgenInterfaceFileName').textContent = `${toolName}_?�터?�이?�정?�서_v${version}_${date}.xlsx`;
dg('docgenGenerateBtn').disabled = !state.selected || (!hasProgram && !checks.interface.checked);
}
async function generateFiles() {
const tool = state.selected;
- if (!tool) return notify('생성할 Tool을 선택하세요.');
+ if (!tool) return notify('?�성??Tool???�택?�세??');
const button = dg('docgenGenerateBtn');
const version = safeVersion(dg('docgenVersion').value);
const date = yyyymmdd();
@@ -1468,13 +1468,13 @@
try {
if (hasProgram) {
await requestDownload('/mcp/api/v1/admin/documents/program', request,
- `${toolName}_프로그램정의서_v${version}_${date}.xlsx`);
+ `${toolName}_?�로그램?�의??v${version}_${date}.xlsx`);
}
if (checks.interface.checked) {
await requestDownload('/mcp/api/v1/admin/documents/interface', request,
- `${toolName}_인터페이스정의서_v${version}_${date}.xlsx`);
+ `${toolName}_?�터?�이?�정?�서_v${version}_${date}.xlsx`);
}
- notify('선택한 Excel 문서 다운로드를 완료했습니다.');
+ notify('?�택??Excel 문서 ?�운로드�??�료?�습?�다.');
} catch (error) {
notify(error.message);
} finally {
@@ -1490,12 +1490,12 @@
body: JSON.stringify(payload)
});
if (!response.ok) {
- let message = `문서 생성에 실패했습니다. (HTTP ${response.status})`;
+ let message = `문서 ?�성???�패?�습?�다. (HTTP ${response.status})`;
try {
const error = await response.json();
if (error?.error) message = error.error;
} catch (_) {
- // JSON 오류 응답이 아닌 경우 기본 메시지를 사용합니다.
+ // JSON ?�류 ?�답???�닌 경우 기본 메시지�??�용?�니??
}
throw new Error(message);
}
@@ -1556,7 +1556,7 @@
const resultBox = document.getElementById('resultBox');
resultBox.style.display = 'block';
- if (result.includes('[오류]') || result.includes('오류 발생:')) {
+ if (result.includes('[?�류]') || result.includes('?�류 발생:')) {
resultBox.className = 'error';
resultBox.textContent = result;
} else {
@@ -1622,16 +1622,16 @@
const form = document.getElementById('toolForm');
const data = Object.fromEntries(new FormData(form).entries());
if (!data.baseName) {
- throw new Error('Base Name을 입력해주세요.');
+ throw new Error('Base Name???�력?�주?�요.');
}
if (data.routingType === 'MCI' && (!data.interfaceId || !data.clientSystemCode)) {
- throw new Error('MCI Tool은 Legacy Interface ID와 Target System Code를 입력해야 합니다.');
+ throw new Error('MCI Tool?� Legacy Interface ID?� Target System Code�??�력?�야 ?�니??');
}
if (data.routingType === 'HTTP' && !data.httpApiName) {
- throw new Error('HTTP Tool은 HTTP API Name을 입력해야 합니다.');
+ throw new Error('HTTP Tool?� HTTP API Name???�력?�야 ?�니??');
}
if (!['MCI', 'HTTP'].includes(data.routingType)) {
- throw new Error('여러 Tool UseCase는 MCI 또는 HTTP 프로토콜만 지원합니다.');
+ throw new Error('?�러 Tool UseCase??MCI ?�는 HTTP ?�로?�콜�?지?�합?�다.');
}
return {
baseName: data.baseName,
@@ -1659,7 +1659,7 @@
try {
const tool = currentToolDefinition();
if (groupedTools.some(item => item.methodName === tool.methodName || item.baseName === tool.baseName)) {
- throw new Error('같은 Base Name 또는 메서드명이 이미 묶음에 있습니다.');
+ throw new Error('같�? Base Name ?�는 메서?�명???��? 묶음???�습?�다.');
}
groupedTools.push(tool);
renderToolGroupSummary();
@@ -1673,13 +1673,14 @@
const workspacePath = document.querySelector('#toolForm input[name="workspacePath"]')?.value || document.querySelector('input[name="workspacePath"]')?.value || '';
const categoryKey = document.querySelector('#toolForm [name="categoryKey"]').value.trim();
const select = document.getElementById('toolGroupUseCaseSelect');
- select.innerHTML = '
';
+ select.innerHTML = '
';
+ select.innerHTML = '
';
if (!/^[a-z0-9]{3}$/.test(categoryKey)) return;
try {
const response = await fetch(`/api/v1/scaffold/usecases?moduleName=${encodeURIComponent(moduleName)}&categoryKey=${encodeURIComponent(categoryKey)}&workspacePath=${encodeURIComponent(workspacePath)}`);
- if (!response.ok) throw new Error('UseCase 목록 조회 실패');
+ if (!response.ok) throw new Error('UseCase 목록 조회 ?패');
const useCases = await response.json();
- useCases.forEach(useCaseName => select.add(new Option(`기존 ${useCaseName}에 함수 추가`, useCaseName)));
+ useCases.forEach(useCaseName => select.add(new Option(`기존 ${useCaseName} UseCase 추가`, useCaseName)));
} catch (error) {
console.warn(error);
}
@@ -1690,10 +1691,10 @@
const workspacePath = document.querySelector('#toolForm input[name="workspacePath"]')?.value || document.querySelector('input[name="workspacePath"]')?.value || '';
const select = document.getElementById('domainCategorySelect');
const nameInput = document.getElementById('domainCategoryName');
- select.innerHTML = '
';
+ select.innerHTML = '
';
try {
const response = await fetch(`/api/v1/scaffold/categories?moduleName=${encodeURIComponent(moduleName)}&workspacePath=${encodeURIComponent(workspacePath)}`);
- if (!response.ok) throw new Error('Category 목록 조회 실패');
+ if (!response.ok) throw new Error('Category 목록 조회 ?패');
const categories = await response.json();
categories.forEach(cat => select.add(new Option(`기존 ${cat} 도메인`, cat)));
} catch (error) {
@@ -1731,8 +1732,8 @@
function renderToolGroupSummary() {
const summary = document.getElementById('toolGroupSummary');
summary.textContent = groupedTools.length
- ? `${groupedTools.length}개 Tool: ${groupedTools.map(tool => `${tool.baseName} → ${tool.methodName}()`).join(', ')}`
- : '묶음에 추가된 Tool 없음 — 일반 Generate Tool은 기존 단일 Tool 생성입니다.';
+ ? `${groupedTools.length}�?Tool: ${groupedTools.map(tool => `${tool.baseName} ??${tool.methodName}()`).join(', ')}`
+ : '묶음??추�???Tool ?�음 ???�반 Generate Tool?� 기존 ?�일 Tool ?�성?�니??';
}
document.getElementById('toolForm').addEventListener('submit', function(e) {
@@ -1741,7 +1742,7 @@
e.preventDefault();
e.stopImmediatePropagation();
if (!/^[A-Z][A-Za-z0-9]*$/.test(useCaseName)) {
- alert('UseCase 이름은 PascalCase로 입력해주세요. 예: Customer');
+ alert('UseCase ?�름?� PascalCase�??�력?�주?�요. ?? Customer');
return;
}
try {
@@ -1751,7 +1752,7 @@
const btn = this.querySelector('button[type="submit"]');
const originalText = btn.innerHTML;
- btn.innerHTML = '
처리중...';
+ btn.innerHTML = '
처리�?..';
btn.disabled = true;
fetch('/api/v1/scaffold/tool-group', {
@@ -1956,15 +1957,15 @@
fields = JSON.parse(textarea.value);
if (!Array.isArray(fields)) throw new Error('not an array');
} catch (error) {
- alert('현재 JSON 형식이 올바르지 않습니다. JSON을 수정한 후 다시 열어주세요.');
+ alert('?�재 JSON ?�식???�바르�? ?�습?�다. JSON???�정?????�시 ?�어주세??');
return;
}
}
fieldEditorTargetId = targetId;
document.getElementById('fieldEditorModalLabel').textContent = targetId === 'inputFields'
- ? 'Input Fields 편집'
- : 'Output Fields 편집';
+ ? 'Input Fields ?�집'
+ : 'Output Fields ?�집';
const body = document.getElementById('fieldEditorBody');
body.replaceChildren();
(fields.length ? fields : [{}]).forEach(addFieldEditorRow);
@@ -2035,14 +2036,14 @@
itemFieldsContainer.className = 'd-flex gap-1';
const itemFieldsInput = makeInput(field.type === 'List' && field.itemType === 'Object'
- ? JSON.stringify(field.itemFields || []) : '', 'JSON 직접입력 또는 우측 편집 클릭');
+ ? JSON.stringify(field.itemFields || []) : '', 'JSON 직접?�력 ?�는 ?�측 ?�집 ?�릭');
itemFieldsInput.dataset.field = 'itemFields';
itemFieldsInput.style.flex = '1';
const editItemBtn = document.createElement('button');
editItemBtn.type = 'button';
editItemBtn.className = 'btn-secondary-action';
- editItemBtn.textContent = '편집';
+ editItemBtn.textContent = '?�집';
editItemBtn.style.padding = '0.2rem 0.5rem';
editItemBtn.onclick = () => {
if (typeof openSubFieldEditor === 'function') openSubFieldEditor(itemFieldsInput);
@@ -2056,7 +2057,7 @@
itemFieldsInput.disabled = !objectList;
editItemBtn.disabled = !objectList;
itemFieldsInput.placeholder = objectList
- ? 'JSON 직접입력 또는 우측 편집 클릭'
+ ? 'JSON 직접?�력 ?�는 ?�측 ?�집 ?�릭'
: 'Select List > Object to enter item fields';
if (!objectList) itemFieldsInput.value = '';
};
@@ -2092,7 +2093,7 @@
const deleteButton = document.createElement('button');
deleteButton.type = 'button';
deleteButton.className = 'btn-secondary-action';
- deleteButton.textContent = '삭제';
+ deleteButton.textContent = '??��';
deleteButton.addEventListener('click', () => {
row.remove();
updateFieldEditorPreview();
@@ -2150,12 +2151,12 @@
async function createNaturalFieldDraft() {
const source = document.getElementById('fieldNaturalLanguage').value.trim();
if (!source) {
- alert('필드 초안을 만들 문장을 입력해주세요.');
+ alert('?�드 초안??만들 문장???�력?�주?�요.');
return;
}
const button = document.getElementById('fieldDraftButton');
const originalLabel = button.textContent;
- button.textContent = 'AI 생성 중...';
+ button.textContent = 'AI ?�성 �?..';
button.disabled = true;
try {
const response = await fetch('/api/v1/scaffold/field-draft', {
@@ -2164,16 +2165,16 @@
body: JSON.stringify({ description: source, target: fieldEditorTargetId, model: selectedAiModel() })
});
const result = await response.json();
- if (!response.ok) throw new Error(result.error || 'AI 초안 생성에 실패했습니다.');
+ if (!response.ok) throw new Error(result.error || 'AI 초안 ?�성???�패?�습?�다.');
if (!Array.isArray(result.fields) || result.fields.length === 0) {
- throw new Error('AI가 사용할 수 있는 필드를 만들지 못했습니다.');
+ throw new Error('AI가 ?�용?????�는 ?�드�?만들지 못했?�니??');
}
const body = document.getElementById('fieldEditorBody');
body.replaceChildren();
result.fields.forEach(addFieldEditorRow);
updateFieldEditorPreview();
} catch (error) {
- alert(`AI 초안 생성 실패: ${error.message}`);
+ alert(`AI 초안 ?�성 ?�패: ${error.message}`);
} finally {
button.textContent = originalLabel;
button.disabled = false;
@@ -2187,12 +2188,12 @@
async function createAiToolDraft() {
const source = document.getElementById('toolNaturalLanguage').value.trim();
if (!source) {
- alert('AI가 만들 Tool 설명을 입력해주세요.');
+ alert('AI가 만들 Tool ?�명???�력?�주?�요.');
return;
}
const button = document.getElementById('toolDraftButton');
const originalLabel = button.textContent;
- button.textContent = 'AI 생성 중...';
+ button.textContent = 'AI ?�성 �?..';
button.disabled = true;
try {
const response = await fetch('/api/v1/scaffold/tool-draft', {
@@ -2201,7 +2202,7 @@
body: JSON.stringify({ description: source, model: selectedAiModel() })
});
const result = await response.json();
- if (!response.ok) throw new Error(result.error || 'AI Tool 초안 생성에 실패했습니다.');
+ if (!response.ok) throw new Error(result.error || 'AI Tool 초안 ?�성???�패?�습?�다.');
const form = document.getElementById('toolForm');
form.elements.baseName.value = result.baseName || '';
@@ -2225,9 +2226,9 @@
form.elements.ownerOrg.value = result.ownerOrg || 'MCP_TOOL';
document.getElementById('inputFields').value = JSON.stringify(result.inputFields || [], null, 2);
document.getElementById('outputFields').value = JSON.stringify(result.outputFields || [], null, 2);
- alert('Tool 초안을 채웠습니다. Legacy Interface ID와 Client System Code는 실제 연계 명세를 확인해 입력해주세요.');
+ alert('Tool 초안??채웠?�니?? Legacy Interface ID?� Client System Code???�제 ?�계 명세�??�인???�력?�주?�요.');
} catch (error) {
- alert(`AI Tool 초안 생성 실패: ${error.message}`);
+ alert(`AI Tool 초안 ?�성 ?�패: ${error.message}`);
} finally {
button.textContent = originalLabel;
button.disabled = false;
@@ -2240,11 +2241,11 @@
for (const field of fields) {
const name = field.name;
if (!/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(name)) {
- alert(`필드명 "${name}"은(는) Java 필드명 형식으로 입력해주세요.`);
+ alert(`?�드�?"${name}"?�(?? Java ?�드�??�식?�로 ?�력?�주?�요.`);
return;
}
if (names.has(name)) {
- alert(`필드명 "${name}"이(가) 중복되었습니다.`);
+ alert(`?�드�?"${name}"??가) 중복?�었?�니??`);
return;
}
names.add(name);
@@ -2373,7 +2374,7 @@
})
.then(response => response.text())
.then(result => {
- if (result.includes('[오류]') || result.includes('오류 발생:')) {
+ if (result.includes('[?�류]') || result.includes('?�류 발생:')) {
alert('Error updating source:\n' + result);
} else {
alert('Source code updated successfully.\nPlease rebuild the Pod container to reflect changes.');