struere 0.3.7 → 0.3.8

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.
@@ -18124,6 +18124,7 @@ function readLine() {
18124
18124
  // src/cli/commands/dev.ts
18125
18125
  var import_chokidar = __toESM(require_chokidar(), 1);
18126
18126
  import { join as join7, basename as basename2 } from "path";
18127
+ import { existsSync as existsSync5, writeFileSync as writeFileSync4 } from "fs";
18127
18128
 
18128
18129
  // src/cli/utils/config.ts
18129
18130
  import { join as join5 } from "path";
@@ -18223,14 +18224,21 @@ var devCommand = new Command("dev").description("Sync agent to development envir
18223
18224
  spinner.start("Loading agent");
18224
18225
  let agent = await loadAgent(cwd);
18225
18226
  spinner.succeed(`Agent "${agent.name}" loaded`);
18226
- const credentials = loadCredentials();
18227
+ const claudeMdPath = join7(cwd, ".claude.md");
18228
+ if (!existsSync5(claudeMdPath)) {
18229
+ writeFileSync4(claudeMdPath, getClaudeMd(project.agent.slug));
18230
+ console.log(source_default.green("\u2713"), "Created .claude.md");
18231
+ }
18232
+ let credentials = loadCredentials();
18227
18233
  const apiKey = getApiKey();
18228
18234
  if (!credentials && !apiKey) {
18229
- spinner.fail("Not logged in");
18230
- console.log();
18231
- console.log(source_default.gray("Run"), source_default.cyan("struere login"), source_default.gray("to authenticate"));
18235
+ console.log(source_default.gray("Authentication required"));
18232
18236
  console.log();
18233
- process.exit(1);
18237
+ credentials = await performLogin();
18238
+ if (!credentials) {
18239
+ console.log(source_default.red("Authentication failed"));
18240
+ process.exit(1);
18241
+ }
18234
18242
  }
18235
18243
  spinner.start("Syncing to Convex");
18236
18244
  const performSync = async () => {
@@ -18245,13 +18253,38 @@ var devCommand = new Command("dev").description("Sync agent to development envir
18245
18253
  throw error;
18246
18254
  }
18247
18255
  };
18256
+ const isAuthError = (error) => {
18257
+ const message = error instanceof Error ? error.message : String(error);
18258
+ return message.includes("Unauthenticated") || message.includes("OIDC") || message.includes("token") || message.includes("expired");
18259
+ };
18248
18260
  try {
18249
18261
  await performSync();
18250
18262
  spinner.succeed("Synced to development");
18251
18263
  } catch (error) {
18252
- spinner.fail("Sync failed");
18253
- console.log(source_default.red("Error:"), error instanceof Error ? error.message : String(error));
18254
- process.exit(1);
18264
+ if (isAuthError(error)) {
18265
+ spinner.fail("Session expired");
18266
+ console.log();
18267
+ console.log(source_default.gray("Re-authenticating..."));
18268
+ clearCredentials();
18269
+ credentials = await performLogin();
18270
+ if (!credentials) {
18271
+ console.log(source_default.red("Authentication failed"));
18272
+ process.exit(1);
18273
+ }
18274
+ spinner.start("Syncing to Convex");
18275
+ try {
18276
+ await performSync();
18277
+ spinner.succeed("Synced to development");
18278
+ } catch (retryError) {
18279
+ spinner.fail("Sync failed");
18280
+ console.log(source_default.red("Error:"), retryError instanceof Error ? retryError.message : String(retryError));
18281
+ process.exit(1);
18282
+ }
18283
+ } else {
18284
+ spinner.fail("Sync failed");
18285
+ console.log(source_default.red("Error:"), error instanceof Error ? error.message : String(error));
18286
+ process.exit(1);
18287
+ }
18255
18288
  }
18256
18289
  const devUrl = `https://${project.agent.slug}-dev.struere.dev`;
18257
18290
  console.log();
@@ -18272,8 +18305,28 @@ var devCommand = new Command("dev").description("Sync agent to development envir
18272
18305
  await performSync();
18273
18306
  syncSpinner.succeed("Synced");
18274
18307
  } catch (error) {
18275
- syncSpinner.fail("Sync failed");
18276
- console.log(source_default.red("Error:"), error instanceof Error ? error.message : String(error));
18308
+ if (isAuthError(error)) {
18309
+ syncSpinner.fail("Session expired");
18310
+ console.log();
18311
+ console.log(source_default.gray("Re-authenticating..."));
18312
+ clearCredentials();
18313
+ const newCredentials = await performLogin();
18314
+ if (!newCredentials) {
18315
+ console.log(source_default.red("Authentication failed"));
18316
+ return;
18317
+ }
18318
+ const retrySyncSpinner = ora("Syncing...").start();
18319
+ try {
18320
+ await performSync();
18321
+ retrySyncSpinner.succeed("Synced");
18322
+ } catch (retryError) {
18323
+ retrySyncSpinner.fail("Sync failed");
18324
+ console.log(source_default.red("Error:"), retryError instanceof Error ? retryError.message : String(retryError));
18325
+ }
18326
+ } else {
18327
+ syncSpinner.fail("Sync failed");
18328
+ console.log(source_default.red("Error:"), error instanceof Error ? error.message : String(error));
18329
+ }
18277
18330
  }
18278
18331
  });
