@theone1345/smartrelay 0.2.0 → 0.3.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 (51) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +127 -17
  3. package/config/runners/agents.yaml +14 -1
  4. package/dist/credentials.d.ts +94 -0
  5. package/dist/credentials.js +168 -0
  6. package/dist/credentials.js.map +1 -0
  7. package/dist/http-api.d.ts +1 -7
  8. package/dist/http-api.js +6 -169
  9. package/dist/http-api.js.map +1 -1
  10. package/dist/index.d.ts +3 -1
  11. package/dist/index.js +5 -1
  12. package/dist/index.js.map +1 -1
  13. package/dist/install.d.ts +57 -0
  14. package/dist/install.js +216 -0
  15. package/dist/install.js.map +1 -0
  16. package/dist/logger.d.ts +2 -0
  17. package/dist/logger.js +21 -1
  18. package/dist/logger.js.map +1 -1
  19. package/dist/profiles/review-profiles.d.ts +32 -0
  20. package/dist/profiles/review-profiles.js +348 -0
  21. package/dist/profiles/review-profiles.js.map +1 -0
  22. package/dist/router.js +18 -3
  23. package/dist/router.js.map +1 -1
  24. package/dist/runners/anthropic.js +2 -3
  25. package/dist/runners/anthropic.js.map +1 -1
  26. package/dist/runners/base.d.ts +8 -0
  27. package/dist/runners/base.js +13 -0
  28. package/dist/runners/base.js.map +1 -1
  29. package/dist/runners/openai.js +2 -3
  30. package/dist/runners/openai.js.map +1 -1
  31. package/dist/runners/registry.d.ts +2 -0
  32. package/dist/runners/registry.js +4 -0
  33. package/dist/runners/registry.js.map +1 -1
  34. package/dist/server.d.ts +1 -6
  35. package/dist/server.js +134 -66
  36. package/dist/server.js.map +1 -1
  37. package/dist/setup.d.ts +65 -0
  38. package/dist/setup.js +411 -0
  39. package/dist/setup.js.map +1 -0
  40. package/dist/tools/dispatch.d.ts +33 -0
  41. package/dist/tools/dispatch.js +222 -0
  42. package/dist/tools/dispatch.js.map +1 -0
  43. package/dist/tools/handlers.d.ts +8 -2
  44. package/dist/tools/handlers.js +119 -27
  45. package/dist/tools/handlers.js.map +1 -1
  46. package/dist/util.d.ts +37 -4
  47. package/dist/util.js +71 -15
  48. package/dist/util.js.map +1 -1
  49. package/package.json +28 -3
  50. package/prompts/code_review.md +26 -20
  51. package/prompts/security_audit.md +109 -0
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Dynamic, Language-Aware Review Profiles.
3
+ *
4
+ * Provides specialized personas, inspection vectors, and verification commands
5
+ * tailored to specific programming languages and frameworks (Flutter/Dart,
6
+ * TypeScript/JavaScript, Python, Go, Rust, and Universal).
7
+ */
8
+ export interface ReviewProfile {
9
+ id: string;
10
+ name: string;
11
+ aliases: string[];
12
+ extensions: string[];
13
+ systemPersona: string;
14
+ inspectionVectors: string[];
15
+ verificationCommands: string[];
16
+ }
17
+ export declare const PROFILES: Record<string, ReviewProfile>;
18
+ /**
19
+ * Detect language from file path extension or source code heuristics.
20
+ */
21
+ export declare function detectLanguage(code: string, filePath?: string): string;
22
+ /**
23
+ * Resolve the appropriate ReviewProfile by identifier, alias, or file extension.
24
+ */
25
+ export declare function getReviewProfile(identifier?: string): ReviewProfile;
26
+ /**
27
+ * Assemble a complete, language-tailored review prompt and dynamic system prompt.
28
+ */
29
+ export declare function buildReviewPrompt(profile: ReviewProfile, code: string, focus: string, targetName?: string): {
30
+ taskPrompt: string;
31
+ systemPrompt: string;
32
+ };
@@ -0,0 +1,348 @@
1
+ /**
2
+ * Dynamic, Language-Aware Review Profiles.
3
+ *
4
+ * Provides specialized personas, inspection vectors, and verification commands
5
+ * tailored to specific programming languages and frameworks (Flutter/Dart,
6
+ * TypeScript/JavaScript, Python, Go, Rust, and Universal).
7
+ */
8
+ import path from 'path';
9
+ export const PROFILES = {
10
+ flutter: {
11
+ id: 'flutter',
12
+ name: 'Flutter / Dart',
13
+ aliases: ['flutter', 'dart'],
14
+ extensions: ['.dart'],
15
+ systemPersona: 'You are a Principal Code Reviewer & Systems Architect specializing in Flutter/Dart.',
16
+ inspectionVectors: [
17
+ 'Resource Cleanup & Memory: Un-disposed controllers (TextEditingController, ScrollController, AnimationController), uncancelled StreamSubscriptions/Timers, or setState() called after dispose without `if (mounted)`.',
18
+ 'Security & Secrets: Hardcoded API keys, private tokens, credentials, sensitive URLs, injection flaws, or insecure local storage.',
19
+ 'Null Safety & Type Robustness: Dangerous null assertion operators (`!`), unsafe dynamic JSON casting (e.g. use `(json[\'key\'] as num?)?.toDouble() ?? 0.0`), and unhandled nullable values. Do NOT flag `!` where nullability is already provably eliminated by a prior guard.',
20
+ 'State & Error Resilience: Unhandled async Future/Stream exceptions, missing BLoC/StateNotifier error states, or UI missing failure/retry mechanisms.',
21
+ 'Performance & Widget Efficiency: Missing `const` constructors on immutable subtrees, heavy allocations/computations inside build(), and unnecessary widget rebuilds.',
22
+ ],
23
+ verificationCommands: ['flutter analyze', 'flutter test'],
24
+ },
25
+ typescript: {
26
+ id: 'typescript',
27
+ name: 'TypeScript / JavaScript',
28
+ aliases: ['typescript', 'javascript', 'ts', 'js', 'tsx', 'jsx', 'node'],
29
+ extensions: ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs'],
30
+ systemPersona: 'You are a Principal Code Reviewer & Systems Architect specializing in TypeScript, Node.js, and Modern Web Architecture.',
31
+ inspectionVectors: [
32
+ 'Resource Cleanup & Memory: Unclosed database connections, dangling event listeners / event emitters, uncleared setInterval/setTimeout, and memory leaks from unbounded closures or caches.',
33
+ 'Security & Secrets: Hardcoded secrets / tokens, SQL / NoSQL / Command injection, prototype pollution, cross-site scripting (XSS), path traversal, and unvalidated user input.',
34
+ 'Type Safety & Contracts: Loose or unnecessary use of `any`, unsafe type assertions (`as unknown as T`), missing runtime schema validation (Zod/Valibot) at network boundaries, and dangerous non-null assertions (`!`).',
35
+ 'Async & Concurrency: Unhandled Promise rejections, unawaited async operations in loops, race conditions in shared state, missing try/catch around network/IO, and unhandled AbortSignals.',
36
+ 'Performance & Clean Architecture: Event loop blocking synchronous calls, unnecessary heavy imports/bundle bloat, inefficient array iterations (N+1 operations), and violation of separation of concerns.',
37
+ ],
38
+ verificationCommands: ['npm run typecheck # or: npx tsc --noEmit', 'npm test'],
39
+ },
40
+ python: {
41
+ id: 'python',
42
+ name: 'Python',
43
+ aliases: ['python', 'py'],
44
+ extensions: ['.py', '.pyw', '.pyi'],
45
+ systemPersona: 'You are a Principal Code Reviewer & Systems Architect specializing in Python, High-Performance Backends, and Modern Data Systems.',
46
+ inspectionVectors: [
47
+ 'Resource Management: Unclosed file handles, database connections, or HTTP client sessions (prefer context managers `with ...:`).',
48
+ 'Security & Secrets: Hardcoded credentials, SQL injection (string concatenation in queries), insecure deserialization (`pickle.loads`), command injection (`shell=True`), and weak hashing algorithms.',
49
+ 'Language Pitfalls & Idioms: Mutable default arguments (`def func(items=[])`), broad exception handling (`except Exception:` or bare `except:` masking system exits), and improper mutable class attributes.',
50
+ 'Async & Concurrency: Blocking I/O or CPU-bound loops in `asyncio` event loops, race conditions with shared variables, and unawaited coroutines.',
51
+ 'Type Safety & Code Quality: Missing or inconsistent type annotations (`typing`), inefficient list/dict comprehension patterns, and failure to leverage generator streams for large datasets.',
52
+ ],
53
+ verificationCommands: ['pytest', 'ruff check .', 'mypy .'],
54
+ },
55
+ go: {
56
+ id: 'go',
57
+ name: 'Go (Golang)',
58
+ aliases: ['go', 'golang'],
59
+ extensions: ['.go'],
60
+ systemPersona: 'You are a Principal Code Reviewer & Systems Architect specializing in Go, Distributed Systems, and High-Throughput Microservices.',
61
+ inspectionVectors: [
62
+ 'Resource Cleanup & Goroutines: Goroutine leaks (launching goroutines without lifecycle management or exit channels), unclosed `resp.Body` or file descriptors (`defer resp.Body.Close()`), and unbounded channels.',
63
+ 'Concurrency & Synchronization: Data races on shared memory without proper `sync.Mutex` / atomic primitives, deadlocks from mutex lock ordering, and incorrect wait group (`sync.WaitGroup`) usage.',
64
+ 'Error Handling: Ignored or unchecked error returns (`_ = err`), improper error wrapping (missing `%w` in `fmt.Errorf`), and premature panics instead of returning errors.',
65
+ 'Security & Input: SQL injection, unvalidated external endpoints, path traversal, and hardcoded secrets or environment variables.',
66
+ 'Performance & Allocations: Unnecessary heap allocations escaping the stack, missing capacity pre-allocation in slices (`make([]T, 0, cap)`), and excessive synchronization overhead.',
67
+ ],
68
+ verificationCommands: ['go vet ./...', 'go test -race ./...'],
69
+ },
70
+ rust: {
71
+ id: 'rust',
72
+ name: 'Rust',
73
+ aliases: ['rust', 'rs'],
74
+ extensions: ['.rs'],
75
+ systemPersona: 'You are a Principal Code Reviewer & Systems Architect specializing in Rust, Systems Programming, and Memory Safety.',
76
+ inspectionVectors: [
77
+ 'Safety & Unsafe Code: Unsound or unjustified `unsafe` blocks, missing safety invariant comments, dereferencing raw pointers, and undefined behavior.',
78
+ 'Error & Panic Resilience: Unhandled `.unwrap()` / `.expect()` calls in production paths that could panic, inadequate custom error types using `thiserror` / `anyhow`.',
79
+ 'Memory & Allocations: Excessive `.clone()` calls, unnecessary heap allocations (`Box`, `Vec`) where borrowing or stack allocation is sufficient, and reference cycle memory leaks with `Rc`/`Arc`.',
80
+ 'Concurrency: Lock contention on `Mutex`/`RwLock`, potential deadlocks, and cross-thread sync correctness.',
81
+ 'Security & Secrets: Sensitive data left unzeroed in memory, hardcoded secrets, and unsafe FFI bindings.',
82
+ ],
83
+ verificationCommands: ['cargo clippy -- -D warnings', 'cargo test'],
84
+ },
85
+ java: {
86
+ id: 'java',
87
+ name: 'Java / JVM',
88
+ aliases: ['java', 'jvm'],
89
+ extensions: ['.java'],
90
+ systemPersona: 'You are a Principal Code Reviewer & Systems Architect specializing in Java, Spring Boot, and Enterprise JVM Architecture.',
91
+ inspectionVectors: [
92
+ 'Resource & Memory Management: Unclosed `InputStream`, `Connection`, or `Statement` (enforce try-with-resources `try (...)`), uncancelled ExecutorService threads, and ThreadLocal memory leaks.',
93
+ 'Concurrency & Thread Safety: Unsynchronized mutations of shared state, improper use of `volatile`, race conditions, and thread pool exhaustion.',
94
+ 'Null Safety & Contracts: NullPointerException hazards, lack of `@NonNull`/`@Nullable` annotations, improper use of `Optional.get()` without `isPresent()`.',
95
+ 'Security: SQL injection (string concatenation in JDBC/JPQL), unsafe reflection/deserialization, hardcoded credentials, and path traversal.',
96
+ 'Performance: Inefficient JPA/Hibernate N+1 query patterns, excessive object creation in high-throughput loops, and string concatenation inside loops (use `StringBuilder`).',
97
+ ],
98
+ verificationCommands: ['mvn clean test-compile test', 'mvn spotbugs:check', './gradlew test'],
99
+ },
100
+ kotlin: {
101
+ id: 'kotlin',
102
+ name: 'Kotlin / Android',
103
+ aliases: ['kotlin', 'kt', 'kts', 'android'],
104
+ extensions: ['.kt', '.kts'],
105
+ systemPersona: 'You are a Principal Code Reviewer & Systems Architect specializing in Kotlin, Coroutines, and Modern Android Architecture.',
106
+ inspectionVectors: [
107
+ 'Coroutines & Scopes: Leaked coroutines using `GlobalScope`, unhandled `CancellationException`, improper Dispatchers (blocking I/O on `Dispatchers.Main`), and unhandled supervisor jobs.',
108
+ 'Android Lifecycle & Memory: Leaking Context/Activity/View in static singletons or background callbacks, missing observer teardown in `onDestroyView`.',
109
+ 'Null Safety & Types: Dangerous non-null assertions (`!!`), unsafe platform type handling, and unhandled `null` from Java interoperability.',
110
+ 'State & Compose: Unstable composable parameters triggering recomposition storms, missing `remember` / `derivedStateOf`, and ViewModel state exposure as mutable state.',
111
+ 'Security & Storage: Unencrypted SharedPreferences, insecure PendingIntent flags, exported components without permissions, and hardcoded secrets.',
112
+ ],
113
+ verificationCommands: ['./gradlew test', './gradlew lint'],
114
+ },
115
+ swift: {
116
+ id: 'swift',
117
+ name: 'Swift / iOS',
118
+ aliases: ['swift', 'ios'],
119
+ extensions: ['.swift'],
120
+ systemPersona: 'You are a Principal Code Reviewer & Systems Architect specializing in Swift, Modern Concurrency, and iOS Architecture.',
121
+ inspectionVectors: [
122
+ 'Memory & Retain Cycles: Strong reference cycles in closures (missing `[weak self]`), delegate properties not marked `weak`, and unmanaged timers.',
123
+ 'Concurrency & Actors: Thread race conditions, blocking main thread with sync calls, misuse of `Task.detached`, actor isolation violations, and `Task` lifecycle leaks.',
124
+ 'Safety & Optionals: Dangerous forced unwrapping (`!`), forced downcasting (`as!`), and unhandled `try!` in non-test production code.',
125
+ 'SwiftUI / UIKit Lifecycle: Heavy allocations in `View.body`, missing `@MainActor` on UI classes/view models, and uncancelled Combine cancellables (`Set<AnyCancellable>`).',
126
+ 'Security & Keychain: Insecure UserDefaults storage of sensitive tokens (must use Keychain), missing App Transport Security configuration, and hardcoded secrets.',
127
+ ],
128
+ verificationCommands: ['swift test', 'xcodebuild test -scheme YourApp -destination "platform=iOS Simulator,name=iPhone 16"'],
129
+ },
130
+ cpp: {
131
+ id: 'cpp',
132
+ name: 'C / C++',
133
+ aliases: ['cpp', 'c', 'cxx', 'cc', 'c++'],
134
+ extensions: ['.cpp', '.c', '.cc', '.cxx', '.h', '.hpp', '.hxx'],
135
+ systemPersona: 'You are a Principal Code Reviewer & Systems Architect specializing in C/C++, Systems Engineering, and Memory Safety.',
136
+ inspectionVectors: [
137
+ 'Memory Safety: Buffer overflows, off-by-one errors, use-after-free, double free, and memory leaks (enforce RAII, `std::unique_ptr`, `std::shared_ptr`).',
138
+ 'Undefined Behavior: Uninitialized variables, signed integer overflow, null pointer dereferences, out-of-bounds pointer arithmetic, and strict aliasing violations.',
139
+ 'Concurrency & Multi-Threading: Data races on shared memory without `std::atomic` or `std::mutex`, deadlocks from lock ordering, and condition variable spurious wakeups.',
140
+ 'Resource Management: Leaked sockets/file descriptors, improper destructor exception throwing (destructors must be `noexcept`).',
141
+ 'Modern Idioms & Performance: Pass-by-value of heavy objects (use `const T&` or `std::move`), virtual destructor omissions in base classes, and cache-unfriendly data layouts.',
142
+ ],
143
+ verificationCommands: ['cmake --build build --target test', 'clang-tidy -p build', 'valgrind --leak-check=full ./build/test_runner'],
144
+ },
145
+ general: {
146
+ id: 'general',
147
+ name: 'General / Multi-Language',
148
+ aliases: ['general', 'generic', 'universal', 'auto'],
149
+ extensions: [],
150
+ systemPersona: 'You are a Principal Code Reviewer & Systems Architect with deep expertise across modern programming languages.',
151
+ inspectionVectors: [
152
+ 'Resource Cleanup & Memory: Leaked connections, unclosed handles, uncancelled background tasks, and unmanaged memory allocations.',
153
+ 'Security & Secrets: Hardcoded API keys, credentials, sensitive URLs, injection flaws (SQL/Command/XSS), and insecure data storage.',
154
+ 'Type Safety & Boundary Contracts: Loose typing, unhandled null/undefined values, and lack of defensive boundary validation on external inputs.',
155
+ 'Error Resilience: Unhandled exceptions, silent failures, missing retry or fallback mechanisms, and ambiguous error propagation.',
156
+ 'Performance & Clean Architecture: High algorithmic complexity (O(N^2) or worse where O(N) is feasible), unneeded heavy allocations, and coupling violations.',
157
+ ],
158
+ verificationCommands: ['Run project linter (e.g. linter / analyze)', 'Run project test suite (e.g. test runner)'],
159
+ },
160
+ };
161
+ /**
162
+ * Detect language from file path extension or source code heuristics.
163
+ */
164
+ export function detectLanguage(code, filePath) {
165
+ if (filePath) {
166
+ const ext = path.extname(filePath).toLowerCase();
167
+ for (const profile of Object.values(PROFILES)) {
168
+ if (profile.extensions.includes(ext)) {
169
+ return profile.id;
170
+ }
171
+ }
172
+ }
173
+ // Code heuristic detection (scanning up to 5000 chars, stripping initial comment headers)
174
+ let sample = code.slice(0, 5000);
175
+ // Strip leading multiline or single line comments if dominant at file head
176
+ sample = sample.replace(/^\s*\/\*[\s\S]*?\*\//, '').replace(/^\s*(\/\/[^\n]*\n)+/, '');
177
+ // Flutter / Dart heuristics
178
+ if (/import\s+['"]package:(flutter|[a-zA-Z0-9_]+)\//.test(sample) ||
179
+ /\b(Widget|StatelessWidget|StatefulWidget|BuildContext|StateNotifier|TextEditingController)\b/.test(sample) ||
180
+ (/void\s+main\(\s*\)\s*\{/.test(sample) && /\b(runApp|WidgetsFlutterBinding)\b/.test(sample))) {
181
+ return 'flutter';
182
+ }
183
+ // Go heuristics (Go packages are single identifiers, no dots, no semicolons, followed by func/import)
184
+ if ((/^\s*package\s+[a-zA-Z0-9_]+\s*$/m.test(sample) && /\bfunc\b/.test(sample)) ||
185
+ /\bfunc\s+(\([a-zA-Z0-9_* ]+\)\s+)?[a-zA-Z0-9_]+\(.*\)\s*(\([a-zA-Z0-9_*, ]+\)|[a-zA-Z0-9_*]+)?\s*\{/.test(sample)) {
186
+ return 'go';
187
+ }
188
+ // Rust heuristics
189
+ if (/\b(fn\s+[a-zA-Z0-9_]+|impl(\s+<.*>)?|pub\s+fn|use\s+std::|match\s+[a-zA-Z0-9_]+)\b/.test(sample) &&
190
+ /->\s*[a-zA-Z0-9_&<>]/.test(sample)) {
191
+ return 'rust';
192
+ }
193
+ // Swift heuristics
194
+ if (/\bimport\s+(UIKit|SwiftUI|Foundation|Combine|AppKit)\b/.test(sample) ||
195
+ /\b(guard\s+let\s+[a-zA-Z0-9_]+\s*=|@State|@Binding|@Published|struct\s+[a-zA-Z0-9_]+\s*:\s*View)\b/.test(sample)) {
196
+ return 'swift';
197
+ }
198
+ // Java heuristics (Java packages end with semicolon, public class/interface, Spring annotations)
199
+ if (/^\s*package\s+[a-zA-Z0-9_.]+\s*;/m.test(sample) ||
200
+ /\b(public\s+(class|interface|enum|record)\s+[a-zA-Z0-9_]+|public\s+static\s+void\s+main|@Override|@SpringBootApplication)\b/.test(sample)) {
201
+ return 'java';
202
+ }
203
+ // Kotlin heuristics (fun, val/var, data class, suspend fun)
204
+ if (/\b(fun\s+[a-zA-Z0-9_]+\(|val\s+[a-zA-Z0-9_]+\s*[:=]|suspend\s+fun|data\s+class)\b/.test(sample) ||
205
+ /^\s*package\s+[a-zA-Z0-9_.]+\s*$/m.test(sample)) {
206
+ return 'kotlin';
207
+ }
208
+ // C / C++ heuristics
209
+ if (/^\s*#include\s+[<"][a-zA-Z0-9_./]+[>"]/m.test(sample) ||
210
+ /\b(std::(cout|vector|string|unique_ptr|shared_ptr)|int\s+main\s*\(\s*(int\s+argc)?)/.test(sample)) {
211
+ return 'cpp';
212
+ }
213
+ // Python heuristics
214
+ if (/^\s*(def\s+[a-zA-Z0-9_]+\(|import\s+[a-zA-Z0-9_]+|from\s+[a-zA-Z0-9_.]+\s+import)/m.test(sample) ||
215
+ /\bself\.[a-zA-Z0-9_]+/.test(sample) ||
216
+ /if\s+__name__\s*==\s*['"]__main__['"]/.test(sample)) {
217
+ return 'python';
218
+ }
219
+ // TypeScript / JavaScript heuristics
220
+ if (/\b(interface|type|export\s+(default\s+)?(class|function|const)|import\s+.*\s+from\s+['"].*['"]|const\s+[a-zA-Z0-9_]+\s*:\s*[A-Z][a-zA-Z0-9_<>]+)\b/.test(sample) ||
221
+ /\b(async\s+function|Promise<|console\.log|function\s*\()/m.test(sample)) {
222
+ return 'typescript';
223
+ }
224
+ return 'general';
225
+ }
226
+ /**
227
+ * Resolve the appropriate ReviewProfile by identifier, alias, or file extension.
228
+ */
229
+ export function getReviewProfile(identifier) {
230
+ const defaultProfile = PROFILES['general'];
231
+ if (!identifier || identifier.toLowerCase() === 'auto') {
232
+ return defaultProfile;
233
+ }
234
+ const normalized = identifier.toLowerCase().trim();
235
+ // Match by id or alias
236
+ for (const profile of Object.values(PROFILES)) {
237
+ if (profile.id === normalized || profile.aliases.includes(normalized)) {
238
+ return profile;
239
+ }
240
+ }
241
+ // Match by extension
242
+ const ext = normalized.startsWith('.') ? normalized : `.${normalized}`;
243
+ for (const profile of Object.values(PROFILES)) {
244
+ if (profile.extensions.includes(ext)) {
245
+ return profile;
246
+ }
247
+ }
248
+ return defaultProfile;
249
+ }
250
+ /**
251
+ * Assemble a complete, language-tailored review prompt and dynamic system prompt.
252
+ */
253
+ export function buildReviewPrompt(profile, code, focus, targetName) {
254
+ const scopeName = targetName ? `**\`${targetName}\`**` : 'the provided code';
255
+ const scopeHeader = targetName
256
+ ? `${targetName} (${profile.name} Profile)`
257
+ : `${profile.name} Code Snippet`;
258
+ const vectorsFormatted = profile.inspectionVectors
259
+ .map((v, i) => `${i + 1}. ${v}`)
260
+ .join('\n');
261
+ const verificationFormatted = profile.verificationCommands.join('\n');
262
+ const systemPrompt = `${profile.systemPersona}\n\n` +
263
+ `CRITICAL INSPECTION VECTORS (${profile.name}):\n` +
264
+ `${vectorsFormatted}\n\n` +
265
+ 'GROUNDING & FALSE-POSITIVE SUPPRESSION RULES:\n' +
266
+ '1. Only report issues you can point to directly in the provided code.\n' +
267
+ '2. NEVER flag missing imports, missing functions, or truncated dependencies when reviewing an isolated snippet or partial file.\n' +
268
+ '3. If an issue is uncertain without broader project context, downgrade it to a 💡 Suggestion or omit it entirely.\n' +
269
+ '4. Diffs MUST include 1-2 lines of unchanged surrounding context so developers or automated patch tools can cleanly locate the fix.\n' +
270
+ '5. Diffs must be syntactically valid code. NEVER use placeholder comments like `// ... rest of code` inside replacement lines.\n\n' +
271
+ 'OUTPUT TEMPLATE:\n' +
272
+ 'You MUST format your entire response strictly following this structure:\n\n' +
273
+ '# 🛡️ Code Review Report\n' +
274
+ `**Scope**: ${scopeHeader}\n` +
275
+ '**Overall Health Score**: [SCORE]/100 ([GRADE])\n\n' +
276
+ '> **How the score is computed (deterministic rubric):**\n' +
277
+ '> Start at **100**, then subtract per finding:\n' +
278
+ '> - 🚨 Blocker: **−20** each\n' +
279
+ '> - ⚠️ Warning: **−8** each\n' +
280
+ '> - 💡 Suggestion: **−2** each\n' +
281
+ '> - ✅ Commendation: **0** (no effect on score)\n' +
282
+ '>\n' +
283
+ '> Clamp the result to the range **0–100**.\n' +
284
+ '> **Grade mapping:** `A+` = 97–100, `A` = 90–96, `B` = 80–89, `C` = 70–79, `D` = 60–69, `F` = 0–59.\n\n' +
285
+ '---\n\n' +
286
+ '## 📊 Summary of Findings\n' +
287
+ '| Severity | Count | Status |\n' +
288
+ '| :--- | :--- | :--- |\n' +
289
+ '| 🚨 **Blockers** | [Count] | [e.g. Needs immediate fix / None] |\n' +
290
+ '| ⚠️ **Warnings** | [Count] | [e.g. Action required / None] |\n' +
291
+ '| 💡 **Suggestions** | [Count] | Optional improvements |\n' +
292
+ '| ✅ **Commendations** | [Count] | Clean Architecture patterns |\n\n' +
293
+ '---\n\n' +
294
+ '## 🚨 Blockers (Must Fix)\n' +
295
+ '- `[Category] [Line / Anchor]`: One-sentence problem description.\n' +
296
+ ' ```diff\n' +
297
+ ' // 1-2 lines of unchanged surrounding context\n' +
298
+ ' - old bad line\n' +
299
+ ' + new fixed line\n' +
300
+ ' // 1-2 lines of unchanged surrounding context\n' +
301
+ ' ```\n' +
302
+ '(If none, write: `None identified.`)\n\n' +
303
+ '---\n\n' +
304
+ '## ⚠️ Warnings (Potential Bugs / Edge Cases)\n' +
305
+ '- `[Category] [Line / Anchor]`: One-sentence problem description.\n' +
306
+ ' ```diff\n' +
307
+ ' // 1-2 lines of unchanged surrounding context\n' +
308
+ ' - old bad line\n' +
309
+ ' + new fixed line\n' +
310
+ ' // 1-2 lines of unchanged surrounding context\n' +
311
+ ' ```\n' +
312
+ '(If none, write: `None identified.`)\n\n' +
313
+ '---\n\n' +
314
+ '## 💡 Suggestions & Minor Optimizations\n' +
315
+ '- `[Category] [Line / Anchor]`: One-sentence improvement recommendation.\n' +
316
+ ' ```diff\n' +
317
+ ' // 1-2 lines of unchanged surrounding context\n' +
318
+ ' - old line\n' +
319
+ ' + improved line\n' +
320
+ ' // 1-2 lines of unchanged surrounding context\n' +
321
+ ' ```\n' +
322
+ '(If none, write: `None identified.`)\n\n' +
323
+ '---\n\n' +
324
+ '## ✅ Commendations & Best Practices\n' +
325
+ '- `[Category] [Line / Anchor]`: Positive architectural pattern or clean coding practice observed.\n' +
326
+ '(If none, write: `Standard implementation.`)\n\n' +
327
+ '---\n\n' +
328
+ '## 🛠️ Verification Commands\n' +
329
+ '```bash\n' +
330
+ `${verificationFormatted}\n` +
331
+ '```\n\n' +
332
+ 'CRITICAL RULES:\n' +
333
+ '- Output ONLY the template above starting directly with `# 🛡️ Code Review Report`.\n' +
334
+ '- NEVER echo, reproduce, or rewrite the full source code file.\n' +
335
+ '- NEVER include internal thinking process, conversational greetings, intro text, or closing fluff.\n' +
336
+ '- Accurately compute the score and grade based on the findings count.';
337
+ const taskPrompt = `Perform a comprehensive code review of ${scopeName} focusing on: ${focus}.\n\n` +
338
+ `Language Profile: ${profile.name}\n\n` +
339
+ 'Format the output strictly using the `# 🛡️ Code Review Report` template with Health Score, ' +
340
+ 'Summary Table, 🚨 Blockers, ⚠️ Warnings, 💡 Suggestions, ✅ Commendations, and 🛠️ Verification Commands.\n\n' +
341
+ 'STRICT RULES:\n' +
342
+ '- Begin directly with `# 🛡️ Code Review Report`.\n' +
343
+ '- NEVER output or rewrite the entire source code file.\n' +
344
+ '- NEVER include internal thinking process, conversational greetings, or closing text.\n\n' +
345
+ `\`\`\`\n${code}\n\`\`\``;
346
+ return { taskPrompt, systemPrompt };
347
+ }
348
+ //# sourceMappingURL=review-profiles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-profiles.js","sourceRoot":"","sources":["../../src/profiles/review-profiles.ts"],"names":[],"mappings":"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"}
package/dist/router.js CHANGED
@@ -85,6 +85,8 @@ const ROLE_SHORTCUTS = [
85
85
  ['review', 'code-review-agent'],
86
86
  ['test', 'test-generator-agent'],
87
87
  ['explain', 'explain-agent'],
88
+ ['security', 'security-agent'],
89
+ ['audit', 'security-agent'],
88
90
  ];
89
91
  /** Preferred defaults, in priority order, when no `default_runner` is configured. */
90
92
  const PREFERRED_DEFAULTS = [
@@ -100,8 +102,14 @@ const PLAN_KEYWORDS = [
100
102
  'plan', 'roadmap', 'architecture', 'break down', 'design plan',
101
103
  'implementation plan', 'strategy', 'phases', 'step-by-step plan',
102
104
  ];
105
+ const SECURITY_KEYWORDS = [
106
+ 'security', 'vulnerability', 'cve', 'owasp', 'penetration',
107
+ 'exploit', 'injection', 'xss', 'csrf', 'secret leak',
108
+ 'hardcoded secret', 'auth flaw', 'privilege escalation',
109
+ 'security audit', 'threat model', 'insecure',
110
+ ];
103
111
  const REVIEW_KEYWORDS = [
104
- 'review', 'audit', 'critique', 'vulnerability', 'security',
112
+ 'review', 'critique',
105
113
  'edge case', 'smell', 'refactor', 'race condition', 'memory leak',
106
114
  'optimize', 'performance issue', 'bug in', 'check this code',
107
115
  ];
@@ -145,10 +153,11 @@ export class TaskRouter {
145
153
  '| **`Switch to nvidia`** | Nemotron 3 Super 120B (NVIDIA NIM) | Heavyweight Cloud Agent |',
146
154
  '| **`Switch to claude`** | Claude Sonnet 4.5 / 3.7 | Elite Code & Review |',
147
155
  '| **`Switch to ollama`** | Qwen 2.5 Coder (Local Ollama) | Free $0.00 Offline Runner |',
156
+ '| **`Switch to security`** | Nemotron 3 Super 120B (NVIDIA NIM) | Dedicated AppSec & Threat Auditor |',
148
157
  '| **`Switch to auto`** | Smart Intent Routing (default) | Automatic Agent Routing |',
149
158
  '| **`Switch to direct`** | Native Claude Intelligence | Bypass Sub-Agents |',
150
159
  '',
151
- "💡 *Tip: Say 'Switch to deepseek', 'Switch to qwen', or 'Switch to openrouter' anytime.*",
160
+ "💡 *Tip: Say 'Switch to deepseek', 'Switch to security', or 'Switch to openrouter' anytime.*",
152
161
  ];
153
162
  return lines.join('\n');
154
163
  }
@@ -263,7 +272,13 @@ export class TaskRouter {
263
272
  }
264
273
  const taskLower = task.toLowerCase();
265
274
  const matches = (keywords) => keywords.some((keyword) => taskLower.includes(keyword));
266
- // 3. Planning / architecture intent.
275
+ // 3. Security audit intent.
276
+ if (matches(SECURITY_KEYWORDS)) {
277
+ const runner = this.registry.get('security-agent');
278
+ if (runner)
279
+ return runner;
280
+ }
281
+ // 4. Planning / architecture intent.
267
282
  if (matches(PLAN_KEYWORDS)) {
268
283
  const runner = this.registry.get('planner-agent');
269
284
  if (runner)
@@ -1 +1 @@
1
- {"version":3,"file":"router.js","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  /** Anthropic API runner implementation. */
2
2
  import Anthropic, { APIConnectionTimeoutError, APIError, APIUserAbortError, AuthenticationError, RateLimitError, } from '@anthropic-ai/sdk';
3
- import { BaseRunner, makeRunnerResult, resolveParams } from './base.js';
3
+ import { authErrorMessage, BaseRunner, makeRunnerResult, resolveParams } from './base.js';
4
4
  import { describeError, startTimer } from '../util.js';
5
5
  /** Runner adapter for Anthropic Claude models via the official SDK. */
6
6
  export class AnthropicRunner extends BaseRunner {
@@ -37,8 +37,7 @@ export class AnthropicRunner extends BaseRunner {
37
37
  task,
38
38
  latency_ms: elapsed(),
39
39
  success: false,
40
- error_message: `Authentication error: Environment variable '${this.envVarName}' is not set. ` +
41
- `Please export ${this.envVarName}=<your-key> to use runner '${this.id}'.`,
40
+ error_message: authErrorMessage(this.envVarName, this.id),
42
41
  });
43
42
  }
44
43
  const timeoutMs = timeoutSeconds * 1000;
@@ -1 +1 @@
1
- {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/runners/anthropic.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/runners/anthropic.ts"],"names":[],"mappings":"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"}
@@ -72,6 +72,14 @@ export interface ResolvedParams {
72
72
  * four values every backend needs. Overrides win, matching `dict.update()`.
73
73
  */
74
74
  export declare function resolveParams(config: RunnerConfig, params?: Record<string, unknown> | null): ResolvedParams;
75
+ /**
76
+ * The message a runner returns when its credential env var is unset.
77
+ *
78
+ * The first two sentences are byte-identical to what SmartRelay has always
79
+ * returned — existing tests assert on them with `toContain` — and the setup hint
80
+ * is appended so the error names its own fix.
81
+ */
82
+ export declare function authErrorMessage(envVarName: string, runnerId: string): string;
75
83
  /** Abstract base class for all LLM backend runners. */
76
84
  export declare abstract class BaseRunner {
77
85
  readonly config: RunnerConfig;
@@ -1,5 +1,6 @@
1
1
  /** Base classes and data models for LLM runners. */
2
2
  import { round } from '../util.js';
3
+ import { SETUP_COMMAND } from '../credentials.js';
3
4
  /**
4
5
  * Build a `RunnerResult`, filling in the same defaults as the Python dataclass
5
6
  * and always emitting keys in declaration order so `JSON.stringify` reproduces
@@ -39,6 +40,18 @@ export function resolveParams(config, params) {
39
40
  timeoutSeconds: merged['timeout_seconds'] ?? config.timeout_seconds,
40
41
  };
41
42
  }
43
+ /**
44
+ * The message a runner returns when its credential env var is unset.
45
+ *
46
+ * The first two sentences are byte-identical to what SmartRelay has always
47
+ * returned — existing tests assert on them with `toContain` — and the setup hint
48
+ * is appended so the error names its own fix.
49
+ */
50
+ export function authErrorMessage(envVarName, runnerId) {
51
+ return (`Authentication error: Environment variable '${envVarName}' is not set. ` +
52
+ `Please export ${envVarName}=<your-key> to use runner '${runnerId}'. ` +
53
+ `Or run \`${SETUP_COMMAND}\` to store your provider keys in ~/.smartrelay/.env.`);
54
+ }
42
55
  /** Abstract base class for all LLM backend runners. */
43
56
  export class BaseRunner {
44
57
  config;
@@ -1 +1 @@
1
- {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/runners/base.ts"],"names":[],"mappings":"AAAA,oDAAoD;AAEpD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AA0DnC;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAsB;IACrD,OAAO;QACL,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,EAAE;QACzB,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,CAAC;QAChC,YAAY,EAAE,IAAI,CAAC,YAAY,IAAI,CAAC;QACpC,aAAa,EAAE,IAAI,CAAC,aAAa,IAAI,CAAC;QACtC,kBAAkB,EAAE,IAAI,CAAC,kBAAkB,IAAI,CAAC;QAChD,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,aAAa,EAAE,IAAI,CAAC,aAAa,IAAI,IAAI;QACzC,YAAY,EAAE,IAAI,CAAC,YAAY,IAAI,EAAE;QACrC,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACtD,CAAC;AACJ,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,kBAAkB,CAAC,MAAoB,EAAE,MAAM,GAAkB,CAAC;IAChF,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,IAAI,SAAS,CAAC,CAAC;AAC3D,CAAC;AAUD;;;GAGG;AACH,MAAM,UAAU,aAAa,CAC3B,MAAoB,EACpB,MAAuC;IAEvC,MAAM,MAAM,GAA4B,EAAE,GAAG,MAAM,CAAC,cAAc,EAAE,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,CAAC;IACxF,MAAM,YAAY,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC;IAE7C,OAAO;QACL,SAAS,EAAG,MAAM,CAAC,YAAY,CAAwB,IAAI,IAAI;QAC/D,WAAW,EAAG,MAAM,CAAC,aAAa,CAAwB,IAAI,GAAG;QACjE,YAAY,EAAE,OAAO,YAAY,KAAK,QAAQ,IAAI,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS;QACzF,cAAc,EAAG,MAAM,CAAC,iBAAiB,CAAwB,IAAI,MAAM,CAAC,eAAe;KAC5F,CAAC;AACJ,CAAC;AAED,uDAAuD;AACvD,MAAM,OAAgB,UAAU;IACF,MAAM;IAAlC,YAA4B,MAAoB;sBAApB,MAAM;IAAiB,CAAC;IAEpD,IAAI,EAAE;QACJ,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;IACxB,CAAC;IAED,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;IAC3B,CAAC;IAED,6EAA6E;IAC7E,aAAa,CAAC,WAAmB,EAAE,YAAoB;QACrD,MAAM,SAAS,GAAG,CAAC,WAAW,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,6BAA6B,CAAC;QACxF,MAAM,UAAU,GAAG,CAAC,YAAY,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,8BAA8B,CAAC;QAC3F,OAAO,KAAK,CAAC,SAAS,GAAG,UAAU,EAAE,CAAC,CAAC,CAAC;IAC1C,CAAC;CASF"}
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/runners/base.ts"],"names":[],"mappings":"AAAA,oDAAoD;AAEpD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AA0DlD;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAsB;IACrD,OAAO;QACL,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,EAAE;QACzB,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,CAAC;QAChC,YAAY,EAAE,IAAI,CAAC,YAAY,IAAI,CAAC;QACpC,aAAa,EAAE,IAAI,CAAC,aAAa,IAAI,CAAC;QACtC,kBAAkB,EAAE,IAAI,CAAC,kBAAkB,IAAI,CAAC;QAChD,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,aAAa,EAAE,IAAI,CAAC,aAAa,IAAI,IAAI;QACzC,YAAY,EAAE,IAAI,CAAC,YAAY,IAAI,EAAE;QACrC,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACtD,CAAC;AACJ,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,kBAAkB,CAAC,MAAoB,EAAE,MAAM,GAAkB,CAAC;IAChF,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,IAAI,SAAS,CAAC,CAAC;AAC3D,CAAC;AAUD;;;GAGG;AACH,MAAM,UAAU,aAAa,CAC3B,MAAoB,EACpB,MAAuC;IAEvC,MAAM,MAAM,GAA4B,EAAE,GAAG,MAAM,CAAC,cAAc,EAAE,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,CAAC;IACxF,MAAM,YAAY,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC;IAE7C,OAAO;QACL,SAAS,EAAG,MAAM,CAAC,YAAY,CAAwB,IAAI,IAAI;QAC/D,WAAW,EAAG,MAAM,CAAC,aAAa,CAAwB,IAAI,GAAG;QACjE,YAAY,EAAE,OAAO,YAAY,KAAK,QAAQ,IAAI,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS;QACzF,cAAc,EAAG,MAAM,CAAC,iBAAiB,CAAwB,IAAI,MAAM,CAAC,eAAe;KAC5F,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,UAAkB,EAAE,QAAgB;IACnE,OAAO,CACL,+CAA+C,UAAU,gBAAgB;QACzE,iBAAiB,UAAU,8BAA8B,QAAQ,KAAK;QACtE,YAAY,aAAa,uDAAuD,CACjF,CAAC;AACJ,CAAC;AAED,uDAAuD;AACvD,MAAM,OAAgB,UAAU;IACF,MAAM;IAAlC,YAA4B,MAAoB;sBAApB,MAAM;IAAiB,CAAC;IAEpD,IAAI,EAAE;QACJ,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;IACxB,CAAC;IAED,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;IAC3B,CAAC;IAED,6EAA6E;IAC7E,aAAa,CAAC,WAAmB,EAAE,YAAoB;QACrD,MAAM,SAAS,GAAG,CAAC,WAAW,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,6BAA6B,CAAC;QACxF,MAAM,UAAU,GAAG,CAAC,YAAY,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,8BAA8B,CAAC;QAC3F,OAAO,KAAK,CAAC,SAAS,GAAG,UAAU,EAAE,CAAC,CAAC,CAAC;IAC1C,CAAC;CASF"}
@@ -1,6 +1,6 @@
1
1
  /** OpenAI API runner implementation. */
2
2
  import OpenAI from 'openai';
3
- import { BaseRunner, makeRunnerResult, resolveParams } from './base.js';
3
+ import { authErrorMessage, BaseRunner, makeRunnerResult, resolveParams } from './base.js';
4
4
  import { describeError, startTimer } from '../util.js';
5
5
  /**
6
6
  * Runner adapter for OpenAI models (GPT-4o, GPT-4o-mini, o3-mini, etc.).
@@ -57,8 +57,7 @@ export class OpenAIRunner extends BaseRunner {
57
57
  task,
58
58
  latency_ms: elapsed(),
59
59
  success: false,
60
- error_message: `Authentication error: Environment variable '${this.envVarName}' is not set. ` +
61
- `Please export ${this.envVarName}=<your-key> to use runner '${this.id}'.`,
60
+ error_message: authErrorMessage(this.envVarName, this.id),
62
61
  });
63
62
  }
64
63
  const timeoutMs = timeoutSeconds * 1000;