@base44-preview/cli 0.0.49-pr.450.45ce766 → 0.0.49-pr.452.a028d51

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/cli/index.js CHANGED
@@ -16067,7 +16067,7 @@ var require_lodash = __commonJS((exports, module) => {
16067
16067
  }
16068
16068
  return mapped.length && mapped[0] === arrays[0] ? baseIntersection(mapped, undefined2, comparator) : [];
16069
16069
  });
16070
- function join12(array2, separator) {
16070
+ function join13(array2, separator) {
16071
16071
  return array2 == null ? "" : nativeJoin.call(array2, separator);
16072
16072
  }
16073
16073
  function last(array2) {
@@ -17999,7 +17999,7 @@ __p += '`;
17999
17999
  lodash.isUndefined = isUndefined;
18000
18000
  lodash.isWeakMap = isWeakMap;
18001
18001
  lodash.isWeakSet = isWeakSet;
18002
- lodash.join = join12;
18002
+ lodash.join = join13;
18003
18003
  lodash.kebabCase = kebabCase;
18004
18004
  lodash.last = last;
18005
18005
  lodash.lastIndexOf = lastIndexOf;
@@ -27503,7 +27503,7 @@ function cleanDoc(doc2) {
27503
27503
  return mapDoc(doc2, (currentDoc) => cleanDocFn(currentDoc));
27504
27504
  }
27505
27505
  function replaceEndOfLine(doc2, replacement = literalline) {
27506
- return mapDoc(doc2, (currentDoc) => typeof currentDoc === "string" ? join18(replacement, currentDoc.split(`
27506
+ return mapDoc(doc2, (currentDoc) => typeof currentDoc === "string" ? join19(replacement, currentDoc.split(`
27507
27507
  `)) : currentDoc);
27508
27508
  }
27509
27509
  function canBreakFn(doc2) {
@@ -27583,7 +27583,7 @@ function indentIfBreak(contents, options) {
27583
27583
  negate: options.negate
27584
27584
  };
27585
27585
  }
27586
- function join18(separator, docs) {
27586
+ function join19(separator, docs) {
27587
27587
  assertDoc(separator);
27588
27588
  assertDocArray(docs);
27589
27589
  const parts = [];
@@ -28294,7 +28294,7 @@ var init_doc = __esm(() => {
28294
28294
  MODE_FLAT = Symbol("MODE_FLAT");
28295
28295
  DOC_FILL_PRINTED_LENGTH = Symbol("DOC_FILL_PRINTED_LENGTH");
28296
28296
  builders = {
28297
- join: join18,
28297
+ join: join19,
28298
28298
  line,
28299
28299
  softline,
28300
28300
  hardline,
@@ -133208,7 +133208,7 @@ Expected it to be ${EXPECTED_TYPE_VALUES}.`;
133208
133208
  return mapDoc2(doc2, (currentDoc) => cleanDocFn2(currentDoc));
133209
133209
  }
133210
133210
  function replaceEndOfLine2(doc2, replacement = literalline2) {
133211
- return mapDoc2(doc2, (currentDoc) => typeof currentDoc === "string" ? join20(replacement, currentDoc.split(`
133211
+ return mapDoc2(doc2, (currentDoc) => typeof currentDoc === "string" ? join21(replacement, currentDoc.split(`
133212
133212
  `)) : currentDoc);
133213
133213
  }
133214
133214
  function canBreakFn2(doc2) {
@@ -133294,7 +133294,7 @@ Expected it to be ${EXPECTED_TYPE_VALUES}.`;
133294
133294
  negate: options8.negate
133295
133295
  };
133296
133296
  }
133297
- function join20(separator, docs) {
133297
+ function join21(separator, docs) {
133298
133298
  assertDoc2(separator);
133299
133299
  assertDocArray2(docs);
133300
133300
  const parts = [];
@@ -133959,7 +133959,7 @@ Expected it to be ${EXPECTED_TYPE_VALUES}.`;
133959
133959
  }
133960
133960
  }
133961
133961
  var builders2 = {
133962
- join: join20,
133962
+ join: join21,
133963
133963
  line: line3,
133964
133964
  softline: softline2,
133965
133965
  hardline: hardline4,
@@ -160402,7 +160402,7 @@ var require_view = __commonJS((exports, module) => {
160402
160402
  var dirname14 = path18.dirname;
160403
160403
  var basename4 = path18.basename;
160404
160404
  var extname2 = path18.extname;
160405
- var join21 = path18.join;
160405
+ var join22 = path18.join;
160406
160406
  var resolve6 = path18.resolve;
160407
160407
  module.exports = View;
160408
160408
  function View(name2, options8) {
@@ -160464,12 +160464,12 @@ var require_view = __commonJS((exports, module) => {
160464
160464
  };
160465
160465
  View.prototype.resolve = function resolve7(dir, file2) {
160466
160466
  var ext = this.ext;
160467
- var path19 = join21(dir, file2);
160467
+ var path19 = join22(dir, file2);
160468
160468
  var stat2 = tryStat(path19);
160469
160469
  if (stat2 && stat2.isFile()) {
160470
160470
  return path19;
160471
160471
  }
160472
- path19 = join21(dir, basename4(file2, ext), "index" + ext);
160472
+ path19 = join22(dir, basename4(file2, ext), "index" + ext);
160473
160473
  stat2 = tryStat(path19);
160474
160474
  if (stat2 && stat2.isFile()) {
160475
160475
  return path19;
@@ -164164,7 +164164,7 @@ var require_send = __commonJS((exports, module) => {
164164
164164
  var Stream2 = __require("stream");
164165
164165
  var util2 = __require("util");
164166
164166
  var extname2 = path18.extname;
164167
- var join21 = path18.join;
164167
+ var join22 = path18.join;
164168
164168
  var normalize = path18.normalize;
164169
164169
  var resolve6 = path18.resolve;
164170
164170
  var sep = path18.sep;
@@ -164336,7 +164336,7 @@ var require_send = __commonJS((exports, module) => {
164336
164336
  return res;
164337
164337
  }
164338
164338
  parts = path19.split(sep);
164339
- path19 = normalize(join21(root2, path19));
164339
+ path19 = normalize(join22(root2, path19));
164340
164340
  } else {
164341
164341
  if (UP_PATH_REGEXP.test(path19)) {
164342
164342
  debug('malicious path "%s"', path19);
@@ -164476,7 +164476,7 @@ var require_send = __commonJS((exports, module) => {
164476
164476
  return self2.onStatError(err);
164477
164477
  return self2.error(404);
164478
164478
  }
164479
- var p4 = join21(path19, self2._index[i5]);
164479
+ var p4 = join22(path19, self2._index[i5]);
164480
164480
  debug('stat "%s"', p4);
164481
164481
  fs28.stat(p4, function(err2, stat2) {
164482
164482
  if (err2)
@@ -214616,7 +214616,7 @@ var require_buffer_list = __commonJS((exports, module) => {
214616
214616
  }
214617
214617
  }, {
214618
214618
  key: "join",
214619
- value: function join21(s5) {
214619
+ value: function join22(s5) {
214620
214620
  if (this.length === 0)
214621
214621
  return "";
214622
214622
  var p4 = this.head;
@@ -218270,7 +218270,7 @@ var require_dist5 = __commonJS((exports, module) => {
218270
218270
  });
218271
218271
 
218272
218272
  // src/cli/index.ts
218273
- import { dirname as dirname18, join as join24 } from "node:path";
218273
+ import { dirname as dirname18, join as join25 } from "node:path";
218274
218274
  import { fileURLToPath as fileURLToPath6 } from "node:url";
218275
218275
 
218276
218276
  // ../../node_modules/@clack/core/dist/index.mjs
@@ -219422,7 +219422,7 @@ var {
219422
219422
  } = import__.default;
219423
219423
 
219424
219424
  // src/cli/commands/agents/pull.ts
219425
- import { dirname as dirname7, join as join12 } from "node:path";
219425
+ import { dirname as dirname7, join as join13 } from "node:path";
219426
219426
  // ../../node_modules/chalk/source/vendor/ansi-styles/index.js
219427
219427
  var ANSI_BACKGROUND_OFFSET = 10;
219428
219428
  var wrapAnsi16 = (offset = 0) => (code) => `\x1B[${code + offset}m`;
@@ -242523,67 +242523,6 @@ async function readAllEntities(entitiesDir) {
242523
242523
  const entities = await Promise.all(files.map((filePath) => readEntityFile(filePath)));
242524
242524
  return entities;
242525
242525
  }
242526
- // src/core/resources/entity/data-api.ts
242527
- var EntityRecordSchema = exports_external.object({
242528
- id: exports_external.string(),
242529
- created_date: exports_external.string()
242530
- }).passthrough();
242531
- var EntityRecordListSchema = exports_external.array(EntityRecordSchema);
242532
- var CountResponseSchema = exports_external.object({
242533
- count: exports_external.number()
242534
- });
242535
- async function listEntityRecords(entityName, options = {}) {
242536
- const appClient = getAppClient();
242537
- const searchParams = new URLSearchParams;
242538
- if (options.limit !== undefined) {
242539
- searchParams.set("limit", String(options.limit));
242540
- }
242541
- if (options.skip !== undefined) {
242542
- searchParams.set("skip", String(options.skip));
242543
- }
242544
- if (options.sort) {
242545
- searchParams.set("sort", options.sort);
242546
- }
242547
- let response;
242548
- try {
242549
- response = await appClient.get(`entities/${encodeURIComponent(entityName)}`, { searchParams, timeout: 30000 });
242550
- } catch (error48) {
242551
- throw await ApiError.fromHttpError(error48, `listing records for entity "${entityName}"`);
242552
- }
242553
- const result = EntityRecordListSchema.safeParse(await response.json());
242554
- if (!result.success) {
242555
- throw new SchemaValidationError("Invalid response from server", result.error);
242556
- }
242557
- return result.data;
242558
- }
242559
- async function getEntityRecord(entityName, id) {
242560
- const appClient = getAppClient();
242561
- let response;
242562
- try {
242563
- response = await appClient.get(`entities/${encodeURIComponent(entityName)}/${encodeURIComponent(id)}`, { timeout: 30000 });
242564
- } catch (error48) {
242565
- throw await ApiError.fromHttpError(error48, `fetching record "${id}" from entity "${entityName}"`);
242566
- }
242567
- const result = EntityRecordSchema.safeParse(await response.json());
242568
- if (!result.success) {
242569
- throw new SchemaValidationError("Invalid response from server", result.error);
242570
- }
242571
- return result.data;
242572
- }
242573
- async function countEntityRecords(entityName) {
242574
- const appClient = getAppClient();
242575
- let response;
242576
- try {
242577
- response = await appClient.get(`entities/${encodeURIComponent(entityName)}/count`, { timeout: 30000 });
242578
- } catch (error48) {
242579
- throw await ApiError.fromHttpError(error48, `counting records for entity "${entityName}"`);
242580
- }
242581
- const result = CountResponseSchema.safeParse(await response.json());
242582
- if (!result.success) {
242583
- throw new SchemaValidationError("Invalid response from server", result.error);
242584
- }
242585
- return result.data.count;
242586
- }
242587
242526
  // src/core/resources/entity/deploy.ts
242588
242527
  async function pushEntities(entities) {
242589
242528
  if (entities.length === 0) {
@@ -243738,6 +243677,9 @@ async function ensureAppConfig(ctx) {
243738
243677
  ctx.errorReporter.setContext({ appId: appConfig.id });
243739
243678
  }
243740
243679
 
243680
+ // src/cli/utils/skill-version-check.ts
243681
+ import { join as join12 } from "node:path";
243682
+
243741
243683
  // ../../node_modules/is-plain-obj/index.js
243742
243684
  function isPlainObject2(value) {
243743
243685
  if (typeof value !== "object" || value === null) {
@@ -250234,6 +250176,87 @@ var {
250234
250176
  getCancelSignal: getCancelSignal2
250235
250177
  } = getIpcExport();
250236
250178
 
250179
+ // src/cli/utils/skill-version-check.ts
250180
+ var import_front_matter2 = __toESM(require_front_matter(), 1);
250181
+ var SourcePackageSchema = exports_external.object({
250182
+ name: exports_external.string(),
250183
+ version: exports_external.string()
250184
+ });
250185
+ var SkillFrontmatterSchema = exports_external.object({
250186
+ metadata: exports_external.object({
250187
+ sourcePackage: SourcePackageSchema
250188
+ })
250189
+ });
250190
+ var InstalledSkillSchema = exports_external.object({
250191
+ name: exports_external.string(),
250192
+ path: exports_external.string()
250193
+ });
250194
+ var InstalledSkillsSchema = exports_external.array(InstalledSkillSchema);
250195
+ async function listInstalledSkills(cwd) {
250196
+ const { stdout } = await execa("npx", ["-y", "skills", "list", "--json"], {
250197
+ cwd,
250198
+ timeout: 3000,
250199
+ env: { ...process.env, CI: "1" }
250200
+ });
250201
+ const jsonStart = stdout.indexOf("[");
250202
+ if (jsonStart === -1)
250203
+ return [];
250204
+ const parsed = JSON.parse(stdout.slice(jsonStart));
250205
+ return InstalledSkillsSchema.parse(parsed);
250206
+ }
250207
+ async function readSkillFrontmatter(skillPath) {
250208
+ try {
250209
+ const content = await readTextFile(join12(skillPath, "SKILL.md"));
250210
+ const { attributes } = import_front_matter2.default(content);
250211
+ const result = SkillFrontmatterSchema.safeParse(attributes);
250212
+ return result.success ? result.data : null;
250213
+ } catch {
250214
+ return null;
250215
+ }
250216
+ }
250217
+ async function checkSkillVersions(projectRoot) {
250218
+ const skills = await listInstalledSkills(projectRoot);
250219
+ const results = await Promise.all(skills.map(async (skill) => {
250220
+ const fm = await readSkillFrontmatter(skill.path);
250221
+ if (!fm)
250222
+ return null;
250223
+ if (fm.metadata.sourcePackage.name !== package_default.name)
250224
+ return null;
250225
+ if (fm.metadata.sourcePackage.version === package_default.version)
250226
+ return null;
250227
+ return {
250228
+ skillName: skill.name,
250229
+ installedVersion: fm.metadata.sourcePackage.version,
250230
+ currentVersion: package_default.version
250231
+ };
250232
+ }));
250233
+ return results.filter((r) => r !== null);
250234
+ }
250235
+ function startSkillVersionCheck(projectRoot) {
250236
+ return checkSkillVersions(projectRoot).catch(() => null);
250237
+ }
250238
+ function formatSkillWarning(staleSkills) {
250239
+ const { shinyOrange } = theme.colors;
250240
+ const { bold: bold2 } = theme.styles;
250241
+ const lines = staleSkills.map((s) => shinyOrange(`Skill "${s.skillName}" was built for v${s.installedVersion}, current CLI is v${bold2(s.currentVersion)}`));
250242
+ lines.push(shinyOrange("Run: base44 agent-skills update"));
250243
+ return lines.join(`
250244
+ `);
250245
+ }
250246
+ function formatPlainSkillWarning(staleSkills) {
250247
+ const lines = staleSkills.map((s) => `Skill "${s.skillName}" was built for v${s.installedVersion}, current CLI is v${s.currentVersion}.`);
250248
+ lines.push("Run: base44 agent-skills update");
250249
+ return lines.join(" ");
250250
+ }
250251
+ async function printSkillVersionWarning(promise2) {
250252
+ try {
250253
+ const staleSkills = await promise2;
250254
+ if (staleSkills && staleSkills.length > 0) {
250255
+ Ve(formatSkillWarning(staleSkills));
250256
+ }
250257
+ } catch {}
250258
+ }
250259
+
250237
250260
  // src/cli/utils/version-check.ts
250238
250261
  async function checkForUpgrade() {
250239
250262
  const testLatestVersion = getTestOverrides()?.latestVersion;
@@ -250320,8 +250343,9 @@ async function showCommandStart(fullBanner) {
250320
250343
  We(theme.colors.base44OrangeBackground(" Base 44 "));
250321
250344
  }
250322
250345
  }
250323
- async function showCommandEnd(result, upgradeCheckPromise, distribution) {
250324
- await printUpgradeNotification(upgradeCheckPromise, distribution);
250346
+ async function showCommandEnd(result, options) {
250347
+ await printUpgradeNotification(options.upgradeCheck, options.distribution);
250348
+ await printSkillVersionWarning(options.skillCheck);
250325
250349
  Le(result.outroMessage || "");
250326
250350
  if (result.stdout) {
250327
250351
  process.stdout.write(result.stdout);
@@ -250394,16 +250418,22 @@ class Base44Command extends Command {
250394
250418
  await showCommandStart(this._commandOptions.fullBanner);
250395
250419
  }
250396
250420
  const upgradeCheckPromise = startUpgradeCheck();
250421
+ let skillCheckPromise = Promise.resolve(null);
250397
250422
  try {
250398
250423
  if (this._commandOptions.requireAuth) {
250399
250424
  await ensureAuth(this.context);
250400
250425
  }
250401
250426
  if (this._commandOptions.requireAppConfig) {
250402
250427
  await ensureAppConfig(this.context);
250428
+ skillCheckPromise = startSkillVersionCheck(getAppConfig().projectRoot);
250403
250429
  }
250404
250430
  const result = await fn(this.context, ...args) ?? {};
250405
250431
  if (!quiet) {
250406
- await showCommandEnd(result, upgradeCheckPromise, this.context.distribution);
250432
+ await showCommandEnd(result, {
250433
+ upgradeCheck: upgradeCheckPromise,
250434
+ skillCheck: skillCheckPromise,
250435
+ distribution: this.context.distribution
250436
+ });
250407
250437
  } else {
250408
250438
  if (result.outroMessage) {
250409
250439
  process.stdout.write(`${result.outroMessage}
@@ -250415,6 +250445,11 @@ class Base44Command extends Command {
250415
250445
  const upgradeInfo = await upgradeCheckPromise;
250416
250446
  if (upgradeInfo) {
250417
250447
  process.stderr.write(`${formatPlainUpgradeMessage(upgradeInfo, this.context.distribution)}
250448
+ `);
250449
+ }
250450
+ const staleSkills = await skillCheckPromise;
250451
+ if (staleSkills && staleSkills.length > 0) {
250452
+ process.stderr.write(`${formatPlainSkillWarning(staleSkills)}
250418
250453
  `);
250419
250454
  }
250420
250455
  }
@@ -250614,7 +250649,7 @@ async function pullAgentsAction({
250614
250649
  }) {
250615
250650
  const { project: project2 } = await readProjectConfig();
250616
250651
  const configDir = dirname7(project2.configPath);
250617
- const agentsDir = join12(configDir, project2.agentsDir);
250652
+ const agentsDir = join13(configDir, project2.agentsDir);
250618
250653
  const remoteAgents = await runTask("Fetching agents from Base44", async () => {
250619
250654
  return await fetchAgents();
250620
250655
  }, {
@@ -250677,7 +250712,7 @@ function getAgentsCommand() {
250677
250712
  }
250678
250713
 
250679
250714
  // src/cli/commands/auth/password-login.ts
250680
- import { dirname as dirname8, join as join13 } from "node:path";
250715
+ import { dirname as dirname8, join as join14 } from "node:path";
250681
250716
  function validateAction(action) {
250682
250717
  if (action !== "enable" && action !== "disable") {
250683
250718
  throw new InvalidInputError(`Invalid action "${action}". Must be "enable" or "disable".`, {
@@ -250699,7 +250734,7 @@ async function passwordLoginAction({ log }, action) {
250699
250734
  const shouldEnable = action === "enable";
250700
250735
  const { project: project2 } = await readProjectConfig();
250701
250736
  const configDir = dirname8(project2.configPath);
250702
- const authDir = join13(configDir, project2.authDir);
250737
+ const authDir = join14(configDir, project2.authDir);
250703
250738
  const updated = await runTask("Updating local auth config", async () => {
250704
250739
  const current = await readAuthConfig(authDir) ?? DEFAULT_AUTH_CONFIG;
250705
250740
  const merged = { ...current, enableUsernamePassword: shouldEnable };
@@ -250719,11 +250754,11 @@ function getPasswordLoginCommand() {
250719
250754
  }
250720
250755
 
250721
250756
  // src/cli/commands/auth/pull.ts
250722
- import { dirname as dirname9, join as join14 } from "node:path";
250757
+ import { dirname as dirname9, join as join15 } from "node:path";
250723
250758
  async function pullAuthAction({ log }) {
250724
250759
  const { project: project2 } = await readProjectConfig();
250725
250760
  const configDir = dirname9(project2.configPath);
250726
- const authDir = join14(configDir, project2.authDir);
250761
+ const authDir = join15(configDir, project2.authDir);
250727
250762
  const remoteConfig = await runTask("Fetching auth config from Base44", async () => {
250728
250763
  return await pullAuthConfig();
250729
250764
  }, {
@@ -250820,51 +250855,6 @@ function getWhoamiCommand() {
250820
250855
  return new Base44Command("whoami", { requireAppConfig: false }).description("Display current authenticated user").action(whoami);
250821
250856
  }
250822
250857
 
250823
- // src/cli/commands/automations/status.ts
250824
- function formatAutomationType(automation) {
250825
- if (automation.type === "entity")
250826
- return "entity";
250827
- if (automation.type === "scheduled") {
250828
- if (automation.schedule_mode === "one-time")
250829
- return "scheduled (one-time)";
250830
- if (automation.schedule_type === "cron")
250831
- return "scheduled (cron)";
250832
- return "scheduled (simple)";
250833
- }
250834
- return automation.type;
250835
- }
250836
- async function statusAction({ log }) {
250837
- const { functions } = await runTask("Fetching automations...", async () => listDeployedFunctions(), { errorMessage: "Failed to fetch automations" });
250838
- let totalAutomations = 0;
250839
- let functionsWithAutomations = 0;
250840
- for (const fn of functions) {
250841
- if (fn.automations.length === 0)
250842
- continue;
250843
- functionsWithAutomations++;
250844
- for (const automation of fn.automations) {
250845
- totalAutomations++;
250846
- const active = automation.is_active;
250847
- const statusLabel = active ? theme.styles.bold("active") : theme.styles.dim("disabled");
250848
- const typeLabel = formatAutomationType(automation);
250849
- log.message(` ${fn.name} / ${automation.name} ${theme.styles.dim(typeLabel)} ${statusLabel}`);
250850
- }
250851
- }
250852
- if (totalAutomations === 0) {
250853
- return { outroMessage: "No automations found" };
250854
- }
250855
- return {
250856
- outroMessage: `${totalAutomations} automation${totalAutomations !== 1 ? "s" : ""} across ${functionsWithAutomations} function${functionsWithAutomations !== 1 ? "s" : ""}`
250857
- };
250858
- }
250859
- function getAutomationsStatusCommand() {
250860
- return new Base44Command("status").description("Show status of all automations").action(statusAction);
250861
- }
250862
-
250863
- // src/cli/commands/automations/index.ts
250864
- function getAutomationsCommand() {
250865
- return new Command("automations").description("Manage automations").addCommand(getAutomationsStatusCommand());
250866
- }
250867
-
250868
250858
  // src/cli/commands/connectors/list-available.ts
250869
250859
  async function listAvailableAction({
250870
250860
  log
@@ -250894,13 +250884,13 @@ function getConnectorsListAvailableCommand() {
250894
250884
  }
250895
250885
 
250896
250886
  // src/cli/commands/connectors/pull.ts
250897
- import { dirname as dirname10, join as join15 } from "node:path";
250887
+ import { dirname as dirname10, join as join16 } from "node:path";
250898
250888
  async function pullConnectorsAction({
250899
250889
  log
250900
250890
  }) {
250901
250891
  const { project: project2 } = await readProjectConfig();
250902
250892
  const configDir = dirname10(project2.configPath);
250903
- const connectorsDir = join15(configDir, project2.connectorsDir);
250893
+ const connectorsDir = join16(configDir, project2.connectorsDir);
250904
250894
  const remoteConnectors = await runTask("Fetching connectors from Base44", async () => {
250905
250895
  return await pullAllConnectors();
250906
250896
  }, {
@@ -251737,117 +251727,6 @@ function getDashboardCommand() {
251737
251727
  return new Command("dashboard").description("Manage app dashboard").addCommand(getDashboardOpenCommand());
251738
251728
  }
251739
251729
 
251740
- // src/cli/commands/entities/count.ts
251741
- async function countAction(_ctx, entityName) {
251742
- const count2 = await runTask(`Counting ${entityName} records...`, async () => countEntityRecords(entityName), { errorMessage: `Failed to count ${entityName} records` });
251743
- return {
251744
- outroMessage: `${entityName} has ${count2} record${count2 !== 1 ? "s" : ""}`
251745
- };
251746
- }
251747
- function getEntitiesCountCommand() {
251748
- return new Base44Command("count").description("Count total records for an entity").argument("<entityName>", "Name of the entity").action(countAction);
251749
- }
251750
-
251751
- // src/cli/commands/entities/get.ts
251752
- async function getAction(_ctx, entityName, id) {
251753
- const record2 = await runTask(`Fetching ${entityName} record...`, async () => getEntityRecord(entityName, id), { errorMessage: `Failed to fetch ${entityName} record "${id}"` });
251754
- const formatted = JSON.stringify(record2, null, 2);
251755
- return {
251756
- outroMessage: `Fetched ${entityName} record ${id}`,
251757
- stdout: `${formatted}
251758
- `
251759
- };
251760
- }
251761
- function getEntitiesGetCommand() {
251762
- return new Base44Command("get").description("Get a single entity record by ID").argument("<entityName>", "Name of the entity").argument("<id>", "Record ID").action(getAction);
251763
- }
251764
-
251765
- // src/cli/commands/entities/list.ts
251766
- function formatRecordRow(record2, fields) {
251767
- const values = fields.map((field) => {
251768
- const value = record2[field];
251769
- if (value === undefined || value === null)
251770
- return "-";
251771
- if (typeof value === "object")
251772
- return JSON.stringify(value);
251773
- return String(value);
251774
- });
251775
- return values.join("\t");
251776
- }
251777
- function pickDisplayFields(records) {
251778
- const systemFields = ["id", "created_date"];
251779
- if (records.length === 0)
251780
- return systemFields;
251781
- const skipFields = new Set([
251782
- "id",
251783
- "created_date",
251784
- "updated_date",
251785
- "created_by",
251786
- "created_by_id",
251787
- "app_id",
251788
- "entity_name",
251789
- "is_deleted",
251790
- "deleted_date",
251791
- "environment",
251792
- "_id"
251793
- ]);
251794
- const dataFields = [];
251795
- for (const key of Object.keys(records[0])) {
251796
- if (!skipFields.has(key) && dataFields.length < 4) {
251797
- dataFields.push(key);
251798
- }
251799
- }
251800
- return [...systemFields, ...dataFields];
251801
- }
251802
- function validateLimit(limit) {
251803
- if (limit === undefined)
251804
- return;
251805
- const n2 = Number.parseInt(limit, 10);
251806
- if (Number.isNaN(n2) || n2 < 1) {
251807
- throw new InvalidInputError(`Invalid limit: "${limit}". Must be a positive integer.`);
251808
- }
251809
- }
251810
- function validateSkip(skip) {
251811
- if (skip === undefined)
251812
- return;
251813
- const n2 = Number.parseInt(skip, 10);
251814
- if (Number.isNaN(n2) || n2 < 0) {
251815
- throw new InvalidInputError(`Invalid skip: "${skip}". Must be a non-negative integer.`);
251816
- }
251817
- }
251818
- async function listAction({ log }, entityName, options) {
251819
- validateLimit(options.limit);
251820
- validateSkip(options.skip);
251821
- const apiOptions = {};
251822
- if (options.limit) {
251823
- apiOptions.limit = Number.parseInt(options.limit, 10);
251824
- } else {
251825
- apiOptions.limit = 10;
251826
- }
251827
- if (options.skip) {
251828
- apiOptions.skip = Number.parseInt(options.skip, 10);
251829
- }
251830
- if (options.sort) {
251831
- apiOptions.sort = options.sort;
251832
- }
251833
- const records = await runTask(`Fetching ${entityName} records...`, async () => listEntityRecords(entityName, apiOptions), { errorMessage: `Failed to fetch ${entityName} records` });
251834
- if (records.length === 0) {
251835
- return { outroMessage: `No records found for ${entityName}` };
251836
- }
251837
- const fields = pickDisplayFields(records);
251838
- const header2 = fields.join("\t");
251839
- log.message(theme.styles.dim(header2));
251840
- for (const record2 of records) {
251841
- log.message(` ${formatRecordRow(record2, fields)}`);
251842
- }
251843
- return {
251844
- outroMessage: `Showing ${records.length} ${entityName} record${records.length !== 1 ? "s" : ""}`
251845
- };
251846
- }
251847
- function getEntitiesListCommand() {
251848
- return new Base44Command("list").description("List entity records").argument("<entityName>", "Name of the entity").option("-n, --limit <n>", "Maximum number of records to return (default: 10)").option("--sort <field>", "Field to sort by").option("--skip <n>", "Number of records to skip").action(listAction);
251849
- }
251850
-
251851
251730
  // src/cli/commands/entities/push.ts
251852
251731
  async function pushEntitiesAction({
251853
251732
  log
@@ -251876,12 +251755,7 @@ async function pushEntitiesAction({
251876
251755
  return { outroMessage: "Entities pushed to Base44" };
251877
251756
  }
251878
251757
  function getEntitiesPushCommand() {
251879
- return new Base44Command("push").description("Push local entities to Base44").action(pushEntitiesAction);
251880
- }
251881
-
251882
- // src/cli/commands/entities/index.ts
251883
- function getEntitiesCommand() {
251884
- return new Command("entities").description("Manage project entities").addCommand(getEntitiesPushCommand()).addCommand(getEntitiesListCommand()).addCommand(getEntitiesGetCommand()).addCommand(getEntitiesCountCommand());
251758
+ return new Command("entities").description("Manage project entities").addCommand(new Base44Command("push").description("Push local entities to Base44").action(pushEntitiesAction));
251885
251759
  }
251886
251760
 
251887
251761
  // src/cli/commands/functions/delete.ts
@@ -252068,11 +251942,11 @@ function getListCommand() {
252068
251942
  }
252069
251943
 
252070
251944
  // src/cli/commands/functions/pull.ts
252071
- import { dirname as dirname11, join as join16 } from "node:path";
251945
+ import { dirname as dirname11, join as join17 } from "node:path";
252072
251946
  async function pullFunctionsAction({ log }, name2) {
252073
251947
  const { project: project2 } = await readProjectConfig();
252074
251948
  const configDir = dirname11(project2.configPath);
252075
- const functionsDir = join16(configDir, project2.functionsDir);
251949
+ const functionsDir = join17(configDir, project2.functionsDir);
252076
251950
  const remoteFunctions = await runTask("Fetching functions from Base44", async () => {
252077
251951
  const { functions } = await listDeployedFunctions();
252078
251952
  return functions;
@@ -252115,8 +251989,39 @@ function getFunctionsCommand() {
252115
251989
  }
252116
251990
 
252117
251991
  // src/cli/commands/project/create.ts
252118
- import { basename as basename3, join as join17, resolve as resolve2 } from "node:path";
251992
+ import { basename as basename3, join as join18, resolve as resolve2 } from "node:path";
252119
251993
  var import_kebabCase = __toESM(require_kebabCase(), 1);
251994
+
251995
+ // src/cli/commands/skills/update.ts
251996
+ var SKILLS_REPO = "base44/skills";
251997
+ async function installAllSkills(cwd) {
251998
+ await execa("npx", ["-y", "skills", "add", SKILLS_REPO, "--all", "-y"], {
251999
+ cwd
252000
+ });
252001
+ }
252002
+ async function updateAction(_ctx) {
252003
+ const projectRoot = await findProjectRoot();
252004
+ if (!projectRoot) {
252005
+ return {
252006
+ outroMessage: "Not in a Base44 project. Run this command from a project directory."
252007
+ };
252008
+ }
252009
+ await runTask("Updating agent skills...", async () => {
252010
+ await installAllSkills(projectRoot.root);
252011
+ }, {
252012
+ successMessage: theme.colors.base44Orange("Agent skills updated successfully"),
252013
+ errorMessage: "Failed to update agent skills"
252014
+ });
252015
+ return { outroMessage: "Agent skills are up to date" };
252016
+ }
252017
+ function getSkillsUpdateCommand() {
252018
+ return new Base44Command("update", {
252019
+ requireAuth: false,
252020
+ requireAppConfig: false
252021
+ }).description("Update locally installed agent skills to the latest version").action(updateAction);
252022
+ }
252023
+
252024
+ // src/cli/commands/project/create.ts
252120
252025
  var DEFAULT_TEMPLATE_ID = "backend-only";
252121
252026
  async function getTemplateById(templateId) {
252122
252027
  const templates = await listTemplates();
@@ -252252,7 +252157,7 @@ async function executeCreate({
252252
252157
  updateMessage("Building project...");
252253
252158
  await execa({ cwd: resolvedPath, shell: true })`${buildCommand}`;
252254
252159
  updateMessage("Deploying site...");
252255
- return await deploySite(join17(resolvedPath, outputDirectory));
252160
+ return await deploySite(join18(resolvedPath, outputDirectory));
252256
252161
  }, {
252257
252162
  successMessage: theme.colors.base44Orange("Site deployed successfully"),
252258
252163
  errorMessage: "Failed to deploy site"
@@ -252264,13 +252169,10 @@ async function executeCreate({
252264
252169
  if (shouldAddSkills) {
252265
252170
  try {
252266
252171
  await runTask("Installing AI agent skills...", async () => {
252267
- await execa("npx", ["-y", "skills", "add", "base44/skills", "-y"], {
252268
- cwd: resolvedPath,
252269
- shell: true
252270
- });
252172
+ await installAllSkills(resolvedPath);
252271
252173
  }, {
252272
252174
  successMessage: theme.colors.base44Orange("AI agent skills added successfully"),
252273
- errorMessage: "Failed to add AI agent skills - you can add them later with: npx skills add base44/skills"
252175
+ errorMessage: "Failed to add agent skills - you can add them later with: base44 agent-skills update"
252274
252176
  });
252275
252177
  } catch {}
252276
252178
  }
@@ -252644,7 +252546,7 @@ async function getAllFunctionNames() {
252644
252546
  const { functions } = await readProjectConfig();
252645
252547
  return functions.map((fn) => fn.name);
252646
252548
  }
252647
- function validateLimit2(limit) {
252549
+ function validateLimit(limit) {
252648
252550
  if (limit === undefined)
252649
252551
  return;
252650
252552
  const n2 = Number.parseInt(limit, 10);
@@ -252653,7 +252555,7 @@ function validateLimit2(limit) {
252653
252555
  }
252654
252556
  }
252655
252557
  async function logsAction(_ctx, options) {
252656
- validateLimit2(options.limit);
252558
+ validateLimit(options.limit);
252657
252559
  const specifiedFunctions = parseFunctionNames(options.function);
252658
252560
  const allProjectFunctions = await getAllFunctionNames();
252659
252561
  const functionNames = specifiedFunctions.length > 0 ? specifiedFunctions : allProjectFunctions;
@@ -252830,6 +252732,11 @@ function getSiteCommand() {
252830
252732
  return new Command("site").description("Manage app site (frontend app)").addCommand(getSiteDeployCommand()).addCommand(getSiteOpenCommand());
252831
252733
  }
252832
252734
 
252735
+ // src/cli/commands/skills/index.ts
252736
+ function getAgentSkillsCommand() {
252737
+ return new Command("agent-skills").description("Manage locally installed agent skills").addCommand(getSkillsUpdateCommand());
252738
+ }
252739
+
252833
252740
  // src/core/types/generator.ts
252834
252741
  var import_common_tags = __toESM(require_lib2(), 1);
252835
252742
  var import_json_schema_to_typescript = __toESM(require_src3(), 1);
@@ -252916,10 +252823,10 @@ function toPascalCase(name2) {
252916
252823
  return name2.split(/[-_\s]+/).map((w8) => w8.charAt(0).toUpperCase() + w8.slice(1)).join("");
252917
252824
  }
252918
252825
  // src/core/types/update-project.ts
252919
- import { join as join20 } from "node:path";
252826
+ import { join as join21 } from "node:path";
252920
252827
  var TYPES_INCLUDE_PATH = `${PROJECT_SUBDIR}/${TYPES_OUTPUT_SUBDIR}/*.d.ts`;
252921
252828
  async function updateProjectConfig(projectRoot) {
252922
- const tsconfigPath = join20(projectRoot, "tsconfig.json");
252829
+ const tsconfigPath = join21(projectRoot, "tsconfig.json");
252923
252830
  if (!await pathExists(tsconfigPath)) {
252924
252831
  return false;
252925
252832
  }
@@ -252962,7 +252869,7 @@ function getTypesCommand() {
252962
252869
  // src/cli/dev/dev-server/main.ts
252963
252870
  var import_cors = __toESM(require_lib4(), 1);
252964
252871
  var import_express5 = __toESM(require_express(), 1);
252965
- import { dirname as dirname16, join as join23 } from "node:path";
252872
+ import { dirname as dirname16, join as join24 } from "node:path";
252966
252873
 
252967
252874
  // ../../node_modules/get-port/index.js
252968
252875
  import net from "node:net";
@@ -255825,8 +255732,8 @@ async function createDevServer(options8) {
255825
255732
  broadcastEntityEvent(io6, appId, entityName, event);
255826
255733
  };
255827
255734
  const base44ConfigWatcher = new WatchBase44({
255828
- functions: join23(dirname16(project2.configPath), project2.functionsDir),
255829
- entities: join23(dirname16(project2.configPath), project2.entitiesDir)
255735
+ functions: join24(dirname16(project2.configPath), project2.functionsDir),
255736
+ entities: join24(dirname16(project2.configPath), project2.entitiesDir)
255830
255737
  }, devLogger);
255831
255738
  base44ConfigWatcher.on("change", async (name2) => {
255832
255739
  try {
@@ -256095,15 +256002,15 @@ function createProgram(context) {
256095
256002
  program2.addCommand(getDeployCommand2());
256096
256003
  program2.addCommand(getLinkCommand());
256097
256004
  program2.addCommand(getEjectCommand());
256098
- program2.addCommand(getEntitiesCommand());
256005
+ program2.addCommand(getEntitiesPushCommand());
256099
256006
  program2.addCommand(getAgentsCommand());
256100
256007
  program2.addCommand(getConnectorsCommand());
256101
256008
  program2.addCommand(getFunctionsCommand());
256102
256009
  program2.addCommand(getSecretsCommand());
256010
+ program2.addCommand(getAgentSkillsCommand());
256103
256011
  program2.addCommand(getAuthCommand());
256104
256012
  program2.addCommand(getSiteCommand());
256105
256013
  program2.addCommand(getTypesCommand());
256106
- program2.addCommand(getAutomationsCommand());
256107
256014
  program2.addCommand(getExecCommand());
256108
256015
  program2.addCommand(getDevCommand(), { hidden: true });
256109
256016
  program2.addCommand(getLogsCommand());
@@ -260315,7 +260222,7 @@ function addCommandInfoToErrorReporter(program2, errorReporter) {
260315
260222
  // src/cli/index.ts
260316
260223
  var __dirname4 = dirname18(fileURLToPath6(import.meta.url));
260317
260224
  async function runCLI(options8) {
260318
- ensureNpmAssets(join24(__dirname4, "../assets"));
260225
+ ensureNpmAssets(join25(__dirname4, "../assets"));
260319
260226
  const errorReporter = new ErrorReporter;
260320
260227
  errorReporter.registerProcessErrorHandlers();
260321
260228
  const isNonInteractive = !process.stdin.isTTY || !process.stdout.isTTY;
@@ -260350,4 +260257,4 @@ export {
260350
260257
  CLIExitError
260351
260258
  };
260352
260259
 
260353
- //# debugId=527BF150D9D2321164756E2164756E21
260260
+ //# debugId=C4931A4AAC344DAA64756E2164756E21