vibecodingmachine-core 2026.3.9-907 → 2026.3.10-1548
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/package.json +1 -1
- package/src/auth/access-denied.html +119 -119
- package/src/auth/shared-auth-storage.js +267 -267
- package/src/autonomous-mode/feature-implementer.cjs +70 -70
- package/src/autonomous-mode/feature-implementer.js +425 -425
- package/src/beta-request.js +160 -160
- package/src/chat-management/chat-manager.cjs +71 -71
- package/src/chat-management/chat-manager.js +342 -342
- package/src/compliance/compliance-prompt.js +183 -183
- package/src/ide-integration/aider-cli-manager.cjs +850 -850
- package/src/ide-integration/applescript-manager.cjs +3215 -3215
- package/src/ide-integration/applescript-utils.js +314 -314
- package/src/ide-integration/cdp-manager.cjs +221 -221
- package/src/ide-integration/claude-code-cli-manager.cjs +456 -456
- package/src/ide-integration/cline-cli-manager.cjs +2252 -2252
- package/src/ide-integration/continue-cli-manager.js +431 -431
- package/src/ide-integration/provider-manager.cjs +595 -595
- package/src/ide-integration/quota-detector.cjs +399 -399
- package/src/ide-integration/windows-automation-manager.js +532 -4
- package/src/ide-integration/windows-ide-manager.js +12 -3
- package/src/index.cjs +142 -142
- package/src/llm/direct-llm-manager.cjs +1299 -1299
- package/src/localization/index.js +147 -147
- package/src/quota-management/index.js +108 -108
- package/src/requirement-numbering.js +164 -164
- package/src/sync/aws-setup.js +445 -445
- package/src/ui/ButtonComponents.js +247 -247
- package/src/ui/ChatInterface.js +499 -499
- package/src/ui/StateManager.js +259 -259
- package/src/utils/audit-logger.cjs +116 -116
- package/src/utils/config-helpers.cjs +94 -94
- package/src/utils/config-helpers.js +94 -94
- package/src/utils/env-helpers.js +54 -54
- package/src/utils/error-reporter.js +117 -117
- package/src/utils/gcloud-auth.cjs +394 -394
- package/src/utils/git-branch-manager.js +278 -278
- package/src/utils/logger.cjs +193 -193
- package/src/utils/logger.js +191 -191
- package/src/utils/repo-helpers.cjs +120 -120
- package/src/utils/repo-helpers.js +120 -120
- package/src/utils/update-checker.js +246 -246
- package/src/utils/version-checker.js +170 -170
|
@@ -1,164 +1,164 @@
|
|
|
1
|
-
const fs = require('fs-extra');
|
|
2
|
-
const path = require('path');
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Get metadata file path for storing requirement counter
|
|
6
|
-
* @param {string} repoPath - Path to repository
|
|
7
|
-
* @returns {string} Path to metadata file
|
|
8
|
-
*/
|
|
9
|
-
function getMetadataPath(repoPath) {
|
|
10
|
-
return path.join(repoPath, '.vibecodingmachine', 'requirement-metadata.json');
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Get the next requirement number for this repository
|
|
15
|
-
* @param {string} repoPath - Path to repository
|
|
16
|
-
* @returns {Promise<number>} Next requirement number
|
|
17
|
-
*/
|
|
18
|
-
async function getNextRequirementNumber(repoPath) {
|
|
19
|
-
const metadataPath = getMetadataPath(repoPath);
|
|
20
|
-
|
|
21
|
-
try {
|
|
22
|
-
await fs.ensureFile(metadataPath);
|
|
23
|
-
const metadata = await fs.readJson(metadataPath).catch(() => ({ lastRequirementNumber: 0 }));
|
|
24
|
-
|
|
25
|
-
const nextNumber = (metadata.lastRequirementNumber || 0) + 1;
|
|
26
|
-
|
|
27
|
-
// Save the incremented number
|
|
28
|
-
metadata.lastRequirementNumber = nextNumber;
|
|
29
|
-
await fs.writeJson(metadataPath, metadata, { spaces: 2 });
|
|
30
|
-
|
|
31
|
-
return nextNumber;
|
|
32
|
-
} catch (error) {
|
|
33
|
-
// Default to 1 if there's any error
|
|
34
|
-
console.error('Error getting next requirement number:', error.message);
|
|
35
|
-
return 1;
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* Set the last requirement number (used during initialization)
|
|
41
|
-
* @param {string} repoPath - Path to repository
|
|
42
|
-
* @param {number} lastNumber - Last requirement number
|
|
43
|
-
*/
|
|
44
|
-
async function setLastRequirementNumber(repoPath, lastNumber) {
|
|
45
|
-
const metadataPath = getMetadataPath(repoPath);
|
|
46
|
-
|
|
47
|
-
await fs.ensureFile(metadataPath);
|
|
48
|
-
const metadata = await fs.readJson(metadataPath).catch(() => ({}));
|
|
49
|
-
metadata.lastRequirementNumber = lastNumber;
|
|
50
|
-
await fs.writeJson(metadataPath, metadata, { spaces: 2 });
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* Extract requirement number from requirement title
|
|
55
|
-
* @param {string} title - Requirement title
|
|
56
|
-
* @returns {number|null} Requirement number or null if not found
|
|
57
|
-
*/
|
|
58
|
-
function extractRequirementNumber(title) {
|
|
59
|
-
const match = title.match(/^R(\d+):/);
|
|
60
|
-
return match ? parseInt(match[1], 10) : null;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* Number all existing requirements in a requirements file
|
|
65
|
-
* @param {string} reqPath - Path to requirements file
|
|
66
|
-
* @param {string} repoPath - Path to repository
|
|
67
|
-
* @returns {Promise<number>} Number of requirements numbered
|
|
68
|
-
*/
|
|
69
|
-
async function numberAllRequirements(reqPath, repoPath) {
|
|
70
|
-
if (!await fs.pathExists(reqPath)) {
|
|
71
|
-
return 0;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
const content = await fs.readFile(reqPath, 'utf8');
|
|
75
|
-
const lines = content.split('\n');
|
|
76
|
-
const newLines = [];
|
|
77
|
-
|
|
78
|
-
let requirementCount = 0;
|
|
79
|
-
let maxExistingNumber = 0;
|
|
80
|
-
|
|
81
|
-
// First pass: collect existing numbers and count requirements
|
|
82
|
-
for (const line of lines) {
|
|
83
|
-
if (line.trim().startsWith('###')) {
|
|
84
|
-
const title = line.trim().substring(3).trim();
|
|
85
|
-
const existingNumber = extractRequirementNumber(title);
|
|
86
|
-
|
|
87
|
-
if (existingNumber) {
|
|
88
|
-
maxExistingNumber = Math.max(maxExistingNumber, existingNumber);
|
|
89
|
-
} else {
|
|
90
|
-
// This requirement needs numbering
|
|
91
|
-
requirementCount++;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
// Start numbering from max existing + 1
|
|
97
|
-
let currentNumber = maxExistingNumber + 1;
|
|
98
|
-
let numbered = 0;
|
|
99
|
-
|
|
100
|
-
// Second pass: add numbers to requirements that don't have them
|
|
101
|
-
for (const line of lines) {
|
|
102
|
-
if (line.trim().startsWith('###')) {
|
|
103
|
-
const title = line.trim().substring(3).trim();
|
|
104
|
-
const existingNumber = extractRequirementNumber(title);
|
|
105
|
-
|
|
106
|
-
if (!existingNumber) {
|
|
107
|
-
// Add number to this requirement
|
|
108
|
-
newLines.push(`### R${currentNumber}: ${title}`);
|
|
109
|
-
currentNumber++;
|
|
110
|
-
numbered++;
|
|
111
|
-
} else {
|
|
112
|
-
// Keep existing numbered requirement as-is
|
|
113
|
-
newLines.push(line);
|
|
114
|
-
}
|
|
115
|
-
} else {
|
|
116
|
-
newLines.push(line);
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
// Save the updated file
|
|
121
|
-
await fs.writeFile(reqPath, newLines.join('\n'));
|
|
122
|
-
|
|
123
|
-
// Update metadata with the highest number used
|
|
124
|
-
await setLastRequirementNumber(repoPath, currentNumber - 1);
|
|
125
|
-
|
|
126
|
-
return numbered;
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
/**
|
|
130
|
-
* Create a git branch name from requirement number and title
|
|
131
|
-
* @param {number} reqNumber - Requirement number
|
|
132
|
-
* @param {string} title - Requirement title
|
|
133
|
-
* @returns {string} Branch name (e.g., "R1_email_system")
|
|
134
|
-
*/
|
|
135
|
-
function createBranchName(reqNumber, title) {
|
|
136
|
-
// Remove requirement number from title if present
|
|
137
|
-
let cleanTitle = title.replace(/^R\d+:\s*/, '').trim();
|
|
138
|
-
|
|
139
|
-
// Take first few words (up to 3-4 words, max 30 chars)
|
|
140
|
-
const words = cleanTitle.split(/\s+/);
|
|
141
|
-
let branchSuffix = '';
|
|
142
|
-
|
|
143
|
-
for (const word of words) {
|
|
144
|
-
const candidate = branchSuffix ? `${branchSuffix}_${word}` : word;
|
|
145
|
-
if (candidate.length > 30) break;
|
|
146
|
-
branchSuffix = candidate;
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
// Clean up branch suffix: lowercase, remove special chars
|
|
150
|
-
branchSuffix = branchSuffix
|
|
151
|
-
.toLowerCase()
|
|
152
|
-
.replace(/[^a-z0-9]+/g, '_')
|
|
153
|
-
.replace(/^_+|_+$/g, '');
|
|
154
|
-
|
|
155
|
-
return branchSuffix ? `R${reqNumber}_${branchSuffix}` : `R${reqNumber}`;
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
module.exports = {
|
|
159
|
-
getNextRequirementNumber,
|
|
160
|
-
setLastRequirementNumber,
|
|
161
|
-
extractRequirementNumber,
|
|
162
|
-
numberAllRequirements,
|
|
163
|
-
createBranchName
|
|
164
|
-
};
|
|
1
|
+
const fs = require('fs-extra');
|
|
2
|
+
const path = require('path');
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Get metadata file path for storing requirement counter
|
|
6
|
+
* @param {string} repoPath - Path to repository
|
|
7
|
+
* @returns {string} Path to metadata file
|
|
8
|
+
*/
|
|
9
|
+
function getMetadataPath(repoPath) {
|
|
10
|
+
return path.join(repoPath, '.vibecodingmachine', 'requirement-metadata.json');
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Get the next requirement number for this repository
|
|
15
|
+
* @param {string} repoPath - Path to repository
|
|
16
|
+
* @returns {Promise<number>} Next requirement number
|
|
17
|
+
*/
|
|
18
|
+
async function getNextRequirementNumber(repoPath) {
|
|
19
|
+
const metadataPath = getMetadataPath(repoPath);
|
|
20
|
+
|
|
21
|
+
try {
|
|
22
|
+
await fs.ensureFile(metadataPath);
|
|
23
|
+
const metadata = await fs.readJson(metadataPath).catch(() => ({ lastRequirementNumber: 0 }));
|
|
24
|
+
|
|
25
|
+
const nextNumber = (metadata.lastRequirementNumber || 0) + 1;
|
|
26
|
+
|
|
27
|
+
// Save the incremented number
|
|
28
|
+
metadata.lastRequirementNumber = nextNumber;
|
|
29
|
+
await fs.writeJson(metadataPath, metadata, { spaces: 2 });
|
|
30
|
+
|
|
31
|
+
return nextNumber;
|
|
32
|
+
} catch (error) {
|
|
33
|
+
// Default to 1 if there's any error
|
|
34
|
+
console.error('Error getting next requirement number:', error.message);
|
|
35
|
+
return 1;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Set the last requirement number (used during initialization)
|
|
41
|
+
* @param {string} repoPath - Path to repository
|
|
42
|
+
* @param {number} lastNumber - Last requirement number
|
|
43
|
+
*/
|
|
44
|
+
async function setLastRequirementNumber(repoPath, lastNumber) {
|
|
45
|
+
const metadataPath = getMetadataPath(repoPath);
|
|
46
|
+
|
|
47
|
+
await fs.ensureFile(metadataPath);
|
|
48
|
+
const metadata = await fs.readJson(metadataPath).catch(() => ({}));
|
|
49
|
+
metadata.lastRequirementNumber = lastNumber;
|
|
50
|
+
await fs.writeJson(metadataPath, metadata, { spaces: 2 });
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Extract requirement number from requirement title
|
|
55
|
+
* @param {string} title - Requirement title
|
|
56
|
+
* @returns {number|null} Requirement number or null if not found
|
|
57
|
+
*/
|
|
58
|
+
function extractRequirementNumber(title) {
|
|
59
|
+
const match = title.match(/^R(\d+):/);
|
|
60
|
+
return match ? parseInt(match[1], 10) : null;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Number all existing requirements in a requirements file
|
|
65
|
+
* @param {string} reqPath - Path to requirements file
|
|
66
|
+
* @param {string} repoPath - Path to repository
|
|
67
|
+
* @returns {Promise<number>} Number of requirements numbered
|
|
68
|
+
*/
|
|
69
|
+
async function numberAllRequirements(reqPath, repoPath) {
|
|
70
|
+
if (!await fs.pathExists(reqPath)) {
|
|
71
|
+
return 0;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const content = await fs.readFile(reqPath, 'utf8');
|
|
75
|
+
const lines = content.split('\n');
|
|
76
|
+
const newLines = [];
|
|
77
|
+
|
|
78
|
+
let requirementCount = 0;
|
|
79
|
+
let maxExistingNumber = 0;
|
|
80
|
+
|
|
81
|
+
// First pass: collect existing numbers and count requirements
|
|
82
|
+
for (const line of lines) {
|
|
83
|
+
if (line.trim().startsWith('###')) {
|
|
84
|
+
const title = line.trim().substring(3).trim();
|
|
85
|
+
const existingNumber = extractRequirementNumber(title);
|
|
86
|
+
|
|
87
|
+
if (existingNumber) {
|
|
88
|
+
maxExistingNumber = Math.max(maxExistingNumber, existingNumber);
|
|
89
|
+
} else {
|
|
90
|
+
// This requirement needs numbering
|
|
91
|
+
requirementCount++;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// Start numbering from max existing + 1
|
|
97
|
+
let currentNumber = maxExistingNumber + 1;
|
|
98
|
+
let numbered = 0;
|
|
99
|
+
|
|
100
|
+
// Second pass: add numbers to requirements that don't have them
|
|
101
|
+
for (const line of lines) {
|
|
102
|
+
if (line.trim().startsWith('###')) {
|
|
103
|
+
const title = line.trim().substring(3).trim();
|
|
104
|
+
const existingNumber = extractRequirementNumber(title);
|
|
105
|
+
|
|
106
|
+
if (!existingNumber) {
|
|
107
|
+
// Add number to this requirement
|
|
108
|
+
newLines.push(`### R${currentNumber}: ${title}`);
|
|
109
|
+
currentNumber++;
|
|
110
|
+
numbered++;
|
|
111
|
+
} else {
|
|
112
|
+
// Keep existing numbered requirement as-is
|
|
113
|
+
newLines.push(line);
|
|
114
|
+
}
|
|
115
|
+
} else {
|
|
116
|
+
newLines.push(line);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// Save the updated file
|
|
121
|
+
await fs.writeFile(reqPath, newLines.join('\n'));
|
|
122
|
+
|
|
123
|
+
// Update metadata with the highest number used
|
|
124
|
+
await setLastRequirementNumber(repoPath, currentNumber - 1);
|
|
125
|
+
|
|
126
|
+
return numbered;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Create a git branch name from requirement number and title
|
|
131
|
+
* @param {number} reqNumber - Requirement number
|
|
132
|
+
* @param {string} title - Requirement title
|
|
133
|
+
* @returns {string} Branch name (e.g., "R1_email_system")
|
|
134
|
+
*/
|
|
135
|
+
function createBranchName(reqNumber, title) {
|
|
136
|
+
// Remove requirement number from title if present
|
|
137
|
+
let cleanTitle = title.replace(/^R\d+:\s*/, '').trim();
|
|
138
|
+
|
|
139
|
+
// Take first few words (up to 3-4 words, max 30 chars)
|
|
140
|
+
const words = cleanTitle.split(/\s+/);
|
|
141
|
+
let branchSuffix = '';
|
|
142
|
+
|
|
143
|
+
for (const word of words) {
|
|
144
|
+
const candidate = branchSuffix ? `${branchSuffix}_${word}` : word;
|
|
145
|
+
if (candidate.length > 30) break;
|
|
146
|
+
branchSuffix = candidate;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// Clean up branch suffix: lowercase, remove special chars
|
|
150
|
+
branchSuffix = branchSuffix
|
|
151
|
+
.toLowerCase()
|
|
152
|
+
.replace(/[^a-z0-9]+/g, '_')
|
|
153
|
+
.replace(/^_+|_+$/g, '');
|
|
154
|
+
|
|
155
|
+
return branchSuffix ? `R${reqNumber}_${branchSuffix}` : `R${reqNumber}`;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
module.exports = {
|
|
159
|
+
getNextRequirementNumber,
|
|
160
|
+
setLastRequirementNumber,
|
|
161
|
+
extractRequirementNumber,
|
|
162
|
+
numberAllRequirements,
|
|
163
|
+
createBranchName
|
|
164
|
+
};
|