@prductr/carlos 1.0.0

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.
@@ -0,0 +1,417 @@
1
+ /**
2
+ * Technical - Technical debt audit and infrastructure assessment
3
+ * Evaluates code quality, architecture, testing, and security
4
+ */
5
+ import { readFileSync, existsSync, readdirSync, statSync, writeFileSync, mkdirSync } from "fs";
6
+ import { join } from "path";
7
+ /**
8
+ * Perform technical audit
9
+ *
10
+ * @param config - Carlos configuration
11
+ * @returns Technical audit with scores and debt items
12
+ */
13
+ export async function auditTechnical(config) {
14
+ console.log("🔍 Performing technical audit...");
15
+ // Collect debt items
16
+ const debtItems = [];
17
+ // Audit different areas
18
+ debtItems.push(...auditCodeQuality(config));
19
+ debtItems.push(...auditArchitecture(config));
20
+ debtItems.push(...auditTesting(config));
21
+ debtItems.push(...auditDependencies(config));
22
+ debtItems.push(...auditSecurity(config));
23
+ debtItems.push(...auditDocumentation(config));
24
+ // Calculate scores
25
+ const codeQualityScore = calculateCodeQualityScore(config, debtItems);
26
+ const architectureScore = calculateArchitectureScore(config, debtItems);
27
+ const testCoverageScore = calculateTestCoverageScore(config, debtItems);
28
+ const securityScore = calculateSecurityScore(config, debtItems);
29
+ const overallHealth = Math.round((codeQualityScore + architectureScore + testCoverageScore + securityScore) /
30
+ 4);
31
+ const recommendations = generateTechnicalRecommendations(debtItems, overallHealth);
32
+ const prioritizedActions = prioritizeActions(debtItems);
33
+ const audit = {
34
+ overallHealth,
35
+ debtItems,
36
+ architectureScore,
37
+ codeQualityScore,
38
+ testCoverageScore,
39
+ securityScore,
40
+ recommendations,
41
+ prioritizedActions,
42
+ };
43
+ // Write audit file
44
+ writeTechnicalAuditFile(config, audit);
45
+ return audit;
46
+ }
47
+ /**
48
+ * Audit code quality
49
+ */
50
+ function auditCodeQuality(config) {
51
+ const items = [];
52
+ // Check for linter config
53
+ const linterConfigs = [".eslintrc", ".eslintrc.json", "eslint.config.js"];
54
+ const hasLinter = linterConfigs.some((f) => existsSync(join(config.projectRoot, f)));
55
+ if (!hasLinter) {
56
+ items.push({
57
+ id: "debt-001",
58
+ category: "code-quality",
59
+ severity: "medium",
60
+ description: "No linter configuration found",
61
+ impact: "Inconsistent code style and potential bugs",
62
+ effort: "1-2 days",
63
+ recommendation: "Add ESLint with recommended config",
64
+ });
65
+ }
66
+ // Check for formatter
67
+ const hasFormatter = existsSync(join(config.projectRoot, ".prettierrc")) ||
68
+ existsSync(join(config.projectRoot, "prettier.config.js"));
69
+ if (!hasFormatter) {
70
+ items.push({
71
+ id: "debt-002",
72
+ category: "code-quality",
73
+ severity: "low",
74
+ description: "No code formatter configured",
75
+ impact: "Inconsistent code formatting",
76
+ effort: "1 day",
77
+ recommendation: "Add Prettier for automatic formatting",
78
+ });
79
+ }
80
+ return items;
81
+ }
82
+ /**
83
+ * Audit architecture
84
+ */
85
+ function auditArchitecture(config) {
86
+ const items = [];
87
+ // Check for TypeScript
88
+ const hasTypeScript = existsSync(join(config.projectRoot, "tsconfig.json"));
89
+ if (!hasTypeScript) {
90
+ items.push({
91
+ id: "debt-003",
92
+ category: "architecture",
93
+ severity: "high",
94
+ description: "Project not using TypeScript",
95
+ impact: "Lack of type safety increases bug risk",
96
+ effort: "2-4 weeks",
97
+ recommendation: "Migrate to TypeScript for better type safety",
98
+ });
99
+ }
100
+ // Check for monorepo
101
+ const isMonorepo = existsSync(join(config.projectRoot, "turbo.json")) ||
102
+ existsSync(join(config.projectRoot, "pnpm-workspace.yaml"));
103
+ if (!isMonorepo && existsSync(join(config.projectRoot, "packages"))) {
104
+ items.push({
105
+ id: "debt-004",
106
+ category: "architecture",
107
+ severity: "medium",
108
+ description: "Monorepo structure without build orchestration",
109
+ impact: "Inefficient builds and dependency management",
110
+ effort: "1 week",
111
+ recommendation: "Add Turborepo for build orchestration",
112
+ });
113
+ }
114
+ return items;
115
+ }
116
+ /**
117
+ * Audit testing
118
+ */
119
+ function auditTesting(config) {
120
+ const items = [];
121
+ // Check for test framework
122
+ const pkgPath = join(config.projectRoot, "package.json");
123
+ let hasTests = false;
124
+ if (existsSync(pkgPath)) {
125
+ try {
126
+ const pkg = JSON.parse(readFileSync(pkgPath, "utf8"));
127
+ const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };
128
+ hasTests = Boolean(allDeps.vitest || allDeps.jest || allDeps.mocha || allDeps.ava);
129
+ }
130
+ catch {
131
+ // malformed package.json — treat as no test framework
132
+ }
133
+ }
134
+ if (!hasTests) {
135
+ items.push({
136
+ id: "debt-005",
137
+ category: "testing",
138
+ severity: "critical",
139
+ description: "No testing framework configured",
140
+ impact: "No automated testing - high bug risk",
141
+ effort: "1-2 weeks",
142
+ recommendation: "Add Vitest or Jest for comprehensive testing",
143
+ });
144
+ }
145
+ // Check for test files
146
+ const hasTestFiles = findTestFiles(config.projectRoot).length > 0;
147
+ if (hasTests && !hasTestFiles) {
148
+ items.push({
149
+ id: "debt-006",
150
+ category: "testing",
151
+ severity: "high",
152
+ description: "Test framework present but no test files",
153
+ impact: "Zero test coverage",
154
+ effort: "2-4 weeks",
155
+ recommendation: "Write tests for critical functionality",
156
+ });
157
+ }
158
+ return items;
159
+ }
160
+ /**
161
+ * Find test files in project
162
+ */
163
+ function findTestFiles(dir) {
164
+ const testFiles = [];
165
+ const excludeDirs = ["node_modules", "dist", ".next", ".git"];
166
+ try {
167
+ const entries = readdirSync(dir);
168
+ for (const entry of entries) {
169
+ if (excludeDirs.includes(entry))
170
+ continue;
171
+ const fullPath = join(dir, entry);
172
+ const stat = statSync(fullPath);
173
+ if (stat.isDirectory()) {
174
+ testFiles.push(...findTestFiles(fullPath));
175
+ }
176
+ else if (entry.includes(".test.") ||
177
+ entry.includes(".spec.") ||
178
+ entry.endsWith("_test.ts") ||
179
+ entry.endsWith("_test.js")) {
180
+ testFiles.push(fullPath);
181
+ }
182
+ }
183
+ }
184
+ catch (error) {
185
+ // Ignore permission errors
186
+ }
187
+ return testFiles;
188
+ }
189
+ /**
190
+ * Audit dependencies
191
+ */
192
+ function auditDependencies(config) {
193
+ const items = [];
194
+ const pkgPath = join(config.projectRoot, "package.json");
195
+ if (!existsSync(pkgPath))
196
+ return items;
197
+ let pkg;
198
+ try {
199
+ pkg = JSON.parse(readFileSync(pkgPath, "utf8"));
200
+ }
201
+ catch {
202
+ return items; // malformed package.json — skip dependency audit
203
+ }
204
+ // Check for lock file
205
+ const hasLockFile = existsSync(join(config.projectRoot, "package-lock.json")) ||
206
+ existsSync(join(config.projectRoot, "yarn.lock")) ||
207
+ existsSync(join(config.projectRoot, "pnpm-lock.yaml"));
208
+ if (!hasLockFile) {
209
+ items.push({
210
+ id: "debt-007",
211
+ category: "dependencies",
212
+ severity: "high",
213
+ description: "No package lock file",
214
+ impact: "Inconsistent dependency versions across environments",
215
+ effort: "1 hour",
216
+ recommendation: "Generate and commit lock file",
217
+ });
218
+ }
219
+ return items;
220
+ }
221
+ /**
222
+ * Audit security
223
+ */
224
+ function auditSecurity(config) {
225
+ const items = [];
226
+ // Check for environment file in git
227
+ const gitignorePath = join(config.projectRoot, ".gitignore");
228
+ if (existsSync(gitignorePath)) {
229
+ const gitignore = readFileSync(gitignorePath, "utf8");
230
+ if (!gitignore.includes(".env")) {
231
+ items.push({
232
+ id: "debt-008",
233
+ category: "security",
234
+ severity: "critical",
235
+ description: ".env not in .gitignore",
236
+ impact: "Risk of exposing secrets in version control",
237
+ effort: "5 minutes",
238
+ recommendation: "Add .env* to .gitignore immediately",
239
+ });
240
+ }
241
+ }
242
+ return items;
243
+ }
244
+ /**
245
+ * Audit documentation
246
+ */
247
+ function auditDocumentation(config) {
248
+ const items = [];
249
+ // Check for README
250
+ const hasREADME = existsSync(join(config.projectRoot, "README.md"));
251
+ if (!hasREADME) {
252
+ items.push({
253
+ id: "debt-009",
254
+ category: "documentation",
255
+ severity: "medium",
256
+ description: "No README.md file",
257
+ impact: "Difficult for new contributors to get started",
258
+ effort: "1 day",
259
+ recommendation: "Create comprehensive README with setup instructions",
260
+ });
261
+ }
262
+ return items;
263
+ }
264
+ /**
265
+ * Calculate code quality score
266
+ */
267
+ function calculateCodeQualityScore(config, debtItems) {
268
+ let score = 100;
269
+ const qualityIssues = debtItems.filter((d) => d.category === "code-quality");
270
+ for (const issue of qualityIssues) {
271
+ if (issue.severity === "critical")
272
+ score -= 30;
273
+ else if (issue.severity === "high")
274
+ score -= 20;
275
+ else if (issue.severity === "medium")
276
+ score -= 10;
277
+ else
278
+ score -= 5;
279
+ }
280
+ return Math.max(score, 0);
281
+ }
282
+ /**
283
+ * Calculate architecture score
284
+ */
285
+ function calculateArchitectureScore(config, debtItems) {
286
+ let score = 100;
287
+ const archIssues = debtItems.filter((d) => d.category === "architecture");
288
+ for (const issue of archIssues) {
289
+ if (issue.severity === "critical")
290
+ score -= 30;
291
+ else if (issue.severity === "high")
292
+ score -= 20;
293
+ else if (issue.severity === "medium")
294
+ score -= 10;
295
+ else
296
+ score -= 5;
297
+ }
298
+ return Math.max(score, 0);
299
+ }
300
+ /**
301
+ * Calculate test coverage score
302
+ */
303
+ function calculateTestCoverageScore(config, debtItems) {
304
+ let score = 100;
305
+ const testIssues = debtItems.filter((d) => d.category === "testing");
306
+ for (const issue of testIssues) {
307
+ if (issue.severity === "critical")
308
+ score -= 40;
309
+ else if (issue.severity === "high")
310
+ score -= 25;
311
+ else if (issue.severity === "medium")
312
+ score -= 15;
313
+ else
314
+ score -= 5;
315
+ }
316
+ return Math.max(score, 0);
317
+ }
318
+ /**
319
+ * Calculate security score
320
+ */
321
+ function calculateSecurityScore(config, debtItems) {
322
+ let score = 100;
323
+ const securityIssues = debtItems.filter((d) => d.category === "security");
324
+ for (const issue of securityIssues) {
325
+ if (issue.severity === "critical")
326
+ score -= 50;
327
+ else if (issue.severity === "high")
328
+ score -= 30;
329
+ else if (issue.severity === "medium")
330
+ score -= 15;
331
+ else
332
+ score -= 5;
333
+ }
334
+ return Math.max(score, 0);
335
+ }
336
+ /**
337
+ * Generate recommendations
338
+ */
339
+ function generateTechnicalRecommendations(debtItems, overallHealth) {
340
+ const recommendations = [];
341
+ if (overallHealth < 50) {
342
+ recommendations.push("🚨 Critical: Address technical debt before adding new features");
343
+ }
344
+ const criticalItems = debtItems.filter((d) => d.severity === "critical");
345
+ if (criticalItems.length > 0) {
346
+ recommendations.push(`Immediately address ${criticalItems.length} critical technical debt items`);
347
+ }
348
+ const testingIssues = debtItems.filter((d) => d.category === "testing");
349
+ if (testingIssues.length > 0) {
350
+ recommendations.push("Prioritize testing infrastructure - foundation for quality");
351
+ }
352
+ if (overallHealth >= 80) {
353
+ recommendations.push("✅ Strong technical foundation - maintain quality as you scale");
354
+ }
355
+ return recommendations;
356
+ }
357
+ /**
358
+ * Prioritize actions
359
+ */
360
+ function prioritizeActions(debtItems) {
361
+ // Sort by severity: critical > high > medium > low
362
+ const severityOrder = { critical: 0, high: 1, medium: 2, low: 3 };
363
+ const sorted = [...debtItems].sort((a, b) => severityOrder[a.severity] - severityOrder[b.severity]);
364
+ return sorted.slice(0, 5).map((item) => item.recommendation);
365
+ }
366
+ /**
367
+ * Write technical audit file
368
+ */
369
+ function writeTechnicalAuditFile(config, audit) {
370
+ const outputDir = join(config.projectRoot, config.outputDir);
371
+ if (!existsSync(outputDir)) {
372
+ mkdirSync(outputDir, { recursive: true });
373
+ }
374
+ const outputPath = join(outputDir, "TECHNICAL_AUDIT.md");
375
+ const content = `# Technical Audit Report
376
+
377
+ ## Overall Health Score
378
+ **${audit.overallHealth}/100** ${audit.overallHealth >= 80 ? "🟢" : audit.overallHealth >= 50 ? "🟡" : "🔴"}
379
+
380
+ ## Category Scores
381
+
382
+ | Category | Score | Status |
383
+ |----------|-------|--------|
384
+ | Code Quality | ${audit.codeQualityScore}/100 | ${audit.codeQualityScore >= 70 ? "✅" : "⚠️"} |
385
+ | Architecture | ${audit.architectureScore}/100 | ${audit.architectureScore >= 70 ? "✅" : "⚠️"} |
386
+ | Test Coverage | ${audit.testCoverageScore}/100 | ${audit.testCoverageScore >= 70 ? "✅" : "⚠️"} |
387
+ | Security | ${audit.securityScore}/100 | ${audit.securityScore >= 70 ? "✅" : "⚠️"} |
388
+
389
+ ## Technical Debt Items (${audit.debtItems.length})
390
+
391
+ ${audit.debtItems
392
+ .map((item) => `### ${item.id}: ${item.description}
393
+ **Category:** ${item.category} | **Severity:** ${item.severity}
394
+
395
+ **Impact:** ${item.impact}
396
+
397
+ **Effort:** ${item.effort}
398
+
399
+ **Recommendation:** ${item.recommendation}
400
+ `)
401
+ .join("\n")}
402
+
403
+ ## Recommendations
404
+
405
+ ${audit.recommendations.map((r, i) => `${i + 1}. ${r}`).join("\n")}
406
+
407
+ ## Prioritized Actions
408
+
409
+ ${audit.prioritizedActions.map((a, i) => `${i + 1}. ${a}`).join("\n")}
410
+
411
+ ---
412
+ Generated: ${new Date().toISOString()}
413
+ `;
414
+ writeFileSync(outputPath, content);
415
+ console.log(`✅ Wrote technical audit to ${outputPath}`);
416
+ }
417
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/technical/index.ts"],"names":[],"mappings":"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"}