@thanhvn14/csvibe 0.1.0 ā 0.1.2
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/.csvibe/state/approaches.json +1 -0
- package/README.md +142 -3
- package/dist/commands/brainstorm.d.ts +16 -0
- package/dist/commands/brainstorm.d.ts.map +1 -0
- package/dist/commands/brainstorm.js +186 -0
- package/dist/commands/brainstorm.js.map +1 -0
- package/dist/commands/doctor.d.ts +9 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +72 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/help.d.ts.map +1 -1
- package/dist/commands/help.js +13 -7
- package/dist/commands/help.js.map +1 -1
- package/dist/commands/index.d.ts +3 -0
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +7 -1
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/init/index.d.ts +7 -0
- package/dist/commands/init/index.d.ts.map +1 -0
- package/dist/commands/init/index.js +10 -0
- package/dist/commands/init/index.js.map +1 -0
- package/dist/commands/init/init-command.d.ts +10 -0
- package/dist/commands/init/init-command.d.ts.map +1 -0
- package/dist/commands/init/init-command.js +75 -0
- package/dist/commands/init/init-command.js.map +1 -0
- package/dist/commands/init/phases/config-handler.d.ts +10 -0
- package/dist/commands/init/phases/config-handler.d.ts.map +1 -0
- package/dist/commands/init/phases/config-handler.js +21 -0
- package/dist/commands/init/phases/config-handler.js.map +1 -0
- package/dist/commands/init/phases/detection-handler.d.ts +10 -0
- package/dist/commands/init/phases/detection-handler.d.ts.map +1 -0
- package/dist/commands/init/phases/detection-handler.js +80 -0
- package/dist/commands/init/phases/detection-handler.js.map +1 -0
- package/dist/commands/init/phases/download-handler.d.ts +9 -0
- package/dist/commands/init/phases/download-handler.d.ts.map +1 -0
- package/dist/commands/init/phases/download-handler.js +16 -0
- package/dist/commands/init/phases/download-handler.js.map +1 -0
- package/dist/commands/init/phases/prompt-handler.d.ts +10 -0
- package/dist/commands/init/phases/prompt-handler.d.ts.map +1 -0
- package/dist/commands/init/phases/prompt-handler.js +24 -0
- package/dist/commands/init/phases/prompt-handler.js.map +1 -0
- package/dist/commands/init/phases/scaffold-handler.d.ts +9 -0
- package/dist/commands/init/phases/scaffold-handler.d.ts.map +1 -0
- package/dist/commands/init/phases/scaffold-handler.js +18 -0
- package/dist/commands/init/phases/scaffold-handler.js.map +1 -0
- package/dist/commands/init/phases/validation-handler.d.ts +14 -0
- package/dist/commands/init/phases/validation-handler.d.ts.map +1 -0
- package/dist/commands/init/phases/validation-handler.js +50 -0
- package/dist/commands/init/phases/validation-handler.js.map +1 -0
- package/dist/commands/init/phases/vscode-handler.d.ts +9 -0
- package/dist/commands/init/phases/vscode-handler.d.ts.map +1 -0
- package/dist/commands/init/phases/vscode-handler.js +16 -0
- package/dist/commands/init/phases/vscode-handler.js.map +1 -0
- package/dist/commands/init/types.d.ts +28 -0
- package/dist/commands/init/types.d.ts.map +1 -0
- package/dist/commands/init/types.js +6 -0
- package/dist/commands/init/types.js.map +1 -0
- package/dist/commands/scout.d.ts +30 -0
- package/dist/commands/scout.d.ts.map +1 -0
- package/dist/commands/scout.js +116 -0
- package/dist/commands/scout.js.map +1 -0
- package/dist/config/constants.d.ts +3 -3
- package/dist/config/constants.js +3 -3
- package/dist/config/constants.js.map +1 -1
- package/dist/domains/config/generator.d.ts +17 -0
- package/dist/domains/config/generator.d.ts.map +1 -0
- package/dist/domains/config/generator.js +67 -0
- package/dist/domains/config/generator.js.map +1 -0
- package/dist/domains/config/index.d.ts +8 -0
- package/dist/domains/config/index.d.ts.map +1 -0
- package/dist/domains/config/index.js +15 -0
- package/dist/domains/config/index.js.map +1 -0
- package/dist/domains/config/types.d.ts +39 -0
- package/dist/domains/config/types.d.ts.map +1 -0
- package/dist/domains/config/types.js +6 -0
- package/dist/domains/config/types.js.map +1 -0
- package/dist/domains/config/validator.d.ts +17 -0
- package/dist/domains/config/validator.d.ts.map +1 -0
- package/dist/domains/config/validator.js +54 -0
- package/dist/domains/config/validator.js.map +1 -0
- package/dist/domains/github/auth-api.d.ts +19 -0
- package/dist/domains/github/auth-api.d.ts.map +1 -0
- package/dist/domains/github/auth-api.js +196 -0
- package/dist/domains/github/auth-api.js.map +1 -0
- package/dist/domains/github/github-client.d.ts +323 -0
- package/dist/domains/github/github-client.d.ts.map +1 -0
- package/dist/domains/github/github-client.js +192 -0
- package/dist/domains/github/github-client.js.map +1 -0
- package/dist/domains/github/index.d.ts +9 -0
- package/dist/domains/github/index.d.ts.map +1 -0
- package/dist/domains/github/index.js +23 -0
- package/dist/domains/github/index.js.map +1 -0
- package/dist/domains/github/keychain.d.ts +19 -0
- package/dist/domains/github/keychain.d.ts.map +1 -0
- package/dist/domains/github/keychain.js +132 -0
- package/dist/domains/github/keychain.js.map +1 -0
- package/dist/domains/github/types.d.ts +40 -0
- package/dist/domains/github/types.d.ts.map +1 -0
- package/dist/domains/github/types.js +6 -0
- package/dist/domains/github/types.js.map +1 -0
- package/dist/domains/health-checks/auto-healer.d.ts +14 -0
- package/dist/domains/health-checks/auto-healer.d.ts.map +1 -0
- package/dist/domains/health-checks/auto-healer.js +160 -0
- package/dist/domains/health-checks/auto-healer.js.map +1 -0
- package/dist/domains/health-checks/check-runner.d.ts +10 -0
- package/dist/domains/health-checks/check-runner.d.ts.map +1 -0
- package/dist/domains/health-checks/check-runner.js +31 -0
- package/dist/domains/health-checks/check-runner.js.map +1 -0
- package/dist/domains/health-checks/checkers/auth-checker.d.ts +10 -0
- package/dist/domains/health-checks/checkers/auth-checker.d.ts.map +1 -0
- package/dist/domains/health-checks/checkers/auth-checker.js +90 -0
- package/dist/domains/health-checks/checkers/auth-checker.js.map +1 -0
- package/dist/domains/health-checks/checkers/deps-checker.d.ts +10 -0
- package/dist/domains/health-checks/checkers/deps-checker.d.ts.map +1 -0
- package/dist/domains/health-checks/checkers/deps-checker.js +150 -0
- package/dist/domains/health-checks/checkers/deps-checker.js.map +1 -0
- package/dist/domains/health-checks/checkers/project-checker.d.ts +10 -0
- package/dist/domains/health-checks/checkers/project-checker.d.ts.map +1 -0
- package/dist/domains/health-checks/checkers/project-checker.js +124 -0
- package/dist/domains/health-checks/checkers/project-checker.js.map +1 -0
- package/dist/domains/health-checks/checkers/system-checker.d.ts +10 -0
- package/dist/domains/health-checks/checkers/system-checker.d.ts.map +1 -0
- package/dist/domains/health-checks/checkers/system-checker.js +135 -0
- package/dist/domains/health-checks/checkers/system-checker.js.map +1 -0
- package/dist/domains/health-checks/index.d.ts +9 -0
- package/dist/domains/health-checks/index.d.ts.map +1 -0
- package/dist/domains/health-checks/index.js +21 -0
- package/dist/domains/health-checks/index.js.map +1 -0
- package/dist/domains/health-checks/report-generator.d.ts +18 -0
- package/dist/domains/health-checks/report-generator.d.ts.map +1 -0
- package/dist/domains/health-checks/report-generator.js +117 -0
- package/dist/domains/health-checks/report-generator.js.map +1 -0
- package/dist/domains/health-checks/types.d.ts +35 -0
- package/dist/domains/health-checks/types.d.ts.map +1 -0
- package/dist/domains/health-checks/types.js +6 -0
- package/dist/domains/health-checks/types.js.map +1 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -1
- package/dist/utils/approaches-validator.d.ts +40 -0
- package/dist/utils/approaches-validator.d.ts.map +1 -0
- package/dist/utils/approaches-validator.js +101 -0
- package/dist/utils/approaches-validator.js.map +1 -0
- package/dist/utils/dependency-analyzer.d.ts +31 -0
- package/dist/utils/dependency-analyzer.d.ts.map +1 -0
- package/dist/utils/dependency-analyzer.js +294 -0
- package/dist/utils/dependency-analyzer.js.map +1 -0
- package/dist/utils/directory-analyzer.d.ts +23 -0
- package/dist/utils/directory-analyzer.d.ts.map +1 -0
- package/dist/utils/directory-analyzer.js +81 -0
- package/dist/utils/directory-analyzer.js.map +1 -0
- package/dist/utils/downloader.d.ts +3 -3
- package/dist/utils/downloader.d.ts.map +1 -1
- package/dist/utils/downloader.js +35 -65
- package/dist/utils/downloader.js.map +1 -1
- package/dist/utils/errors.d.ts +64 -10
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +136 -22
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/gh-cli.d.ts +4 -2
- package/dist/utils/gh-cli.d.ts.map +1 -1
- package/dist/utils/gh-cli.js +33 -38
- package/dist/utils/gh-cli.js.map +1 -1
- package/dist/utils/progress.d.ts +37 -0
- package/dist/utils/progress.d.ts.map +1 -0
- package/dist/utils/progress.js +121 -0
- package/dist/utils/progress.js.map +1 -0
- package/dist/utils/prompts.d.ts +5 -1
- package/dist/utils/prompts.d.ts.map +1 -1
- package/dist/utils/prompts.js +124 -64
- package/dist/utils/prompts.js.map +1 -1
- package/package.json +7 -3
- package/test-jira-prompt.js +32 -0
- package/dist/commands/init.d.ts +0 -6
- package/dist/commands/init.d.ts.map +0 -1
- package/dist/commands/init.js +0 -147
- package/dist/commands/init.js.map +0 -1
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* GitHub client with @octokit/rest integration
|
|
4
|
+
* Includes retry logic, rate limit handling, and progress tracking
|
|
5
|
+
*/
|
|
6
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
|
+
};
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.GitHubClient = void 0;
|
|
11
|
+
const rest_1 = require("@octokit/rest");
|
|
12
|
+
const p_retry_1 = __importDefault(require("p-retry"));
|
|
13
|
+
const auth_api_1 = require("./auth-api");
|
|
14
|
+
const errors_1 = require("../../utils/errors");
|
|
15
|
+
/**
|
|
16
|
+
* GitHub client wrapper with resilience patterns
|
|
17
|
+
*/
|
|
18
|
+
class GitHubClient {
|
|
19
|
+
constructor(token) {
|
|
20
|
+
this.token = token;
|
|
21
|
+
this.octokit = new rest_1.Octokit({
|
|
22
|
+
auth: token,
|
|
23
|
+
userAgent: 'csvibe-cli',
|
|
24
|
+
request: {
|
|
25
|
+
timeout: 30000,
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Create authenticated GitHub client
|
|
31
|
+
*/
|
|
32
|
+
static async create() {
|
|
33
|
+
const { token } = await (0, auth_api_1.getGitHubToken)();
|
|
34
|
+
return new GitHubClient(token);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Get current rate limit information
|
|
38
|
+
*/
|
|
39
|
+
async getRateLimit() {
|
|
40
|
+
return (0, p_retry_1.default)(async () => {
|
|
41
|
+
const { data } = await this.octokit.rateLimit.get();
|
|
42
|
+
return {
|
|
43
|
+
limit: data.rate.limit,
|
|
44
|
+
remaining: data.rate.remaining,
|
|
45
|
+
reset: new Date(data.rate.reset * 1000),
|
|
46
|
+
used: data.rate.used,
|
|
47
|
+
};
|
|
48
|
+
}, {
|
|
49
|
+
retries: 2,
|
|
50
|
+
onFailedAttempt: (error) => {
|
|
51
|
+
console.warn(`Rate limit check attempt ${error.attemptNumber} failed`);
|
|
52
|
+
},
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Download file content from repository
|
|
57
|
+
*/
|
|
58
|
+
async downloadFile(owner, repo, path, ref = 'main') {
|
|
59
|
+
return (0, p_retry_1.default)(async () => {
|
|
60
|
+
try {
|
|
61
|
+
const { data } = await this.octokit.repos.getContent({
|
|
62
|
+
owner,
|
|
63
|
+
repo,
|
|
64
|
+
path,
|
|
65
|
+
ref,
|
|
66
|
+
});
|
|
67
|
+
// Handle file content (not directory)
|
|
68
|
+
if ('content' in data && data.type === 'file') {
|
|
69
|
+
return Buffer.from(data.content, 'base64');
|
|
70
|
+
}
|
|
71
|
+
throw new errors_1.NetworkError(`Path ${path} is not a file`);
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
if (error.status === 404) {
|
|
75
|
+
throw new errors_1.NetworkError(`File not found: ${path}`);
|
|
76
|
+
}
|
|
77
|
+
if (error.status === 403) {
|
|
78
|
+
// Rate limit exceeded
|
|
79
|
+
const resetTime = new Date(error.response.headers['x-ratelimit-reset'] * 1000);
|
|
80
|
+
throw new errors_1.NetworkError(`Rate limit exceeded. Resets at ${resetTime.toLocaleTimeString()}`);
|
|
81
|
+
}
|
|
82
|
+
throw error;
|
|
83
|
+
}
|
|
84
|
+
}, {
|
|
85
|
+
retries: 3,
|
|
86
|
+
onFailedAttempt: (error) => {
|
|
87
|
+
console.warn(`Download attempt ${error.attemptNumber} failed: ${error.message}`);
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Download directory contents recursively
|
|
93
|
+
*/
|
|
94
|
+
async downloadDirectory(owner, repo, path, ref = 'main') {
|
|
95
|
+
return (0, p_retry_1.default)(async () => {
|
|
96
|
+
const files = [];
|
|
97
|
+
try {
|
|
98
|
+
const { data } = await this.octokit.repos.getContent({
|
|
99
|
+
owner,
|
|
100
|
+
repo,
|
|
101
|
+
path,
|
|
102
|
+
ref,
|
|
103
|
+
});
|
|
104
|
+
// Handle directory
|
|
105
|
+
if (Array.isArray(data)) {
|
|
106
|
+
for (const item of data) {
|
|
107
|
+
if (item.type === 'file' && item.download_url) {
|
|
108
|
+
// Download file
|
|
109
|
+
const content = await this.downloadFile(owner, repo, item.path, ref);
|
|
110
|
+
files.push({ path: item.path, content });
|
|
111
|
+
}
|
|
112
|
+
else if (item.type === 'dir') {
|
|
113
|
+
// Recursively download subdirectory
|
|
114
|
+
const subFiles = await this.downloadDirectory(owner, repo, item.path, ref);
|
|
115
|
+
files.push(...subFiles);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return files;
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
if (error.status === 404) {
|
|
123
|
+
throw new errors_1.NetworkError(`Directory not found: ${path}`);
|
|
124
|
+
}
|
|
125
|
+
throw error;
|
|
126
|
+
}
|
|
127
|
+
}, {
|
|
128
|
+
retries: 3,
|
|
129
|
+
onFailedAttempt: (error) => {
|
|
130
|
+
console.warn(`Directory download attempt ${error.attemptNumber} failed: ${error.message}`);
|
|
131
|
+
},
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Get repository information
|
|
136
|
+
*/
|
|
137
|
+
async getRepository(owner, repo) {
|
|
138
|
+
return (0, p_retry_1.default)(async () => {
|
|
139
|
+
const { data } = await this.octokit.repos.get({
|
|
140
|
+
owner,
|
|
141
|
+
repo,
|
|
142
|
+
});
|
|
143
|
+
return data;
|
|
144
|
+
}, {
|
|
145
|
+
retries: 2,
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* List repository contents at path
|
|
150
|
+
*/
|
|
151
|
+
async listContents(owner, repo, path = '', ref = 'main') {
|
|
152
|
+
return (0, p_retry_1.default)(async () => {
|
|
153
|
+
const { data } = await this.octokit.repos.getContent({
|
|
154
|
+
owner,
|
|
155
|
+
repo,
|
|
156
|
+
path,
|
|
157
|
+
ref,
|
|
158
|
+
});
|
|
159
|
+
if (Array.isArray(data)) {
|
|
160
|
+
return data;
|
|
161
|
+
}
|
|
162
|
+
// Single file, wrap in array
|
|
163
|
+
return [data];
|
|
164
|
+
}, {
|
|
165
|
+
retries: 2,
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Check if authenticated user has access to repository
|
|
170
|
+
*/
|
|
171
|
+
async hasRepoAccess(owner, repo) {
|
|
172
|
+
try {
|
|
173
|
+
await this.octokit.repos.get({ owner, repo });
|
|
174
|
+
return true;
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
if (error.status === 404 || error.status === 403) {
|
|
178
|
+
return false;
|
|
179
|
+
}
|
|
180
|
+
throw error;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Get authenticated user information
|
|
185
|
+
*/
|
|
186
|
+
async getAuthenticatedUser() {
|
|
187
|
+
const { data } = await this.octokit.users.getAuthenticated();
|
|
188
|
+
return data;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
exports.GitHubClient = GitHubClient;
|
|
192
|
+
//# sourceMappingURL=github-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-client.js","sourceRoot":"","sources":["../../../src/domains/github/github-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub domain facade
|
|
3
|
+
* Public API for GitHub authentication and client operations
|
|
4
|
+
*/
|
|
5
|
+
export { getGitHubToken, validateToken, getAuthMethodDescription } from './auth-api';
|
|
6
|
+
export { GitHubClient } from './github-client';
|
|
7
|
+
export { saveTokenToKeychain, readTokenFromKeychain, deleteTokenFromKeychain } from './keychain';
|
|
8
|
+
export type { AuthMethod, GitHubTokenInfo, RateLimitInfo, DownloadOptions } from './types';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/domains/github/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAGrF,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAG/C,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAGjG,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* GitHub domain facade
|
|
4
|
+
* Public API for GitHub authentication and client operations
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.deleteTokenFromKeychain = exports.readTokenFromKeychain = exports.saveTokenToKeychain = exports.GitHubClient = exports.getAuthMethodDescription = exports.validateToken = exports.getGitHubToken = void 0;
|
|
8
|
+
// Authentication
|
|
9
|
+
var auth_api_1 = require("./auth-api");
|
|
10
|
+
Object.defineProperty(exports, "getGitHubToken", { enumerable: true, get: function () { return auth_api_1.getGitHubToken; } });
|
|
11
|
+
Object.defineProperty(exports, "validateToken", { enumerable: true, get: function () { return auth_api_1.validateToken; } });
|
|
12
|
+
Object.defineProperty(exports, "getAuthMethodDescription", { enumerable: true, get: function () { return auth_api_1.getAuthMethodDescription; } });
|
|
13
|
+
// GitHub Client
|
|
14
|
+
var github_client_1 = require("./github-client");
|
|
15
|
+
Object.defineProperty(exports, "GitHubClient", { enumerable: true, get: function () { return github_client_1.GitHubClient; } });
|
|
16
|
+
// Keychain (public methods only)
|
|
17
|
+
var keychain_1 = require("./keychain");
|
|
18
|
+
Object.defineProperty(exports, "saveTokenToKeychain", { enumerable: true, get: function () { return keychain_1.saveTokenToKeychain; } });
|
|
19
|
+
Object.defineProperty(exports, "readTokenFromKeychain", { enumerable: true, get: function () { return keychain_1.readTokenFromKeychain; } });
|
|
20
|
+
Object.defineProperty(exports, "deleteTokenFromKeychain", { enumerable: true, get: function () { return keychain_1.deleteTokenFromKeychain; } });
|
|
21
|
+
// Note: Internal modules (keychain implementation details) are NOT exported
|
|
22
|
+
// This ensures clean separation and prevents coupling to internal implementation
|
|
23
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/domains/github/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,iBAAiB;AACjB,uCAAqF;AAA5E,0GAAA,cAAc,OAAA;AAAE,yGAAA,aAAa,OAAA;AAAE,oHAAA,wBAAwB,OAAA;AAEhE,gBAAgB;AAChB,iDAA+C;AAAtC,6GAAA,YAAY,OAAA;AAErB,iCAAiC;AACjC,uCAAiG;AAAxF,+GAAA,mBAAmB,OAAA;AAAE,iHAAA,qBAAqB,OAAA;AAAE,mHAAA,uBAAuB,OAAA;AAK5E,4EAA4E;AAC5E,iFAAiF"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OS keychain integration for secure token storage
|
|
3
|
+
* Supports macOS Keychain, Windows Credential Manager, Linux Secret Service
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Save token to OS keychain
|
|
7
|
+
* Falls back to encrypted file if keychain unavailable
|
|
8
|
+
*/
|
|
9
|
+
export declare function saveTokenToKeychain(token: string): Promise<void>;
|
|
10
|
+
/**
|
|
11
|
+
* Read token from OS keychain
|
|
12
|
+
* Falls back to file if keychain unavailable
|
|
13
|
+
*/
|
|
14
|
+
export declare function readTokenFromKeychain(): Promise<string | null>;
|
|
15
|
+
/**
|
|
16
|
+
* Delete token from keychain
|
|
17
|
+
*/
|
|
18
|
+
export declare function deleteTokenFromKeychain(): Promise<boolean>;
|
|
19
|
+
//# sourceMappingURL=keychain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keychain.d.ts","sourceRoot":"","sources":["../../../src/domains/github/keychain.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAStE;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAWpE;AAED;;GAEG;AACH,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,OAAO,CAAC,CAgBhE"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* OS keychain integration for secure token storage
|
|
4
|
+
* Supports macOS Keychain, Windows Credential Manager, Linux Secret Service
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
40
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
41
|
+
};
|
|
42
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
43
|
+
exports.saveTokenToKeychain = saveTokenToKeychain;
|
|
44
|
+
exports.readTokenFromKeychain = readTokenFromKeychain;
|
|
45
|
+
exports.deleteTokenFromKeychain = deleteTokenFromKeychain;
|
|
46
|
+
const keytar = __importStar(require("keytar"));
|
|
47
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
48
|
+
const path_1 = __importDefault(require("path"));
|
|
49
|
+
const os_1 = __importDefault(require("os"));
|
|
50
|
+
const SERVICE_NAME = 'csvibe-cli';
|
|
51
|
+
const ACCOUNT_NAME = 'github-token';
|
|
52
|
+
const CONFIG_DIR = path_1.default.join(os_1.default.homedir(), '.csvibe');
|
|
53
|
+
const TOKEN_FILE = path_1.default.join(CONFIG_DIR, '.github-token');
|
|
54
|
+
/**
|
|
55
|
+
* Save token to OS keychain
|
|
56
|
+
* Falls back to encrypted file if keychain unavailable
|
|
57
|
+
*/
|
|
58
|
+
async function saveTokenToKeychain(token) {
|
|
59
|
+
try {
|
|
60
|
+
// Try OS keychain first
|
|
61
|
+
await keytar.setPassword(SERVICE_NAME, ACCOUNT_NAME, token);
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
// Fallback: Save to config file with basic obfuscation
|
|
65
|
+
// Note: This is not secure, just better than plain text
|
|
66
|
+
await saveTokenToFile(token);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Read token from OS keychain
|
|
71
|
+
* Falls back to file if keychain unavailable
|
|
72
|
+
*/
|
|
73
|
+
async function readTokenFromKeychain() {
|
|
74
|
+
try {
|
|
75
|
+
// Try OS keychain first
|
|
76
|
+
const token = await keytar.getPassword(SERVICE_NAME, ACCOUNT_NAME);
|
|
77
|
+
if (token)
|
|
78
|
+
return token;
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
// Keychain not available, try file
|
|
82
|
+
}
|
|
83
|
+
// Fallback: Read from config file
|
|
84
|
+
return await readTokenFromFile();
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Delete token from keychain
|
|
88
|
+
*/
|
|
89
|
+
async function deleteTokenFromKeychain() {
|
|
90
|
+
try {
|
|
91
|
+
// Delete from OS keychain
|
|
92
|
+
await keytar.deletePassword(SERVICE_NAME, ACCOUNT_NAME);
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
// Ignore keychain errors
|
|
96
|
+
}
|
|
97
|
+
// Also delete file if exists
|
|
98
|
+
try {
|
|
99
|
+
await fs_extra_1.default.remove(TOKEN_FILE);
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
// Ignore file errors
|
|
103
|
+
}
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Save token to file with basic obfuscation
|
|
108
|
+
* WARNING: This is not secure, just better than plain text
|
|
109
|
+
*/
|
|
110
|
+
async function saveTokenToFile(token) {
|
|
111
|
+
await fs_extra_1.default.ensureDir(CONFIG_DIR);
|
|
112
|
+
// Simple base64 encoding (NOT encryption, just obfuscation)
|
|
113
|
+
const encoded = Buffer.from(token).toString('base64');
|
|
114
|
+
await fs_extra_1.default.writeFile(TOKEN_FILE, encoded, { mode: 0o600 });
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Read token from file
|
|
118
|
+
*/
|
|
119
|
+
async function readTokenFromFile() {
|
|
120
|
+
try {
|
|
121
|
+
if (!(await fs_extra_1.default.pathExists(TOKEN_FILE))) {
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
const encoded = await fs_extra_1.default.readFile(TOKEN_FILE, 'utf-8');
|
|
125
|
+
const token = Buffer.from(encoded.trim(), 'base64').toString('utf-8');
|
|
126
|
+
return token || null;
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=keychain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keychain.js","sourceRoot":"","sources":["../../../src/domains/github/keychain.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgBH,kDASC;AAMD,sDAWC;AAKD,0DAgBC;AA7DD,+CAAiC;AACjC,wDAA0B;AAC1B,gDAAwB;AACxB,4CAAoB;AAEpB,MAAM,YAAY,GAAG,YAAY,CAAC;AAClC,MAAM,YAAY,GAAG,cAAc,CAAC;AACpC,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;AACtD,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;AAE1D;;;GAGG;AACI,KAAK,UAAU,mBAAmB,CAAC,KAAa;IACrD,IAAI,CAAC;QACH,wBAAwB;QACxB,MAAM,MAAM,CAAC,WAAW,CAAC,YAAY,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;IAC9D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,uDAAuD;QACvD,wDAAwD;QACxD,MAAM,eAAe,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;AACH,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,qBAAqB;IACzC,IAAI,CAAC;QACH,wBAAwB;QACxB,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;QACnE,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,mCAAmC;IACrC,CAAC;IAED,kCAAkC;IAClC,OAAO,MAAM,iBAAiB,EAAE,CAAC;AACnC,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,uBAAuB;IAC3C,IAAI,CAAC;QACH,0BAA0B;QAC1B,MAAM,MAAM,CAAC,cAAc,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;IAC1D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,yBAAyB;IAC3B,CAAC;IAED,6BAA6B;IAC7B,IAAI,CAAC;QACH,MAAM,kBAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAC9B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,qBAAqB;IACvB,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,eAAe,CAAC,KAAa;IAC1C,MAAM,kBAAE,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IAE/B,4DAA4D;IAC5D,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACtD,MAAM,kBAAE,CAAC,SAAS,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AAC3D,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,iBAAiB;IAC9B,IAAI,CAAC;QACH,IAAI,CAAC,CAAC,MAAM,kBAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;YACvC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACvD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAEtE,OAAO,KAAK,IAAI,IAAI,CAAC;IACvB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub domain types and interfaces
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Authentication method used to obtain token
|
|
6
|
+
*/
|
|
7
|
+
export type AuthMethod = 'gh-cli' | 'env-var' | 'config' | 'keychain' | 'prompt';
|
|
8
|
+
/**
|
|
9
|
+
* GitHub token with metadata
|
|
10
|
+
*/
|
|
11
|
+
export interface GitHubTokenInfo {
|
|
12
|
+
token: string;
|
|
13
|
+
method: AuthMethod;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* GitHub API rate limit information
|
|
17
|
+
*/
|
|
18
|
+
export interface RateLimitInfo {
|
|
19
|
+
limit: number;
|
|
20
|
+
remaining: number;
|
|
21
|
+
reset: Date;
|
|
22
|
+
used: number;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Download progress callback
|
|
26
|
+
*/
|
|
27
|
+
export interface DownloadProgress {
|
|
28
|
+
downloaded: number;
|
|
29
|
+
total: number;
|
|
30
|
+
percentage: number;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Download options
|
|
34
|
+
*/
|
|
35
|
+
export interface DownloadOptions {
|
|
36
|
+
onProgress?: (progress: DownloadProgress) => void;
|
|
37
|
+
timeout?: number;
|
|
38
|
+
retries?: number;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/domains/github/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,UAAU,GAAG,QAAQ,CAAC;AAEjF;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,UAAU,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,IAAI,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAClD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/domains/github/types.ts"],"names":[],"mappings":";AAAA;;GAEG"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-fix logic for common issues
|
|
3
|
+
* Attempts to automatically repair fixable health check failures
|
|
4
|
+
*/
|
|
5
|
+
import type { Check, FixResult } from './types';
|
|
6
|
+
/**
|
|
7
|
+
* Attempt to auto-fix a check
|
|
8
|
+
*/
|
|
9
|
+
export declare function autoFix(check: Check): Promise<FixResult>;
|
|
10
|
+
/**
|
|
11
|
+
* Auto-fix multiple issues
|
|
12
|
+
*/
|
|
13
|
+
export declare function autoFixIssues(checks: Check[]): Promise<FixResult[]>;
|
|
14
|
+
//# sourceMappingURL=auto-healer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-healer.d.ts","sourceRoot":"","sources":["../../../src/domains/health-checks/auto-healer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEhD;;GAEG;AACH,wBAAsB,OAAO,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC,CAiC9D;AAuHD;;GAEG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAWzE"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Auto-fix logic for common issues
|
|
4
|
+
* Attempts to automatically repair fixable health check failures
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.autoFix = autoFix;
|
|
8
|
+
exports.autoFixIssues = autoFixIssues;
|
|
9
|
+
const child_process_1 = require("child_process");
|
|
10
|
+
/**
|
|
11
|
+
* Attempt to auto-fix a check
|
|
12
|
+
*/
|
|
13
|
+
async function autoFix(check) {
|
|
14
|
+
if (!check.fixable) {
|
|
15
|
+
return {
|
|
16
|
+
success: false,
|
|
17
|
+
message: 'No auto-fix available for this check',
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
switch (check.name) {
|
|
21
|
+
case 'GitHub CLI Authentication':
|
|
22
|
+
return await fixGitHubAuth();
|
|
23
|
+
case 'node_modules':
|
|
24
|
+
return await fixNodeModules();
|
|
25
|
+
case 'CSVibe Initialization':
|
|
26
|
+
return await fixCSVibeInit();
|
|
27
|
+
case 'Config File':
|
|
28
|
+
return await fixConfigFile();
|
|
29
|
+
case 'Workspace Structure':
|
|
30
|
+
return await fixWorkspaceStructure();
|
|
31
|
+
case 'Lockfile':
|
|
32
|
+
return await fixLockfile();
|
|
33
|
+
default:
|
|
34
|
+
return {
|
|
35
|
+
success: false,
|
|
36
|
+
message: `No auto-fix handler for: ${check.name}`,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Fix GitHub authentication
|
|
42
|
+
*/
|
|
43
|
+
async function fixGitHubAuth() {
|
|
44
|
+
try {
|
|
45
|
+
console.log('\nš§ Attempting to fix GitHub authentication...');
|
|
46
|
+
(0, child_process_1.execSync)('gh auth login', { stdio: 'inherit' });
|
|
47
|
+
return {
|
|
48
|
+
success: true,
|
|
49
|
+
message: 'GitHub authentication fixed',
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
return {
|
|
54
|
+
success: false,
|
|
55
|
+
message: 'Failed to authenticate with GitHub',
|
|
56
|
+
error: error instanceof Error ? error.message : String(error),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Fix missing node_modules
|
|
62
|
+
*/
|
|
63
|
+
async function fixNodeModules() {
|
|
64
|
+
try {
|
|
65
|
+
console.log('\nš§ Installing dependencies...');
|
|
66
|
+
// Detect package manager
|
|
67
|
+
const fs = require('fs-extra');
|
|
68
|
+
const path = require('path');
|
|
69
|
+
let packageManager = 'npm';
|
|
70
|
+
if (await fs.pathExists(path.join(process.cwd(), 'yarn.lock'))) {
|
|
71
|
+
packageManager = 'yarn';
|
|
72
|
+
}
|
|
73
|
+
else if (await fs.pathExists(path.join(process.cwd(), 'pnpm-lock.yaml'))) {
|
|
74
|
+
packageManager = 'pnpm';
|
|
75
|
+
}
|
|
76
|
+
(0, child_process_1.execSync)(`${packageManager} install`, { stdio: 'inherit' });
|
|
77
|
+
return {
|
|
78
|
+
success: true,
|
|
79
|
+
message: `Dependencies installed using ${packageManager}`,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
return {
|
|
84
|
+
success: false,
|
|
85
|
+
message: 'Failed to install dependencies',
|
|
86
|
+
error: error instanceof Error ? error.message : String(error),
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Fix CSVibe initialization
|
|
92
|
+
*/
|
|
93
|
+
async function fixCSVibeInit() {
|
|
94
|
+
return {
|
|
95
|
+
success: false,
|
|
96
|
+
message: 'Please run "csvibe init" manually to initialize project',
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Fix config file
|
|
101
|
+
*/
|
|
102
|
+
async function fixConfigFile() {
|
|
103
|
+
return {
|
|
104
|
+
success: false,
|
|
105
|
+
message: 'Please run "csvibe init" manually to regenerate config',
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Fix workspace structure
|
|
110
|
+
*/
|
|
111
|
+
async function fixWorkspaceStructure() {
|
|
112
|
+
return {
|
|
113
|
+
success: false,
|
|
114
|
+
message: 'Please run "csvibe init" manually to setup workspace',
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Fix lockfile
|
|
119
|
+
*/
|
|
120
|
+
async function fixLockfile() {
|
|
121
|
+
try {
|
|
122
|
+
console.log('\nš§ Syncing lockfile...');
|
|
123
|
+
const fs = require('fs-extra');
|
|
124
|
+
const path = require('path');
|
|
125
|
+
// Detect package manager
|
|
126
|
+
let packageManager = 'npm';
|
|
127
|
+
if (await fs.pathExists(path.join(process.cwd(), 'yarn.lock'))) {
|
|
128
|
+
packageManager = 'yarn';
|
|
129
|
+
}
|
|
130
|
+
else if (await fs.pathExists(path.join(process.cwd(), 'pnpm-lock.yaml'))) {
|
|
131
|
+
packageManager = 'pnpm';
|
|
132
|
+
}
|
|
133
|
+
(0, child_process_1.execSync)(`${packageManager} install`, { stdio: 'inherit' });
|
|
134
|
+
return {
|
|
135
|
+
success: true,
|
|
136
|
+
message: `Lockfile synced using ${packageManager}`,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
return {
|
|
141
|
+
success: false,
|
|
142
|
+
message: 'Failed to sync lockfile',
|
|
143
|
+
error: error instanceof Error ? error.message : String(error),
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Auto-fix multiple issues
|
|
149
|
+
*/
|
|
150
|
+
async function autoFixIssues(checks) {
|
|
151
|
+
const results = [];
|
|
152
|
+
for (const check of checks) {
|
|
153
|
+
if (check.fixable && check.status !== 'pass') {
|
|
154
|
+
const result = await autoFix(check);
|
|
155
|
+
results.push(result);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return results;
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=auto-healer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-healer.js","sourceRoot":"","sources":["../../../src/domains/health-checks/auto-healer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Health check orchestrator
|
|
3
|
+
* Runs all health checks and aggregates results
|
|
4
|
+
*/
|
|
5
|
+
import type { HealthCheckReport } from './types';
|
|
6
|
+
/**
|
|
7
|
+
* Run all health checks
|
|
8
|
+
*/
|
|
9
|
+
export declare function runHealthChecks(): Promise<HealthCheckReport>;
|
|
10
|
+
//# sourceMappingURL=check-runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-runner.d.ts","sourceRoot":"","sources":["../../../src/domains/health-checks/check-runner.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAEjD;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAkBlE"}
|