konveyer 0.1.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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Pavel (html5-studio.ru)
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/Makefile ADDED
@@ -0,0 +1,26 @@
1
+ # ===== Конвейер тасков — базовые команды =====
2
+ # make task T=KAN-12 взять задачу: ветка + worktree + Claude
3
+ # make pr открыть Pull Request (для ревью Copilot)
4
+ # make done T=KAN-12 влить ветку и прибрать за собой
5
+
6
+ BASE ?= main
7
+
8
+ task:
9
+ @test -n "$(T)" || { echo "Так: make task T=KAN-12"; exit 1; }
10
+ git fetch origin $(BASE)
11
+ git worktree add -b feature/$(T) ../wt-$(T) origin/$(BASE)
12
+ @cp .env ../wt-$(T)/.env 2>/dev/null || true
13
+ @echo "→ feature/$(T) готова в ../wt-$(T)"
14
+ cd ../wt-$(T) && claude "Возьми в работу задачу $(T). Работай по регламенту из CLAUDE.md: статусы в Jira, код, AI-ревью до Done."
15
+
16
+ pr:
17
+ git push -u origin HEAD
18
+ gh pr create --fill
19
+
20
+ done:
21
+ @test -n "$(T)" || { echo "Так: make done T=KAN-12"; exit 1; }
22
+ git checkout $(BASE) && git pull origin $(BASE)
23
+ git merge --no-ff feature/$(T) -m "merge: $(T)"
24
+ git push origin $(BASE)
25
+ git worktree remove ../wt-$(T) --force
26
+ git branch -d feature/$(T)
package/README.md ADDED
@@ -0,0 +1,51 @@
1
+ # Конвейер тасков — бесплатная часть
2
+
3
+ ИИ сам берёт задачи из Jira: читает описание, пишет код, проходит AI-ревью и закрывает тикет с комментарием. Это открытая часть курса — промпты, которые настраиваются за один вечер. Отдельный API-ключ не нужен: всё работает на вашей подписке Claude Code.
4
+
5
+ **Полный курс с пошаговой инструкцией:** [html5-studio.ru/kurs](https://html5-studio.ru/kurs)
6
+
7
+ ## Установка
8
+
9
+ ```bash
10
+ npx konveyer # что это, что уже настроено и что делать дальше
11
+ npx konveyer init # разложить промпты и Makefile в свой проект
12
+ npx konveyer prompt 1 # напечатать промпт (| pbcopy — сразу в буфер)
13
+ ```
14
+
15
+ Глобально ничего не ставится, зависимостей у пакета нет — `npx` отрабатывает мгновенно.
16
+
17
+ ## Что внутри
18
+
19
+ | Файл | Что делает |
20
+ |---|---|
21
+ | [prompts/prompt-1-razvedka.md](prompts/prompt-1-razvedka.md) | Учит ИИ вашей Jira-доске: статусы, переходы, задачи. Только чтение, ничего не меняет |
22
+ | [prompts/prompt-2-reglament.md](prompts/prompt-2-reglament.md) | Записывает регламент работы с Jira в CLAUDE.md — навык остаётся в каждой новой сессии |
23
+ | [prompts/prompt-3-rabota.md](prompts/prompt-3-rabota.md) | Рабочий режим: «возьми в работу KAN-12» — и всё |
24
+ | [prompts/prompt-4-reviewer.md](prompts/prompt-4-reviewer.md) | AI-ревьюер: отдельный агент проверяет каждую задачу перед Done по чек-листу с приоритетами P0–P3 |
25
+
26
+ ## Быстрый старт
27
+
28
+ 1. Jira Cloud (бесплатный план) + API-токен: id.atlassian.com → Security → Create API token
29
+ 2. `.env` в корне проекта: `JIRA_BASE_URL`, `JIRA_EMAIL`, `JIRA_API_TOKEN`, `JIRA_PROJECT` (и `.env` — в `.gitignore`!)
30
+ 3. `npm install -g @anthropic-ai/claude-code`, в папке проекта — `claude`, модель Fable
31
+ 4. Промпты 1 → 2 → 3 по очереди. Промпт 4 — когда захотите ревью
32
+
33
+ Подробная инструкция с картинками — [в бесплатном курсе](https://html5-studio.ru/kurs).
34
+
35
+ > **Нет своего проекта под рукой?** Возьмите готовый шаблон
36
+ > [ressh/konveyer-starter](https://github.com/ressh/konveyer-starter) (кнопка
37
+ > **«Use this template»**) — простое приложение и вся обвязка уже внутри
38
+ > (`Makefile`, `CLAUDE.md`, ревьюер). Останется вписать `.env` и запустить `make task`.
39
+
40
+ ## Уровни выше
41
+
42
+ Этот репозиторий — уровень 1: одна задача за раз. Полный конвейер, на котором мы разрабатываем [CHATBOSS.PRO](https://chatboss.pro), — это эпики и волны, git worktree на каждую задачу, два AI-ревьюера (код + архитектура) и staged deploy:
43
+
44
+ - **Мануал «AI-конвейер своими руками»** — [предзаказ 2 990 ₽](https://html5-studio.ru/manual)
45
+ - **Настройка под ключ** — [форматы и цены](https://html5-studio.ru/uslugi/ai-konveyer-zadach)
46
+
47
+ ## Обновления
48
+
49
+ Репозиторий пополняется по мере выхода глав мануала. Нажмите **Watch** (или ⭐), чтобы получить весточку.
50
+
51
+ Вопросы: Telegram [@paul_cop](https://t.me/paul_cop) · [html5-studio.ru](https://html5-studio.ru)
package/bin/cli.js ADDED
@@ -0,0 +1,196 @@
1
+ #!/usr/bin/env node
2
+ // =============================================================
3
+ // konveyer — бесплатная часть конвейера тасков.
4
+ //
5
+ // Без аргументов: экран онбординга — что уже есть в системе, какие промпты
6
+ // и в каком порядке скармливать Claude Code.
7
+ // konveyer init разложить промпты и Makefile в текущий проект
8
+ // konveyer prompt 1 напечатать промпт (удобно: konveyer prompt 1 | pbcopy)
9
+ //
10
+ // Зависимостей нет намеренно: npx должен отрабатывать мгновенно, а не тянуть
11
+ // половину реестра ради четырёх markdown-файлов.
12
+ // =============================================================
13
+
14
+ const fs = require('fs');
15
+ const path = require('path');
16
+ const { execFileSync } = require('child_process');
17
+
18
+ const ROOT = path.join(__dirname, '..');
19
+ const pkg = require(path.join(ROOT, 'package.json'));
20
+
21
+ // ── оформление ───────────────────────────────────────────────
22
+ // Цвет гасим, когда вывод уходит не в терминал (в пайп, в файл, в CI):
23
+ // иначе ESC-последовательности попадут в текст, который человек копирует.
24
+ const plain = !process.stdout.isTTY || process.env.NO_COLOR;
25
+ const c = (code, s) => (plain ? s : `\x1b[${code}m${s}\x1b[0m`);
26
+ const bold = (s) => c('1', s);
27
+ const dim = (s) => c('2', s);
28
+ const accent = (s) => c('36', s);
29
+ const ok = (s) => c('32', s);
30
+ const warn = (s) => c('33', s);
31
+
32
+ const PROMPTS = [
33
+ { n: 1, file: 'prompt-1-razvedka.md', title: 'научите ИИ вашей Jira', note: 'создаёт .env, проверяет связь, разведывает доску' },
34
+ { n: 2, file: 'prompt-2-reglament.md', title: 'закрепите навык в CLAUDE.md', note: 'регламент действует в каждой новой сессии' },
35
+ { n: 3, file: 'prompt-3-rabota.md', title: 'рабочий режим', note: '«возьми в работу KAN-12» — и всё' },
36
+ { n: 4, file: 'prompt-4-reviewer.md', title: 'AI-ревьюер', note: 'второй агент проверяет задачу перед Done' },
37
+ ];
38
+
39
+ // ── проверки окружения ───────────────────────────────────────
40
+
41
+ /** Есть ли команда в PATH. Тихо: отсутствие — обычное дело, не ошибка. */
42
+ function has(cmd) {
43
+ try {
44
+ execFileSync(process.platform === 'win32' ? 'where' : 'which', [cmd], { stdio: 'ignore' });
45
+ return true;
46
+ } catch {
47
+ return false;
48
+ }
49
+ }
50
+
51
+ function checks() {
52
+ const node = process.versions.node;
53
+ const nodeOk = Number(node.split('.')[0]) >= 18;
54
+ return [
55
+ { label: `Node ${node}`, ok: nodeOk, fix: 'нужен Node 18+: nodejs.org или nvm' },
56
+ { label: 'git', ok: has('git'), fix: 'поставьте git: git-scm.com' },
57
+ { label: 'Claude Code', ok: has('claude'), fix: 'npm install -g @anthropic-ai/claude-code' },
58
+ { label: '.env с доступом к Jira', ok: fs.existsSync(path.join(process.cwd(), '.env')), fix: 'создаст промпт №1 — это нормально на старте' },
59
+ ];
60
+ }
61
+
62
+ // ── экраны ───────────────────────────────────────────────────
63
+
64
+ function promo() {
65
+ console.log(dim('─'.repeat(62)));
66
+ console.log(`${bold('Дальше — «Конвейер тасков»')}: эпики и волны задач, отдельный`);
67
+ console.log('git worktree на каждую задачу, два AI-ревьюера (код и архитектура),');
68
+ console.log('приёмка волн и деплой. Несколько агентов работают параллельно и');
69
+ console.log('не мешают друг другу.');
70
+ console.log(` Ранний доступ: ${accent('https://html5-studio.ru/manual')}`);
71
+ console.log(` Вопросы автору: ${accent('https://t.me/paul_cop')}`);
72
+ }
73
+
74
+ function welcome() {
75
+ console.log('');
76
+ console.log(bold(' 🛠 Конвейер тасков — бесплатная часть'));
77
+ console.log(dim(' ИИ берёт тикет из Jira, пишет код, проходит ревью и закрывает задачу.'));
78
+ console.log('');
79
+
80
+ console.log(bold(' Что у вас есть:'));
81
+ for (const ch of checks()) {
82
+ console.log(ch.ok ? ` ${ok('✓')} ${ch.label}` : ` ${warn('•')} ${ch.label} ${dim('— ' + ch.fix)}`);
83
+ }
84
+ console.log('');
85
+
86
+ console.log(bold(' Промпты — скармливайте по порядку:'));
87
+ for (const p of PROMPTS) {
88
+ console.log(` ${accent(String(p.n))}. ${p.title} ${dim('— ' + p.note)}`);
89
+ }
90
+ console.log('');
91
+
92
+ console.log(bold(' Как пользоваться:'));
93
+ console.log(` ${accent('npx konveyer init')} разложить промпты и Makefile в этот проект`);
94
+ console.log(` ${accent('npx konveyer prompt 1')} напечатать промпт ${dim('(| pbcopy — сразу в буфер)')}`);
95
+ console.log('');
96
+ console.log(dim(' Инструкция с картинками: https://html5-studio.ru/kurs'));
97
+ console.log('');
98
+ promo();
99
+ console.log('');
100
+ }
101
+
102
+ /** Копирование без перезаписи: чужой файл в проекте человека — не наша вещь. */
103
+ function copyIfAbsent(from, to, label) {
104
+ if (fs.existsSync(to)) {
105
+ console.log(` ${dim('•')} ${label} ${dim('— уже есть, не трогаю')}`);
106
+ return false;
107
+ }
108
+ fs.cpSync(from, to, { recursive: true });
109
+ console.log(` ${ok('✓')} ${label}`);
110
+ return true;
111
+ }
112
+
113
+ function init() {
114
+ const cwd = process.cwd();
115
+ console.log('');
116
+ console.log(bold(` Раскладываю конвейер в ${cwd}`));
117
+ console.log('');
118
+
119
+ copyIfAbsent(path.join(ROOT, 'prompts'), path.join(cwd, 'prompts'), 'prompts/ — четыре промпта');
120
+ copyIfAbsent(path.join(ROOT, 'Makefile'), path.join(cwd, 'Makefile'), 'Makefile — make task / pr / done');
121
+
122
+ const envExample = path.join(cwd, '.env.example');
123
+ if (!fs.existsSync(envExample)) {
124
+ fs.writeFileSync(envExample, [
125
+ 'JIRA_BASE_URL=https://your-company.atlassian.net',
126
+ 'JIRA_EMAIL=you@example.com',
127
+ 'JIRA_API_TOKEN=',
128
+ 'JIRA_PROJECT=KAN',
129
+ '',
130
+ ].join('\n'));
131
+ console.log(` ${ok('✓')} .env.example — четыре поля для Jira`);
132
+ } else {
133
+ console.log(` ${dim('•')} .env.example ${dim('— уже есть, не трогаю')}`);
134
+ }
135
+
136
+ console.log('');
137
+ console.log(bold(' Дальше:'));
138
+ console.log(` 1. Токен Jira: ${accent('https://id.atlassian.com')} → Security → Create API token`);
139
+ console.log(` 2. ${accent('npx konveyer prompt 1')} → вставьте в Claude Code`);
140
+ console.log(' 3. Промпты 2 и 3 следом. Промпт 4 — когда захотите ревью');
141
+ console.log('');
142
+ console.log(warn(' Не забудьте: .env — в .gitignore. В нём токен доступа к вашей Jira.'));
143
+ console.log('');
144
+ }
145
+
146
+ function printPrompt(arg) {
147
+ const found = PROMPTS.find((p) => String(p.n) === String(arg));
148
+ if (!found) {
149
+ console.error(`Промпт «${arg}» не найден. Есть: 1, 2, 3, 4.`);
150
+ process.exit(1);
151
+ }
152
+ // Печатаем как есть, без рамок и цвета: этот вывод человек копирует в чат.
153
+ process.stdout.write(fs.readFileSync(path.join(ROOT, 'prompts', found.file), 'utf8'));
154
+ }
155
+
156
+ function help() {
157
+ console.log(`
158
+ konveyer — бесплатная часть конвейера тасков
159
+
160
+ ${accent('npx konveyer')} экран онбординга: что есть, что дальше
161
+ ${accent('npx konveyer init')} разложить промпты и Makefile в текущий проект
162
+ ${accent('npx konveyer prompt N')} напечатать промпт N (1–4)
163
+ ${accent('npx konveyer --version')} версия пакета
164
+
165
+ Документация: https://html5-studio.ru/kurs
166
+ `);
167
+ }
168
+
169
+ // ── разбор аргументов ────────────────────────────────────────
170
+
171
+ const [cmd, arg] = process.argv.slice(2);
172
+
173
+ switch (cmd) {
174
+ case undefined:
175
+ welcome();
176
+ break;
177
+ case 'init':
178
+ init();
179
+ break;
180
+ case 'prompt':
181
+ printPrompt(arg);
182
+ break;
183
+ case 'help':
184
+ case '--help':
185
+ case '-h':
186
+ help();
187
+ break;
188
+ case 'version':
189
+ case '--version':
190
+ case '-v':
191
+ console.log(pkg.version);
192
+ break;
193
+ default:
194
+ console.error(`Неизвестная команда «${cmd}». Подсказка: npx konveyer help`);
195
+ process.exit(1);
196
+ }
package/package.json ADDED
@@ -0,0 +1,38 @@
1
+ {
2
+ "name": "konveyer",
3
+ "version": "0.1.0",
4
+ "description": "AI-конвейер задач: ИИ берёт тикет из Jira, пишет код, проходит AI-ревью и закрывает задачу. Промпты для Claude Code.",
5
+ "keywords": [
6
+ "jira",
7
+ "claude",
8
+ "claude-code",
9
+ "ai-agent",
10
+ "ai-review",
11
+ "automation",
12
+ "workflow",
13
+ "konveyer"
14
+ ],
15
+ "homepage": "https://html5-studio.ru/kurs",
16
+ "repository": {
17
+ "type": "git",
18
+ "url": "git+https://github.com/ressh/konveyer-taskov.git"
19
+ },
20
+ "bugs": {
21
+ "url": "https://github.com/ressh/konveyer-taskov/issues"
22
+ },
23
+ "author": "html5-studio (https://html5-studio.ru)",
24
+ "license": "MIT",
25
+ "bin": {
26
+ "konveyer": "bin/cli.js"
27
+ },
28
+ "files": [
29
+ "bin/",
30
+ "prompts/",
31
+ "Makefile",
32
+ "README.md",
33
+ "LICENSE"
34
+ ],
35
+ "engines": {
36
+ "node": ">=18"
37
+ }
38
+ }
@@ -0,0 +1,13 @@
1
+ # Промпт №1 — научите ИИ вашей Jira
2
+
3
+ ИИ создаст `.env` (вы впишете четыре значения), проверит связь и разведает доску — статусы, переходы, задачи. В Jira ничего не меняется.
4
+
5
+ Проверка: показал имя вашего аккаунта — связка работает. Ошибка 401 — перепроверьте email и токен в `.env`.
6
+
7
+ ```
8
+ Настраиваем работу с моей Jira Cloud. Доступы держим в .env в корне проекта: JIRA_BASE_URL, JIRA_EMAIL, JIRA_API_TOKEN, JIRA_PROJECT. Токен нельзя выводить в чат, логи или код и нельзя просить меня вставлять его в сообщения — значения я впишу в файл сам.
9
+
10
+ Шаг 1. Если .env нет — создай его с этими четырьмя заглушками, добавь .env в .gitignore и объясни, где взять каждое значение (адрес Jira, почта аккаунта, API-токен с id.atlassian.com, ключ проекта). Остановись и жди моего «готово».
11
+
12
+ Шаг 2. Когда скажу «готово» — проверь связь и разведай доску, ничего в ней не меняя: чьим аккаунтом подключились, какие типы задач и статусы на доске, какие переходы между статусами доступны, какие последние задачи. Как обращаться к Jira — реши сам под мой проект. В конце — короткая сводка и что лежит в To Do.
13
+ ```
@@ -0,0 +1,22 @@
1
+ # Промпт №2 — закрепите навык в системных настройках
2
+
3
+ ИИ запишет регламент работы в `CLAUDE.md` — память Claude Code. Навык будет действовать в каждой новой сессии.
4
+
5
+ Проверка: в корне появился (или дополнился) `CLAUDE.md` с разделом «Работа с Jira», а `.env` числится в `.gitignore`.
6
+
7
+ ```
8
+ Связка с Jira работает — закрепи навык в CLAUDE.md, чтобы он действовал в каждой новой сессии. Создай или дополни раздел:
9
+
10
+ ## Работа с Jira
11
+ - Доступы — в .env (JIRA_BASE_URL, JIRA_EMAIL, JIRA_API_TOKEN, JIRA_PROJECT). Токен не выводить в чат, логи и код. .env должен быть в .gitignore.
12
+ - Команда «возьми в работу {ключ}» — это полный цикл задачи:
13
+ 1. Прочитать задачу. Нет критерия приёмки — сформулировать и показать мне до старта.
14
+ 2. Перевести в работу на доске.
15
+ 3. Сделать в коде проекта.
16
+ 4. Отдать отдельному субагенту-ревьюеру: приёмка, ошибки, крайние случаи, стиль. Замечания исправить до закрытия.
17
+ 5. Закрыть задачу (через Review/Testing, если такие колонки есть) с комментарием: что сделано, какие файлы затронуты.
18
+ - Крупную задачу — сначала предложить разбить на подзадачи и дождаться моего «ок».
19
+ - «Стоп» — аккуратно завершить шаг и записать в Jira честный статус.
20
+
21
+ Запиши, покажи итоговый CLAUDE.md и подтверди готовность.
22
+ ```
@@ -0,0 +1,9 @@
1
+ # Промпт №3 — рабочий режим: задача по номеру
2
+
3
+ Это всё. Теперь ваш ежедневный «промпт» — одна строка с номером тикета. Остальное ИИ делает по регламенту из `CLAUDE.md`.
4
+
5
+ Замените KAN-12 на ключ своей задачи. Работает и в новых сессиях: регламент уже в `CLAUDE.md`.
6
+
7
+ ```
8
+ Возьми в работу задачу KAN-12.
9
+ ```
@@ -0,0 +1,30 @@
1
+ # Промпт №4 — AI-ревьюер: второй взгляд на каждую задачу
2
+
3
+ Автор кода — плохой судья своему коду, даже если автор ИИ. Отдельный агент со свежим контекстом ловит то, что замылилось: несоответствие приёмке, крайние случаи, секреты в коде. На CHATBOSS.PRO ревью проходит каждая задача.
4
+
5
+ После промпта в `CLAUDE.md` появится раздел «AI-ревью», и каждая задача перед Done проходит проверку с приоритетами P0–P3.
6
+
7
+ ```
8
+ Дополни CLAUDE.md разделом «AI-ревью» и работай по нему при закрытии каждой задачи:
9
+
10
+ ## AI-ревью
11
+ - Перед Done запускай отдельного субагента-ревьюера со свежим контекстом. Дай ему критерий приёмки и diff изменений.
12
+ - Проверяй: соответствие приёмке; ошибки и крайние случаи (пустые данные, null, гонки); безопасность (секреты в коде, инъекции, открытые эндпоинты); читаемость и стиль проекта.
13
+ - Каждое замечание — с приоритетом: P0 блокирует Done, P1 исправить сейчас, P2 отложить (завести задачу), P3 вкусовщина.
14
+ - P0/P1 чини сразу и прогоняй ревью повторно. Закрывать задачу можно только с пустым P0/P1.
15
+ - Итог ревью — комментарием к задаче: сколько замечаний и что исправлено.
16
+
17
+ Запиши раздел, покажи CLAUDE.md и подтверди готовность.
18
+ ```
19
+
20
+ ## Лайфхак: бесплатный ревьюер из GitHub Copilot
21
+
22
+ Если код на GitHub — второй взгляд можно получить бесплатно:
23
+
24
+ 1. Запушьте ветку, откройте Pull Request.
25
+ 2. В Reviewers выберите **Copilot** («Request review from Copilot»).
26
+ 3. Через пару минут он оставит построчные комментарии.
27
+ 4. Отдайте их исполнителю: «исправь замечания из ревью PR».
28
+ 5. В настройках репозитория можно включить авто-ревью каждого PR.
29
+
30
+ Под капотом — GPT-4.1: уровень кода (типы, крайние случаи, забытые проверки) ловит стабильно, архитектуру хуже — для неё в полном конвейере второй ревьюер. Тариф Copilot Free работает без карты.