@dpesch/mantisbt-mcp-server 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/.env.local +2 -0
  2. package/CHANGELOG.md +68 -0
  3. package/LICENSE +21 -0
  4. package/README.de.md +177 -0
  5. package/README.md +177 -0
  6. package/dist/cache.js +52 -0
  7. package/dist/client.js +114 -0
  8. package/dist/config.js +54 -0
  9. package/dist/constants.js +23 -0
  10. package/dist/index.js +120 -0
  11. package/dist/tools/config.js +107 -0
  12. package/dist/tools/files.js +37 -0
  13. package/dist/tools/filters.js +35 -0
  14. package/dist/tools/issues.js +191 -0
  15. package/dist/tools/metadata.js +119 -0
  16. package/dist/tools/monitors.js +38 -0
  17. package/dist/tools/notes.js +96 -0
  18. package/dist/tools/projects.js +127 -0
  19. package/dist/tools/relationships.js +54 -0
  20. package/dist/tools/tags.js +78 -0
  21. package/dist/tools/users.js +34 -0
  22. package/dist/tools/version.js +58 -0
  23. package/dist/types.js +4 -0
  24. package/dist/version-hint.js +117 -0
  25. package/package.json +41 -0
  26. package/scripts/record-fixtures.ts +138 -0
  27. package/tests/cache.test.ts +149 -0
  28. package/tests/client.test.ts +241 -0
  29. package/tests/config.test.ts +164 -0
  30. package/tests/fixtures/get_current_user.json +39 -0
  31. package/tests/fixtures/get_issue.json +151 -0
  32. package/tests/fixtures/get_project_categories.json +60 -0
  33. package/tests/fixtures/get_project_versions.json +3 -0
  34. package/tests/fixtures/get_project_versions_with_data.json +28 -0
  35. package/tests/fixtures/list_issues.json +67 -0
  36. package/tests/fixtures/list_projects.json +65 -0
  37. package/tests/fixtures/recorded/get_current_user.json +108 -0
  38. package/tests/fixtures/recorded/get_issue.json +320 -0
  39. package/tests/fixtures/recorded/get_project_categories.json +241 -0
  40. package/tests/fixtures/recorded/get_project_versions.json +3 -0
  41. package/tests/fixtures/recorded/list_issues.json +824 -0
  42. package/tests/fixtures/recorded/list_projects.json +10641 -0
  43. package/tests/helpers/mock-server.ts +32 -0
  44. package/tests/tools/issues.test.ts +130 -0
  45. package/tests/tools/projects.test.ts +169 -0
  46. package/tests/tools/users.test.ts +76 -0
  47. package/tests/version-hint.test.ts +230 -0
  48. package/tsconfig.build.json +8 -0
  49. package/vitest.config.ts +8 -0
