@profoundlogic/coderflow-server 0.2.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 (202) hide show
  1. package/LICENSE.txt +322 -0
  2. package/README.md +158 -0
  3. package/dist/LICENSE.txt +322 -0
  4. package/dist/README.md +158 -0
  5. package/dist/base-image/Dockerfile +184 -0
  6. package/dist/base-image/agent-wrapper.sh +143 -0
  7. package/dist/base-image/apply-local-state.sh +357 -0
  8. package/dist/base-image/coder-git-credential-helper +307 -0
  9. package/dist/base-image/entrypoint.sh +942 -0
  10. package/dist/base-image/ssh_config_template +41 -0
  11. package/dist/base-image/start-code-server.sh +76 -0
  12. package/dist/base-image/sync-repos.sh +170 -0
  13. package/dist/base-image/vscode-extensions.txt +10 -0
  14. package/dist/base-image/vscode-settings.json +41 -0
  15. package/dist/coder-server.js +2 -0
  16. package/dist/config/cli-models.json +45 -0
  17. package/dist/config/imported-skills.schema.json +83 -0
  18. package/dist/config/skill-catalog.json +18 -0
  19. package/dist/config/skill-catalog.schema.json +140 -0
  20. package/dist/config.js +1 -0
  21. package/dist/examples/oidc.json.example +11 -0
  22. package/dist/lib/agent-keepalive.js +1 -0
  23. package/dist/lib/api-keys.js +1 -0
  24. package/dist/lib/apiKeys.js +1 -0
  25. package/dist/lib/auto-judge.js +1 -0
  26. package/dist/lib/basic-auth.js +1 -0
  27. package/dist/lib/build-history.js +1 -0
  28. package/dist/lib/build-output-service.js +1 -0
  29. package/dist/lib/build-scheduler.js +1 -0
  30. package/dist/lib/build-service.js +1 -0
  31. package/dist/lib/claude-oauth-refresh.js +1 -0
  32. package/dist/lib/cli/build.js +1 -0
  33. package/dist/lib/cli/config-command.js +1 -0
  34. package/dist/lib/cli/config.js +1 -0
  35. package/dist/lib/cli/create-user.js +1 -0
  36. package/dist/lib/cli/init.js +1 -0
  37. package/dist/lib/cli/jira.js +1 -0
  38. package/dist/lib/cli/license.js +1 -0
  39. package/dist/lib/cli/server-manager.js +1 -0
  40. package/dist/lib/container-tokens.js +1 -0
  41. package/dist/lib/data-dir.js +1 -0
  42. package/dist/lib/deployment-history.js +1 -0
  43. package/dist/lib/deployment-service.js +1 -0
  44. package/dist/lib/docker-utils.js +1 -0
  45. package/dist/lib/email.js +1 -0
  46. package/dist/lib/emailTemplates.js +1 -0
  47. package/dist/lib/entitlement.js +1 -0
  48. package/dist/lib/fetch-utils.js +1 -0
  49. package/dist/lib/git-provider-service.js +1 -0
  50. package/dist/lib/git-provider-setup/assets/coderflow_github_app.png +0 -0
  51. package/dist/lib/git-provider-setup/github-setup-handler.js +1 -0
  52. package/dist/lib/git-provider-setup/index.js +1 -0
  53. package/dist/lib/git-provider-setup/setup-factory.js +1 -0
  54. package/dist/lib/git-provider-setup/setup-interface.js +1 -0
  55. package/dist/lib/git-providers/azure-devops-provider.js +1 -0
  56. package/dist/lib/git-providers/github-app-provider.js +1 -0
  57. package/dist/lib/git-providers/index.js +1 -0
  58. package/dist/lib/git-providers/provider-factory.js +1 -0
  59. package/dist/lib/git-providers/provider-interface.js +1 -0
  60. package/dist/lib/jira-client.js +1 -0
  61. package/dist/lib/logger.js +1 -0
  62. package/dist/lib/model-fetcher.js +1 -0
  63. package/dist/lib/notifications.js +1 -0
  64. package/dist/lib/oidc-auth.js +1 -0
  65. package/dist/lib/oidc-device-flow.js +1 -0
  66. package/dist/lib/passwordTokens.js +1 -0
  67. package/dist/lib/pin-cascade.js +1 -0
  68. package/dist/lib/provider-accounts.js +1 -0
  69. package/dist/lib/provider-oauth.js +1 -0
  70. package/dist/lib/provider-profile.js +1 -0
  71. package/dist/lib/provider-token-refresh.js +1 -0
  72. package/dist/lib/roles.js +1 -0
  73. package/dist/lib/secrets.js +1 -0
  74. package/dist/lib/state-capture.js +1 -0
  75. package/dist/lib/static-files.js +1 -0
  76. package/dist/lib/task-name-generator.js +1 -0
  77. package/dist/lib/users.js +1 -0
  78. package/dist/middleware/requireAuth.js +1 -0
  79. package/dist/middleware/requireInit.js +1 -0
  80. package/dist/middleware/requirePermission.js +1 -0
  81. package/dist/package-lock.json +4151 -0
  82. package/dist/package.json +50 -0
  83. package/dist/routes/apiKeys.js +1 -0
  84. package/dist/routes/auth-oidc.js +1 -0
  85. package/dist/routes/auth.js +1 -0
  86. package/dist/routes/build.js +1 -0
  87. package/dist/routes/containers.js +1 -0
  88. package/dist/routes/deploy-task.js +1 -0
  89. package/dist/routes/environment-management.js +1 -0
  90. package/dist/routes/environments.js +1 -0
  91. package/dist/routes/external-skills.js +1 -0
  92. package/dist/routes/git-credentials.js +1 -0
  93. package/dist/routes/git-provider-setup.js +1 -0
  94. package/dist/routes/health.js +1 -0
  95. package/dist/routes/jira.js +1 -0
  96. package/dist/routes/objective-management.js +1 -0
  97. package/dist/routes/password.js +1 -0
  98. package/dist/routes/prompt.js +1 -0
  99. package/dist/routes/provider-auth.js +1 -0
  100. package/dist/routes/qa.js +1 -0
  101. package/dist/routes/settings.js +1 -0
  102. package/dist/routes/skill-management.js +1 -0
  103. package/dist/routes/skills.js +1 -0
  104. package/dist/routes/tasks.js +2 -0
  105. package/dist/routes/templates.js +1 -0
  106. package/dist/routes/test-task.js +1 -0
  107. package/dist/routes/test.js +1 -0
  108. package/dist/routes/users.js +1 -0
  109. package/dist/routes/visualizations.js +1 -0
  110. package/dist/schemas/template-metadata.schema.json +178 -0
  111. package/dist/scripts/create-user.js +2 -0
  112. package/dist/shipped-skills/environment-instructions/SKILL.md +154 -0
  113. package/dist/shipped-skills/environment-templates/SKILL.md +282 -0
  114. package/dist/shipped-skills/objective-management/SKILL.md +238 -0
  115. package/dist/shipped-skills/skill-editor/SKILL.md +326 -0
  116. package/dist/start.js +2 -0
  117. package/dist/web-ui/public/activity-detail-modal.js +1 -0
  118. package/dist/web-ui/public/activity-feed.js +1 -0
  119. package/dist/web-ui/public/activity-formatters.js +1 -0
  120. package/dist/web-ui/public/agent-event-parser.js +1 -0
  121. package/dist/web-ui/public/app.js +1 -0
  122. package/dist/web-ui/public/approve-dialog.js +1 -0
  123. package/dist/web-ui/public/coderflow-logo-reversed.svg +46 -0
  124. package/dist/web-ui/public/coderflow-logo.svg +46 -0
  125. package/dist/web-ui/public/comments-widget.js +1 -0
  126. package/dist/web-ui/public/docs/.nojekyll +0 -0
  127. package/dist/web-ui/public/docs/README.md +26 -0
  128. package/dist/web-ui/public/docs/_sidebar.md +47 -0
  129. package/dist/web-ui/public/docs/admin/ai-providers.md +132 -0
  130. package/dist/web-ui/public/docs/admin/email-notifications.md +69 -0
  131. package/dist/web-ui/public/docs/admin/environments.md +215 -0
  132. package/dist/web-ui/public/docs/admin/git-providers.md +147 -0
  133. package/dist/web-ui/public/docs/admin/installation.md +313 -0
  134. package/dist/web-ui/public/docs/admin/skills.md +35 -0
  135. package/dist/web-ui/public/docs/admin/sso.md +241 -0
  136. package/dist/web-ui/public/docs/admin/users-and-roles.md +57 -0
  137. package/dist/web-ui/public/docs/code/cli.md +102 -0
  138. package/dist/web-ui/public/docs/code/files-and-editing.md +86 -0
  139. package/dist/web-ui/public/docs/code/terminal-access.md +110 -0
  140. package/dist/web-ui/public/docs/code/vscode-extension.md +58 -0
  141. package/dist/web-ui/public/docs/getting-started/core-concepts.md +129 -0
  142. package/dist/web-ui/public/docs/getting-started/overview.md +46 -0
  143. package/dist/web-ui/public/docs/index.html +151 -0
  144. package/dist/web-ui/public/docs/integrations/custom.md +58 -0
  145. package/dist/web-ui/public/docs/integrations/ibmi/overview.md +58 -0
  146. package/dist/web-ui/public/docs/integrations/overview.md +48 -0
  147. package/dist/web-ui/public/docs/objectives/qa-mode.md +90 -0
  148. package/dist/web-ui/public/docs/objectives/staged-tasks.md +60 -0
  149. package/dist/web-ui/public/docs/objectives/working-with-objectives.md +102 -0
  150. package/dist/web-ui/public/docs/tasks/approval-and-deployment.md +83 -0
  151. package/dist/web-ui/public/docs/tasks/creating-tasks.md +111 -0
  152. package/dist/web-ui/public/docs/tasks/judging.md +114 -0
  153. package/dist/web-ui/public/docs/tasks/providing-feedback.md +41 -0
  154. package/dist/web-ui/public/docs/tasks/task-groups.md +73 -0
  155. package/dist/web-ui/public/docs/tasks/winner-selection.md +75 -0
  156. package/dist/web-ui/public/docs/templates/batch-processing.md +152 -0
  157. package/dist/web-ui/public/docs/templates/task-templates.md +44 -0
  158. package/dist/web-ui/public/docs/templates/template-examples.md +93 -0
  159. package/dist/web-ui/public/docs/testing/profound-automated-testing.md +77 -0
  160. package/dist/web-ui/public/docs/testing/task-visualizations.md +42 -0
  161. package/dist/web-ui/public/docs/testing/testing-menu.md +118 -0
  162. package/dist/web-ui/public/environments.css +3942 -0
  163. package/dist/web-ui/public/environments.html +1791 -0
  164. package/dist/web-ui/public/environments.js +1 -0
  165. package/dist/web-ui/public/favicon-16.png +0 -0
  166. package/dist/web-ui/public/favicon-32.png +0 -0
  167. package/dist/web-ui/public/favicon.ico +0 -0
  168. package/dist/web-ui/public/feedback-widget.css +3133 -0
  169. package/dist/web-ui/public/feedback-widget.js +1 -0
  170. package/dist/web-ui/public/git-history.css +2663 -0
  171. package/dist/web-ui/public/git-history.html +272 -0
  172. package/dist/web-ui/public/git-history.js +1 -0
  173. package/dist/web-ui/public/git-status.js +1 -0
  174. package/dist/web-ui/public/index.html +1459 -0
  175. package/dist/web-ui/public/index.js +1 -0
  176. package/dist/web-ui/public/login.html +346 -0
  177. package/dist/web-ui/public/login.js +1 -0
  178. package/dist/web-ui/public/markdown-editor.js +1 -0
  179. package/dist/web-ui/public/markdown-file-editor.js +1 -0
  180. package/dist/web-ui/public/modal-maximize.js +1 -0
  181. package/dist/web-ui/public/notifications.js +1 -0
  182. package/dist/web-ui/public/server-health.js +1 -0
  183. package/dist/web-ui/public/settings.css +761 -0
  184. package/dist/web-ui/public/settings.html +1044 -0
  185. package/dist/web-ui/public/settings.js +1 -0
  186. package/dist/web-ui/public/setup-password.html +355 -0
  187. package/dist/web-ui/public/setup-password.js +1 -0
  188. package/dist/web-ui/public/skills.css +1949 -0
  189. package/dist/web-ui/public/skills.html +820 -0
  190. package/dist/web-ui/public/skills.js +1 -0
  191. package/dist/web-ui/public/sse-client.js +1 -0
  192. package/dist/web-ui/public/sse-shared-worker.js +1 -0
  193. package/dist/web-ui/public/styles.css +18614 -0
  194. package/dist/web-ui/public/task.html +1779 -0
  195. package/dist/web-ui/public/task.js +1 -0
  196. package/dist/web-ui/public/terminal.html +45 -0
  197. package/dist/web-ui/public/terminal.js +1 -0
  198. package/dist/web-ui/public/theme.js +1 -0
  199. package/dist/web-ui/public/users.html +298 -0
  200. package/dist/web-ui/public/users.js +1 -0
  201. package/dist/web-ui/public/variant-grouping.js +1 -0
  202. package/package.json +63 -0
