@barissozen/csns 0.7.6 → 0.7.8
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/bin/csns.js +21 -0
- package/dist/bin/csns.js.map +1 -1
- package/dist/orchestrator/entity-detector.d.ts +52 -0
- package/dist/orchestrator/entity-detector.d.ts.map +1 -0
- package/dist/orchestrator/entity-detector.js +297 -0
- package/dist/orchestrator/entity-detector.js.map +1 -0
- package/dist/orchestrator/index.d.ts +3 -0
- package/dist/orchestrator/index.d.ts.map +1 -1
- package/dist/orchestrator/index.js +3 -0
- package/dist/orchestrator/index.js.map +1 -1
- package/dist/orchestrator/pr-reviewer.d.ts +53 -0
- package/dist/orchestrator/pr-reviewer.d.ts.map +1 -0
- package/dist/orchestrator/pr-reviewer.js +218 -0
- package/dist/orchestrator/pr-reviewer.js.map +1 -0
- package/dist/orchestrator/smart-scaffold.d.ts +36 -0
- package/dist/orchestrator/smart-scaffold.d.ts.map +1 -0
- package/dist/orchestrator/smart-scaffold.js +438 -0
- package/dist/orchestrator/smart-scaffold.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PR Review — Targeted Audit on Changed Files
|
|
3
|
+
*
|
|
4
|
+
* Takes a git diff (staged, unstaged, or specific commit range),
|
|
5
|
+
* identifies changed files + their dependents, runs targeted
|
|
6
|
+
* security scan + architecture check, outputs PR-comment-ready markdown.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* csns review → reviews staged changes
|
|
10
|
+
* csns review --all → reviews all uncommitted changes
|
|
11
|
+
* csns review --commit HEAD~3..HEAD → reviews commit range
|
|
12
|
+
*/
|
|
13
|
+
import { execSync } from 'node:child_process';
|
|
14
|
+
import { StaticAnalyzer } from '../agent/tracer/static-analyzer.js';
|
|
15
|
+
import { SecurityScanner } from '../agent/tracer/security-scanner.js';
|
|
16
|
+
import { ReverseEngineer } from '../agent/tracer/reverse-engineer.js';
|
|
17
|
+
// ═══════════════════════════════════════════════════════════
|
|
18
|
+
// Reviewer
|
|
19
|
+
// ═══════════════════════════════════════════════════════════
|
|
20
|
+
export class PRReviewer {
|
|
21
|
+
projectRoot;
|
|
22
|
+
provider;
|
|
23
|
+
constructor(projectRoot, provider) {
|
|
24
|
+
this.projectRoot = projectRoot;
|
|
25
|
+
this.provider = provider ?? null;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Review changes based on scope.
|
|
29
|
+
*/
|
|
30
|
+
async review(scope = 'staged', commitRange) {
|
|
31
|
+
const start = Date.now();
|
|
32
|
+
// 1. Get changed files from git
|
|
33
|
+
const changedFiles = this.getChangedFiles(scope, commitRange);
|
|
34
|
+
if (changedFiles.length === 0) {
|
|
35
|
+
return this.emptyResult(start);
|
|
36
|
+
}
|
|
37
|
+
// 2. Find impacted files (dependents of changed files)
|
|
38
|
+
const impactedFiles = await this.findImpactedFiles(changedFiles);
|
|
39
|
+
// 3. Security scan — only on changed files
|
|
40
|
+
const securityFindings = await this.scanSecurity(changedFiles);
|
|
41
|
+
// 4. Architecture check — changed + impacted
|
|
42
|
+
const allRelevant = [...new Set([...changedFiles, ...impactedFiles])];
|
|
43
|
+
const archViolations = await this.checkArchitecture(allRelevant);
|
|
44
|
+
// 5. Determine verdict
|
|
45
|
+
const hasCritical = securityFindings.some(f => f.severity === 'critical') ||
|
|
46
|
+
archViolations.some(v => v.severity === 'critical' && !v.acknowledged);
|
|
47
|
+
const hasWarning = securityFindings.some(f => f.severity === 'high' || f.severity === 'medium') ||
|
|
48
|
+
archViolations.some(v => v.severity === 'warning' && !v.acknowledged);
|
|
49
|
+
const verdict = hasCritical ? 'request-changes' :
|
|
50
|
+
hasWarning ? 'comment' : 'approve';
|
|
51
|
+
// 6. Generate markdown
|
|
52
|
+
const markdown = this.generateMarkdown(changedFiles, impactedFiles, securityFindings, archViolations, verdict);
|
|
53
|
+
return {
|
|
54
|
+
changedFiles,
|
|
55
|
+
impactedFiles,
|
|
56
|
+
securityFindings,
|
|
57
|
+
architectureViolations: archViolations,
|
|
58
|
+
summary: {
|
|
59
|
+
filesChanged: changedFiles.length,
|
|
60
|
+
filesImpacted: impactedFiles.length,
|
|
61
|
+
securityIssues: securityFindings.length,
|
|
62
|
+
archViolations: archViolations.filter(v => !v.acknowledged).length,
|
|
63
|
+
verdict,
|
|
64
|
+
},
|
|
65
|
+
markdown,
|
|
66
|
+
duration: Date.now() - start,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
// ═══════════════════════════════════════════════════════════
|
|
70
|
+
// Git Integration
|
|
71
|
+
// ═══════════════════════════════════════════════════════════
|
|
72
|
+
getChangedFiles(scope, commitRange) {
|
|
73
|
+
let cmd;
|
|
74
|
+
switch (scope) {
|
|
75
|
+
case 'staged':
|
|
76
|
+
cmd = 'git diff --cached --name-only --diff-filter=ACMR';
|
|
77
|
+
break;
|
|
78
|
+
case 'all':
|
|
79
|
+
cmd = 'git diff --name-only --diff-filter=ACMR HEAD';
|
|
80
|
+
break;
|
|
81
|
+
case 'commit':
|
|
82
|
+
cmd = `git diff --name-only --diff-filter=ACMR ${commitRange ?? 'HEAD~1..HEAD'}`;
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
try {
|
|
86
|
+
const output = execSync(cmd, { cwd: this.projectRoot, encoding: 'utf-8', timeout: 10_000 });
|
|
87
|
+
return output.trim().split('\n')
|
|
88
|
+
.filter(f => f.length > 0)
|
|
89
|
+
.filter(f => /\.(ts|tsx|js|jsx|mjs)$/.test(f));
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
return [];
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
// ═══════════════════════════════════════════════════════════
|
|
96
|
+
// Impact Analysis
|
|
97
|
+
// ═══════════════════════════════════════════════════════════
|
|
98
|
+
async findImpactedFiles(changedFiles) {
|
|
99
|
+
const analyzer = new StaticAnalyzer(this.projectRoot);
|
|
100
|
+
const { edges } = await analyzer.buildGraph();
|
|
101
|
+
const impacted = new Set();
|
|
102
|
+
const changedSet = new Set(changedFiles);
|
|
103
|
+
// Find files that import any changed file (reverse edges)
|
|
104
|
+
for (const edge of edges) {
|
|
105
|
+
if (changedSet.has(edge.target) && !changedSet.has(edge.source)) {
|
|
106
|
+
impacted.add(edge.source);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// Second level — files that import the impacted files
|
|
110
|
+
for (const edge of edges) {
|
|
111
|
+
if (impacted.has(edge.target) && !changedSet.has(edge.source) && !impacted.has(edge.source)) {
|
|
112
|
+
impacted.add(edge.source);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return [...impacted];
|
|
116
|
+
}
|
|
117
|
+
// ═══════════════════════════════════════════════════════════
|
|
118
|
+
// Targeted Scans
|
|
119
|
+
// ═══════════════════════════════════════════════════════════
|
|
120
|
+
async scanSecurity(files) {
|
|
121
|
+
const scanner = new SecurityScanner(this.projectRoot);
|
|
122
|
+
const report = await scanner.scan();
|
|
123
|
+
// Filter to only findings in changed files
|
|
124
|
+
return report.findings.filter(f => files.some(cf => f.file.includes(cf) || cf.includes(f.file)));
|
|
125
|
+
}
|
|
126
|
+
async checkArchitecture(files) {
|
|
127
|
+
const auditor = new ReverseEngineer(this.projectRoot, this.provider);
|
|
128
|
+
const report = await auditor.audit();
|
|
129
|
+
// Filter to only violations in relevant files
|
|
130
|
+
return report.violations.filter(v => files.some(f => v.file.includes(f) || f.includes(v.file) || v.file === 'project-wide'));
|
|
131
|
+
}
|
|
132
|
+
// ═══════════════════════════════════════════════════════════
|
|
133
|
+
// Markdown Generation
|
|
134
|
+
// ═══════════════════════════════════════════════════════════
|
|
135
|
+
generateMarkdown(changed, impacted, security, arch, verdict) {
|
|
136
|
+
const parts = [];
|
|
137
|
+
// Header
|
|
138
|
+
const verdictIcon = verdict === 'approve' ? '✅' : verdict === 'request-changes' ? '🚨' : '💬';
|
|
139
|
+
const verdictText = verdict === 'approve' ? 'LGTM — No issues found' :
|
|
140
|
+
verdict === 'request-changes' ? 'Changes requested — critical issues found' :
|
|
141
|
+
'Comments — minor issues to review';
|
|
142
|
+
parts.push(`## ${verdictIcon} CSNS Review: ${verdictText}\n`);
|
|
143
|
+
// Summary
|
|
144
|
+
parts.push(`| Metric | Count |`);
|
|
145
|
+
parts.push(`|--------|-------|`);
|
|
146
|
+
parts.push(`| Files changed | ${changed.length} |`);
|
|
147
|
+
parts.push(`| Files impacted | ${impacted.length} |`);
|
|
148
|
+
parts.push(`| Security findings | ${security.length} |`);
|
|
149
|
+
parts.push(`| Architecture issues | ${arch.filter(v => !v.acknowledged).length} |`);
|
|
150
|
+
parts.push('');
|
|
151
|
+
// Changed files
|
|
152
|
+
parts.push(`### 📁 Changed Files\n`);
|
|
153
|
+
for (const f of changed)
|
|
154
|
+
parts.push(`- \`${f}\``);
|
|
155
|
+
parts.push('');
|
|
156
|
+
// Impact
|
|
157
|
+
if (impacted.length > 0) {
|
|
158
|
+
parts.push(`### 🔗 Impacted Files (dependents)\n`);
|
|
159
|
+
for (const f of impacted.slice(0, 15))
|
|
160
|
+
parts.push(`- \`${f}\``);
|
|
161
|
+
if (impacted.length > 15)
|
|
162
|
+
parts.push(`- ... +${impacted.length - 15} more`);
|
|
163
|
+
parts.push('');
|
|
164
|
+
}
|
|
165
|
+
// Security findings
|
|
166
|
+
if (security.length > 0) {
|
|
167
|
+
parts.push(`### 🔒 Security Findings\n`);
|
|
168
|
+
for (const f of security) {
|
|
169
|
+
const icon = f.severity === 'critical' ? '🚨' : f.severity === 'high' ? '🔴' : f.severity === 'medium' ? '🟡' : '🟢';
|
|
170
|
+
parts.push(`${icon} **[${f.rule}]** ${f.severity.toUpperCase()} — \`${f.file}:${f.line}\``);
|
|
171
|
+
parts.push(`> ${f.description}`);
|
|
172
|
+
parts.push(`> **Fix:** ${f.fix}`);
|
|
173
|
+
parts.push(`> \`\`\`\n> ${f.code.slice(0, 120)}\n> \`\`\``);
|
|
174
|
+
parts.push('');
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
// Architecture violations (unacknowledged only)
|
|
178
|
+
const realArch = arch.filter(v => !v.acknowledged);
|
|
179
|
+
if (realArch.length > 0) {
|
|
180
|
+
parts.push(`### 🏗️ Architecture Issues\n`);
|
|
181
|
+
for (const v of realArch) {
|
|
182
|
+
const icon = v.severity === 'critical' ? '🚨' : v.severity === 'warning' ? '⚠️' : 'ℹ️';
|
|
183
|
+
parts.push(`${icon} **[${v.type}]** — \`${v.file}\``);
|
|
184
|
+
parts.push(`> ${v.description}`);
|
|
185
|
+
parts.push(`> **Expected:** ${v.expectedBehavior}`);
|
|
186
|
+
parts.push('');
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
// Acknowledged (collapsed)
|
|
190
|
+
const acked = arch.filter(v => v.acknowledged);
|
|
191
|
+
if (acked.length > 0) {
|
|
192
|
+
parts.push(`<details><summary>✅ ${acked.length} acknowledged design decisions (not bugs)</summary>\n`);
|
|
193
|
+
for (const v of acked) {
|
|
194
|
+
parts.push(`- **${v.description.slice(0, 80)}** — ${v.acknowledgeReason ?? 'design decision'}`);
|
|
195
|
+
}
|
|
196
|
+
parts.push(`\n</details>\n`);
|
|
197
|
+
}
|
|
198
|
+
return parts.join('\n');
|
|
199
|
+
}
|
|
200
|
+
emptyResult(start) {
|
|
201
|
+
return {
|
|
202
|
+
changedFiles: [],
|
|
203
|
+
impactedFiles: [],
|
|
204
|
+
securityFindings: [],
|
|
205
|
+
architectureViolations: [],
|
|
206
|
+
summary: {
|
|
207
|
+
filesChanged: 0,
|
|
208
|
+
filesImpacted: 0,
|
|
209
|
+
securityIssues: 0,
|
|
210
|
+
archViolations: 0,
|
|
211
|
+
verdict: 'approve',
|
|
212
|
+
},
|
|
213
|
+
markdown: '## ✅ CSNS Review: No changes to review\n\nNo staged TypeScript/JavaScript files found.\n',
|
|
214
|
+
duration: Date.now() - start,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
//# sourceMappingURL=pr-reviewer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pr-reviewer.js","sourceRoot":"","sources":["../../src/orchestrator/pr-reviewer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Smart Scaffold — Brief'ten Multi-Entity Layered Code Generation
|
|
3
|
+
*
|
|
4
|
+
* EntityDetector sonuçlarını alıp her entity için:
|
|
5
|
+
* - Route (Express router + CRUD + relation endpoints)
|
|
6
|
+
* - Service (business logic)
|
|
7
|
+
* - Repository (data access)
|
|
8
|
+
* - Schema (Zod validation)
|
|
9
|
+
* - DB model (Drizzle-style)
|
|
10
|
+
* üretir.
|
|
11
|
+
*/
|
|
12
|
+
import type { EntityDetectionResult } from './entity-detector.js';
|
|
13
|
+
import type { ArchitectureDecisions } from '../types/index.js';
|
|
14
|
+
export interface SmartScaffoldResult {
|
|
15
|
+
files: string[];
|
|
16
|
+
routes: string[];
|
|
17
|
+
entities: string[];
|
|
18
|
+
detection: EntityDetectionResult;
|
|
19
|
+
}
|
|
20
|
+
export declare class SmartScaffold {
|
|
21
|
+
private root;
|
|
22
|
+
private detector;
|
|
23
|
+
constructor(projectRoot: string);
|
|
24
|
+
generate(brief: string, decisions: ArchitectureDecisions): Promise<SmartScaffoldResult>;
|
|
25
|
+
private writeConfig;
|
|
26
|
+
private writeApp;
|
|
27
|
+
private writeServer;
|
|
28
|
+
private writeHealthRoute;
|
|
29
|
+
private writeSchema;
|
|
30
|
+
private writeService;
|
|
31
|
+
private writeRepository;
|
|
32
|
+
private writeRoute;
|
|
33
|
+
private writeAuth;
|
|
34
|
+
private writeModels;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=smart-scaffold.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smart-scaffold.d.ts","sourceRoot":"","sources":["../../src/orchestrator/smart-scaffold.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,KAAK,EAAoC,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AACpG,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAE/D,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,EAAE,qBAAqB,CAAC;CAClC;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,QAAQ,CAAiB;gBAErB,WAAW,EAAE,MAAM;IAKzB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,qBAAqB,GAAG,OAAO,CAAC,mBAAmB,CAAC;YA4D/E,WAAW;YA4BX,QAAQ;YAyCR,WAAW;YAaX,gBAAgB;YAchB,WAAW;YA8BX,YAAY;YAqDZ,eAAe;YAyCf,UAAU;YA0DV,SAAS;YA+DT,WAAW;CAuC1B"}
|