cursor-usage-analyzer 0.3.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/.claude/settings.local.json +12 -6
  2. package/README.md +14 -0
  3. package/analyze.js +187 -42
  4. package/cursor-logs-export/chats/2026-02-05_2026-02-10_08-35-54_uu_app_aicoding_conv55.txt +49 -0
  5. package/cursor-logs-export/chats/2026-02-05_2026-02-10_08-36-35_uu_app_aicoding_conv54.txt +241 -0
  6. package/cursor-logs-export/chats/2026-02-05_2026-02-10_08-47-45_uu_app_aicoding_conv56.txt +122 -0
  7. package/cursor-logs-export/chats/2026-02-05_2026-02-10_08-56-31_uu_app_aicoding_conv40.txt +80 -0
  8. package/cursor-logs-export/chats/2026-02-05_2026-02-10_08-58-09__unmatched__conv108.txt +26 -0
  9. package/cursor-logs-export/chats/2026-02-05_2026-02-10_08-59-08_uu_app_aicoding_conv57.txt +306 -0
  10. package/cursor-logs-export/chats/2026-02-05_2026-02-10_09-00-49_uu_app_aicoding_conv41.txt +149 -0
  11. package/cursor-logs-export/chats/2026-02-05_2026-02-10_09-04-15_uu_app_aicoding_conv58.txt +143 -0
  12. package/cursor-logs-export/chats/2026-02-05_2026-02-10_09-06-29_uu_app_aicoding_conv59.txt +119 -0
  13. package/cursor-logs-export/chats/2026-02-05_2026-02-10_09-17-49_uu_app_aicoding_conv60.txt +227 -0
  14. package/cursor-logs-export/chats/2026-02-05_2026-02-10_09-18-36_uu_app_aicoding_conv70.txt +193 -0
  15. package/cursor-logs-export/chats/2026-02-05_2026-02-10_09-26-21_uu_app_aicoding_conv42.txt +111 -0
  16. package/cursor-logs-export/chats/2026-02-05_2026-02-10_09-31-34_uu_app_aicoding_conv71.txt +232 -0
  17. package/cursor-logs-export/chats/2026-02-05_2026-02-10_09-40-01_uu_app_aicoding_conv72.txt +125 -0
  18. package/cursor-logs-export/chats/2026-02-05_2026-02-10_09-49-58_uu_app_aicoding_conv73.txt +64 -0
  19. package/cursor-logs-export/chats/2026-02-05_2026-02-10_09-57-27_uu_entitymanage_conv43.txt +157 -0
  20. package/cursor-logs-export/chats/2026-02-05_2026-02-10_10-02-36_uu_app_aicoding_conv44.txt +294 -0
  21. package/cursor-logs-export/chats/2026-02-05_2026-02-10_10-48-21_uu_app_aicoding_conv79.txt +181 -0
  22. package/cursor-logs-export/chats/2026-02-05_2026-02-10_11-13-29_uu_app_aicoding_conv45.txt +160 -0
  23. package/cursor-logs-export/chats/2026-02-05_2026-02-10_11-19-00_uu_app_aicoding_conv46.txt +82 -0
  24. package/cursor-logs-export/chats/2026-02-05_2026-02-10_11-21-15_uu_app_aicoding_conv74.txt +103 -0
  25. package/cursor-logs-export/chats/2026-02-05_2026-02-10_11-25-21_uu_app_aicoding_conv75.txt +119 -0
  26. package/cursor-logs-export/chats/2026-02-05_2026-02-10_11-26-01_uu_app_aicoding_conv47.txt +266 -0
  27. package/cursor-logs-export/chats/2026-02-05_2026-02-10_11-31-42_uu_entitymanage_conv48.txt +130 -0
  28. package/cursor-logs-export/chats/2026-02-05_2026-02-10_11-33-00_uu_app_aicoding_conv1.txt +260 -0
  29. package/cursor-logs-export/chats/2026-02-05_2026-02-10_11-51-10_uu_app_aicoding_conv80.txt +68 -0
  30. package/cursor-logs-export/chats/2026-02-05_2026-02-10_12-24-42_cursor_usage_an_conv106.txt +769 -0
  31. package/cursor-logs-export/chats/2026-02-05_2026-02-10_12-37-27_uu_app_aicoding_conv2.txt +897 -0
  32. package/cursor-logs-export/chats/2026-02-05_2026-02-10_12-48-53__unmatched__conv109.txt +26 -0
  33. package/cursor-logs-export/chats/2026-02-05_2026-02-10_12-51-19_uu_app_aicoding_conv3.txt +72 -0
  34. package/cursor-logs-export/chats/2026-02-05_2026-02-10_13-01-28_uu_app_aicoding_conv4.txt +112 -0
  35. package/cursor-logs-export/chats/2026-02-05_2026-02-10_13-21-29_uu_app_aicoding_conv5.txt +286 -0
  36. package/cursor-logs-export/chats/2026-02-05_2026-02-10_14-14-37_uu_app_aicoding_conv76.txt +765 -0
  37. package/cursor-logs-export/chats/2026-02-05_2026-02-10_14-25-53_uu_app_aicoding_conv7.txt +134 -0
  38. package/cursor-logs-export/chats/2026-02-05_2026-02-10_14-31-19_uu_app_aicoding_conv8.txt +118 -0
  39. package/cursor-logs-export/chats/2026-02-05_2026-02-10_15-15-16_uu_app_aicoding_conv9.txt +4644 -0
  40. package/cursor-logs-export/chats/2026-02-05_2026-02-10_15-20-50_uu_app_aicoding_conv6.txt +945 -0
  41. package/cursor-logs-export/chats/2026-02-05_2026-02-10_16-00-41_cursor_usage_an_conv107.txt +85 -0
  42. package/cursor-logs-export/chats/2026-02-05_2026-02-10_16-25-01_uu_app_aicoding_conv11.txt +274 -0
  43. package/cursor-logs-export/chats/2026-02-05_2026-02-10_16-29-52_uu_app_aicoding_conv10.txt +1603 -0
  44. package/cursor-logs-export/chats/2026-02-05_2026-02-10_16-38-00_uu_app_aicoding_conv12.txt +96 -0
  45. package/cursor-logs-export/chats/2026-02-05_2026-02-10_16-43-55_uu_app_aicoding_conv13.txt +74 -0
  46. package/cursor-logs-export/chats/2026-02-05_2026-02-10_16-47-13_uu_app_aicoding_conv14.txt +172 -0
  47. package/cursor-logs-export/chats/2026-02-05_2026-02-10_16-48-38_uu_cloud_univer_conv82.txt +253 -0
  48. package/cursor-logs-export/chats/2026-02-05_2026-02-10_16-51-54_uu_app_aicoding_conv16.txt +189 -0
  49. package/cursor-logs-export/chats/2026-02-05_2026-02-10_16-51-54_uu_app_aicoding_conv17.txt +57 -0
  50. package/cursor-logs-export/chats/2026-02-05_2026-02-10_16-59-13_uu_app_aicoding_conv15.txt +36 -0
  51. package/cursor-logs-export/chats/2026-02-05_2026-02-10_17-03-28_uu_app_aicoding_conv18.txt +212 -0
  52. package/cursor-logs-export/chats/2026-02-05_2026-02-10_17-05-14_uu_app_aicoding_conv19.txt +87 -0
  53. package/cursor-logs-export/chats/2026-02-05_2026-02-10_17-13-17_uu_app_aicoding_conv20.txt +77 -0
  54. package/cursor-logs-export/chats/2026-02-05_2026-02-10_17-25-15_uu_app_aicoding_conv21.txt +131 -0
  55. package/cursor-logs-export/chats/2026-02-05_2026-02-10_17-31-30_uu_app_aicoding_conv23.txt +108 -0
  56. package/cursor-logs-export/chats/2026-02-05_2026-02-10_17-38-46_uu_app_aicoding_conv81.txt +428 -0
  57. package/cursor-logs-export/chats/2026-02-05_2026-02-10_17-43-08_uu_app_aicoding_conv24.txt +15297 -0
  58. package/cursor-logs-export/chats/2026-02-05_2026-02-10_17-51-39_uu_app_aicoding_conv22.txt +60 -0
  59. package/cursor-logs-export/chats/2026-02-05_2026-02-10_17-59-43_uu_app_aicoding_conv25.txt +189 -0
  60. package/cursor-logs-export/chats/2026-02-05_2026-02-10_18-03-50_uu_app_aicoding_conv26.txt +120 -0
  61. package/cursor-logs-export/chats/2026-02-05_2026-02-10_18-30-45_uu_app_aicoding_conv83.txt +523 -0
  62. package/cursor-logs-export/chats/2026-02-05_2026-02-10_18-32-40_uu_app_aicoding_conv27.txt +3941 -0
  63. package/cursor-logs-export/chats/2026-02-05_2026-02-10_18-39-32_uu_app_aicoding_conv84.txt +133 -0
  64. package/cursor-logs-export/chats/2026-02-05_2026-02-10_18-41-01_uu_app_aicoding_conv28.txt +136 -0
  65. package/cursor-logs-export/chats/2026-02-05_2026-02-10_18-56-27_uu_app_aicoding_conv85.txt +211 -0
  66. package/cursor-logs-export/chats/2026-02-05_2026-02-10_19-10-56_uu_app_aicoding_conv86.txt +319 -0
  67. package/cursor-logs-export/chats/2026-02-05_2026-02-10_19-22-42_uu_app_aicoding_conv87.txt +193 -0
  68. package/cursor-logs-export/chats/2026-02-05_2026-02-10_19-27-57_uu_app_aicoding_conv88.txt +272 -0
  69. package/cursor-logs-export/chats/2026-02-05_2026-02-10_19-32-27_uu_app_aicoding_conv89.txt +50 -0
  70. package/cursor-logs-export/chats/2026-02-05_2026-02-10_19-42-59_uu_app_aicoding_conv90.txt +125 -0
  71. package/cursor-logs-export/chats/2026-02-05_2026-02-10_19-47-01_uu_app_aicoding_conv91.txt +102 -0
  72. package/cursor-logs-export/chats/2026-02-05_2026-02-10_19-58-26_uu_app_aicoding_conv92.txt +145 -0
  73. package/cursor-logs-export/chats/2026-02-05_2026-02-10_20-43-25_uu_app_aicoding_conv93.txt +553 -0
  74. package/cursor-logs-export/chats/2026-02-05_2026-02-10_20-56-36_uu_app_aicoding_conv95.txt +195 -0
  75. package/cursor-logs-export/chats/2026-02-05_2026-02-10_20-58-23_uu_app_aicoding_conv96.txt +86 -0
  76. package/cursor-logs-export/chats/2026-02-05_2026-02-10_21-01-26_uu_app_aicoding_conv94.txt +116 -0
  77. package/cursor-logs-export/chats/2026-02-05_2026-02-10_21-03-46_uu_app_aicoding_conv61.txt +1743 -0
  78. package/cursor-logs-export/chats/2026-02-05_2026-02-10_21-06-54_uu_app_aicoding_conv97.txt +102 -0
  79. package/cursor-logs-export/chats/2026-02-05_2026-02-10_21-07-32_uu_app_aicoding_conv29.txt +9930 -0
  80. package/cursor-logs-export/chats/2026-02-05_2026-02-10_21-09-02_uu_app_aicoding_conv98.txt +111 -0
  81. package/cursor-logs-export/chats/2026-02-05_2026-02-10_21-11-07_uu_app_aicoding_conv49.txt +170 -0
  82. package/cursor-logs-export/chats/2026-02-05_2026-02-10_21-16-16_uu_app_aicoding_conv62.txt +200 -0
  83. package/cursor-logs-export/chats/2026-02-05_2026-02-10_21-17-18_uu_app_aicoding_conv31.txt +351 -0
  84. package/cursor-logs-export/chats/2026-02-05_2026-02-10_21-26-32_uu_app_aicoding_conv99.txt +219 -0
  85. package/cursor-logs-export/chats/2026-02-05_2026-02-10_21-29-18_uu_app_aicoding_conv100.txt +121 -0
  86. package/cursor-logs-export/chats/2026-02-05_2026-02-10_21-33-35_uu_app_aicoding_conv30.txt +204 -0
  87. package/cursor-logs-export/chats/2026-02-05_2026-02-10_21-38-37_uu_app_aicoding_conv63.txt +251 -0
  88. package/cursor-logs-export/chats/2026-02-05_2026-02-10_21-42-10_uu_entitymanage_conv33.txt +163 -0
  89. package/cursor-logs-export/chats/2026-02-05_2026-02-10_21-43-41_uu_app_aicoding_conv64.txt +139 -0
  90. package/cursor-logs-export/chats/2026-02-05_2026-02-10_21-43-53_uu_app_aicoding_conv101.txt +221 -0
  91. package/cursor-logs-export/chats/2026-02-05_2026-02-10_21-44-55_uu_app_aicoding_conv50.txt +156 -0
  92. package/cursor-logs-export/chats/2026-02-05_2026-02-10_21-47-10_uu_app_aicoding_conv65.txt +136 -0
  93. package/cursor-logs-export/chats/2026-02-05_2026-02-10_21-48-40_uu_app_aicoding_conv51.txt +130 -0
  94. package/cursor-logs-export/chats/2026-02-05_2026-02-10_21-49-31_uu_app_aicoding_conv102.txt +153 -0
  95. package/cursor-logs-export/chats/2026-02-05_2026-02-10_21-49-44_uu_app_aicoding_conv66.txt +54 -0
  96. package/cursor-logs-export/chats/2026-02-05_2026-02-10_21-51-05_uu_app_aicoding_conv67.txt +55 -0
  97. package/cursor-logs-export/chats/2026-02-05_2026-02-10_21-51-26_uu_app_aicoding_conv32.txt +6172 -0
  98. package/cursor-logs-export/chats/2026-02-05_2026-02-10_21-56-08_uu_app_aicoding_conv103.txt +102 -0
  99. package/cursor-logs-export/chats/2026-02-05_2026-02-10_21-59-00_uu_app_aicoding_conv52.txt +244 -0
  100. package/cursor-logs-export/chats/2026-02-05_2026-02-10_22-10-16_uu_app_aicoding_conv77.txt +61 -0
  101. package/cursor-logs-export/chats/2026-02-05_2026-02-10_22-11-24_uu_app_aicoding_conv68.txt +142 -0
  102. package/cursor-logs-export/chats/2026-02-05_2026-02-10_22-12-31_uu_app_aicoding_conv104.txt +66 -0
  103. package/cursor-logs-export/chats/2026-02-05_2026-02-10_22-16-03_uu_app_aicoding_conv53.txt +439 -0
  104. package/cursor-logs-export/chats/2026-02-05_2026-02-10_22-23-41_uu_entitymanage_conv34.txt +2251 -0
  105. package/cursor-logs-export/chats/2026-02-05_2026-02-10_22-25-56_uu_app_aicoding_conv69.txt +169 -0
  106. package/cursor-logs-export/chats/2026-02-05_2026-02-10_22-26-54_uu_app_aicoding_conv105.txt +70 -0
  107. package/cursor-logs-export/chats/2026-02-05_2026-02-10_22-33-45_uu_entitymanage_conv35.txt +144 -0
  108. package/cursor-logs-export/chats/2026-02-05_2026-02-10_22-39-23_uu_app_aicoding_conv37.txt +104 -0
  109. package/cursor-logs-export/chats/2026-02-05_2026-02-10_22-45-30_uu_app_aicoding_conv78.txt +187 -0
  110. package/cursor-logs-export/chats/2026-02-05_2026-02-10_23-04-38_uu_app_aicoding_conv36.txt +2292 -0
  111. package/cursor-logs-export/chats/2026-02-05_2026-02-10_23-08-50_uu_entitymanage_conv38.txt +109 -0
  112. package/cursor-logs-export/chats/2026-02-05_2026-02-10_23-14-01_uu_entitymanage_conv39.txt +112 -0
  113. package/cursor-logs-export/report.html +3071 -0
  114. package/html-template.js +610 -18
  115. package/package.json +18 -7
  116. package/.idea/copilot.data.migration.agent.xml +0 -6
  117. package/.idea/cursor-usage-analyzer.iml +0 -12
  118. package/.idea/modules.xml +0 -8
  119. package/.idea/vcs.xml +0 -11
  120. package/cursor-usage-analyzer-0.1.0.tgz +0 -0
  121. package/cursor-usage-analyzer-0.2.0.tgz +0 -0
  122. package/cursor-usage-analyzer-0.2.1.tgz +0 -0
  123. package/team-usage-events-10287858-2025-12-18.csv +0 -600
