@supatest/cli 0.0.6 → 0.0.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.
Files changed (2) hide show
  1. package/dist/index.js +54 -15
  2. package/package.json +2 -2
package/dist/index.js CHANGED
@@ -15,7 +15,7 @@ var init_builder = __esm({
15
15
  "src/prompts/builder.ts"() {
16
16
  "use strict";
17
17
  builderPrompt = `<role>
18
- You are an E2E Test Builder Agent that iteratively creates, runs, and fixes Playwright tests until they pass. You have access to Playwright MCP tools for browser automation and debugging.
18
+ You are an E2E Test Builder Agent called Supatest AI that iteratively creates, runs, and fixes Playwright tests until they pass. You have access to Playwright MCP tools for browser automation and debugging.
19
19
  </role>
20
20
 
21
21
  <core_workflow>
@@ -4429,7 +4429,7 @@ var CLI_VERSION;
4429
4429
  var init_version = __esm({
4430
4430
  "src/version.ts"() {
4431
4431
  "use strict";
4432
- CLI_VERSION = "0.0.6";
4432
+ CLI_VERSION = "0.0.8";
4433
4433
  }
4434
4434
  });
4435
4435
 
@@ -4453,7 +4453,12 @@ var init_banner = __esm({
4453
4453
  import crypto from "crypto";
4454
4454
  import { hostname, userInfo } from "os";
4455
4455
  function deriveEncryptionKey() {
4456
- const salt = `${hostname()}-${userInfo().username}-supatest-cli`;
4456
+ const host = hostname();
4457
+ const user = userInfo().username;
4458
+ const salt = `${host}-${user}-supatest-cli`;
4459
+ if (process.env.DEBUG_ENCRYPTION) {
4460
+ console.error(`[encryption] hostname=${host}, username=${user}, salt=${salt}`);
4461
+ }
4457
4462
  return crypto.scryptSync("supatest-cli-token", salt, KEY_LENGTH);
4458
4463
  }
4459
4464
  function getEncryptionKey() {
@@ -4538,6 +4543,23 @@ async function isKeychainAvailable() {
4538
4543
  }
4539
4544
  return keychainAvailable;
4540
4545
  }
4546
+ async function saveToKeychain(token, expiresAt) {
4547
+ const keytar = await getKeytar();
4548
+ if (!keytar) {
4549
+ return false;
4550
+ }
4551
+ const payload = {
4552
+ token,
4553
+ expiresAt,
4554
+ createdAt: (/* @__PURE__ */ new Date()).toISOString()
4555
+ };
4556
+ try {
4557
+ await keytar.setPassword(SERVICE_NAME, ACCOUNT_NAME, JSON.stringify(payload));
4558
+ return true;
4559
+ } catch {
4560
+ return false;
4561
+ }
4562
+ }
4541
4563
  async function loadFromKeychain() {
4542
4564
  const keytar = await getKeytar();
4543
4565
  if (!keytar) {
@@ -4553,6 +4575,17 @@ async function loadFromKeychain() {
4553
4575
  return null;
4554
4576
  }
4555
4577
  }
4578
+ async function removeFromKeychain() {
4579
+ const keytar = await getKeytar();
4580
+ if (!keytar) {
4581
+ return false;
4582
+ }
4583
+ try {
4584
+ return await keytar.deletePassword(SERVICE_NAME, ACCOUNT_NAME);
4585
+ } catch {
4586
+ return false;
4587
+ }
4588
+ }
4556
4589
  var SERVICE_NAME, ACCOUNT_NAME, KEYCHAIN_TEST_PREFIX, keytarModule, keytarLoadAttempted, keychainAvailable;
4557
4590
  var init_keychain_storage = __esm({
4558
4591
  "src/utils/keychain-storage.ts"() {
@@ -4635,9 +4668,6 @@ function removeTokenFile() {
4635
4668
  unlinkSync(TOKEN_FILE);
4636
4669
  }
4637
4670
  }
4638
- function saveToken(token, expiresAt) {
4639
- saveTokenToFile(token, expiresAt);
4640
- }
4641
4671
  function loadToken() {
4642
4672
  const payload = loadTokenFromFile();
4643
4673
  if (!payload) {
@@ -4652,11 +4682,16 @@ function loadToken() {
4652
4682
  }
4653
4683
  return payload.token;
4654
4684
  }
4655
- function removeToken() {
4656
- removeTokenFile();
4657
- }
4658
- function isLoggedIn() {
4659
- return loadToken() !== null;
4685
+ async function saveTokenAsync(token, expiresAt) {
4686
+ const storageType = await getStorageType();
4687
+ if (storageType === "keychain" /* KEYCHAIN */) {
4688
+ const saved = await saveToKeychain(token, expiresAt);
4689
+ if (saved) {
4690
+ removeTokenFile();
4691
+ return;
4692
+ }
4693
+ }
4694
+ saveTokenToFile(token, expiresAt);
4660
4695
  }
4661
4696
  async function loadTokenAsync() {
4662
4697
  const storageType = await getStorageType();
@@ -4672,6 +4707,10 @@ async function loadTokenAsync() {
4672
4707
  }
4673
4708
  return loadToken();
4674
4709
  }
4710
+ async function removeTokenAsync() {
4711
+ await removeFromKeychain();
4712
+ removeTokenFile();
4713
+ }
4675
4714
  var CONFIG_DIR, TOKEN_FILE, STORAGE_VERSION, activeStorageType, storageInitPromise;
4676
4715
  var init_token_storage = __esm({
4677
4716
  "src/utils/token-storage.ts"() {
@@ -8008,11 +8047,11 @@ var init_App = __esm({
8008
8047
  const inputPromptRef = useRef6(null);
8009
8048
  const [showSessionSelector, setShowSessionSelector] = useState7(false);
8010
8049
  const [authState, setAuthState] = useState7(
8011
- () => isLoggedIn() ? "authenticated" /* Authenticated */ : "unauthenticated" /* Unauthenticated */
8050
+ () => config2.supatestApiKey ? "authenticated" /* Authenticated */ : "unauthenticated" /* Unauthenticated */
8012
8051
  );
8013
8052
  const [showAuthDialog, setShowAuthDialog] = useState7(false);
8014
8053
  useEffect10(() => {
8015
- if (!isLoggedIn() && !config2.supatestApiKey) {
8054
+ if (!config2.supatestApiKey) {
8016
8055
  setShowAuthDialog(true);
8017
8056
  }
8018
8057
  }, [config2.supatestApiKey]);
@@ -8033,7 +8072,7 @@ var init_App = __esm({
8033
8072
  });
8034
8073
  try {
8035
8074
  const result = await loginCommand();
8036
- saveToken(result.token, result.expiresAt);
8075
+ await saveTokenAsync(result.token, result.expiresAt);
8037
8076
  if (apiClient) {
8038
8077
  apiClient.setApiKey(result.token);
8039
8078
  }
@@ -8087,7 +8126,7 @@ var init_App = __esm({
8087
8126
  });
8088
8127
  return;
8089
8128
  }
8090
- removeToken();
8129
+ await removeTokenAsync();
8091
8130
  if (apiClient) {
8092
8131
  apiClient.clearApiKey();
8093
8132
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@supatest/cli",
3
- "version": "0.0.6",
3
+ "version": "0.0.8",
4
4
  "description": "Supatest CLI - AI-powered task automation for CI/CD",
5
5
  "type": "module",
6
6
  "bin": {
@@ -38,7 +38,7 @@
38
38
  "access": "public"
39
39
  },
40
40
  "dependencies": {
41
- "@anthropic-ai/claude-agent-sdk": "^0.1.56",
41
+ "@anthropic-ai/claude-agent-sdk": "^0.1.58",
42
42
  "@anthropic-ai/sdk": "^0.71.0",
43
43
  "@types/inquirer": "^9.0.0",
44
44
  "ansi-escapes": "^7.0.0",