viberadar 0.1.3 → 0.2.1

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/cli.js CHANGED
@@ -36,9 +36,11 @@ var __importStar = (this && this.__importStar) || (function () {
36
36
  Object.defineProperty(exports, "__esModule", { value: true });
37
37
  const scanner_1 = require("./scanner");
38
38
  const server_1 = require("./server");
39
+ const init_1 = require("./init");
39
40
  const PROJECT_ROOT = process.cwd();
40
41
  const PORT = 4242;
41
- async function main() {
42
+ const command = process.argv[2];
43
+ async function runDashboard() {
42
44
  console.log('🔭 VibeRadar starting...');
43
45
  console.log(` Project: ${PROJECT_ROOT}`);
44
46
  console.log(' Scanning modules...');
@@ -50,6 +52,35 @@ async function main() {
50
52
  const { default: open } = await Promise.resolve().then(() => __importStar(require('open')));
51
53
  await open(`http://localhost:${PORT}`);
52
54
  }
55
+ function printHelp() {
56
+ console.log(`
57
+ 🔭 VibeRadar
58
+
59
+ Команды:
60
+ npx viberadar Запустить дашборд на http://localhost:4242
61
+ npx viberadar init Сгенерировать промпт для AI-агента (настройка фич)
62
+ npx viberadar help Показать эту справку
63
+ `);
64
+ }
65
+ async function main() {
66
+ switch (command) {
67
+ case 'init':
68
+ await (0, init_1.runInit)(PROJECT_ROOT);
69
+ break;
70
+ case 'help':
71
+ case '--help':
72
+ case '-h':
73
+ printHelp();
74
+ break;
75
+ case undefined:
76
+ await runDashboard();
77
+ break;
78
+ default:
79
+ console.error(`❌ Неизвестная команда: ${command}`);
80
+ printHelp();
81
+ process.exit(1);
82
+ }
83
+ }
53
84
  main().catch((err) => {
54
85
  console.error('❌ VibeRadar error:', err.message);
55
86
  process.exit(1);
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA,uCAAwC;AACxC,qCAAuC;AAEvC,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;AACnC,MAAM,IAAI,GAAG,IAAI,CAAC;AAElB,KAAK,UAAU,IAAI;IACjB,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,eAAe,YAAY,EAAE,CAAC,CAAC;IAE3C,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,MAAM,IAAA,qBAAW,EAAC,YAAY,CAAC,CAAC;IAE7C,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,OAAO,CAAC,MAAM,UAAU,CAAC,CAAC;IAEvD,MAAM,IAAA,oBAAW,EAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,CAAC;IAEnE,OAAO,CAAC,GAAG,CAAC,mCAAmC,IAAI,EAAE,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IAEzC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,wDAAa,MAAM,GAAC,CAAC;IAC/C,MAAM,IAAI,CAAC,oBAAoB,IAAI,EAAE,CAAC,CAAC;AACzC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,uCAAwC;AACxC,qCAAuC;AACvC,iCAAiC;AAEjC,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;AACnC,MAAM,IAAI,GAAG,IAAI,CAAC;AAClB,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAEhC,KAAK,UAAU,YAAY;IACzB,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,eAAe,YAAY,EAAE,CAAC,CAAC;IAE3C,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,MAAM,IAAA,qBAAW,EAAC,YAAY,CAAC,CAAC;IAE7C,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,OAAO,CAAC,MAAM,UAAU,CAAC,CAAC;IAEvD,MAAM,IAAA,oBAAW,EAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,CAAC;IAEnE,OAAO,CAAC,GAAG,CAAC,mCAAmC,IAAI,EAAE,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IAEzC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,wDAAa,MAAM,GAAC,CAAC;IAC/C,MAAM,IAAI,CAAC,oBAAoB,IAAI,EAAE,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,SAAS;IAChB,OAAO,CAAC,GAAG,CAAC;;;;;;;CAOb,CAAC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,MAAM;YACT,MAAM,IAAA,cAAO,EAAC,YAAY,CAAC,CAAC;YAC5B,MAAM;QACR,KAAK,MAAM,CAAC;QACZ,KAAK,QAAQ,CAAC;QACd,KAAK,IAAI;YACP,SAAS,EAAE,CAAC;YACZ,MAAM;QACR,KAAK,SAAS;YACZ,MAAM,YAAY,EAAE,CAAC;YACrB,MAAM;QACR;YACE,OAAO,CAAC,KAAK,CAAC,0BAA0B,OAAO,EAAE,CAAC,CAAC;YACnD,SAAS,EAAE,CAAC;YACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function runInit(projectRoot: string): Promise<void>;
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/init/index.ts"],"names":[],"mappings":"AAuCA,wBAAsB,OAAO,CAAC,WAAW,EAAE,MAAM,iBA4ChD"}
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.runInit = runInit;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const child_process = __importStar(require("child_process"));
40
+ const prompt_builder_1 = require("./prompt-builder");
41
+ const PROMPT_FILE = 'VIBERADAR_PROMPT.md';
42
+ function copyToClipboard(text) {
43
+ try {
44
+ const platform = process.platform;
45
+ if (platform === 'win32') {
46
+ child_process.execSync('clip', { input: text });
47
+ }
48
+ else if (platform === 'darwin') {
49
+ child_process.execSync('pbcopy', { input: text });
50
+ }
51
+ else {
52
+ // Linux — пробуем xclip, потом xsel
53
+ try {
54
+ child_process.execSync('xclip -selection clipboard', { input: text });
55
+ }
56
+ catch {
57
+ child_process.execSync('xsel --clipboard --input', { input: text });
58
+ }
59
+ }
60
+ return true;
61
+ }
62
+ catch {
63
+ return false;
64
+ }
65
+ }
66
+ function printBox(lines) {
67
+ const width = Math.max(...lines.map(l => l.length)) + 4;
68
+ const border = '─'.repeat(width);
69
+ console.log(`┌${border}┐`);
70
+ for (const line of lines) {
71
+ const padding = ' '.repeat(width - line.length - 2);
72
+ console.log(`│ ${line}${padding}│`);
73
+ }
74
+ console.log(`└${border}┘`);
75
+ }
76
+ async function runInit(projectRoot) {
77
+ console.log('\n🔭 VibeRadar Init\n');
78
+ console.log(' Сканирую структуру проекта...');
79
+ const snap = (0, prompt_builder_1.buildSnapshot)(projectRoot);
80
+ console.log(` Проект: ${snap.name}`);
81
+ if (snap.techStack.length > 0) {
82
+ console.log(` Стек: ${snap.techStack.join(', ')}`);
83
+ }
84
+ console.log(` Файлов: ${snap.totalFiles}`);
85
+ console.log(` Страниц: ${snap.pageFiles.length}`);
86
+ console.log(` Роутов: ${snap.routeFiles.length}`);
87
+ console.log(` Тестов: ${snap.testFiles.length}`);
88
+ console.log('\n Генерирую промпт для AI-агента...');
89
+ const prompt = (0, prompt_builder_1.buildPrompt)(snap);
90
+ // Сохраняем файл
91
+ const promptPath = path.join(projectRoot, PROMPT_FILE);
92
+ fs.writeFileSync(promptPath, prompt, 'utf-8');
93
+ console.log(` Сохранён: ${PROMPT_FILE}`);
94
+ // Копируем в буфер
95
+ const copied = copyToClipboard(prompt);
96
+ console.log('');
97
+ printBox([
98
+ copied
99
+ ? '✅ Промпт скопирован в буфер обмена!'
100
+ : `📄 Промпт сохранён в ${PROMPT_FILE}`,
101
+ '',
102
+ 'Дальше:',
103
+ `1. Вставь промпт в Cursor / Claude / Windsurf (Ctrl+V)`,
104
+ '2. Ответь на уточняющие вопросы агента',
105
+ '3. Агент создаст viberadar.config.json',
106
+ '4. Запусти: npx viberadar',
107
+ ]);
108
+ if (!copied) {
109
+ console.log(`\n Не удалось скопировать в буфер. Открой файл:\n ${promptPath}\n`);
110
+ }
111
+ console.log('');
112
+ }
113
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/init/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export interface ProjectSnapshot {
2
+ name: string;
3
+ projectRoot: string;
4
+ packageJson: Record<string, any>;
5
+ dirTree: string;
6
+ topFiles: string[];
7
+ routeFiles: string[];
8
+ pageFiles: string[];
9
+ testFiles: string[];
10
+ totalFiles: number;
11
+ techStack: string[];
12
+ }
13
+ export declare function buildSnapshot(projectRoot: string): ProjectSnapshot;
14
+ export declare function buildPrompt(snap: ProjectSnapshot): string;
15
+ //# sourceMappingURL=prompt-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-builder.d.ts","sourceRoot":"","sources":["../../src/init/prompt-builder.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAyHD,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,eAAe,CA6BlE;AAwCD,wBAAgB,WAAW,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,CA0FzD"}
@@ -0,0 +1,316 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.buildSnapshot = buildSnapshot;
37
+ exports.buildPrompt = buildPrompt;
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
40
+ // ─── Директории которые не несут бизнес-смысла для агента ─────────────────────
41
+ const IGNORE_BUILD = new Set([
42
+ 'node_modules', 'dist', 'build', '.git', '.next', 'coverage',
43
+ '.nyc_output', '__pycache__', '.venv', '.turbo', '.cache', '.idea',
44
+ '.vscode', 'playwright-report', 'test-results',
45
+ ]);
46
+ // Папки с документацией/артефактами — показываем в дереве но не углубляемся
47
+ const IGNORE_DEEP = new Set([
48
+ 'migrations', 'Releases', 'Backlog', 'attached_assets', 'temp',
49
+ 'grant-start-AI', 'initdb', 'pdfFonts', 'fonts', 'public',
50
+ 'Confluence', 'test-cases', 'user-guide', 'docs',
51
+ ]);
52
+ // Шаблонные имена пакетов — заменяем на имя папки
53
+ const TEMPLATE_NAMES = new Set([
54
+ 'rest-express', 'my-app', 'app', 'project', 'starter', 'template',
55
+ 'nextjs-app', 'vite-app', 'react-app', 'express-app', 'node-app',
56
+ 'backend', 'frontend', 'fullstack', 'monorepo', 'webapp',
57
+ ]);
58
+ // ─── Сканирование структуры проекта ───────────────────────────────────────────
59
+ function buildDirTree(dir, prefix = '', depth = 0) {
60
+ if (depth > 3)
61
+ return '';
62
+ let result = '';
63
+ let entries;
64
+ try {
65
+ entries = fs.readdirSync(dir, { withFileTypes: true });
66
+ }
67
+ catch {
68
+ return '';
69
+ }
70
+ const filtered = entries
71
+ .filter(e => !IGNORE_BUILD.has(e.name) && !e.name.startsWith('.'))
72
+ .sort((a, b) => {
73
+ if (a.isDirectory() && !b.isDirectory())
74
+ return -1;
75
+ if (!a.isDirectory() && b.isDirectory())
76
+ return 1;
77
+ return a.name.localeCompare(b.name);
78
+ })
79
+ .slice(0, 25);
80
+ filtered.forEach((entry, i) => {
81
+ const isLast = i === filtered.length - 1;
82
+ const connector = isLast ? '└── ' : '├── ';
83
+ const childPrefix = isLast ? ' ' : '│ ';
84
+ result += `${prefix}${connector}${entry.name}${entry.isDirectory() ? '/' : ''}\n`;
85
+ if (entry.isDirectory() && !IGNORE_DEEP.has(entry.name)) {
86
+ result += buildDirTree(path.join(dir, entry.name), prefix + childPrefix, depth + 1);
87
+ }
88
+ });
89
+ return result;
90
+ }
91
+ function collectFiles(dir, pattern, limit = 50) {
92
+ const results = [];
93
+ function walk(d) {
94
+ if (results.length >= limit)
95
+ return;
96
+ let entries;
97
+ try {
98
+ entries = fs.readdirSync(d, { withFileTypes: true });
99
+ }
100
+ catch {
101
+ return;
102
+ }
103
+ for (const e of entries) {
104
+ if (IGNORE_BUILD.has(e.name) || e.name.startsWith('.'))
105
+ continue;
106
+ const full = path.join(d, e.name);
107
+ if (e.isDirectory())
108
+ walk(full);
109
+ else if (pattern.test(e.name))
110
+ results.push(full);
111
+ }
112
+ }
113
+ walk(dir);
114
+ return results;
115
+ }
116
+ function detectTechStack(pkg) {
117
+ const deps = { ...pkg.dependencies, ...pkg.devDependencies };
118
+ const stack = [];
119
+ const checks = [
120
+ ['react', 'React'],
121
+ ['next', 'Next.js'],
122
+ ['vue', 'Vue'],
123
+ ['svelte', 'Svelte'],
124
+ ['express', 'Express'],
125
+ ['fastify', 'Fastify'],
126
+ ['nestjs/core', 'NestJS'],
127
+ ['typescript', 'TypeScript'],
128
+ ['vitest', 'Vitest'],
129
+ ['jest', 'Jest'],
130
+ ['playwright', 'Playwright'],
131
+ ['prisma', 'Prisma'],
132
+ ['drizzle-orm', 'Drizzle ORM'],
133
+ ['mongoose', 'Mongoose'],
134
+ ['tailwindcss', 'Tailwind CSS'],
135
+ ['trpc', 'tRPC'],
136
+ ['graphql', 'GraphQL'],
137
+ ];
138
+ for (const [key, label] of checks) {
139
+ if (Object.keys(deps).some(d => d.includes(key)))
140
+ stack.push(label);
141
+ }
142
+ return stack;
143
+ }
144
+ function resolveProjectName(packageJson, projectRoot) {
145
+ const pkgName = packageJson.name || '';
146
+ // Если имя выглядит как шаблонное — берём имя папки
147
+ if (!pkgName || TEMPLATE_NAMES.has(pkgName.toLowerCase())) {
148
+ return path.basename(projectRoot);
149
+ }
150
+ return pkgName;
151
+ }
152
+ function filterScripts(scripts) {
153
+ // Показываем только ключевые скрипты, не засоряем промпт CI-командами
154
+ const KEY_SCRIPTS = ['dev', 'start', 'build', 'test', 'test:e2e', 'lint'];
155
+ const result = {};
156
+ for (const key of KEY_SCRIPTS) {
157
+ if (scripts[key])
158
+ result[key] = scripts[key];
159
+ }
160
+ return result;
161
+ }
162
+ function buildSnapshot(projectRoot) {
163
+ const pkgPath = path.join(projectRoot, 'package.json');
164
+ let packageJson = {};
165
+ try {
166
+ packageJson = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
167
+ }
168
+ catch { }
169
+ const pageFiles = collectFiles(projectRoot, /[Pp]age\.(tsx?|jsx?)$|[Pp]ages.*\.(tsx?|jsx?)$/)
170
+ .map(f => path.relative(projectRoot, f));
171
+ const routeFiles = collectFiles(projectRoot, /route|router|routes/i)
172
+ .filter(f => /\.(ts|js)$/.test(f))
173
+ .map(f => path.relative(projectRoot, f));
174
+ const testFiles = collectFiles(projectRoot, /\.(test|spec)\.(tsx?|jsx?)$/)
175
+ .map(f => path.relative(projectRoot, f));
176
+ const allFiles = collectFiles(projectRoot, /\.(tsx?|jsx?)$/, 500);
177
+ return {
178
+ name: resolveProjectName(packageJson, projectRoot),
179
+ projectRoot,
180
+ packageJson,
181
+ dirTree: buildDirTree(projectRoot),
182
+ topFiles: allFiles.slice(0, 20).map(f => path.relative(projectRoot, f)),
183
+ routeFiles: routeFiles.slice(0, 30),
184
+ pageFiles: pageFiles.slice(0, 30),
185
+ testFiles: testFiles.slice(0, 30),
186
+ totalFiles: allFiles.length,
187
+ techStack: detectTechStack(packageJson),
188
+ };
189
+ }
190
+ // ─── Шаблон промпта ────────────────────────────────────────────────────────────
191
+ const CONFIG_EXAMPLE = JSON.stringify({
192
+ version: '1',
193
+ features: {
194
+ auth: {
195
+ label: 'Авторизация',
196
+ description: 'Вход, регистрация, восстановление пароля, OAuth',
197
+ include: ['**/auth*', '**/login*', '**/register*', '**/password*'],
198
+ color: '#f85149',
199
+ },
200
+ chat: {
201
+ label: 'Чаты с AI',
202
+ description: 'Диалог с AI-ассистентом, история сообщений, стриминг',
203
+ include: ['**/chat*', '**/Chat*', '**/message*'],
204
+ color: '#58a6ff',
205
+ },
206
+ skills: {
207
+ label: 'Навыки',
208
+ description: 'Создание и настройка AI-агентов с кастомными инструкциями',
209
+ include: ['**/skill*', '**/Skill*'],
210
+ color: '#d2a8ff',
211
+ },
212
+ 'knowledge-base': {
213
+ label: 'Базы знаний',
214
+ description: 'Загрузка документов, индексация, RAG-поиск',
215
+ include: ['**/knowledge*', '**/Knowledge*', '**/rag*', '**/indexing*'],
216
+ color: '#3fb950',
217
+ },
218
+ admin: {
219
+ label: 'Админ-панель',
220
+ description: 'Управление пользователями, тарифами, провайдерами',
221
+ include: ['**/admin*', '**/Admin*'],
222
+ color: '#e3b341',
223
+ },
224
+ },
225
+ }, null, 2);
226
+ function buildPrompt(snap) {
227
+ const scripts = snap.packageJson.scripts
228
+ ? filterScripts(snap.packageJson.scripts)
229
+ : {};
230
+ return `# VibeRadar — Настройка карты фич проекта
231
+
232
+ ## Контекст
233
+
234
+ VibeRadar — инструмент для визуализации архитектуры проекта и тест-покрытия по фичам.
235
+ Тебе нужно проанализировать проект **${snap.name}** и создать файл \`viberadar.config.json\`
236
+ с описанием бизнес-фич и паттернами файлов, которые к ним относятся.
237
+
238
+ ---
239
+
240
+ ## Данные о проекте
241
+
242
+ **Название:** ${snap.name}
243
+ **Стек:** ${snap.techStack.length > 0 ? snap.techStack.join(', ') : 'не определён'}
244
+ **Всего исходных файлов:** ${snap.totalFiles}
245
+
246
+ ### Структура папок (упрощённая, без node_modules/dist/docs):
247
+ \`\`\`
248
+ ${snap.name}/
249
+ ${snap.dirTree}\`\`\`
250
+
251
+ ${snap.pageFiles.length > 0 ? `### Страницы / UI-компоненты верхнего уровня:
252
+ ${snap.pageFiles.map(f => `- ${f}`).join('\n')}
253
+ ` : ''}
254
+ ${snap.routeFiles.length > 0 ? `### Серверные роуты / API:
255
+ ${snap.routeFiles.map(f => `- ${f}`).join('\n')}
256
+ ` : ''}
257
+ ${snap.testFiles.length > 0 ? `### Тест-файлы (первые 30):
258
+ ${snap.testFiles.map(f => `- ${f}`).join('\n')}
259
+ ` : ''}
260
+ ${Object.keys(scripts).length > 0 ? `### Ключевые скрипты:
261
+ ${Object.entries(scripts).map(([k, v]) => `- \`${k}\`: ${v}`).join('\n')}
262
+ ` : ''}
263
+
264
+ ---
265
+
266
+ ## Твоя задача
267
+
268
+ ### Шаг 1 — Анализ
269
+ Изучи структуру проекта. Определи **бизнес-фичи** — не технические слои.
270
+
271
+ ✅ Хорошие фичи (что видит пользователь, что можно сломать изолированно):
272
+ "Авторизация", "Чаты с AI", "Навыки", "Базы знаний", "Файлы", "Биллинг", "Интеграции", "Админ-панель"
273
+
274
+ ❌ Плохие фичи (технические абстракции):
275
+ "Components", "Utils", "Helpers", "Common", "Shared", "Services"
276
+
277
+ ### Шаг 2 — Уточняющие вопросы
278
+ **ОБЯЗАТЕЛЬНО** задай вопросы по неочевидным модулям прежде чем генерировать конфиг.
279
+ Не угадывай назначение — лучше 3–5 вопросов, чем неточный результат.
280
+
281
+ Спрашивай если видишь:
282
+ - Папки с неочевидным названием (например \`actions/\`, \`canvas/\`, \`guards/\`)
283
+ - Модули которые могут быть как фичей, так и внутренней системой
284
+ - Несколько похожих папок (например \`skills/\` и \`agents/\`)
285
+
286
+ ### Шаг 3 — Генерация конфига
287
+ После получения ответов создай файл \`viberadar.config.json\` в корне проекта.
288
+
289
+ **Правила:**
290
+ - Оптимально **10–20 фич** — не дроби слишком мелко, не объединяй несвязанное
291
+ - Каждая фича — понятное бизнес-название на русском или английском
292
+ - Паттерны в \`include\` — glob относительно корня проекта, учитывай и клиент и сервер
293
+ - Один файл может попадать в несколько фич — это нормально
294
+ - Не создавай фичу "other" или "misc"
295
+
296
+ **Пример готового конфига** (для похожего AI-проекта):
297
+ \`\`\`json
298
+ ${CONFIG_EXAMPLE}
299
+ \`\`\`
300
+
301
+ **Цвета** (используй разные для каждой фичи):
302
+ \`#58a6ff\` синий · \`#3fb950\` зелёный · \`#d2a8ff\` фиолетовый · \`#ffa657\` оранжевый
303
+ \`#f85149\` красный · \`#e3b341\` жёлтый · \`#39d353\` лайм · \`#79c0ff\` голубой · \`#ff7b72\` коралловый
304
+
305
+ ---
306
+
307
+ ## Порядок ответа
308
+
309
+ 1. **Сначала** — уточняющие вопросы (если есть неясности)
310
+ 2. **После ответов** — создай \`viberadar.config.json\`
311
+ 3. **Кратко** — объясни логику разбивки на фичи
312
+
313
+ Начинай с вопросов.
314
+ `;
315
+ }
316
+ //# sourceMappingURL=prompt-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-builder.js","sourceRoot":"","sources":["../../src/init/prompt-builder.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "viberadar",
3
- "version": "0.1.3",
3
+ "version": "0.2.1",
4
4
  "description": "Live module map with test coverage for vibecoding projects",
5
5
  "main": "./dist/cli.js",
6
6
  "bin": {