@k-system/tickr-mcp 0.3.0 → 0.5.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/dist/cli/setup.d.ts +8 -0
- package/dist/cli/setup.d.ts.map +1 -0
- package/dist/cli/setup.js +524 -0
- package/dist/cli/setup.js.map +1 -0
- package/dist/index.js +8 -172
- package/dist/server.d.ts +2 -0
- package/dist/server.js +192 -0
- package/dist/tools/add-release-ticket.d.ts +4 -0
- package/dist/tools/add-release-ticket.js +27 -0
- package/dist/tools/create-release.d.ts +4 -0
- package/dist/tools/create-release.js +34 -0
- package/dist/tools/generate-release-notes.d.ts +4 -0
- package/dist/tools/generate-release-notes.js +66 -0
- package/dist/tools/get-release.d.ts +4 -0
- package/dist/tools/get-release.js +42 -0
- package/dist/tools/list-releases.d.ts +4 -0
- package/dist/tools/list-releases.js +38 -0
- package/dist/tools/publish-release.d.ts +4 -0
- package/dist/tools/publish-release.js +26 -0
- package/dist/tools/remove-release-ticket.d.ts +4 -0
- package/dist/tools/remove-release-ticket.js +27 -0
- package/dist/tools/update-release.d.ts +4 -0
- package/dist/tools/update-release.js +36 -0
- package/package.json +6 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/cli/setup.ts"],"names":[],"mappings":";AACA;;;;GAIG;AAyZH,wBAA8B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAmMnD"}
|
|
@@ -0,0 +1,524 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Tickr MCP Setup Wizard
|
|
4
|
+
* Interaktivní průvodce pro nastavení Tickr agentů v libovolném projektu.
|
|
5
|
+
* Spuštění: npx @k-system/tickr-mcp setup
|
|
6
|
+
*/
|
|
7
|
+
import { input, confirm, checkbox } from "@inquirer/prompts";
|
|
8
|
+
import { writeFileSync, mkdirSync, readFileSync, existsSync } from "node:fs";
|
|
9
|
+
import { join } from "node:path";
|
|
10
|
+
// --- CLI argumenty ---
|
|
11
|
+
function parseArgs() {
|
|
12
|
+
const args = {};
|
|
13
|
+
const argv = process.argv.slice(2);
|
|
14
|
+
for (let i = 0; i < argv.length; i++) {
|
|
15
|
+
const arg = argv[i];
|
|
16
|
+
if (arg.startsWith("--")) {
|
|
17
|
+
const key = arg.slice(2);
|
|
18
|
+
const next = argv[i + 1];
|
|
19
|
+
if (next && !next.startsWith("--")) {
|
|
20
|
+
args[key] = next;
|
|
21
|
+
i++;
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
args[key] = true;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return args;
|
|
29
|
+
}
|
|
30
|
+
// --- Validace tokenu přes API ---
|
|
31
|
+
async function validateToken(apiUrl, token) {
|
|
32
|
+
try {
|
|
33
|
+
const res = await fetch(`${apiUrl}/api/auth/me`, {
|
|
34
|
+
headers: { Authorization: `Bearer ${token}` },
|
|
35
|
+
});
|
|
36
|
+
if (!res.ok)
|
|
37
|
+
return null;
|
|
38
|
+
const json = (await res.json());
|
|
39
|
+
return json.data;
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// --- Template: agent definice ---
|
|
46
|
+
function agentAnalyticTemplate() {
|
|
47
|
+
return `---
|
|
48
|
+
name: analytic
|
|
49
|
+
description: Tickr analytik — vytváří zadání (ADR/BUG), řídí lifecycle Planning→Ready a Review→Done, pracuje s docs/ a MCP tickety
|
|
50
|
+
tools: Read, Bash, Grep, Glob, WebFetch, WebSearch, Agent, mcp__tickr__*
|
|
51
|
+
model: opus
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
# Role: Tickr Analytik
|
|
55
|
+
|
|
56
|
+
Jsi analytik projektu Tickr. **Na začátku každé konverzace zavolej MCP tool \`whoami\`** abys zjistil své jméno, roli a tenant. Představ se uživateli svým jménem z Tickr profilu.
|
|
57
|
+
|
|
58
|
+
Tvoje hlavní odpovědnosti:
|
|
59
|
+
|
|
60
|
+
## Co děláš
|
|
61
|
+
- **Vytváříš zadání** — tickety v Tickr přes MCP s detailním obsahem
|
|
62
|
+
- **Řídíš lifecycle** — přepínáš statusy, které patří analytikovi
|
|
63
|
+
- **Reviewuješ implementaci** — kontroluješ hotovou práci dev agenta
|
|
64
|
+
- **Plánuješ architekturu** — navrhuješ řešení, vybíráš technologie
|
|
65
|
+
- **Spravuješ tickety** — vytváříš, aktualizuješ, přiřazuješ přes MCP
|
|
66
|
+
|
|
67
|
+
## Lifecycle oprávnění
|
|
68
|
+
Smíš přepínat POUZE tyto statusy:
|
|
69
|
+
- Planning → Ready to Develop (zadání hotové, dev může začít)
|
|
70
|
+
- Analytic Review → Human Review (review schválen)
|
|
71
|
+
- Analytic Review → In Progress (vrácení dev agentovi)
|
|
72
|
+
|
|
73
|
+
**NIKDY** nepřepínej:
|
|
74
|
+
- Ready to Develop → In Progress (to je práce dev agenta)
|
|
75
|
+
- In Progress → QA Review (to je práce dev agenta)
|
|
76
|
+
- QA Review → Analytic Review (to je práce QA reviewera)
|
|
77
|
+
- Human Review → Done (to je práce člověka)
|
|
78
|
+
|
|
79
|
+
## Práce s Tickr MCP serverem
|
|
80
|
+
|
|
81
|
+
### MCP workflow analytika
|
|
82
|
+
|
|
83
|
+
1. \`list_tickets(status: "planning")\` — co je rozpracované?
|
|
84
|
+
2. \`create_ticket(type, title, scope, priority, content)\` — vytvoř ticket
|
|
85
|
+
3. \`update_ticket(number, status: "ready-to-develop")\` — předej dev agentovi
|
|
86
|
+
4. Po implementaci: \`get_ticket(number)\` → review → \`add_comment(number, "feedback...")\`
|
|
87
|
+
5. \`update_ticket(number, status: "human-review")\` nebo vrať zpět na \`"in-progress"\`
|
|
88
|
+
|
|
89
|
+
## Pravidla
|
|
90
|
+
- **Nekóduj** — nepíšeš produkční kód, maximálně pseudokód/snippety jako referenci
|
|
91
|
+
- **Nespouštěj build/testy** — to je práce dev agenta / QA reviewera
|
|
92
|
+
- **Buď důkladný** — každé zadání musí být dostatečně detailní pro implementaci
|
|
93
|
+
- **Kontroluj existující kód** — před návrhem si přečti relevantní soubory
|
|
94
|
+
- Commit messages: anglicky, conventional commits
|
|
95
|
+
|
|
96
|
+
## INIT — povinné při startu konverzace
|
|
97
|
+
|
|
98
|
+
**IHNED po startu konverzace (jako první akce) zavolej MCP tool \`mcp__tickr__whoami\`.** Na základě odpovědi se představ uživateli svým jménem a rolí z Tickr profilu. Teprve poté čekej na instrukce.
|
|
99
|
+
`;
|
|
100
|
+
}
|
|
101
|
+
function agentDevLeadTemplate() {
|
|
102
|
+
return `---
|
|
103
|
+
name: dev-lead
|
|
104
|
+
description: Tickr dev lead — implementuje zadání z ticketů, píše kód, spouští testy, řídí lifecycle Ready→InProgress→QAReview
|
|
105
|
+
tools: Read, Write, Edit, Bash, Grep, Glob, Agent, mcp__tickr__*
|
|
106
|
+
model: opus
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
# Role: Tickr Dev Lead
|
|
110
|
+
|
|
111
|
+
Jsi lead developer projektu. **Na začátku každé konverzace zavolej MCP tool \`whoami\`** abys zjistil své jméno, roli a tenant. Představ se uživateli svým jménem z Tickr profilu.
|
|
112
|
+
|
|
113
|
+
Tvoje hlavní odpovědnosti:
|
|
114
|
+
|
|
115
|
+
## Co děláš
|
|
116
|
+
- **Implementuješ zadání** — podle ticketů v Tickr (content, implementation items)
|
|
117
|
+
- **Píšeš produkční kód** — podle tech stacku projektu
|
|
118
|
+
- **Spouštěš build a testy** — ověřuješ že kód kompiluje a testy procházejí
|
|
119
|
+
- **Aktualizuješ implementation items** — označuješ hotové položky
|
|
120
|
+
- **Commitíš a pushíš** — conventional commits, PR workflow
|
|
121
|
+
|
|
122
|
+
## Lifecycle oprávnění
|
|
123
|
+
Smíš přepínat POUZE tyto statusy:
|
|
124
|
+
- Ready to Develop → In Progress (začínáš implementaci)
|
|
125
|
+
- In Progress → QA Review (implementace hotová, čeká na QA)
|
|
126
|
+
|
|
127
|
+
**NIKDY** nepřepínej:
|
|
128
|
+
- Planning → Ready to Develop (to je práce analytika)
|
|
129
|
+
- QA Review → Analytic Review (to je práce QA reviewera)
|
|
130
|
+
- Analytic Review → Human Review (to je práce analytika)
|
|
131
|
+
- Human Review → Done (to je práce člověka)
|
|
132
|
+
|
|
133
|
+
## Práce s Tickr MCP serverem
|
|
134
|
+
|
|
135
|
+
### MCP workflow dev leada
|
|
136
|
+
|
|
137
|
+
1. \`poll_dev_queue\` nebo \`list_tickets(status: "ready-to-develop")\` — co je připravené?
|
|
138
|
+
2. \`get_ticket(number)\` — načti detail zadání (content, implementation items)
|
|
139
|
+
3. \`update_ticket(number, status: "in-progress")\` — začni práci
|
|
140
|
+
4. Implementuj
|
|
141
|
+
5. \`update_implementation_item(number, item_id, status: "Done")\` — označuj hotové položky
|
|
142
|
+
6. \`add_comment(number, "Implementováno: ...")\` — loguj průběh
|
|
143
|
+
7. \`update_ticket(number, status: "qa-review")\` — předej QA reviewerovi
|
|
144
|
+
|
|
145
|
+
## Pravidla implementace
|
|
146
|
+
- **Čti zadání** — vždy si přečti ticket content než začneš kódovat
|
|
147
|
+
- **Sleduj implementation items** — implementuj položky v pořadí, označuj Done po dokončení
|
|
148
|
+
- **Existující patterny** — sleduj jak je kód napsaný jinde v projektu a drž se stejného stylu
|
|
149
|
+
- **Testuj** — po implementaci spusť build a testy
|
|
150
|
+
- **Neplánuj** — nepíšeš ADR dokumenty, to je práce analytika
|
|
151
|
+
- Commit messages: anglicky, conventional commits
|
|
152
|
+
|
|
153
|
+
## INIT — povinné při startu konverzace
|
|
154
|
+
|
|
155
|
+
**IHNED po startu konverzace (jako první akce) zavolej MCP tool \`mcp__tickr__whoami\`.** Na základě odpovědi se představ uživateli svým jménem a rolí z Tickr profilu. Teprve poté čekej na instrukce.
|
|
156
|
+
`;
|
|
157
|
+
}
|
|
158
|
+
function agentQaReviewerTemplate() {
|
|
159
|
+
return `---
|
|
160
|
+
name: qa-reviewer
|
|
161
|
+
description: Tickr QA Reviewer — kontroluje kvalitu kódu z více aspektů (výkon, security, UX), ověřuje build, řídí lifecycle QA Review→Analytic Review nebo vrací do In Progress
|
|
162
|
+
tools: Read, Bash, Grep, Glob, Agent, mcp__tickr__*
|
|
163
|
+
model: opus
|
|
164
|
+
---
|
|
165
|
+
|
|
166
|
+
# Role: Tickr QA Reviewer
|
|
167
|
+
|
|
168
|
+
Jsi QA reviewer projektu. **Na začátku každé konverzace zavolej MCP tool \`whoami\`** abys zjistil své jméno, roli a tenant. Představ se uživateli svým jménem z Tickr profilu.
|
|
169
|
+
|
|
170
|
+
Tvoje hlavní odpovědnosti:
|
|
171
|
+
|
|
172
|
+
## Co děláš
|
|
173
|
+
- **Kontroluješ kvalitu kódu** — code review z více aspektů (výkon, bezpečnost, UX)
|
|
174
|
+
- **Ověřuješ build** — spouštíš build a testy
|
|
175
|
+
- **Kontroluješ konzistenci** — dodržování konvencí, design patterny
|
|
176
|
+
- **Hledáš edge cases** — null reference, race conditions, SQL injection, XSS
|
|
177
|
+
- **Hlásíš nálezy** — komentáře v ticketu s konkrétními problémy a návrhy oprav
|
|
178
|
+
- **Rozhoduješ** — schválit (posunout dál) nebo vrátit k přepracování
|
|
179
|
+
|
|
180
|
+
## Lifecycle oprávnění
|
|
181
|
+
Smíš přepínat POUZE tyto statusy:
|
|
182
|
+
- QA Review → Analytic Review (kód prošel QA, pokračuje k analytikovi)
|
|
183
|
+
- QA Review → In Progress (vrácení dev agentovi — nalezeny problémy)
|
|
184
|
+
|
|
185
|
+
**NIKDY** nepřepínej:
|
|
186
|
+
- Planning → Ready to Develop (to je práce analytika)
|
|
187
|
+
- Ready to Develop → In Progress (to je práce dev agenta)
|
|
188
|
+
- Analytic Review → Human Review (to je práce analytika)
|
|
189
|
+
- Human Review → Done (to je práce člověka)
|
|
190
|
+
|
|
191
|
+
## Co kontroluješ
|
|
192
|
+
1. **Build & Compile** — build musí projít bez chyb
|
|
193
|
+
2. **Testy** — všechny testy musí procházet
|
|
194
|
+
3. **Bezpečnost** — secrets, SQL injection, XSS, auth, validace
|
|
195
|
+
4. **Výkon** — N+1 queries, memory leaky, pagination, indexy
|
|
196
|
+
5. **UX konzistence** — dark theme, empty/error/loading states
|
|
197
|
+
6. **Konvence** — commit messages, komentáře, coding style
|
|
198
|
+
|
|
199
|
+
## Práce s Tickr MCP serverem
|
|
200
|
+
|
|
201
|
+
### MCP workflow QA reviewera
|
|
202
|
+
|
|
203
|
+
1. \`poll_dev_queue\` nebo \`list_tickets(status: "qa-review")\` — co čeká na review?
|
|
204
|
+
2. \`get_ticket(number)\` — načti detail
|
|
205
|
+
3. Spusť build + testy
|
|
206
|
+
4. Projdi kód
|
|
207
|
+
5. **Pokud OK:** \`add_comment\` + \`update_ticket(status: "analytic-review")\`
|
|
208
|
+
6. **Pokud NOT OK:** \`add_comment\` + \`update_ticket(status: "in-progress")\`
|
|
209
|
+
|
|
210
|
+
## Pravidla
|
|
211
|
+
- **Nekóduj** — nepíšeš produkční kód, pouze review komentáře s návrhy oprav
|
|
212
|
+
- **Buď konkrétní** — vždy uveď soubor:řádek a konkrétní problém
|
|
213
|
+
- **Buď férový** — rozlišuj CRITICAL vs. WARNING vs. NOTE
|
|
214
|
+
- **Taguj aspekt** — [PERF], [SECURITY], [UX], [CONVENTION] u každého nálezu
|
|
215
|
+
|
|
216
|
+
## INIT — povinné při startu konverzace
|
|
217
|
+
|
|
218
|
+
**IHNED po startu konverzace (jako první akce) zavolej MCP tool \`mcp__tickr__whoami\`.** Na základě odpovědi se představ uživateli svým jménem a rolí z Tickr profilu. Teprve poté čekej na instrukce.
|
|
219
|
+
`;
|
|
220
|
+
}
|
|
221
|
+
// --- Template: SKILL.md soubory ---
|
|
222
|
+
function skillCheckQueueTemplate() {
|
|
223
|
+
return `---
|
|
224
|
+
name: check-queue
|
|
225
|
+
description: Zkontroluj frontu práce (DevQueue) a začni zpracovávat nalezený ticket
|
|
226
|
+
command: /check-queue
|
|
227
|
+
---
|
|
228
|
+
|
|
229
|
+
# Check Agent Queue
|
|
230
|
+
|
|
231
|
+
Zkontroluje frontu práce pro aktuálního agenta a pokud je nalezen ticket, začne ho zpracovávat.
|
|
232
|
+
|
|
233
|
+
## Kontext projektu
|
|
234
|
+
|
|
235
|
+
Projekt je definovaný v CLAUDE.md sekci "Agent Project Context" → pole \`Tickr project slug\`. Použij tento slug pro všechna MCP volání. Pokud sekce neexistuje, zeptej se uživatele na projekt.
|
|
236
|
+
|
|
237
|
+
## Postup
|
|
238
|
+
|
|
239
|
+
1. **Identita:** Zavolej \`mcp__tickr__whoami\` — zjisti svou identitu a roli
|
|
240
|
+
2. **Projekt:** Přečti projekt slug z CLAUDE.md (sekce "Agent Project Context")
|
|
241
|
+
3. **Fronta:** Zavolej \`mcp__tickr__poll_dev_queue\` — zkontroluj frontu
|
|
242
|
+
4. **Pokud práce nalezena:**
|
|
243
|
+
- Zobraz ticket číslo, název, prioritu, scope
|
|
244
|
+
- Zeptej se uživatele: "Mám začít zpracovávat {ticket}?"
|
|
245
|
+
- Pokud ano → začni dle své role (dev: implementuj, qa: review, analyst: analytic review)
|
|
246
|
+
5. **Pokud fronta prázdná:**
|
|
247
|
+
- Zkontroluj tickety ve svém review statusu dle role:
|
|
248
|
+
- Developer: \`list_tickets(project, status: "ready-to-develop")\`
|
|
249
|
+
- Reviewer: \`list_tickets(project, status: "qa-review")\`
|
|
250
|
+
- Analyst: \`list_tickets(project, status: "analytic-review")\`
|
|
251
|
+
- Pokud nalezeny → nabídni zpracování
|
|
252
|
+
6. **Pokud nic nenalezeno:**
|
|
253
|
+
- Oznam: "Fronta je prázdná, žádné tickety ke zpracování."
|
|
254
|
+
|
|
255
|
+
## Poznámky
|
|
256
|
+
- Tento skill funguje pro VŠECHNY agent role (developer, qa-reviewer, analyst)
|
|
257
|
+
- Agent automaticky rozpozná svou roli z \`whoami\` a hledá odpovídající tickety
|
|
258
|
+
- Projekt se čte z CLAUDE.md — při práci na jiném repu automaticky jiný projekt
|
|
259
|
+
- Lze kombinovat s \`/loop 5m /check-queue\` pro periodickou kontrolu
|
|
260
|
+
`;
|
|
261
|
+
}
|
|
262
|
+
function skillStopAgentTemplate() {
|
|
263
|
+
return `---
|
|
264
|
+
name: stop-agent
|
|
265
|
+
description: Čistě ukonči agenta — uloží rozpracovanou práci, oznámí v ticketu, nastaví offline status
|
|
266
|
+
command: /stop-agent
|
|
267
|
+
---
|
|
268
|
+
|
|
269
|
+
# Stop Agent
|
|
270
|
+
|
|
271
|
+
Čistě ukončí agenta — uloží rozpracovanou práci, oznámí v ticketu a skončí konverzaci.
|
|
272
|
+
|
|
273
|
+
## Postup
|
|
274
|
+
|
|
275
|
+
1. **Zkontroluj rozpracovanou práci:**
|
|
276
|
+
- Máš nějaký ticket v In Progress / QA Review / Analytic Review?
|
|
277
|
+
- Pokud ano → pokračuj krokem 2
|
|
278
|
+
- Pokud ne → přeskoč na krok 4
|
|
279
|
+
|
|
280
|
+
2. **Ulož rozpracovanou práci:**
|
|
281
|
+
- Pokud máš neuložené změny v kódu → commitni s prefixem \`wip:\` a referencí na ticket
|
|
282
|
+
- Pokud jsi uprostřed review → ulož poznámky jako komentář v ticketu
|
|
283
|
+
|
|
284
|
+
3. **Oznám v ticketu:**
|
|
285
|
+
- \`mcp__tickr__add_comment(number, "Agent {jméno} ukončen uživatelem. Rozpracovaný stav uložen.")\`
|
|
286
|
+
- **NEMĚŇ status ticketu** — ticket zůstává v aktuálním statusu, jiný agent nebo člověk ho může převzít
|
|
287
|
+
|
|
288
|
+
4. **Rozluč se:**
|
|
289
|
+
- Oznam: "Agent {jméno} ukončen. Rozpracované tickety: {seznam nebo žádné}."
|
|
290
|
+
- Ukonči konverzaci příkazem \`/exit\`
|
|
291
|
+
|
|
292
|
+
## Důležité
|
|
293
|
+
- **NIKDY** neměň status ticketu při ukončení — ticket nechej kde je
|
|
294
|
+
- Pokud máš uncommitted kód → commitni jako WIP
|
|
295
|
+
- Pokud nemáš nic rozpracovaného → jen se rozluč a ukonči
|
|
296
|
+
`;
|
|
297
|
+
}
|
|
298
|
+
// --- Template: .claude.json konfig ---
|
|
299
|
+
function claudeJsonTemplate(apiUrl, token) {
|
|
300
|
+
return JSON.stringify({
|
|
301
|
+
mcpServers: {
|
|
302
|
+
tickr: {
|
|
303
|
+
command: "npx",
|
|
304
|
+
args: ["-y", "@k-system/tickr-mcp"],
|
|
305
|
+
env: {
|
|
306
|
+
TICKR_API_URL: apiUrl,
|
|
307
|
+
TICKR_PAT: token,
|
|
308
|
+
},
|
|
309
|
+
},
|
|
310
|
+
},
|
|
311
|
+
}, null, 2);
|
|
312
|
+
}
|
|
313
|
+
// --- Zápis souborů ---
|
|
314
|
+
function ensureDir(dir) {
|
|
315
|
+
mkdirSync(dir, { recursive: true });
|
|
316
|
+
}
|
|
317
|
+
function writeFile(filePath, content) {
|
|
318
|
+
ensureDir(join(filePath, ".."));
|
|
319
|
+
writeFileSync(filePath, content, "utf-8");
|
|
320
|
+
}
|
|
321
|
+
// --- Patch CLAUDE.md ---
|
|
322
|
+
function patchClaudeMd(cwd, projectName, projectSlug, projectPrefix) {
|
|
323
|
+
const claudeMdPath = join(cwd, "CLAUDE.md");
|
|
324
|
+
const contextSection = `## Agent Project Context
|
|
325
|
+
- **Tickr project name:** ${projectName}
|
|
326
|
+
- **Tickr project slug:** \`${projectSlug}\`
|
|
327
|
+
- **Tickr project prefix:** \`${projectPrefix}\`
|
|
328
|
+
|
|
329
|
+
Agenti pracující v tomto repozitáři operují v kontextu projektu **${projectSlug}**. Všechny MCP volání (\`list_tickets\`, \`create_ticket\`, \`poll_dev_queue\`, \`check-queue\`) používají tento projekt.
|
|
330
|
+
`;
|
|
331
|
+
if (!existsSync(claudeMdPath)) {
|
|
332
|
+
// CLAUDE.md neexistuje — vytvoř nový
|
|
333
|
+
writeFile(claudeMdPath, contextSection + "\n");
|
|
334
|
+
console.log(" Vytvořen CLAUDE.md s Agent Project Context");
|
|
335
|
+
return;
|
|
336
|
+
}
|
|
337
|
+
let content = readFileSync(claudeMdPath, "utf-8");
|
|
338
|
+
// Pokud už sekce existuje, nahraď ji
|
|
339
|
+
const sectionRegex = /## Agent Project Context\n[\s\S]*?(?=\n## |\n# |$)/;
|
|
340
|
+
if (sectionRegex.test(content)) {
|
|
341
|
+
content = content.replace(sectionRegex, contextSection);
|
|
342
|
+
console.log(" Aktualizována sekce Agent Project Context v CLAUDE.md");
|
|
343
|
+
}
|
|
344
|
+
else {
|
|
345
|
+
// Prepend na začátek
|
|
346
|
+
content = contextSection + "\n" + content;
|
|
347
|
+
console.log(" Přidána sekce Agent Project Context na začátek CLAUDE.md");
|
|
348
|
+
}
|
|
349
|
+
writeFileSync(claudeMdPath, content, "utf-8");
|
|
350
|
+
}
|
|
351
|
+
// --- Hlavní wizard ---
|
|
352
|
+
const AGENT_ROLES = ["analyst", "dev-lead", "qa-reviewer"];
|
|
353
|
+
const AGENT_LABELS = {
|
|
354
|
+
analyst: "Analyst (analytik)",
|
|
355
|
+
"dev-lead": "Dev Lead (developer)",
|
|
356
|
+
"qa-reviewer": "QA Reviewer",
|
|
357
|
+
};
|
|
358
|
+
export default async function setup() {
|
|
359
|
+
const args = parseArgs();
|
|
360
|
+
console.log("");
|
|
361
|
+
console.log(" Tickr MCP Setup Wizard");
|
|
362
|
+
console.log(" ----------------------");
|
|
363
|
+
console.log("");
|
|
364
|
+
// --- 1. API URL ---
|
|
365
|
+
const apiUrl = typeof args["api-url"] === "string"
|
|
366
|
+
? args["api-url"]
|
|
367
|
+
: await input({
|
|
368
|
+
message: "Tickr API URL:",
|
|
369
|
+
default: "https://api.tickr.cz",
|
|
370
|
+
});
|
|
371
|
+
// Ověření dostupnosti API
|
|
372
|
+
try {
|
|
373
|
+
const healthRes = await fetch(`${apiUrl}/health`);
|
|
374
|
+
if (!healthRes.ok) {
|
|
375
|
+
console.log(` [WARN] API health check vrátil ${healthRes.status}`);
|
|
376
|
+
}
|
|
377
|
+
else {
|
|
378
|
+
console.log(" API je dostupné.");
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
catch {
|
|
382
|
+
console.log(" [WARN] Nepodařilo se připojit k API. Pokračuji...");
|
|
383
|
+
}
|
|
384
|
+
// --- 2. Projekt ---
|
|
385
|
+
const projectName = typeof args["project-name"] === "string"
|
|
386
|
+
? args["project-name"]
|
|
387
|
+
: await input({
|
|
388
|
+
message: "Název projektu:",
|
|
389
|
+
default: "My Project",
|
|
390
|
+
});
|
|
391
|
+
const projectSlug = typeof args["project"] === "string"
|
|
392
|
+
? args["project"]
|
|
393
|
+
: await input({
|
|
394
|
+
message: "Project slug:",
|
|
395
|
+
default: projectName
|
|
396
|
+
.toLowerCase()
|
|
397
|
+
.replace(/\s+/g, "-")
|
|
398
|
+
.replace(/[^a-z0-9-]/g, ""),
|
|
399
|
+
});
|
|
400
|
+
const projectPrefix = typeof args["prefix"] === "string"
|
|
401
|
+
? args["prefix"]
|
|
402
|
+
: await input({
|
|
403
|
+
message: "Project prefix (např. VLX, TKR):",
|
|
404
|
+
default: projectSlug
|
|
405
|
+
.toUpperCase()
|
|
406
|
+
.replace(/-/g, "")
|
|
407
|
+
.slice(0, 3),
|
|
408
|
+
});
|
|
409
|
+
// --- 3. Výběr agentů ---
|
|
410
|
+
let selectedAgents;
|
|
411
|
+
if (typeof args["agents"] === "string") {
|
|
412
|
+
selectedAgents = args["agents"].split(",").map((a) => a.trim());
|
|
413
|
+
}
|
|
414
|
+
else {
|
|
415
|
+
selectedAgents = (await checkbox({
|
|
416
|
+
message: "Které agenty chceš nastavit?",
|
|
417
|
+
choices: AGENT_ROLES.map((role) => ({
|
|
418
|
+
name: AGENT_LABELS[role],
|
|
419
|
+
value: role,
|
|
420
|
+
checked: true,
|
|
421
|
+
})),
|
|
422
|
+
}));
|
|
423
|
+
}
|
|
424
|
+
if (selectedAgents.length === 0) {
|
|
425
|
+
console.log(" Žádný agent nevybrán. Ukončuji.");
|
|
426
|
+
return;
|
|
427
|
+
}
|
|
428
|
+
// --- 4. Agent tokeny ---
|
|
429
|
+
const agents = [];
|
|
430
|
+
const tokenArgMap = {
|
|
431
|
+
analyst: "analyst-token",
|
|
432
|
+
"dev-lead": "dev-token",
|
|
433
|
+
"qa-reviewer": "qa-token",
|
|
434
|
+
};
|
|
435
|
+
for (const role of selectedAgents) {
|
|
436
|
+
console.log("");
|
|
437
|
+
console.log(` --- ${AGENT_LABELS[role]} ---`);
|
|
438
|
+
const argKey = tokenArgMap[role];
|
|
439
|
+
let token = typeof args[argKey] === "string"
|
|
440
|
+
? args[argKey]
|
|
441
|
+
: await input({
|
|
442
|
+
message: ` PAT token pro ${AGENT_LABELS[role]}:`,
|
|
443
|
+
});
|
|
444
|
+
// Validace tokenu
|
|
445
|
+
console.log(" Ověřuji token...");
|
|
446
|
+
const user = await validateToken(apiUrl, token);
|
|
447
|
+
if (user) {
|
|
448
|
+
console.log(` Token platný: ${user.displayName} (${user.role})`);
|
|
449
|
+
agents.push({ role, token, displayName: user.displayName });
|
|
450
|
+
}
|
|
451
|
+
else {
|
|
452
|
+
console.log(" [WARN] Token není platný nebo API není dostupné.");
|
|
453
|
+
const proceed = await confirm({
|
|
454
|
+
message: " Pokračovat přesto s tímto tokenem?",
|
|
455
|
+
default: false,
|
|
456
|
+
});
|
|
457
|
+
if (proceed) {
|
|
458
|
+
agents.push({ role, token, displayName: "Unknown" });
|
|
459
|
+
}
|
|
460
|
+
else {
|
|
461
|
+
console.log(` Agent ${role} přeskočen.`);
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
if (agents.length === 0) {
|
|
466
|
+
console.log(" Žádný agent s platným tokenem. Ukončuji.");
|
|
467
|
+
return;
|
|
468
|
+
}
|
|
469
|
+
// --- 5. Generování souborů ---
|
|
470
|
+
const cwd = process.cwd();
|
|
471
|
+
const claudeDir = join(cwd, ".claude");
|
|
472
|
+
console.log("");
|
|
473
|
+
console.log(" Generuji soubory...");
|
|
474
|
+
console.log("");
|
|
475
|
+
// Agent definice
|
|
476
|
+
const agentTemplates = {
|
|
477
|
+
analyst: agentAnalyticTemplate,
|
|
478
|
+
"dev-lead": agentDevLeadTemplate,
|
|
479
|
+
"qa-reviewer": agentQaReviewerTemplate,
|
|
480
|
+
};
|
|
481
|
+
const agentFileNames = {
|
|
482
|
+
analyst: "analytic.md",
|
|
483
|
+
"dev-lead": "dev-lead.md",
|
|
484
|
+
"qa-reviewer": "qa-reviewer.md",
|
|
485
|
+
};
|
|
486
|
+
for (const agent of agents) {
|
|
487
|
+
// Agent markdown
|
|
488
|
+
const agentPath = join(claudeDir, "agents", agentFileNames[agent.role]);
|
|
489
|
+
writeFile(agentPath, agentTemplates[agent.role]());
|
|
490
|
+
console.log(` .claude/agents/${agentFileNames[agent.role]}`);
|
|
491
|
+
// Agent config (.claude.json)
|
|
492
|
+
const configDir = agentFileNames[agent.role].replace(".md", "");
|
|
493
|
+
const configPath = join(claudeDir, "configs", configDir, ".claude.json");
|
|
494
|
+
writeFile(configPath, claudeJsonTemplate(apiUrl, agent.token) + "\n");
|
|
495
|
+
console.log(` .claude/configs/${configDir}/.claude.json`);
|
|
496
|
+
}
|
|
497
|
+
// Skills — vždy generovat pokud nejsou --skills-only=false
|
|
498
|
+
const skillsDir = join(claudeDir, "skills");
|
|
499
|
+
const checkQueuePath = join(skillsDir, "check-queue", "SKILL.md");
|
|
500
|
+
writeFile(checkQueuePath, skillCheckQueueTemplate());
|
|
501
|
+
console.log(" .claude/skills/check-queue/SKILL.md");
|
|
502
|
+
const stopAgentPath = join(skillsDir, "stop-agent", "SKILL.md");
|
|
503
|
+
writeFile(stopAgentPath, skillStopAgentTemplate());
|
|
504
|
+
console.log(" .claude/skills/stop-agent/SKILL.md");
|
|
505
|
+
// CLAUDE.md patch
|
|
506
|
+
patchClaudeMd(cwd, projectName, projectSlug, projectPrefix);
|
|
507
|
+
// --- 6. Hotovo ---
|
|
508
|
+
console.log("");
|
|
509
|
+
console.log(" Setup dokončen!");
|
|
510
|
+
console.log("");
|
|
511
|
+
console.log(" Vygenerované soubory:");
|
|
512
|
+
console.log(" .claude/agents/ — definice agentů");
|
|
513
|
+
console.log(" .claude/configs/ — MCP konfigurace per agent");
|
|
514
|
+
console.log(" .claude/skills/ — sdílené skills (check-queue, stop-agent)");
|
|
515
|
+
console.log(" CLAUDE.md — Agent Project Context sekce");
|
|
516
|
+
console.log("");
|
|
517
|
+
console.log(" Spuštění agenta:");
|
|
518
|
+
for (const agent of agents) {
|
|
519
|
+
const configDir = agentFileNames[agent.role].replace(".md", "");
|
|
520
|
+
console.log(` claude --agent .claude/agents/${agentFileNames[agent.role]} --config .claude/configs/${configDir}/.claude.json`);
|
|
521
|
+
}
|
|
522
|
+
console.log("");
|
|
523
|
+
}
|
|
524
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/cli/setup.ts"],"names":[],"mappings":"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"}
|