@hatem427/code-guard-ci 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.
- package/.husky/pre-commit +27 -0
- package/LICENSE +21 -0
- package/README.md +646 -0
- package/config/angular.config.ts +223 -0
- package/config/guidelines.config.ts +229 -0
- package/config/nextjs.config.ts +160 -0
- package/config/react.config.ts +330 -0
- package/dist/config/angular.config.d.ts +15 -0
- package/dist/config/angular.config.d.ts.map +1 -0
- package/dist/config/angular.config.js +187 -0
- package/dist/config/angular.config.js.map +1 -0
- package/dist/config/guidelines.config.d.ts +63 -0
- package/dist/config/guidelines.config.d.ts.map +1 -0
- package/dist/config/guidelines.config.js +167 -0
- package/dist/config/guidelines.config.js.map +1 -0
- package/dist/config/nextjs.config.d.ts +18 -0
- package/dist/config/nextjs.config.d.ts.map +1 -0
- package/dist/config/nextjs.config.js +133 -0
- package/dist/config/nextjs.config.js.map +1 -0
- package/dist/config/react.config.d.ts +15 -0
- package/dist/config/react.config.d.ts.map +1 -0
- package/dist/config/react.config.js +287 -0
- package/dist/config/react.config.js.map +1 -0
- package/dist/scripts/auto-fix.d.ts +16 -0
- package/dist/scripts/auto-fix.d.ts.map +1 -0
- package/dist/scripts/auto-fix.js +130 -0
- package/dist/scripts/auto-fix.js.map +1 -0
- package/dist/scripts/cli.d.ts +17 -0
- package/dist/scripts/cli.d.ts.map +1 -0
- package/dist/scripts/cli.js +255 -0
- package/dist/scripts/cli.js.map +1 -0
- package/dist/scripts/delete-bypass-logs.d.ts +17 -0
- package/dist/scripts/delete-bypass-logs.d.ts.map +1 -0
- package/dist/scripts/delete-bypass-logs.js +242 -0
- package/dist/scripts/delete-bypass-logs.js.map +1 -0
- package/dist/scripts/generate-doc.d.ts +18 -0
- package/dist/scripts/generate-doc.d.ts.map +1 -0
- package/dist/scripts/generate-doc.js +300 -0
- package/dist/scripts/generate-doc.js.map +1 -0
- package/dist/scripts/generate-pr-checklist.d.ts +20 -0
- package/dist/scripts/generate-pr-checklist.d.ts.map +1 -0
- package/dist/scripts/generate-pr-checklist.js +276 -0
- package/dist/scripts/generate-pr-checklist.js.map +1 -0
- package/dist/scripts/precommit-check.d.ts +23 -0
- package/dist/scripts/precommit-check.d.ts.map +1 -0
- package/dist/scripts/precommit-check.js +331 -0
- package/dist/scripts/precommit-check.js.map +1 -0
- package/dist/scripts/set-admin-password.d.ts +14 -0
- package/dist/scripts/set-admin-password.d.ts.map +1 -0
- package/dist/scripts/set-admin-password.js +116 -0
- package/dist/scripts/set-admin-password.js.map +1 -0
- package/dist/scripts/set-bypass-password.d.ts +11 -0
- package/dist/scripts/set-bypass-password.d.ts.map +1 -0
- package/dist/scripts/set-bypass-password.js +106 -0
- package/dist/scripts/set-bypass-password.js.map +1 -0
- package/dist/scripts/utils/auto-fixer.d.ts +28 -0
- package/dist/scripts/utils/auto-fixer.d.ts.map +1 -0
- package/dist/scripts/utils/auto-fixer.js +177 -0
- package/dist/scripts/utils/auto-fixer.js.map +1 -0
- package/dist/scripts/utils/bypass-manager.d.ts +101 -0
- package/dist/scripts/utils/bypass-manager.d.ts.map +1 -0
- package/dist/scripts/utils/bypass-manager.js +496 -0
- package/dist/scripts/utils/bypass-manager.js.map +1 -0
- package/dist/scripts/utils/code-analyzer.d.ts +34 -0
- package/dist/scripts/utils/code-analyzer.d.ts.map +1 -0
- package/dist/scripts/utils/code-analyzer.js +323 -0
- package/dist/scripts/utils/code-analyzer.js.map +1 -0
- package/dist/scripts/utils/file-checker.d.ts +93 -0
- package/dist/scripts/utils/file-checker.d.ts.map +1 -0
- package/dist/scripts/utils/file-checker.js +248 -0
- package/dist/scripts/utils/file-checker.js.map +1 -0
- package/dist/scripts/utils/logger.d.ts +26 -0
- package/dist/scripts/utils/logger.d.ts.map +1 -0
- package/dist/scripts/utils/logger.js +86 -0
- package/dist/scripts/utils/logger.js.map +1 -0
- package/dist/scripts/utils/project-detector.d.ts +34 -0
- package/dist/scripts/utils/project-detector.d.ts.map +1 -0
- package/dist/scripts/utils/project-detector.js +124 -0
- package/dist/scripts/utils/project-detector.js.map +1 -0
- package/dist/scripts/utils/rule-engine.d.ts +57 -0
- package/dist/scripts/utils/rule-engine.d.ts.map +1 -0
- package/dist/scripts/utils/rule-engine.js +158 -0
- package/dist/scripts/utils/rule-engine.js.map +1 -0
- package/dist/scripts/view-bypass-log.d.ts +13 -0
- package/dist/scripts/view-bypass-log.d.ts.map +1 -0
- package/dist/scripts/view-bypass-log.js +117 -0
- package/dist/scripts/view-bypass-log.js.map +1 -0
- package/package.json +74 -0
- package/scripts/auto-fix.ts +115 -0
- package/scripts/cli.ts +246 -0
- package/scripts/delete-bypass-logs.ts +253 -0
- package/scripts/generate-doc.ts +317 -0
- package/scripts/generate-pr-checklist.ts +285 -0
- package/scripts/precommit-check.ts +349 -0
- package/scripts/set-admin-password.ts +90 -0
- package/scripts/set-bypass-password.ts +80 -0
- package/scripts/utils/auto-fixer.ts +181 -0
- package/scripts/utils/bypass-manager.ts +566 -0
- package/scripts/utils/code-analyzer.ts +341 -0
- package/scripts/utils/file-checker.ts +253 -0
- package/scripts/utils/logger.ts +88 -0
- package/scripts/utils/project-detector.ts +115 -0
- package/scripts/utils/rule-engine.ts +186 -0
- package/scripts/view-bypass-log.ts +92 -0
- package/templates/feature-doc-api.md +101 -0
- package/templates/feature-doc-service.md +113 -0
- package/templates/feature-doc-ui.md +91 -0
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
#!/usr/bin/env ts-node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* ============================================================================
|
|
5
|
+
* delete-bypass-logs.ts — Delete bypass log entries (ADMIN ONLY)
|
|
6
|
+
* ============================================================================
|
|
7
|
+
*
|
|
8
|
+
* Requires admin password to delete entries from bypass log.
|
|
9
|
+
* Deleted entries are automatically archived for audit trail.
|
|
10
|
+
*
|
|
11
|
+
* Usage:
|
|
12
|
+
* npm run delete-bypass-logs
|
|
13
|
+
* npm run delete-bypass-logs -- --id="entry-uuid"
|
|
14
|
+
* npm run delete-bypass-logs -- --author="john@example.com"
|
|
15
|
+
* npm run delete-bypass-logs -- --before="2024-01-01"
|
|
16
|
+
*/
|
|
17
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
18
|
+
if (k2 === undefined) k2 = k;
|
|
19
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
20
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
21
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
22
|
+
}
|
|
23
|
+
Object.defineProperty(o, k2, desc);
|
|
24
|
+
}) : (function(o, m, k, k2) {
|
|
25
|
+
if (k2 === undefined) k2 = k;
|
|
26
|
+
o[k2] = m[k];
|
|
27
|
+
}));
|
|
28
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
29
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
30
|
+
}) : function(o, v) {
|
|
31
|
+
o["default"] = v;
|
|
32
|
+
});
|
|
33
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
34
|
+
var ownKeys = function(o) {
|
|
35
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
36
|
+
var ar = [];
|
|
37
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
38
|
+
return ar;
|
|
39
|
+
};
|
|
40
|
+
return ownKeys(o);
|
|
41
|
+
};
|
|
42
|
+
return function (mod) {
|
|
43
|
+
if (mod && mod.__esModule) return mod;
|
|
44
|
+
var result = {};
|
|
45
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
46
|
+
__setModuleDefault(result, mod);
|
|
47
|
+
return result;
|
|
48
|
+
};
|
|
49
|
+
})();
|
|
50
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
51
|
+
const bypass_manager_1 = require("./utils/bypass-manager");
|
|
52
|
+
const readline = __importStar(require("readline"));
|
|
53
|
+
const fs = __importStar(require("fs"));
|
|
54
|
+
const path = __importStar(require("path"));
|
|
55
|
+
function promptPassword(question) {
|
|
56
|
+
return new Promise((resolve) => {
|
|
57
|
+
const rl = readline.createInterface({
|
|
58
|
+
input: process.stdin,
|
|
59
|
+
output: process.stdout,
|
|
60
|
+
});
|
|
61
|
+
const stdin = process.stdin;
|
|
62
|
+
stdin.setRawMode(true);
|
|
63
|
+
let password = '';
|
|
64
|
+
process.stdout.write(question);
|
|
65
|
+
stdin.on('data', (char) => {
|
|
66
|
+
const str = char.toString('utf-8');
|
|
67
|
+
if (str === '\n' || str === '\r' || str === '\u0004') {
|
|
68
|
+
stdin.setRawMode(false);
|
|
69
|
+
process.stdout.write('\n');
|
|
70
|
+
rl.close();
|
|
71
|
+
resolve(password);
|
|
72
|
+
}
|
|
73
|
+
else if (str === '\u0003') {
|
|
74
|
+
// Ctrl+C
|
|
75
|
+
process.exit(1);
|
|
76
|
+
}
|
|
77
|
+
else if (str === '\u007f' || str === '\b') {
|
|
78
|
+
// Backspace
|
|
79
|
+
if (password.length > 0) {
|
|
80
|
+
password = password.slice(0, -1);
|
|
81
|
+
process.stdout.write('\b \b');
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
password += str;
|
|
86
|
+
process.stdout.write('*');
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
function promptConfirmation(question) {
|
|
92
|
+
return new Promise((resolve) => {
|
|
93
|
+
const rl = readline.createInterface({
|
|
94
|
+
input: process.stdin,
|
|
95
|
+
output: process.stdout,
|
|
96
|
+
});
|
|
97
|
+
rl.question(question, (answer) => {
|
|
98
|
+
rl.close();
|
|
99
|
+
resolve(answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes');
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
function parseArgs() {
|
|
104
|
+
const args = process.argv.slice(2);
|
|
105
|
+
const opts = {};
|
|
106
|
+
for (const arg of args) {
|
|
107
|
+
const [key, ...valueParts] = arg.replace(/^--/, '').split('=');
|
|
108
|
+
const value = valueParts.join('=').replace(/^["']|["']$/g, '');
|
|
109
|
+
switch (key) {
|
|
110
|
+
case 'id':
|
|
111
|
+
opts.id = value;
|
|
112
|
+
break;
|
|
113
|
+
case 'author':
|
|
114
|
+
opts.author = value;
|
|
115
|
+
break;
|
|
116
|
+
case 'before':
|
|
117
|
+
opts.before = value;
|
|
118
|
+
break;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return opts;
|
|
122
|
+
}
|
|
123
|
+
function loadBypassLog() {
|
|
124
|
+
const logPath = path.join(process.cwd(), '.code-guardian', 'bypass-log.json');
|
|
125
|
+
if (!fs.existsSync(logPath)) {
|
|
126
|
+
return [];
|
|
127
|
+
}
|
|
128
|
+
try {
|
|
129
|
+
const content = fs.readFileSync(logPath, 'utf-8');
|
|
130
|
+
const log = JSON.parse(content);
|
|
131
|
+
return log.entries || [];
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
return [];
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
async function main() {
|
|
138
|
+
console.log('🗑️ Code Guardian — Delete Bypass Logs (ADMIN ONLY)\n');
|
|
139
|
+
console.log('⚠️ WARNING: This operation requires admin authentication.');
|
|
140
|
+
console.log(' Deleted entries will be archived for audit purposes.\n');
|
|
141
|
+
const opts = parseArgs();
|
|
142
|
+
const allEntries = loadBypassLog();
|
|
143
|
+
if (allEntries.length === 0) {
|
|
144
|
+
console.log('ℹ️ No bypass entries found in the log.');
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
let entriesToDelete = [];
|
|
148
|
+
if (opts.id) {
|
|
149
|
+
// Delete specific entry by ID
|
|
150
|
+
const entry = allEntries.find((e) => e.id === opts.id);
|
|
151
|
+
if (!entry) {
|
|
152
|
+
console.error(`❌ Entry with ID "${opts.id}" not found.`);
|
|
153
|
+
process.exit(1);
|
|
154
|
+
}
|
|
155
|
+
entriesToDelete = [entry];
|
|
156
|
+
console.log(`Found entry to delete:`);
|
|
157
|
+
console.log(` • ID: ${entry.id}`);
|
|
158
|
+
console.log(` • Author: ${entry.author} <${entry.email}>`);
|
|
159
|
+
console.log(` • Date: ${new Date(entry.timestamp).toLocaleString()}`);
|
|
160
|
+
console.log(` • Reason: ${entry.reason}\n`);
|
|
161
|
+
}
|
|
162
|
+
else if (opts.author) {
|
|
163
|
+
// Delete entries by author
|
|
164
|
+
entriesToDelete = allEntries.filter((e) => e.email === opts.author || e.author === opts.author);
|
|
165
|
+
if (entriesToDelete.length === 0) {
|
|
166
|
+
console.error(`❌ No entries found for author "${opts.author}".`);
|
|
167
|
+
process.exit(1);
|
|
168
|
+
}
|
|
169
|
+
console.log(`Found ${entriesToDelete.length} entry(ies) by ${opts.author}:\n`);
|
|
170
|
+
entriesToDelete.forEach((entry) => {
|
|
171
|
+
console.log(` • ${new Date(entry.timestamp).toLocaleString()} - ${entry.reason}`);
|
|
172
|
+
});
|
|
173
|
+
console.log('');
|
|
174
|
+
}
|
|
175
|
+
else if (opts.before) {
|
|
176
|
+
// Delete entries before a certain date
|
|
177
|
+
const cutoffDate = new Date(opts.before);
|
|
178
|
+
if (isNaN(cutoffDate.getTime())) {
|
|
179
|
+
console.error(`❌ Invalid date format: "${opts.before}"`);
|
|
180
|
+
process.exit(1);
|
|
181
|
+
}
|
|
182
|
+
entriesToDelete = allEntries.filter((e) => new Date(e.timestamp) < cutoffDate);
|
|
183
|
+
if (entriesToDelete.length === 0) {
|
|
184
|
+
console.error(`❌ No entries found before ${cutoffDate.toLocaleDateString()}.`);
|
|
185
|
+
process.exit(1);
|
|
186
|
+
}
|
|
187
|
+
console.log(`Found ${entriesToDelete.length} entry(ies) before ${cutoffDate.toLocaleDateString()}:\n`);
|
|
188
|
+
entriesToDelete.slice(0, 5).forEach((entry) => {
|
|
189
|
+
console.log(` • ${new Date(entry.timestamp).toLocaleString()} - ${entry.author}`);
|
|
190
|
+
});
|
|
191
|
+
if (entriesToDelete.length > 5) {
|
|
192
|
+
console.log(` ... and ${entriesToDelete.length - 5} more\n`);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
// Interactive mode: show all entries
|
|
197
|
+
console.log('Available entries:\n');
|
|
198
|
+
allEntries.forEach((entry, index) => {
|
|
199
|
+
console.log(`${index + 1}. ${new Date(entry.timestamp).toLocaleString()}`);
|
|
200
|
+
console.log(` Author: ${entry.author} <${entry.email}>`);
|
|
201
|
+
console.log(` Reason: ${entry.reason}`);
|
|
202
|
+
console.log(` ID: ${entry.id}\n`);
|
|
203
|
+
});
|
|
204
|
+
const confirmed = await promptConfirmation('Enter entry number(s) to delete (comma-separated) or "all": ');
|
|
205
|
+
if (!confirmed) {
|
|
206
|
+
console.log('Operation cancelled.');
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
// For simplicity in interactive mode, we'll just exit with instructions
|
|
210
|
+
console.log('\n📝 To delete specific entries, use:');
|
|
211
|
+
console.log(' npm run delete-bypass-logs -- --id="<entry-id>"');
|
|
212
|
+
console.log(' npm run delete-bypass-logs -- --author="<email>"');
|
|
213
|
+
console.log(' npm run delete-bypass-logs -- --before="YYYY-MM-DD"');
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
// Confirm deletion
|
|
217
|
+
const confirmDelete = await promptConfirmation(`❗ Are you sure you want to delete ${entriesToDelete.length} entry(ies)? (y/N): `);
|
|
218
|
+
if (!confirmDelete) {
|
|
219
|
+
console.log('Operation cancelled.');
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
// Request admin password
|
|
223
|
+
console.log('');
|
|
224
|
+
const adminPassword = await promptPassword('Enter admin password: ');
|
|
225
|
+
if (!adminPassword) {
|
|
226
|
+
console.error('\n❌ Password is required.');
|
|
227
|
+
process.exit(1);
|
|
228
|
+
}
|
|
229
|
+
// Attempt deletion
|
|
230
|
+
const entryIds = entriesToDelete.map((e) => e.id);
|
|
231
|
+
const result = (0, bypass_manager_1.deleteBypassEntries)(entryIds, adminPassword);
|
|
232
|
+
console.log('\n' + result.message);
|
|
233
|
+
if (result.success) {
|
|
234
|
+
console.log(`📊 Remaining entries: ${allEntries.length - result.deletedCount}`);
|
|
235
|
+
console.log('📦 Deleted entries have been archived for audit purposes.');
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
main().catch((err) => {
|
|
239
|
+
console.error(`Error: ${err.message}`);
|
|
240
|
+
process.exit(1);
|
|
241
|
+
});
|
|
242
|
+
//# sourceMappingURL=delete-bypass-logs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete-bypass-logs.js","sourceRoot":"","sources":["../../scripts/delete-bypass-logs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ============================================================================
|
|
3
|
+
* generate-doc.ts — Feature documentation generator
|
|
4
|
+
* ============================================================================
|
|
5
|
+
*
|
|
6
|
+
* Generates Markdown feature documentation from templates.
|
|
7
|
+
* Supports multiple template types: ui, api, service.
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* npm run generate-doc -- --name="my-feature" --type=ui
|
|
11
|
+
* npm run generate-doc -- --name="auth-api" --type=api
|
|
12
|
+
* npm run generate-doc -- --name="user-service" --type=service
|
|
13
|
+
*
|
|
14
|
+
* Templates live in /templates/feature-doc-{type}.md
|
|
15
|
+
* Output goes to /docs/features/{name}.md
|
|
16
|
+
*/
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=generate-doc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-doc.d.ts","sourceRoot":"","sources":["../../scripts/generate-doc.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG"}
|
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ============================================================================
|
|
4
|
+
* generate-doc.ts — Feature documentation generator
|
|
5
|
+
* ============================================================================
|
|
6
|
+
*
|
|
7
|
+
* Generates Markdown feature documentation from templates.
|
|
8
|
+
* Supports multiple template types: ui, api, service.
|
|
9
|
+
*
|
|
10
|
+
* Usage:
|
|
11
|
+
* npm run generate-doc -- --name="my-feature" --type=ui
|
|
12
|
+
* npm run generate-doc -- --name="auth-api" --type=api
|
|
13
|
+
* npm run generate-doc -- --name="user-service" --type=service
|
|
14
|
+
*
|
|
15
|
+
* Templates live in /templates/feature-doc-{type}.md
|
|
16
|
+
* Output goes to /docs/features/{name}.md
|
|
17
|
+
*/
|
|
18
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
19
|
+
if (k2 === undefined) k2 = k;
|
|
20
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
21
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
22
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
23
|
+
}
|
|
24
|
+
Object.defineProperty(o, k2, desc);
|
|
25
|
+
}) : (function(o, m, k, k2) {
|
|
26
|
+
if (k2 === undefined) k2 = k;
|
|
27
|
+
o[k2] = m[k];
|
|
28
|
+
}));
|
|
29
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
30
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
31
|
+
}) : function(o, v) {
|
|
32
|
+
o["default"] = v;
|
|
33
|
+
});
|
|
34
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
35
|
+
var ownKeys = function(o) {
|
|
36
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
37
|
+
var ar = [];
|
|
38
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
39
|
+
return ar;
|
|
40
|
+
};
|
|
41
|
+
return ownKeys(o);
|
|
42
|
+
};
|
|
43
|
+
return function (mod) {
|
|
44
|
+
if (mod && mod.__esModule) return mod;
|
|
45
|
+
var result = {};
|
|
46
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
47
|
+
__setModuleDefault(result, mod);
|
|
48
|
+
return result;
|
|
49
|
+
};
|
|
50
|
+
})();
|
|
51
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
52
|
+
const fs = __importStar(require("fs"));
|
|
53
|
+
const path = __importStar(require("path"));
|
|
54
|
+
const logger = __importStar(require("./utils/logger"));
|
|
55
|
+
const code_analyzer_1 = require("./utils/code-analyzer");
|
|
56
|
+
// ── Argument parsing ────────────────────────────────────────────────────────
|
|
57
|
+
/**
|
|
58
|
+
* Parse CLI arguments into DocOptions.
|
|
59
|
+
* Expected format: --name="feature-name" --type=ui [--description="..."] [--author="..."]
|
|
60
|
+
*/
|
|
61
|
+
function parseArgs() {
|
|
62
|
+
const args = process.argv.slice(2);
|
|
63
|
+
const opts = {};
|
|
64
|
+
for (const arg of args) {
|
|
65
|
+
const [key, ...valueParts] = arg.replace(/^--/, '').split('=');
|
|
66
|
+
const value = valueParts.join('=').replace(/^["']|["']$/g, ''); // Remove surrounding quotes
|
|
67
|
+
switch (key) {
|
|
68
|
+
case 'name':
|
|
69
|
+
opts.name = value;
|
|
70
|
+
break;
|
|
71
|
+
case 'type':
|
|
72
|
+
if (['ui', 'api', 'service'].includes(value)) {
|
|
73
|
+
opts.type = value;
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
logger.error(`Invalid type "${value}". Expected: ui, api, or service.`);
|
|
77
|
+
process.exit(1);
|
|
78
|
+
}
|
|
79
|
+
break;
|
|
80
|
+
case 'description':
|
|
81
|
+
opts.description = value;
|
|
82
|
+
break;
|
|
83
|
+
case 'author':
|
|
84
|
+
opts.author = value;
|
|
85
|
+
break;
|
|
86
|
+
case 'auto':
|
|
87
|
+
opts.auto = value === 'true' || value === '' || !value; // --auto or --auto=true
|
|
88
|
+
break;
|
|
89
|
+
case 'file':
|
|
90
|
+
opts.file = value;
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// Validate required fields
|
|
95
|
+
if (!opts.name) {
|
|
96
|
+
logger.error('Missing required argument: --name="feature-name"');
|
|
97
|
+
logger.dim('Usage: npm run generate-doc -- --name="my-feature" --type=ui');
|
|
98
|
+
process.exit(1);
|
|
99
|
+
}
|
|
100
|
+
if (!opts.type) {
|
|
101
|
+
logger.warn('No --type specified, defaulting to "ui".');
|
|
102
|
+
opts.type = 'ui';
|
|
103
|
+
}
|
|
104
|
+
return opts;
|
|
105
|
+
}
|
|
106
|
+
// ── Template processing ─────────────────────────────────────────────────────
|
|
107
|
+
/**
|
|
108
|
+
* Load and process a template file, replacing placeholders with actual values.
|
|
109
|
+
*
|
|
110
|
+
* Supported placeholders:
|
|
111
|
+
* {{FEATURE_NAME}} — The feature name (kebab-case)
|
|
112
|
+
* {{FEATURE_TITLE}} — The feature name in Title Case
|
|
113
|
+
* {{DATE}} — Today's date in YYYY-MM-DD format
|
|
114
|
+
* {{AUTHOR}} — Author name (or "Team" if not provided)
|
|
115
|
+
* {{DESCRIPTION}} — Pre-filled description (or placeholder text)
|
|
116
|
+
* {{DOC_TYPE}} — The template type (ui, api, service)
|
|
117
|
+
*/
|
|
118
|
+
function processTemplate(templatePath, opts) {
|
|
119
|
+
if (!fs.existsSync(templatePath)) {
|
|
120
|
+
logger.error(`Template not found: ${templatePath}`);
|
|
121
|
+
logger.dim('Available templates:');
|
|
122
|
+
logger.dim(' templates/feature-doc-ui.md');
|
|
123
|
+
logger.dim(' templates/feature-doc-api.md');
|
|
124
|
+
logger.dim(' templates/feature-doc-service.md');
|
|
125
|
+
process.exit(1);
|
|
126
|
+
}
|
|
127
|
+
let content = fs.readFileSync(templatePath, 'utf-8');
|
|
128
|
+
// Convert kebab-case to Title Case
|
|
129
|
+
const titleCase = opts.name
|
|
130
|
+
.split('-')
|
|
131
|
+
.map((word) => word.charAt(0).toUpperCase() + word.slice(1))
|
|
132
|
+
.join(' ');
|
|
133
|
+
// Today's date
|
|
134
|
+
const today = new Date().toISOString().split('T')[0];
|
|
135
|
+
// Replace all placeholders
|
|
136
|
+
const replacements = {
|
|
137
|
+
'{{FEATURE_NAME}}': opts.name,
|
|
138
|
+
'{{FEATURE_TITLE}}': titleCase,
|
|
139
|
+
'{{DATE}}': today,
|
|
140
|
+
'{{AUTHOR}}': opts.author || 'Team',
|
|
141
|
+
'{{DESCRIPTION}}': opts.description || 'TODO: Add feature description here.',
|
|
142
|
+
'{{DOC_TYPE}}': opts.type,
|
|
143
|
+
};
|
|
144
|
+
for (const [placeholder, value] of Object.entries(replacements)) {
|
|
145
|
+
content = content.replace(new RegExp(placeholder.replace(/[{}]/g, '\\$&'), 'g'), value);
|
|
146
|
+
}
|
|
147
|
+
return content;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Generate documentation automatically from code analysis
|
|
151
|
+
*/
|
|
152
|
+
function generateFromCode(componentInfo, opts) {
|
|
153
|
+
const today = new Date().toISOString().split('T')[0];
|
|
154
|
+
const titleCase = componentInfo.name
|
|
155
|
+
.replace(/([A-Z])/g, ' $1')
|
|
156
|
+
.trim();
|
|
157
|
+
let doc = `# ${titleCase}\n\n`;
|
|
158
|
+
doc += `> **Type**: UI Component \n`;
|
|
159
|
+
doc += `> **Created**: ${today} \n`;
|
|
160
|
+
doc += `> **Author**: ${opts.author || 'Team'} \n`;
|
|
161
|
+
doc += `> **Status**: ✅ Auto-generated\n\n`;
|
|
162
|
+
doc += `---\n\n`;
|
|
163
|
+
// Description
|
|
164
|
+
doc += `## 📝 Description\n\n`;
|
|
165
|
+
if (componentInfo.description) {
|
|
166
|
+
doc += `${componentInfo.description}\n\n`;
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
doc += `_Auto-generated from \`${path.basename(componentInfo.filePath)}\`_\n\n`;
|
|
170
|
+
}
|
|
171
|
+
// Usage
|
|
172
|
+
doc += `## 🚀 Usage\n\n`;
|
|
173
|
+
doc += `\`\`\`tsx\n`;
|
|
174
|
+
doc += `import { ${componentInfo.name} } from './${path.basename(componentInfo.filePath, path.extname(componentInfo.filePath))}';\n\n`;
|
|
175
|
+
if (componentInfo.props.length > 0) {
|
|
176
|
+
doc += `<${componentInfo.name}\n`;
|
|
177
|
+
componentInfo.props.slice(0, 3).forEach(prop => {
|
|
178
|
+
const example = getExampleValue(prop.type);
|
|
179
|
+
doc += ` ${prop.name}={${example}}\n`;
|
|
180
|
+
});
|
|
181
|
+
if (componentInfo.props.length > 3) {
|
|
182
|
+
doc += ` // ... more props\n`;
|
|
183
|
+
}
|
|
184
|
+
doc += `/>\n`;
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
doc += `<${componentInfo.name} />\n`;
|
|
188
|
+
}
|
|
189
|
+
doc += `\`\`\`\n\n`;
|
|
190
|
+
// Props table
|
|
191
|
+
if (componentInfo.props.length > 0) {
|
|
192
|
+
doc += `## 📥 Props\n\n`;
|
|
193
|
+
doc += `| Name | Type | Required | Default | Description |\n`;
|
|
194
|
+
doc += `|------|------|----------|---------|-------------|\n`;
|
|
195
|
+
componentInfo.props.forEach(prop => {
|
|
196
|
+
const req = prop.required ? '✅ Yes' : 'No';
|
|
197
|
+
const def = prop.defaultValue || '-';
|
|
198
|
+
const desc = prop.description || '-';
|
|
199
|
+
doc += `| \`${prop.name}\` | \`${prop.type}\` | ${req} | \`${def}\` | ${desc} |\n`;
|
|
200
|
+
});
|
|
201
|
+
doc += `\n`;
|
|
202
|
+
}
|
|
203
|
+
// Footer
|
|
204
|
+
doc += `## 📝 Notes\n\n`;
|
|
205
|
+
doc += `- Auto-generated from code analysis\n`;
|
|
206
|
+
doc += `- Source file: \`${componentInfo.filePath}\`\n`;
|
|
207
|
+
doc += `- Last analyzed: ${today}\n\n`;
|
|
208
|
+
doc += `---\n\n`;
|
|
209
|
+
doc += `_Generated by Code Guardian — Auto-analysis_\n`;
|
|
210
|
+
return doc;
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Get example value for a type
|
|
214
|
+
*/
|
|
215
|
+
function getExampleValue(type) {
|
|
216
|
+
if (type.includes('string'))
|
|
217
|
+
return '"example"';
|
|
218
|
+
if (type.includes('number'))
|
|
219
|
+
return '42';
|
|
220
|
+
if (type.includes('boolean'))
|
|
221
|
+
return 'true';
|
|
222
|
+
if (type.includes('Function') || type.includes('=>'))
|
|
223
|
+
return '{handleClick}';
|
|
224
|
+
if (type.includes('[]'))
|
|
225
|
+
return '[]';
|
|
226
|
+
if (type.includes('{}') || type.includes('object'))
|
|
227
|
+
return '{{}}';
|
|
228
|
+
return '...';
|
|
229
|
+
}
|
|
230
|
+
// ── Main ────────────────────────────────────────────────────────────────────
|
|
231
|
+
function main() {
|
|
232
|
+
logger.header('📄 Code Guardian — Feature Doc Generator');
|
|
233
|
+
const opts = parseArgs();
|
|
234
|
+
logger.info(`Generating "${opts.type}" doc for feature: "${opts.name}"`);
|
|
235
|
+
// Resolve paths
|
|
236
|
+
const rootDir = process.cwd();
|
|
237
|
+
const outputDir = path.join(rootDir, 'docs', 'features');
|
|
238
|
+
const outputPath = path.join(outputDir, `${opts.name}.md`);
|
|
239
|
+
// Create output directory if needed
|
|
240
|
+
if (!fs.existsSync(outputDir)) {
|
|
241
|
+
fs.mkdirSync(outputDir, { recursive: true });
|
|
242
|
+
logger.dim(`Created directory: ${outputDir}`);
|
|
243
|
+
}
|
|
244
|
+
// Check if doc already exists
|
|
245
|
+
if (fs.existsSync(outputPath)) {
|
|
246
|
+
logger.warn(`Doc already exists: ${outputPath}`);
|
|
247
|
+
logger.warn('Overwriting with fresh content...');
|
|
248
|
+
}
|
|
249
|
+
let content;
|
|
250
|
+
// Auto-analyze mode
|
|
251
|
+
if (opts.auto) {
|
|
252
|
+
logger.info('Auto-analysis mode enabled — analyzing code...');
|
|
253
|
+
// Find component file
|
|
254
|
+
let componentPath = opts.file;
|
|
255
|
+
if (!componentPath) {
|
|
256
|
+
logger.dim(`Searching for ${opts.name} component...`);
|
|
257
|
+
const foundPath = (0, code_analyzer_1.findComponentFile)(opts.name, rootDir);
|
|
258
|
+
componentPath = foundPath || undefined;
|
|
259
|
+
if (!componentPath) {
|
|
260
|
+
logger.error(`Could not find component file for "${opts.name}"`);
|
|
261
|
+
logger.dim('Use --file="path/to/component.tsx" to specify manually');
|
|
262
|
+
logger.dim('Or use template mode: remove --auto flag');
|
|
263
|
+
process.exit(1);
|
|
264
|
+
}
|
|
265
|
+
logger.dim(`Found: ${componentPath}`);
|
|
266
|
+
}
|
|
267
|
+
// Analyze component
|
|
268
|
+
const componentInfo = (0, code_analyzer_1.analyzeComponent)(componentPath);
|
|
269
|
+
if (!componentInfo || !componentInfo.isReactComponent) {
|
|
270
|
+
logger.error(`Could not analyze component at ${componentPath}`);
|
|
271
|
+
logger.warn('Falling back to template mode...');
|
|
272
|
+
const templatePath = path.join(rootDir, 'templates', `feature-doc-${opts.type}.md`);
|
|
273
|
+
content = processTemplate(templatePath, opts);
|
|
274
|
+
}
|
|
275
|
+
else {
|
|
276
|
+
logger.success(`Analyzed ${componentInfo.name} — found ${componentInfo.props.length} prop(s)`);
|
|
277
|
+
content = generateFromCode(componentInfo, opts);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
else {
|
|
281
|
+
// Template mode
|
|
282
|
+
const templatePath = path.join(rootDir, 'templates', `feature-doc-${opts.type}.md`);
|
|
283
|
+
content = processTemplate(templatePath, opts);
|
|
284
|
+
}
|
|
285
|
+
// Write output
|
|
286
|
+
fs.writeFileSync(outputPath, content, 'utf-8');
|
|
287
|
+
logger.success(`Feature doc generated: ${outputPath}`);
|
|
288
|
+
if (!opts.auto) {
|
|
289
|
+
logger.dim('');
|
|
290
|
+
logger.dim('Next steps:');
|
|
291
|
+
logger.dim(` 1. Open ${outputPath} and fill in the details`);
|
|
292
|
+
logger.dim(' 2. Add it to your commit');
|
|
293
|
+
logger.dim(' 3. The PR checklist will verify doc completeness');
|
|
294
|
+
logger.dim('');
|
|
295
|
+
logger.dim('💡 Tip: Use --auto flag to auto-generate from code!');
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
// ── Execute ─────────────────────────────────────────────────────────────────
|
|
299
|
+
main();
|
|
300
|
+
//# sourceMappingURL=generate-doc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-doc.js","sourceRoot":"","sources":["../../scripts/generate-doc.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ============================================================================
|
|
3
|
+
* generate-pr-checklist.ts — PR Checklist Generator
|
|
4
|
+
* ============================================================================
|
|
5
|
+
*
|
|
6
|
+
* Generates a Markdown checklist suitable for pasting into a GitHub PR
|
|
7
|
+
* description or comment. The checklist includes:
|
|
8
|
+
* - All active coding rules (grouped by category)
|
|
9
|
+
* - Feature doc verification
|
|
10
|
+
* - Pre-commit check result summary
|
|
11
|
+
*
|
|
12
|
+
* Usage:
|
|
13
|
+
* npm run generate-pr-checklist
|
|
14
|
+
* npm run generate-pr-checklist -- --output=pr-checklist.md
|
|
15
|
+
* npm run generate-pr-checklist -- --project=angular
|
|
16
|
+
*/
|
|
17
|
+
import '../config/angular.config';
|
|
18
|
+
import '../config/react.config';
|
|
19
|
+
import '../config/nextjs.config';
|
|
20
|
+
//# sourceMappingURL=generate-pr-checklist.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-pr-checklist.d.ts","sourceRoot":"","sources":["../../scripts/generate-pr-checklist.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAaH,OAAO,0BAA0B,CAAC;AAClC,OAAO,wBAAwB,CAAC;AAChC,OAAO,yBAAyB,CAAC"}
|