18279
18332
  process.on("SIGINT", () => {
@@ -19095,7 +19148,7 @@ var whoamiCommand = new Command("whoami").description("Show current logged in us
19095
19148
  // package.json
19096
19149
  var package_default = {
19097
19150
  name: "struere",
19098
- version: "0.3.7",
19151
+ version: "0.3.8",
19099
19152
  description: "Build, test, and deploy AI agents",
19100
19153
  keywords: [
19101
19154
  "ai",
@@ -1 +1 @@
1
- {"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/dev.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAanC,eAAO,MAAM,UAAU,SA8GnB,CAAA"}
1
+ {"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/dev.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAenC,eAAO,MAAM,UAAU,SAuKnB,CAAA"}
package/dist/cli/index.js CHANGED
@@ -1466,6 +1466,7 @@ import chalk3 from "chalk";
1466
1466
  import ora3 from "ora";
1467
1467
  import chokidar from "chokidar";
1468
1468
  import { join as join7, basename as basename2 } from "path";
1469
+ import { existsSync as existsSync5, writeFileSync as writeFileSync4 } from "fs";
1469
1470
 
1470
1471
  // src/cli/utils/config.ts
1471
1472
  import { join as join5 } from "path";
@@ -1565,14 +1566,21 @@ var devCommand = new Command3("dev").description("Sync agent to development envi
1565
1566
  spinner.start("Loading agent");
1566
1567
  let agent = await loadAgent(cwd);
1567
1568
  spinner.succeed(`Agent "${agent.name}" loaded`);
1568
- const credentials = loadCredentials();
1569
+ const claudeMdPath = join7(cwd, ".claude.md");
1570
+ if (!existsSync5(claudeMdPath)) {
1571
+ writeFileSync4(claudeMdPath, getClaudeMd(project.agent.slug));
1572
+ console.log(chalk3.green("\u2713"), "Created .claude.md");
1573
+ }
1574
+ let credentials = loadCredentials();
1569
1575
  const apiKey = getApiKey();
1570
1576
  if (!credentials && !apiKey) {
1571
- spinner.fail("Not logged in");
1572
- console.log();
1573
- console.log(chalk3.gray("Run"), chalk3.cyan("struere login"), chalk3.gray("to authenticate"));
1577
+ console.log(chalk3.gray("Authentication required"));
1574
1578
  console.log();
1575
- process.exit(1);
1579
+ credentials = await performLogin();
1580
+ if (!credentials) {
1581
+ console.log(chalk3.red("Authentication failed"));
1582
+ process.exit(1);
1583
+ }
1576
1584
  }
1577
1585
  spinner.start("Syncing to Convex");
1578
1586
  const performSync = async () => {
@@ -1587,13 +1595,38 @@ var devCommand = new Command3("dev").description("Sync agent to development envi
1587
1595
  throw error;
1588
1596
  }
1589
1597
  };
1598
+ const isAuthError = (error) => {
1599
+ const message = error instanceof Error ? error.message : String(error);
1600
+ return message.includes("Unauthenticated") || message.includes("OIDC") || message.includes("token") || message.includes("expired");
1601
+ };
1590
1602
  try {
1591
1603
  await performSync();
1592
1604
  spinner.succeed("Synced to development");
1593
1605
  } catch (error) {
1594
- spinner.fail("Sync failed");
1595
- console.log(chalk3.red("Error:"), error instanceof Error ? error.message : String(error));
1596
- process.exit(1);
1606
+ if (isAuthError(error)) {
1607
+ spinner.fail("Session expired");
1608
+ console.log();
1609
+ console.log(chalk3.gray("Re-authenticating..."));
1610
+ clearCredentials();
1611
+ credentials = await performLogin();
1612
+ if (!credentials) {
1613
+ console.log(chalk3.red("Authentication failed"));
1614
+ process.exit(1);
1615
+ }
1616
+ spinner.start("Syncing to Convex");
1617
+ try {
1618
+ await performSync();
1619
+ spinner.succeed("Synced to development");
1620
+ } catch (retryError) {
1621
+ spinner.fail("Sync failed");
1622
+ console.log(chalk3.red("Error:"), retryError instanceof Error ? retryError.message : String(retryError));
1623
+ process.exit(1);
1624
+ }
1625
+ } else {
1626
+ spinner.fail("Sync failed");
1627
+ console.log(chalk3.red("Error:"), error instanceof Error ? error.message : String(error));
1628
+ process.exit(1);
1629
+ }
1597
1630
  }
1598
1631
  const devUrl = `https://${project.agent.slug}-dev.struere.dev`;
1599
1632
  console.log();
@@ -1614,8 +1647,28 @@ var devCommand = new Command3("dev").description("Sync agent to development envi
1614
1647
  await performSync();
1615
1648
  syncSpinner.succeed("Synced");
1616
1649
  } catch (error) {
1617
- syncSpinner.fail("Sync failed");
1618
- console.log(chalk3.red("Error:"), error instanceof Error ? error.message : String(error));
1650
+ if (isAuthError(error)) {
1651
+ syncSpinner.fail("Session expired");
1652
+ console.log();
1653
+ console.log(chalk3.gray("Re-authenticating..."));
1654
+ clearCredentials();
1655
+ const newCredentials = await performLogin();
1656
+ if (!newCredentials) {
1657
+ console.log(chalk3.red("Authentication failed"));
1658
+ return;
1659
+ }
1660
+ const retrySyncSpinner = ora3("Syncing...").start();
1661
+ try {
1662
+ await performSync();
1663
+ retrySyncSpinner.succeed("Synced");
1664
+ } catch (retryError) {
1665
+ retrySyncSpinner.fail("Sync failed");
1666
+ console.log(chalk3.red("Error:"), retryError instanceof Error ? retryError.message : String(retryError));
1667
+ }
1668
+ } else {
1669
+ syncSpinner.fail("Sync failed");
1670
+ console.log(chalk3.red("Error:"), error instanceof Error ? error.message : String(error));
1671
+ }
1619
1672
  }
1620
1673
  });
1621
1674
  process.on("SIGINT", () => {
@@ -2460,7 +2513,7 @@ var whoamiCommand = new Command11("whoami").description("Show current logged in
2460
2513
  // package.json
2461
2514
  var package_default = {
2462
2515
  name: "struere",
2463
- version: "0.3.7",
2516
+ version: "0.3.8",
2464
2517
  description: "Build, test, and deploy AI agents",
2465
2518
  keywords: [
2466
2519
  "ai",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "struere",
3
- "version": "0.3.7",
3
+ "version": "0.3.8",
4
4
  "description": "Build, test, and deploy AI agents",
5
5
  "keywords": [
6
6
  "ai",