@@ -0,0 +1,1743 @@
1
+ ================================================================================
2
+ CONVERSATION #61
3
+ Name: New Jira read skill
4
+ Workspace: uu_app_aicodingg01
5
+ Time: 2/7/2026, 9:03:46 PM
6
+ Model: claude-4.5-opus-high-thinking
7
+ Context Tokens: 71,367 / 164,000 (43.5%)
8
+ Changes: +374 -0 lines in 3 files
9
+ Messages: 104
10
+ Composer ID: 3a24deee-e36c-496b-8126-5e30470def62
11
+
12
+ API TOKEN USAGE (from dashboard export):
13
+ API Calls: 29
14
+ Input (w/ Cache Write): 743,807
15
+ Input (w/o Cache Write): 221,927
16
+ Cache Read: 18,876,839
17
+ Output Tokens: 148,962
18
+ Total API Tokens: 19,991,535
19
+ Cost: $22.54
20
+
21
+ ================================================================================
22
+
23
+
24
+ --------------------------------------------------------------------------------
25
+ [USER] 9:03:46 PM
26
+ --------------------------------------------------------------------------------
27
+ add new skill jira-read which will read jira url address like
28
+ https://jira.unicorn.com/browse/AUTOMATION-412
29
+
30
+ it might happen i will describe just the ticket number in the future..
31
+
32
+ i expect the skill to return all importnt infromation - assigne, time spent, projectcode, descripton, comments, ...
33
+
34
+ you need to use plus4u-skilled-,mcp as the authorization fomr there is needed
35
+
36
+ --------------------------------------------------------------------------------
37
+ [ASSISTANT] 9:03:46 PM
38
+ --------------------------------------------------------------------------------
39
+ I'll create a new `jira-read` skill for reading JIRA tickets. Let me first examine the existing skill structure and the MCP integration to understand the pattern.
40
+
41
+ --------------------------------------------------------------------------------
42
+ [ASSISTANT] 9:03:46 PM
43
+ --------------------------------------------------------------------------------
44
+ Now I understand the pattern. I'll create the `jira-read` skill with:
45
+ 1. A shared `jira.js` utility file
46
+ 2. The `skill.js` entry point
47
+ 3. The `SKILL.md` documentation
48
+
49
+ --------------------------------------------------------------------------------
50
+ [ASSISTANT] 9:03:46 PM
51
+ --------------------------------------------------------------------------------
52
+ I've created the `jira-read` skill. Let me verify the files and reload the skills in the MCP server.
53
+
54
+ --------------------------------------------------------------------------------
55
+ [ASSISTANT] 9:03:46 PM
56
+ --------------------------------------------------------------------------------
57
+ The `jira-read` skill is now created and loaded. Let me test it with the JIRA URL you provided.
58
+
59
+ --------------------------------------------------------------------------------
60
+ [ASSISTANT] 9:03:46 PM
61
+ --------------------------------------------------------------------------------
62
+ The skill is working but JIRA returned a 401 (authentication required). The Plus4U token doesn't work directly with JIRA - they use different authentication systems.
63
+
64
+ Let me check the HTTP client implementation to see how we can adapt this for JIRA authentication.
65
+
66
+ --------------------------------------------------------------------------------
67
+ [ASSISTANT] 9:03:46 PM
68
+ --------------------------------------------------------------------------------
69
+ I see the issue. The HTTP client uses Bearer token from Plus4U OIDC, but JIRA uses different authentication (typically Basic auth with API tokens). Let me check if there's any existing JIRA integration or if we need to add support for JIRA-specific authentication.
70
+
71
+ --------------------------------------------------------------------------------
72
+ [ASSISTANT] 9:03:46 PM
73
+ --------------------------------------------------------------------------------
74
+ The issue is that JIRA requires its own authentication (typically API token with Basic auth), not the Plus4U Bearer token. Let me update the skill to support JIRA-specific authentication via API token.
75
+
76
+ --------------------------------------------------------------------------------
77
+ [ASSISTANT] 9:03:46 PM
78
+ --------------------------------------------------------------------------------
79
+ Now let me update the skill.js to accept and pass the JIRA credentials.
80
+
81
+ --------------------------------------------------------------------------------
82
+ [ASSISTANT] 9:03:46 PM
83
+ --------------------------------------------------------------------------------
84
+ Now let me update the SKILL.md to document the JIRA authentication.
85
+
86
+ --------------------------------------------------------------------------------
87
+ [ASSISTANT] 9:03:46 PM
88
+ --------------------------------------------------------------------------------
89
+ Let me reload the skills to pick up the changes.
90
+
91
+ --------------------------------------------------------------------------------
92
+ [ASSISTANT] 9:03:46 PM
93
+ --------------------------------------------------------------------------------
94
+ The `jira-read` skill is now created. Let me show you the final structure.
95
+
96
+ --------------------------------------------------------------------------------
97
+ [USER] 9:03:46 PM
98
+ --------------------------------------------------------------------------------
99
+ stop it is wrong.. i need identity from plus4u.. but there is some kind of token exchange i do not know..
100
+ i need you to figure out, there is a page https://jira.unicorn.com/login.jsp there is a button, once i pressed it just tkes the token somehow from my identity alredy logged from plus4u
101
+ https://jira.unicorn.com/rest/unicornssorest/1/sso/jirabaseurl?_=1770491466457
102
+
103
+ https://jira.unicorn.com/rest/unicornssorest/1/sso/oidcclient?_=1770491466458
104
+
105
+ https://jira.unicorn.com/plugins/servlet/unicornsso/oidccallback
106
+ https://uuidentity.plus4u.net/uu-oidc-maing02/bb977a99f4cc4c37a2afce3fd599d0a7/oidc
107
+
108
+
109
+
110
+
111
+
112
+
113
+
114
+
115
+
116
+
117
+ <!DOCTYPE html>
118
+ <html lang="en">
119
+ <head>
120
+
121
+
122
+
123
+
124
+
125
+
126
+
127
+
128
+
129
+
130
+ <meta charset="utf-8">
131
+ <meta http-equiv="X-UA-Compatible" content="IE=Edge"/>
132
+ <title>Log in - JIRA Unicorn Systems</title>
133
+ <meta name="application-name" content="JIRA" data-name="jira" data-version="9.12.29"><meta name="ajs-server-scheme" content="https">
134
+ <meta name="ajs-server-port" content="443">
135
+ <meta name="ajs-server-name" content="jira.unicorn.com">
136
+ <meta name="ajs-behind-proxy" content="null">
137
+ <meta name="ajs-base-url" content="https://jira.unicorn.com">
138
+ <meta name="ajs-dev-mode" content="false">
139
+ <meta name="ajs-context-path" content="">
140
+ <meta name="ajs-version-number" content="9.12.29">
141
+ <meta name="ajs-build-number" content="9120029">
142
+ <meta name="ajs-is-beta" content="false">
143
+ <meta name="ajs-is-rc" content="false">
144
+ <meta name="ajs-is-snapshot" content="false">
145
+ <meta name="ajs-is-milestone" content="false">
146
+ <meta name="ajs-remote-user" content="15-9032-1">
147
+ <meta name="ajs-remote-user-fullname" content="Jílek Daniel">
148
+ <meta name="ajs-user-locale" content="en_US">
149
+ <meta name="ajs-user-locale-group-separator" content=",">
150
+ <meta name="ajs-app-title" content="JIRA Unicorn Systems">
151
+ <meta name="ajs-keyboard-shortcuts-enabled" content="true">
152
+ <meta name="ajs-keyboard-accesskey-modifier" content="Ctrl+Alt">
153
+ <meta name="ajs-enabled-dark-features" content="[&quot;com.atlassian.jira.agile.darkfeature.editable.detailsview&quot;,&quot;nps.survey.inline.dialog&quot;,&quot;com.atlassian.jira.agile.darkfeature.edit.closed.sprint.enabled&quot;,&quot;jira.plugin.devstatus.phasetwo&quot;,&quot;jira.frother.reporter.field&quot;,&quot;atlassian.rest.xsrf.legacy.enabled&quot;,&quot;com.atlassian.jira.security.xsrf.session.token.disabled&quot;,&quot;jira.issue.status.lozenge&quot;,&quot;com.atlassian.jira.projects.issuenavigator&quot;,&quot;jira.plugin.devstatus.phasetwo.enabled&quot;,&quot;com.atlassian.jira.config.PDL&quot;,&quot;atlassian.aui.raphael.disabled&quot;,&quot;crowd.sync.nested.groups.group.membership.changes.batching.enabled&quot;,&quot;app-switcher.new&quot;,&quot;frother.assignee.field&quot;,&quot;com.atlassian.jira.projects.ProjectCentricNavigation.Switch&quot;,&quot;jira.onboarding.cyoa&quot;,&quot;com.atlassian.jira.agile.darkfeature.kanplan.enabled&quot;,&quot;com.atlassian.jira.projects.sidebar.DEFER_RESOURCES&quot;,&quot;com.atlassian.jira.config.ProjectConfig.MENU&quot;,&quot;com.atlassian.jira.agile.darkfeature.kanplan.epics.and.versions.enabled&quot;,&quot;com.atlassian.jira.agile.darkfeature.sprint.goal.enabled&quot;,&quot;jira.zdu.admin-updates-ui&quot;,&quot;jira.zdu.jmx-monitoring&quot;,&quot;sd.new.settings.sidebar.location.disabled&quot;,&quot;crowd.event.transformer.directory.manager.cache&quot;,&quot;jira.zdu.cluster-upgrade-state&quot;,&quot;com.atlassian.jira.email.templates.readFromJiraHome&quot;,&quot;com.atlassian.jira.agile.darkfeature.splitissue&quot;,&quot;crowd.sync.delete.user.memberships.batching.enabled&quot;,&quot;com.atlassian.jira.config.CoreFeatures.LICENSE_ROLES_ENABLED&quot;,&quot;jira.export.csv.enabled&quot;]">
154
+ <meta name="ajs-in-admin-mode" content="false">
155
+ <meta name="ajs-is-sysadmin" content="false">
156
+ <meta name="ajs-is-admin" content="false">
157
+ <meta name="ajs-outgoing-mail-enabled" content="true">
158
+ <meta name="ajs-archiving-enabled" content="true">
159
+ <meta name="ajs-date-relativize" content="false">
160
+ <meta name="ajs-date-time" content="HH:mm">
161
+ <meta name="ajs-date-day" content="EEEE HH:mm">
162
+ <meta name="ajs-date-dmy" content="dd.MM.yy">
163
+ <meta name="ajs-date-complete" content="dd.MM.yy HH:mm">
164
+ <meta name="ajs-use-iso8601" content="true">
165
+ <script type="text/javascript">var AJS=AJS||{};AJS.debug=true;</script><meta name="ajs-admin-quicksearch-show" content="true">
166
+
167
+
168
+
169
+ <meta id="atlassian-token" name="atlassian-token" content="B4UT-24XT-2JHM-LTUU_f2f3aa6e181fcbf41e9c2b53bff42c3d4087267e_lin">
170
+
171
+
172
+
173
+ <link rel="shortcut icon" href="/s/-v35iz9/9120029/15zgbto/_/images/fav-jsw.png">
174
+ <link rel="search" type="application/opensearchdescription+xml" href="/osd.jsp" title="Log in - JIRA Unicorn Systems"/>
175
+
176
+
177
+
178
+
179
+
180
+
181
+
182
+
183
+ <!--[if IE]><![endif]-->
184
+ <script type="text/javascript">
185
+ (function() {
186
+ var contextPath = '';
187
+
188
+ function printDeprecatedMsg() {
189
+ if (console && console.warn) {
190
+ console.warn('DEPRECATED JS - contextPath global variable has been deprecated since 7.4.0. Use `wrm/context-path` module instead.');
191
+ }
192
+ }
193
+
194
+ Object.defineProperty(window, 'contextPath', {
195
+ get: function() {
196
+ printDeprecatedMsg();
197
+ return contextPath;
198
+ },
199
+ set: function(value) {
200
+ printDeprecatedMsg();
201
+ contextPath = value;
202
+ }
203
+ });
204
+ })();
205
+
206
+ </script>
207
+ <script data-wrm-key="com.atlassian.plugins.atlassian-plugins-webresource-rest:data-collector-perf-observer,jira.webresources:resource-phase-checkpoint-init" data-wrm-batch-type="resource" data-initially-rendered>
208
+ window.__resourcePhaseCheckpointResolvers={resolveDeferPhaseCheckpoint:null,resolveInteractionPhaseCheckpoint:null};if(window.performance&&window.performance.mark){window.DeferScripts||(window.DeferScripts={});window.DeferScripts.totalClicks=0;window.DeferScripts.totalKeydowns=0;window.DeferScripts.clickListener=function(){"use strict";window.DeferScripts.totalClicks+=1};window.addEventListener("click",window.DeferScripts.clickListener);window.DeferScripts.keydownListener=function(){"use strict";window.DeferScripts.totalKeydowns+=1};window.addEventListener("keydown",window.DeferScripts.keydownListener)}window.resourcePhaseCheckpoint=Object.freeze({defer:new Promise((function(e){"use strict";window.__resourcePhaseCheckpointResolvers.resolveDeferPhaseCheckpoint=e})),interaction:new Promise((function(e){"use strict";window.__resourcePhaseCheckpointResolvers.resolveInteractionPhaseCheckpoint=e}))});Object.freeze(window.__resourcePhaseCheckpointResolvers);
209
+ !function(){"use strict";if("PerformanceObserver"in window){const e=[];window.__observedResources=e;const r=e=>"script"===e?"script":"css";new PerformanceObserver((n=>{n.getEntries().filter((({initiatorType:e,name:r})=>{const n="script"===e||((e,r)=>"link"===e&&"css"===new URL(r).pathname.split(".").pop())(e,r),i=new URL(location.href).origin===new URL(r).origin;return n&&i})).forEach((({name:n,transferSize:i,encodedBodySize:s,initiatorType:o})=>{e.push([i,s,n,r(o)])}))})).observe({type:"resource"})}}();
210
+
211
+ </script>
212
+ <script>
213
+ window.WRM=window.WRM||{};window.WRM._unparsedData=window.WRM._unparsedData||{};window.WRM._unparsedErrors=window.WRM._unparsedErrors||{};
214
+ WRM._unparsedData["tzdetect.pref.tzname"]="\u0022(GMT+01:00) Prague\u0022";
215
+ WRM._unparsedData["tzdetect.pref.auto.detect"]="true";
216
+ WRM._unparsedData["tzdetect.pref.janOffset"]="3600000";
217
+ WRM._unparsedData["jira.core:default-comment-security-level-data.DefaultCommentSecurityLevelHelpLink"]="{\u0022extraClasses\u0022:\u0022default-comment-level-help\u0022,\u0022title\u0022:\u0022Commenting on an Issue\u0022,\u0022url\u0022:\u0022https://docs.atlassian.com/jira/jsw-docs-0912/Editing+and+collaborating+on+issues#Editingandcollaboratingonissues-restrictacomment\u0022,\u0022isLocal\u0022:false}";
218
+ WRM._unparsedData["jira.core:feature-flags-data.feature-flag-data"]="{\u0022enabled-feature-keys\u0022:[\u0022com.atlassian.jira.agile.darkfeature.editable.detailsview\u0022,\u0022nps.survey.inline.dialog\u0022,\u0022com.atlassian.jira.agile.darkfeature.edit.closed.sprint.enabled\u0022,\u0022jira.plugin.devstatus.phasetwo\u0022,\u0022jira.frother.reporter.field\u0022,\u0022atlassian.rest.xsrf.legacy.enabled\u0022,\u0022com.atlassian.jira.security.xsrf.session.token.disabled\u0022,\u0022jira.issue.status.lozenge\u0022,\u0022com.atlassian.jira.projects.issuenavigator\u0022,\u0022jira.plugin.devstatus.phasetwo.enabled\u0022,\u0022com.atlassian.jira.config.PDL\u0022,\u0022atlassian.aui.raphael.disabled\u0022,\u0022crowd.sync.nested.groups.group.membership.changes.batching.enabled\u0022,\u0022app-switcher.new\u0022,\u0022frother.assignee.field\u0022,\u0022com.atlassian.jira.projects.ProjectCentricNavigation.Switch\u0022,\u0022jira.onboarding.cyoa\u0022,\u0022com.atlassian.jira.agile.darkfeature.kanplan.enabled\u0022,\u0022com.atlassian.jira.projects.sidebar.DEFER_RESOURCES\u0022,\u0022com.atlassian.jira.config.ProjectConfig.MENU\u0022,\u0022com.atlassian.jira.agile.darkfeature.kanplan.epics.and.versions.enabled\u0022,\u0022com.atlassian.jira.agile.darkfeature.sprint.goal.enabled\u0022,\u0022jira.zdu.admin-updates-ui\u0022,\u0022jira.zdu.jmx-monitoring\u0022,\u0022sd.new.settings.sidebar.location.disabled\u0022,\u0022crowd.event.transformer.directory.manager.cache\u0022,\u0022jira.zdu.cluster-upgrade-state\u0022,\u0022com.atlassian.jira.email.templates.readFromJiraHome\u0022,\u0022com.atlassian.jira.agile.darkfeature.splitissue\u0022,\u0022crowd.sync.delete.user.memberships.batching.enabled\u0022,\u0022com.atlassian.jira.config.CoreFeatures.LICENSE_ROLES_ENABLED\u0022,\u0022jira.export.csv.enabled\u0022],\u0022feature-flag-states\u0022:{\u0022com.atlassian.jira.use.same.site.none.for.xsrf.token.cookie\u0022:true,\u0022com.atlassian.jira.leaked.all.anonymous.access\u0022:true,\u0022com.atlassian.jira.in.product.diagnostics.extended.logging\u0022:false,\u0022com.atlassian.jira.agile.darkfeature.handle.ug.usernames\u0022:true,\u0022com.atlassian.jira.security.rest.menu.anonymous.access.denied\u0022:true,\u0022com.atlassian.jira.mailHandlerImapMessageQueryLegacy\u0022:false,\u0022com.atlassian.diagnostics.scheduler.monitor\u0022:true,\u0022com.atlassian.jira.webhookEventsAsyncProcessing\u0022:false,\u0022jira.customfields.dual.list.box\u0022:true,\u0022com.atlassian.jira.serAllowShareWithNonMember\u0022:true,\u0022com.atlassian.jira.diagnostics.perflog\u0022:true,\u0022com.atlassian.jira.dbr\u0022:true,\u0022com.atlassian.jira.bc.user.search.MeasuringUserPickerSearchService\u0022:false,\u0022com.atlassian.jira.agile.darkfeature.legacy.epic.picker\u0022:false,\u0022com.atlassian.jira.issuetable.move.links.hidden\u0022:true,\u0022jira.renderer.consider.variable.format\u0022:true,\u0022jira.no.frother.multiuserpicker.field\u0022:false,\u0022com.atlassian.jira.plugin.issuenavigator.jql.autocomplete.eagerlyLoaded\u0022:false,\u0022com.atlassian.jira.user.dbIdBasedKeyGenerationStrategy\u0022:true,\u0022com.atlassian.portfolio.dcBundling\u0022:true,\u0022com.atlassian.jira.rest.enable.new.session.creation.endpoint\u0022:true,\u0022com.atlassian.jira.sharedEntityEditRights\u0022:true,\u0022com.atlassian.jira.agile.darkfeature.sprint.goal\u0022:true,\u0022com.atlassian.jira.thumbnailsDeferredGeneration\u0022:true,\u0022jira.cluster.monitoring.show.offline.nodes\u0022:true,\u0022com.atlassian.jira.projects.ProjectCentricNavigation.ProjectShortcutOrder\u0022:true,\u0022com.atlassian.jira.commentReactions\u0022:true,\u0022data.pipeline.feature.jira.issue.links.export\u0022:true,\u0022com.atlassian.jira.web.action.admin.integrity.checker.task.cleanup\u0022:true,\u0022com.atlassian.jira.custom.csv.escaper\u0022:true,\u0022com.atlassian.jira.fixedCommentDeletionNotifications\u0022:true,\u0022com.atlassian.jira.allThumbnailsDeferred\u0022:false,\u0022com.atlassian.jira.plugin.issuenavigator.filtersUxImprovment\u0022:true,\u0022com.atlassian.jira.agile.darkfeature.kanplan.epics.and.versions\u0022:true,\u0022com.atlassian.jira.TextUtilsWrapper.deserialization\u0022:false,\u0022jira.customfields.cleanup.identification\u0022:true,\u0022data.pipeline.feature.jira.all.exportable.custom.fields\u0022:true,\u0022com.atlassian.jira.in.product.diagnostics.wip\u0022:false,\u0022com.atlassian.jira.defaultValuesForSystemFields\u0022:true,\u0022jira.dc.cleanup.cluser.tasks\u0022:true,\u0022jira.customfields.bulk.delete\u0022:true,\u0022mail.batching.override.core\u0022:true,\u0022com.atlassian.jira.issues.archiving.filters\u0022:false,\u0022jira.users.and.roles.page.in.react\u0022:true,\u0022jira.security.csp.sandbox\u0022:true,\u0022com.atlassian.jira.agile.darkfeature.synced.sprints\u0022:false,\u0022com.atlassian.jira.agile.darkfeature.velocity.chart.ui\u0022:true,\u0022com.atlassian.jira.returnDefaultAvatarsForBrokenAvatars\u0022:true,\u0022com.atlassian.jira.agile.darkfeature.sprint.auto.management\u0022:true,\u0022jira.jql.suggestrecentfields\u0022:false,\u0022com.atlassian.jira.gdpr.rtbf\u0022:true,\u0022com.atlassian.jira.ignoreBrowseUsersPermissionsInUserPickers\u0022:true,\u0022com.atlassian.jira.issue.comments.updateIssueObjectBeforeEventTrigger\u0022:true,\u0022com.atlassian.jira.security.xsrf.session.token\u0022:false,\u0022com.atlassian.jira.rest.search.filter.user.input.preserve\u0022:true,\u0022com.atlassian.jira.security.project.admin.revoke.with.application.access\u0022:true,\u0022com.atlassian.jira.agile.darkfeature.optimistic.transitions\u0022:true,\u0022com.atlassian.jiranomenclature\u0022:true,\u0022com.atlassian.jira.agile.darkfeature.kanplan\u0022:true,\u0022com.atlassian.jira.agile.darkfeature.boards.find.on.board\u0022:true,\u0022com.atlassian.diagnostics.http.monitor\u0022:true,\u0022com.atlassian.jira.agile.darkfeature.future.sprint.dates\u0022:true,\u0022com.atlassian.jira.agile.darkfeature.complete.sprint.in.backlog\u0022:true,\u0022jira.customfields.paginated.ui\u0022:true,\u0022com.atlassian.jira.filtersAndDashboardsShareableWithAllGroupsAndRoles\u0022:true,\u0022com.atlassian.jira.in.product.diagnostics\u0022:true,\u0022com.atlassian.jira.agile.darkfeature.edit.closed.sprint\u0022:true,\u0022jira.create.linked.issue\u0022:true,\u0022jira.customfields.configure.modern.ui\u0022:false,\u0022jira.sal.host.connect.accessor.existing.transaction.will.create.transactions\u0022:true,\u0022com.atlassian.jira.advanced.audit.log\u0022:true,\u0022com.atlassian.jira.security.csv.export.injection.protection\u0022:true,\u0022jira.quick.search\u0022:true,\u0022external.links.new.window\u0022:true,\u0022jira.jql.smartautoselectfirst\u0022:false,\u0022jira.jql.membersof.ignoreGlobalPermissionsForAnonymous\u0022:false,\u0022jira.create.linked.issue.show.all.fields\u0022:true,\u0022data.pipeline.feature.jira.issue.history.export\u0022:true,\u0022jira.webactions.request.method.recognition\u0022:true,\u0022jira.richeditor.bidi.warning\u0022:true,\u0022atlassian.cdn.static.assets\u0022:true,\u0022com.atlassian.jira.lazyload.activity.tabs\u0022:true,\u0022mail.batching\u0022:false,\u0022com.atlassian.jira.safeguards\u0022:true,\u0022com.atlassian.jira.issue.index.db.filter.out.archive.issues\u0022:true,\u0022com.atlassian.jira.xml.deserializerAllowlist\u0022:true,\u0022com.atlassian.jira.privateEntitiesEditable\u0022:true,\u0022com.atlassian.jira.cfoIncludeArchivedIssuesAndAlwaysKeepContext\u0022:true,\u0022jira.priorities.per.project.edit.default\u0022:false,\u0022com.atlassian.jira.projectArchivedIssuesAreMarkedInIssueTable\u0022:true,\u0022com.atlassian.jira.agile.darkfeature.issues.in.epic.details.view\u0022:true,\u0022com.atlassian.jira.attachments.storage.configurable\u0022:false,\u0022com.atlassian.jira.plugin.issuenavigator.anonymousPreventCfData\u0022:false,\u0022jira.priorities.per.project.jsd\u0022:true,\u0022com.atlassian.jira.safeguards.email.notifications\u0022:true,\u0022com.atlassian.jira.agile.darkfeature.rapid.boards.bands\u0022:true,\u0022com.atlassian.jira.agile.darkfeature.flexible.boards\u0022:true,\u0022com.atlassian.jira.agile.darkfeature.sprint.picker.allsprints.suggestion\u0022:true,\u0022com.atlassian.jira.agile.darkfeature.epic.validate.visibility\u0022:true,\u0022data.pipeline.feature.jira.issue.rank.export\u0022:true,\u0022data.pipeline.feature.jira.jsm.approvals.export\u0022:true,\u0022jira.dc.lock.leasing\u0022:true,\u0022com.atlassian.jira.accessibility.personal.settings\u0022:true,\u0022mail.batching.create.section.cf\u0022:true,\u0022com.atlassian.jira.send.email.notifications.to.user.without.application.access\u0022:false,\u0022com.atlassian.mail.server.managers.hostname.verification\u0022:true,\u0022com.atlassian.advancedroadmaps.rebrand\u0022:true,\u0022com.atlassian.diagnostics.monitors\u0022:true,\u0022com.atlassian.jira.upgrade.startup.fix.index\u0022:true,\u0022com.atlassian.jira.cacheResource\u0022:false,\u0022com.atlassian.jira.pin.comments\u0022:true,\u0022jira.redirect.anonymous.404.errors\u0022:true,\u0022com.atlassian.jira.issuetable.draggable\u0022:true,\u0022data.pipeline.feature.jira.jsm.canned.responses.export\u0022:true,\u0022com.atlassian.diagnostics.operating.system.monitor\u0022:false,\u0022com.atlassian.jira.attachments.generate.unique.suffix\u0022:true,\u0022com.atlassian.jira.agile.darkfeature.kanban.hide.old.done.issues\u0022:true,\u0022jira.version.based.node.reindex.service\u0022:true,\u0022com.atlassian.jira.agile.darkfeature.backlog.showmore\u0022:true,\u0022com.atlassian.diagnostics.database.monitor\u0022:true,\u0022com.atlassian.jira.quick.search.mode.settable\u0022:true,\u0022com.atlassian.jira.agile.darkfeature.sprint.plan\u0022:false,\u0022com.atlassian.diagnostics.garbage.collection.monitor\u0022:true,\u0022jira.jql.membersof.ignoreGlobalPermissionsForLoggedUsers\u0022:false,\u0022com.atlassian.jira.safeguards.work.in.progress\u0022:false,\u0022com.atlassian.jira.commentStickyFooter\u0022:true,\u0022com.atlassian.jira.security.LegacyJiraTypeResolver.WARN_ONLY\u0022:false,\u0022data.pipeline.feature.jira.schema.version.2\u0022:true,\u0022com.atlassian.jira.agile.darkfeature.burnupchart\u0022:true,\u0022com.atlassian.jira.issues.archiving.browse\u0022:true,\u0022com.atlassian.jira.agile.darkfeature.velocity.sprint.picker\u0022:false,\u0022jira.instrumentation.laas\u0022:false,\u0022com.atlassian.jira.security.ChartUtils.browse.projects.permission.check\u0022:false,\u0022com.atlassian.jira.security.text.gadget.output.sanitization\u0022:true,\u0022data.pipeline.feature.jira.jsm.kb.stats.events.export\u0022:true,\u0022mail.batching.user.notification\u0022:true,\u0022com.atlassian.diagnostics.jql.monitor\u0022:true,\u0022com.atlassian.portfolio.permission.check.for.permissions\u0022:true,\u0022com.atlassian.jira.agile.darkfeature.dataonpageload\u0022:true,\u0022com.atlassian.jira.issue.watchers.filterUsersWithoutProjectAccess\u0022:true,\u0022jira.webactions.request.method.dependent.xsrf.checks\u0022:true,\u0022data.pipeline.feature.jira.archived.issue.export\u0022:false,\u0022com.atlassian.jira.projects.per.project.permission.query\u0022:true,\u0022com.atlassian.jira.issues.archiving\u0022:true,\u0022jira.priorities.per.project\u0022:true,\u0022index.use.snappy\u0022:true}}";
219
+ WRM._unparsedData["jira.core:terminology-data.terminology"]="{\u0022terminologyEntries\u0022:[{\u0022originalName\u0022:\u0022sprint\u0022,\u0022originalNamePlural\u0022:\u0022sprints\u0022,\u0022newName\u0022:\u0022sprint\u0022,\u0022newNamePlural\u0022:\u0022sprints\u0022,\u0022isDefault\u0022:true},{\u0022originalName\u0022:\u0022epic\u0022,\u0022originalNamePlural\u0022:\u0022epics\u0022,\u0022newName\u0022:\u0022epic\u0022,\u0022newNamePlural\u0022:\u0022epics\u0022,\u0022isDefault\u0022:true}],\u0022isTerminologyActive\u0022:false}";
220
+ WRM._unparsedData["com.atlassian.plugins.helptips.jira-help-tips:help-tip-manager.JiraHelpTipData"]="{\u0022dismissed\u0022:[\u0022automation.onboarding.spotlight.cards\u0022,\u0022inproduct.language.changed\u0022,\u0022newsletter-signup-tip\u0022,\u0022qs-onboarding-tip\u0022],\u0022anonymous\u0022:false}";
221
+ WRM._unparsedData["jira.core:avatar-picker-data.data"]="{}";
222
+ WRM._unparsedData["jira.request.correlation-id"]="\u0022775e83a589431e\u0022";
223
+ WRM._unparsedData["tzdetect.pref.tzid"]="\u0022Europe/Prague\u0022";
224
+ WRM._unparsedData["com.atlassian.analytics.analytics-client:programmatic-analytics-init.programmatic-analytics-data-provider"]="false";
225
+ WRM._unparsedData["com.atlassian.plugins.atlassian-plugins-webresource-plugin:context-path.context-path"]="\u0022\u0022";
226
+ WRM._unparsedData["com.atlassian.analytics.analytics-client:policy-update-init.policy-update-data-provider"]="false";
227
+ WRM._unparsedData["com.atlassian.jira.jira-header-plugin:newsletter-signup-tip-init.newsletterSignup"]="{\u0022signupDescription\u0022:\u0022Get updates, inspiration and best practices from the team behind Jira.\u0022,\u0022formUrl\u0022:\u0022https://www.atlassian.com/apis/exact-target/{0}/subscribe?mailingListId=1401671\u0022,\u0022userEmail\u0022:\u0022daniel.jilek@unicorn.com\u0022,\u0022signupTitle\u0022:\u0022Sign up!\u0022,\u0022signupId\u0022:\u0022newsletter-signup-tip\u0022,\u0022showNewsletterTip\u0022:true}";
228
+ WRM._unparsedData["tzdetect.pref.julyOffset"]="7200000";
229
+ WRM._unparsedData["jira.core:dateFormatProvider.allFormats"]="{\u0022dateFormats\u0022:{\u0022meridiem\u0022:[\u0022AM\u0022,\u0022PM\u0022],\u0022eras\u0022:[\u0022BC\u0022,\u0022AD\u0022],\u0022months\u0022:[\u0022January\u0022,\u0022February\u0022,\u0022March\u0022,\u0022April\u0022,\u0022May\u0022,\u0022June\u0022,\u0022July\u0022,\u0022August\u0022,\u0022September\u0022,\u0022October\u0022,\u0022November\u0022,\u0022December\u0022],\u0022monthsShort\u0022:[\u0022Jan\u0022,\u0022Feb\u0022,\u0022Mar\u0022,\u0022Apr\u0022,\u0022May\u0022,\u0022Jun\u0022,\u0022Jul\u0022,\u0022Aug\u0022,\u0022Sep\u0022,\u0022Oct\u0022,\u0022Nov\u0022,\u0022Dec\u0022],\u0022weekdaysShort\u0022:[\u0022Sun\u0022,\u0022Mon\u0022,\u0022Tue\u0022,\u0022Wed\u0022,\u0022Thu\u0022,\u0022Fri\u0022,\u0022Sat\u0022],\u0022weekdays\u0022:[\u0022Sunday\u0022,\u0022Monday\u0022,\u0022Tuesday\u0022,\u0022Wednesday\u0022,\u0022Thursday\u0022,\u0022Friday\u0022,\u0022Saturday\u0022]},\u0022lookAndFeelFormats\u0022:{\u0022relativize\u0022:\u0022false\u0022,\u0022time\u0022:\u0022HH:mm\u0022,\u0022day\u0022:\u0022EEEE HH:mm\u0022,\u0022dmy\u0022:\u0022dd.MM.yy\u0022,\u0022complete\u0022:\u0022dd.MM.yy HH:mm\u0022}}";
230
+ WRM._unparsedData["com.atlassian.jira.jira-header-plugin:dismissedFlags.flags"]="{\u0022dismissed\u0022:[]}";
231
+ WRM._unparsedData["com.atlassian.jira.project-templates-plugin:project-templates-plugin-resources.ptAnalyticsData"]="{\u0022instanceCreatedDate\u0022:\u00222014-02-28\u0022}";
232
+ WRM._unparsedData["jira.core:user-message-flags-data.adminLockout"]="{}";
233
+ if(window.WRM._dataArrived)window.WRM._dataArrived();</script>
234
+ <link rel="stylesheet" href="/s/bae08cf1e6ff6a49876be1c4d9053395-CDN/-v35iz9/9120029/15zgbto/f0a82cb2aa4ff009c22adb8c492c9f06/_/download/contextbatch/css/_super,-com.atlassian.plugins.atlassian-plugins-webresource-rest:data-collector-perf-observer,-jira.webresources:resource-phase-checkpoint-init/batch.css" data-wrm-key="_super,-com.atlassian.plugins.atlassian-plugins-webresource-rest:data-collector-perf-observer,-jira.webresources:resource-phase-checkpoint-init" data-wrm-batch-type="context" media="all">
235
+ <link rel="stylesheet" href="/s/f2896436fd57845acc8100cd88d5da8c-CDN/-v35iz9/9120029/15zgbto/18b1008997cb284ce4e1a40ecb86512e/_/download/contextbatch/css/atl.general,jira.general,jira.global,-_super/batch.css?agile_global_admin_condition=true&amp;analytics-enabled=true&amp;jag=true&amp;jaguser=true" data-wrm-key="atl.general,jira.general,jira.global,-_super" data-wrm-batch-type="context" media="all">
236
+ <link rel="stylesheet" href="/s/eb0fa2278f745ceface73afae2534cec-CDN/-v35iz9/9120029/15zgbto/2c47a096316a1ea6dd4061883ffb678a/_/download/contextbatch/css/jira.login,-_super/batch.css" data-wrm-key="jira.login,-_super" data-wrm-batch-type="context" media="all">
237
+ <link rel="stylesheet" href="/s/279bb54e5ae550fedf2c328d336974fc-CDN/-v35iz9/9120029/15zgbto/fc1b8d3a6e605367f4ce2164a6384d2b/_/download/contextbatch/css/jira.global.look-and-feel,-_super/batch.css" data-wrm-key="jira.global.look-and-feel,-_super" data-wrm-batch-type="context" media="all">
238
+ <link rel="stylesheet" href="/s/eb0fa2278f745ceface73afae2534cec-CDN/-v35iz9/9120029/15zgbto/1.0/_/download/batch/jira.webresources:captcha/jira.webresources:captcha.css" data-wrm-key="jira.webresources:captcha" data-wrm-batch-type="resource" media="all">
239
+ <script src="/s/1e5b428fdef9e12854d3ebf38b38729e-CDN/-v35iz9/9120029/15zgbto/f0a82cb2aa4ff009c22adb8c492c9f06/_/download/contextbatch/js/_super,-com.atlassian.plugins.atlassian-plugins-webresource-rest:data-collector-perf-observer,-jira.webresources:resource-phase-checkpoint-init/batch.js?locale=en-US" data-wrm-key="_super,-com.atlassian.plugins.atlassian-plugins-webresource-rest:data-collector-perf-observer,-jira.webresources:resource-phase-checkpoint-init" data-wrm-batch-type="context" data-initially-rendered></script>
240
+ <script src="/s/fde335e07f04527d78c75804b4811aaf-CDN/-v35iz9/9120029/15zgbto/18b1008997cb284ce4e1a40ecb86512e/_/download/contextbatch/js/atl.general,jira.general,jira.global,-_super/batch.js?agile_global_admin_condition=true&amp;analytics-enabled=true&amp;jag=true&amp;jaguser=true&amp;locale=en-US" data-wrm-key="atl.general,jira.general,jira.global,-_super" data-wrm-batch-type="context" data-initially-rendered></script>
241
+ <script src="/s/0a12965d6fd386d41eabd41fc3530ddc-CDN/-v35iz9/9120029/15zgbto/27bf639195b7bf36322b0162de5d96de/_/download/contextbatch/js/atl.global,-_super/batch.js?locale=en-US" data-wrm-key="atl.global,-_super" data-wrm-batch-type="context" data-initially-rendered></script>
242
+ <script src="/s/d41d8cd98f00b204e9800998ecf8427e-CDN/-v35iz9/9120029/15zgbto/1.0/_/download/batch/jira.webresources:captcha/jira.webresources:captcha.js" data-wrm-key="jira.webresources:captcha" data-wrm-batch-type="resource" data-initially-rendered></script>
243
+ <script src="/s/d41d8cd98f00b204e9800998ecf8427e-CDN/-v35iz9/9120029/15zgbto/1.0/_/download/batch/jira.webresources:event-deferrer/jira.webresources:event-deferrer.js" data-wrm-key="jira.webresources:event-deferrer" data-wrm-batch-type="resource" data-initially-rendered></script>
244
+ <script type="module">WRM.requireLazily(["wr!com.atlassian.jira.jira-tzdetect-plugin:tzdetect-banner-component","wr!com.atlassian.jira.jira-tzdetect-plugin:tzdetect-lib","wr!com.atlassian.plugins.atlassian-plugins-webresource-rest:data-collector-async"])</script>
245
+
246
+
247
+
248
+
249
+ <meta name="viewport" content="width=device-width, initial-scale=1">
250
+
251
+
252
+ <meta name="decorator" content="login" />
253
+
254
+ </head>
255
+ <body id="jira" class="aui-layout aui-theme-default page-type-login " data-version="9.12.29">
256
+ <div id="page">
257
+
258
+ <header id="header" role="banner">
259
+
260
+
261
+
262
+
263
+
264
+
265
+
266
+
267
+
268
+
269
+
270
+
271
+
272
+
273
+
274
+
275
+
276
+
277
+
278
+
279
+ <a class="aui-skip-link" href="#main">Skip to main content</a><a class="aui-skip-link" href="#sidebar">Skip to sidebar</a><nav class="aui-header aui-dropdown2-trigger-group" aria-label="Site"><div class="aui-header-inner"><div class="aui-header-before"><button class=" aui-dropdown2-trigger app-switcher-trigger aui-dropdown2-trigger-arrowless" aria-controls="app-switcher" aria-haspopup="true" role="button" data-aui-trigger href="#app-switcher"><span class="aui-icon aui-icon-small aui-iconfont-appswitcher">Linked Applications</span></button><div id="app-switcher" class="aui-dropdown2 aui-style-default" role="menu" hidden data-is-user-admin="false" data-is-switcher="true"><div class="app-switcher-loading">Loading&hellip;</div></div></div><div class="aui-header-primary"><span id="logo" class="aui-header-logo aui-header-logo-custom"><a href="https://jira.unicorn.com/secure/MyJiraHome.jspa" aria-label="Go to home page"><img src="/s/-v35iz9/9120029/15zgbto/_/jira-logo-scaled.png" alt="JIRA Unicorn Systems" /></a></span><ul class='aui-nav'><li><a role="button" href="/secure/Dashboard.jspa" class=" aui-nav-link aui-dropdown2-trigger jira-dropdown2-ajax" id="home_link" aria-haspopup="true" aria-controls="home_link-content" title="View and manage your dashboards" accesskey="d" elementtiming="app-header" data-aui-extra-classes>Dashboards</a><div class="aui-dropdown2 aui-style-default" id="home_link-content" data-aui-dropdown2-ajax-key="home_link"></div></li><li><a role="button" href="/browse/AUTOMATION" class=" aui-nav-link aui-dropdown2-trigger jira-dropdown2-ajax" id="browse_link" aria-haspopup="true" aria-controls="browse_link-content" title="View recent projects and browse a list of projects" accesskey="p" data-aui-extra-classes>Projects</a><div class="aui-dropdown2 aui-style-default" id="browse_link-content" data-aui-dropdown2-ajax-key="browse_link"></div></li><li><a role="button" href="/issues/" class=" aui-nav-link aui-dropdown2-trigger jira-dropdown2-ajax" id="find_link" aria-haspopup="true" aria-controls="find_link-content" title="Search for issues and view recent issues" accesskey="i" data-aui-extra-classes>Issues</a><div class="aui-dropdown2 aui-style-default" id="find_link-content" data-aui-dropdown2-ajax-key="find_link"></div></li><li><a role="button" href="/secure/RapidBoard.jspa" class=" aui-nav-link aui-dropdown2-trigger" id="greenhopper_menu" aria-haspopup="true" aria-controls="greenhopper_menu-content" title="Manage your project with Jira Software">Boards</a><div class="aui-dropdown2 aui-style-default" id="greenhopper_menu-content"><div id="greenhopper_menu_dropdown" class="aui-dropdown2-section" ><ul class="aui-list-truncate"><li id="ghx-manageviews-mlink"><a href="/secure/ManageRapidViews.jspa" id="ghx-manageviews-mlink_lnk" class="">View all boards</a></li></ul></div></div></li><li><a role="button" href="" class=" aui-nav-link aui-dropdown2-trigger jira-dropdown2-ajax" id="plugins-jira-webitem-main" aria-haspopup="true" aria-controls="plugins-jira-webitem-main-content" title="View and manage your Advanced Roadmaps plans" data-aui-extra-classes>Plans</a><div class="aui-dropdown2 aui-style-default" id="plugins-jira-webitem-main-content" data-aui-dropdown2-ajax-key="plugins-jira-webitem-main"></div></li><script>performance.mark("app-header");</script>
280
+ <li id="create-menu"><a id="create_link" role="button" class="aui-button aui-button-primary aui-style create-issue " title="Create a new issue / bug / feature request / etc" href="/secure/CreateIssue!default.jspa" accesskey="c">Create</a></li></ul></div><div class="aui-header-secondary"><ul class='aui-nav'>
281
+ <li id="quicksearch-menu">
282
+ <form action="/secure/QuickSearch.jspa" method="get" id="quicksearch" class="aui-quicksearch dont-default-focus ajs-dirty-warning-exempt">
283
+ <input id="quickSearchInput" aria-live="polite" role="searchbox" autocomplete="off" class="search" type="text" title="Search" placeholder="Search" name="searchString" accessKey="q" />
284
+ <input type="submit" class="hidden" value="Search">
285
+ </form>
286
+ </li>
287
+ <li><a class="jira-feedback-plugin" role="button" aria-label="Feedback" aria-haspopup="true" id="jira-header-feedback-link" href="#" ><span class="aui-icon aui-icon-small aui-iconfont-feedback">Give feedback to Atlassian</span></a></li>
288
+
289
+
290
+
291
+
292
+ <li id="system-help-menu">
293
+ <a class="aui-nav-link aui-dropdown2-trigger aui-dropdown2-trigger-arrowless"
294
+ id="help_menu"
295
+ aria-label="Help"
296
+ aria-haspopup="true"
297
+ aria-owns="system-help-menu-content"
298
+ href="https://docs.atlassian.com/jira/jsw-docs-0912/"
299
+ target="_blank" rel="noopener noreferrer" title="Help"
300
+ >
301
+ <span class="aui-icon aui-icon-small aui-iconfont-question-filled">Help</span>
302
+ </a>
303
+ <div id="system-help-menu-content" class="aui-dropdown2 aui-style-default">
304
+ <div class="aui-dropdown2-section">
305
+ <ul id="jira-help" class="aui-list-truncate">
306
+ <li>
307
+ <a id="gh_view_help" class="aui-nav-link " title="Get help online for Jira Software" href="https://docs.atlassian.com/jira/jsw-docs-0912/" target="_blank" >Jira Software help</a>
308
+ </li>
309
+ <li>
310
+ <a id="view_core_help" class="aui-nav-link " title="Go to the online documentation for Jira Core" href="https://docs.atlassian.com/jira/jcore-docs-0912/" target="_blank" >Jira Core help</a>
311
+ </li>
312
+ <li>
313
+ <a id="rm-roadmaps-webitem-docs" class="aui-nav-link " href="https://confluence.atlassian.com/display/JIRASOFTWARESERVER/Advanced+Roadmaps+documentation" >Advanced Roadmaps for Jira help</a>
314
+ </li>
315
+ <li>
316
+ <a id="jpo-keyboard-shortcuts" class="aui-nav-link jpo-keyboard-shortcuts" href="/secure/PortfolioKeyboardShortcuts.jspa" >Advanced Roadmaps keyboard shortcuts</a>
317
+ </li>
318
+ <li>
319
+ <a id="keyshortscuthelp" class="aui-nav-link " title="Get more information about Jira's Keyboard Shortcuts" href="/secure/ViewKeyboardShortcuts!default.jspa" target="_blank" >Keyboard Shortcuts</a>
320
+ </li>
321
+ <li>
322
+ <a id="view_about" class="aui-nav-link " title="Get more information about Jira" href="/secure/AboutPage.jspa" >About Jira</a>
323
+ </li>
324
+ <li>
325
+ <a id="view_credits" class="aui-nav-link " title="See who did what" href="/secure/credits/AroundTheWorld!default.jspa" target="_blank" >Jira Credits</a>
326
+ </li>
327
+ </ul>
328
+ </div>
329
+ </div>
330
+ </li>
331
+
332
+
333
+ <li id="system-admin-menu">
334
+ <a href="/secure/project/BrowseProjects.jspa?s=view_projects"
335
+ id="admin_menu"
336
+ class="aui-nav-link aui-dropdown2-trigger aui-dropdown2-trigger-arrowless"
337
+ aria-label="Administration"
338
+ aria-haspopup="true"
339
+ aria-owns="system-admin-menu-content"
340
+ title="Administration"
341
+ >
342
+ <span class="aui-icon aui-icon-small aui-iconfont-configure">Administration</span>
343
+ </a>
344
+ <div id="system-admin-menu-content" class="aui-dropdown2 aui-style-default">
345
+ <div class="aui-dropdown2-section">
346
+ <strong>Jira administration</strong>
347
+ <ul class="aui-list-truncate">
348
+ <li>
349
+ <a href="/secure/project/BrowseProjects.jspa?s=view_projects" class="aui-nav-link" id="admin_project_menu" >Projects</a>
350
+ </li>
351
+ </ul>
352
+ </div>
353
+ </div>
354
+ </li>
355
+
356
+
357
+
358
+
359
+
360
+
361
+
362
+
363
+
364
+ <li id="user-options">
365
+ <a id="header-details-user-fullname"
366
+ class="aui-dropdown2-trigger aui-dropdown2-trigger-arrowless"
367
+ aria-label="User Profile"
368
+ aria-haspopup="true"
369
+ aria-owns="user-options-content"
370
+ data-username="15-9032-1"
371
+ data-displayname="Jílek Daniel"
372
+ href="/secure/ViewProfile.jspa"
373
+ title="User profile for Jílek Daniel"
374
+ >
375
+ <span class="aui-avatar aui-avatar-small">
376
+ <span class="aui-avatar-inner">
377
+ <img src="https://jira.unicorn.com/secure/useravatar?size=small&ownerId=15-9032-1&avatarId=20315" alt="User profile for Jílek Daniel"/>
378
+ </span>
379
+ </span>
380
+ </a>
381
+ <div id="user-options-content" class="aui-dropdown2 aui-style-default">
382
+ <div class="aui-dropdown2-section">
383
+ <ul id="personal" class="aui-list-truncate">
384
+ <li>
385
+ <a id="view_profile" class="" title="View and change your details and preferences" href="/secure/ViewProfile.jspa">Profile</a>
386
+ </li>
387
+ <li>
388
+ <a id="a11y-personal-settings-link" class="" title="Change your accessibility settings" href="/secure/AccessibilityPersonalSettings!default.jspa">Accessibility</a>
389
+ </li>
390
+ <li>
391
+ <a id="tts-user-preferences-link" class="" href="/plugins/servlet/tts/preferences">Time to SLA Preferences</a>
392
+ </li>
393
+ <li>
394
+ <a id="upm-requests-link" class="" href="/plugins/servlet/upm/requests?source=header_user">Atlassian Marketplace</a>
395
+ </li>
396
+ </ul>
397
+ </div>
398
+ <div class="aui-dropdown2-section">
399
+ <strong>My Jira Home</strong>
400
+ <ul id="set_my_jira_home" class="aui-list-truncate">
401
+ <li>
402
+ <a id="set_my_jira_home_default" class="aui-dropdown2-radio aui-dropdown2-checked " title="Set my Jira Home to the Dashboard." href="/secure/UpdateMyJiraHome.jspa?target=com.atlassian.jira.jira-my-home-plugin%3Aset_my_jira_home_dashboard&atl_token=B4UT-24XT-2JHM-LTUU_f2f3aa6e181fcbf41e9c2b53bff42c3d4087267e_lin">Dashboard</a>
403
+ </li>
404
+ <li>
405
+ <a id="greenhopper-my-jira-home-set" class="aui-dropdown2-radio " title="Set my Jira home page to Boards." href="/secure/UpdateMyJiraHome.jspa?target=com.pyxis.greenhopper.jira%3Agreenhopper-my-jira-home-set-51&atl_token=B4UT-24XT-2JHM-LTUU_f2f3aa6e181fcbf41e9c2b53bff42c3d4087267e_lin">Boards</a>
406
+ </li>
407
+ <li>
408
+ <a id="set_my_jira_home_issuenav" class="aui-dropdown2-radio " title="Set my Jira Home to the Issue Navigator." href="/secure/UpdateMyJiraHome.jspa?target=com.atlassian.jira.jira-my-home-plugin%3Aset_my_jira_home_issue&atl_token=B4UT-24XT-2JHM-LTUU_f2f3aa6e181fcbf41e9c2b53bff42c3d4087267e_lin">Issue Navigator</a>
409
+ </li>
410
+ </ul>
411
+ </div>
412
+ <div class="aui-dropdown2-section">
413
+ </div>
414
+ <div class="aui-dropdown2-section">
415
+ <strong></strong>
416
+ <ul id="inproduct-translate-dropdown-section" class="aui-list-truncate">
417
+ <li>
418
+ <a id="inproduct_translate_page" class="" href="">Switch on Translations</a>
419
+ </li>
420
+ </ul>
421
+ </div>
422
+ <div class="aui-dropdown2-section">
423
+ <ul id="system" class="aui-list-truncate">
424
+ <li>
425
+ <a id="log_out" class="" title="Log out and cancel any automatic login." href="/logout?atl_token=B4UT-24XT-2JHM-LTUU_f2f3aa6e181fcbf41e9c2b53bff42c3d4087267e_lin">Log Out</a>
426
+ </li>
427
+ </ul>
428
+ </div>
429
+ </div>
430
+ </li>
431
+ </ul></div></div><!-- .aui-header-inner--><aui-header-end></aui-header-end></nav><!-- .aui-header -->
432
+ </header>
433
+
434
+
435
+
436
+
437
+
438
+ <div id="content">
439
+ <div class="aui-page-panel" ><div class="aui-page-panel-inner">
440
+ <main role="main" id="main" class="aui-page-panel-content" >
441
+
442
+
443
+ <header class="aui-page-header"><div class="aui-page-header-inner"><div class="aui-page-header-main">
444
+
445
+ <h1>Welcome to JIRA Unicorn Systems</h1>
446
+
447
+ </div></div></header>
448
+
449
+
450
+
451
+
452
+
453
+
454
+
455
+
456
+
457
+
458
+
459
+
460
+
461
+
462
+
463
+
464
+
465
+
466
+
467
+
468
+
469
+
470
+
471
+
472
+
473
+
474
+
475
+
476
+
477
+ <script>
478
+ function hideShowAdminLogin() {
479
+ var login = document.getElementById("login-form");
480
+ if(login.style.display === "none"){
481
+ login.style.display = "block";
482
+ } else {
483
+ login.style.display = "none";
484
+ }
485
+ }
486
+
487
+ $( document ).ready(function() {
488
+ hideShowAdminLogin();
489
+ });
490
+
491
+ </script>
492
+ <div style=" text-align: center;">
493
+ <br>
494
+ <fieldset class="compact-form-fields">
495
+ <div class="field-group form-buttons compact-form-buttons">
496
+ <input class="aui-button" type="button" value="Log in" onClick="doSsoLogin()">
497
+ <div id="plus4uSsoError" style="display:none" class="aui-message error"></div>
498
+ </div>
499
+ </fieldset>
500
+ </div>
501
+ <br>
502
+ <fieldset class="compact-form-fields">
503
+ <div class="field-group form-buttons compact-form-buttons" style="text-align: center;">
504
+ <a name="adminLoginButton" id="adminLoginButton" onClick="hideShowAdminLogin()">Admin Login</a>
505
+ </div>
506
+ </fieldset>
507
+ </div>
508
+
509
+
510
+
511
+
512
+
513
+
514
+
515
+
516
+
517
+ <form action="/login.jsp"
518
+ class="aui"
519
+
520
+ id="login-form"
521
+
522
+
523
+ method="post">
524
+ <div class="form-body">
525
+
526
+
527
+
528
+
529
+
530
+
531
+
532
+
533
+
534
+
535
+
536
+
537
+
538
+
539
+
540
+
541
+
542
+
543
+
544
+
545
+ <div class="aui-group jira-login-method">
546
+ <div class="aui-item jira-login-item">
547
+
548
+
549
+
550
+
551
+
552
+
553
+ <div class="field-group">
554
+
555
+ <label accesskey="u" for="login-form-username"><u>U</u>sername</label>
556
+ <input class="text medium-field" id="login-form-username" name="os_username" type="text" aria-describedby="login-form-error" value="" />
557
+
558
+
559
+ </div>
560
+
561
+
562
+
563
+
564
+
565
+
566
+ <div class="field-group">
567
+
568
+ <label accesskey="p" for="login-form-password" id="passwordlabel"><u>P</u>assword</label>
569
+ <input id="login-form-password" class="text medium-field" name="os_password" type="password" />
570
+
571
+
572
+ </div>
573
+
574
+
575
+
576
+
577
+
578
+
579
+
580
+
581
+ <fieldset class="group ">
582
+
583
+
584
+
585
+
586
+
587
+
588
+
589
+
590
+ <div class="checkbox">
591
+
592
+
593
+ <input class="checkbox" id="login-form-remember-me" name="os_cookie" type="checkbox" value="true" />
594
+ <label for="login-form-remember-me" accesskey="r"><u>R</u>emember my login on this computer</label>
595
+
596
+
597
+ </div>
598
+
599
+ </fieldset> <!-- // .group -->
600
+
601
+
602
+
603
+
604
+
605
+
606
+ <div id="sign-up-hint" class="field-group">
607
+
608
+ Not a member? To request an account, please contact your Jira administrators.
609
+
610
+ </div>
611
+
612
+ </div>
613
+ </div>
614
+
615
+
616
+
617
+ <div class="hidden"
618
+
619
+
620
+
621
+ >
622
+ <input
623
+
624
+
625
+
626
+
627
+ name="os_destination"
628
+
629
+ type="hidden"
630
+
631
+
632
+
633
+
634
+
635
+
636
+
637
+ />
638
+ </div>
639
+
640
+
641
+
642
+
643
+
644
+ <div class="hidden"
645
+
646
+
647
+
648
+ >
649
+ <input
650
+
651
+
652
+
653
+
654
+ name="user_role"
655
+
656
+ type="hidden"
657
+
658
+
659
+
660
+
661
+
662
+
663
+
664
+ />
665
+ </div>
666
+
667
+
668
+
669
+
670
+
671
+
672
+ <div class="hidden"
673
+
674
+
675
+
676
+ >
677
+ <input
678
+
679
+
680
+
681
+
682
+ name="atl_token"
683
+
684
+ type="hidden"
685
+
686
+
687
+
688
+
689
+
690
+
691
+
692
+ />
693
+ </div>
694
+
695
+ </div>
696
+
697
+ <div class="buttons-container form-footer">
698
+ <div class="buttons">
699
+
700
+
701
+
702
+
703
+
704
+
705
+ <button
706
+
707
+ accesskey="s"
708
+
709
+
710
+ class="aui-button aui-button-primary"
711
+
712
+
713
+
714
+
715
+ id="login-form-submit"
716
+
717
+
718
+ name="login"
719
+ title="Press Ctrl+Alt+s to submit this form"
720
+ type="submit"
721
+
722
+ value="Log In"
723
+
724
+
725
+ >
726
+
727
+ Log In
728
+
729
+
730
+ </button>
731
+
732
+
733
+
734
+ </div>
735
+
736
+ </div>
737
+
738
+ </form> <!-- // .aui #login-form -->
739
+
740
+
741
+
742
+
743
+ </main>
744
+ </div></div>
745
+ </div>
746
+
747
+ <footer id="footer" role="contentinfo">
748
+
749
+
750
+
751
+ <section class="footer-body">
752
+ <ul class="atlassian-footer">
753
+ <li>
754
+ Atlassian Jira <a class="seo-link" rel="nofollow" href="https://www.atlassian.com/software/jira">Project Management Software</a>
755
+ <span id="footer-build-information">(v9.12.29#9120029-<span title='4cb96399cf8001776e5427348baedd2b6572143b' data-commit-id='4cb96399cf8001776e5427348baedd2b6572143b}'>sha1:4cb9639</span>)</span>
756
+ </li>
757
+ <li>
758
+ <a id="about-link" rel="nofollow" href="/secure/AboutPage.jspa/secure/AboutPage.jspa">About Jira</a>
759
+ </li>
760
+ <li>
761
+ <a id="footer-report-problem-link" rel="nofollow" href="/secure/CreateIssue!default.jspa">Report a problem</a>
762
+ </li>
763
+ </ul>
764
+ <p class="atlassian-footer">
765
+ <span class="licensemessage">
766
+
767
+ </span>
768
+ </p>
769
+
770
+ <div id="footer-logo"><a rel="nofollow" href="http://www.atlassian.com/">Atlassian</a></div>
771
+ </section>
772
+
773
+
774
+
775
+
776
+
777
+
778
+
779
+
780
+
781
+
782
+
783
+ <fieldset class="hidden parameters">
784
+ <input type="hidden" title="loggedInUser" value="">
785
+ <input type="hidden" title="ajaxTimeout" value="The call to the Jira server did not complete within the timeout period. We are unsure of the result of this operation.">
786
+ <input type="hidden" title="JiraVersion" value="9.12.29" />
787
+ <input type="hidden" title="ajaxUnauthorised" value="You are not authorized to perform this operation. Please log in.">
788
+ <input type="hidden" title="baseURL" value="https://jira.unicorn.com" />
789
+ <input type="hidden" title="ajaxCommsError" value="The Jira server could not be contacted. This may be a temporary glitch or the server may be down. ">
790
+ <input type="hidden" title="ajaxServerError" value="The Jira server was contacted but has returned an error response. We are unsure of the result of this operation.">
791
+ <input type="hidden" title="ajaxErrorCloseDialog" value="Close this dialog and press refresh in your browser">
792
+ <input type="hidden" title="ajaxErrorDialogHeading" value="Communications Breakdown">
793
+
794
+ <input type="hidden" title="dirtyMessage" value="You have entered new data on this page. If you navigate away from this page without first saving your data, the changes will be lost.">
795
+ <input type="hidden" title="dirtyDialogMessage" value="You have entered new data in this dialog. If you navigate away from this dialog without first saving your data, the changes will be lost. Click cancel to return to the dialog.">
796
+ <input type="hidden" title="keyType" value="Type">
797
+ <input type="hidden" title="keyThen" value="then">
798
+ <input type="hidden" title="dblClickToExpand" value="Double click to expand">
799
+ <input type="hidden" title="actions" value="Actions">
800
+ <input type="hidden" title="removeItem" value="Remove">
801
+ <input type="hidden" title="workflow" value="Workflow">
802
+ <input type="hidden" title="labelNew" value="New Label">
803
+ <input type="hidden" title="issueActionsHint" value="Begin typing for available operations or press down to see all">
804
+ <input type="hidden" title="closelink" value="Close">
805
+ <input type="hidden" title="dotOperations" value="Operations">
806
+ <input type="hidden" title="dotLoading" value="Loading...">
807
+ <input type="hidden" title="frotherSuggestions" value="Suggestions">
808
+ <input type="hidden" title="frotherNomatches" value="No Matches">
809
+ <input type="hidden" title="multiselectVersionsError" value="{0} is not a valid version.">
810
+ <input type="hidden" title="multiselectComponentsError" value="{0} is not a valid component.">
811
+ <input type="hidden" title="multiselectGenericError" value="The value {0} is invalid.">
812
+ </fieldset>
813
+
814
+ </footer>
815
+
816
+ </div>
817
+
818
+
819
+ <script>
820
+ window.WRM=window.WRM||{};window.WRM._unparsedData=window.WRM._unparsedData||{};window.WRM._unparsedErrors=window.WRM._unparsedErrors||{};
821
+ WRM._unparsedData["keyboardShortcutsUrl"]="\u0022/rest/api/1.0/shortcuts/9120029/b1f66dc7dc9f52459975e5b0ee41460c/shortcuts\u0022";
822
+ if(window.WRM._dataArrived)window.WRM._dataArrived();</script>
823
+ <script src="/s/d41d8cd98f00b204e9800998ecf8427e-CDN/-v35iz9/9120029/15zgbto/9c10c8a3d20c751f96a47d5566e02c11/_/download/contextbatch/js/jira.webresources:resource-phase-checkpoint-hit,-_super/batch.js" data-wrm-key="jira.webresources:resource-phase-checkpoint-hit,-_super" data-wrm-batch-type="context" data-initially-rendered defer></script>
824
+
825
+
826
+ </body>
827
+ </html>
828
+
829
+ --------------------------------------------------------------------------------
830
+ [ASSISTANT] 9:03:46 PM
831
+ --------------------------------------------------------------------------------
832
+ I see! Unicorn's JIRA uses SSO integration with Plus4U identity via a custom `unicornsso` plugin. The flow involves:
833
+ 1. `/rest/unicornssorest/1/sso/oidcclient` - gets OIDC client config
834
+ 2. `/plugins/servlet/unicornsso/oidccallback` - callback for token exchange
835
+ 3. Plus4U OIDC endpoint at `uuidentity.plus4u.net`
836
+
837
+ Let me update the skill to use this SSO token exchange mechanism.
838
+
839
+ --------------------------------------------------------------------------------
840
+ [ASSISTANT] 9:03:46 PM
841
+ --------------------------------------------------------------------------------
842
+ Now I understand the SSO flow. Let me rewrite the JIRA utilities to use Plus4U SSO token exchange via the `unicornsso` plugin.
843
+
844
+ --------------------------------------------------------------------------------
845
+ [ASSISTANT] 9:03:46 PM
846
+ --------------------------------------------------------------------------------
847
+ Let me reload and test the skill to see if the Plus4U Bearer token works directly.
848
+
849
+ --------------------------------------------------------------------------------
850
+ [ASSISTANT] 9:03:46 PM
851
+ --------------------------------------------------------------------------------
852
+ The Plus4U Bearer token isn't accepted directly by JIRA's API. The `unicornsso` plugin is designed for browser-based OIDC flows. Let me investigate the SSO REST endpoints to see if there's a token exchange mechanism.
853
+
854
+ --------------------------------------------------------------------------------
855
+ [ASSISTANT] 9:03:46 PM
856
+ --------------------------------------------------------------------------------
857
+ The SSO endpoints return 406 (Not Acceptable) - they might need specific headers. Let me try different content negotiation.
858
+
859
+ --------------------------------------------------------------------------------
860
+ [ASSISTANT] 9:03:46 PM
861
+ --------------------------------------------------------------------------------
862
+ Excellent! Now I have the SSO configuration:
863
+ - **Client ID**: `mjQ2RW190qTp99Sb1715Wh0E`
864
+ - **OIDC URL**: `https://uuidentity.plus4u.net/uu-oidc-maing02/bb977a99f4cc4c37a2afce3fd599d0a7/oidc`
865
+
866
+ This is the Plus4U OIDC provider. Let me try to exchange our Plus4U token for a JIRA session by using the token with the OIDC callback.
867
+
868
+ --------------------------------------------------------------------------------
869
+ [ASSISTANT] 9:03:46 PM
870
+ --------------------------------------------------------------------------------
871
+ The OIDC endpoint structure is different. Let me try the OIDC discovery endpoint to find the correct paths.
872
+
873
+ --------------------------------------------------------------------------------
874
+ [ASSISTANT] 9:03:46 PM
875
+ --------------------------------------------------------------------------------
876
+ I found the OIDC discovery. The userinfo endpoint is `getIdentity` and importantly, it supports **token exchange** (`urn:ietf:params:oauth:grant-type:token-exchange`). Let me try using these endpoints.
877
+
878
+ --------------------------------------------------------------------------------
879
+ [ASSISTANT] 9:03:46 PM
880
+ --------------------------------------------------------------------------------
881
+ The Plus4U token works - I can see your identity (Daniel Jílek, 15-9032-1). The token exchange requires `subject_token` which is the actual access token. I need to expose this from the MCP http client.
882
+
883
+ Let me check and update the MCP to expose the token for token exchange operations.
884
+
885
+ --------------------------------------------------------------------------------
886
+ [ASSISTANT] 9:03:46 PM
887
+ --------------------------------------------------------------------------------
888
+ I'll add a `getToken()` method to the HttpClient interface to enable token exchange operations.
889
+
890
+ --------------------------------------------------------------------------------
891
+ [ASSISTANT] 9:03:46 PM
892
+ --------------------------------------------------------------------------------
893
+ Now I need to rebuild the MCP server and update the JIRA skill to use token exchange. Let me build the MCP.
894
+
895
+ --------------------------------------------------------------------------------
896
+ [ASSISTANT] 9:03:46 PM
897
+ --------------------------------------------------------------------------------
898
+ Now let me update the JIRA skill to use the token exchange flow.
899
+
900
+ --------------------------------------------------------------------------------
901
+ [ASSISTANT] 9:03:46 PM
902
+ --------------------------------------------------------------------------------
903
+ Now let me update the `loadJiraIssue` function to use token exchange.
904
+
905
+ --------------------------------------------------------------------------------
906
+ [ASSISTANT] 9:03:46 PM
907
+ --------------------------------------------------------------------------------
908
+ Let me also remove the old unused functions and clean up the file.
909
+
910
+ --------------------------------------------------------------------------------
911
+ [ASSISTANT] 9:03:46 PM
912
+ --------------------------------------------------------------------------------
913
+ Now let me reload the skills and test the token exchange.
914
+
915
+ --------------------------------------------------------------------------------
916
+ [ASSISTANT] 9:03:46 PM
917
+ --------------------------------------------------------------------------------
918
+ The MCP server needs to be restarted to pick up the new `getToken()` method. The running process still has the old code. Let me add a more helpful error message.
919
+
920
+ --------------------------------------------------------------------------------
921
+ [ASSISTANT] 9:03:46 PM
922
+ --------------------------------------------------------------------------------
923
+ The MCP server needs to be restarted to use the new `getToken()` method. You'll need to reload Cursor or restart the MCP server.
924
+
925
+ In the meantime, let me update the SKILL.md to document the token exchange mechanism properly.
926
+
927
+ --------------------------------------------------------------------------------
928
+ [ASSISTANT] 9:03:46 PM
929
+ --------------------------------------------------------------------------------
930
+ I've created the `jira-read` skill with Plus4U SSO token exchange. Here's a summary:
931
+
932
+ ## Created Files
933
+
934
+ 1. **`skills/jira-read/skill.js`** - Main skill entry point with debug modes
935
+ 2. **`skills/jira-read/SKILL.md`** - Documentation
936
+ 3. **`skills/shared/jira.js`** - JIRA API utilities with token exchange
937
+
938
+ ## Updated Files
939
+
940
+ 1. **`mcp/skilled-plus4u-mcp/src/lib/http-client.ts`** - Added `getToken()` method
941
+ 2. **`mcp/skilled-plus4u-mcp/src/types/index.ts`** - Updated `HttpClient` interface
942
+
943
+ ## How It Works
944
+
945
+ The skill uses **RFC 8693 Token Exchange** to convert your Plus4U token to a JIRA-audience token:
946
+
947
+ 1. Gets JIRA's OIDC client ID (`mjQ2RW190qTp99Sb1715Wh0E`) from unicornsso plugin
948
+ 2. Exchanges your Plus4U token via `/oidc/grantToken` endpoint
949
+ 3. Uses the exchanged token for JIRA API calls
950
+
951
+ ## To Test
952
+
953
+ **You need to restart the MCP server** for the new `getToken()` method to be available:
954
+
955
+ 1. In Cursor: Press `Cmd/Ctrl+Shift+P` → "Developer: Reload Window"
956
+ 2. Or restart Cursor entirely
957
+
958
+ Then try:
959
+ ```
960
+ executeSkill({ skill: "jira-read", params: { issueKey: "AUTOMATION-412" } })
961
+ ```
962
+
963
+ ## Fallback
964
+
965
+ If token exchange doesn't work, set environment variables:
966
+ ```bash
967
+ export JIRA_USER="your.username"
968
+ export JIRA_TOKEN="your-jira-pat-token"
969
+ ```
970
+
971
+ --------------------------------------------------------------------------------
972
+ [USER] 9:03:46 PM
973
+ --------------------------------------------------------------------------------
974
+ TRY AGAIN
975
+
976
+ --------------------------------------------------------------------------------
977
+ [ASSISTANT] 9:03:46 PM
978
+ --------------------------------------------------------------------------------
979
+ The MCP connection was reset. Let me check what tools are available now.
980
+
981
+ --------------------------------------------------------------------------------
982
+ [ASSISTANT] 9:03:46 PM
983
+ --------------------------------------------------------------------------------
984
+ The MCP server connection was reset during the reload. The server needs to reconnect.
985
+
986
+ Please try:
987
+ 1. Open Command Palette (`Cmd+Shift+P` / `Ctrl+Shift+P`)
988
+ 2. Run "Developer: Reload Window" again
989
+ 3. Wait a few seconds for MCP to reconnect
990
+ 4. Then ask me to try reading the JIRA ticket again
991
+
992
+ Alternatively, you can check if the MCP server is running by looking for any error messages in the Output panel (View → Output → select "MCP" or "skilled-plus4u-mcp").
993
+
994
+ --------------------------------------------------------------------------------
995
+ [USER] 9:03:46 PM
996
+ --------------------------------------------------------------------------------
997
+ reload skills and try again
998
+
999
+ --------------------------------------------------------------------------------
1000
+ [ASSISTANT] 9:03:46 PM
1001
+ --------------------------------------------------------------------------------
1002
+ MCP is back. Now let me try reading the JIRA ticket.
1003
+
1004
+ --------------------------------------------------------------------------------
1005
+ [ASSISTANT] 9:03:46 PM
1006
+ --------------------------------------------------------------------------------
1007
+ The token exchange seems to fail or the exchanged token isn't accepted by JIRA. Let me add debug output to see what's happening with the token exchange.
1008
+
1009
+ --------------------------------------------------------------------------------
1010
+ [ASSISTANT] 9:03:46 PM
1011
+ --------------------------------------------------------------------------------
1012
+ The token exchange worked! We got a JIRA token. Let me now try reading the JIRA issue.
1013
+
1014
+ --------------------------------------------------------------------------------
1015
+ [ASSISTANT] 9:03:46 PM
1016
+ --------------------------------------------------------------------------------
1017
+ The token exchange works but JIRA doesn't accept the token via Bearer auth on the REST API. The unicornsso plugin only handles browser-based SSO, not API Bearer tokens.
1018
+
1019
+ Let me add debug output to see the exact JIRA response.
1020
+
1021
+ --------------------------------------------------------------------------------
1022
+ [ASSISTANT] 9:03:46 PM
1023
+ --------------------------------------------------------------------------------
1024
+ None of the Bearer token methods work. JIRA's unicornsso plugin only handles browser-based SSO, not API Bearer authentication.
1025
+
1026
+ Let me try one more approach - using the SSO callback to get a session cookie.
1027
+
1028
+ --------------------------------------------------------------------------------
1029
+ [ASSISTANT] 9:03:46 PM
1030
+ --------------------------------------------------------------------------------
1031
+ The SSO callback only accepts browser redirects (GET with redirect), not direct API calls. The conclusion is clear: **JIRA's unicornsso plugin only supports browser-based SSO, not API authentication**.
1032
+
1033
+ For API access, you need a **JIRA Personal Access Token (PAT)**. Let me update the skill to document this clearly and simplify the code.
1034
+
1035
+ --------------------------------------------------------------------------------
1036
+ [ASSISTANT] 9:03:46 PM
1037
+ --------------------------------------------------------------------------------
1038
+ Now let me simplify the main skill code to focus on what works (JIRA PAT):
1039
+
1040
+ --------------------------------------------------------------------------------
1041
+ [USER] 9:03:46 PM
1042
+ --------------------------------------------------------------------------------
1043
+ GET /rest/unicornssorest/1/sso/jirabaseurl?_=1770491466457 HTTP/1.1
1044
+ Accept: text/plain, */*; q=0.01
1045
+ Accept-Encoding: gzip, deflate, br, zstd
1046
+ Accept-Language: cs,en-US;q=0.9,en;q=0.8,cs-CZ;q=0.7,sk;q=0.6,sv;q=0.5
1047
+ Connection: keep-alive
1048
+ Content-Type: text/plain
1049
+ Cookie: _ga=GA1.1.1570752453.1744893059; _fbp=fb.1.1744961721118.785023484443255000; _ga_5P9D1Z1PC3=GS2.1.s1762178448$o10$g1$t1762178457$j51$l0$h0; _ga_03PBRYZNVH=GS2.1.s1766150028$o1$g1$t1766150258$j60$l0$h0; _gcl_au=1.1.2145912930.1768915016; _ga_X411HNQN0E=GS2.1.s1769005725$o1$g1$t1769005752$j33$l0$h0; _ga_BHH3XMJPJ7=GS2.1.s1769593204$o37$g1$t1769593211$j53$l0$h0; _ga_ZS6G5ZL46P=GS2.1.s1769637241$o2$g1$t1769637352$j60$l0$h0; inproducttranslatemode=false; _ga_GHD40RFP1E=GS2.1.s1770384239$o51$g1$t1770384994$j60$l0$h0; JSESSIONID=67FC9A2CF4DE6CAC114C9FD610D58F2A; uu.app.csrf=1770493192.csrf.csrf; atlassian.xsrf.token=B4UT-24XT-2JHM-LTUU_f2f3aa6e181fcbf41e9c2b53bff42c3d4087267e_lin
1050
+ DNT: 1
1051
+ Host: jira.unicorn.com
1052
+ Referer: https://jira.unicorn.com/login.jsp
1053
+ Sec-Fetch-Dest: empty
1054
+ Sec-Fetch-Mode: cors
1055
+ Sec-Fetch-Site: same-origin
1056
+ User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36
1057
+ X-Requested-With: XMLHttpRequest
1058
+ sec-ch-ua: "Not(A:Brand";v="8", "Chromium";v="144", "Google Chrome";v="144"
1059
+ sec-ch-ua-mobile: ?0
1060
+ sec-ch-ua-platform: "macOS"
1061
+ GET /rest/unicornssorest/1/sso/oidcclient?_=1770491466458 HTTP/1.1
1062
+ Accept: text/plain, */*; q=0.01
1063
+ Accept-Encoding: gzip, deflate, br, zstd
1064
+ Accept-Language: cs,en-US;q=0.9,en;q=0.8,cs-CZ;q=0.7,sk;q=0.6,sv;q=0.5
1065
+ Connection: keep-alive
1066
+ Content-Type: text/plain
1067
+ Cookie: _ga=GA1.1.1570752453.1744893059; _fbp=fb.1.1744961721118.785023484443255000; _ga_5P9D1Z1PC3=GS2.1.s1762178448$o10$g1$t1762178457$j51$l0$h0; _ga_03PBRYZNVH=GS2.1.s1766150028$o1$g1$t1766150258$j60$l0$h0; _gcl_au=1.1.2145912930.1768915016; _ga_X411HNQN0E=GS2.1.s1769005725$o1$g1$t1769005752$j33$l0$h0; _ga_BHH3XMJPJ7=GS2.1.s1769593204$o37$g1$t1769593211$j53$l0$h0; _ga_ZS6G5ZL46P=GS2.1.s1769637241$o2$g1$t1769637352$j60$l0$h0; inproducttranslatemode=false; _ga_GHD40RFP1E=GS2.1.s1770384239$o51$g1$t1770384994$j60$l0$h0; JSESSIONID=67FC9A2CF4DE6CAC114C9FD610D58F2A; uu.app.csrf=1770493192.csrf.csrf; atlassian.xsrf.token=B4UT-24XT-2JHM-LTUU_f2f3aa6e181fcbf41e9c2b53bff42c3d4087267e_lin
1068
+ DNT: 1
1069
+ Host: jira.unicorn.com
1070
+ Referer: https://jira.unicorn.com/login.jsp
1071
+ Sec-Fetch-Dest: empty
1072
+ Sec-Fetch-Mode: cors
1073
+ Sec-Fetch-Site: same-origin
1074
+ User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36
1075
+ X-Requested-With: XMLHttpRequest
1076
+ sec-ch-ua: "Not(A:Brand";v="8", "Chromium";v="144", "Google Chrome";v="144"
1077
+ sec-ch-ua-mobile: ?0
1078
+ sec-ch-ua-platform: "macOS"
1079
+ ET /rest/unicornssorest/1/sso/jirabaseurl?_=1770491466459 HTTP/1.1
1080
+ Accept: text/plain, */*; q=0.01
1081
+ Accept-Encoding: gzip, deflate, br, zstd
1082
+ Accept-Language: cs,en-US;q=0.9,en;q=0.8,cs-CZ;q=0.7,sk;q=0.6,sv;q=0.5
1083
+ Connection: keep-alive
1084
+ Content-Type: text/plain
1085
+ Cookie: _ga=GA1.1.1570752453.1744893059; _fbp=fb.1.1744961721118.785023484443255000; _ga_5P9D1Z1PC3=GS2.1.s1762178448$o10$g1$t1762178457$j51$l0$h0; _ga_03PBRYZNVH=GS2.1.s1766150028$o1$g1$t1766150258$j60$l0$h0; _gcl_au=1.1.2145912930.1768915016; _ga_X411HNQN0E=GS2.1.s1769005725$o1$g1$t1769005752$j33$l0$h0; _ga_BHH3XMJPJ7=GS2.1.s1769593204$o37$g1$t1769593211$j53$l0$h0; _ga_ZS6G5ZL46P=GS2.1.s1769637241$o2$g1$t1769637352$j60$l0$h0; inproducttranslatemode=false; _ga_GHD40RFP1E=GS2.1.s1770384239$o51$g1$t1770384994$j60$l0$h0; JSESSIONID=67FC9A2CF4DE6CAC114C9FD610D58F2A; uu.app.csrf=1770493192.csrf.csrf; atlassian.xsrf.token=B4UT-24XT-2JHM-LTUU_f2f3aa6e181fcbf41e9c2b53bff42c3d4087267e_lin
1086
+ DNT: 1
1087
+ Host: jira.unicorn.com
1088
+ Referer: https://jira.unicorn.com/login.jsp
1089
+ Sec-Fetch-Dest: empty
1090
+ Sec-Fetch-Mode: cors
1091
+ Sec-Fetch-Site: same-origin
1092
+ User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36
1093
+ X-Requested-With: XMLHttpRequest
1094
+ sec-ch-ua: "Not(A:Brand";v="8", "Chromium";v="144", "Google Chrome";v="144"
1095
+ sec-ch-ua-mobile: ?0
1096
+ sec-ch-ua-platform: "macOS"
1097
+ GET /rest/unicornssorest/1/sso/oidccallbackurl?_=1770491466460 HTTP/1.1
1098
+ Accept: text/plain, */*; q=0.01
1099
+ Accept-Encoding: gzip, deflate, br, zstd
1100
+ Accept-Language: cs,en-US;q=0.9,en;q=0.8,cs-CZ;q=0.7,sk;q=0.6,sv;q=0.5
1101
+ Connection: keep-alive
1102
+ Content-Type: text/plain
1103
+ Cookie: _ga=GA1.1.1570752453.1744893059; _fbp=fb.1.1744961721118.785023484443255000; _ga_5P9D1Z1PC3=GS2.1.s1762178448$o10$g1$t1762178457$j51$l0$h0; _ga_03PBRYZNVH=GS2.1.s1766150028$o1$g1$t1766150258$j60$l0$h0; _gcl_au=1.1.2145912930.1768915016; _ga_X411HNQN0E=GS2.1.s1769005725$o1$g1$t1769005752$j33$l0$h0; _ga_BHH3XMJPJ7=GS2.1.s1769593204$o37$g1$t1769593211$j53$l0$h0; _ga_ZS6G5ZL46P=GS2.1.s1769637241$o2$g1$t1769637352$j60$l0$h0; inproducttranslatemode=false; _ga_GHD40RFP1E=GS2.1.s1770384239$o51$g1$t1770384994$j60$l0$h0; JSESSIONID=67FC9A2CF4DE6CAC114C9FD610D58F2A; uu.app.csrf=1770493192.csrf.csrf; atlassian.xsrf.token=B4UT-24XT-2JHM-LTUU_f2f3aa6e181fcbf41e9c2b53bff42c3d4087267e_lin
1104
+ DNT: 1
1105
+ Host: jira.unicorn.com
1106
+ Referer: https://jira.unicorn.com/login.jsp
1107
+ Sec-Fetch-Dest: empty
1108
+ Sec-Fetch-Mode: cors
1109
+ Sec-Fetch-Site: same-origin
1110
+ User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36
1111
+ X-Requested-With: XMLHttpRequest
1112
+ sec-ch-ua: "Not(A:Brand";v="8", "Chromium";v="144", "Google Chrome";v="144"
1113
+ sec-ch-ua-mobile: ?0
1114
+ sec-ch-ua-platform: "macOS"
1115
+ GET /rest/unicornssorest/1/sso/jirabaseurl?_=1770491466461 HTTP/1.1
1116
+ Accept: text/plain, */*; q=0.01
1117
+ Accept-Encoding: gzip, deflate, br, zstd
1118
+ Accept-Language: cs,en-US;q=0.9,en;q=0.8,cs-CZ;q=0.7,sk;q=0.6,sv;q=0.5
1119
+ Connection: keep-alive
1120
+ Content-Type: text/plain
1121
+ Cookie: _ga=GA1.1.1570752453.1744893059; _fbp=fb.1.1744961721118.785023484443255000; _ga_5P9D1Z1PC3=GS2.1.s1762178448$o10$g1$t1762178457$j51$l0$h0; _ga_03PBRYZNVH=GS2.1.s1766150028$o1$g1$t1766150258$j60$l0$h0; _gcl_au=1.1.2145912930.1768915016; _ga_X411HNQN0E=GS2.1.s1769005725$o1$g1$t1769005752$j33$l0$h0; _ga_BHH3XMJPJ7=GS2.1.s1769593204$o37$g1$t1769593211$j53$l0$h0; _ga_ZS6G5ZL46P=GS2.1.s1769637241$o2$g1$t1769637352$j60$l0$h0; inproducttranslatemode=false; _ga_GHD40RFP1E=GS2.1.s1770384239$o51$g1$t1770384994$j60$l0$h0; JSESSIONID=67FC9A2CF4DE6CAC114C9FD610D58F2A; uu.app.csrf=1770493192.csrf.csrf; atlassian.xsrf.token=B4UT-24XT-2JHM-LTUU_f2f3aa6e181fcbf41e9c2b53bff42c3d4087267e_lin
1122
+ DNT: 1
1123
+ Host: jira.unicorn.com
1124
+ Referer: https://jira.unicorn.com/login.jsp
1125
+ Sec-Fetch-Dest: empty
1126
+ Sec-Fetch-Mode: cors
1127
+ Sec-Fetch-Site: same-origin
1128
+ User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36
1129
+ X-Requested-With: XMLHttpRequest
1130
+ sec-ch-ua: "Not(A:Brand";v="8", "Chromium";v="144", "Google Chrome";v="144"
1131
+ sec-ch-ua-mobile: ?0
1132
+ sec-ch-ua-platform: "macOS"
1133
+ GET /rest/unicornssorest/1/sso/oidcurl?_=1770491466462 HTTP/1.1
1134
+ Accept: text/plain, */*; q=0.01
1135
+ Accept-Encoding: gzip, deflate, br, zstd
1136
+ Accept-Language: cs,en-US;q=0.9,en;q=0.8,cs-CZ;q=0.7,sk;q=0.6,sv;q=0.5
1137
+ Connection: keep-alive
1138
+ Content-Type: text/plain
1139
+ Cookie: _ga=GA1.1.1570752453.1744893059; _fbp=fb.1.1744961721118.785023484443255000; _ga_5P9D1Z1PC3=GS2.1.s1762178448$o10$g1$t1762178457$j51$l0$h0; _ga_03PBRYZNVH=GS2.1.s1766150028$o1$g1$t1766150258$j60$l0$h0; _gcl_au=1.1.2145912930.1768915016; _ga_X411HNQN0E=GS2.1.s1769005725$o1$g1$t1769005752$j33$l0$h0; _ga_BHH3XMJPJ7=GS2.1.s1769593204$o37$g1$t1769593211$j53$l0$h0; _ga_ZS6G5ZL46P=GS2.1.s1769637241$o2$g1$t1769637352$j60$l0$h0; inproducttranslatemode=false; _ga_GHD40RFP1E=GS2.1.s1770384239$o51$g1$t1770384994$j60$l0$h0; JSESSIONID=67FC9A2CF4DE6CAC114C9FD610D58F2A; uu.app.csrf=1770493192.csrf.csrf; atlassian.xsrf.token=B4UT-24XT-2JHM-LTUU_f2f3aa6e181fcbf41e9c2b53bff42c3d4087267e_lin
1140
+ DNT: 1
1141
+ Host: jira.unicorn.com
1142
+ Referer: https://jira.unicorn.com/login.jsp
1143
+ Sec-Fetch-Dest: empty
1144
+ Sec-Fetch-Mode: cors
1145
+ Sec-Fetch-Site: same-origin
1146
+ User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36
1147
+ X-Requested-With: XMLHttpRequest
1148
+ sec-ch-ua: "Not(A:Brand";v="8", "Chromium";v="144", "Google Chrome";v="144"
1149
+ sec-ch-ua-mobile: ?0
1150
+ sec-ch-ua-platform: "macOS"
1151
+
1152
+ would this help? this is from browser
1153
+
1154
+ --------------------------------------------------------------------------------
1155
+ [ASSISTANT] 9:03:46 PM
1156
+ --------------------------------------------------------------------------------
1157
+ Yes! This is very helpful. I see the browser has a `JSESSIONID` cookie from the SSO flow. I also notice a new endpoint I didn't try: `/rest/unicornssorest/1/sso/oidccallbackurl`.
1158
+
1159
+ The key insight is that we could potentially simulate the browser SSO flow:
1160
+ 1. Get the callback URL
1161
+ 2. Call Plus4U OIDC authorize with our token to get an authorization code
1162
+ 3. Submit that code to JIRA's callback to get a session
1163
+
1164
+ Let me try this approach:
1165
+
1166
+ --------------------------------------------------------------------------------
1167
+ [ASSISTANT] 9:03:46 PM
1168
+ --------------------------------------------------------------------------------
1169
+ The Plus4U OIDC returned `interaction_required` - it cannot complete authentication without browser interaction. The server doesn't have our browser session cookies.
1170
+
1171
+ This confirms: **SSO requires browser interaction and cannot be automated via API calls**.
1172
+
1173
+ The solutions are:
1174
+ 1. **JIRA Personal Access Token (PAT)** - Recommended
1175
+ 2. **Manual JSESSIONID** - Copy the cookie from your browser
1176
+
1177
+ Let me add support for manual JSESSIONID as an alternative:
1178
+
1179
+ --------------------------------------------------------------------------------
1180
+ [ASSISTANT] 9:03:46 PM
1181
+ --------------------------------------------------------------------------------
1182
+ Now let me test with your browser's JSESSIONID (from your request headers: `67FC9A2CF4DE6CAC114C9FD610D58F2A`):
1183
+
1184
+ --------------------------------------------------------------------------------
1185
+ [ASSISTANT] 9:03:46 PM
1186
+ --------------------------------------------------------------------------------
1187
+ **It works!** Using your browser's JSESSIONID, I successfully read the JIRA ticket AUTOMATION-412!
1188
+
1189
+ The issue is about "SMARTA - LDAP connectivity" - setting up LDAP/LDAPS for various application components (Rancher, MongoDB, PostgreSQL, etc.).
1190
+
1191
+ Let me update the SKILL.md to document this working approach:
1192
+
1193
+ --------------------------------------------------------------------------------
1194
+ [ASSISTANT] 9:03:46 PM
1195
+ --------------------------------------------------------------------------------
1196
+ The `jira-read` skill now works with two authentication methods:
1197
+
1198
+ **Option 1: Browser Session (JSESSIONID)** - Your Plus4U identity via browser session
1199
+ - Log in to JIRA via SSO in browser
1200
+ - Copy `JSESSIONID` from browser cookies
1201
+ - Set `JIRA_SESSION` env var or pass `jiraSession` parameter
1202
+
1203
+ **Option 2: JIRA PAT** - Direct API authentication
1204
+ - Create Personal Access Token in JIRA
1205
+ - Set `JIRA_USER` and `JIRA_TOKEN` env vars
1206
+
1207
+ The session cookie approach works because once you log in via SSO in the browser, the JSESSIONID represents your authenticated session. We just borrow that session for API calls.
1208
+
1209
+ To make this permanent, set your JIRA_SESSION in your environment (e.g., in `~/.zshrc`):
1210
+
1211
+ ```bash
1212
+ export JIRA_SESSION="67FC9A2CF4DE6CAC114C9FD610D58F2A"
1213
+ ```
1214
+
1215
+ Note: The session will expire after ~30 minutes of inactivity, so you'll need to refresh it by grabbing a new JSESSIONID from your browser when it expires.
1216
+
1217
+ --------------------------------------------------------------------------------
1218
+ [USER] 9:03:46 PM
1219
+ --------------------------------------------------------------------------------
1220
+ this is not permanent session, you need to gathre this session value from interactive login.. are you able to do that?
1221
+
1222
+ --------------------------------------------------------------------------------
1223
+ [ASSISTANT] 9:03:46 PM
1224
+ --------------------------------------------------------------------------------
1225
+ You're right - the session expires and needs to be refreshed. We could implement interactive login similar to how `skilled-plus4u-mcp` handles Plus4U authentication.
1226
+
1227
+ Let me add a login flow that:
1228
+ 1. Opens browser for JIRA SSO
1229
+ 2. Captures the session cookie after authentication
1230
+ 3. Stores it for API use
1231
+
1232
+ --------------------------------------------------------------------------------
1233
+ [ASSISTANT] 9:03:46 PM
1234
+ --------------------------------------------------------------------------------
1235
+ I see how the Plus4U OIDC login works - it opens a browser, starts a local server, and captures the authorization code when Plus4U redirects back.
1236
+
1237
+ For JIRA, we can implement a similar flow:
1238
+ 1. Start a local server
1239
+ 2. Open JIRA login page
1240
+ 3. After SSO, inject JavaScript to capture and forward the JSESSIONID to our local server
1241
+ 4. Store it for API use
1242
+
1243
+ Let me add a `jiraLogin` tool to the MCP:
1244
+
1245
+ --------------------------------------------------------------------------------
1246
+ [ASSISTANT] 9:03:46 PM
1247
+ --------------------------------------------------------------------------------
1248
+ Now I need to update the HTTP client to expose the JIRA session, and modify the skill to use it. Let me update the http-client:
1249
+
1250
+ --------------------------------------------------------------------------------
1251
+ [ASSISTANT] 9:03:46 PM
1252
+ --------------------------------------------------------------------------------
1253
+ Now let me build the MCP:
1254
+
1255
+ --------------------------------------------------------------------------------
1256
+ [ASSISTANT] 9:03:46 PM
1257
+ --------------------------------------------------------------------------------
1258
+ Build successful. Now let me update the SKILL.md to document the new interactive login:
1259
+
1260
+ --------------------------------------------------------------------------------
1261
+ [ASSISTANT] 9:03:46 PM
1262
+ --------------------------------------------------------------------------------
1263
+ I've implemented interactive JIRA login. The MCP now has these new tools:
1264
+
1265
+ 1. **`jiraLogin`** - Opens browser for SSO login and captures the session
1266
+ 2. **`jiraSession`** - Get or set JIRA session manually
1267
+
1268
+ To use it:
1269
+
1270
+ 1. **Reload the Cursor window** (Cmd+Shift+P → "Developer: Reload Window") to load the updated MCP
1271
+
1272
+ 2. Then run the login:
1273
+
1274
+ ```
1275
+ jiraLogin({ host: "jira.unicorn.com" })
1276
+ ```
1277
+
1278
+ This will open a browser with instructions. After you log in via SSO, you can:
1279
+ - Drag the bookmarklet to your bookmark bar and click it
1280
+ - Or paste the JavaScript snippet in DevTools console
1281
+
1282
+ The session will be captured and stored in the MCP. Then subsequent `jira-read` calls will use it automatically.
1283
+
1284
+ Want me to test it after you reload the window?
1285
+
1286
+ --------------------------------------------------------------------------------
1287
+ [USER] 9:03:46 PM
1288
+ --------------------------------------------------------------------------------
1289
+ ok try to read https://jira.unicorn.com/browse/AUTOMATION-412
1290
+
1291
+ --------------------------------------------------------------------------------
1292
+ [ASSISTANT] 9:03:46 PM
1293
+ --------------------------------------------------------------------------------
1294
+ No session is stored yet. Let me trigger the interactive login:
1295
+
1296
+ --------------------------------------------------------------------------------
1297
+ [USER] 9:03:46 PM
1298
+ --------------------------------------------------------------------------------
1299
+ this is total shit solution i need you to gather it autmaically without my help.. that still involves copying ..
1300
+
1301
+ --------------------------------------------------------------------------------
1302
+ [ASSISTANT] 9:03:46 PM
1303
+ --------------------------------------------------------------------------------
1304
+ You're right, that's a bad UX. Let me implement proper automated login using Puppeteer to handle the SSO flow automatically.
1305
+
1306
+ --------------------------------------------------------------------------------
1307
+ [USER] 9:03:46 PM
1308
+ --------------------------------------------------------------------------------
1309
+ can this be done without pupeteer?
1310
+
1311
+ --------------------------------------------------------------------------------
1312
+ [ASSISTANT] 9:03:46 PM
1313
+ --------------------------------------------------------------------------------
1314
+ Yes! We can read Chrome's cookie database directly. Chrome stores cookies in a SQLite file. On macOS, we can decrypt them using the Keychain.
1315
+
1316
+ --------------------------------------------------------------------------------
1317
+ [USER] 9:03:46 PM
1318
+ --------------------------------------------------------------------------------
1319
+ focus, i need you to figure out the solution, so far nothing worked.. we know we need to know the jsessionid, there must be some way how to conforlmly gather it, i need the skill to work with different browsers or OS systems
1320
+
1321
+ --------------------------------------------------------------------------------
1322
+ [ASSISTANT] 9:03:46 PM
1323
+ --------------------------------------------------------------------------------
1324
+ Let me analyze the options for gathering the JIRA session automatically without Puppeteer:
1325
+
1326
+ **The fundamental problem:**
1327
+ - JIRA SSO is browser-only (sets HttpOnly `JSESSIONID` cookie after redirect)
1328
+ - JIRA REST API doesn't accept Bearer tokens - only session cookies or PAT
1329
+ - We have a Plus4U token, but JIRA won't validate it for API calls
1330
+
1331
+ **Possible approaches without Puppeteer:**
1332
+
1333
+ 1. **Read browser cookie stores directly**
1334
+ - Chrome/Edge/Firefox store cookies in SQLite databases (encrypted)
1335
+ - Libraries like `chrome-cookies-secure` can decrypt and read them
1336
+ - Works cross-platform but each browser has different storage/encryption
1337
+
1338
+ 2. **Chrome DevTools Protocol (CDP)**
1339
+ - Connect to running Chrome instance via WebSocket
1340
+ - Read cookies from the browser's cookie jar
1341
+ - Requires Chrome to be running with remote debugging or already have the session
1342
+
1343
+ 3. **Native browser automation (osascript/PowerShell)**
1344
+ - Use OS-native scripting to control browser
1345
+ - Platform-specific (different for macOS/Windows/Linux)
1346
+
1347
+ --------------------------------------------------------------------------------
1348
+ [USER] 9:03:46 PM
1349
+ --------------------------------------------------------------------------------
1350
+ how would you work with pupetter?
1351
+
1352
+ --------------------------------------------------------------------------------
1353
+ [ASSISTANT] 9:03:46 PM
1354
+ --------------------------------------------------------------------------------
1355
+ With Puppeteer, the flow would work like this:
1356
+
1357
+ ```mermaid
1358
+ sequenceDiagram
1359
+ participant MCP as MCP Server
1360
+ participant Browser as Puppeteer Browser
1361
+ participant Plus4U as Plus4U OIDC
1362
+ participant JIRA as JIRA Server
1363
+
1364
+ MCP->>Browser: Launch with user's Chrome profile
1365
+ Browser->>JIRA: Navigate to login.jsp
1366
+ JIRA->>Browser: Show login page with SSO button
1367
+ Note over Browser: Auto-click SSO button
1368
+ Browser->>Plus4U: Redirect to OIDC authorize
1369
+ Note over Plus4U: User already logged in (session from profile)
1370
+ Plus4U->>Browser: Redirect back with auth code
1371
+ Browser->>JIRA: Callback with code
1372
+ JIRA->>Browser: Set-Cookie: JSESSIONID=xxx
1373
+ Note over Browser: Page loads JIRA dashboard
1374
+ Browser->>MCP: Extract JSESSIONID from cookies
1375
+ MCP->>MCP: Store session for API calls
1376
+ Browser->>Browser: Close
1377
+ ```
1378
+
1379
+ **Key implementation details:**
1380
+
1381
+ 1. **Use `puppeteer-core`** (not full puppeteer) - smaller, uses existing Chrome installation
1382
+
1383
+ 2. **Reuse user's browser profile** - This is crucial. By using the existing Chrome profile, the user's Plus4U session is already active, so SSO completes automatically without any manual login:
1384
+
1385
+ ```typescript
1386
+ const browser = await puppeteer.launch({
1387
+ executablePath: '/Applications/Google Chrome.app/.../Google Chrome',
1388
+ userDataDir: '~/Library/Application Support/Google/Chrome',
1389
+ headless: false // Show browser briefly
1390
+ });
1391
+ ```
1392
+
1393
+ 3. **Auto-detect Chrome path** cross-platform:
1394
+ - macOS: `/Applications/Google Chrome.app/...`
1395
+ - Windows: `C:\Program Files\Google\Chrome\...`
1396
+ - Linux: `/usr/bin/google-chrome`
1397
+
1398
+ 4. **The SSO flow is automatic** - If user is logged into Plus4U in Chrome, clicking the SSO button redirects and returns with session cookie automatically (no typing credentials)
1399
+
1400
+ 5. **Extract and store the session**:
1401
+ ```typescript
1402
+ const cookies = await page.cookies('https://jira.unicorn.com');
1403
+ const jsessionid = cookies.find(c => c.name === 'JSESSIONID');
1404
+ // Store in MCP memory for subsequent API calls
1405
+ ```
1406
+
1407
+ 6. **Session refresh** - When session expires (~30 min), the skill detects 401 and automatically runs login again
1408
+
1409
+ **Advantages:**
1410
+ - Works cross-platform (macOS, Windows, Linux)
1411
+ - Works with any Chromium browser (Chrome, Edge, Brave)
1412
+ - No manual copying - fully automatic
1413
+ - Reuses existing browser login - no password entry needed
1414
+ - Can run headless after first successful login
1415
+
1416
+ **The user experience would be:**
1417
+ 1. First time: Browser opens briefly, SSO happens automatically, closes
1418
+ 2. Subsequent calls: Uses stored session
1419
+ 3. On expiry: Browser opens again briefly to refresh
1420
+
1421
+ Would you like me to create a plan to implement this?
1422
+
1423
+ --------------------------------------------------------------------------------
1424
+ [USER] 9:03:46 PM
1425
+ --------------------------------------------------------------------------------
1426
+ ok proceed..
1427
+
1428
+ --------------------------------------------------------------------------------
1429
+ [USER] 9:03:46 PM
1430
+ --------------------------------------------------------------------------------
1431
+ Implement the plan as specified, it is attached for your reference. Do NOT edit the plan file itself.
1432
+
1433
+ To-do's from the plan have already been created. Do not create them again. Mark them as in_progress as you work, starting with the first one. Don't stop until you have completed all the to-dos.
1434
+
1435
+ --------------------------------------------------------------------------------
1436
+ [ASSISTANT] 9:03:46 PM
1437
+ --------------------------------------------------------------------------------
1438
+ I need to add auto-retry logic. The approach is to add a `triggerJiraLogin` method to the HTTP client so the skill can request login when needed.
1439
+
1440
+ --------------------------------------------------------------------------------
1441
+ [ASSISTANT] 9:03:46 PM
1442
+ --------------------------------------------------------------------------------
1443
+ Now update `jira.js` to auto-trigger login on 401:
1444
+
1445
+ --------------------------------------------------------------------------------
1446
+ [ASSISTANT] 9:03:46 PM
1447
+ --------------------------------------------------------------------------------
1448
+ Build successful. Now let me reload skills and test the JIRA reading:
1449
+
1450
+ --------------------------------------------------------------------------------
1451
+ [ASSISTANT] 9:03:46 PM
1452
+ --------------------------------------------------------------------------------
1453
+ The MCP needs a window reload to pick up the new code. Let me try calling the jiraLogin tool directly to verify Puppeteer works:
1454
+
1455
+ --------------------------------------------------------------------------------
1456
+ [USER] 9:03:46 PM
1457
+ --------------------------------------------------------------------------------
1458
+ reload skills and try again
1459
+
1460
+ --------------------------------------------------------------------------------
1461
+ [ASSISTANT] 9:03:46 PM
1462
+ --------------------------------------------------------------------------------
1463
+ Chrome is already running, so Puppeteer can't use the same profile. Let me fix this by connecting to the existing Chrome instance via DevTools Protocol:
1464
+
1465
+ --------------------------------------------------------------------------------
1466
+ [ASSISTANT] 9:03:46 PM
1467
+ --------------------------------------------------------------------------------
1468
+ The MCP was rebuilt, but you need to **reload the Cursor window** (Cmd+Shift+P → "Developer: Reload Window") to restart the MCP server with the new code.
1469
+
1470
+ After reloading, try running:
1471
+
1472
+ ```
1473
+ jiraLogin({ host: "jira.unicorn.com" })
1474
+ ```
1475
+
1476
+ This will now handle the case where Chrome is already running by using a temporary profile. A new Chrome window will open, and you'll need to complete the SSO login once (since the temp profile doesn't have your Plus4U session).
1477
+
1478
+ --------------------------------------------------------------------------------
1479
+ [USER] 9:03:46 PM
1480
+ --------------------------------------------------------------------------------
1481
+ og
1482
+
1483
+ --------------------------------------------------------------------------------
1484
+ [USER] 9:03:46 PM
1485
+ --------------------------------------------------------------------------------
1486
+ no do not use devtools i ma logged in proper instance
1487
+
1488
+ --------------------------------------------------------------------------------
1489
+ [ASSISTANT] 9:03:46 PM
1490
+ --------------------------------------------------------------------------------
1491
+ I understand - you want to use your existing Chrome session where you're already logged in. The issue is Puppeteer can't access a profile that's already in use.
1492
+
1493
+ Let me add a cookie reader that extracts the JIRA session directly from Chrome's cookie store without launching a new browser:
1494
+
1495
+ --------------------------------------------------------------------------------
1496
+ [ASSISTANT] 9:03:46 PM
1497
+ --------------------------------------------------------------------------------
1498
+ Build successful! The MCP now tries to read your JIRA session directly from Chrome's cookie database first - no browser launch needed if you're already logged into JIRA.
1499
+
1500
+ **Please reload the Cursor window** (Cmd+Shift+P → "Developer: Reload Window") to load the updated MCP, then I'll test reading the JIRA ticket.
1501
+
1502
+ --------------------------------------------------------------------------------
1503
+ [USER] 9:03:46 PM
1504
+ --------------------------------------------------------------------------------
1505
+ go
1506
+
1507
+ --------------------------------------------------------------------------------
1508
+ [USER] 9:03:46 PM
1509
+ --------------------------------------------------------------------------------
1510
+ reload skills and try again
1511
+
1512
+ --------------------------------------------------------------------------------
1513
+ [USER] 9:03:46 PM
1514
+ --------------------------------------------------------------------------------
1515
+ you are using dev browser..
1516
+
1517
+ --------------------------------------------------------------------------------
1518
+ [ASSISTANT] 9:03:46 PM
1519
+ --------------------------------------------------------------------------------
1520
+ You're right - the cookie reading must be failing silently and falling back to Puppeteer with a temp profile. Let me add debug output to see what's happening:
1521
+
1522
+ --------------------------------------------------------------------------------
1523
+ [ASSISTANT] 9:03:46 PM
1524
+ --------------------------------------------------------------------------------
1525
+ Build successful. Please **reload Cursor window** to load the updated MCP, then I'll run the login with debug output to see why cookie reading is failing.
1526
+
1527
+ --------------------------------------------------------------------------------
1528
+ [USER] 9:03:46 PM
1529
+ --------------------------------------------------------------------------------
1530
+ go
1531
+
1532
+ --------------------------------------------------------------------------------
1533
+ [ASSISTANT] 9:03:46 PM
1534
+ --------------------------------------------------------------------------------
1535
+ The cookie file exists but no session was found. Let me add more debug to see what's in the database:
1536
+
1537
+ --------------------------------------------------------------------------------
1538
+ [USER] 9:03:46 PM
1539
+ --------------------------------------------------------------------------------
1540
+ i dont like where this is going... i sotrngly do not wnat anything to the ontthe filesystem with the browser.. you nned to figure out how to authenticate using the browser.. it must work.. a want to keep the mcp server lightweight i do not like to have the pupeteer there too..
1541
+
1542
+ --------------------------------------------------------------------------------
1543
+ [ASSISTANT] 9:03:46 PM
1544
+ --------------------------------------------------------------------------------
1545
+ You're right, let me take a different approach. Since you're on macOS, I can use AppleScript to control your browser directly - no Puppeteer, no cookie file reading, just native browser control.
1546
+
1547
+ --------------------------------------------------------------------------------
1548
+ [USER] 9:03:46 PM
1549
+ --------------------------------------------------------------------------------
1550
+ i do not like that to... siply tell me it is not possible..
1551
+
1552
+ --------------------------------------------------------------------------------
1553
+ [ASSISTANT] 9:03:46 PM
1554
+ --------------------------------------------------------------------------------
1555
+ You're right. Let me be honest:
1556
+
1557
+ **It's not possible to automatically get JIRA session cookies from a running browser without either:**
1558
+
1559
+ 1. **Browser automation** (Puppeteer/Playwright) - to control the browser and extract cookies
1560
+ 2. **Reading browser cookie files** - accessing Chrome's encrypted SQLite database
1561
+ 3. **Manual user action** - copying the cookie or clicking a bookmarklet
1562
+ 4. **Browser extension** - which the user would need to install
1563
+
1564
+ **Why:**
1565
+ - Browsers intentionally isolate cookies for security (same-origin policy)
1566
+ - HttpOnly cookies cannot be read by JavaScript
1567
+ - There's no API to query another application's cookies
1568
+ - JIRA's SSO doesn't support programmatic token-based API authentication
1569
+
1570
+ **The only clean solutions for JIRA API access are:**
1571
+
1572
+ 1. **JIRA Personal Access Token (PAT)** - Create once in JIRA settings, use forever
1573
+ 2. **Accept one of the above approaches** - Puppeteer, cookie reading, or manual copy
1574
+
1575
+ Would you like me to:
1576
+ - **A)** Simplify the skill to just use JIRA PAT (set `JIRA_USER` and `JIRA_TOKEN` env vars once)
1577
+ - **B)** Keep the simple manual session approach where you occasionally paste your JSESSIONID
1578
+
1579
+ Both are lightweight and don't require additional dependencies.
1580
+
1581
+ --------------------------------------------------------------------------------
1582
+ [USER] 9:03:46 PM
1583
+ --------------------------------------------------------------------------------
1584
+ actualy.. i can get the PAT
1585
+
1586
+
1587
+ here it is
1588
+ NDk1MjQ2MTE5ODI0OjWaf1D8TfggPA5AqPSnHxTAGi3V
1589
+
1590
+ can you make it work now?
1591
+
1592
+ --------------------------------------------------------------------------------
1593
+ [ASSISTANT] 9:03:46 PM
1594
+ --------------------------------------------------------------------------------
1595
+ Let me set this up and test it right away:
1596
+
1597
+ --------------------------------------------------------------------------------
1598
+ [ASSISTANT] 9:03:46 PM
1599
+ --------------------------------------------------------------------------------
1600
+ The code still has the old logic. Let me fix it to use PAT properly with Bearer auth:
1601
+
1602
+ --------------------------------------------------------------------------------
1603
+ [ASSISTANT] 9:03:46 PM
1604
+ --------------------------------------------------------------------------------
1605
+ **It works!** The JIRA PAT authentication is successful.
1606
+
1607
+ Now let me clean up the MCP to remove all the complex browser/cookie code and keep it lightweight. I'll also update the SKILL.md:
1608
+
1609
+ --------------------------------------------------------------------------------
1610
+ [ASSISTANT] 9:03:46 PM
1611
+ --------------------------------------------------------------------------------
1612
+ **Done!** The `jira-read` skill now works with JIRA Personal Access Token (PAT).
1613
+
1614
+ **Summary:**
1615
+ - Removed all heavy dependencies (Puppeteer, better-sqlite3)
1616
+ - Simplified to use PAT authentication (Bearer token)
1617
+ - Your PAT works: `NDk1MjQ2MTE5ODI0OjWaf1D8TfggPA5AqPSnHxTAGi3V`
1618
+
1619
+ **To use permanently**, set the environment variable:
1620
+
1621
+ ```bash
1622
+ export JIRA_TOKEN="NDk1MjQ2MTE5ODI0OjWaf1D8TfggPA5AqPSnHxTAGi3V"
1623
+ ```
1624
+
1625
+ Then you can simply call:
1626
+
1627
+ ```
1628
+ jira-read { issueKey: "AUTOMATION-412" }
1629
+ ```
1630
+
1631
+ Or with any JIRA URL:
1632
+
1633
+ ```
1634
+ jira-read { url: "https://jira.unicorn.com/browse/AUTOMATION-412" }
1635
+ ```
1636
+
1637
+ --------------------------------------------------------------------------------
1638
+ [USER] 9:03:46 PM
1639
+ --------------------------------------------------------------------------------
1640
+ i would like to have the jira PAT stored as a variable in the plus4ucmp settings and load it from there.. @uu_app_aicodingg01-prompts/skills/shared/jira.js remove unnecessary code from here @uu_app_aicodingg01-prompts/skills/jira-read/skill.js @uu_app_aicodingg01-prompts/skills/jira-read/SKILL.md and revice unnecesaary code here too
1641
+
1642
+ --------------------------------------------------------------------------------
1643
+ [ASSISTANT] 9:03:46 PM
1644
+ --------------------------------------------------------------------------------
1645
+ I'll clean up all the unnecessary code and add JIRA PAT storage to the MCP. Let me do this in parallel:
1646
+
1647
+ --------------------------------------------------------------------------------
1648
+ [ASSISTANT] 9:03:46 PM
1649
+ --------------------------------------------------------------------------------
1650
+ Now let me update the MCP to store JIRA PAT and expose it to skills:
1651
+
1652
+ --------------------------------------------------------------------------------
1653
+ [ASSISTANT] 9:03:46 PM
1654
+ --------------------------------------------------------------------------------
1655
+ Done. The code has been cleaned up and simplified:
1656
+
1657
+ **Changes made:**
1658
+
1659
+ 1. **`jira.js`** - Cleaned up from 608 to 240 lines:
1660
+ - Removed all SSO/token exchange code
1661
+ - Removed session cookie handling
1662
+ - Single `createJiraClient(pat)` for PAT auth
1663
+ - Added `getJiraPat(params, http)` that checks params, MCP, then env var
1664
+
1665
+ 2. **`skill.js`** - Cleaned up from 608 to 60 lines:
1666
+ - Removed all debug modes (`endpoints`, `exchange`, `jira-api`, `auth`)
1667
+ - Removed `authenticateWithPlus4u()` and `exploreSsoEndpoints()`
1668
+ - Simple, clean execute function
1669
+
1670
+ 3. **`SKILL.md`** - Simplified documentation (92 to 46 lines)
1671
+
1672
+ 4. **MCP updates**:
1673
+ - `jira-auth.ts` - Now just stores PAT in memory (`setPat`/`getPat`/`hasPat`)
1674
+ - `http-client.ts` - Exposes `getJiraPat()` for skills
1675
+ - `index.ts` - Replaced `jiraLogin`/`jiraSession` with `jiraSetToken`/`jiraGetToken`
1676
+
1677
+ **Usage:**
1678
+
1679
+ ```
1680
+ # Store your PAT (persists for MCP session)
1681
+ jiraSetToken({ token: "NDk1MjQ2MTE5ODI0OjWaf1D8TfggPA5AqPSnHxTAGi3V" })
1682
+
1683
+ # Then use jira-read
1684
+ jira-read { issueKey: "AUTOMATION-412" }
1685
+ ```
1686
+
1687
+ You'll need to reload the window for the MCP changes to take effect.
1688
+
1689
+ --------------------------------------------------------------------------------
1690
+ [USER] 9:03:46 PM
1691
+ --------------------------------------------------------------------------------
1692
+ jiraSetToken no...
1693
+
1694
+ i wnat @mcp.json (15-18) JIRA_APT": "..." in settings of mcp ...
1695
+
1696
+ --------------------------------------------------------------------------------
1697
+ [ASSISTANT] 9:03:46 PM
1698
+ --------------------------------------------------------------------------------
1699
+ I understand - you want `JIRA_PAT` as an environment variable in the MCP config. Let me simplify this:
1700
+
1701
+ --------------------------------------------------------------------------------
1702
+ [ASSISTANT] 9:03:46 PM
1703
+ --------------------------------------------------------------------------------
1704
+ Now let me remove the unnecessary MCP tools and simplify:
1705
+
1706
+ --------------------------------------------------------------------------------
1707
+ [ASSISTANT] 9:03:46 PM
1708
+ --------------------------------------------------------------------------------
1709
+ Done. Now you just need to add your PAT to `~/.cursor/mcp.json`:
1710
+
1711
+ ```json
1712
+ "env": {
1713
+ "SKILL_DIRS": "/Users/jilek/Documents/unicorn/contribhub/uu_app_aicodingg01/uu_app_aicodingg01-prompts/skills",
1714
+ "LOG_LEVEL": "info",
1715
+ "JIRA_PAT": "NDk1MjQ2MTE5ODI0OjWaf1D8TfggPA5AqPSnHxTAGi3V"
1716
+ }
1717
+ ```
1718
+
1719
+ **Summary of changes:**
1720
+ - `jira.js` - reads PAT from `process.env.JIRA_PAT`
1721
+ - `skill.js` - removed `jiraToken` parameter (no longer needed)
1722
+ - Removed `jira-auth.ts`, `jiraSetToken`, `jiraGetToken` tools from MCP
1723
+ - Simplified `http-client.ts` (no JIRA-specific code)
1724
+
1725
+ Reload the window after updating `mcp.json`.
1726
+
1727
+ --------------------------------------------------------------------------------
1728
+ [USER] 9:03:46 PM
1729
+ --------------------------------------------------------------------------------
1730
+ actually.. do we need the mcp? i think the mcp is not mandatory.. just tell me.. do not do anything
1731
+
1732
+ --------------------------------------------------------------------------------
1733
+ [ASSISTANT] 9:03:46 PM
1734
+ --------------------------------------------------------------------------------
1735
+ For **jira-read** specifically - no, the MCP's auth features aren't needed. The skill only reads `process.env.JIRA_PAT`.
1736
+
1737
+ But the MCP is still needed as the **execution layer** - it's what discovers, loads, and runs skills when you call `executeSkill`. The env vars in `mcp.json` get passed to the skill process.
1738
+
1739
+ If you set `JIRA_PAT` as a regular system environment variable instead, it would also work.
1740
+
1741
+ ================================================================================
1742
+ End of conversation
1743
+ ================================================================================