vibecodingmachine-cli 2026.1.3-2209 → 2026.1.23-1010
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/__tests__/antigravity-js-handler.test.js +23 -0
- package/__tests__/provider-manager.test.js +84 -0
- package/__tests__/provider-rate-cache.test.js +27 -0
- package/bin/vibecodingmachine.js +8 -0
- package/package.json +2 -2
- package/reset_provider_order.js +21 -0
- package/scripts/convert-requirements.js +35 -0
- package/scripts/debug-parse.js +24 -0
- package/src/commands/auto-direct.js +679 -120
- package/src/commands/auto.js +200 -45
- package/src/commands/ide.js +108 -3
- package/src/commands/requirements-remote.js +10 -1
- package/src/commands/status.js +39 -1
- package/src/utils/antigravity-js-handler.js +13 -4
- package/src/utils/auth.js +37 -13
- package/src/utils/compliance-check.js +10 -0
- package/src/utils/config.js +29 -1
- package/src/utils/date-formatter.js +44 -0
- package/src/utils/interactive.js +1006 -537
- package/src/utils/kiro-js-handler.js +188 -0
- package/src/utils/provider-rate-cache.js +31 -0
- package/src/utils/provider-registry.js +42 -1
- package/src/utils/requirements-converter.js +107 -0
- package/src/utils/requirements-parser.js +144 -0
- package/tests/antigravity-js-handler.test.js +23 -0
- package/tests/integration/health-tracking.integration.test.js +284 -0
- package/tests/provider-manager.test.js +92 -0
- package/tests/rate-limit-display.test.js +44 -0
- package/tests/requirements-bullet-parsing.test.js +15 -0
- package/tests/requirements-converter.test.js +42 -0
- package/tests/requirements-heading-count.test.js +27 -0
- package/tests/requirements-legacy-parsing.test.js +15 -0
- package/tests/requirements-parse-integration.test.js +44 -0
- package/tests/wait-for-ide-completion.test.js +56 -0
- package/tests/wait-for-ide-quota-detection-cursor-screenshot.test.js +61 -0
- package/tests/wait-for-ide-quota-detection-cursor.test.js +60 -0
- package/tests/wait-for-ide-quota-detection-negative.test.js +45 -0
- package/tests/wait-for-ide-quota-detection.test.js +59 -0
- package/verify_fix.js +36 -0
- package/verify_ui.js +38 -0
package/src/utils/auth.js
CHANGED
|
@@ -50,7 +50,7 @@ class CLIAuth {
|
|
|
50
50
|
|
|
51
51
|
// Save new tokens
|
|
52
52
|
await sharedAuth.saveToken(newTokens);
|
|
53
|
-
|
|
53
|
+
|
|
54
54
|
// Update user activity in database
|
|
55
55
|
await this._updateUserActivity();
|
|
56
56
|
return true;
|
|
@@ -72,11 +72,16 @@ class CLIAuth {
|
|
|
72
72
|
|
|
73
73
|
/**
|
|
74
74
|
* Get auth token string for API requests
|
|
75
|
+
* Ensures the token is valid and refreshed if necessary
|
|
75
76
|
*/
|
|
76
77
|
async getAuthToken() {
|
|
78
|
+
// Check if authenticated and refresh if needed
|
|
79
|
+
const isAuth = await this.isAuthenticated();
|
|
80
|
+
if (!isAuth) return null;
|
|
81
|
+
|
|
77
82
|
const token = await sharedAuth.getToken();
|
|
78
83
|
if (!token) return null;
|
|
79
|
-
|
|
84
|
+
|
|
80
85
|
// Handle both string token and object with id_token
|
|
81
86
|
return typeof token === 'string' ? token : token.id_token;
|
|
82
87
|
}
|
|
@@ -718,10 +723,10 @@ class CLIAuth {
|
|
|
718
723
|
try {
|
|
719
724
|
// Decode JWT to get user info (without verification since we already validated)
|
|
720
725
|
const payload = JSON.parse(Buffer.from(idToken.split('.')[1], 'base64').toString());
|
|
721
|
-
|
|
726
|
+
|
|
722
727
|
const UserDatabase = require('vibecodingmachine-core/src/database/user-schema');
|
|
723
728
|
const userDb = new UserDatabase();
|
|
724
|
-
|
|
729
|
+
|
|
725
730
|
const userInfo = {
|
|
726
731
|
email: payload.email,
|
|
727
732
|
name: payload.name || payload.email.split('@')[0],
|
|
@@ -730,7 +735,7 @@ class CLIAuth {
|
|
|
730
735
|
|
|
731
736
|
// Register/update user
|
|
732
737
|
const user = await userDb.registerUser(userInfo);
|
|
733
|
-
|
|
738
|
+
|
|
734
739
|
// Register computer
|
|
735
740
|
await userDb.registerComputer(user.userId, {
|
|
736
741
|
interface: 'cli'
|
|
@@ -763,12 +768,12 @@ class CLIAuth {
|
|
|
763
768
|
|
|
764
769
|
// Decode JWT to get user info
|
|
765
770
|
const payload = JSON.parse(Buffer.from(token.id_token.split('.')[1], 'base64').toString());
|
|
766
|
-
|
|
771
|
+
|
|
767
772
|
const UserDatabase = require('vibecodingmachine-core/src/database/user-schema');
|
|
768
773
|
const userDb = new UserDatabase();
|
|
769
|
-
|
|
774
|
+
|
|
770
775
|
const userId = userDb.generateUserId(payload.email);
|
|
771
|
-
|
|
776
|
+
|
|
772
777
|
// Update last activity
|
|
773
778
|
await userDb.updateUserActivity(userId, {
|
|
774
779
|
lastActivity: Date.now()
|
|
@@ -793,12 +798,12 @@ class CLIAuth {
|
|
|
793
798
|
if (!idToken) return;
|
|
794
799
|
|
|
795
800
|
const payload = JSON.parse(Buffer.from(idToken.split('.')[1], 'base64').toString());
|
|
796
|
-
|
|
801
|
+
|
|
797
802
|
const UserDatabase = require('vibecodingmachine-core/src/database/user-schema');
|
|
798
803
|
const userDb = new UserDatabase();
|
|
799
|
-
|
|
804
|
+
|
|
800
805
|
const userId = userDb.generateUserId(payload.email);
|
|
801
|
-
|
|
806
|
+
|
|
802
807
|
await userDb.trackActivity(userId, {
|
|
803
808
|
interface: 'cli',
|
|
804
809
|
action,
|
|
@@ -828,12 +833,31 @@ class CLIAuth {
|
|
|
828
833
|
if (!idToken) return null;
|
|
829
834
|
|
|
830
835
|
const payload = JSON.parse(Buffer.from(idToken.split('.')[1], 'base64').toString());
|
|
831
|
-
|
|
836
|
+
|
|
832
837
|
const UserDatabase = require('vibecodingmachine-core/src/database/user-schema');
|
|
833
838
|
const userDb = new UserDatabase();
|
|
839
|
+
|
|
840
|
+
// Get user from API to get the correct userId format
|
|
841
|
+
const userDbClient = userDb.apiClient;
|
|
842
|
+
userDbClient.setAuthToken(idToken);
|
|
834
843
|
|
|
844
|
+
try {
|
|
845
|
+
const apiUser = await userDbClient.getUser();
|
|
846
|
+
if (apiUser && apiUser.userId) {
|
|
847
|
+
return {
|
|
848
|
+
userId: apiUser.userId, // Use API server's userId format
|
|
849
|
+
email: payload.email,
|
|
850
|
+
name: payload.name || payload.email.split('@')[0],
|
|
851
|
+
cognitoId: payload.sub
|
|
852
|
+
};
|
|
853
|
+
}
|
|
854
|
+
} catch (error) {
|
|
855
|
+
console.warn('Could not fetch user from API:', error.message);
|
|
856
|
+
}
|
|
857
|
+
|
|
858
|
+
// Fallback to generated userId if API call fails
|
|
835
859
|
const userId = userDb.generateUserId(payload.email);
|
|
836
|
-
|
|
860
|
+
|
|
837
861
|
return {
|
|
838
862
|
userId,
|
|
839
863
|
email: payload.email,
|
|
@@ -38,8 +38,18 @@ async function checkCompliance() {
|
|
|
38
38
|
return true
|
|
39
39
|
}
|
|
40
40
|
|
|
41
|
+
// Set auth token for database operations
|
|
42
|
+
const token = await auth.getAuthToken()
|
|
43
|
+
if (token) {
|
|
44
|
+
const UserDatabase = require('vibecodingmachine-core/src/database/user-schema')
|
|
45
|
+
const userDb = new UserDatabase()
|
|
46
|
+
userDb.setAuthToken(token)
|
|
47
|
+
}
|
|
48
|
+
|
|
41
49
|
// Check and prompt for compliance
|
|
42
50
|
const compliancePrompt = new CompliancePrompt()
|
|
51
|
+
// Set auth token for compliance manager
|
|
52
|
+
compliancePrompt.complianceManager.userDb.setAuthToken(token)
|
|
43
53
|
const status = await compliancePrompt.complianceManager.checkComplianceStatus(user.userId)
|
|
44
54
|
|
|
45
55
|
if (!status.needsAcknowledgment) {
|
package/src/utils/config.js
CHANGED
|
@@ -86,6 +86,30 @@ async function setComputerFilter(computerName) {
|
|
|
86
86
|
await writeConfig(cfg);
|
|
87
87
|
}
|
|
88
88
|
|
|
89
|
+
async function getProviderCache() {
|
|
90
|
+
const cfg = await readConfig();
|
|
91
|
+
return cfg.providerCache || {};
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
async function setProviderCache(cacheData) {
|
|
95
|
+
const cfg = await readConfig();
|
|
96
|
+
// Merge with existing cache
|
|
97
|
+
cfg.providerCache = { ...(cfg.providerCache || {}), ...cacheData };
|
|
98
|
+
await writeConfig(cfg);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
async function getAutoTimeout() {
|
|
102
|
+
const cfg = await readConfig();
|
|
103
|
+
// Default to 5 minutes (300000 ms) if not set
|
|
104
|
+
return cfg.autoTimeout !== undefined ? cfg.autoTimeout : 5 * 60 * 1000;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
async function setAutoTimeout(timeoutMs) {
|
|
108
|
+
const cfg = await readConfig();
|
|
109
|
+
cfg.autoTimeout = timeoutMs;
|
|
110
|
+
await writeConfig(cfg);
|
|
111
|
+
}
|
|
112
|
+
|
|
89
113
|
module.exports = {
|
|
90
114
|
getRepoPath,
|
|
91
115
|
setRepoPath,
|
|
@@ -97,7 +121,11 @@ module.exports = {
|
|
|
97
121
|
setStages,
|
|
98
122
|
DEFAULT_STAGES,
|
|
99
123
|
getComputerFilter,
|
|
100
|
-
setComputerFilter
|
|
124
|
+
setComputerFilter,
|
|
125
|
+
getProviderCache,
|
|
126
|
+
setProviderCache,
|
|
127
|
+
getAutoTimeout,
|
|
128
|
+
setAutoTimeout
|
|
101
129
|
};
|
|
102
130
|
|
|
103
131
|
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Format a date into a rate limit reset label
|
|
3
|
+
* @param {string|number|Date} resetsAt - The reset time
|
|
4
|
+
* @returns {string|null} - Formatted label (e.g., "Resets at 4:23 pm CST on January 17, 2026")
|
|
5
|
+
*/
|
|
6
|
+
function formatResetsAtLabel(resetsAt) {
|
|
7
|
+
if (!resetsAt) return null;
|
|
8
|
+
const resetDate = new Date(resetsAt);
|
|
9
|
+
if (Number.isNaN(resetDate.getTime())) return null;
|
|
10
|
+
|
|
11
|
+
const msUntilReset = resetDate.getTime() - Date.now();
|
|
12
|
+
// If the reset minute has started (i.e., we're at or past the beginning of the stated minute),
|
|
13
|
+
// consider the quota reset to have occurred and don't show a label.
|
|
14
|
+
const resetMinuteStart = new Date(resetDate);
|
|
15
|
+
resetMinuteStart.setSeconds(0, 0);
|
|
16
|
+
if (resetMinuteStart.getTime() <= Date.now()) return null;
|
|
17
|
+
|
|
18
|
+
// Format time part: "4:23 pm"
|
|
19
|
+
const timePart = resetDate.toLocaleTimeString('en-US', {
|
|
20
|
+
hour: 'numeric',
|
|
21
|
+
minute: '2-digit',
|
|
22
|
+
hour12: true
|
|
23
|
+
}).toLowerCase();
|
|
24
|
+
|
|
25
|
+
// Format timezone part: "mst"
|
|
26
|
+
// Note: toLocaleString with timeZoneName: 'short' often returns 'MST', 'PDT', etc.
|
|
27
|
+
const tzPart = resetDate.toLocaleTimeString('en-US', {
|
|
28
|
+
timeZoneName: 'short'
|
|
29
|
+
}).split(' ').pop().toLowerCase();
|
|
30
|
+
|
|
31
|
+
const months = [
|
|
32
|
+
'January', 'February', 'March', 'April', 'May', 'June',
|
|
33
|
+
'July', 'August', 'September', 'October', 'November', 'December'
|
|
34
|
+
];
|
|
35
|
+
|
|
36
|
+
const monthName = months[resetDate.getMonth()];
|
|
37
|
+
const day = resetDate.getDate();
|
|
38
|
+
const year = resetDate.getFullYear();
|
|
39
|
+
|
|
40
|
+
// "Resets at 4:23 pm mst on January 17, 2026"
|
|
41
|
+
return `Resets at ${timePart} ${tzPart} on ${monthName} ${day}, ${year}`;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
module.exports = { formatResetsAtLabel };
|