@@ -0,0 +1,824 @@
1
+ {
2
+ "issues": [
3
+ {
4
+ "id": 7856,
5
+ "summary": "statusline-command.sh: Usage-Statistiken ergaenzt",
6
+ "description": "## Was ist passiert?\nstatusline-command.sh verwendete cygpath hartcodiert für USAGE_CACHE und USAGE_FETCHER.\nAuf WSL und Linux wurden die Pfade nicht aufgelöst — die Usage-Statistiken fehlten in der Statusleiste.\n\n## Betroffene Komponente\n- Skript: statusline-command.sh\n- Dateien: setup/statusline-command.sh, ~/.claude/statusline-command.sh\n- Plattform: beide\n\n## Ursachenanalyse\nDie Variablen USAGE_CACHE und USAGE_FETCHER wurden mit $(cygpath ...) gesetzt,\nohne Fallback für WSL/Linux.\n\n## Lösungsansätze\n1. Plattform-Erkennung: cygpath verfügbar -> Windows, sonst $HOME (WSL/Linux)\n2. _CLAUDE_HOME als gemeinsame Hilfsvariable\n3. USAGE_CACHE und USAGE_FETCHER davon ableiten\n\n## Hinweise zur Umsetzung\nÄnderungen wurden lokal vorgenommen, aber noch nicht commited oder gepushed.\nSiehe Kommentar für den konkreten Diff.",
7
+ "project": {
8
+ "id": 54,
9
+ "name": "11com7 Claude MetaRepo"
10
+ },
11
+ "category": {
12
+ "id": 350,
13
+ "name": "Konfiguration"
14
+ },
15
+ "reporter": {
16
+ "id": 52,
17
+ "name": "ppAgent"
18
+ },
19
+ "handler": {
20
+ "id": 51,
21
+ "name": "domAgent",
22
+ "real_name": "Dominik Pesch (via Agent)",
23
+ "email": "d.pesch+agent@11com7.de"
24
+ },
25
+ "status": {
26
+ "id": 80,
27
+ "name": "resolved",
28
+ "label": "erledigt",
29
+ "color": "#e8e8e8"
30
+ },
31
+ "resolution": {
32
+ "id": 20,
33
+ "name": "fixed",
34
+ "label": "erledigt"
35
+ },
36
+ "view_state": {
37
+ "id": 10,
38
+ "name": "public",
39
+ "label": "öffentlich"
40
+ },
41
+ "priority": {
42
+ "id": 30,
43
+ "name": "normal",
44
+ "label": "normal"
45
+ },
46
+ "severity": {
47
+ "id": 210,
48
+ "name": "Wartung",
49
+ "label": "Wartung"
50
+ },
51
+ "reproducibility": {
52
+ "id": 70,
53
+ "name": "have not tried",
54
+ "label": "nicht getestet"
55
+ },
56
+ "sticky": false,
57
+ "created_at": "2026-03-13T15:51:57+01:00",
58
+ "updated_at": "2026-03-15T08:35:48+01:00",
59
+ "notes": [
60
+ {
61
+ "id": 3982,
62
+ "reporter": {
63
+ "id": 52,
64
+ "name": "ppAgent"
65
+ },
66
+ "text": "## Ausstehende Aenderung — setup/statusline-command.sh\n\nDie Aenderung wurde lokal erstellt, aber noch nicht commited. Ein Agent kann sie direkt uebernehmen.\n\n### Diff\n\n```diff\n@@ -34,8 +34,13 @@ else\n fi\n \n # Rate-Limit-Usage aus Cache lesen; bei veraltetem Cache Refresh im Hintergrund anstoessen\n-USAGE_CACHE=\"$(cygpath \"$USERPROFILE\")/.claude/usage-rate-cache.json\"\n-USAGE_FETCHER=\"$(cygpath \"$USERPROFILE\")/.claude/usage-fetcher.sh\"\n+if command -v cygpath &>/dev/null; then\n+ _CLAUDE_HOME=\"$(cygpath \"$USERPROFILE\")/.claude\"\n+else\n+ _CLAUDE_HOME=\"$HOME/.claude\"\n+fi\n+USAGE_CACHE=\"$_CLAUDE_HOME/usage-rate-cache.json\"\n+USAGE_FETCHER=\"$_CLAUDE_HOME/usage-fetcher.sh\"\n usage_str=\"\"\n```\n\n### Commit-Vorschlag\n\n```\nErgaenze WSL/Linux-Pfad-Fallback in statusline-command.sh\n```\n\nDie Aenderung muss identisch in `setup/statusline-command.sh` (Repo) und\n`~/.claude/statusline-command.sh` (deployed) vorgenommen werden.",
67
+ "view_state": {
68
+ "id": 10,
69
+ "name": "public",
70
+ "label": "öffentlich"
71
+ },
72
+ "attachments": [],
73
+ "type": "note",
74
+ "created_at": "2026-03-13T15:58:50+01:00",
75
+ "updated_at": "2026-03-13T15:58:50+01:00"
76
+ },
77
+ {
78
+ "id": 3984,
79
+ "reporter": {
80
+ "id": 51,
81
+ "name": "domAgent",
82
+ "real_name": "Dominik Pesch (via Agent)",
83
+ "email": "d.pesch+agent@11com7.de"
84
+ },
85
+ "text": "`setup/statusline-command.sh` verwendete `cygpath \"$USERPROFILE\"` hartcodiert zum Auflösen der Pfade für `USAGE_CACHE` und `USAGE_FETCHER`. `cygpath` ist ausschließlich unter Windows (Git Bash / Cygwin) verfügbar — auf WSL und Linux ist der Befehl nicht vorhanden, weshalb die Variablen auf leere Strings gesetzt wurden und die Usage-Statistiken in der Statusleiste komplett fehlten.\n\nBehoben durch eine Plattform-Erkennung: Wenn `cygpath` verfügbar ist (Windows), wird `_CLAUDE_HOME` wie bisher per `cygpath \"$USERPROFILE\"` gesetzt; andernfalls (WSL/Linux) wird `$HOME/.claude` verwendet. `USAGE_CACHE` und `USAGE_FETCHER` leiten sich dann gemeinsam von `_CLAUDE_HOME` ab.\n\nCommit: e66a7ca",
86
+ "view_state": {
87
+ "id": 10,
88
+ "name": "public",
89
+ "label": "öffentlich"
90
+ },
91
+ "attachments": [],
92
+ "type": "note",
93
+ "created_at": "2026-03-13T16:22:40+01:00",
94
+ "updated_at": "2026-03-13T16:22:40+01:00"
95
+ }
96
+ ],
97
+ "history": [
98
+ {
99
+ "created_at": "2026-03-13T15:51:57+01:00",
100
+ "user": {
101
+ "id": 52,
102
+ "name": "ppAgent"
103
+ },
104
+ "type": {
105
+ "id": 1,
106
+ "name": "issue-new"
107
+ },
108
+ "message": "Neuer Eintrag"
109
+ },
110
+ {
111
+ "created_at": "2026-03-13T15:51:57+01:00",
112
+ "user": {
113
+ "id": 52,
114
+ "name": "ppAgent"
115
+ },
116
+ "field": {
117
+ "name": "status",
118
+ "label": "Status"
119
+ },
120
+ "type": {
121
+ "id": 0,
122
+ "name": "field-updated"
123
+ },
124
+ "old_value": {
125
+ "id": 10,
126
+ "name": "new",
127
+ "label": "neu",
128
+ "color": "#eeb3aa"
129
+ },
130
+ "new_value": {
131
+ "id": 50,
132
+ "name": "assigned",
133
+ "label": "zugewiesen",
134
+ "color": "#afbed5"
135
+ },
136
+ "message": "Status",
137
+ "change": "neu => zugewiesen"
138
+ },
139
+ {
140
+ "created_at": "2026-03-13T15:51:57+01:00",
141
+ "user": {
142
+ "id": 52,
143
+ "name": "ppAgent"
144
+ },
145
+ "field": {
146
+ "name": "handler",
147
+ "label": "Bearbeitung durch"
148
+ },
149
+ "type": {
150
+ "id": 0,
151
+ "name": "field-updated"
152
+ },
153
+ "old_value": {
154
+ "id": 0
155
+ },
156
+ "new_value": {
157
+ "id": 51,
158
+ "name": "domAgent",
159
+ "real_name": "Dominik Pesch (via Agent)",
160
+ "email": "d.pesch+agent@11com7.de"
161
+ },
162
+ "message": "Bearbeitung durch",
163
+ "change": " => domAgent"
164
+ },
165
+ {
166
+ "created_at": "2026-03-13T15:58:50+01:00",
167
+ "user": {
168
+ "id": 52,
169
+ "name": "ppAgent"
170
+ },
171
+ "type": {
172
+ "id": 6,
173
+ "name": "issue-description-updated"
174
+ },
175
+ "message": "Beschreibung aktualisiert"
176
+ },
177
+ {
178
+ "created_at": "2026-03-13T15:58:50+01:00",
179
+ "user": {
180
+ "id": 52,
181
+ "name": "ppAgent"
182
+ },
183
+ "type": {
184
+ "id": 2,
185
+ "name": "note-added"
186
+ },
187
+ "note": {
188
+ "id": 3982
189
+ },
190
+ "message": "Notiz hinzugefügt: 0003982"
191
+ },
192
+ {
193
+ "created_at": "2026-03-13T16:10:05+01:00",
194
+ "user": {
195
+ "id": 52,
196
+ "name": "ppAgent"
197
+ },
198
+ "type": {
199
+ "id": 6,
200
+ "name": "issue-description-updated"
201
+ },
202
+ "message": "Beschreibung aktualisiert"
203
+ },
204
+ {
205
+ "created_at": "2026-03-13T16:22:40+01:00",
206
+ "user": {
207
+ "id": 51,
208
+ "name": "domAgent",
209
+ "real_name": "Dominik Pesch (via Agent)",
210
+ "email": "d.pesch+agent@11com7.de"
211
+ },
212
+ "type": {
213
+ "id": 2,
214
+ "name": "note-added"
215
+ },
216
+ "note": {
217
+ "id": 3984
218
+ },
219
+ "message": "Notiz hinzugefügt: 0003984"
220
+ },
221
+ {
222
+ "created_at": "2026-03-13T16:22:49+01:00",
223
+ "user": {
224
+ "id": 51,
225
+ "name": "domAgent",
226
+ "real_name": "Dominik Pesch (via Agent)",
227
+ "email": "d.pesch+agent@11com7.de"
228
+ },
229
+ "field": {
230
+ "name": "status",
231
+ "label": "Status"
232
+ },
233
+ "type": {
234
+ "id": 0,
235
+ "name": "field-updated"
236
+ },
237
+ "old_value": {
238
+ "id": 50,
239
+ "name": "assigned",
240
+ "label": "zugewiesen",
241
+ "color": "#afbed5"
242
+ },
243
+ "new_value": {
244
+ "id": 80,
245
+ "name": "resolved",
246
+ "label": "erledigt",
247
+ "color": "#e8e8e8"
248
+ },
249
+ "message": "Status",
250
+ "change": "zugewiesen => erledigt"
251
+ },
252
+ {
253
+ "created_at": "2026-03-13T16:22:49+01:00",
254
+ "user": {
255
+ "id": 51,
256
+ "name": "domAgent",
257
+ "real_name": "Dominik Pesch (via Agent)",
258
+ "email": "d.pesch+agent@11com7.de"
259
+ },
260
+ "field": {
261
+ "name": "resolution",
262
+ "label": "Lösung"
263
+ },
264
+ "type": {
265
+ "id": 0,
266
+ "name": "field-updated"
267
+ },
268
+ "old_value": {
269
+ "id": 10,
270
+ "name": "open",
271
+ "label": "offen"
272
+ },
273
+ "new_value": {
274
+ "id": 20,
275
+ "name": "fixed",
276
+ "label": "erledigt"
277
+ },
278
+ "message": "Lösung",
279
+ "change": "offen => erledigt"
280
+ },
281
+ {
282
+ "created_at": "2026-03-15T08:35:40+01:00",
283
+ "user": {
284
+ "id": 51,
285
+ "name": "domAgent",
286
+ "real_name": "Dominik Pesch (via Agent)",
287
+ "email": "d.pesch+agent@11com7.de"
288
+ },
289
+ "type": {
290
+ "id": 25,
291
+ "name": "tag-added"
292
+ },
293
+ "tag": {
294
+ "id": 25,
295
+ "name": "mcp-test"
296
+ },
297
+ "message": "Tag zugeordnet: mcp-test"
298
+ },
299
+ {
300
+ "created_at": "2026-03-15T08:35:48+01:00",
301
+ "user": {
302
+ "id": 51,
303
+ "name": "domAgent",
304
+ "real_name": "Dominik Pesch (via Agent)",
305
+ "email": "d.pesch+agent@11com7.de"
306
+ },
307
+ "type": {
308
+ "id": 26,
309
+ "name": "tag-deleted"
310
+ },
311
+ "tag": {
312
+ "id": 25,
313
+ "name": "mcp-test"
314
+ },
315
+ "message": "Tag entfernt: mcp-test"
316
+ }
317
+ ]
318
+ },
319
+ {
320
+ "id": 7855,
321
+ "summary": "notify-claude.sh: WSL- und Linux-Unterstuetzung ergaenzt",
322
+ "description": "## Was ist passiert?\nnotify-claude.sh unterstützte bisher nur Windows (Git Bash via cygpath).\nAuf WSL2 und nativem Linux wurden keine Benachrichtigungen ausgelöst.\n\n## Betroffene Komponente\n- Hook: notify-claude.sh\n- Dateien: setup/notify-claude.sh, ~/.claude/notify-claude.sh\n- Plattform: beide\n\n## Ursachenanalyse\nDas Skript prüfte nur ob cygpath verfügbar ist (Windows-Indikator).\nKein Zweig für WSL (wslpath + powershell.exe) oder natives Linux (notify-send).\n\n## Lösungsansätze\n1. WSL-Zweig: Erkennung via /proc/version oder $WSL_DISTRO_NAME,\n Pfadkonvertierung mit wslpath, Aufruf via powershell.exe\n2. Linux-Zweig: notify-send als nativer Fallback\n3. Beide Zweige: Sub-Agenten-Stop-Events per pgrep-Check unterdrücken\n\n## Hinweise zur Umsetzung\nÄnderungen wurden lokal vorgenommen, aber noch nicht commited oder gepushed.\nSiehe Kommentar für den konkreten Diff.",
323
+ "project": {
324
+ "id": 54,
325
+ "name": "11com7 Claude MetaRepo"
326
+ },
327
+ "category": {
328
+ "id": 394,
329
+ "name": "Hooks"
330
+ },
331
+ "reporter": {
332
+ "id": 52,
333
+ "name": "ppAgent"
334
+ },
335
+ "handler": {
336
+ "id": 51,
337
+ "name": "domAgent",
338
+ "real_name": "Dominik Pesch (via Agent)",
339
+ "email": "d.pesch+agent@11com7.de"
340
+ },
341
+ "status": {
342
+ "id": 80,
343
+ "name": "resolved",
344
+ "label": "erledigt",
345
+ "color": "#e8e8e8"
346
+ },
347
+ "resolution": {
348
+ "id": 20,
349
+ "name": "fixed",
350
+ "label": "erledigt"
351
+ },
352
+ "view_state": {
353
+ "id": 10,
354
+ "name": "public",
355
+ "label": "öffentlich"
356
+ },
357
+ "priority": {
358
+ "id": 30,
359
+ "name": "normal",
360
+ "label": "normal"
361
+ },
362
+ "severity": {
363
+ "id": 210,
364
+ "name": "Wartung",
365
+ "label": "Wartung"
366
+ },
367
+ "reproducibility": {
368
+ "id": 70,
369
+ "name": "have not tried",
370
+ "label": "nicht getestet"
371
+ },
372
+ "sticky": false,
373
+ "created_at": "2026-03-13T15:51:52+01:00",
374
+ "updated_at": "2026-03-13T16:22:49+01:00",
375
+ "notes": [
376
+ {
377
+ "id": 3981,
378
+ "reporter": {
379
+ "id": 52,
380
+ "name": "ppAgent"
381
+ },
382
+ "text": "## Ausstehende Aenderung — setup/notify-claude.sh\n\nDie Aenderung wurde lokal erstellt, aber noch nicht commited. Ein Agent kann sie direkt uebernehmen.\n\n### Diff\n\n```diff\n@@ -22,8 +22,21 @@ if command -v cygpath &>/dev/null; then\n PS_SCRIPT=$(cygpath -w \"$USERPROFILE/.claude/notify-claude.ps1\")\n powershell.exe -NonInteractive -WindowStyle Hidden -ExecutionPolicy Bypass \\\n -File \"$PS_SCRIPT\" -Project \"$PROJECT\" -Message \"$MSG\"\n+elif grep -qi microsoft /proc/version 2>/dev/null || [[ -n \"${WSL_DISTRO_NAME:-}\" ]]; then\n+ # WSL -- Sub-Agenten-Stop unterdruecken, dann per powershell.exe benachrichtigen\n+ if [[ \"${1:-}\" == \"stop\" ]]; then\n+ CLAUDE_COUNT=$(pgrep -cx \"claude\" 2>/dev/null || echo \"0\")\n+ if [[ \"$CLAUDE_COUNT\" -gt 1 ]]; then\n+ exit 0\n+ fi\n+ fi\n+ PS_SCRIPT=$(wslpath -w \"$HOME/.claude/notify-claude.ps1\" 2>/dev/null)\n+ if [[ -n \"$PS_SCRIPT\" ]] && command -v powershell.exe &>/dev/null; then\n+ powershell.exe -NonInteractive -WindowStyle Hidden -ExecutionPolicy Bypass \\\n+ -File \"$PS_SCRIPT\" -Project \"$PROJECT\" -Message \"$MSG\"\n+ fi\n else\n- # Linux / WSL -- Sub-Agenten-Stop unterdruecken\n+ # Natives Linux -- Sub-Agenten-Stop unterdruecken\n if [[ \"${1:-}\" == \"stop\" ]]; then\n CLAUDE_COUNT=$(pgrep -cx \"claude\" 2>/dev/null || echo \"0\")\n if [[ \"$CLAUDE_COUNT\" -gt 1 ]]; then\n```\n\n### Commit-Vorschlag\n\n```\nErgaenze WSL- und Linux-Unterstuetzung in notify-claude.sh\n```\n\nDie Aenderung muss identisch in `setup/notify-claude.sh` (Repo) und\n`~/.claude/notify-claude.sh` (deployed) vorgenommen werden.",
383
+ "view_state": {
384
+ "id": 10,
385
+ "name": "public",
386
+ "label": "öffentlich"
387
+ },
388
+ "attachments": [],
389
+ "type": "note",
390
+ "created_at": "2026-03-13T15:58:45+01:00",
391
+ "updated_at": "2026-03-13T15:58:45+01:00"
392
+ },
393
+ {
394
+ "id": 3983,
395
+ "reporter": {
396
+ "id": 51,
397
+ "name": "domAgent",
398
+ "real_name": "Dominik Pesch (via Agent)",
399
+ "email": "d.pesch+agent@11com7.de"
400
+ },
401
+ "text": "Das Skript `setup/notify-claude.sh` unterstützte bisher nur zwei Fälle: Windows (Git Bash via `cygpath`) und einen gemeinsamen Zweig für WSL/Linux mit `notify-send`. Auf WSL2 steht aber `powershell.exe` zur Verfügung, das über `notify-claude.ps1` echte Windows-BurntToast-Benachrichtigungen auslösen kann — identisch zum Git-Bash-Zweig. Dieser Weg wurde bisher nicht genutzt, weil kein WSL-spezifischer Zweig existierte.\n\nBehoben durch Einfügen eines `elif`-Zweigs zwischen dem `cygpath`-Check und dem `else`: WSL wird über `grep -qi microsoft /proc/version` oder die Umgebungsvariable `WSL_DISTRO_NAME` erkannt. Der Zweig unterdrückt Sub-Agenten-Stops (wie der Linux-Zweig), konvertiert den PS1-Pfad per `wslpath -w` und ruft `powershell.exe` auf. Der `else`-Zweig ist damit reines natives Linux und verwendet weiterhin `notify-send`.\n\nCommit: c2f125e",
402
+ "view_state": {
403
+ "id": 10,
404
+ "name": "public",
405
+ "label": "öffentlich"
406
+ },
407
+ "attachments": [],
408
+ "type": "note",
409
+ "created_at": "2026-03-13T16:22:39+01:00",
410
+ "updated_at": "2026-03-13T16:22:39+01:00"
411
+ }
412
+ ],
413
+ "history": [
414
+ {
415
+ "created_at": "2026-03-13T15:51:52+01:00",
416
+ "user": {
417
+ "id": 52,
418
+ "name": "ppAgent"
419
+ },
420
+ "type": {
421
+ "id": 1,
422
+ "name": "issue-new"
423
+ },
424
+ "message": "Neuer Eintrag"
425
+ },
426
+ {
427
+ "created_at": "2026-03-13T15:51:52+01:00",
428
+ "user": {
429
+ "id": 52,
430
+ "name": "ppAgent"
431
+ },
432
+ "field": {
433
+ "name": "status",
434
+ "label": "Status"
435
+ },
436
+ "type": {
437
+ "id": 0,
438
+ "name": "field-updated"
439
+ },
440
+ "old_value": {
441
+ "id": 10,
442
+ "name": "new",
443
+ "label": "neu",
444
+ "color": "#eeb3aa"
445
+ },
446
+ "new_value": {
447
+ "id": 50,
448
+ "name": "assigned",
449
+ "label": "zugewiesen",
450
+ "color": "#afbed5"
451
+ },
452
+ "message": "Status",
453
+ "change": "neu => zugewiesen"
454
+ },
455
+ {
456
+ "created_at": "2026-03-13T15:51:52+01:00",
457
+ "user": {
458
+ "id": 52,
459
+ "name": "ppAgent"
460
+ },
461
+ "field": {
462
+ "name": "handler",
463
+ "label": "Bearbeitung durch"
464
+ },
465
+ "type": {
466
+ "id": 0,
467
+ "name": "field-updated"
468
+ },
469
+ "old_value": {
470
+ "id": 0
471
+ },
472
+ "new_value": {
473
+ "id": 51,
474
+ "name": "domAgent",
475
+ "real_name": "Dominik Pesch (via Agent)",
476
+ "email": "d.pesch+agent@11com7.de"
477
+ },
478
+ "message": "Bearbeitung durch",
479
+ "change": " => domAgent"
480
+ },
481
+ {
482
+ "created_at": "2026-03-13T15:58:45+01:00",
483
+ "user": {
484
+ "id": 52,
485
+ "name": "ppAgent"
486
+ },
487
+ "type": {
488
+ "id": 6,
489
+ "name": "issue-description-updated"
490
+ },
491
+ "message": "Beschreibung aktualisiert"
492
+ },
493
+ {
494
+ "created_at": "2026-03-13T15:58:45+01:00",
495
+ "user": {
496
+ "id": 52,
497
+ "name": "ppAgent"
498
+ },
499
+ "type": {
500
+ "id": 2,
501
+ "name": "note-added"
502
+ },
503
+ "note": {
504
+ "id": 3981
505
+ },
506
+ "message": "Notiz hinzugefügt: 0003981"
507
+ },
508
+ {
509
+ "created_at": "2026-03-13T16:10:01+01:00",
510
+ "user": {
511
+ "id": 52,
512
+ "name": "ppAgent"
513
+ },
514
+ "type": {
515
+ "id": 6,
516
+ "name": "issue-description-updated"
517
+ },
518
+ "message": "Beschreibung aktualisiert"
519
+ },
520
+ {
521
+ "created_at": "2026-03-13T16:22:39+01:00",
522
+ "user": {
523
+ "id": 51,
524
+ "name": "domAgent",
525
+ "real_name": "Dominik Pesch (via Agent)",
526
+ "email": "d.pesch+agent@11com7.de"
527
+ },
528
+ "type": {
529
+ "id": 2,
530
+ "name": "note-added"
531
+ },
532
+ "note": {
533
+ "id": 3983
534
+ },
535
+ "message": "Notiz hinzugefügt: 0003983"
536
+ },
537
+ {
538
+ "created_at": "2026-03-13T16:22:49+01:00",
539
+ "user": {
540
+ "id": 51,
541
+ "name": "domAgent",
542
+ "real_name": "Dominik Pesch (via Agent)",
543
+ "email": "d.pesch+agent@11com7.de"
544
+ },
545
+ "field": {
546
+ "name": "status",
547
+ "label": "Status"
548
+ },
549
+ "type": {
550
+ "id": 0,
551
+ "name": "field-updated"
552
+ },
553
+ "old_value": {
554
+ "id": 50,
555
+ "name": "assigned",
556
+ "label": "zugewiesen",
557
+ "color": "#afbed5"
558
+ },
559
+ "new_value": {
560
+ "id": 80,
561
+ "name": "resolved",
562
+ "label": "erledigt",
563
+ "color": "#e8e8e8"
564
+ },
565
+ "message": "Status",
566
+ "change": "zugewiesen => erledigt"
567
+ },
568
+ {
569
+ "created_at": "2026-03-13T16:22:49+01:00",
570
+ "user": {
571
+ "id": 51,
572
+ "name": "domAgent",
573
+ "real_name": "Dominik Pesch (via Agent)",
574
+ "email": "d.pesch+agent@11com7.de"
575
+ },
576
+ "field": {
577
+ "name": "resolution",
578
+ "label": "Lösung"
579
+ },
580
+ "type": {
581
+ "id": 0,
582
+ "name": "field-updated"
583
+ },
584
+ "old_value": {
585
+ "id": 10,
586
+ "name": "open",
587
+ "label": "offen"
588
+ },
589
+ "new_value": {
590
+ "id": 20,
591
+ "name": "fixed",
592
+ "label": "erledigt"
593
+ },
594
+ "message": "Lösung",
595
+ "change": "offen => erledigt"
596
+ }
597
+ ]
598
+ },
599
+ {
600
+ "id": 7854,
601
+ "summary": "permissions-sync meldet aktuell obwohl Permissions in settings.json fehlen",
602
+ "description": "## Was ist passiert?\n\n`/permissions-sync` meldet \"Bereits aktuell -- keine Aenderungen noetig\", obwohl die Permission `Bash(bash *usage-predictor.sh*)` zwar in `~/.claude/permissions-managed.json` steht, aber NICHT in `~/.claude/settings.json` vorhanden ist.\n\nDadurch schlug `/usage-refresh-predict` mit \"Bash command permission check failed\" fehl.\n\n## Betroffene Komponente\n\n- Skill: permissions-sync\n- Datei: skills/permissions-sync/helpers/permissions-sync.js\n- Zusaetzlich: setup/permissions-managed.json (fehlender Eintrag fuer usage-predictor.sh -- bereits gefixt)\n- Plattform: Windows (Git Bash)\n\n## Ursachenanalyse\n\nZwei Probleme:\n\n1. Fehlender Eintrag: `Bash(bash *usage-predictor.sh*)` fehlte in `setup/permissions-managed.json` -- wurde beim Erstellen des usage-refresh-predict-Skills vergessen. Bereits im Repo gefixt.\n\n2. Sync-Logik-Bug: permissions-sync.js vergleicht vermutlich nur die permissions-managed.json gegen sich selbst oder prueft nicht korrekt, ob alle add-Eintraege tatsaechlich in settings.json.permissions.allow vorhanden sind. Der Abgleich sollte fehlende Eintraege erkennen und hinzufuegen, meldet aber stattdessen \"aktuell\".\n\n## Loesungsansaetze\n\n1. In permissions-sync.js die Vergleichslogik debuggen: Fuer jeden Eintrag in add[] pruefen, ob er in settings.json -> permissions.allow[] existiert. Fehlende Eintraege muessen hinzugefuegt und als Aenderung gemeldet werden.\n2. Einen Test ergaenzen, der prueft: Wenn managed-permissions einen Eintrag hat, den settings.json nicht hat, muss sync ihn hinzufuegen.\n\n## So reproduzierbar\n\n1. Eintrag in permissions-managed.json -> add[] hinzufuegen, der nicht in settings.json steht\n2. permissions-sync ausfuehren\n3. Erwartung: Eintrag wird hinzugefuegt -- Tatsaechlich: \"Bereits aktuell\"\n\n## Hinweise zur Umsetzung\n\n- Sync-Logik: skills/permissions-sync/helpers/permissions-sync.js (ca. Zeile 29ff)\n- Die installed copy liegt unter ~/.claude/permissions-sync.js\n- Der Fix fuer den fehlenden usage-predictor.sh-Eintrag in setup/permissions-managed.json ist bereits gemacht, muss nur committet werden",
603
+ "project": {
604
+ "id": 54,
605
+ "name": "11com7 Claude MetaRepo"
606
+ },
607
+ "category": {
608
+ "id": 393,
609
+ "name": "Skills"
610
+ },
611
+ "reporter": {
612
+ "id": 53,
613
+ "name": "mneAgent"
614
+ },
615
+ "handler": {
616
+ "id": 51,
617
+ "name": "domAgent",
618
+ "real_name": "Dominik Pesch (via Agent)",
619
+ "email": "d.pesch+agent@11com7.de"
620
+ },
621
+ "status": {
622
+ "id": 80,
623
+ "name": "resolved",
624
+ "label": "erledigt",
625
+ "color": "#e8e8e8"
626
+ },
627
+ "resolution": {
628
+ "id": 20,
629
+ "name": "fixed",
630
+ "label": "erledigt"
631
+ },
632
+ "view_state": {
633
+ "id": 10,
634
+ "name": "public",
635
+ "label": "öffentlich"
636
+ },
637
+ "priority": {
638
+ "id": 30,
639
+ "name": "normal",
640
+ "label": "normal"
641
+ },
642
+ "severity": {
643
+ "id": 50,
644
+ "name": "kleinerer Fehler",
645
+ "label": "kleinerer Fehler"
646
+ },
647
+ "reproducibility": {
648
+ "id": 70,
649
+ "name": "have not tried",
650
+ "label": "nicht getestet"
651
+ },
652
+ "sticky": false,
653
+ "created_at": "2026-03-13T09:58:23+01:00",
654
+ "updated_at": "2026-03-13T11:25:19+01:00",
655
+ "notes": [
656
+ {
657
+ "id": 3980,
658
+ "reporter": {
659
+ "id": 51,
660
+ "name": "domAgent",
661
+ "real_name": "Dominik Pesch (via Agent)",
662
+ "email": "d.pesch+agent@11com7.de"
663
+ },
664
+ "text": "Root-Cause-Analyse: Kein Logic-Bug in permissions-sync.js — die Sync-Logik war korrekt. Der eigentliche Fehler war ein fehlender Eintrag `Bash(bash *usage-predictor.sh*)` in setup/permissions-managed.json.\n\nFix: Eintrag in setup/permissions-managed.json ergänzt. install.ps1 hat permissions-managed.json installiert und permissions-sync.js hat den fehlenden Eintrag sofort in settings.json nachgezogen (1 Änderung).",
665
+ "view_state": {
666
+ "id": 10,
667
+ "name": "public",
668
+ "label": "öffentlich"
669
+ },
670
+ "attachments": [],
671
+ "type": "note",
672
+ "created_at": "2026-03-13T11:25:18+01:00",
673
+ "updated_at": "2026-03-13T11:25:18+01:00"
674
+ }
675
+ ],
676
+ "history": [
677
+ {
678
+ "created_at": "2026-03-13T09:58:23+01:00",
679
+ "user": {
680
+ "id": 53,
681
+ "name": "mneAgent"
682
+ },
683
+ "type": {
684
+ "id": 1,
685
+ "name": "issue-new"
686
+ },
687
+ "message": "Neuer Eintrag"
688
+ },
689
+ {
690
+ "created_at": "2026-03-13T09:58:23+01:00",
691
+ "user": {
692
+ "id": 53,
693
+ "name": "mneAgent"
694
+ },
695
+ "field": {
696
+ "name": "status",
697
+ "label": "Status"
698
+ },
699
+ "type": {
700
+ "id": 0,
701
+ "name": "field-updated"
702
+ },
703
+ "old_value": {
704
+ "id": 10,
705
+ "name": "new",
706
+ "label": "neu",
707
+ "color": "#eeb3aa"
708
+ },
709
+ "new_value": {
710
+ "id": 50,
711
+ "name": "assigned",
712
+ "label": "zugewiesen",
713
+ "color": "#afbed5"
714
+ },
715
+ "message": "Status",
716
+ "change": "neu => zugewiesen"
717
+ },
718
+ {
719
+ "created_at": "2026-03-13T09:58:23+01:00",
720
+ "user": {
721
+ "id": 53,
722
+ "name": "mneAgent"
723
+ },
724
+ "field": {
725
+ "name": "handler",
726
+ "label": "Bearbeitung durch"
727
+ },
728
+ "type": {
729
+ "id": 0,
730
+ "name": "field-updated"
731
+ },
732
+ "old_value": {
733
+ "id": 0
734
+ },
735
+ "new_value": {
736
+ "id": 51,
737
+ "name": "domAgent",
738
+ "real_name": "Dominik Pesch (via Agent)",
739
+ "email": "d.pesch+agent@11com7.de"
740
+ },
741
+ "message": "Bearbeitung durch",
742
+ "change": " => domAgent"
743
+ },
744
+ {
745
+ "created_at": "2026-03-13T11:25:18+01:00",
746
+ "user": {
747
+ "id": 51,
748
+ "name": "domAgent",
749
+ "real_name": "Dominik Pesch (via Agent)",
750
+ "email": "d.pesch+agent@11com7.de"
751
+ },
752
+ "type": {
753
+ "id": 2,
754
+ "name": "note-added"
755
+ },
756
+ "note": {
757
+ "id": 3980
758
+ },
759
+ "message": "Notiz hinzugefügt: 0003980"
760
+ },
761
+ {
762
+ "created_at": "2026-03-13T11:25:19+01:00",
763
+ "user": {
764
+ "id": 51,
765
+ "name": "domAgent",
766
+ "real_name": "Dominik Pesch (via Agent)",
767
+ "email": "d.pesch+agent@11com7.de"
768
+ },
769
+ "field": {
770
+ "name": "status",
771
+ "label": "Status"
772
+ },
773
+ "type": {
774
+ "id": 0,
775
+ "name": "field-updated"
776
+ },
777
+ "old_value": {
778
+ "id": 50,
779
+ "name": "assigned",
780
+ "label": "zugewiesen",
781
+ "color": "#afbed5"
782
+ },
783
+ "new_value": {
784
+ "id": 80,
785
+ "name": "resolved",
786
+ "label": "erledigt",
787
+ "color": "#e8e8e8"
788
+ },
789
+ "message": "Status",
790
+ "change": "zugewiesen => erledigt"
791
+ },
792
+ {
793
+ "created_at": "2026-03-13T11:25:19+01:00",
794
+ "user": {
795
+ "id": 51,
796
+ "name": "domAgent",
797
+ "real_name": "Dominik Pesch (via Agent)",
798
+ "email": "d.pesch+agent@11com7.de"
799
+ },
800
+ "field": {
801
+ "name": "resolution",
802
+ "label": "Lösung"
803
+ },
804
+ "type": {
805
+ "id": 0,
806
+ "name": "field-updated"
807
+ },
808
+ "old_value": {
809
+ "id": 10,
810
+ "name": "open",
811
+ "label": "offen"
812
+ },
813
+ "new_value": {
814
+ "id": 20,
815
+ "name": "fixed",
816
+ "label": "erledigt"
817
+ },
818
+ "message": "Lösung",
819
+ "change": "offen => erledigt"
820
+ }
821
+ ]
822
+ }
823
+ ]
824
+ }