@@ -0,0 +1,1949 @@
1
+ /**
2
+ * Skills Management Page Styles
3
+ * Updated to match environments.html styling patterns
4
+ */
5
+
6
+ /* ============================================================
7
+ LAYOUT
8
+ ============================================================ */
9
+
10
+ .skills-layout {
11
+ display: grid;
12
+ grid-template-columns: minmax(260px, 320px) 1fr;
13
+ gap: 24px;
14
+ padding: 0;
15
+ min-height: calc(100vh - 200px);
16
+ }
17
+
18
+ @media (max-width: 900px) {
19
+ .skills-layout {
20
+ grid-template-columns: 1fr;
21
+ }
22
+ }
23
+
24
+ /* ============================================================
25
+ SIDEBAR - SKILLS LIST
26
+ ============================================================ */
27
+
28
+ .skills-sidebar {
29
+ background: var(--color-surface);
30
+ border-radius: var(--radius-large);
31
+ box-shadow: var(--shadow-card);
32
+ display: flex;
33
+ flex-direction: column;
34
+ overflow: hidden;
35
+ max-height: calc(100vh - 240px);
36
+ position: sticky;
37
+ top: 1.5rem;
38
+ border: 1px solid var(--color-border);
39
+ }
40
+
41
+ .skills-list-header {
42
+ display: flex;
43
+ justify-content: space-between;
44
+ align-items: center;
45
+ padding: 20px 24px;
46
+ border-bottom: 1px solid var(--color-border);
47
+ background: linear-gradient(135deg, var(--color-surface) 0%, var(--color-surface-muted) 100%);
48
+ }
49
+
50
+ .skills-header-title {
51
+ display: flex;
52
+ align-items: center;
53
+ gap: 10px;
54
+ }
55
+
56
+ .skills-list-header h3 {
57
+ margin: 0;
58
+ font-size: 1rem;
59
+ font-weight: 600;
60
+ color: var(--color-text);
61
+ }
62
+
63
+ .skills-count {
64
+ background: var(--color-surface-muted);
65
+ border: 1px solid var(--color-border);
66
+ color: var(--color-text-muted);
67
+ border-radius: 999px;
68
+ padding: 4px 10px;
69
+ font-size: 12px;
70
+ font-weight: 600;
71
+ }
72
+
73
+ .skills-search {
74
+ padding: 16px 20px 12px;
75
+ border-bottom: 1px solid var(--color-border);
76
+ background: var(--color-surface-muted);
77
+ }
78
+
79
+ .skills-search-input {
80
+ display: flex;
81
+ align-items: center;
82
+ gap: 8px;
83
+ background: var(--color-surface);
84
+ border: 1px solid var(--color-border);
85
+ border-radius: var(--radius-small);
86
+ padding: 0 10px;
87
+ transition: all 0.2s;
88
+ }
89
+
90
+ .skills-search-icon {
91
+ color: var(--color-text-muted);
92
+ flex-shrink: 0;
93
+ }
94
+
95
+ .skills-search-input input {
96
+ width: 100%;
97
+ padding: 10px 0;
98
+ font-size: 14px;
99
+ border: none;
100
+ background: transparent;
101
+ color: var(--color-text);
102
+ outline: none;
103
+ box-shadow: none;
104
+ }
105
+
106
+ /* Hide browser's native search clear button */
107
+ .skills-search-input input[type="search"]::-webkit-search-cancel-button {
108
+ -webkit-appearance: none;
109
+ appearance: none;
110
+ display: none;
111
+ }
112
+
113
+ .skills-search-input input:focus {
114
+ box-shadow: none;
115
+ outline: none;
116
+ }
117
+
118
+ .skills-search-input:hover {
119
+ border-color: var(--color-accent);
120
+ }
121
+
122
+ .skills-search-input:focus-within {
123
+ border-color: var(--color-accent);
124
+ box-shadow: 0 0 0 3px rgba(63, 114, 255, 0.1);
125
+ }
126
+
127
+ .skills-search-clear {
128
+ border: none;
129
+ background: var(--color-surface-muted);
130
+ color: var(--color-text-muted);
131
+ width: 24px;
132
+ height: 24px;
133
+ border-radius: 999px;
134
+ cursor: pointer;
135
+ font-size: 16px;
136
+ line-height: 1;
137
+ display: inline-flex;
138
+ align-items: center;
139
+ justify-content: center;
140
+ transition: all 0.2s;
141
+ }
142
+
143
+ .skills-search-clear:hover {
144
+ background: var(--color-surface);
145
+ color: var(--color-text);
146
+ }
147
+
148
+ .skills-search-clear:focus-visible {
149
+ outline: 2px solid rgba(63, 114, 255, 0.4);
150
+ outline-offset: 2px;
151
+ }
152
+
153
+ .skills-search-meta {
154
+ margin-top: 8px;
155
+ font-size: 12px;
156
+ color: var(--color-text-muted);
157
+ }
158
+
159
+ .skills-list {
160
+ flex: 1;
161
+ overflow-y: auto;
162
+ padding: 12px 12px 16px;
163
+ display: flex;
164
+ flex-direction: column;
165
+ gap: 8px;
166
+ scrollbar-width: thin;
167
+ }
168
+
169
+ .skills-list::-webkit-scrollbar {
170
+ width: 6px;
171
+ }
172
+
173
+ .skills-list::-webkit-scrollbar-track {
174
+ background: transparent;
175
+ }
176
+
177
+ .skills-list::-webkit-scrollbar-thumb {
178
+ background: var(--color-border);
179
+ border-radius: 999px;
180
+ }
181
+
182
+ .skill-item {
183
+ padding: 14px 18px;
184
+ border-radius: var(--radius-medium);
185
+ cursor: pointer;
186
+ transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
187
+ border: 1px solid var(--color-border);
188
+ background: var(--color-surface);
189
+ position: relative;
190
+ display: flex;
191
+ flex-direction: column;
192
+ gap: 6px;
193
+ }
194
+
195
+ .skill-item:hover {
196
+ background: var(--color-surface-muted);
197
+ border-color: var(--color-accent);
198
+ box-shadow: 0 8px 20px rgba(15, 23, 42, 0.1);
199
+ transform: translateY(-2px);
200
+ }
201
+
202
+ .skill-item.selected {
203
+ background: linear-gradient(135deg, var(--color-surface) 0%, var(--color-surface-muted) 100%);
204
+ border-color: var(--color-accent);
205
+ color: var(--color-text);
206
+ box-shadow: 0 10px 24px rgba(15, 23, 42, 0.12);
207
+ }
208
+
209
+ .skill-item:focus-visible {
210
+ outline: 2px solid rgba(63, 114, 255, 0.45);
211
+ outline-offset: 2px;
212
+ }
213
+
214
+ .skill-item.selected .skill-item-description {
215
+ color: var(--color-text-muted);
216
+ }
217
+
218
+ .skill-item::before {
219
+ content: '';
220
+ position: absolute;
221
+ left: 0;
222
+ top: 8px;
223
+ bottom: 8px;
224
+ width: 3px;
225
+ border-radius: 2px;
226
+ background: var(--color-accent);
227
+ transform: scaleY(0);
228
+ transition: transform 0.2s ease;
229
+ }
230
+
231
+ .skill-item:hover::before {
232
+ transform: scaleY(0.5);
233
+ opacity: 0.6;
234
+ }
235
+
236
+ .skill-item.selected::before {
237
+ transform: scaleY(1);
238
+ opacity: 1;
239
+ }
240
+
241
+ .skill-item-header {
242
+ display: flex;
243
+ align-items: center;
244
+ justify-content: space-between;
245
+ gap: 12px;
246
+ }
247
+
248
+ .skill-item.modified::after {
249
+ content: '';
250
+ display: inline-block;
251
+ width: 6px;
252
+ height: 6px;
253
+ background: var(--color-warning);
254
+ border-radius: 50%;
255
+ margin-left: 8px;
256
+ vertical-align: middle;
257
+ }
258
+
259
+ .skill-item-name {
260
+ font-weight: 500;
261
+ font-size: 0.9375rem;
262
+ line-height: 1.25;
263
+ margin: 0;
264
+ display: inline-flex;
265
+ align-items: center;
266
+ gap: 8px;
267
+ }
268
+
269
+ .skill-item-description {
270
+ font-size: 0.8125rem;
271
+ color: var(--color-text-muted);
272
+ overflow: hidden;
273
+ text-overflow: ellipsis;
274
+ white-space: nowrap;
275
+ }
276
+
277
+ .skill-item-id {
278
+ font-size: 0.75rem;
279
+ font-family: var(--font-mono);
280
+ color: var(--color-text-muted);
281
+ background: var(--color-surface-muted);
282
+ border: 1px solid var(--color-border);
283
+ border-radius: 999px;
284
+ padding: 2px 8px;
285
+ }
286
+
287
+ .skills-list-empty {
288
+ padding: 2rem 1rem;
289
+ text-align: center;
290
+ color: var(--color-text-secondary);
291
+ font-size: 0.875rem;
292
+ }
293
+
294
+ .skills-list-empty .empty-icon {
295
+ font-size: 1.5rem;
296
+ margin-bottom: 8px;
297
+ opacity: 0.6;
298
+ }
299
+
300
+ /* ============================================================
301
+ SKILL EDITOR PANEL
302
+ ============================================================ */
303
+
304
+ .skill-editor {
305
+ min-width: 0;
306
+ }
307
+
308
+ /* ============================================================
309
+ SKILL HEADER CARD (matches env-header-card)
310
+ ============================================================ */
311
+
312
+ .skill-header-card {
313
+ background: linear-gradient(135deg, var(--color-surface) 0%, var(--color-surface-muted) 100%);
314
+ border-radius: var(--radius-large);
315
+ box-shadow: var(--shadow-card);
316
+ padding: 24px 28px;
317
+ margin-bottom: 20px;
318
+ border: 1px solid var(--color-border);
319
+ }
320
+
321
+ .skill-header-content {
322
+ max-width: 800px;
323
+ }
324
+
325
+ .skill-title-row {
326
+ display: flex;
327
+ align-items: center;
328
+ gap: 12px;
329
+ margin-bottom: 8px;
330
+ }
331
+
332
+ .skill-title {
333
+ font-size: 28px;
334
+ font-weight: 700;
335
+ margin: 0;
336
+ color: var(--color-text);
337
+ }
338
+
339
+ .skill-description-display {
340
+ font-size: 15px;
341
+ color: var(--color-text-muted);
342
+ margin: 0;
343
+ line-height: 1.6;
344
+ }
345
+
346
+ .skill-meta {
347
+ display: flex;
348
+ flex-wrap: wrap;
349
+ gap: 8px;
350
+ margin-top: 12px;
351
+ }
352
+
353
+ .meta-chip {
354
+ display: inline-flex;
355
+ align-items: center;
356
+ gap: 6px;
357
+ padding: 6px 12px;
358
+ font-size: 12px;
359
+ color: var(--color-text-muted);
360
+ background: linear-gradient(135deg, var(--color-surface) 0%, var(--color-surface-muted) 100%);
361
+ border: 1px solid var(--color-border);
362
+ border-radius: 999px;
363
+ font-family: var(--font-mono);
364
+ transition: all 0.2s ease;
365
+ }
366
+
367
+ .meta-chip:hover {
368
+ border-color: var(--color-accent);
369
+ color: var(--color-text);
370
+ }
371
+
372
+ .skill-details .content-nav {
373
+ margin-bottom: 16px;
374
+ }
375
+
376
+ /* ============================================================
377
+ FORM STYLES
378
+ ============================================================ */
379
+
380
+ /* Single column form layout (matching environments.html) */
381
+ .form-single-column {
382
+ display: flex;
383
+ flex-direction: column;
384
+ gap: 16px;
385
+ max-width: 800px;
386
+ }
387
+
388
+ .form-row {
389
+ display: grid;
390
+ grid-template-columns: 180px 1fr;
391
+ gap: 16px;
392
+ align-items: center;
393
+ }
394
+
395
+ .form-row label {
396
+ font-size: 13px;
397
+ font-weight: 500;
398
+ color: var(--color-text);
399
+ text-align: left;
400
+ }
401
+
402
+ .form-row .form-input,
403
+ .form-row .form-textarea {
404
+ margin: 0;
405
+ }
406
+
407
+ .form-grid {
408
+ display: grid;
409
+ grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
410
+ gap: 20px;
411
+ }
412
+
413
+ .form-grid .form-row.full-width {
414
+ grid-column: 1 / -1;
415
+ }
416
+
417
+ @media (max-width: 700px) {
418
+ .form-grid {
419
+ grid-template-columns: 1fr;
420
+ }
421
+
422
+ .form-row {
423
+ grid-template-columns: 1fr;
424
+ gap: 8px;
425
+ }
426
+ }
427
+
428
+ .form-textarea {
429
+ width: 100%;
430
+ min-height: 200px;
431
+ resize: vertical;
432
+ font-family: var(--font-mono);
433
+ font-size: 14px;
434
+ line-height: 1.6;
435
+ padding: 14px 16px;
436
+ border: 1px solid var(--color-border);
437
+ border-radius: var(--radius-small);
438
+ background: var(--color-surface);
439
+ color: var(--color-text);
440
+ transition: all 0.2s;
441
+ }
442
+
443
+ .form-textarea:hover {
444
+ border-color: var(--color-accent);
445
+ }
446
+
447
+ .form-textarea:focus {
448
+ outline: none;
449
+ border-color: var(--color-accent);
450
+ box-shadow: 0 0 0 3px rgba(63, 114, 255, 0.15);
451
+ }
452
+
453
+ /* Compact textarea - wraps text like textarea but minimal height */
454
+ .form-textarea-compact {
455
+ width: 100%;
456
+ min-height: unset;
457
+ resize: vertical;
458
+ font-family: var(--font-sans);
459
+ font-size: 14px;
460
+ line-height: 1.4;
461
+ padding: 8px 12px;
462
+ border: 1px solid var(--color-border);
463
+ border-radius: 6px;
464
+ background: var(--color-surface);
465
+ color: var(--color-text);
466
+ transition: all 0.2s;
467
+ }
468
+
469
+ .form-textarea-compact:hover {
470
+ border-color: var(--color-accent);
471
+ }
472
+
473
+ .form-textarea-compact:focus {
474
+ outline: none;
475
+ border-color: var(--color-accent);
476
+ box-shadow: 0 0 0 3px rgba(63, 114, 255, 0.15);
477
+ }
478
+
479
+ .code-font {
480
+ font-family: var(--font-mono) !important;
481
+ }
482
+
483
+ .form-group {
484
+ display: flex;
485
+ flex-direction: column;
486
+ gap: 8px;
487
+ margin-bottom: 16px;
488
+ }
489
+
490
+ .form-group:last-child {
491
+ margin-bottom: 0;
492
+ }
493
+
494
+ .form-group label {
495
+ font-size: 13px;
496
+ font-weight: 500;
497
+ color: var(--color-text);
498
+ }
499
+
500
+ .form-group .required {
501
+ color: var(--color-danger);
502
+ }
503
+
504
+ .form-hint {
505
+ font-size: 11px;
506
+ color: var(--color-text-muted);
507
+ margin-top: 4px;
508
+ }
509
+
510
+ .form-hint code {
511
+ background: var(--color-surface-elevated, var(--color-surface-muted));
512
+ padding: 1px 4px;
513
+ border-radius: 3px;
514
+ font-family: var(--font-mono);
515
+ font-size: 10px;
516
+ }
517
+
518
+ /* Form field with hint below it */
519
+ .form-field-with-hint {
520
+ display: flex;
521
+ flex-direction: column;
522
+ gap: 4px;
523
+ }
524
+
525
+ .form-field-with-hint .form-hint {
526
+ margin-top: 0;
527
+ }
528
+
529
+ /* ============================================================
530
+ PROMPT BODY SECTION
531
+ ============================================================ */
532
+
533
+ .prompt-help-text {
534
+ font-size: 12px;
535
+ color: var(--color-text-muted);
536
+ }
537
+
538
+ .prompt-help-text code {
539
+ background: var(--color-surface-muted);
540
+ padding: 2px 6px;
541
+ border-radius: 3px;
542
+ font-family: var(--font-mono);
543
+ font-size: 11px;
544
+ color: var(--color-accent);
545
+ }
546
+
547
+ .editor-footer {
548
+ margin-top: 8px;
549
+ font-size: 12px;
550
+ color: var(--color-text-muted);
551
+ text-align: right;
552
+ }
553
+
554
+ /* ============================================================
555
+ FILES LIST & EDITOR
556
+ ============================================================ */
557
+
558
+ .files-card .card-body {
559
+ padding: 20px 28px;
560
+ }
561
+
562
+ .files-help-text {
563
+ margin-bottom: 16px;
564
+ font-size: 13px;
565
+ }
566
+
567
+ .skill-files-list {
568
+ display: flex;
569
+ flex-direction: column;
570
+ gap: 8px;
571
+ }
572
+
573
+ .files-empty {
574
+ text-align: center;
575
+ padding: 32px;
576
+ background: var(--color-surface-muted);
577
+ border: 1px dashed var(--color-border);
578
+ border-radius: var(--radius-medium);
579
+ }
580
+
581
+ .files-empty p {
582
+ margin: 0;
583
+ }
584
+
585
+ .files-empty p + p {
586
+ margin-top: 8px;
587
+ }
588
+
589
+ .file-item {
590
+ display: flex;
591
+ align-items: center;
592
+ gap: 12px;
593
+ padding: 12px 16px;
594
+ border-radius: var(--radius-medium);
595
+ background: var(--color-surface);
596
+ border: 1px solid var(--color-border);
597
+ transition: all 0.2s;
598
+ }
599
+
600
+ .file-item:hover {
601
+ border-color: var(--color-accent);
602
+ background: var(--color-surface-muted);
603
+ }
604
+
605
+ .file-item.directory {
606
+ background: transparent;
607
+ border: none;
608
+ font-weight: 500;
609
+ }
610
+
611
+ .file-icon {
612
+ font-size: 1rem;
613
+ width: 1.25rem;
614
+ text-align: center;
615
+ flex-shrink: 0;
616
+ }
617
+
618
+ .file-name {
619
+ flex: 1;
620
+ font-family: var(--font-mono);
621
+ font-size: 0.875rem;
622
+ color: var(--color-text);
623
+ }
624
+
625
+ .file-actions {
626
+ display: flex;
627
+ gap: 4px;
628
+ opacity: 0;
629
+ transition: opacity 0.15s ease;
630
+ }
631
+
632
+ .file-item:hover .file-actions {
633
+ opacity: 1;
634
+ }
635
+
636
+ .file-edit-btn,
637
+ .file-delete-btn {
638
+ background: none;
639
+ border: none;
640
+ padding: 6px 10px;
641
+ cursor: pointer;
642
+ color: var(--color-text-muted);
643
+ border-radius: var(--radius-small);
644
+ font-size: 13px;
645
+ transition: all 0.2s;
646
+ }
647
+
648
+ .file-edit-btn:hover {
649
+ color: var(--color-accent);
650
+ background: var(--color-surface);
651
+ }
652
+
653
+ .file-delete-btn:hover {
654
+ color: var(--color-danger);
655
+ background: rgba(229, 83, 104, 0.1);
656
+ }
657
+
658
+ /* File Editor Card */
659
+ .file-editor-card {
660
+ margin-top: 20px;
661
+ }
662
+
663
+ .file-editor-card .card-header h3 {
664
+ display: flex;
665
+ align-items: center;
666
+ gap: 8px;
667
+ }
668
+
669
+ .file-editor-card .card-header h3 svg {
670
+ color: var(--color-text-muted);
671
+ }
672
+
673
+ .file-editor-textarea-wrapper {
674
+ margin-top: 16px;
675
+ }
676
+
677
+ .card-header-actions {
678
+ display: flex;
679
+ align-items: center;
680
+ gap: 8px;
681
+ }
682
+
683
+ .btn-danger-text {
684
+ color: var(--color-text-muted);
685
+ }
686
+
687
+ .btn-danger-text:hover {
688
+ color: var(--color-danger) !important;
689
+ background: rgba(229, 83, 104, 0.1) !important;
690
+ }
691
+
692
+ /* ============================================================
693
+ GIT STATUS INDICATOR
694
+ ============================================================ */
695
+
696
+ .repo-status-indicator {
697
+ display: flex;
698
+ align-items: center;
699
+ gap: 8px;
700
+ padding: 6px 12px;
701
+ background: var(--color-surface-muted);
702
+ border: 1px solid var(--color-border);
703
+ border-radius: var(--radius-medium);
704
+ font-size: 13px;
705
+ color: var(--color-text);
706
+ }
707
+
708
+ .repo-status-indicator #repo-status-icon {
709
+ font-size: 14px;
710
+ }
711
+
712
+ .repo-status-indicator #repo-status-text {
713
+ font-weight: 500;
714
+ }
715
+
716
+ .repo-status-clean {
717
+ color: var(--color-success);
718
+ }
719
+
720
+ .repo-status-modified {
721
+ color: var(--color-warning);
722
+ }
723
+
724
+ .repo-status-ahead {
725
+ color: var(--color-primary, var(--color-accent));
726
+ }
727
+
728
+ .repo-status-behind {
729
+ color: var(--color-warning);
730
+ }
731
+
732
+ .repo-status-unknown {
733
+ color: var(--color-text-secondary);
734
+ }
735
+
736
+ .repo-branch {
737
+ color: var(--color-text-muted);
738
+ font-family: var(--font-mono);
739
+ font-size: 12px;
740
+ margin-left: 4px;
741
+ }
742
+
743
+ .repo-branch::before {
744
+ content: '•';
745
+ margin-right: 6px;
746
+ }
747
+
748
+ /* ============================================================
749
+ EMPTY STATE
750
+ ============================================================ */
751
+
752
+ .empty-state-card {
753
+ background: linear-gradient(135deg, var(--color-surface) 0%, var(--color-surface-muted) 100%);
754
+ border-radius: var(--radius-large);
755
+ box-shadow: var(--shadow-card);
756
+ padding: 80px 40px;
757
+ text-align: center;
758
+ border: 1px solid var(--color-border);
759
+ }
760
+
761
+ .empty-state-icon {
762
+ font-size: 72px;
763
+ margin-bottom: 24px;
764
+ opacity: 0.7;
765
+ filter: drop-shadow(0 4px 8px rgba(0, 0, 0, 0.1));
766
+ }
767
+
768
+ .empty-state-card h2 {
769
+ margin: 0 0 12px 0;
770
+ font-size: 26px;
771
+ font-weight: 700;
772
+ color: var(--color-text);
773
+ }
774
+
775
+ .empty-state-card p {
776
+ margin: 0 0 28px 0;
777
+ font-size: 15px;
778
+ color: var(--color-text-muted);
779
+ max-width: 400px;
780
+ margin-left: auto;
781
+ margin-right: auto;
782
+ line-height: 1.6;
783
+ }
784
+
785
+ .empty-state-actions {
786
+ display: flex;
787
+ gap: 12px;
788
+ justify-content: center;
789
+ flex-wrap: wrap;
790
+ }
791
+
792
+ .empty-state-card .btn-primary,
793
+ .empty-state-card .btn-secondary {
794
+ display: inline-flex;
795
+ align-items: center;
796
+ gap: 8px;
797
+ padding: 12px 24px;
798
+ font-size: 15px;
799
+ font-weight: 600;
800
+ }
801
+
802
+ /* ============================================================
803
+ CONTENT CARDS
804
+ ============================================================ */
805
+
806
+ .content-card {
807
+ background: var(--color-surface);
808
+ border-radius: var(--radius-large);
809
+ box-shadow: var(--shadow-card);
810
+ overflow: visible;
811
+ border: 1px solid var(--color-border);
812
+ transition: box-shadow 0.3s ease;
813
+ }
814
+
815
+ .content-card:hover {
816
+ box-shadow: 0 24px 64px rgba(15, 23, 42, 0.14);
817
+ }
818
+
819
+ .card-header {
820
+ display: flex;
821
+ justify-content: space-between;
822
+ align-items: center;
823
+ padding: 24px 28px;
824
+ border-bottom: 1px solid var(--color-border);
825
+ background: linear-gradient(135deg, var(--color-surface) 0%, var(--color-surface-muted) 100%);
826
+ border-radius: var(--radius-large) var(--radius-large) 0 0;
827
+ }
828
+
829
+ .card-header h3 {
830
+ margin: 0;
831
+ font-size: 18px;
832
+ font-weight: 600;
833
+ color: var(--color-text);
834
+ }
835
+
836
+ .card-body {
837
+ padding: 28px;
838
+ border-radius: 0 0 var(--radius-large) var(--radius-large);
839
+ background: var(--color-surface);
840
+ }
841
+
842
+ /* ============================================================
843
+ TABS
844
+ ============================================================ */
845
+
846
+ .content-nav {
847
+ display: flex;
848
+ gap: 4px;
849
+ padding: 0;
850
+ margin-bottom: 16px;
851
+ overflow-x: auto;
852
+ overflow-y: hidden;
853
+ scrollbar-width: thin;
854
+ border-bottom: 1px solid var(--color-border);
855
+ }
856
+
857
+ .content-nav::-webkit-scrollbar {
858
+ height: 4px;
859
+ }
860
+
861
+ .content-nav::-webkit-scrollbar-track {
862
+ background: transparent;
863
+ }
864
+
865
+ .content-nav::-webkit-scrollbar-thumb {
866
+ background: var(--color-border);
867
+ border-radius: 2px;
868
+ }
869
+
870
+ .content-tab {
871
+ background: none;
872
+ border: none;
873
+ padding: 12px 20px;
874
+ font-size: 14px;
875
+ font-weight: 500;
876
+ color: var(--color-text-muted);
877
+ cursor: pointer;
878
+ transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
879
+ white-space: nowrap;
880
+ position: relative;
881
+ }
882
+
883
+ .content-tab::after {
884
+ content: '';
885
+ position: absolute;
886
+ bottom: -1px;
887
+ left: 0;
888
+ right: 0;
889
+ height: 3px;
890
+ background: var(--color-accent);
891
+ transform: scaleX(0);
892
+ transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1);
893
+ }
894
+
895
+ .content-tab:hover {
896
+ color: var(--color-text);
897
+ }
898
+
899
+ .content-tab:hover::after {
900
+ transform: scaleX(0.6);
901
+ opacity: 0.5;
902
+ }
903
+
904
+ .content-tab:focus-visible {
905
+ outline: 2px solid rgba(63, 114, 255, 0.35);
906
+ outline-offset: 2px;
907
+ border-radius: 999px;
908
+ }
909
+
910
+ .content-tab.active {
911
+ color: var(--color-accent);
912
+ font-weight: 600;
913
+ }
914
+
915
+ .content-tab.active::after {
916
+ transform: scaleX(1);
917
+ opacity: 1;
918
+ }
919
+
920
+ .tab-panel {
921
+ display: none;
922
+ flex-direction: column;
923
+ gap: 20px;
924
+ animation: fadeIn 0.3s ease;
925
+ }
926
+
927
+ .tab-panel.active {
928
+ display: flex;
929
+ }
930
+
931
+ .tab-content-wrapper {
932
+ min-height: 400px;
933
+ }
934
+
935
+ @keyframes fadeIn {
936
+ from {
937
+ opacity: 0;
938
+ transform: translateY(10px);
939
+ }
940
+ to {
941
+ opacity: 1;
942
+ transform: translateY(0);
943
+ }
944
+ }
945
+
946
+ /* ============================================================
947
+ TAGS & BADGES
948
+ ============================================================ */
949
+
950
+ .tag {
951
+ display: inline-flex;
952
+ align-items: center;
953
+ padding: 0.25rem 0.625rem;
954
+ font-size: 0.75rem;
955
+ font-weight: 500;
956
+ border-radius: 4px;
957
+ text-transform: uppercase;
958
+ letter-spacing: 0.03em;
959
+ }
960
+
961
+ .tag-warning {
962
+ background: rgba(245, 158, 11, 0.15);
963
+ color: var(--color-warning);
964
+ }
965
+
966
+ /* ============================================================
967
+ DROPDOWN MENU
968
+ ============================================================ */
969
+
970
+ .dropdown-container {
971
+ position: relative;
972
+ display: inline-block;
973
+ }
974
+
975
+ .dropdown-menu {
976
+ position: absolute;
977
+ top: calc(100% + 4px);
978
+ right: 0;
979
+ min-width: 200px;
980
+ background: var(--color-surface);
981
+ border: 1px solid var(--color-border);
982
+ border-radius: var(--radius-medium);
983
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
984
+ z-index: 1000;
985
+ padding: 4px 0;
986
+ }
987
+
988
+ .dropdown-menu[hidden] {
989
+ display: none;
990
+ }
991
+
992
+ .dropdown-item {
993
+ width: 100%;
994
+ padding: 10px 16px;
995
+ text-align: left;
996
+ background: none;
997
+ border: none;
998
+ color: var(--color-text);
999
+ font-size: 13px;
1000
+ cursor: pointer;
1001
+ display: flex;
1002
+ align-items: center;
1003
+ justify-content: flex-start;
1004
+ gap: 10px;
1005
+ transition: background-color 0.15s ease;
1006
+ }
1007
+
1008
+ .dropdown-item:hover:not(:disabled) {
1009
+ background: var(--color-surface-muted);
1010
+ }
1011
+
1012
+ .dropdown-item:disabled {
1013
+ opacity: 0.5;
1014
+ cursor: not-allowed;
1015
+ }
1016
+
1017
+ .dropdown-item .option-icon {
1018
+ width: 16px;
1019
+ height: 16px;
1020
+ flex-shrink: 0;
1021
+ color: var(--color-text-muted);
1022
+ }
1023
+
1024
+ .dropdown-item .option-text {
1025
+ flex: 1;
1026
+ }
1027
+
1028
+ .dropdown-divider {
1029
+ height: 1px;
1030
+ background: var(--color-border);
1031
+ margin: 4px 0;
1032
+ }
1033
+
1034
+ /* ============================================================
1035
+ STATUS ACTIONS
1036
+ ============================================================ */
1037
+
1038
+ .status-actions {
1039
+ display: flex;
1040
+ align-items: center;
1041
+ gap: 0.75rem;
1042
+ }
1043
+
1044
+ .status-actions .btn-secondary,
1045
+ .status-actions .btn-ghost {
1046
+ display: inline-flex;
1047
+ align-items: center;
1048
+ gap: 6px;
1049
+ }
1050
+
1051
+ .status-actions .btn-secondary svg,
1052
+ .status-actions .btn-ghost svg {
1053
+ width: 16px;
1054
+ height: 16px;
1055
+ }
1056
+
1057
+ /* ============================================================
1058
+ MODAL STYLES
1059
+ ============================================================ */
1060
+
1061
+ .warning-message {
1062
+ background: rgba(245, 158, 11, 0.1);
1063
+ border: 1px solid rgba(245, 158, 11, 0.3);
1064
+ border-radius: var(--radius-medium);
1065
+ padding: 16px;
1066
+ margin-bottom: 16px;
1067
+ }
1068
+
1069
+ .warning-message p {
1070
+ margin: 0;
1071
+ color: var(--color-text);
1072
+ }
1073
+
1074
+ .warning-message p + p {
1075
+ margin-top: 8px;
1076
+ }
1077
+
1078
+ .modal-error {
1079
+ padding: 12px 16px;
1080
+ background: rgba(229, 83, 104, 0.1);
1081
+ border: 1px solid rgba(229, 83, 104, 0.3);
1082
+ border-radius: var(--radius-medium);
1083
+ color: var(--color-danger);
1084
+ font-size: 13px;
1085
+ margin-bottom: 16px;
1086
+ }
1087
+
1088
+ .commit-author {
1089
+ padding: 12px 16px;
1090
+ background: var(--color-surface-muted);
1091
+ border-radius: var(--radius-small);
1092
+ font-size: 13px;
1093
+ color: var(--color-text-muted);
1094
+ margin-bottom: 20px;
1095
+ }
1096
+
1097
+ .commit-author strong {
1098
+ color: var(--color-text);
1099
+ font-weight: 600;
1100
+ }
1101
+
1102
+ .modified-files-list {
1103
+ list-style: none;
1104
+ padding: 0;
1105
+ margin: 0;
1106
+ max-height: 200px;
1107
+ overflow-y: auto;
1108
+ }
1109
+
1110
+ .modified-files-list li {
1111
+ padding: 8px 12px;
1112
+ background: var(--color-surface-muted);
1113
+ border-radius: var(--radius-small);
1114
+ font-size: 13px;
1115
+ font-family: var(--font-mono);
1116
+ color: var(--color-text);
1117
+ margin-bottom: 6px;
1118
+ }
1119
+
1120
+ .modified-files-list li::before {
1121
+ content: '●';
1122
+ color: var(--color-warning);
1123
+ margin-right: 8px;
1124
+ }
1125
+
1126
+ .checkbox-group {
1127
+ display: flex;
1128
+ flex-direction: column;
1129
+ gap: 12px;
1130
+ margin-top: 20px;
1131
+ }
1132
+
1133
+ .checkbox-label {
1134
+ display: flex;
1135
+ align-items: center;
1136
+ gap: 10px;
1137
+ cursor: pointer;
1138
+ user-select: none;
1139
+ font-size: 14px;
1140
+ color: var(--color-text);
1141
+ }
1142
+
1143
+ .checkbox-label input[type="checkbox"] {
1144
+ width: 18px;
1145
+ height: 18px;
1146
+ cursor: pointer;
1147
+ accent-color: var(--color-accent);
1148
+ }
1149
+
1150
+ /* ============================================================
1151
+ LOADING STATE
1152
+ ============================================================ */
1153
+
1154
+ .loading {
1155
+ display: flex;
1156
+ align-items: center;
1157
+ justify-content: center;
1158
+ gap: 12px;
1159
+ min-height: 300px;
1160
+ color: var(--color-text-secondary);
1161
+ font-size: 0.9375rem;
1162
+ }
1163
+
1164
+ .loading-spinner {
1165
+ animation: spin 1s linear infinite;
1166
+ }
1167
+
1168
+ @keyframes spin {
1169
+ from {
1170
+ transform: rotate(0deg);
1171
+ }
1172
+ to {
1173
+ transform: rotate(360deg);
1174
+ }
1175
+ }
1176
+
1177
+ /* ============================================================
1178
+ RESPONSIVE
1179
+ ============================================================ */
1180
+
1181
+ @media (max-width: 900px) {
1182
+ .skills-sidebar {
1183
+ position: static;
1184
+ max-height: 300px;
1185
+ }
1186
+
1187
+ .form-grid {
1188
+ grid-template-columns: 1fr;
1189
+ }
1190
+
1191
+ .form-row {
1192
+ grid-template-columns: 1fr;
1193
+ gap: 8px;
1194
+ }
1195
+
1196
+ .skill-header-card {
1197
+ padding: 16px 20px;
1198
+ }
1199
+
1200
+ .skill-title {
1201
+ font-size: 22px;
1202
+ }
1203
+ }
1204
+
1205
+ /* ============================================================
1206
+ BUTTON ICON STYLING
1207
+ ============================================================ */
1208
+
1209
+ .btn-icon {
1210
+ display: inline-flex;
1211
+ align-items: center;
1212
+ justify-content: center;
1213
+ width: 32px;
1214
+ height: 32px;
1215
+ padding: 0;
1216
+ border: none;
1217
+ border-radius: var(--radius-small);
1218
+ background: transparent;
1219
+ cursor: pointer;
1220
+ transition: all 0.15s ease;
1221
+ color: var(--color-text-muted);
1222
+ }
1223
+
1224
+ .btn-icon:hover {
1225
+ background: var(--color-surface-muted);
1226
+ color: var(--color-text);
1227
+ }
1228
+
1229
+ .btn-icon:focus-visible {
1230
+ outline: 2px solid rgba(63, 114, 255, 0.35);
1231
+ outline-offset: 2px;
1232
+ }
1233
+
1234
+ .btn-icon svg {
1235
+ width: 16px;
1236
+ height: 16px;
1237
+ }
1238
+
1239
+ .sr-only {
1240
+ position: absolute;
1241
+ width: 1px;
1242
+ height: 1px;
1243
+ padding: 0;
1244
+ margin: -1px;
1245
+ overflow: hidden;
1246
+ clip: rect(0, 0, 0, 0);
1247
+ border: 0;
1248
+ }
1249
+
1250
+ /* ============================================================
1251
+ DARK MODE ADJUSTMENTS
1252
+ ============================================================ */
1253
+
1254
+ :root[data-theme="dark"] .dropdown-menu {
1255
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.4);
1256
+ }
1257
+
1258
+ :root[data-theme="dark"] .warning-message {
1259
+ background: rgba(245, 158, 11, 0.15);
1260
+ }
1261
+
1262
+ :root[data-theme="dark"] .modal-error {
1263
+ background: rgba(229, 83, 104, 0.15);
1264
+ }
1265
+
1266
+ :root[data-theme="dark"] .files-empty {
1267
+ background: var(--color-surface);
1268
+ }
1269
+
1270
+ /* ============================================================
1271
+ IMPORT EXTERNAL SKILL MODAL
1272
+ ============================================================ */
1273
+
1274
+ .modal-large .modal-content {
1275
+ max-width: 640px;
1276
+ }
1277
+
1278
+ .import-tabs {
1279
+ display: flex;
1280
+ gap: 4px;
1281
+ margin-bottom: 20px;
1282
+ border-bottom: 1px solid var(--color-border);
1283
+ padding-bottom: 0;
1284
+ }
1285
+
1286
+ .import-tab {
1287
+ background: none;
1288
+ border: none;
1289
+ padding: 12px 20px;
1290
+ font-size: 14px;
1291
+ font-weight: 500;
1292
+ color: var(--color-text-muted);
1293
+ cursor: pointer;
1294
+ transition: all 0.2s ease;
1295
+ position: relative;
1296
+ white-space: nowrap;
1297
+ }
1298
+
1299
+ .import-tab::after {
1300
+ content: '';
1301
+ position: absolute;
1302
+ bottom: -1px;
1303
+ left: 0;
1304
+ right: 0;
1305
+ height: 3px;
1306
+ background: var(--color-accent);
1307
+ transform: scaleX(0);
1308
+ transition: transform 0.2s ease;
1309
+ }
1310
+
1311
+ .import-tab:hover {
1312
+ color: var(--color-text);
1313
+ }
1314
+
1315
+ .import-tab:hover::after {
1316
+ transform: scaleX(0.6);
1317
+ opacity: 0.5;
1318
+ }
1319
+
1320
+ .import-tab.active {
1321
+ color: var(--color-accent);
1322
+ font-weight: 600;
1323
+ }
1324
+
1325
+ .import-tab.active::after {
1326
+ transform: scaleX(1);
1327
+ opacity: 1;
1328
+ }
1329
+
1330
+ .import-tab-panel {
1331
+ display: none;
1332
+ }
1333
+
1334
+ .import-tab-panel.active {
1335
+ display: block;
1336
+ }
1337
+
1338
+ .import-loading {
1339
+ display: flex;
1340
+ align-items: center;
1341
+ justify-content: center;
1342
+ gap: 12px;
1343
+ padding: 40px 20px;
1344
+ color: var(--color-text-muted);
1345
+ font-size: 14px;
1346
+ }
1347
+
1348
+ .import-empty {
1349
+ text-align: center;
1350
+ padding: 40px 20px;
1351
+ color: var(--color-text-muted);
1352
+ }
1353
+
1354
+ /* Catalog Skills List */
1355
+ .catalog-skills-list {
1356
+ display: flex;
1357
+ flex-direction: column;
1358
+ gap: 12px;
1359
+ max-height: 400px;
1360
+ overflow-y: auto;
1361
+ padding-right: 8px;
1362
+ }
1363
+
1364
+ .catalog-skill-item {
1365
+ display: flex;
1366
+ align-items: flex-start;
1367
+ gap: 16px;
1368
+ padding: 16px;
1369
+ background: var(--color-surface);
1370
+ border: 1px solid var(--color-border);
1371
+ border-radius: var(--radius-medium);
1372
+ cursor: pointer;
1373
+ transition: all 0.2s ease;
1374
+ }
1375
+
1376
+ .catalog-skill-item:hover {
1377
+ border-color: var(--color-accent);
1378
+ background: var(--color-surface-muted);
1379
+ }
1380
+
1381
+ .catalog-skill-item.selected {
1382
+ border-color: var(--color-accent);
1383
+ background: linear-gradient(135deg, var(--color-surface) 0%, var(--color-surface-muted) 100%);
1384
+ box-shadow: 0 0 0 3px rgba(63, 114, 255, 0.15);
1385
+ }
1386
+
1387
+ .catalog-skill-item.imported {
1388
+ opacity: 0.6;
1389
+ cursor: not-allowed;
1390
+ }
1391
+
1392
+ .catalog-skill-item.imported:hover {
1393
+ border-color: var(--color-border);
1394
+ background: var(--color-surface);
1395
+ }
1396
+
1397
+ .catalog-skill-radio {
1398
+ margin-top: 2px;
1399
+ accent-color: var(--color-accent);
1400
+ width: 18px;
1401
+ height: 18px;
1402
+ flex-shrink: 0;
1403
+ }
1404
+
1405
+ .catalog-skill-info {
1406
+ flex: 1;
1407
+ min-width: 0;
1408
+ }
1409
+
1410
+ .catalog-skill-name {
1411
+ font-weight: 600;
1412
+ font-size: 15px;
1413
+ color: var(--color-text);
1414
+ margin-bottom: 4px;
1415
+ display: flex;
1416
+ align-items: center;
1417
+ gap: 8px;
1418
+ }
1419
+
1420
+ .catalog-skill-description {
1421
+ font-size: 13px;
1422
+ color: var(--color-text-muted);
1423
+ line-height: 1.5;
1424
+ margin-bottom: 8px;
1425
+ }
1426
+
1427
+ .catalog-skill-tags {
1428
+ display: flex;
1429
+ flex-wrap: wrap;
1430
+ gap: 6px;
1431
+ }
1432
+
1433
+ .catalog-skill-tag {
1434
+ font-size: 11px;
1435
+ padding: 2px 8px;
1436
+ background: var(--color-surface-muted);
1437
+ border: 1px solid var(--color-border);
1438
+ border-radius: 999px;
1439
+ color: var(--color-text-muted);
1440
+ }
1441
+
1442
+ .imported-badge {
1443
+ font-size: 11px;
1444
+ padding: 2px 8px;
1445
+ background: rgba(34, 197, 94, 0.15);
1446
+ border: 1px solid rgba(34, 197, 94, 0.3);
1447
+ border-radius: 999px;
1448
+ color: var(--color-success);
1449
+ font-weight: 500;
1450
+ }
1451
+
1452
+ /* Git/Folder form inline row */
1453
+ .form-row-inline {
1454
+ display: grid;
1455
+ grid-template-columns: 1fr 1fr;
1456
+ gap: 16px;
1457
+ }
1458
+
1459
+ .form-row-inline .form-group {
1460
+ margin-bottom: 0;
1461
+ }
1462
+
1463
+ @media (max-width: 500px) {
1464
+ .form-row-inline {
1465
+ grid-template-columns: 1fr;
1466
+ }
1467
+ }
1468
+
1469
+ /* ============================================================
1470
+ SKILL SOURCE BADGE
1471
+ ============================================================ */
1472
+
1473
+ .skill-source-badge {
1474
+ display: inline-flex;
1475
+ align-items: center;
1476
+ gap: 4px;
1477
+ font-size: 10px;
1478
+ padding: 2px 6px;
1479
+ border-radius: 999px;
1480
+ font-weight: 500;
1481
+ text-transform: uppercase;
1482
+ letter-spacing: 0.03em;
1483
+ }
1484
+
1485
+ .skill-source-badge.source-internal {
1486
+ background: var(--color-surface-muted);
1487
+ color: var(--color-text-muted);
1488
+ border: 1px solid var(--color-border);
1489
+ }
1490
+
1491
+ .skill-source-badge.source-catalog {
1492
+ background: rgba(63, 114, 255, 0.1);
1493
+ color: var(--color-accent);
1494
+ border: 1px solid rgba(63, 114, 255, 0.3);
1495
+ }
1496
+
1497
+ .skill-source-badge.source-git {
1498
+ background: rgba(34, 197, 94, 0.1);
1499
+ color: var(--color-success);
1500
+ border: 1px solid rgba(34, 197, 94, 0.3);
1501
+ }
1502
+
1503
+ .skill-source-badge.source-folder {
1504
+ background: rgba(245, 158, 11, 0.1);
1505
+ color: var(--color-warning);
1506
+ border: 1px solid rgba(245, 158, 11, 0.3);
1507
+ }
1508
+
1509
+ .skill-source-badge.source-npm {
1510
+ background: rgba(203, 56, 55, 0.1);
1511
+ color: #cb3837;
1512
+ border: 1px solid rgba(203, 56, 55, 0.3);
1513
+ }
1514
+
1515
+ .skill-source-badge.source-system {
1516
+ background: rgba(139, 92, 246, 0.1);
1517
+ color: #8b5cf6;
1518
+ border: 1px solid rgba(139, 92, 246, 0.3);
1519
+ }
1520
+
1521
+ /* ============================================================
1522
+ READONLY/PROPRIETARY SKILL STYLES
1523
+ ============================================================ */
1524
+
1525
+ .skill-readonly-notice {
1526
+ display: flex;
1527
+ align-items: center;
1528
+ gap: 12px;
1529
+ padding: 16px 20px;
1530
+ background: var(--color-surface-muted);
1531
+ border: 1px solid var(--color-border);
1532
+ border-radius: var(--radius-medium);
1533
+ margin-bottom: 20px;
1534
+ }
1535
+
1536
+ .skill-readonly-notice svg {
1537
+ width: 24px;
1538
+ height: 24px;
1539
+ color: var(--color-text-muted);
1540
+ flex-shrink: 0;
1541
+ }
1542
+
1543
+ .skill-readonly-notice-content h4 {
1544
+ margin: 0 0 4px 0;
1545
+ font-size: 14px;
1546
+ font-weight: 600;
1547
+ color: var(--color-text);
1548
+ }
1549
+
1550
+ .skill-readonly-notice-content p {
1551
+ margin: 0;
1552
+ font-size: 13px;
1553
+ color: var(--color-text-muted);
1554
+ }
1555
+
1556
+ .proprietary-placeholder {
1557
+ display: flex;
1558
+ flex-direction: column;
1559
+ align-items: center;
1560
+ justify-content: center;
1561
+ padding: 60px 40px;
1562
+ background: var(--color-surface-muted);
1563
+ border: 1px dashed var(--color-border);
1564
+ border-radius: var(--radius-medium);
1565
+ text-align: center;
1566
+ }
1567
+
1568
+ .proprietary-placeholder svg {
1569
+ width: 48px;
1570
+ height: 48px;
1571
+ color: var(--color-text-muted);
1572
+ opacity: 0.5;
1573
+ margin-bottom: 16px;
1574
+ }
1575
+
1576
+ .proprietary-placeholder h4 {
1577
+ margin: 0 0 8px 0;
1578
+ font-size: 16px;
1579
+ font-weight: 600;
1580
+ color: var(--color-text);
1581
+ }
1582
+
1583
+ .proprietary-placeholder p {
1584
+ margin: 0;
1585
+ font-size: 13px;
1586
+ color: var(--color-text-muted);
1587
+ max-width: 300px;
1588
+ }
1589
+
1590
+ /* Update available badge */
1591
+ .update-available-badge {
1592
+ display: inline-flex;
1593
+ align-items: center;
1594
+ gap: 4px;
1595
+ font-size: 11px;
1596
+ padding: 3px 8px;
1597
+ background: rgba(245, 158, 11, 0.15);
1598
+ border: 1px solid rgba(245, 158, 11, 0.3);
1599
+ border-radius: 999px;
1600
+ color: var(--color-warning);
1601
+ font-weight: 500;
1602
+ cursor: pointer;
1603
+ transition: all 0.2s ease;
1604
+ }
1605
+
1606
+ .update-available-badge:hover {
1607
+ background: rgba(245, 158, 11, 0.25);
1608
+ }
1609
+
1610
+ .update-available-badge svg {
1611
+ width: 12px;
1612
+ height: 12px;
1613
+ }
1614
+
1615
+ /* ============================================================
1616
+ NPM IMPORT INFO BOX
1617
+ ============================================================ */
1618
+
1619
+ .import-npm-info {
1620
+ display: flex;
1621
+ align-items: flex-start;
1622
+ gap: 12px;
1623
+ margin-top: 20px;
1624
+ padding: 16px;
1625
+ background: rgba(63, 114, 255, 0.05);
1626
+ border: 1px solid rgba(63, 114, 255, 0.2);
1627
+ border-radius: var(--radius-medium);
1628
+ }
1629
+
1630
+ .import-npm-info-icon {
1631
+ flex-shrink: 0;
1632
+ color: var(--color-accent);
1633
+ width: 20px;
1634
+ height: 20px;
1635
+ }
1636
+
1637
+ .import-npm-info-icon svg {
1638
+ width: 100%;
1639
+ height: 100%;
1640
+ }
1641
+
1642
+ .import-npm-info-content {
1643
+ flex: 1;
1644
+ min-width: 0;
1645
+ }
1646
+
1647
+ .import-npm-info-content strong {
1648
+ display: block;
1649
+ font-size: 13px;
1650
+ font-weight: 600;
1651
+ color: var(--color-text);
1652
+ margin-bottom: 4px;
1653
+ }
1654
+
1655
+ .import-npm-info-content p {
1656
+ margin: 0;
1657
+ font-size: 12px;
1658
+ color: var(--color-text-muted);
1659
+ line-height: 1.5;
1660
+ }
1661
+
1662
+ .import-npm-info-content code {
1663
+ background: var(--color-surface-muted);
1664
+ padding: 1px 5px;
1665
+ border-radius: 3px;
1666
+ font-family: var(--font-mono);
1667
+ font-size: 11px;
1668
+ color: var(--color-accent);
1669
+ }
1670
+
1671
+ /* Catalog NPM skill type indicator */
1672
+ .catalog-skill-type {
1673
+ display: inline-flex;
1674
+ align-items: center;
1675
+ gap: 4px;
1676
+ font-size: 10px;
1677
+ padding: 2px 6px;
1678
+ border-radius: 999px;
1679
+ font-weight: 500;
1680
+ text-transform: uppercase;
1681
+ letter-spacing: 0.03em;
1682
+ }
1683
+
1684
+ .catalog-skill-type.type-git {
1685
+ background: rgba(34, 197, 94, 0.1);
1686
+ color: var(--color-success);
1687
+ border: 1px solid rgba(34, 197, 94, 0.3);
1688
+ }
1689
+
1690
+ .catalog-skill-type.type-npm {
1691
+ background: rgba(203, 56, 55, 0.1);
1692
+ color: #cb3837;
1693
+ border: 1px solid rgba(203, 56, 55, 0.3);
1694
+ }
1695
+
1696
+ /* ============================================================
1697
+ MARKETPLACE BUNDLES (Git Import)
1698
+ ============================================================ */
1699
+
1700
+ .input-with-button {
1701
+ display: flex;
1702
+ gap: 8px;
1703
+ align-items: stretch;
1704
+ }
1705
+
1706
+ .input-with-button .form-input {
1707
+ flex: 1;
1708
+ }
1709
+
1710
+ .input-with-button .btn-secondary {
1711
+ white-space: nowrap;
1712
+ flex-shrink: 0;
1713
+ }
1714
+
1715
+ .marketplace-bundles-section {
1716
+ margin-top: 20px;
1717
+ padding: 20px;
1718
+ background: linear-gradient(135deg, var(--color-surface) 0%, var(--color-surface-muted) 100%);
1719
+ border: 1px solid var(--color-accent);
1720
+ border-radius: var(--radius-medium);
1721
+ }
1722
+
1723
+ .marketplace-bundles-header {
1724
+ display: flex;
1725
+ align-items: center;
1726
+ justify-content: space-between;
1727
+ margin-bottom: 12px;
1728
+ }
1729
+
1730
+ .marketplace-bundles-header h4 {
1731
+ margin: 0;
1732
+ font-size: 16px;
1733
+ font-weight: 600;
1734
+ color: var(--color-text);
1735
+ display: flex;
1736
+ align-items: center;
1737
+ gap: 8px;
1738
+ }
1739
+
1740
+ .marketplace-bundles-header h4 svg {
1741
+ color: var(--color-accent);
1742
+ }
1743
+
1744
+ .marketplace-version {
1745
+ font-size: 12px;
1746
+ color: var(--color-text-muted);
1747
+ font-family: var(--font-mono);
1748
+ }
1749
+
1750
+ .marketplace-bundles-list {
1751
+ display: flex;
1752
+ flex-direction: column;
1753
+ gap: 12px;
1754
+ max-height: 300px;
1755
+ overflow-y: auto;
1756
+ }
1757
+
1758
+ .marketplace-bundle-item {
1759
+ display: flex;
1760
+ align-items: flex-start;
1761
+ gap: 16px;
1762
+ padding: 16px;
1763
+ background: var(--color-surface);
1764
+ border: 1px solid var(--color-border);
1765
+ border-radius: var(--radius-medium);
1766
+ cursor: pointer;
1767
+ transition: all 0.2s ease;
1768
+ }
1769
+
1770
+ .marketplace-bundle-item:hover {
1771
+ border-color: var(--color-accent);
1772
+ background: var(--color-surface-muted);
1773
+ }
1774
+
1775
+ .marketplace-bundle-item.selected {
1776
+ border-color: var(--color-accent);
1777
+ box-shadow: 0 0 0 3px rgba(63, 114, 255, 0.15);
1778
+ }
1779
+
1780
+ .marketplace-bundle-item.expanded {
1781
+ flex-direction: column;
1782
+ }
1783
+
1784
+ .marketplace-bundle-item.expanded .bundle-main {
1785
+ display: flex;
1786
+ align-items: flex-start;
1787
+ gap: 16px;
1788
+ width: 100%;
1789
+ }
1790
+
1791
+ .bundle-radio {
1792
+ margin-top: 2px;
1793
+ accent-color: var(--color-accent);
1794
+ width: 18px;
1795
+ height: 18px;
1796
+ flex-shrink: 0;
1797
+ }
1798
+
1799
+ .bundle-info {
1800
+ flex: 1;
1801
+ min-width: 0;
1802
+ }
1803
+
1804
+ .bundle-name {
1805
+ font-weight: 600;
1806
+ font-size: 15px;
1807
+ color: var(--color-text);
1808
+ margin-bottom: 4px;
1809
+ display: flex;
1810
+ align-items: center;
1811
+ gap: 8px;
1812
+ }
1813
+
1814
+ .bundle-skill-count {
1815
+ font-size: 11px;
1816
+ padding: 2px 8px;
1817
+ background: var(--color-surface-muted);
1818
+ border: 1px solid var(--color-border);
1819
+ border-radius: 999px;
1820
+ color: var(--color-text-muted);
1821
+ font-weight: 500;
1822
+ }
1823
+
1824
+ .bundle-description {
1825
+ font-size: 13px;
1826
+ color: var(--color-text-muted);
1827
+ line-height: 1.5;
1828
+ }
1829
+
1830
+ /* Skills list within a bundle */
1831
+ .bundle-skills-list {
1832
+ width: 100%;
1833
+ margin-top: 12px;
1834
+ padding-top: 12px;
1835
+ border-top: 1px solid var(--color-border);
1836
+ }
1837
+
1838
+ .bundle-skills-list-header {
1839
+ display: flex;
1840
+ align-items: center;
1841
+ justify-content: space-between;
1842
+ margin-bottom: 8px;
1843
+ font-size: 12px;
1844
+ color: var(--color-text-muted);
1845
+ }
1846
+
1847
+ .bundle-skills-list-header button {
1848
+ background: none;
1849
+ border: none;
1850
+ color: var(--color-accent);
1851
+ font-size: 12px;
1852
+ cursor: pointer;
1853
+ padding: 0;
1854
+ }
1855
+
1856
+ .bundle-skills-list-header button:hover {
1857
+ text-decoration: underline;
1858
+ }
1859
+
1860
+ .bundle-skills-checkboxes {
1861
+ display: flex;
1862
+ flex-direction: column;
1863
+ gap: 6px;
1864
+ max-height: 150px;
1865
+ overflow-y: auto;
1866
+ padding-right: 8px;
1867
+ }
1868
+
1869
+ .bundle-skill-checkbox {
1870
+ display: flex;
1871
+ align-items: center;
1872
+ gap: 8px;
1873
+ font-size: 13px;
1874
+ color: var(--color-text);
1875
+ cursor: pointer;
1876
+ padding: 6px 8px;
1877
+ border-radius: var(--radius-small);
1878
+ transition: background-color 0.15s ease;
1879
+ }
1880
+
1881
+ .bundle-skill-checkbox:hover {
1882
+ background: var(--color-surface-muted);
1883
+ }
1884
+
1885
+ .bundle-skill-checkbox input[type="checkbox"] {
1886
+ accent-color: var(--color-accent);
1887
+ width: 16px;
1888
+ height: 16px;
1889
+ flex-shrink: 0;
1890
+ }
1891
+
1892
+ .bundle-skill-checkbox .skill-path {
1893
+ font-family: var(--font-mono);
1894
+ color: var(--color-text-muted);
1895
+ font-size: 11px;
1896
+ margin-left: 8px;
1897
+ }
1898
+
1899
+ .bundle-skill-checkbox.imported {
1900
+ opacity: 0.5;
1901
+ cursor: not-allowed;
1902
+ }
1903
+
1904
+ .bundle-skill-checkbox.imported::after {
1905
+ content: '(imported)';
1906
+ font-size: 10px;
1907
+ color: var(--color-success);
1908
+ margin-left: auto;
1909
+ }
1910
+
1911
+ /* Section divider */
1912
+ .section-divider {
1913
+ display: flex;
1914
+ align-items: center;
1915
+ gap: 16px;
1916
+ margin: 20px 0;
1917
+ color: var(--color-text-muted);
1918
+ font-size: 12px;
1919
+ }
1920
+
1921
+ .section-divider::before,
1922
+ .section-divider::after {
1923
+ content: '';
1924
+ flex: 1;
1925
+ height: 1px;
1926
+ background: var(--color-border);
1927
+ }
1928
+
1929
+ /* Probing state */
1930
+ .probe-loading {
1931
+ display: flex;
1932
+ align-items: center;
1933
+ gap: 8px;
1934
+ padding: 16px;
1935
+ color: var(--color-text-muted);
1936
+ font-size: 13px;
1937
+ }
1938
+
1939
+ .probe-loading .loading-spinner {
1940
+ width: 16px;
1941
+ height: 16px;
1942
+ }
1943
+
1944
+ /* Marketplace source badge */
1945
+ .skill-source-badge.source-marketplace {
1946
+ background: rgba(139, 92, 246, 0.1);
1947
+ color: #8b5cf6;
1948
+ border: 1px solid rgba(139, 92, 246, 0.3);
1949
+ }