@askexenow/exe-os 0.8.11 → 0.8.13
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/bin/cli.js +21 -12
- package/dist/bin/exe-call.js +15 -6
- package/dist/bin/exe-new-employee.js +10 -3
- package/dist/bin/setup.js +19 -10
- package/dist/lib/employee-templates.js +6 -0
- package/dist/lib/employees.js +4 -3
- package/dist/mcp/server.js +4 -3
- package/dist/tui/App.js +4 -3
- package/package.json +1 -1
package/dist/bin/cli.js
CHANGED
|
@@ -318,10 +318,11 @@ function getEmployee(employees, name) {
|
|
|
318
318
|
return employees.find((e) => e.name.toLowerCase() === name.toLowerCase());
|
|
319
319
|
}
|
|
320
320
|
function addEmployee(employees, employee) {
|
|
321
|
-
|
|
322
|
-
|
|
321
|
+
const normalized = { ...employee, name: employee.name.toLowerCase() };
|
|
322
|
+
if (employees.some((e) => e.name.toLowerCase() === normalized.name)) {
|
|
323
|
+
throw new Error(`Employee '${normalized.name}' already exists`);
|
|
323
324
|
}
|
|
324
|
-
return [...employees,
|
|
325
|
+
return [...employees, normalized];
|
|
325
326
|
}
|
|
326
327
|
function registerBinSymlinks(name) {
|
|
327
328
|
const created = [];
|
|
@@ -3712,6 +3713,7 @@ __export(employee_templates_exports, {
|
|
|
3712
3713
|
buildCustomEmployeePrompt: () => buildCustomEmployeePrompt,
|
|
3713
3714
|
getSessionPrompt: () => getSessionPrompt,
|
|
3714
3715
|
getTemplate: () => getTemplate,
|
|
3716
|
+
personalizePrompt: () => personalizePrompt,
|
|
3715
3717
|
renderClientCOOTemplate: () => renderClientCOOTemplate
|
|
3716
3718
|
});
|
|
3717
3719
|
function getSessionPrompt(storedPrompt) {
|
|
@@ -3726,6 +3728,11 @@ function buildCustomEmployeePrompt(name, role) {
|
|
|
3726
3728
|
function getTemplate(name) {
|
|
3727
3729
|
return TEMPLATES[name];
|
|
3728
3730
|
}
|
|
3731
|
+
function personalizePrompt(prompt, templateName, actualName) {
|
|
3732
|
+
if (templateName === actualName) return prompt;
|
|
3733
|
+
const escaped = templateName.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
3734
|
+
return prompt.replace(new RegExp(`\\bYou are ${escaped}\\b`, "g"), `You are ${actualName}`);
|
|
3735
|
+
}
|
|
3729
3736
|
function renderClientCOOTemplate(vars) {
|
|
3730
3737
|
for (const key of CLIENT_COO_PLACEHOLDERS) {
|
|
3731
3738
|
const value = vars[key];
|
|
@@ -5020,14 +5027,14 @@ async function runSetupWizard(opts = {}) {
|
|
|
5020
5027
|
log("You talk to them. They coordinate everyone else.");
|
|
5021
5028
|
log("");
|
|
5022
5029
|
const cooNameInput = await ask(rl, "Name your COO (default: exe): ");
|
|
5023
|
-
const cooName = cooNameInput || "exe";
|
|
5030
|
+
const cooName = (cooNameInput || "exe").toLowerCase();
|
|
5024
5031
|
let employees = await loadEmployees2(EMPLOYEES_PATH2).catch(() => []);
|
|
5025
5032
|
if (!employees.some((e) => e.name === cooName)) {
|
|
5026
|
-
const { DEFAULT_EXE: DEFAULT_EXE2 } = await Promise.resolve().then(() => (init_employee_templates(), employee_templates_exports));
|
|
5033
|
+
const { DEFAULT_EXE: DEFAULT_EXE2, personalizePrompt: personalizePrompt2 } = await Promise.resolve().then(() => (init_employee_templates(), employee_templates_exports));
|
|
5027
5034
|
const cooEmployee = {
|
|
5028
5035
|
name: cooName,
|
|
5029
5036
|
role: "COO",
|
|
5030
|
-
systemPrompt: DEFAULT_EXE2.systemPrompt,
|
|
5037
|
+
systemPrompt: personalizePrompt2(DEFAULT_EXE2.systemPrompt, "exe", cooName),
|
|
5031
5038
|
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
5032
5039
|
templateName: "exe",
|
|
5033
5040
|
templateVersion: 1
|
|
@@ -5106,13 +5113,14 @@ async function runSetupWizard(opts = {}) {
|
|
|
5106
5113
|
const createCto = await ask(rl, "Create your CTO? (Y/n): ");
|
|
5107
5114
|
if (createCto.toLowerCase() !== "n") {
|
|
5108
5115
|
const ctoNameInput = await ask(rl, "Name your CTO (default: yoshi): ");
|
|
5109
|
-
const ctoName = ctoNameInput || "yoshi";
|
|
5116
|
+
const ctoName = (ctoNameInput || "yoshi").toLowerCase();
|
|
5110
5117
|
if (!employees.some((e) => e.name === ctoName)) {
|
|
5111
5118
|
const ctoTemplate = getEmployeeTemplate("yoshi");
|
|
5119
|
+
const { personalizePrompt: personalizeCto } = await Promise.resolve().then(() => (init_employee_templates(), employee_templates_exports));
|
|
5112
5120
|
const ctoEmployee = {
|
|
5113
5121
|
name: ctoName,
|
|
5114
5122
|
role: "CTO",
|
|
5115
|
-
systemPrompt: ctoTemplate?.systemPrompt ?? "",
|
|
5123
|
+
systemPrompt: personalizeCto(ctoTemplate?.systemPrompt ?? "", "yoshi", ctoName),
|
|
5116
5124
|
createdAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
5117
5125
|
};
|
|
5118
5126
|
employees = addEmployee2(employees, ctoEmployee);
|
|
@@ -5132,13 +5140,14 @@ async function runSetupWizard(opts = {}) {
|
|
|
5132
5140
|
const createCmo = await ask(rl, "Create your CMO? (Y/n): ");
|
|
5133
5141
|
if (createCmo.toLowerCase() !== "n") {
|
|
5134
5142
|
const cmoNameInput = await ask(rl, "Name your CMO (default: mari): ");
|
|
5135
|
-
const cmoName = cmoNameInput || "mari";
|
|
5143
|
+
const cmoName = (cmoNameInput || "mari").toLowerCase();
|
|
5136
5144
|
if (!employees.some((e) => e.name === cmoName)) {
|
|
5137
5145
|
const cmoTemplate = getEmployeeTemplate("mari");
|
|
5146
|
+
const { personalizePrompt: personalizeCmo } = await Promise.resolve().then(() => (init_employee_templates(), employee_templates_exports));
|
|
5138
5147
|
const cmoEmployee = {
|
|
5139
5148
|
name: cmoName,
|
|
5140
5149
|
role: "CMO",
|
|
5141
|
-
systemPrompt: cmoTemplate?.systemPrompt ?? "",
|
|
5150
|
+
systemPrompt: personalizeCmo(cmoTemplate?.systemPrompt ?? "", "mari", cmoName),
|
|
5142
5151
|
createdAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
5143
5152
|
};
|
|
5144
5153
|
employees = addEmployee2(employees, cmoEmployee);
|
|
@@ -21507,7 +21516,7 @@ async function runActivate(key) {
|
|
|
21507
21516
|
}
|
|
21508
21517
|
const { saveLicense: saveLicense2, mirrorLicenseKey: mirrorLicenseKey2, validateLicense: validateLicense2 } = await Promise.resolve().then(() => (init_license(), license_exports));
|
|
21509
21518
|
const { loadEmployees: loadEmployees2, saveEmployees: saveEmployees2, addEmployee: addEmployee2, registerBinSymlinks: registerBinSymlinks2 } = await Promise.resolve().then(() => (init_employees(), employees_exports));
|
|
21510
|
-
const { getTemplate: getTemplate3 } = await Promise.resolve().then(() => (init_employee_templates(), employee_templates_exports));
|
|
21519
|
+
const { getTemplate: getTemplate3, personalizePrompt: personalizePrompt2 } = await Promise.resolve().then(() => (init_employee_templates(), employee_templates_exports));
|
|
21511
21520
|
const { getTemplate: getIdentityTemplate } = await Promise.resolve().then(() => (init_identity_templates(), identity_templates_exports));
|
|
21512
21521
|
const { identityPath: identityPath2 } = await Promise.resolve().then(() => (init_identity(), identity_exports));
|
|
21513
21522
|
const { createInterface: createInterface4 } = await import("readline");
|
|
@@ -21535,7 +21544,7 @@ async function runActivate(key) {
|
|
|
21535
21544
|
const name = nameInput || defaultName;
|
|
21536
21545
|
const template = getTemplate3(templateName);
|
|
21537
21546
|
if (!template) return;
|
|
21538
|
-
const emp = { ...template, name, createdAt: (/* @__PURE__ */ new Date()).toISOString() };
|
|
21547
|
+
const emp = { ...template, name, systemPrompt: personalizePrompt2(template.systemPrompt, template.name, name), createdAt: (/* @__PURE__ */ new Date()).toISOString() };
|
|
21539
21548
|
employees = addEmployee2(employees, emp);
|
|
21540
21549
|
await saveEmployees2(employees);
|
|
21541
21550
|
registerBinSymlinks2(name);
|
package/dist/bin/exe-call.js
CHANGED
|
@@ -155,10 +155,11 @@ function getEmployee(employees, name) {
|
|
|
155
155
|
return employees.find((e) => e.name.toLowerCase() === name.toLowerCase());
|
|
156
156
|
}
|
|
157
157
|
function addEmployee(employees, employee) {
|
|
158
|
-
|
|
159
|
-
|
|
158
|
+
const normalized = { ...employee, name: employee.name.toLowerCase() };
|
|
159
|
+
if (employees.some((e) => e.name.toLowerCase() === normalized.name)) {
|
|
160
|
+
throw new Error(`Employee '${normalized.name}' already exists`);
|
|
160
161
|
}
|
|
161
|
-
return [...employees,
|
|
162
|
+
return [...employees, normalized];
|
|
162
163
|
}
|
|
163
164
|
function registerBinSymlinks(name) {
|
|
164
165
|
const created = [];
|
|
@@ -215,6 +216,7 @@ __export(employee_templates_exports, {
|
|
|
215
216
|
buildCustomEmployeePrompt: () => buildCustomEmployeePrompt,
|
|
216
217
|
getSessionPrompt: () => getSessionPrompt,
|
|
217
218
|
getTemplate: () => getTemplate,
|
|
219
|
+
personalizePrompt: () => personalizePrompt,
|
|
218
220
|
renderClientCOOTemplate: () => renderClientCOOTemplate
|
|
219
221
|
});
|
|
220
222
|
function getSessionPrompt(storedPrompt) {
|
|
@@ -229,6 +231,11 @@ function buildCustomEmployeePrompt(name, role) {
|
|
|
229
231
|
function getTemplate(name) {
|
|
230
232
|
return TEMPLATES[name];
|
|
231
233
|
}
|
|
234
|
+
function personalizePrompt(prompt, templateName, actualName) {
|
|
235
|
+
if (templateName === actualName) return prompt;
|
|
236
|
+
const escaped = templateName.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
237
|
+
return prompt.replace(new RegExp(`\\bYou are ${escaped}\\b`, "g"), `You are ${actualName}`);
|
|
238
|
+
}
|
|
232
239
|
function renderClientCOOTemplate(vars) {
|
|
233
240
|
for (const key of CLIENT_COO_PLACEHOLDERS) {
|
|
234
241
|
const value = vars[key];
|
|
@@ -855,13 +862,15 @@ if (isMainModule(import.meta.url)) {
|
|
|
855
862
|
const employee = resolveEmployee(name, employees);
|
|
856
863
|
let prompt = employee.systemPrompt;
|
|
857
864
|
if (!prompt || prompt.trim().length < 20) {
|
|
858
|
-
const { DEFAULT_EXE: DEFAULT_EXE2, TEMPLATES: TEMPLATES2 } = await Promise.resolve().then(() => (init_employee_templates(), employee_templates_exports));
|
|
865
|
+
const { DEFAULT_EXE: DEFAULT_EXE2, TEMPLATES: TEMPLATES2, personalizePrompt: personalizePrompt2 } = await Promise.resolve().then(() => (init_employee_templates(), employee_templates_exports));
|
|
859
866
|
if (employee.role === "COO") {
|
|
860
|
-
prompt = DEFAULT_EXE2.systemPrompt;
|
|
867
|
+
prompt = personalizePrompt2(DEFAULT_EXE2.systemPrompt, "exe", employee.name);
|
|
861
868
|
} else {
|
|
862
869
|
const templateKey = employee.templateName ?? employee.name;
|
|
863
870
|
const template = TEMPLATES2[templateKey];
|
|
864
|
-
|
|
871
|
+
if (template) {
|
|
872
|
+
prompt = personalizePrompt2(template.systemPrompt, templateKey, employee.name);
|
|
873
|
+
}
|
|
865
874
|
}
|
|
866
875
|
if (prompt && prompt.length > 20) {
|
|
867
876
|
const { saveEmployees: saveEmployees2 } = await Promise.resolve().then(() => (init_employees(), employees_exports));
|
|
@@ -748,10 +748,11 @@ async function saveEmployees(employees, employeesPath = EMPLOYEES_PATH) {
|
|
|
748
748
|
await writeFile2(employeesPath, JSON.stringify(employees, null, 2) + "\n", "utf-8");
|
|
749
749
|
}
|
|
750
750
|
function addEmployee(employees, employee) {
|
|
751
|
-
|
|
752
|
-
|
|
751
|
+
const normalized = { ...employee, name: employee.name.toLowerCase() };
|
|
752
|
+
if (employees.some((e) => e.name.toLowerCase() === normalized.name)) {
|
|
753
|
+
throw new Error(`Employee '${normalized.name}' already exists`);
|
|
753
754
|
}
|
|
754
|
-
return [...employees,
|
|
755
|
+
return [...employees, normalized];
|
|
755
756
|
}
|
|
756
757
|
function registerBinSymlinks(name) {
|
|
757
758
|
const created = [];
|
|
@@ -1081,6 +1082,11 @@ function buildCustomEmployeePrompt(name, role) {
|
|
|
1081
1082
|
function getTemplate(name) {
|
|
1082
1083
|
return TEMPLATES[name];
|
|
1083
1084
|
}
|
|
1085
|
+
function personalizePrompt(prompt, templateName, actualName) {
|
|
1086
|
+
if (templateName === actualName) return prompt;
|
|
1087
|
+
const escaped = templateName.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
1088
|
+
return prompt.replace(new RegExp(`\\bYou are ${escaped}\\b`, "g"), `You are ${actualName}`);
|
|
1089
|
+
}
|
|
1084
1090
|
|
|
1085
1091
|
// src/lib/is-main.ts
|
|
1086
1092
|
import { realpathSync } from "fs";
|
|
@@ -1305,6 +1311,7 @@ async function main() {
|
|
|
1305
1311
|
newEmployee = {
|
|
1306
1312
|
...template,
|
|
1307
1313
|
name,
|
|
1314
|
+
systemPrompt: personalizePrompt(template.systemPrompt, template.name, name),
|
|
1308
1315
|
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
1309
1316
|
templateName: effectiveTemplate,
|
|
1310
1317
|
templateVersion: TEMPLATE_VERSION
|
package/dist/bin/setup.js
CHANGED
|
@@ -1012,10 +1012,11 @@ function getEmployee(employees, name) {
|
|
|
1012
1012
|
return employees.find((e) => e.name.toLowerCase() === name.toLowerCase());
|
|
1013
1013
|
}
|
|
1014
1014
|
function addEmployee(employees, employee) {
|
|
1015
|
-
|
|
1016
|
-
|
|
1015
|
+
const normalized = { ...employee, name: employee.name.toLowerCase() };
|
|
1016
|
+
if (employees.some((e) => e.name.toLowerCase() === normalized.name)) {
|
|
1017
|
+
throw new Error(`Employee '${normalized.name}' already exists`);
|
|
1017
1018
|
}
|
|
1018
|
-
return [...employees,
|
|
1019
|
+
return [...employees, normalized];
|
|
1019
1020
|
}
|
|
1020
1021
|
function registerBinSymlinks(name) {
|
|
1021
1022
|
const created = [];
|
|
@@ -1072,6 +1073,7 @@ __export(employee_templates_exports, {
|
|
|
1072
1073
|
buildCustomEmployeePrompt: () => buildCustomEmployeePrompt,
|
|
1073
1074
|
getSessionPrompt: () => getSessionPrompt,
|
|
1074
1075
|
getTemplate: () => getTemplate,
|
|
1076
|
+
personalizePrompt: () => personalizePrompt,
|
|
1075
1077
|
renderClientCOOTemplate: () => renderClientCOOTemplate
|
|
1076
1078
|
});
|
|
1077
1079
|
function getSessionPrompt(storedPrompt) {
|
|
@@ -1086,6 +1088,11 @@ function buildCustomEmployeePrompt(name, role) {
|
|
|
1086
1088
|
function getTemplate(name) {
|
|
1087
1089
|
return TEMPLATES[name];
|
|
1088
1090
|
}
|
|
1091
|
+
function personalizePrompt(prompt, templateName, actualName) {
|
|
1092
|
+
if (templateName === actualName) return prompt;
|
|
1093
|
+
const escaped = templateName.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
1094
|
+
return prompt.replace(new RegExp(`\\bYou are ${escaped}\\b`, "g"), `You are ${actualName}`);
|
|
1095
|
+
}
|
|
1089
1096
|
function renderClientCOOTemplate(vars) {
|
|
1090
1097
|
for (const key of CLIENT_COO_PLACEHOLDERS) {
|
|
1091
1098
|
const value = vars[key];
|
|
@@ -2521,14 +2528,14 @@ async function runSetupWizard(opts = {}) {
|
|
|
2521
2528
|
log("You talk to them. They coordinate everyone else.");
|
|
2522
2529
|
log("");
|
|
2523
2530
|
const cooNameInput = await ask(rl, "Name your COO (default: exe): ");
|
|
2524
|
-
const cooName = cooNameInput || "exe";
|
|
2531
|
+
const cooName = (cooNameInput || "exe").toLowerCase();
|
|
2525
2532
|
let employees = await loadEmployees2(EMPLOYEES_PATH2).catch(() => []);
|
|
2526
2533
|
if (!employees.some((e) => e.name === cooName)) {
|
|
2527
|
-
const { DEFAULT_EXE: DEFAULT_EXE2 } = await Promise.resolve().then(() => (init_employee_templates(), employee_templates_exports));
|
|
2534
|
+
const { DEFAULT_EXE: DEFAULT_EXE2, personalizePrompt: personalizePrompt2 } = await Promise.resolve().then(() => (init_employee_templates(), employee_templates_exports));
|
|
2528
2535
|
const cooEmployee = {
|
|
2529
2536
|
name: cooName,
|
|
2530
2537
|
role: "COO",
|
|
2531
|
-
systemPrompt: DEFAULT_EXE2.systemPrompt,
|
|
2538
|
+
systemPrompt: personalizePrompt2(DEFAULT_EXE2.systemPrompt, "exe", cooName),
|
|
2532
2539
|
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
2533
2540
|
templateName: "exe",
|
|
2534
2541
|
templateVersion: 1
|
|
@@ -2607,13 +2614,14 @@ async function runSetupWizard(opts = {}) {
|
|
|
2607
2614
|
const createCto = await ask(rl, "Create your CTO? (Y/n): ");
|
|
2608
2615
|
if (createCto.toLowerCase() !== "n") {
|
|
2609
2616
|
const ctoNameInput = await ask(rl, "Name your CTO (default: yoshi): ");
|
|
2610
|
-
const ctoName = ctoNameInput || "yoshi";
|
|
2617
|
+
const ctoName = (ctoNameInput || "yoshi").toLowerCase();
|
|
2611
2618
|
if (!employees.some((e) => e.name === ctoName)) {
|
|
2612
2619
|
const ctoTemplate = getEmployeeTemplate("yoshi");
|
|
2620
|
+
const { personalizePrompt: personalizeCto } = await Promise.resolve().then(() => (init_employee_templates(), employee_templates_exports));
|
|
2613
2621
|
const ctoEmployee = {
|
|
2614
2622
|
name: ctoName,
|
|
2615
2623
|
role: "CTO",
|
|
2616
|
-
systemPrompt: ctoTemplate?.systemPrompt ?? "",
|
|
2624
|
+
systemPrompt: personalizeCto(ctoTemplate?.systemPrompt ?? "", "yoshi", ctoName),
|
|
2617
2625
|
createdAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
2618
2626
|
};
|
|
2619
2627
|
employees = addEmployee2(employees, ctoEmployee);
|
|
@@ -2633,13 +2641,14 @@ async function runSetupWizard(opts = {}) {
|
|
|
2633
2641
|
const createCmo = await ask(rl, "Create your CMO? (Y/n): ");
|
|
2634
2642
|
if (createCmo.toLowerCase() !== "n") {
|
|
2635
2643
|
const cmoNameInput = await ask(rl, "Name your CMO (default: mari): ");
|
|
2636
|
-
const cmoName = cmoNameInput || "mari";
|
|
2644
|
+
const cmoName = (cmoNameInput || "mari").toLowerCase();
|
|
2637
2645
|
if (!employees.some((e) => e.name === cmoName)) {
|
|
2638
2646
|
const cmoTemplate = getEmployeeTemplate("mari");
|
|
2647
|
+
const { personalizePrompt: personalizeCmo } = await Promise.resolve().then(() => (init_employee_templates(), employee_templates_exports));
|
|
2639
2648
|
const cmoEmployee = {
|
|
2640
2649
|
name: cmoName,
|
|
2641
2650
|
role: "CMO",
|
|
2642
|
-
systemPrompt: cmoTemplate?.systemPrompt ?? "",
|
|
2651
|
+
systemPrompt: personalizeCmo(cmoTemplate?.systemPrompt ?? "", "mari", cmoName),
|
|
2643
2652
|
createdAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
2644
2653
|
};
|
|
2645
2654
|
employees = addEmployee2(employees, cmoEmployee);
|
|
@@ -441,6 +441,11 @@ function buildCustomEmployeePrompt(name, role) {
|
|
|
441
441
|
function getTemplate(name) {
|
|
442
442
|
return TEMPLATES[name];
|
|
443
443
|
}
|
|
444
|
+
function personalizePrompt(prompt, templateName, actualName) {
|
|
445
|
+
if (templateName === actualName) return prompt;
|
|
446
|
+
const escaped = templateName.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
447
|
+
return prompt.replace(new RegExp(`\\bYou are ${escaped}\\b`, "g"), `You are ${actualName}`);
|
|
448
|
+
}
|
|
444
449
|
var CLIENT_COO_TEMPLATE = `---
|
|
445
450
|
role: client-coo
|
|
446
451
|
title: Chief Operating Officer
|
|
@@ -566,5 +571,6 @@ export {
|
|
|
566
571
|
buildCustomEmployeePrompt,
|
|
567
572
|
getSessionPrompt,
|
|
568
573
|
getTemplate,
|
|
574
|
+
personalizePrompt,
|
|
569
575
|
renderClientCOOTemplate
|
|
570
576
|
};
|
package/dist/lib/employees.js
CHANGED
|
@@ -131,10 +131,11 @@ function getEmployee(employees, name) {
|
|
|
131
131
|
return employees.find((e) => e.name.toLowerCase() === name.toLowerCase());
|
|
132
132
|
}
|
|
133
133
|
function addEmployee(employees, employee) {
|
|
134
|
-
|
|
135
|
-
|
|
134
|
+
const normalized = { ...employee, name: employee.name.toLowerCase() };
|
|
135
|
+
if (employees.some((e) => e.name.toLowerCase() === normalized.name)) {
|
|
136
|
+
throw new Error(`Employee '${normalized.name}' already exists`);
|
|
136
137
|
}
|
|
137
|
-
return [...employees,
|
|
138
|
+
return [...employees, normalized];
|
|
138
139
|
}
|
|
139
140
|
function registerBinSymlinks(name) {
|
|
140
141
|
const created = [];
|
package/dist/mcp/server.js
CHANGED
|
@@ -2910,10 +2910,11 @@ async function saveEmployees(employees, employeesPath = EMPLOYEES_PATH) {
|
|
|
2910
2910
|
await writeFile3(employeesPath, JSON.stringify(employees, null, 2) + "\n", "utf-8");
|
|
2911
2911
|
}
|
|
2912
2912
|
function addEmployee(employees, employee) {
|
|
2913
|
-
|
|
2914
|
-
|
|
2913
|
+
const normalized = { ...employee, name: employee.name.toLowerCase() };
|
|
2914
|
+
if (employees.some((e) => e.name.toLowerCase() === normalized.name)) {
|
|
2915
|
+
throw new Error(`Employee '${normalized.name}' already exists`);
|
|
2915
2916
|
}
|
|
2916
|
-
return [...employees,
|
|
2917
|
+
return [...employees, normalized];
|
|
2917
2918
|
}
|
|
2918
2919
|
var EMPLOYEES_PATH;
|
|
2919
2920
|
var init_employees = __esm({
|
package/dist/tui/App.js
CHANGED
|
@@ -3798,10 +3798,11 @@ function getEmployee(employees, name) {
|
|
|
3798
3798
|
return employees.find((e) => e.name.toLowerCase() === name.toLowerCase());
|
|
3799
3799
|
}
|
|
3800
3800
|
function addEmployee(employees, employee) {
|
|
3801
|
-
|
|
3802
|
-
|
|
3801
|
+
const normalized = { ...employee, name: employee.name.toLowerCase() };
|
|
3802
|
+
if (employees.some((e) => e.name.toLowerCase() === normalized.name)) {
|
|
3803
|
+
throw new Error(`Employee '${normalized.name}' already exists`);
|
|
3803
3804
|
}
|
|
3804
|
-
return [...employees,
|
|
3805
|
+
return [...employees, normalized];
|
|
3805
3806
|
}
|
|
3806
3807
|
function registerBinSymlinks(name) {
|
|
3807
3808
|
const created = [];
|
package/package.json
CHANGED