2 Мб, 1024x1024
В этом треде делимся винами по поводу своего опыта пользования разными приблудами, упрощающими жизнь макаки.
1. Codeium
Описание:
Codeium — это бесплатный AI-инструмент для автодополнения кода. Работает с большинством популярных IDE и поддерживает множество языков программирования.
Достоинство: Бесплатный доступ без ограничений.
Недостаток: В некоторых случаях автодополнение бывает менее точным по сравнению с конкурентами, такими как Copilot.
2. Windsurf
Описание:
Windsurf — это ИДЕ с AI, ориентированный на скорость и минимализм. Основной упор сделан на интеграции с ИИ.
Достоинство: Быстрая интеграция, без необходимости установки сложных плагинов.
Недостаток: Ограниченная функциональность по сравнению с более крупными инструментами.
3. Double.Bot
Описание:
Double.Bot — это AI-помощник для разработки, который помогает автоматизировать задачи, такие как написание кода, исправление ошибок и оптимизация.
Достоинство: Высокая степень автоматизации рутинных задач.
Недостаток: Меньшая узнаваемость и поддержка по сравнению с популярными конкурентами.
4. ClaudeDev
Описание:
ClaudeDev — версия AI-модели Claude, специально настроенная на разработчиков. Она помогает с анализом кода, генерацией сложных решений и предложением архитектурных паттернов.
Достоинство: Глубокое понимание контекста и сложных задач.
Недостаток: Может быть медленнее в обработке запросов по сравнению с другими AI.
5. Continue.dev
Описание:
Continue.dev — инструмент для улучшения и продолжения кода. Работает как интерактивный AI, который помогает дописывать или рефакторить код в реальном времени.
Достоинство: Гибкость в работе с продолжающимся кодом и рефакторингом.
Недостаток: Зависит от качества исходного кода, иногда предлагает не совсем корректные варианты.
6. Cursor
Описание:
Cursor — это AI-помощник разработчика, который помогает писать и редактировать код, а также предоставляет советы по оптимизации.
Достоинство: Простота использования и интерфейс, ориентированный на эффективность.
Недостаток: Ограниченная поддержка сложных архитектурных решений.
7. GitHub Copilot
Описание:
GitHub Copilot — один из самых известных AI-инструментов для автодополнения кода. Разработан на базе модели OpenAI Codex и интегрируется в большинство популярных IDE.
Достоинство: Точность и адаптация под стиль разработчика.
Недостаток: Он тупой. У него платный доступ, что может быть минусом для некоторых пользователей.
1. Codeium
Описание:
Codeium — это бесплатный AI-инструмент для автодополнения кода. Работает с большинством популярных IDE и поддерживает множество языков программирования.
Достоинство: Бесплатный доступ без ограничений.
Недостаток: В некоторых случаях автодополнение бывает менее точным по сравнению с конкурентами, такими как Copilot.
2. Windsurf
Описание:
Windsurf — это ИДЕ с AI, ориентированный на скорость и минимализм. Основной упор сделан на интеграции с ИИ.
Достоинство: Быстрая интеграция, без необходимости установки сложных плагинов.
Недостаток: Ограниченная функциональность по сравнению с более крупными инструментами.
3. Double.Bot
Описание:
Double.Bot — это AI-помощник для разработки, который помогает автоматизировать задачи, такие как написание кода, исправление ошибок и оптимизация.
Достоинство: Высокая степень автоматизации рутинных задач.
Недостаток: Меньшая узнаваемость и поддержка по сравнению с популярными конкурентами.
4. ClaudeDev
Описание:
ClaudeDev — версия AI-модели Claude, специально настроенная на разработчиков. Она помогает с анализом кода, генерацией сложных решений и предложением архитектурных паттернов.
Достоинство: Глубокое понимание контекста и сложных задач.
Недостаток: Может быть медленнее в обработке запросов по сравнению с другими AI.
5. Continue.dev
Описание:
Continue.dev — инструмент для улучшения и продолжения кода. Работает как интерактивный AI, который помогает дописывать или рефакторить код в реальном времени.
Достоинство: Гибкость в работе с продолжающимся кодом и рефакторингом.
Недостаток: Зависит от качества исходного кода, иногда предлагает не совсем корректные варианты.
6. Cursor
Описание:
Cursor — это AI-помощник разработчика, который помогает писать и редактировать код, а также предоставляет советы по оптимизации.
Достоинство: Простота использования и интерфейс, ориентированный на эффективность.
Недостаток: Ограниченная поддержка сложных архитектурных решений.
7. GitHub Copilot
Описание:
GitHub Copilot — один из самых известных AI-инструментов для автодополнения кода. Разработан на базе модели OpenAI Codex и интегрируется в большинство популярных IDE.
Достоинство: Точность и адаптация под стиль разработчика.
Недостаток: Он тупой. У него платный доступ, что может быть минусом для некоторых пользователей.
Никогда этим говном не пользовался, поясни на примере не хеловорда на хуй оно нужно?
>>30943
Мне тестами нравится покрывать код, используя эти штуки
Писать тесты - это самое тупое, что приходится делать руками.
А тут гпт сам за тебя напишет тест - выводится ли в консольку твой холоворлд.
Мне тестами нравится покрывать код, используя эти штуки
Писать тесты - это самое тупое, что приходится делать руками.
А тут гпт сам за тебя напишет тест - выводится ли в консольку твой холоворлд.
>>31025
Проверять кем-то написанные тесты на корректность чуть ли менее приятно, чем писать самому.
Проверять кем-то написанные тесты на корректность чуть ли менее приятно, чем писать самому.
>Писать тесты - это самое тупое, что приходится делать руками.
Ну такое, ты же поверяешь критические участки кода, это очень важно, тем более какой тест что покрывает ты то же понимаешь
>>30943
вот я спросил клад сонет:
`console.log("Hello world!");`
- напиши как можно больше тестов jest по поводу этого кода
вот я спросил клад сонет:
`console.log("Hello world!");`
- напиши как можно больше тестов jest по поводу этого кода
>>31123
describe('Console log tests', () => {
let consoleSpy;
// Перед каждым тестом создаем шпиона для console.log
beforeEach(() => {
consoleSpy = jest.spyOn(console, 'log').mockImplementation(() => {});
});
// После каждого теста очищаем моки
afterEach(() => {
consoleSpy.mockRestore();
});
test('console.log should be called', () => {
console.log("Hello world!");
expect(consoleSpy).toHaveBeenCalled();
});
test('console.log should be called exactly once', () => {
console.log("Hello world!");
expect(consoleSpy).toHaveBeenCalledTimes(1);
});
test('console.log should be called with "Hello world!"', () => {
console.log("Hello world!");
expect(consoleSpy).toHaveBeenCalledWith("Hello world!");
});
test('console.log should not be called with wrong text', () => {
console.log("Hello world!");
expect(consoleSpy).not.toHaveBeenCalledWith("Goodbye world!");
});
test('console.log argument should be a string', () => {
console.log("Hello world!");
expect(typeof consoleSpy.mock.calls[0][0]).toBe('string');
});
test('console.log argument should have correct length', () => {
console.log("Hello world!");
expect(consoleSpy.mock.calls[0][0].length).toBe(12);
});
test('console.log argument should contain "Hello"', () => {
console.log("Hello world!");
expect(consoleSpy.mock.calls[0][0]).toContain('Hello');
});
test('console.log argument should match exact string', () => {
console.log("Hello world!");
expect(consoleSpy.mock.calls[0][0]).toMatch(/^Hello world!$/);
});
test('console.log should be called with non-empty string', () => {
console.log("Hello world!");
expect(consoleSpy.mock.calls[0][0]).not.toBe('');
});
test('console.log argument should start with "Hello"', () => {
console.log("Hello world!");
expect(consoleSpy.mock.calls[0][0]).toMatch(/^Hello/);
});
test('console.log argument should end with "!"', () => {
console.log("Hello world!");
expect(consoleSpy.mock.calls[0][0]).toMatch(/!$/);
});
test('console.log should be called with string containing space', () => {
console.log("Hello world!");
expect(consoleSpy.mock.calls[0][0]).toContain(' ');
});
test('console.log argument should have correct words count', () => {
console.log("Hello world!");
expect(consoleSpy.mock.calls[0][0].split(' ').length).toBe(2);
});
test('console.log argument should be case sensitive', () => {
console.log("Hello world!");
expect(consoleSpy.mock.calls[0][0]).not.toBe('hello world!');
});
});
// Тесты на обработку ошибок
describe('Console log error handling', () => {
test('should throw if console is undefined', () => {
const tempConsole = global.console;
global.console = undefined;
expect(() => {
console.log("Hello world!");
}).toThrow();
global.console = tempConsole;
});
test('should throw if log method is undefined', () => {
const tempLog = console.log;
console.log = undefined;
expect(() => {
console.log("Hello world!");
}).toThrow();
console.log = tempLog;
});
});
// Тесты производительности
describe('Console log performance', () => {
test('should execute within 1ms', () => {
const start = performance.now();
console.log("Hello world!");
const end = performance.now();
expect(end - start).toBeLessThan(1);
});
});
// Тесты на последовательные вызовы
describe('Console log sequential calls', () => {
let consoleSpy;
beforeEach(() => {
consoleSpy = jest.spyOn(console, 'log').mockImplementation(() => {});
});
afterEach(() => {
consoleSpy.mockRestore();
});
test('multiple calls should work correctly', () => {
console.log("Hello world!");
console.log("Hello world!");
console.log("Hello world!");
expect(consoleSpy).toHaveBeenCalledTimes(3);
expect(consoleSpy.mock.calls).toHaveLength(3);
expect(consoleSpy.mock.calls[0][0]).toBe("Hello world!");
expect(consoleSpy.mock.calls[1][0]).toBe("Hello world!");
expect(consoleSpy.mock.calls[2][0]).toBe("Hello world!");
});
});
describe('Console log tests', () => {
let consoleSpy;
// Перед каждым тестом создаем шпиона для console.log
beforeEach(() => {
consoleSpy = jest.spyOn(console, 'log').mockImplementation(() => {});
});
// После каждого теста очищаем моки
afterEach(() => {
consoleSpy.mockRestore();
});
test('console.log should be called', () => {
console.log("Hello world!");
expect(consoleSpy).toHaveBeenCalled();
});
test('console.log should be called exactly once', () => {
console.log("Hello world!");
expect(consoleSpy).toHaveBeenCalledTimes(1);
});
test('console.log should be called with "Hello world!"', () => {
console.log("Hello world!");
expect(consoleSpy).toHaveBeenCalledWith("Hello world!");
});
test('console.log should not be called with wrong text', () => {
console.log("Hello world!");
expect(consoleSpy).not.toHaveBeenCalledWith("Goodbye world!");
});
test('console.log argument should be a string', () => {
console.log("Hello world!");
expect(typeof consoleSpy.mock.calls[0][0]).toBe('string');
});
test('console.log argument should have correct length', () => {
console.log("Hello world!");
expect(consoleSpy.mock.calls[0][0].length).toBe(12);
});
test('console.log argument should contain "Hello"', () => {
console.log("Hello world!");
expect(consoleSpy.mock.calls[0][0]).toContain('Hello');
});
test('console.log argument should match exact string', () => {
console.log("Hello world!");
expect(consoleSpy.mock.calls[0][0]).toMatch(/^Hello world!$/);
});
test('console.log should be called with non-empty string', () => {
console.log("Hello world!");
expect(consoleSpy.mock.calls[0][0]).not.toBe('');
});
test('console.log argument should start with "Hello"', () => {
console.log("Hello world!");
expect(consoleSpy.mock.calls[0][0]).toMatch(/^Hello/);
});
test('console.log argument should end with "!"', () => {
console.log("Hello world!");
expect(consoleSpy.mock.calls[0][0]).toMatch(/!$/);
});
test('console.log should be called with string containing space', () => {
console.log("Hello world!");
expect(consoleSpy.mock.calls[0][0]).toContain(' ');
});
test('console.log argument should have correct words count', () => {
console.log("Hello world!");
expect(consoleSpy.mock.calls[0][0].split(' ').length).toBe(2);
});
test('console.log argument should be case sensitive', () => {
console.log("Hello world!");
expect(consoleSpy.mock.calls[0][0]).not.toBe('hello world!');
});
});
// Тесты на обработку ошибок
describe('Console log error handling', () => {
test('should throw if console is undefined', () => {
const tempConsole = global.console;
global.console = undefined;
expect(() => {
console.log("Hello world!");
}).toThrow();
global.console = tempConsole;
});
test('should throw if log method is undefined', () => {
const tempLog = console.log;
console.log = undefined;
expect(() => {
console.log("Hello world!");
}).toThrow();
console.log = tempLog;
});
});
// Тесты производительности
describe('Console log performance', () => {
test('should execute within 1ms', () => {
const start = performance.now();
console.log("Hello world!");
const end = performance.now();
expect(end - start).toBeLessThan(1);
});
});
// Тесты на последовательные вызовы
describe('Console log sequential calls', () => {
let consoleSpy;
beforeEach(() => {
consoleSpy = jest.spyOn(console, 'log').mockImplementation(() => {});
});
afterEach(() => {
consoleSpy.mockRestore();
});
test('multiple calls should work correctly', () => {
console.log("Hello world!");
console.log("Hello world!");
console.log("Hello world!");
expect(consoleSpy).toHaveBeenCalledTimes(3);
expect(consoleSpy.mock.calls).toHaveLength(3);
expect(consoleSpy.mock.calls[0][0]).toBe("Hello world!");
expect(consoleSpy.mock.calls[1][0]).toBe("Hello world!");
expect(consoleSpy.mock.calls[2][0]).toBe("Hello world!");
});
});
>>31123
describe('Console log tests', () => {
let consoleSpy;
// Перед каждым тестом создаем шпиона для console.log
beforeEach(() => {
consoleSpy = jest.spyOn(console, 'log').mockImplementation(() => {});
});
// После каждого теста очищаем моки
afterEach(() => {
consoleSpy.mockRestore();
});
test('console.log should be called', () => {
console.log("Hello world!");
expect(consoleSpy).toHaveBeenCalled();
});
test('console.log should be called exactly once', () => {
console.log("Hello world!");
expect(consoleSpy).toHaveBeenCalledTimes(1);
});
test('console.log should be called with "Hello world!"', () => {
console.log("Hello world!");
expect(consoleSpy).toHaveBeenCalledWith("Hello world!");
});
test('console.log should not be called with wrong text', () => {
console.log("Hello world!");
expect(consoleSpy).not.toHaveBeenCalledWith("Goodbye world!");
});
test('console.log argument should be a string', () => {
console.log("Hello world!");
expect(typeof consoleSpy.mock.calls[0][0]).toBe('string');
});
test('console.log argument should have correct length', () => {
console.log("Hello world!");
expect(consoleSpy.mock.calls[0][0].length).toBe(12);
});
test('console.log argument should contain "Hello"', () => {
console.log("Hello world!");
expect(consoleSpy.mock.calls[0][0]).toContain('Hello');
});
test('console.log argument should match exact string', () => {
console.log("Hello world!");
expect(consoleSpy.mock.calls[0][0]).toMatch(/^Hello world!$/);
});
test('console.log should be called with non-empty string', () => {
console.log("Hello world!");
expect(consoleSpy.mock.calls[0][0]).not.toBe('');
});
test('console.log argument should start with "Hello"', () => {
console.log("Hello world!");
expect(consoleSpy.mock.calls[0][0]).toMatch(/^Hello/);
});
test('console.log argument should end with "!"', () => {
console.log("Hello world!");
expect(consoleSpy.mock.calls[0][0]).toMatch(/!$/);
});
test('console.log should be called with string containing space', () => {
console.log("Hello world!");
expect(consoleSpy.mock.calls[0][0]).toContain(' ');
});
test('console.log argument should have correct words count', () => {
console.log("Hello world!");
expect(consoleSpy.mock.calls[0][0].split(' ').length).toBe(2);
});
test('console.log argument should be case sensitive', () => {
console.log("Hello world!");
expect(consoleSpy.mock.calls[0][0]).not.toBe('hello world!');
});
});
// Тесты на обработку ошибок
describe('Console log error handling', () => {
test('should throw if console is undefined', () => {
const tempConsole = global.console;
global.console = undefined;
expect(() => {
console.log("Hello world!");
}).toThrow();
global.console = tempConsole;
});
test('should throw if log method is undefined', () => {
const tempLog = console.log;
console.log = undefined;
expect(() => {
console.log("Hello world!");
}).toThrow();
console.log = tempLog;
});
});
// Тесты производительности
describe('Console log performance', () => {
test('should execute within 1ms', () => {
const start = performance.now();
console.log("Hello world!");
const end = performance.now();
expect(end - start).toBeLessThan(1);
});
});
// Тесты на последовательные вызовы
describe('Console log sequential calls', () => {
let consoleSpy;
beforeEach(() => {
consoleSpy = jest.spyOn(console, 'log').mockImplementation(() => {});
});
afterEach(() => {
consoleSpy.mockRestore();
});
test('multiple calls should work correctly', () => {
console.log("Hello world!");
console.log("Hello world!");
console.log("Hello world!");
expect(consoleSpy).toHaveBeenCalledTimes(3);
expect(consoleSpy.mock.calls).toHaveLength(3);
expect(consoleSpy.mock.calls[0][0]).toBe("Hello world!");
expect(consoleSpy.mock.calls[1][0]).toBe("Hello world!");
expect(consoleSpy.mock.calls[2][0]).toBe("Hello world!");
});
});
describe('Console log tests', () => {
let consoleSpy;
// Перед каждым тестом создаем шпиона для console.log
beforeEach(() => {
consoleSpy = jest.spyOn(console, 'log').mockImplementation(() => {});
});
// После каждого теста очищаем моки
afterEach(() => {
consoleSpy.mockRestore();
});
test('console.log should be called', () => {
console.log("Hello world!");
expect(consoleSpy).toHaveBeenCalled();
});
test('console.log should be called exactly once', () => {
console.log("Hello world!");
expect(consoleSpy).toHaveBeenCalledTimes(1);
});
test('console.log should be called with "Hello world!"', () => {
console.log("Hello world!");
expect(consoleSpy).toHaveBeenCalledWith("Hello world!");
});
test('console.log should not be called with wrong text', () => {
console.log("Hello world!");
expect(consoleSpy).not.toHaveBeenCalledWith("Goodbye world!");
});
test('console.log argument should be a string', () => {
console.log("Hello world!");
expect(typeof consoleSpy.mock.calls[0][0]).toBe('string');
});
test('console.log argument should have correct length', () => {
console.log("Hello world!");
expect(consoleSpy.mock.calls[0][0].length).toBe(12);
});
test('console.log argument should contain "Hello"', () => {
console.log("Hello world!");
expect(consoleSpy.mock.calls[0][0]).toContain('Hello');
});
test('console.log argument should match exact string', () => {
console.log("Hello world!");
expect(consoleSpy.mock.calls[0][0]).toMatch(/^Hello world!$/);
});
test('console.log should be called with non-empty string', () => {
console.log("Hello world!");
expect(consoleSpy.mock.calls[0][0]).not.toBe('');
});
test('console.log argument should start with "Hello"', () => {
console.log("Hello world!");
expect(consoleSpy.mock.calls[0][0]).toMatch(/^Hello/);
});
test('console.log argument should end with "!"', () => {
console.log("Hello world!");
expect(consoleSpy.mock.calls[0][0]).toMatch(/!$/);
});
test('console.log should be called with string containing space', () => {
console.log("Hello world!");
expect(consoleSpy.mock.calls[0][0]).toContain(' ');
});
test('console.log argument should have correct words count', () => {
console.log("Hello world!");
expect(consoleSpy.mock.calls[0][0].split(' ').length).toBe(2);
});
test('console.log argument should be case sensitive', () => {
console.log("Hello world!");
expect(consoleSpy.mock.calls[0][0]).not.toBe('hello world!');
});
});
// Тесты на обработку ошибок
describe('Console log error handling', () => {
test('should throw if console is undefined', () => {
const tempConsole = global.console;
global.console = undefined;
expect(() => {
console.log("Hello world!");
}).toThrow();
global.console = tempConsole;
});
test('should throw if log method is undefined', () => {
const tempLog = console.log;
console.log = undefined;
expect(() => {
console.log("Hello world!");
}).toThrow();
console.log = tempLog;
});
});
// Тесты производительности
describe('Console log performance', () => {
test('should execute within 1ms', () => {
const start = performance.now();
console.log("Hello world!");
const end = performance.now();
expect(end - start).toBeLessThan(1);
});
});
// Тесты на последовательные вызовы
describe('Console log sequential calls', () => {
let consoleSpy;
beforeEach(() => {
consoleSpy = jest.spyOn(console, 'log').mockImplementation(() => {});
});
afterEach(() => {
consoleSpy.mockRestore();
});
test('multiple calls should work correctly', () => {
console.log("Hello world!");
console.log("Hello world!");
console.log("Hello world!");
expect(consoleSpy).toHaveBeenCalledTimes(3);
expect(consoleSpy.mock.calls).toHaveLength(3);
expect(consoleSpy.mock.calls[0][0]).toBe("Hello world!");
expect(consoleSpy.mock.calls[1][0]).toBe("Hello world!");
expect(consoleSpy.mock.calls[2][0]).toBe("Hello world!");
});
});
>>31335
нужно подать ЗАЯВКУ
нужно подать ЗАЯВКУ
>>31848
Бесплатный. Работает в РФ, на GPT4o + Claude Sonnet 3.5.
Жду, когда смогут сделать анализ всего проекта, как это было в Windsurf, пока они не забанили Россию.
Бесплатный. Работает в РФ, на GPT4o + Claude Sonnet 3.5.
Жду, когда смогут сделать анализ всего проекта, как это было в Windsurf, пока они не забанили Россию.
Подскажите, кто настраивал ВПН на винде, чтобы бы буржуи не знали, что я ими пользуюсь из РФ. Кто как решил эту задачу?
пользовался клоном вскод Cursor - за неделю перелопатил столько кода, как за полгода без него.
Там давали премиум на 2 недели или 500 запросов к ИИ. Когда запросы заканчивались, регал новый акк и продолжал.
Сегодня выскочило сообщение:
Too many free trial accounts used on this machine. Please upgrade to pro. We have this limit in place to prevent abuse. Please let us know if you believe this is a mistake.
- как сбросить эту настройку. Пока предполагаю, что надо настроить какое-то виртуальное окружение, чтобы после израсходования триала Курсор переводить в исходное состояние, после чего регать новый акк.
Какие идеи, как это сделать?
Там давали премиум на 2 недели или 500 запросов к ИИ. Когда запросы заканчивались, регал новый акк и продолжал.
Сегодня выскочило сообщение:
Too many free trial accounts used on this machine. Please upgrade to pro. We have this limit in place to prevent abuse. Please let us know if you believe this is a mistake.
- как сбросить эту настройку. Пока предполагаю, что надо настроить какое-то виртуальное окружение, чтобы после израсходования триала Курсор переводить в исходное состояние, после чего регать новый акк.
Какие идеи, как это сделать?
>>30943
Писать бойлерплейт, писать логирование, писать тесты, писать документацию, особенно по коду который писал не ты, делать ревью, работать за стековерфлоу. Я по приколу одному сервису даже архитектуру сгенерил с техзаданием и после пары правок эта же сеточка по тз приложуху написала с тестами, докерфайлами, чартами и так далее. Костыль этот давно в проде.
Хули там проверять? Зелёные строчки видишь - значит работают.
Писать бойлерплейт, писать логирование, писать тесты, писать документацию, особенно по коду который писал не ты, делать ревью, работать за стековерфлоу. Я по приколу одному сервису даже архитектуру сгенерил с техзаданием и после пары правок эта же сеточка по тз приложуху написала с тестами, докерфайлами, чартами и так далее. Костыль этот давно в проде.
> Проверять кем-то написанные тесты
Хули там проверять? Зелёные строчки видишь - значит работают.
>>41193
Да в общем-то любой. Это же чисто на костылях делается. План примерно следующий:
1) Пишешь в любой чат "ты техлид, у нас используется такой-то стек, вот такие входные данные, проведи со мной интервью чтобы выяснить детали архитектуры", отвечаешь на наводящие вопросы
2) Просишь по C4 модели сгенерить диаграмму, контекста, контейнеров, компонентов, по ходу поправляешь
3) Скармливаешь итоговый диалог, просишь сгенерить ридми, тз, ерд, умлки, план разработки
4) Добавляешь файлы в проект, чтобы они попали в контекст сеточки, и дальше любой кодописалкой по очереди копипастишь задачи из TODO.md
Я делал в aider, но в cursor composer, говорят, это проще делается
Да в общем-то любой. Это же чисто на костылях делается. План примерно следующий:
1) Пишешь в любой чат "ты техлид, у нас используется такой-то стек, вот такие входные данные, проведи со мной интервью чтобы выяснить детали архитектуры", отвечаешь на наводящие вопросы
2) Просишь по C4 модели сгенерить диаграмму, контекста, контейнеров, компонентов, по ходу поправляешь
3) Скармливаешь итоговый диалог, просишь сгенерить ридми, тз, ерд, умлки, план разработки
4) Добавляешь файлы в проект, чтобы они попали в контекст сеточки, и дальше любой кодописалкой по очереди копипастишь задачи из TODO.md
Я делал в aider, но в cursor composer, говорят, это проще делается
IDE GigaIDE https://gigaide.ru/
Кто тестировал уже?
Я бы потестил, но жду когда выпустят плагин для VSCode, потому что житбрейнсы закрыли нахуй скачивание плагинов без костылей.
Кто тестировал уже?
Я бы потестил, но жду когда выпустят плагин для VSCode, потому что житбрейнсы закрыли нахуй скачивание плагинов без костылей.