@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.
- package/dist/index.js +54 -15
- 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.
|
|
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
|
|
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
|
|
4656
|
-
|
|
4657
|
-
|
|
4658
|
-
|
|
4659
|
-
|
|
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
|
-
() =>
|
|
8050
|
+
() => config2.supatestApiKey ? "authenticated" /* Authenticated */ : "unauthenticated" /* Unauthenticated */
|
|
8012
8051
|
);
|
|
8013
8052
|
const [showAuthDialog, setShowAuthDialog] = useState7(false);
|
|
8014
8053
|
useEffect10(() => {
|
|
8015
|
-
if (!
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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",
|