yuangs 5.40.0 → 5.41.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.
- package/dist/commands/git/plan.js +64 -10
- package/dist/commands/git/plan.js.map +1 -1
- package/dist/commands/git/review.js +95 -2
- package/dist/commands/git/review.js.map +1 -1
- package/dist/core/capability/CapabilityLevel.d.ts +125 -0
- package/dist/core/capability/CapabilityLevel.js +184 -0
- package/dist/core/capability/CapabilityLevel.js.map +1 -0
- package/dist/core/capability/CostProfile.d.ts +34 -0
- package/dist/core/capability/CostProfile.js +138 -0
- package/dist/core/capability/CostProfile.js.map +1 -0
- package/dist/core/capability/DegradationPolicy.d.ts +26 -0
- package/dist/core/capability/DegradationPolicy.js +65 -0
- package/dist/core/capability/DegradationPolicy.js.map +1 -0
- package/dist/core/capability/index.d.ts +3 -0
- package/dist/core/capability/index.js +20 -0
- package/dist/core/capability/index.js.map +1 -0
- package/dist/core/context/ContextMeta.d.ts +30 -0
- package/dist/core/context/ContextMeta.js +108 -0
- package/dist/core/context/ContextMeta.js.map +1 -0
- package/dist/core/context/index.d.ts +1 -0
- package/dist/core/context/index.js +18 -0
- package/dist/core/context/index.js.map +1 -0
- package/dist/core/git/CodeReviewer.d.ts +11 -0
- package/dist/core/git/CodeReviewer.js +76 -8
- package/dist/core/git/CodeReviewer.js.map +1 -1
- package/dist/core/git/ContextGatherer.d.ts +6 -0
- package/dist/core/git/ContextGatherer.js +38 -3
- package/dist/core/git/ContextGatherer.js.map +1 -1
- package/dist/core/git/GitService.d.ts +13 -0
- package/dist/core/git/GitService.js +50 -0
- package/dist/core/git/GitService.js.map +1 -1
- package/dist/core/security/SecurityScanner.d.ts +39 -0
- package/dist/core/security/SecurityScanner.js +136 -0
- package/dist/core/security/SecurityScanner.js.map +1 -0
- package/dist/core/security/index.d.ts +1 -0
- package/dist/core/security/index.js +18 -0
- package/dist/core/security/index.js.map +1 -0
- package/package.json +2 -1
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.defaultSecurityScanner = exports.SecurityScanner = exports.SecurityIssueType = void 0;
|
|
4
|
+
var SecurityIssueType;
|
|
5
|
+
(function (SecurityIssueType) {
|
|
6
|
+
SecurityIssueType["API_KEY"] = "api_key";
|
|
7
|
+
SecurityIssueType["EMAIL"] = "email";
|
|
8
|
+
SecurityIssueType["PHONE"] = "phone";
|
|
9
|
+
SecurityIssueType["TOKEN"] = "token";
|
|
10
|
+
SecurityIssueType["CREDENTIAL"] = "credential";
|
|
11
|
+
SecurityIssueType["SECRET"] = "secret";
|
|
12
|
+
SecurityIssueType["PASSWORD"] = "password";
|
|
13
|
+
})(SecurityIssueType || (exports.SecurityIssueType = SecurityIssueType = {}));
|
|
14
|
+
const DEFAULT_PATTERNS = {
|
|
15
|
+
[SecurityIssueType.API_KEY]: /(?:api[_-]?key|apikey)\s*[:=]\s*['"]?([a-zA-Z0-9_\-]{20,})['"]?/gi,
|
|
16
|
+
[SecurityIssueType.EMAIL]: /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g,
|
|
17
|
+
[SecurityIssueType.PHONE]: /(?:\+?86)?1[3-9]\d{9}/g,
|
|
18
|
+
[SecurityIssueType.TOKEN]: /(?:token|access[_-]?token)\s*[:=]\s*['"]?([a-zA-Z0-9_\-]{20,})['"]?/gi,
|
|
19
|
+
[SecurityIssueType.CREDENTIAL]: /(?:credential|password)\s*[:=]\s*['"]?([a-zA-Z0-9_\-]{8,})['"]?/gi,
|
|
20
|
+
[SecurityIssueType.SECRET]: /(?:secret)\s*[:=]\s*['"]?([a-zA-Z0-9_\-]{20,})['"]?/gi,
|
|
21
|
+
[SecurityIssueType.PASSWORD]: /(?:password)\s*[:=]\s*['"]?([a-zA-Z0-9_\-]{8,})['"]?/gi,
|
|
22
|
+
};
|
|
23
|
+
const DEFAULT_WHITELIST = [
|
|
24
|
+
'example@example.com',
|
|
25
|
+
'test@test.com',
|
|
26
|
+
'user@user.com',
|
|
27
|
+
'localhost',
|
|
28
|
+
'127.0.0.1',
|
|
29
|
+
'0.0.0.0',
|
|
30
|
+
'::1',
|
|
31
|
+
];
|
|
32
|
+
class SecurityScanner {
|
|
33
|
+
patterns;
|
|
34
|
+
whitelist;
|
|
35
|
+
constructor(options = {}) {
|
|
36
|
+
this.patterns = options.patterns ?? DEFAULT_PATTERNS;
|
|
37
|
+
this.whitelist = new Set(options.whitelist ?? DEFAULT_WHITELIST);
|
|
38
|
+
}
|
|
39
|
+
addToWhitelist(...items) {
|
|
40
|
+
items.forEach(item => this.whitelist.add(item));
|
|
41
|
+
}
|
|
42
|
+
isInWhitelist(match) {
|
|
43
|
+
return this.whitelist.has(match);
|
|
44
|
+
}
|
|
45
|
+
scan(content, filePath) {
|
|
46
|
+
const issues = [];
|
|
47
|
+
const lines = content.split('\n');
|
|
48
|
+
for (const [type, pattern] of Object.entries(this.patterns)) {
|
|
49
|
+
pattern.lastIndex = 0;
|
|
50
|
+
for (let i = 0; i < lines.length; i++) {
|
|
51
|
+
const line = lines[i];
|
|
52
|
+
pattern.lastIndex = 0;
|
|
53
|
+
let match;
|
|
54
|
+
while ((match = pattern.exec(line)) !== null) {
|
|
55
|
+
const matchedText = match[1] || match[0];
|
|
56
|
+
if (this.isInWhitelist(matchedText)) {
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
issues.push({
|
|
60
|
+
type: type,
|
|
61
|
+
match: matchedText,
|
|
62
|
+
file: filePath,
|
|
63
|
+
line: i + 1,
|
|
64
|
+
description: this.getIssueDescription(type),
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return issues;
|
|
70
|
+
}
|
|
71
|
+
scanMultiple(files) {
|
|
72
|
+
const allIssues = [];
|
|
73
|
+
for (const [filePath, content] of files.entries()) {
|
|
74
|
+
const issues = this.scan(content, filePath);
|
|
75
|
+
allIssues.push(...issues);
|
|
76
|
+
}
|
|
77
|
+
return allIssues;
|
|
78
|
+
}
|
|
79
|
+
redact(content) {
|
|
80
|
+
let redacted = content;
|
|
81
|
+
for (const pattern of Object.values(this.patterns)) {
|
|
82
|
+
pattern.lastIndex = 0;
|
|
83
|
+
redacted = redacted.replace(pattern, (match) => {
|
|
84
|
+
if (this.isInWhitelist(match)) {
|
|
85
|
+
return match;
|
|
86
|
+
}
|
|
87
|
+
return match.replace(/[a-zA-Z0-9]/g, '*').substring(0, Math.min(match.length, 10));
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
return redacted;
|
|
91
|
+
}
|
|
92
|
+
scanAndRedact(content, filePath) {
|
|
93
|
+
const issues = this.scan(content, filePath);
|
|
94
|
+
const redactedContent = issues.length > 0 ? this.redact(content) : content;
|
|
95
|
+
const summary = this.generateSummary(issues, filePath);
|
|
96
|
+
return {
|
|
97
|
+
issues,
|
|
98
|
+
summary,
|
|
99
|
+
redactedContent,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
getIssueDescription(type) {
|
|
103
|
+
switch (type) {
|
|
104
|
+
case SecurityIssueType.API_KEY:
|
|
105
|
+
return 'Potential API key detected';
|
|
106
|
+
case SecurityIssueType.EMAIL:
|
|
107
|
+
return 'Email address detected';
|
|
108
|
+
case SecurityIssueType.PHONE:
|
|
109
|
+
return 'Phone number detected';
|
|
110
|
+
case SecurityIssueType.TOKEN:
|
|
111
|
+
return 'Potential access token detected';
|
|
112
|
+
case SecurityIssueType.CREDENTIAL:
|
|
113
|
+
return 'Potential credential detected';
|
|
114
|
+
case SecurityIssueType.SECRET:
|
|
115
|
+
return 'Potential secret detected';
|
|
116
|
+
case SecurityIssueType.PASSWORD:
|
|
117
|
+
return 'Potential password detected';
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
generateSummary(issues, filePath) {
|
|
121
|
+
if (issues.length === 0) {
|
|
122
|
+
return `No security issues found in ${filePath}`;
|
|
123
|
+
}
|
|
124
|
+
const typeCount = {};
|
|
125
|
+
for (const issue of issues) {
|
|
126
|
+
typeCount[issue.type] = (typeCount[issue.type] || 0) + 1;
|
|
127
|
+
}
|
|
128
|
+
const typeSummary = Object.entries(typeCount)
|
|
129
|
+
.map(([type, count]) => `${type}: ${count}`)
|
|
130
|
+
.join(', ');
|
|
131
|
+
return `Found ${issues.length} security issue(s) in ${filePath}: ${typeSummary}`;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
exports.SecurityScanner = SecurityScanner;
|
|
135
|
+
exports.defaultSecurityScanner = new SecurityScanner();
|
|
136
|
+
//# sourceMappingURL=SecurityScanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SecurityScanner.js","sourceRoot":"","sources":["../../../src/core/security/SecurityScanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './SecurityScanner';
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./SecurityScanner"), exports);
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/security/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oDAAkC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "yuangs",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.41.0",
|
|
4
4
|
"description": "苑广山的个人应用集合 CLI(彩色版)",
|
|
5
5
|
"author": "苑广山",
|
|
6
6
|
"license": "ISC",
|
|
@@ -49,6 +49,7 @@
|
|
|
49
49
|
"marked-terminal": "^7.3.0",
|
|
50
50
|
"open": "^11.0.0",
|
|
51
51
|
"ora": "^5.4.1",
|
|
52
|
+
"p-limit": "^7.2.0",
|
|
52
53
|
"socket.io": "^4.8.3",
|
|
53
54
|
"ssh2": "^1.17.0",
|
|
54
55
|
"yuangs": "^2.29.0",
|