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.
Files changed (40) hide show
  1. package/__tests__/antigravity-js-handler.test.js +23 -0
  2. package/__tests__/provider-manager.test.js +84 -0
  3. package/__tests__/provider-rate-cache.test.js +27 -0
  4. package/bin/vibecodingmachine.js +8 -0
  5. package/package.json +2 -2
  6. package/reset_provider_order.js +21 -0
  7. package/scripts/convert-requirements.js +35 -0
  8. package/scripts/debug-parse.js +24 -0
  9. package/src/commands/auto-direct.js +679 -120
  10. package/src/commands/auto.js +200 -45
  11. package/src/commands/ide.js +108 -3
  12. package/src/commands/requirements-remote.js +10 -1
  13. package/src/commands/status.js +39 -1
  14. package/src/utils/antigravity-js-handler.js +13 -4
  15. package/src/utils/auth.js +37 -13
  16. package/src/utils/compliance-check.js +10 -0
  17. package/src/utils/config.js +29 -1
  18. package/src/utils/date-formatter.js +44 -0
  19. package/src/utils/interactive.js +1006 -537
  20. package/src/utils/kiro-js-handler.js +188 -0
  21. package/src/utils/provider-rate-cache.js +31 -0
  22. package/src/utils/provider-registry.js +42 -1
  23. package/src/utils/requirements-converter.js +107 -0
  24. package/src/utils/requirements-parser.js +144 -0
  25. package/tests/antigravity-js-handler.test.js +23 -0
  26. package/tests/integration/health-tracking.integration.test.js +284 -0
  27. package/tests/provider-manager.test.js +92 -0
  28. package/tests/rate-limit-display.test.js +44 -0
  29. package/tests/requirements-bullet-parsing.test.js +15 -0
  30. package/tests/requirements-converter.test.js +42 -0
  31. package/tests/requirements-heading-count.test.js +27 -0
  32. package/tests/requirements-legacy-parsing.test.js +15 -0
  33. package/tests/requirements-parse-integration.test.js +44 -0
  34. package/tests/wait-for-ide-completion.test.js +56 -0
  35. package/tests/wait-for-ide-quota-detection-cursor-screenshot.test.js +61 -0
  36. package/tests/wait-for-ide-quota-detection-cursor.test.js +60 -0
  37. package/tests/wait-for-ide-quota-detection-negative.test.js +45 -0
  38. package/tests/wait-for-ide-quota-detection.test.js +59 -0
  39. package/verify_fix.js +36 -0
  40. 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) {
@@ -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 };