@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.
@@ -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":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAiCtE,8DAA8D;AAC9D,WAAW;AACX,8DAA8D;AAE9D,MAAM,OAAO,UAAU;IACb,WAAW,CAAS;IACpB,QAAQ,CAAqB;IAErC,YAAY,WAAmB,EAAE,QAA6B;QAC5D,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,QAAQ,GAAG,QAAQ,IAAI,IAAI,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,QAAqB,QAAQ,EAAE,WAAoB;QAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEzB,gCAAgC;QAChC,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QAE9D,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC;QAED,uDAAuD;QACvD,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;QAEjE,2CAA2C;QAC3C,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;QAE/D,6CAA6C;QAC7C,MAAM,WAAW,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,YAAY,EAAE,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;QACtE,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;QAEjE,uBAAuB;QACvB,MAAM,WAAW,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,UAAU,CAAC;YACvE,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,UAAU,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;QACzE,MAAM,UAAU,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,IAAI,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC;YAC7F,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;QAExE,MAAM,OAAO,GACX,WAAW,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC;YACjC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;QAErC,uBAAuB;QACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CACpC,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,cAAc,EAAE,OAAO,CACvE,CAAC;QAEF,OAAO;YACL,YAAY;YACZ,aAAa;YACb,gBAAgB;YAChB,sBAAsB,EAAE,cAAc;YACtC,OAAO,EAAE;gBACP,YAAY,EAAE,YAAY,CAAC,MAAM;gBACjC,aAAa,EAAE,aAAa,CAAC,MAAM;gBACnC,cAAc,EAAE,gBAAgB,CAAC,MAAM;gBACvC,cAAc,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,MAAM;gBAClE,OAAO;aACR;YACD,QAAQ;YACR,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;SAC7B,CAAC;IACJ,CAAC;IAED,8DAA8D;IAC9D,kBAAkB;IAClB,8DAA8D;IAEtD,eAAe,CAAC,KAAkB,EAAE,WAAoB;QAC9D,IAAI,GAAW,CAAC;QAChB,QAAQ,KAAK,EAAE,CAAC;YACd,KAAK,QAAQ;gBACX,GAAG,GAAG,kDAAkD,CAAC;gBACzD,MAAM;YACR,KAAK,KAAK;gBACR,GAAG,GAAG,8CAA8C,CAAC;gBACrD,MAAM;YACR,KAAK,QAAQ;gBACX,GAAG,GAAG,2CAA2C,WAAW,IAAI,cAAc,EAAE,CAAC;gBACjF,MAAM;QACV,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;YAC5F,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;iBAC7B,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;iBACzB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACnD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,8DAA8D;IAC9D,kBAAkB;IAClB,8DAA8D;IAEtD,KAAK,CAAC,iBAAiB,CAAC,YAAsB;QACpD,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACtD,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC;QAE9C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;QACnC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC;QAEzC,0DAA0D;QAC1D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;gBAChE,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QAED,sDAAsD;QACtD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC5F,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QAED,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC;IACvB,CAAC;IAED,8DAA8D;IAC9D,iBAAiB;IACjB,8DAA8D;IAEtD,KAAK,CAAC,YAAY,CAAC,KAAe;QACxC,MAAM,OAAO,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;QACpC,2CAA2C;QAC3C,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnG,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAAC,KAAe;QAC7C,MAAM,OAAO,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QACrC,8CAA8C;QAC9C,OAAO,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAClC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC,CACvF,CAAC;IACJ,CAAC;IAED,8DAA8D;IAC9D,sBAAsB;IACtB,8DAA8D;IAEtD,gBAAgB,CACtB,OAAiB,EACjB,QAAkB,EAClB,QAA2B,EAC3B,IAA6B,EAC7B,OAA2C;QAE3C,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,SAAS;QACT,MAAM,WAAW,GAAG,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,KAAK,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QAC9F,MAAM,WAAW,GAAG,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC;YACpE,OAAO,KAAK,iBAAiB,CAAC,CAAC,CAAC,2CAA2C,CAAC,CAAC;gBAC7E,mCAAmC,CAAC;QACtC,KAAK,CAAC,IAAI,CAAC,MAAM,WAAW,iBAAiB,WAAW,IAAI,CAAC,CAAC;QAE9D,UAAU;QACV,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,qBAAqB,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;QACpD,KAAK,CAAC,IAAI,CAAC,sBAAsB,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAC;QACtD,KAAK,CAAC,IAAI,CAAC,yBAAyB,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAC;QACzD,KAAK,CAAC,IAAI,CAAC,2BAA2B,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;QACpF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEf,gBAAgB;QAChB,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACrC,KAAK,MAAM,CAAC,IAAI,OAAO;YAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAClD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEf,SAAS;QACT,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;YACnD,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAChE,IAAI,QAAQ,CAAC,MAAM,GAAG,EAAE;gBAAE,KAAK,CAAC,IAAI,CAAC,UAAU,QAAQ,CAAC,MAAM,GAAG,EAAE,OAAO,CAAC,CAAC;YAC5E,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;QAED,oBAAoB;QACpB,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;YACzC,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACzB,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;gBACrH,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;gBAC5F,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;gBACjC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;gBAClC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC;gBAC5D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjB,CAAC;QACH,CAAC;QAED,gDAAgD;QAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;QACnD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;YAC5C,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACzB,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;gBACvF,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;gBACtD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;gBACjC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC;gBACpD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjB,CAAC;QACH,CAAC;QAED,2BAA2B;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;QAC/C,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,KAAK,CAAC,IAAI,CAAC,uBAAuB,KAAK,CAAC,MAAM,uDAAuD,CAAC,CAAC;YACvG,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;gBACtB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,iBAAiB,IAAI,iBAAiB,EAAE,CAAC,CAAC;YAClG,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC/B,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAEO,WAAW,CAAC,KAAa;QAC/B,OAAO;YACL,YAAY,EAAE,EAAE;YAChB,aAAa,EAAE,EAAE;YACjB,gBAAgB,EAAE,EAAE;YACpB,sBAAsB,EAAE,EAAE;YAC1B,OAAO,EAAE;gBACP,YAAY,EAAE,CAAC;gBACf,aAAa,EAAE,CAAC;gBAChB,cAAc,EAAE,CAAC;gBACjB,cAAc,EAAE,CAAC;gBACjB,OAAO,EAAE,SAAS;aACnB;YACD,QAAQ,EAAE,0FAA0F;YACpG,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;SAC7B,CAAC;IACJ,CAAC;CACF"}
@@ -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"}