@nine-lab/nine-mu 0.1.16 โ†’ 0.1.17

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.
package/dist/nine-mu.js CHANGED
@@ -20,8 +20,8 @@ class NineMuService {
20
20
  */
21
21
  async generate(command, targets, currentRoutes) {
22
22
  try {
23
- trace.log(`๐Ÿš€ Fab ๊ณต์ • ์‹œ์ž‘: "${command}" [๋Œ€์ƒ: ${targets.join(", ")}]`);
24
- const response = await fetch(`${this.connectorUrl}/api/fab/generate`, {
23
+ trace.log(`๊ณต์ • ์‹œ์ž‘: "${command}" [๋Œ€์ƒ: ${targets.join(", ")}]`);
24
+ const response = await fetch(`${this.connectorUrl}/api/mu/generate`, {
25
25
  method: "POST",
26
26
  headers: { "Content-Type": "application/json" },
27
27
  body: JSON.stringify({
@@ -37,7 +37,7 @@ class NineMuService {
37
37
  }
38
38
  return result;
39
39
  } catch (error) {
40
- trace.error("โŒ Fab Service Error:", error);
40
+ trace.error("NineMu Service Error:", error);
41
41
  throw error;
42
42
  }
43
43
  }
@@ -107,7 +107,7 @@ initActions_fn = function() {
107
107
  const result = await __privateGet(this, _service).generate(command, targets, __privateGet(this, _routes));
108
108
  $status.textContent = "โœ… ์™„๋ฃŒ";
109
109
  nine.alert("์†Œ์Šค ์ƒ์„ฑ ์„ฑ๊ณต").rgb();
110
- this.dispatchEvent(new CustomEvent("nine-fab-completed", { detail: result, bubbles: true }));
110
+ this.dispatchEvent(new CustomEvent("nine-mu-completed", { detail: result, bubbles: true }));
111
111
  } catch (err) {
112
112
  $status.textContent = "โŒ ์‹คํŒจ";
113
113
  nine.alert(err.message).rgb().shake();
@@ -120,7 +120,7 @@ render_fn = function() {
120
120
  const customImport = this.getAttribute("css-path") ? `@import "${this.getAttribute("css-path")}";` : "";
121
121
  this.shadowRoot.innerHTML = `
122
122
  <style>
123
- @import "https://cdn.jsdelivr.net/npm/@nine-lab/nine-fab@${"0.1.15"}/dist/css/nine-mu.css";
123
+ @import "https://cdn.jsdelivr.net/npm/@nine-lab/nine-mu@${"0.1.16"}/dist/css/nine-mu.css";
124
124
  ${customImport}
125
125
  </style>
126
126
  <div class="wrapper">
@@ -128,7 +128,7 @@ render_fn = function() {
128
128
  <div class="container">
129
129
  <div class="head">
130
130
  <div class="logo"><span></span></div>
131
- <div id="status-tag" style="font-size:10px; color:#ff5722; padding:5px;">Fab Engine Ready</div>
131
+ <div id="status-tag" style="font-size:10px; color:#ff5722; padding:5px;">nine-mu Engine Ready</div>
132
132
  </div>
133
133
  <nx-ai-chat></nx-ai-chat>
134
134
  <div class="foot">
@@ -156,15 +156,15 @@ render_fn = function() {
156
156
  if (!customElements.get("nine-chat")) {
157
157
  customElements.define("nine-chat", NineChat);
158
158
  }
159
- const NineFab = {
160
- version: "0.1.15",
159
+ const NineMu = {
160
+ version: "0.1.16",
161
161
  init: (config) => {
162
- trace.log("๐Ÿ› ๏ธ Nine-Fab Engine initialized", config);
162
+ trace.log("๐Ÿ› ๏ธ Nine-Mu Engine initialized", config);
163
163
  }
164
164
  };
165
165
  export {
166
166
  NineChat,
167
- NineFab,
168
- NineFab as default
167
+ NineMu,
168
+ NineMu as default
169
169
  };
170
170
  //# sourceMappingURL=nine-mu.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"nine-mu.js","sources":["../src/services/NineMuService.js","../src/components/NineChat.js","../src/index.js"],"sourcesContent":["import { nine, trace } from '@nine-lab/nine-util';\n\nexport class NineMuService {\n constructor(connectorUrl) {\n this.connectorUrl = connectorUrl;\n }\n\n /**\n * AI ์†Œ์Šค ์ƒ์„ฑ ์‹คํ–‰\n * @param {string} command - ์‚ฌ์šฉ์ž ์ž…๋ ฅ ๋ช…๋ น\n * @param {Array} targets - ์ฒดํฌ๋œ ์ƒ์„ฑ ๋Œ€์ƒ (MyBatis, Service ๋“ฑ)\n * @param {Array} currentRoutes - ํ˜„์žฌ ํ”„๋กœ์ ํŠธ ๊ฒฝ๋กœ ์ •๋ณด\n */\n async generate(command, targets, currentRoutes) {\n try {\n trace.log(`๐Ÿš€ Fab ๊ณต์ • ์‹œ์ž‘: \"${command}\" [๋Œ€์ƒ: ${targets.join(', ')}]`);\n\n const response = await fetch(`${this.connectorUrl}/api/fab/generate`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n command,\n targets,\n projectType: 'spring-react',\n currentRoutes\n })\n });\n\n const result = await response.json();\n\n if (!result.success) {\n throw new Error(result.error || \"์†Œ์Šค ์ƒ์„ฑ ์ค‘ ์„œ๋ฒ„ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.\");\n }\n\n return result;\n } catch (error) {\n trace.error(\"โŒ Fab Service Error:\", error);\n throw error;\n }\n }\n\n /**\n * ์ดˆ๊ธฐ ๊ฒฝ๋กœ ์ •๋ณด ๋กœ๋“œ\n */\n async fetchRoutes(routeUrl) {\n if (!routeUrl) return [];\n try {\n const res = await fetch(routeUrl);\n return await res.json();\n } catch (err) {\n trace.error(\"Route load fail\", err);\n return [];\n }\n }\n}","import { nine, trace } from '@nine-lab/nine-util';\nimport { NineMuService } from '../services/NineMuService.js';\n\nexport class NineChat extends HTMLElement {\n #service = null;\n #routes = [];\n\n constructor() {\n super();\n this.attachShadow({ mode: 'open' });\n }\n\n async connectedCallback() {\n // ์„œ๋น„์Šค ์ดˆ๊ธฐํ™”\n const connectorUrl = this.getAttribute('connector-url') || 'http://localhost:3002';\n this.#service = new NineMuService(connectorUrl);\n\n this.#render();\n this.#initInteractions(); // UI ํ† ๊ธ€ ๋กœ์ง\n this.#initActions(); // ์—”ํ„ฐ ์‹œ ์‹คํ–‰ ๋กœ์ง\n\n // ๊ฒฝ๋กœ ๋ฐ์ดํ„ฐ ๋กœ๋“œ\n this.#routes = await this.#service.fetchRoutes(this.getAttribute('route-url'));\n }\n\n // --- [๊ทธ๋ฃน 1: Interaction] ํ™”๋ฉด ํ† ๊ธ€ ๋ฐ ๋ฉ”๋‰ด ํด๋ฆญ ---\n #initInteractions() {\n const $settings = this.shadowRoot.querySelector('nine-ai-settings');\n const $menuIcons = this.shadowRoot.querySelectorAll(\".menu-icon\");\n\n const toggleUI = () => this.classList.toggle(\"collapse\");\n this.shadowRoot.querySelector(\".expand-icon\").addEventListener(\"click\", toggleUI);\n this.shadowRoot.querySelector(\".collapse-icon\").addEventListener(\"click\", toggleUI);\n\n $menuIcons.forEach(el => {\n el.addEventListener(\"click\", (e) => {\n $menuIcons.forEach(icon => icon.classList.remove(\"active\"));\n const clicked = e.target.closest(\".menu-icon\");\n clicked.classList.add(\"active\");\n $settings.classList.toggle(\"expand\", clicked.classList.contains('menu-setting'));\n });\n });\n }\n\n // --- [๊ทธ๋ฃน 2: Action] ์—”ํ„ฐํ‚ค ์ž…๋ ฅ ์‹œ ์„œ๋น„์Šค ํ˜ธ์ถœ ---\n #initActions() {\n const $textarea = this.shadowRoot.querySelector('#q');\n const $status = this.shadowRoot.querySelector('#status-tag');\n\n $textarea.addEventListener('keypress', async (e) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n const command = e.target.value.trim();\n if (!command) return;\n\n // 1. UI ํ”ผ๋“œ๋ฐฑ\n $status.textContent = \"โš™๏ธ ๊ณต์ • ๋ถ„์„ ์ค‘...\";\n e.target.value = '';\n\n // 2. ์ฒดํฌ๋œ ํƒ€๊ฒŸ ์ˆ˜์ง‘\n const targets = Array.from(this.shadowRoot.querySelectorAll('input[name=\"gen_target\"]:checked'))\n .map(el => el.value);\n\n // 3. ๋ถ„๋ฆฌ๋œ ์„œ๋น„์Šค ํ˜ธ์ถœ\n try {\n const result = await this.#service.generate(command, targets, this.#routes);\n\n // 4. ์„ฑ๊ณต ์ฒ˜๋ฆฌ\n $status.textContent = \"โœ… ์™„๋ฃŒ\";\n nine.alert(\"์†Œ์Šค ์ƒ์„ฑ ์„ฑ๊ณต\").rgb();\n this.dispatchEvent(new CustomEvent('nine-fab-completed', { detail: result, bubbles: true }));\n } catch (err) {\n // 5. ์‹คํŒจ ์ฒ˜๋ฆฌ\n $status.textContent = \"โŒ ์‹คํŒจ\";\n nine.alert(err.message).rgb().shake();\n }\n }\n });\n }\n\n #render() {\n const placeholder = this.getAttribute(\"placeholder\") || \"๋‚˜์—๊ฒŒ ๋ฌด์—‡์ด๋“  ๋ฌผ์–ด๋ด...\";\n const customImport = this.getAttribute(\"css-path\") ? `@import \"${this.getAttribute(\"css-path\")}\";` : \"\";\n\n this.shadowRoot.innerHTML = `\n <style>\n @import \"https://cdn.jsdelivr.net/npm/@nine-lab/nine-fab@${__APP_VERSION__}/dist/css/nine-mu.css\";\n ${customImport}\n </style>\n <div class=\"wrapper\">\n <nine-ai-settings></nine-ai-settings>\n <div class=\"container\">\n <div class=\"head\">\n <div class=\"logo\"><span></span></div>\n <div id=\"status-tag\" style=\"font-size:10px; color:#ff5722; padding:5px;\">Fab Engine Ready</div>\n </div>\n <nx-ai-chat></nx-ai-chat>\n <div class=\"foot\">\n <div class=\"apply-src\">\n ${['MyBatis', 'Service', 'Controller', 'JavaScript'].map(t => `\n <div>\n <input type=\"checkbox\" id=\"${t.toLowerCase()}\" name=\"gen_target\" value=\"${t}\" checked />\n <label for=\"${t.toLowerCase()}\">${t}</label>\n </div>\n `).join('')}\n </div>\n <textarea id=\"q\" rows=\"4\" placeholder=\"${placeholder}\"></textarea>\n </div>\n </div>\n <div class=\"menu\">\n <div class=\"collapse-icon\"></div>\n <div class=\"menu-icon menu-filter active\"></div>\n <div class=\"menu-icon menu-general\"></div>\n <div class=\"menu-icon menu-setting\"></div>\n </div>\n </div>\n <div class=\"expand-icon\"></div>\n `;\n }\n}\n\nif (!customElements.get('nine-chat')) {\n customElements.define('nine-chat', NineChat);\n}","import { trace } from '@nine-lab/nine-util';\nimport { NineChat } from './components/NineChat.js';\n\n/**\n * Nine-Fab ์—”์ง„ ๋ฉ”์ธ ํด๋ž˜์Šค\n */\nexport const NineFab = {\n version: typeof __APP_VERSION__ !== 'undefined' ? __APP_VERSION__ : '0.1.0',\n init: (config) => {\n trace.log(\"๐Ÿ› ๏ธ Nine-Fab Engine initialized\", config);\n // ํ–ฅํ›„ ์ปค๋„ฅํ„ฐ URL ์ „์—ญ ์„ค์ •์ด๋‚˜ ์ธ์ฆ ํ† ํฐ ์ฒ˜๋ฆฌ ๋กœ์ง ์ถ”๊ฐ€ ๊ฐ€๋Šฅ\n }\n};\n\n// ๊ธฐ๋ณธ export ๋ฐ ์ปดํฌ๋„ŒํŠธ export\nexport default NineFab;\nexport { NineChat };"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"nine-mu.js","sources":["../src/services/NineMuService.js","../src/components/NineChat.js","../src/index.js"],"sourcesContent":["import { nine, trace } from '@nine-lab/nine-util';\n\nexport class NineMuService {\n constructor(connectorUrl) {\n this.connectorUrl = connectorUrl;\n }\n\n /**\n * AI ์†Œ์Šค ์ƒ์„ฑ ์‹คํ–‰\n * @param {string} command - ์‚ฌ์šฉ์ž ์ž…๋ ฅ ๋ช…๋ น\n * @param {Array} targets - ์ฒดํฌ๋œ ์ƒ์„ฑ ๋Œ€์ƒ (MyBatis, Service ๋“ฑ)\n * @param {Array} currentRoutes - ํ˜„์žฌ ํ”„๋กœ์ ํŠธ ๊ฒฝ๋กœ ์ •๋ณด\n */\n async generate(command, targets, currentRoutes) {\n try {\n trace.log(`๊ณต์ • ์‹œ์ž‘: \"${command}\" [๋Œ€์ƒ: ${targets.join(', ')}]`);\n\n const response = await fetch(`${this.connectorUrl}/api/mu/generate`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n command,\n targets,\n projectType: 'spring-react',\n currentRoutes\n })\n });\n\n const result = await response.json();\n\n if (!result.success) {\n throw new Error(result.error || \"์†Œ์Šค ์ƒ์„ฑ ์ค‘ ์„œ๋ฒ„ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.\");\n }\n\n return result;\n } catch (error) {\n trace.error(\"NineMu Service Error:\", error);\n throw error;\n }\n }\n\n /**\n * ์ดˆ๊ธฐ ๊ฒฝ๋กœ ์ •๋ณด ๋กœ๋“œ\n */\n async fetchRoutes(routeUrl) {\n if (!routeUrl) return [];\n try {\n const res = await fetch(routeUrl);\n return await res.json();\n } catch (err) {\n trace.error(\"Route load fail\", err);\n return [];\n }\n }\n}","import { nine, trace } from '@nine-lab/nine-util';\nimport { NineMuService } from '../services/NineMuService.js';\n\nexport class NineChat extends HTMLElement {\n #service = null;\n #routes = [];\n\n constructor() {\n super();\n this.attachShadow({ mode: 'open' });\n }\n\n async connectedCallback() {\n // ์„œ๋น„์Šค ์ดˆ๊ธฐํ™”\n const connectorUrl = this.getAttribute('connector-url') || 'http://localhost:3002';\n this.#service = new NineMuService(connectorUrl);\n\n this.#render();\n this.#initInteractions(); // UI ํ† ๊ธ€ ๋กœ์ง\n this.#initActions(); // ์—”ํ„ฐ ์‹œ ์‹คํ–‰ ๋กœ์ง\n\n // ๊ฒฝ๋กœ ๋ฐ์ดํ„ฐ ๋กœ๋“œ\n this.#routes = await this.#service.fetchRoutes(this.getAttribute('route-url'));\n }\n\n // --- [๊ทธ๋ฃน 1: Interaction] ํ™”๋ฉด ํ† ๊ธ€ ๋ฐ ๋ฉ”๋‰ด ํด๋ฆญ ---\n #initInteractions() {\n const $settings = this.shadowRoot.querySelector('nine-ai-settings');\n const $menuIcons = this.shadowRoot.querySelectorAll(\".menu-icon\");\n\n const toggleUI = () => this.classList.toggle(\"collapse\");\n this.shadowRoot.querySelector(\".expand-icon\").addEventListener(\"click\", toggleUI);\n this.shadowRoot.querySelector(\".collapse-icon\").addEventListener(\"click\", toggleUI);\n\n $menuIcons.forEach(el => {\n el.addEventListener(\"click\", (e) => {\n $menuIcons.forEach(icon => icon.classList.remove(\"active\"));\n const clicked = e.target.closest(\".menu-icon\");\n clicked.classList.add(\"active\");\n $settings.classList.toggle(\"expand\", clicked.classList.contains('menu-setting'));\n });\n });\n }\n\n // --- [๊ทธ๋ฃน 2: Action] ์—”ํ„ฐํ‚ค ์ž…๋ ฅ ์‹œ ์„œ๋น„์Šค ํ˜ธ์ถœ ---\n #initActions() {\n const $textarea = this.shadowRoot.querySelector('#q');\n const $status = this.shadowRoot.querySelector('#status-tag');\n\n $textarea.addEventListener('keypress', async (e) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n const command = e.target.value.trim();\n if (!command) return;\n\n // 1. UI ํ”ผ๋“œ๋ฐฑ\n $status.textContent = \"โš™๏ธ ๊ณต์ • ๋ถ„์„ ์ค‘...\";\n e.target.value = '';\n\n // 2. ์ฒดํฌ๋œ ํƒ€๊ฒŸ ์ˆ˜์ง‘\n const targets = Array.from(this.shadowRoot.querySelectorAll('input[name=\"gen_target\"]:checked'))\n .map(el => el.value);\n\n // 3. ๋ถ„๋ฆฌ๋œ ์„œ๋น„์Šค ํ˜ธ์ถœ\n try {\n const result = await this.#service.generate(command, targets, this.#routes);\n\n // 4. ์„ฑ๊ณต ์ฒ˜๋ฆฌ\n $status.textContent = \"โœ… ์™„๋ฃŒ\";\n nine.alert(\"์†Œ์Šค ์ƒ์„ฑ ์„ฑ๊ณต\").rgb();\n this.dispatchEvent(new CustomEvent('nine-mu-completed', { detail: result, bubbles: true }));\n } catch (err) {\n // 5. ์‹คํŒจ ์ฒ˜๋ฆฌ\n $status.textContent = \"โŒ ์‹คํŒจ\";\n nine.alert(err.message).rgb().shake();\n }\n }\n });\n }\n\n #render() {\n const placeholder = this.getAttribute(\"placeholder\") || \"๋‚˜์—๊ฒŒ ๋ฌด์—‡์ด๋“  ๋ฌผ์–ด๋ด...\";\n const customImport = this.getAttribute(\"css-path\") ? `@import \"${this.getAttribute(\"css-path\")}\";` : \"\";\n\n this.shadowRoot.innerHTML = `\n <style>\n @import \"https://cdn.jsdelivr.net/npm/@nine-lab/nine-mu@${__APP_VERSION__}/dist/css/nine-mu.css\";\n ${customImport}\n </style>\n <div class=\"wrapper\">\n <nine-ai-settings></nine-ai-settings>\n <div class=\"container\">\n <div class=\"head\">\n <div class=\"logo\"><span></span></div>\n <div id=\"status-tag\" style=\"font-size:10px; color:#ff5722; padding:5px;\">nine-mu Engine Ready</div>\n </div>\n <nx-ai-chat></nx-ai-chat>\n <div class=\"foot\">\n <div class=\"apply-src\">\n ${['MyBatis', 'Service', 'Controller', 'JavaScript'].map(t => `\n <div>\n <input type=\"checkbox\" id=\"${t.toLowerCase()}\" name=\"gen_target\" value=\"${t}\" checked />\n <label for=\"${t.toLowerCase()}\">${t}</label>\n </div>\n `).join('')}\n </div>\n <textarea id=\"q\" rows=\"4\" placeholder=\"${placeholder}\"></textarea>\n </div>\n </div>\n <div class=\"menu\">\n <div class=\"collapse-icon\"></div>\n <div class=\"menu-icon menu-filter active\"></div>\n <div class=\"menu-icon menu-general\"></div>\n <div class=\"menu-icon menu-setting\"></div>\n </div>\n </div>\n <div class=\"expand-icon\"></div>\n `;\n }\n}\n\nif (!customElements.get('nine-chat')) {\n customElements.define('nine-chat', NineChat);\n}","import { trace } from '@nine-lab/nine-util';\nimport { NineChat } from './components/NineChat.js';\n\n/**\n * Nine-Mu ์—”์ง„ ๋ฉ”์ธ ํด๋ž˜์Šค\n */\nexport const NineMu = {\n version: typeof __APP_VERSION__ !== 'undefined' ? __APP_VERSION__ : '0.1.0',\n init: (config) => {\n trace.log(\"๐Ÿ› ๏ธ Nine-Mu Engine initialized\", config);\n // ํ–ฅํ›„ ์ปค๋„ฅํ„ฐ URL ์ „์—ญ ์„ค์ •์ด๋‚˜ ์ธ์ฆ ํ† ํฐ ์ฒ˜๋ฆฌ ๋กœ์ง ์ถ”๊ฐ€ ๊ฐ€๋Šฅ\n }\n};\n\n// ๊ธฐ๋ณธ export ๋ฐ ์ปดํฌ๋„ŒํŠธ export\nexport default NineMu;\nexport { NineChat };"],"names":[],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@nine-lab/nine-util")):"function"==typeof define&&define.amd?define(["exports","@nine-lab/nine-util"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).NineFab={},e.NineUtil)}(this,function(e,t){"use strict";var n,i,s,a,o,r,c=e=>{throw TypeError(e)},l=(e,t,n)=>t.has(e)||c("Cannot "+n),d=(e,t,n)=>(l(e,t,"read from private field"),n?n.call(e):t.get(e)),h=(e,t,n)=>t.has(e)?c("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,n),u=(e,t,n,i)=>(l(e,t,"write to private field"),i?i.call(e,n):t.set(e,n),n),p=(e,t,n)=>(l(e,t,"access private method"),n);class v{constructor(e){this.connectorUrl=e}async generate(e,n,i){try{t.trace.log(`๐Ÿš€ Fab ๊ณต์ • ์‹œ์ž‘: "${e}" [๋Œ€์ƒ: ${n.join(", ")}]`);const s=await fetch(`${this.connectorUrl}/api/fab/generate`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({command:e,targets:n,projectType:"spring-react",currentRoutes:i})}),a=await s.json();if(!a.success)throw new Error(a.error||"์†Œ์Šค ์ƒ์„ฑ ์ค‘ ์„œ๋ฒ„ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.");return a}catch(s){throw t.trace.error("โŒ Fab Service Error:",s),s}}async fetchRoutes(e){if(!e)return[];try{const t=await fetch(e);return await t.json()}catch(n){return t.trace.error("Route load fail",n),[]}}}class f extends HTMLElement{constructor(){super(),h(this,s),h(this,n,null),h(this,i,[]),this.attachShadow({mode:"open"})}async connectedCallback(){const e=this.getAttribute("connector-url")||"http://localhost:3002";u(this,n,new v(e)),p(this,s,r).call(this),p(this,s,a).call(this),p(this,s,o).call(this),u(this,i,await d(this,n).fetchRoutes(this.getAttribute("route-url")))}}n=new WeakMap,i=new WeakMap,s=new WeakSet,a=function(){const e=this.shadowRoot.querySelector("nine-ai-settings"),t=this.shadowRoot.querySelectorAll(".menu-icon"),n=()=>this.classList.toggle("collapse");this.shadowRoot.querySelector(".expand-icon").addEventListener("click",n),this.shadowRoot.querySelector(".collapse-icon").addEventListener("click",n),t.forEach(n=>{n.addEventListener("click",n=>{t.forEach(e=>e.classList.remove("active"));const i=n.target.closest(".menu-icon");i.classList.add("active"),e.classList.toggle("expand",i.classList.contains("menu-setting"))})})},o=function(){const e=this.shadowRoot.querySelector("#q"),s=this.shadowRoot.querySelector("#status-tag");e.addEventListener("keypress",async e=>{if("Enter"===e.key&&!e.shiftKey){e.preventDefault();const o=e.target.value.trim();if(!o)return;s.textContent="โš™๏ธ ๊ณต์ • ๋ถ„์„ ์ค‘...",e.target.value="";const r=Array.from(this.shadowRoot.querySelectorAll('input[name="gen_target"]:checked')).map(e=>e.value);try{const e=await d(this,n).generate(o,r,d(this,i));s.textContent="โœ… ์™„๋ฃŒ",t.nine.alert("์†Œ์Šค ์ƒ์„ฑ ์„ฑ๊ณต").rgb(),this.dispatchEvent(new CustomEvent("nine-fab-completed",{detail:e,bubbles:!0}))}catch(a){s.textContent="โŒ ์‹คํŒจ",t.nine.alert(a.message).rgb().shake()}}})},r=function(){const e=this.getAttribute("placeholder")||"๋‚˜์—๊ฒŒ ๋ฌด์—‡์ด๋“  ๋ฌผ์–ด๋ด...",t=this.getAttribute("css-path")?`@import "${this.getAttribute("css-path")}";`:"";this.shadowRoot.innerHTML=`\n <style>\n @import "https://cdn.jsdelivr.net/npm/@nine-lab/nine-fab@0.1.15/dist/css/nine-mu.css";\n ${t}\n </style>\n <div class="wrapper">\n <nine-ai-settings></nine-ai-settings>\n <div class="container">\n <div class="head">\n <div class="logo"><span></span></div>\n <div id="status-tag" style="font-size:10px; color:#ff5722; padding:5px;">Fab Engine Ready</div>\n </div>\n <nx-ai-chat></nx-ai-chat>\n <div class="foot">\n <div class="apply-src">\n ${["MyBatis","Service","Controller","JavaScript"].map(e=>`\n <div>\n <input type="checkbox" id="${e.toLowerCase()}" name="gen_target" value="${e}" checked />\n <label for="${e.toLowerCase()}">${e}</label>\n </div>\n `).join("")}\n </div>\n <textarea id="q" rows="4" placeholder="${e}"></textarea>\n </div>\n </div>\n <div class="menu">\n <div class="collapse-icon"></div>\n <div class="menu-icon menu-filter active"></div>\n <div class="menu-icon menu-general"></div>\n <div class="menu-icon menu-setting"></div>\n </div>\n </div>\n <div class="expand-icon"></div>\n `},customElements.get("nine-chat")||customElements.define("nine-chat",f);const g={version:"0.1.15",init:e=>{t.trace.log("๐Ÿ› ๏ธ Nine-Fab Engine initialized",e)}};e.NineChat=f,e.NineFab=g,e.default=g,Object.defineProperties(e,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
1
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@nine-lab/nine-util")):"function"==typeof define&&define.amd?define(["exports","@nine-lab/nine-util"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).NineMu={},e.NineUtil)}(this,function(e,t){"use strict";var n,i,s,a,o,r,c=e=>{throw TypeError(e)},l=(e,t,n)=>t.has(e)||c("Cannot "+n),d=(e,t,n)=>(l(e,t,"read from private field"),n?n.call(e):t.get(e)),h=(e,t,n)=>t.has(e)?c("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,n),u=(e,t,n,i)=>(l(e,t,"write to private field"),i?i.call(e,n):t.set(e,n),n),p=(e,t,n)=>(l(e,t,"access private method"),n);class v{constructor(e){this.connectorUrl=e}async generate(e,n,i){try{t.trace.log(`๊ณต์ • ์‹œ์ž‘: "${e}" [๋Œ€์ƒ: ${n.join(", ")}]`);const s=await fetch(`${this.connectorUrl}/api/mu/generate`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({command:e,targets:n,projectType:"spring-react",currentRoutes:i})}),a=await s.json();if(!a.success)throw new Error(a.error||"์†Œ์Šค ์ƒ์„ฑ ์ค‘ ์„œ๋ฒ„ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.");return a}catch(s){throw t.trace.error("NineMu Service Error:",s),s}}async fetchRoutes(e){if(!e)return[];try{const t=await fetch(e);return await t.json()}catch(n){return t.trace.error("Route load fail",n),[]}}}class m extends HTMLElement{constructor(){super(),h(this,s),h(this,n,null),h(this,i,[]),this.attachShadow({mode:"open"})}async connectedCallback(){const e=this.getAttribute("connector-url")||"http://localhost:3002";u(this,n,new v(e)),p(this,s,r).call(this),p(this,s,a).call(this),p(this,s,o).call(this),u(this,i,await d(this,n).fetchRoutes(this.getAttribute("route-url")))}}n=new WeakMap,i=new WeakMap,s=new WeakSet,a=function(){const e=this.shadowRoot.querySelector("nine-ai-settings"),t=this.shadowRoot.querySelectorAll(".menu-icon"),n=()=>this.classList.toggle("collapse");this.shadowRoot.querySelector(".expand-icon").addEventListener("click",n),this.shadowRoot.querySelector(".collapse-icon").addEventListener("click",n),t.forEach(n=>{n.addEventListener("click",n=>{t.forEach(e=>e.classList.remove("active"));const i=n.target.closest(".menu-icon");i.classList.add("active"),e.classList.toggle("expand",i.classList.contains("menu-setting"))})})},o=function(){const e=this.shadowRoot.querySelector("#q"),s=this.shadowRoot.querySelector("#status-tag");e.addEventListener("keypress",async e=>{if("Enter"===e.key&&!e.shiftKey){e.preventDefault();const o=e.target.value.trim();if(!o)return;s.textContent="โš™๏ธ ๊ณต์ • ๋ถ„์„ ์ค‘...",e.target.value="";const r=Array.from(this.shadowRoot.querySelectorAll('input[name="gen_target"]:checked')).map(e=>e.value);try{const e=await d(this,n).generate(o,r,d(this,i));s.textContent="โœ… ์™„๋ฃŒ",t.nine.alert("์†Œ์Šค ์ƒ์„ฑ ์„ฑ๊ณต").rgb(),this.dispatchEvent(new CustomEvent("nine-mu-completed",{detail:e,bubbles:!0}))}catch(a){s.textContent="โŒ ์‹คํŒจ",t.nine.alert(a.message).rgb().shake()}}})},r=function(){const e=this.getAttribute("placeholder")||"๋‚˜์—๊ฒŒ ๋ฌด์—‡์ด๋“  ๋ฌผ์–ด๋ด...",t=this.getAttribute("css-path")?`@import "${this.getAttribute("css-path")}";`:"";this.shadowRoot.innerHTML=`\n <style>\n @import "https://cdn.jsdelivr.net/npm/@nine-lab/nine-mu@0.1.16/dist/css/nine-mu.css";\n ${t}\n </style>\n <div class="wrapper">\n <nine-ai-settings></nine-ai-settings>\n <div class="container">\n <div class="head">\n <div class="logo"><span></span></div>\n <div id="status-tag" style="font-size:10px; color:#ff5722; padding:5px;">nine-mu Engine Ready</div>\n </div>\n <nx-ai-chat></nx-ai-chat>\n <div class="foot">\n <div class="apply-src">\n ${["MyBatis","Service","Controller","JavaScript"].map(e=>`\n <div>\n <input type="checkbox" id="${e.toLowerCase()}" name="gen_target" value="${e}" checked />\n <label for="${e.toLowerCase()}">${e}</label>\n </div>\n `).join("")}\n </div>\n <textarea id="q" rows="4" placeholder="${e}"></textarea>\n </div>\n </div>\n <div class="menu">\n <div class="collapse-icon"></div>\n <div class="menu-icon menu-filter active"></div>\n <div class="menu-icon menu-general"></div>\n <div class="menu-icon menu-setting"></div>\n </div>\n </div>\n <div class="expand-icon"></div>\n `},customElements.get("nine-chat")||customElements.define("nine-chat",m);const g={version:"0.1.16",init:e=>{t.trace.log("๐Ÿ› ๏ธ Nine-Mu Engine initialized",e)}};e.NineChat=m,e.NineMu=g,e.default=g,Object.defineProperties(e,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
2
2
  //# sourceMappingURL=nine-mu.umd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"nine-mu.umd.js","sources":["../src/services/NineMuService.js","../src/components/NineChat.js","../src/index.js"],"sourcesContent":["import { nine, trace } from '@nine-lab/nine-util';\n\nexport class NineMuService {\n constructor(connectorUrl) {\n this.connectorUrl = connectorUrl;\n }\n\n /**\n * AI ์†Œ์Šค ์ƒ์„ฑ ์‹คํ–‰\n * @param {string} command - ์‚ฌ์šฉ์ž ์ž…๋ ฅ ๋ช…๋ น\n * @param {Array} targets - ์ฒดํฌ๋œ ์ƒ์„ฑ ๋Œ€์ƒ (MyBatis, Service ๋“ฑ)\n * @param {Array} currentRoutes - ํ˜„์žฌ ํ”„๋กœ์ ํŠธ ๊ฒฝ๋กœ ์ •๋ณด\n */\n async generate(command, targets, currentRoutes) {\n try {\n trace.log(`๐Ÿš€ Fab ๊ณต์ • ์‹œ์ž‘: \"${command}\" [๋Œ€์ƒ: ${targets.join(', ')}]`);\n\n const response = await fetch(`${this.connectorUrl}/api/fab/generate`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n command,\n targets,\n projectType: 'spring-react',\n currentRoutes\n })\n });\n\n const result = await response.json();\n\n if (!result.success) {\n throw new Error(result.error || \"์†Œ์Šค ์ƒ์„ฑ ์ค‘ ์„œ๋ฒ„ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.\");\n }\n\n return result;\n } catch (error) {\n trace.error(\"โŒ Fab Service Error:\", error);\n throw error;\n }\n }\n\n /**\n * ์ดˆ๊ธฐ ๊ฒฝ๋กœ ์ •๋ณด ๋กœ๋“œ\n */\n async fetchRoutes(routeUrl) {\n if (!routeUrl) return [];\n try {\n const res = await fetch(routeUrl);\n return await res.json();\n } catch (err) {\n trace.error(\"Route load fail\", err);\n return [];\n }\n }\n}","import { nine, trace } from '@nine-lab/nine-util';\nimport { NineMuService } from '../services/NineMuService.js';\n\nexport class NineChat extends HTMLElement {\n #service = null;\n #routes = [];\n\n constructor() {\n super();\n this.attachShadow({ mode: 'open' });\n }\n\n async connectedCallback() {\n // ์„œ๋น„์Šค ์ดˆ๊ธฐํ™”\n const connectorUrl = this.getAttribute('connector-url') || 'http://localhost:3002';\n this.#service = new NineMuService(connectorUrl);\n\n this.#render();\n this.#initInteractions(); // UI ํ† ๊ธ€ ๋กœ์ง\n this.#initActions(); // ์—”ํ„ฐ ์‹œ ์‹คํ–‰ ๋กœ์ง\n\n // ๊ฒฝ๋กœ ๋ฐ์ดํ„ฐ ๋กœ๋“œ\n this.#routes = await this.#service.fetchRoutes(this.getAttribute('route-url'));\n }\n\n // --- [๊ทธ๋ฃน 1: Interaction] ํ™”๋ฉด ํ† ๊ธ€ ๋ฐ ๋ฉ”๋‰ด ํด๋ฆญ ---\n #initInteractions() {\n const $settings = this.shadowRoot.querySelector('nine-ai-settings');\n const $menuIcons = this.shadowRoot.querySelectorAll(\".menu-icon\");\n\n const toggleUI = () => this.classList.toggle(\"collapse\");\n this.shadowRoot.querySelector(\".expand-icon\").addEventListener(\"click\", toggleUI);\n this.shadowRoot.querySelector(\".collapse-icon\").addEventListener(\"click\", toggleUI);\n\n $menuIcons.forEach(el => {\n el.addEventListener(\"click\", (e) => {\n $menuIcons.forEach(icon => icon.classList.remove(\"active\"));\n const clicked = e.target.closest(\".menu-icon\");\n clicked.classList.add(\"active\");\n $settings.classList.toggle(\"expand\", clicked.classList.contains('menu-setting'));\n });\n });\n }\n\n // --- [๊ทธ๋ฃน 2: Action] ์—”ํ„ฐํ‚ค ์ž…๋ ฅ ์‹œ ์„œ๋น„์Šค ํ˜ธ์ถœ ---\n #initActions() {\n const $textarea = this.shadowRoot.querySelector('#q');\n const $status = this.shadowRoot.querySelector('#status-tag');\n\n $textarea.addEventListener('keypress', async (e) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n const command = e.target.value.trim();\n if (!command) return;\n\n // 1. UI ํ”ผ๋“œ๋ฐฑ\n $status.textContent = \"โš™๏ธ ๊ณต์ • ๋ถ„์„ ์ค‘...\";\n e.target.value = '';\n\n // 2. ์ฒดํฌ๋œ ํƒ€๊ฒŸ ์ˆ˜์ง‘\n const targets = Array.from(this.shadowRoot.querySelectorAll('input[name=\"gen_target\"]:checked'))\n .map(el => el.value);\n\n // 3. ๋ถ„๋ฆฌ๋œ ์„œ๋น„์Šค ํ˜ธ์ถœ\n try {\n const result = await this.#service.generate(command, targets, this.#routes);\n\n // 4. ์„ฑ๊ณต ์ฒ˜๋ฆฌ\n $status.textContent = \"โœ… ์™„๋ฃŒ\";\n nine.alert(\"์†Œ์Šค ์ƒ์„ฑ ์„ฑ๊ณต\").rgb();\n this.dispatchEvent(new CustomEvent('nine-fab-completed', { detail: result, bubbles: true }));\n } catch (err) {\n // 5. ์‹คํŒจ ์ฒ˜๋ฆฌ\n $status.textContent = \"โŒ ์‹คํŒจ\";\n nine.alert(err.message).rgb().shake();\n }\n }\n });\n }\n\n #render() {\n const placeholder = this.getAttribute(\"placeholder\") || \"๋‚˜์—๊ฒŒ ๋ฌด์—‡์ด๋“  ๋ฌผ์–ด๋ด...\";\n const customImport = this.getAttribute(\"css-path\") ? `@import \"${this.getAttribute(\"css-path\")}\";` : \"\";\n\n this.shadowRoot.innerHTML = `\n <style>\n @import \"https://cdn.jsdelivr.net/npm/@nine-lab/nine-fab@${__APP_VERSION__}/dist/css/nine-mu.css\";\n ${customImport}\n </style>\n <div class=\"wrapper\">\n <nine-ai-settings></nine-ai-settings>\n <div class=\"container\">\n <div class=\"head\">\n <div class=\"logo\"><span></span></div>\n <div id=\"status-tag\" style=\"font-size:10px; color:#ff5722; padding:5px;\">Fab Engine Ready</div>\n </div>\n <nx-ai-chat></nx-ai-chat>\n <div class=\"foot\">\n <div class=\"apply-src\">\n ${['MyBatis', 'Service', 'Controller', 'JavaScript'].map(t => `\n <div>\n <input type=\"checkbox\" id=\"${t.toLowerCase()}\" name=\"gen_target\" value=\"${t}\" checked />\n <label for=\"${t.toLowerCase()}\">${t}</label>\n </div>\n `).join('')}\n </div>\n <textarea id=\"q\" rows=\"4\" placeholder=\"${placeholder}\"></textarea>\n </div>\n </div>\n <div class=\"menu\">\n <div class=\"collapse-icon\"></div>\n <div class=\"menu-icon menu-filter active\"></div>\n <div class=\"menu-icon menu-general\"></div>\n <div class=\"menu-icon menu-setting\"></div>\n </div>\n </div>\n <div class=\"expand-icon\"></div>\n `;\n }\n}\n\nif (!customElements.get('nine-chat')) {\n customElements.define('nine-chat', NineChat);\n}","import { trace } from '@nine-lab/nine-util';\nimport { NineChat } from './components/NineChat.js';\n\n/**\n * Nine-Fab ์—”์ง„ ๋ฉ”์ธ ํด๋ž˜์Šค\n */\nexport const NineFab = {\n version: typeof __APP_VERSION__ !== 'undefined' ? __APP_VERSION__ : '0.1.0',\n init: (config) => {\n trace.log(\"๐Ÿ› ๏ธ Nine-Fab Engine initialized\", config);\n // ํ–ฅํ›„ ์ปค๋„ฅํ„ฐ URL ์ „์—ญ ์„ค์ •์ด๋‚˜ ์ธ์ฆ ํ† ํฐ ์ฒ˜๋ฆฌ ๋กœ์ง ์ถ”๊ฐ€ ๊ฐ€๋Šฅ\n }\n};\n\n// ๊ธฐ๋ณธ export ๋ฐ ์ปดํฌ๋„ŒํŠธ export\nexport default NineFab;\nexport { NineChat };"],"names":["NineMuService","constructor","connectorUrl","this","generate","command","targets","currentRoutes","trace","log","join","response","fetch","method","headers","body","JSON","stringify","projectType","result","json","success","Error","error","fetchRoutes","routeUrl","res","err","NineChat","HTMLElement","super","__privateAdd","_NineChat_instances","_service","_routes","attachShadow","mode","connectedCallback","getAttribute","__privateSet","__privateMethod","render_fn","call","initInteractions_fn","initActions_fn","__privateGet","WeakMap","WeakSet","$settings","shadowRoot","querySelector","$menuIcons","querySelectorAll","toggleUI","classList","toggle","addEventListener","forEach","el","e","icon","remove","clicked","target","closest","add","contains","$textarea","$status","async","key","shiftKey","preventDefault","value","trim","textContent","Array","from","map","nine","alert","rgb","dispatchEvent","CustomEvent","detail","bubbles","message","shake","placeholder","customImport","innerHTML","t","toLowerCase","customElements","get","define","NineFab","version","init","config"],"mappings":"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"}
1
+ {"version":3,"file":"nine-mu.umd.js","sources":["../src/services/NineMuService.js","../src/components/NineChat.js","../src/index.js"],"sourcesContent":["import { nine, trace } from '@nine-lab/nine-util';\n\nexport class NineMuService {\n constructor(connectorUrl) {\n this.connectorUrl = connectorUrl;\n }\n\n /**\n * AI ์†Œ์Šค ์ƒ์„ฑ ์‹คํ–‰\n * @param {string} command - ์‚ฌ์šฉ์ž ์ž…๋ ฅ ๋ช…๋ น\n * @param {Array} targets - ์ฒดํฌ๋œ ์ƒ์„ฑ ๋Œ€์ƒ (MyBatis, Service ๋“ฑ)\n * @param {Array} currentRoutes - ํ˜„์žฌ ํ”„๋กœ์ ํŠธ ๊ฒฝ๋กœ ์ •๋ณด\n */\n async generate(command, targets, currentRoutes) {\n try {\n trace.log(`๊ณต์ • ์‹œ์ž‘: \"${command}\" [๋Œ€์ƒ: ${targets.join(', ')}]`);\n\n const response = await fetch(`${this.connectorUrl}/api/mu/generate`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n command,\n targets,\n projectType: 'spring-react',\n currentRoutes\n })\n });\n\n const result = await response.json();\n\n if (!result.success) {\n throw new Error(result.error || \"์†Œ์Šค ์ƒ์„ฑ ์ค‘ ์„œ๋ฒ„ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.\");\n }\n\n return result;\n } catch (error) {\n trace.error(\"NineMu Service Error:\", error);\n throw error;\n }\n }\n\n /**\n * ์ดˆ๊ธฐ ๊ฒฝ๋กœ ์ •๋ณด ๋กœ๋“œ\n */\n async fetchRoutes(routeUrl) {\n if (!routeUrl) return [];\n try {\n const res = await fetch(routeUrl);\n return await res.json();\n } catch (err) {\n trace.error(\"Route load fail\", err);\n return [];\n }\n }\n}","import { nine, trace } from '@nine-lab/nine-util';\nimport { NineMuService } from '../services/NineMuService.js';\n\nexport class NineChat extends HTMLElement {\n #service = null;\n #routes = [];\n\n constructor() {\n super();\n this.attachShadow({ mode: 'open' });\n }\n\n async connectedCallback() {\n // ์„œ๋น„์Šค ์ดˆ๊ธฐํ™”\n const connectorUrl = this.getAttribute('connector-url') || 'http://localhost:3002';\n this.#service = new NineMuService(connectorUrl);\n\n this.#render();\n this.#initInteractions(); // UI ํ† ๊ธ€ ๋กœ์ง\n this.#initActions(); // ์—”ํ„ฐ ์‹œ ์‹คํ–‰ ๋กœ์ง\n\n // ๊ฒฝ๋กœ ๋ฐ์ดํ„ฐ ๋กœ๋“œ\n this.#routes = await this.#service.fetchRoutes(this.getAttribute('route-url'));\n }\n\n // --- [๊ทธ๋ฃน 1: Interaction] ํ™”๋ฉด ํ† ๊ธ€ ๋ฐ ๋ฉ”๋‰ด ํด๋ฆญ ---\n #initInteractions() {\n const $settings = this.shadowRoot.querySelector('nine-ai-settings');\n const $menuIcons = this.shadowRoot.querySelectorAll(\".menu-icon\");\n\n const toggleUI = () => this.classList.toggle(\"collapse\");\n this.shadowRoot.querySelector(\".expand-icon\").addEventListener(\"click\", toggleUI);\n this.shadowRoot.querySelector(\".collapse-icon\").addEventListener(\"click\", toggleUI);\n\n $menuIcons.forEach(el => {\n el.addEventListener(\"click\", (e) => {\n $menuIcons.forEach(icon => icon.classList.remove(\"active\"));\n const clicked = e.target.closest(\".menu-icon\");\n clicked.classList.add(\"active\");\n $settings.classList.toggle(\"expand\", clicked.classList.contains('menu-setting'));\n });\n });\n }\n\n // --- [๊ทธ๋ฃน 2: Action] ์—”ํ„ฐํ‚ค ์ž…๋ ฅ ์‹œ ์„œ๋น„์Šค ํ˜ธ์ถœ ---\n #initActions() {\n const $textarea = this.shadowRoot.querySelector('#q');\n const $status = this.shadowRoot.querySelector('#status-tag');\n\n $textarea.addEventListener('keypress', async (e) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n const command = e.target.value.trim();\n if (!command) return;\n\n // 1. UI ํ”ผ๋“œ๋ฐฑ\n $status.textContent = \"โš™๏ธ ๊ณต์ • ๋ถ„์„ ์ค‘...\";\n e.target.value = '';\n\n // 2. ์ฒดํฌ๋œ ํƒ€๊ฒŸ ์ˆ˜์ง‘\n const targets = Array.from(this.shadowRoot.querySelectorAll('input[name=\"gen_target\"]:checked'))\n .map(el => el.value);\n\n // 3. ๋ถ„๋ฆฌ๋œ ์„œ๋น„์Šค ํ˜ธ์ถœ\n try {\n const result = await this.#service.generate(command, targets, this.#routes);\n\n // 4. ์„ฑ๊ณต ์ฒ˜๋ฆฌ\n $status.textContent = \"โœ… ์™„๋ฃŒ\";\n nine.alert(\"์†Œ์Šค ์ƒ์„ฑ ์„ฑ๊ณต\").rgb();\n this.dispatchEvent(new CustomEvent('nine-mu-completed', { detail: result, bubbles: true }));\n } catch (err) {\n // 5. ์‹คํŒจ ์ฒ˜๋ฆฌ\n $status.textContent = \"โŒ ์‹คํŒจ\";\n nine.alert(err.message).rgb().shake();\n }\n }\n });\n }\n\n #render() {\n const placeholder = this.getAttribute(\"placeholder\") || \"๋‚˜์—๊ฒŒ ๋ฌด์—‡์ด๋“  ๋ฌผ์–ด๋ด...\";\n const customImport = this.getAttribute(\"css-path\") ? `@import \"${this.getAttribute(\"css-path\")}\";` : \"\";\n\n this.shadowRoot.innerHTML = `\n <style>\n @import \"https://cdn.jsdelivr.net/npm/@nine-lab/nine-mu@${__APP_VERSION__}/dist/css/nine-mu.css\";\n ${customImport}\n </style>\n <div class=\"wrapper\">\n <nine-ai-settings></nine-ai-settings>\n <div class=\"container\">\n <div class=\"head\">\n <div class=\"logo\"><span></span></div>\n <div id=\"status-tag\" style=\"font-size:10px; color:#ff5722; padding:5px;\">nine-mu Engine Ready</div>\n </div>\n <nx-ai-chat></nx-ai-chat>\n <div class=\"foot\">\n <div class=\"apply-src\">\n ${['MyBatis', 'Service', 'Controller', 'JavaScript'].map(t => `\n <div>\n <input type=\"checkbox\" id=\"${t.toLowerCase()}\" name=\"gen_target\" value=\"${t}\" checked />\n <label for=\"${t.toLowerCase()}\">${t}</label>\n </div>\n `).join('')}\n </div>\n <textarea id=\"q\" rows=\"4\" placeholder=\"${placeholder}\"></textarea>\n </div>\n </div>\n <div class=\"menu\">\n <div class=\"collapse-icon\"></div>\n <div class=\"menu-icon menu-filter active\"></div>\n <div class=\"menu-icon menu-general\"></div>\n <div class=\"menu-icon menu-setting\"></div>\n </div>\n </div>\n <div class=\"expand-icon\"></div>\n `;\n }\n}\n\nif (!customElements.get('nine-chat')) {\n customElements.define('nine-chat', NineChat);\n}","import { trace } from '@nine-lab/nine-util';\nimport { NineChat } from './components/NineChat.js';\n\n/**\n * Nine-Mu ์—”์ง„ ๋ฉ”์ธ ํด๋ž˜์Šค\n */\nexport const NineMu = {\n version: typeof __APP_VERSION__ !== 'undefined' ? __APP_VERSION__ : '0.1.0',\n init: (config) => {\n trace.log(\"๐Ÿ› ๏ธ Nine-Mu Engine initialized\", config);\n // ํ–ฅํ›„ ์ปค๋„ฅํ„ฐ URL ์ „์—ญ ์„ค์ •์ด๋‚˜ ์ธ์ฆ ํ† ํฐ ์ฒ˜๋ฆฌ ๋กœ์ง ์ถ”๊ฐ€ ๊ฐ€๋Šฅ\n }\n};\n\n// ๊ธฐ๋ณธ export ๋ฐ ์ปดํฌ๋„ŒํŠธ export\nexport default NineMu;\nexport { NineChat };"],"names":["NineMuService","constructor","connectorUrl","this","generate","command","targets","currentRoutes","trace","log","join","response","fetch","method","headers","body","JSON","stringify","projectType","result","json","success","Error","error","fetchRoutes","routeUrl","res","err","NineChat","HTMLElement","super","__privateAdd","_NineChat_instances","_service","_routes","attachShadow","mode","connectedCallback","getAttribute","__privateSet","__privateMethod","render_fn","call","initInteractions_fn","initActions_fn","__privateGet","WeakMap","WeakSet","$settings","shadowRoot","querySelector","$menuIcons","querySelectorAll","toggleUI","classList","toggle","addEventListener","forEach","el","e","icon","remove","clicked","target","closest","add","contains","$textarea","$status","async","key","shiftKey","preventDefault","value","trim","textContent","Array","from","map","nine","alert","rgb","dispatchEvent","CustomEvent","detail","bubbles","message","shake","placeholder","customImport","innerHTML","t","toLowerCase","customElements","get","define","NineMu","version","init","config"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nine-lab/nine-mu",
3
- "version": "0.1.16",
3
+ "version": "0.1.17",
4
4
  "description": "AI-Driven Full-Stack Code Fabrication Engine",
5
5
  "type": "module",
6
6
  "main": "./dist/nine-mu.umd.js",
@@ -33,7 +33,7 @@
33
33
  "access": "public"
34
34
  },
35
35
  "keywords": [
36
- "fab",
36
+ "mu",
37
37
  "codegen",
38
38
  "ai",
39
39
  "gemini",
@@ -68,7 +68,7 @@ export class NineChat extends HTMLElement {
68
68
  // 4. ์„ฑ๊ณต ์ฒ˜๋ฆฌ
69
69
  $status.textContent = "โœ… ์™„๋ฃŒ";
70
70
  nine.alert("์†Œ์Šค ์ƒ์„ฑ ์„ฑ๊ณต").rgb();
71
- this.dispatchEvent(new CustomEvent('nine-fab-completed', { detail: result, bubbles: true }));
71
+ this.dispatchEvent(new CustomEvent('nine-mu-completed', { detail: result, bubbles: true }));
72
72
  } catch (err) {
73
73
  // 5. ์‹คํŒจ ์ฒ˜๋ฆฌ
74
74
  $status.textContent = "โŒ ์‹คํŒจ";
@@ -84,7 +84,7 @@ export class NineChat extends HTMLElement {
84
84
 
85
85
  this.shadowRoot.innerHTML = `
86
86
  <style>
87
- @import "https://cdn.jsdelivr.net/npm/@nine-lab/nine-fab@${__APP_VERSION__}/dist/css/nine-mu.css";
87
+ @import "https://cdn.jsdelivr.net/npm/@nine-lab/nine-mu@${__APP_VERSION__}/dist/css/nine-mu.css";
88
88
  ${customImport}
89
89
  </style>
90
90
  <div class="wrapper">
@@ -92,7 +92,7 @@ export class NineChat extends HTMLElement {
92
92
  <div class="container">
93
93
  <div class="head">
94
94
  <div class="logo"><span></span></div>
95
- <div id="status-tag" style="font-size:10px; color:#ff5722; padding:5px;">Fab Engine Ready</div>
95
+ <div id="status-tag" style="font-size:10px; color:#ff5722; padding:5px;">nine-mu Engine Ready</div>
96
96
  </div>
97
97
  <nx-ai-chat></nx-ai-chat>
98
98
  <div class="foot">
package/src/index.js CHANGED
@@ -2,16 +2,16 @@ import { trace } from '@nine-lab/nine-util';
2
2
  import { NineChat } from './components/NineChat.js';
3
3
 
4
4
  /**
5
- * Nine-Fab ์—”์ง„ ๋ฉ”์ธ ํด๋ž˜์Šค
5
+ * Nine-Mu ์—”์ง„ ๋ฉ”์ธ ํด๋ž˜์Šค
6
6
  */
7
- export const NineFab = {
7
+ export const NineMu = {
8
8
  version: typeof __APP_VERSION__ !== 'undefined' ? __APP_VERSION__ : '0.1.0',
9
9
  init: (config) => {
10
- trace.log("๐Ÿ› ๏ธ Nine-Fab Engine initialized", config);
10
+ trace.log("๐Ÿ› ๏ธ Nine-Mu Engine initialized", config);
11
11
  // ํ–ฅํ›„ ์ปค๋„ฅํ„ฐ URL ์ „์—ญ ์„ค์ •์ด๋‚˜ ์ธ์ฆ ํ† ํฐ ์ฒ˜๋ฆฌ ๋กœ์ง ์ถ”๊ฐ€ ๊ฐ€๋Šฅ
12
12
  }
13
13
  };
14
14
 
15
15
  // ๊ธฐ๋ณธ export ๋ฐ ์ปดํฌ๋„ŒํŠธ export
16
- export default NineFab;
16
+ export default NineMu;
17
17
  export { NineChat };
@@ -13,9 +13,9 @@ export class NineMuService {
13
13
  */
14
14
  async generate(command, targets, currentRoutes) {
15
15
  try {
16
- trace.log(`๐Ÿš€ Fab ๊ณต์ • ์‹œ์ž‘: "${command}" [๋Œ€์ƒ: ${targets.join(', ')}]`);
16
+ trace.log(`๊ณต์ • ์‹œ์ž‘: "${command}" [๋Œ€์ƒ: ${targets.join(', ')}]`);
17
17
 
18
- const response = await fetch(`${this.connectorUrl}/api/fab/generate`, {
18
+ const response = await fetch(`${this.connectorUrl}/api/mu/generate`, {
19
19
  method: 'POST',
20
20
  headers: { 'Content-Type': 'application/json' },
21
21
  body: JSON.stringify({
@@ -34,7 +34,7 @@ export class NineMuService {
34
34
 
35
35
  return result;
36
36
  } catch (error) {
37
- trace.error("โŒ Fab Service Error:", error);
37
+ trace.error("NineMu Service Error:", error);
38
38
  throw error;
39
39
  }
40
40
  }
package/vite.config.js CHANGED
@@ -9,7 +9,7 @@ export default defineConfig({
9
9
  build: {
10
10
  lib: {
11
11
  entry: resolve(__dirname, 'src/index.js'),
12
- name: 'NineFab',
12
+ name: 'NineMu',
13
13
  fileName: (format) => `nine-mu.${format === 'es' ? 'js' : 'umd.js'}`,
14
14
  formats: ['es', 'umd']
15
15
  },