@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 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
- if (employees.some((e) => e.name === employee.name)) {
322
- throw new Error(`Employee '${employee.name}' already exists`);
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, employee];
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);
@@ -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
- if (employees.some((e) => e.name === employee.name)) {
159
- throw new Error(`Employee '${employee.name}' already exists`);
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, employee];
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
- prompt = template?.systemPrompt ?? prompt;
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
- if (employees.some((e) => e.name === employee.name)) {
752
- throw new Error(`Employee '${employee.name}' already exists`);
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, employee];
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
- if (employees.some((e) => e.name === employee.name)) {
1016
- throw new Error(`Employee '${employee.name}' already exists`);
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, employee];
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
  };
@@ -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
- if (employees.some((e) => e.name === employee.name)) {
135
- throw new Error(`Employee '${employee.name}' already exists`);
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, employee];
138
+ return [...employees, normalized];
138
139
  }
139
140
  function registerBinSymlinks(name) {
140
141
  const created = [];
@@ -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
- if (employees.some((e) => e.name === employee.name)) {
2914
- throw new Error(`Employee '${employee.name}' already exists`);
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, employee];
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
- if (employees.some((e) => e.name === employee.name)) {
3802
- throw new Error(`Employee '${employee.name}' already exists`);
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, employee];
3805
+ return [...employees, normalized];
3805
3806
  }
3806
3807
  function registerBinSymlinks(name) {
3807
3808
  const created = [];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@askexenow/exe-os",
3
- "version": "0.8.11",
3
+ "version": "0.8.13",
4
4
  "description": "AI employee operating system — persistent memory, task management, and multi-agent coordination for Claude Code.",
5
5
  "license": "CC-BY-NC-4.0",
6
6
  "type": "module",