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.
Files changed (38) hide show
  1. package/dist/commands/git/plan.js +64 -10
  2. package/dist/commands/git/plan.js.map +1 -1
  3. package/dist/commands/git/review.js +95 -2
  4. package/dist/commands/git/review.js.map +1 -1
  5. package/dist/core/capability/CapabilityLevel.d.ts +125 -0
  6. package/dist/core/capability/CapabilityLevel.js +184 -0
  7. package/dist/core/capability/CapabilityLevel.js.map +1 -0
  8. package/dist/core/capability/CostProfile.d.ts +34 -0
  9. package/dist/core/capability/CostProfile.js +138 -0
  10. package/dist/core/capability/CostProfile.js.map +1 -0
  11. package/dist/core/capability/DegradationPolicy.d.ts +26 -0
  12. package/dist/core/capability/DegradationPolicy.js +65 -0
  13. package/dist/core/capability/DegradationPolicy.js.map +1 -0
  14. package/dist/core/capability/index.d.ts +3 -0
  15. package/dist/core/capability/index.js +20 -0
  16. package/dist/core/capability/index.js.map +1 -0
  17. package/dist/core/context/ContextMeta.d.ts +30 -0
  18. package/dist/core/context/ContextMeta.js +108 -0
  19. package/dist/core/context/ContextMeta.js.map +1 -0
  20. package/dist/core/context/index.d.ts +1 -0
  21. package/dist/core/context/index.js +18 -0
  22. package/dist/core/context/index.js.map +1 -0
  23. package/dist/core/git/CodeReviewer.d.ts +11 -0
  24. package/dist/core/git/CodeReviewer.js +76 -8
  25. package/dist/core/git/CodeReviewer.js.map +1 -1
  26. package/dist/core/git/ContextGatherer.d.ts +6 -0
  27. package/dist/core/git/ContextGatherer.js +38 -3
  28. package/dist/core/git/ContextGatherer.js.map +1 -1
  29. package/dist/core/git/GitService.d.ts +13 -0
  30. package/dist/core/git/GitService.js +50 -0
  31. package/dist/core/git/GitService.js.map +1 -1
  32. package/dist/core/security/SecurityScanner.d.ts +39 -0
  33. package/dist/core/security/SecurityScanner.js +136 -0
  34. package/dist/core/security/SecurityScanner.js.map +1 -0
  35. package/dist/core/security/index.d.ts +1 -0
  36. package/dist/core/security/index.js +18 -0
  37. package/dist/core/security/index.js.map +1 -0
  38. 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.40.0",
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",