@autocode-cli/autocode 0.0.43 → 0.1.4

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 (106) hide show
  1. package/LICENSE +5 -5
  2. package/LICENSE.fr.md +203 -0
  3. package/README.md +48 -15
  4. package/dist/cli/parser.d.ts +1 -1
  5. package/dist/cli/parser.d.ts.map +1 -1
  6. package/dist/cli/parser.js +5 -4
  7. package/dist/cli/parser.js.map +1 -1
  8. package/dist/index.js +4 -1
  9. package/dist/index.js.map +1 -1
  10. package/dist/server/api.d.ts.map +1 -1
  11. package/dist/server/api.js +47 -7
  12. package/dist/server/api.js.map +1 -1
  13. package/dist/server/dashboard/index.d.ts +10 -0
  14. package/dist/server/dashboard/index.d.ts.map +1 -0
  15. package/dist/server/dashboard/index.js +16 -0
  16. package/dist/server/dashboard/index.js.map +1 -0
  17. package/dist/server/dashboard/pages/column-edit.d.ts +8 -0
  18. package/dist/server/dashboard/pages/column-edit.d.ts.map +1 -0
  19. package/dist/server/dashboard/pages/column-edit.js +303 -0
  20. package/dist/server/dashboard/pages/column-edit.js.map +1 -0
  21. package/dist/server/dashboard/pages/column-prompt.d.ts +8 -0
  22. package/dist/server/dashboard/pages/column-prompt.d.ts.map +1 -0
  23. package/dist/server/dashboard/pages/column-prompt.js +228 -0
  24. package/dist/server/dashboard/pages/column-prompt.js.map +1 -0
  25. package/dist/server/dashboard/pages/column-terminal.d.ts +8 -0
  26. package/dist/server/dashboard/pages/column-terminal.d.ts.map +1 -0
  27. package/dist/server/dashboard/pages/column-terminal.js +529 -0
  28. package/dist/server/dashboard/pages/column-terminal.js.map +1 -0
  29. package/dist/server/dashboard/pages/index.d.ts +12 -0
  30. package/dist/server/dashboard/pages/index.d.ts.map +1 -0
  31. package/dist/server/dashboard/pages/index.js +12 -0
  32. package/dist/server/dashboard/pages/index.js.map +1 -0
  33. package/dist/server/dashboard/pages/main-dashboard.d.ts +11 -0
  34. package/dist/server/dashboard/pages/main-dashboard.d.ts.map +1 -0
  35. package/dist/server/dashboard/pages/main-dashboard.js +209 -0
  36. package/dist/server/dashboard/pages/main-dashboard.js.map +1 -0
  37. package/dist/server/dashboard/pages/shared.d.ts +8 -0
  38. package/dist/server/dashboard/pages/shared.d.ts.map +1 -0
  39. package/dist/server/dashboard/pages/shared.js +58 -0
  40. package/dist/server/dashboard/pages/shared.js.map +1 -0
  41. package/dist/server/dashboard/pages/ticket-view.d.ts +8 -0
  42. package/dist/server/dashboard/pages/ticket-view.d.ts.map +1 -0
  43. package/dist/server/dashboard/pages/ticket-view.js +1364 -0
  44. package/dist/server/dashboard/pages/ticket-view.js.map +1 -0
  45. package/dist/server/dashboard/scripts/index.d.ts +11 -0
  46. package/dist/server/dashboard/scripts/index.d.ts.map +1 -0
  47. package/dist/server/dashboard/scripts/index.js +1325 -0
  48. package/dist/server/dashboard/scripts/index.js.map +1 -0
  49. package/dist/server/dashboard/styles/base.d.ts +5 -0
  50. package/dist/server/dashboard/styles/base.d.ts.map +1 -0
  51. package/dist/server/dashboard/styles/base.js +110 -0
  52. package/dist/server/dashboard/styles/base.js.map +1 -0
  53. package/dist/server/dashboard/styles/board.d.ts +5 -0
  54. package/dist/server/dashboard/styles/board.d.ts.map +1 -0
  55. package/dist/server/dashboard/styles/board.js +168 -0
  56. package/dist/server/dashboard/styles/board.js.map +1 -0
  57. package/dist/server/dashboard/styles/comments.d.ts +5 -0
  58. package/dist/server/dashboard/styles/comments.d.ts.map +1 -0
  59. package/dist/server/dashboard/styles/comments.js +249 -0
  60. package/dist/server/dashboard/styles/comments.js.map +1 -0
  61. package/dist/server/dashboard/styles/components.d.ts +5 -0
  62. package/dist/server/dashboard/styles/components.d.ts.map +1 -0
  63. package/dist/server/dashboard/styles/components.js +190 -0
  64. package/dist/server/dashboard/styles/components.js.map +1 -0
  65. package/dist/server/dashboard/styles/footer.d.ts +5 -0
  66. package/dist/server/dashboard/styles/footer.d.ts.map +1 -0
  67. package/dist/server/dashboard/styles/footer.js +32 -0
  68. package/dist/server/dashboard/styles/footer.js.map +1 -0
  69. package/dist/server/dashboard/styles/index.d.ts +8 -0
  70. package/dist/server/dashboard/styles/index.d.ts.map +1 -0
  71. package/dist/server/dashboard/styles/index.js +27 -0
  72. package/dist/server/dashboard/styles/index.js.map +1 -0
  73. package/dist/server/dashboard/styles/logs.d.ts +5 -0
  74. package/dist/server/dashboard/styles/logs.d.ts.map +1 -0
  75. package/dist/server/dashboard/styles/logs.js +89 -0
  76. package/dist/server/dashboard/styles/logs.js.map +1 -0
  77. package/dist/server/dashboard/styles/notifications.d.ts +5 -0
  78. package/dist/server/dashboard/styles/notifications.d.ts.map +1 -0
  79. package/dist/server/dashboard/styles/notifications.js +51 -0
  80. package/dist/server/dashboard/styles/notifications.js.map +1 -0
  81. package/dist/server/dashboard/styles/variables.d.ts +5 -0
  82. package/dist/server/dashboard/styles/variables.d.ts.map +1 -0
  83. package/dist/server/dashboard/styles/variables.js +29 -0
  84. package/dist/server/dashboard/styles/variables.js.map +1 -0
  85. package/dist/server/dashboard/utils.d.ts +8 -0
  86. package/dist/server/dashboard/utils.d.ts.map +1 -0
  87. package/dist/server/dashboard/utils.js +14 -0
  88. package/dist/server/dashboard/utils.js.map +1 -0
  89. package/dist/server/dashboard.d.ts +5 -21
  90. package/dist/server/dashboard.d.ts.map +1 -1
  91. package/dist/server/dashboard.js +5 -4843
  92. package/dist/server/dashboard.js.map +1 -1
  93. package/dist/server/websocket.d.ts +12 -0
  94. package/dist/server/websocket.d.ts.map +1 -1
  95. package/dist/server/websocket.js +19 -0
  96. package/dist/server/websocket.js.map +1 -1
  97. package/dist/services/claude.d.ts.map +1 -1
  98. package/dist/services/claude.js +4 -1
  99. package/dist/services/claude.js.map +1 -1
  100. package/dist/utils/config.d.ts +1 -1
  101. package/dist/utils/config.js +1 -1
  102. package/dist/utils/version-check.d.ts +26 -0
  103. package/dist/utils/version-check.d.ts.map +1 -0
  104. package/dist/utils/version-check.js +234 -0
  105. package/dist/utils/version-check.js.map +1 -0
  106. package/package.json +2 -2
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Dashboard module main entry point
3
+ *
4
+ * This module aggregates and exports all dashboard functionality.
5
+ */
6
+ // Export utilities
7
+ export { escapeHtml } from './utils.js';
8
+ // Export styles
9
+ export { getStyles } from './styles/index.js';
10
+ // Export scripts
11
+ export { getScript } from './scripts/index.js';
12
+ // Export pages
13
+ export { generateDashboard } from './pages/main-dashboard.js';
14
+ // Re-export other page generators from the parent file for now
15
+ // These can be migrated incrementally later
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/server/dashboard/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,mBAAmB;AACnB,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,gBAAgB;AAChB,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE9C,iBAAiB;AACjB,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,eAAe;AACf,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAE9D,+DAA+D;AAC/D,4CAA4C"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Column edit page generator
3
+ */
4
+ /**
5
+ * Generate the column edit page
6
+ */
7
+ export declare function generateColumnEditPage(slug: string, lang: string): string;
8
+ //# sourceMappingURL=column-edit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"column-edit.d.ts","sourceRoot":"","sources":["../../../../src/server/dashboard/pages/column-edit.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAsSzE"}
@@ -0,0 +1,303 @@
1
+ /**
2
+ * Column edit page generator
3
+ */
4
+ import { getColumns } from '../../../core/column.js';
5
+ import { escapeHtml } from '../utils.js';
6
+ /**
7
+ * Generate the column edit page
8
+ */
9
+ export function generateColumnEditPage(slug, lang) {
10
+ const columns = getColumns();
11
+ const column = columns.find(c => c.slug === slug);
12
+ const columnName = column?.name || slug;
13
+ return `<!DOCTYPE html>
14
+ <html lang="${lang}">
15
+ <head>
16
+ <meta charset="UTF-8">
17
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
18
+ <title>Edit: ${escapeHtml(columnName)} - AutoCode</title>
19
+ <style>
20
+ :root {
21
+ --bg: #0d1117;
22
+ --bg-card: #161b22;
23
+ --border: #30363d;
24
+ --fg: #c9d1d9;
25
+ --muted: #8b949e;
26
+ --accent: #7c3aed;
27
+ --blue: #4dabf7;
28
+ --green: #22c55e;
29
+ --red: #ef4444;
30
+ }
31
+ * { margin: 0; padding: 0; box-sizing: border-box; }
32
+ body {
33
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
34
+ background: var(--bg);
35
+ color: var(--fg);
36
+ height: 100vh;
37
+ display: flex;
38
+ flex-direction: column;
39
+ }
40
+ .header {
41
+ background: var(--bg-card);
42
+ border-bottom: 1px solid var(--border);
43
+ padding: 16px 24px;
44
+ display: flex;
45
+ align-items: center;
46
+ gap: 16px;
47
+ }
48
+ .back-btn {
49
+ background: none;
50
+ border: 1px solid var(--border);
51
+ color: var(--fg);
52
+ padding: 8px 12px;
53
+ border-radius: 6px;
54
+ cursor: pointer;
55
+ font-size: 14px;
56
+ display: flex;
57
+ align-items: center;
58
+ gap: 6px;
59
+ text-decoration: none;
60
+ }
61
+ .back-btn:hover { border-color: var(--accent); color: var(--accent); }
62
+ .title {
63
+ flex: 1;
64
+ font-size: 18px;
65
+ font-weight: 600;
66
+ }
67
+ .title span { color: var(--muted); font-weight: 400; }
68
+ .lang-selector {
69
+ display: flex;
70
+ gap: 4px;
71
+ }
72
+ .lang-btn {
73
+ background: var(--bg);
74
+ border: 1px solid var(--border);
75
+ color: var(--muted);
76
+ padding: 6px 12px;
77
+ border-radius: 4px;
78
+ cursor: pointer;
79
+ font-size: 13px;
80
+ font-weight: 600;
81
+ }
82
+ .lang-btn.active { background: var(--accent); color: white; border-color: var(--accent); }
83
+ .lang-btn:hover:not(.active) { border-color: var(--accent); color: var(--fg); }
84
+ .actions {
85
+ display: flex;
86
+ gap: 8px;
87
+ }
88
+ .btn {
89
+ padding: 8px 16px;
90
+ border-radius: 6px;
91
+ font-size: 14px;
92
+ font-weight: 500;
93
+ cursor: pointer;
94
+ border: none;
95
+ }
96
+ .btn-save { background: var(--green); color: white; }
97
+ .btn-save:hover { opacity: 0.9; }
98
+ .btn-save:disabled { opacity: 0.5; cursor: not-allowed; }
99
+ .editor-container {
100
+ flex: 1;
101
+ padding: 16px 24px;
102
+ display: flex;
103
+ flex-direction: column;
104
+ overflow: hidden;
105
+ }
106
+ .editor {
107
+ flex: 1;
108
+ width: 100%;
109
+ background: var(--bg-card);
110
+ border: 1px solid var(--border);
111
+ border-radius: 8px;
112
+ color: var(--fg);
113
+ font-family: 'JetBrains Mono', 'Fira Code', monospace;
114
+ font-size: 14px;
115
+ line-height: 1.6;
116
+ padding: 16px;
117
+ resize: none;
118
+ outline: none;
119
+ }
120
+ .editor:focus { border-color: var(--accent); }
121
+ .status-bar {
122
+ display: flex;
123
+ justify-content: space-between;
124
+ align-items: center;
125
+ padding: 8px 0;
126
+ font-size: 12px;
127
+ color: var(--muted);
128
+ }
129
+ .status-bar .modified { color: var(--accent); font-weight: 600; }
130
+ .status-bar .saved { color: var(--green); }
131
+ .notification {
132
+ position: fixed;
133
+ bottom: 24px;
134
+ right: 24px;
135
+ background: var(--bg-card);
136
+ border: 1px solid var(--border);
137
+ border-left: 3px solid var(--green);
138
+ padding: 12px 16px;
139
+ border-radius: 6px;
140
+ font-size: 14px;
141
+ opacity: 0;
142
+ transform: translateY(10px);
143
+ transition: all 0.3s;
144
+ z-index: 100;
145
+ }
146
+ .notification.show { opacity: 1; transform: translateY(0); }
147
+ .notification.error { border-left-color: var(--red); }
148
+ </style>
149
+ </head>
150
+ <body>
151
+ <header class="header">
152
+ <a href="/" class="back-btn">← Dashboard</a>
153
+ <h1 class="title">${escapeHtml(columnName)} <span>/ ACTION.md</span></h1>
154
+ <div class="lang-selector" id="lang-selector">
155
+ <button class="lang-btn" data-lang="en">EN</button>
156
+ <button class="lang-btn" data-lang="fr">FR</button>
157
+ </div>
158
+ <div class="actions">
159
+ <button class="btn btn-save" id="saveBtn" disabled>Save</button>
160
+ </div>
161
+ </header>
162
+ <div class="editor-container">
163
+ <div class="status-bar">
164
+ <span id="status">Loading...</span>
165
+ <span id="path">${slug}/ACTION.${lang}.md</span>
166
+ </div>
167
+ <textarea class="editor" id="editor" placeholder="Loading..."></textarea>
168
+ </div>
169
+ <div class="notification" id="notification"></div>
170
+
171
+ <script>
172
+ const STORAGE_KEY = 'autocode-lang';
173
+ const slug = '${slug}';
174
+ let currentLang = localStorage.getItem(STORAGE_KEY) || 'fr';
175
+ let originalContent = '';
176
+ let hasChanges = false;
177
+
178
+ const editor = document.getElementById('editor');
179
+ const saveBtn = document.getElementById('saveBtn');
180
+ const status = document.getElementById('status');
181
+ const pathEl = document.getElementById('path');
182
+ const notification = document.getElementById('notification');
183
+
184
+ // Update UI to reflect current language
185
+ function updateLangUI() {
186
+ document.querySelectorAll('.lang-btn').forEach(btn => {
187
+ btn.classList.toggle('active', btn.dataset.lang === currentLang);
188
+ });
189
+ pathEl.textContent = slug + '/ACTION.' + currentLang + '.md';
190
+ }
191
+
192
+ // Load content
193
+ async function loadContent() {
194
+ try {
195
+ status.textContent = 'Loading...';
196
+ status.className = '';
197
+ const res = await fetch('/api/columns/' + slug + '/actions?lang=' + currentLang);
198
+ const data = await res.json();
199
+ if (data.success) {
200
+ originalContent = data.data.content || '';
201
+ editor.value = originalContent;
202
+ pathEl.textContent = slug + '/ACTION.' + currentLang + '.md';
203
+ checkChanges();
204
+ status.textContent = 'Ready';
205
+ } else {
206
+ status.textContent = 'Error: ' + (data.error || 'Failed to load');
207
+ }
208
+ } catch (e) {
209
+ status.textContent = 'Error: ' + e.message;
210
+ }
211
+ }
212
+
213
+ // Save content
214
+ async function saveContent() {
215
+ if (!hasChanges) return;
216
+ try {
217
+ saveBtn.disabled = true;
218
+ saveBtn.textContent = 'Saving...';
219
+ const res = await fetch('/api/columns/' + slug + '/actions?lang=' + currentLang, {
220
+ method: 'POST',
221
+ headers: { 'Content-Type': 'application/json' },
222
+ body: JSON.stringify({ content: editor.value })
223
+ });
224
+ const data = await res.json();
225
+ if (data.success) {
226
+ originalContent = editor.value;
227
+ hasChanges = false;
228
+ checkChanges();
229
+ showNotification('Saved successfully!', false);
230
+ } else {
231
+ showNotification('Error: ' + (data.error || 'Failed to save'), true);
232
+ }
233
+ } catch (e) {
234
+ showNotification('Error: ' + e.message, true);
235
+ } finally {
236
+ saveBtn.textContent = 'Save';
237
+ }
238
+ }
239
+
240
+ // Check for changes
241
+ function checkChanges() {
242
+ hasChanges = editor.value !== originalContent;
243
+ saveBtn.disabled = !hasChanges;
244
+ if (hasChanges) {
245
+ status.textContent = 'Modified (unsaved)';
246
+ status.className = 'modified';
247
+ } else {
248
+ status.textContent = 'Saved';
249
+ status.className = 'saved';
250
+ }
251
+ }
252
+
253
+ // Show notification
254
+ function showNotification(msg, isError) {
255
+ notification.textContent = msg;
256
+ notification.className = 'notification show' + (isError ? ' error' : '');
257
+ setTimeout(() => notification.className = 'notification', 3000);
258
+ }
259
+
260
+ // Event listeners
261
+ editor.addEventListener('input', checkChanges);
262
+ saveBtn.addEventListener('click', saveContent);
263
+
264
+ // Ctrl+S to save
265
+ document.addEventListener('keydown', e => {
266
+ if ((e.ctrlKey || e.metaKey) && e.key === 's') {
267
+ e.preventDefault();
268
+ if (hasChanges) saveContent();
269
+ }
270
+ });
271
+
272
+ // Language switcher
273
+ document.querySelectorAll('.lang-btn').forEach(btn => {
274
+ btn.addEventListener('click', () => {
275
+ const newLang = btn.dataset.lang;
276
+ if (newLang !== currentLang) {
277
+ if (hasChanges && !confirm('You have unsaved changes. Switch language anyway?')) {
278
+ return;
279
+ }
280
+ currentLang = newLang;
281
+ localStorage.setItem(STORAGE_KEY, newLang);
282
+ updateLangUI();
283
+ loadContent();
284
+ }
285
+ });
286
+ });
287
+
288
+ // Warn before leaving with unsaved changes
289
+ window.addEventListener('beforeunload', e => {
290
+ if (hasChanges) {
291
+ e.preventDefault();
292
+ e.returnValue = '';
293
+ }
294
+ });
295
+
296
+ // Init
297
+ updateLangUI();
298
+ loadContent();
299
+ </script>
300
+ </body>
301
+ </html>`;
302
+ }
303
+ //# sourceMappingURL=column-edit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"column-edit.js","sourceRoot":"","sources":["../../../../src/server/dashboard/pages/column-edit.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAAY,EAAE,IAAY;IAC/D,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IAClD,MAAM,UAAU,GAAG,MAAM,EAAE,IAAI,IAAI,IAAI,CAAC;IAExC,OAAO;cACK,IAAI;;;;iBAID,UAAU,CAAC,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBAuIf,UAAU,CAAC,UAAU,CAAC;;;;;;;;;;;;wBAYtB,IAAI,WAAW,IAAI;;;;;;;;oBAQvB,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAgIhB,CAAC;AACT,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Column prompt page generator
3
+ */
4
+ /**
5
+ * Generate the column prompt page
6
+ */
7
+ export declare function generateColumnPromptPage(ticketKey: string, columnSlug: string, lang: string): string;
8
+ //# sourceMappingURL=column-prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"column-prompt.d.ts","sourceRoot":"","sources":["../../../../src/server/dashboard/pages/column-prompt.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CA0NpG"}
@@ -0,0 +1,228 @@
1
+ /**
2
+ * Column prompt page generator
3
+ */
4
+ import { getConfig } from '../../../utils/config.js';
5
+ import { getTicket } from '../../../core/ticket.js';
6
+ import { escapeHtml } from '../utils.js';
7
+ import { generate404Page } from './shared.js';
8
+ /**
9
+ * Generate the column prompt page
10
+ */
11
+ export function generateColumnPromptPage(ticketKey, columnSlug, lang) {
12
+ const config = getConfig();
13
+ const ticket = getTicket(config.root, ticketKey);
14
+ if (!ticket) {
15
+ return generate404Page(ticketKey, lang);
16
+ }
17
+ return `<!DOCTYPE html>
18
+ <html lang="${lang}">
19
+ <head>
20
+ <meta charset="UTF-8">
21
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
22
+ <title>Prompt → ${escapeHtml(columnSlug)} | ${ticketKey} - AutoCode</title>
23
+ <style>
24
+ :root {
25
+ --bg: #0a0a0f;
26
+ --bg-secondary: #12121a;
27
+ --bg-tertiary: #1a1a24;
28
+ --text: #f1f5f9;
29
+ --muted: #94a3b8;
30
+ --border: #2a2a3a;
31
+ --accent: #6366f1;
32
+ --blue: #4dabf7;
33
+ --green: #4ade80;
34
+ --yellow: #facc15;
35
+ --orange: #fb923c;
36
+ --red: #f87171;
37
+ --purple: #a78bfa;
38
+ }
39
+ * { margin: 0; padding: 0; box-sizing: border-box; }
40
+ body {
41
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
42
+ background: var(--bg);
43
+ color: var(--text);
44
+ min-height: 100vh;
45
+ display: flex;
46
+ flex-direction: column;
47
+ }
48
+ .header {
49
+ display: flex;
50
+ align-items: center;
51
+ gap: 24px;
52
+ padding: 16px 24px;
53
+ background: var(--bg-secondary);
54
+ border-bottom: 1px solid var(--border);
55
+ position: sticky;
56
+ top: 0;
57
+ z-index: 100;
58
+ }
59
+ .back-btn {
60
+ color: var(--muted);
61
+ text-decoration: none;
62
+ font-size: 14px;
63
+ display: flex;
64
+ align-items: center;
65
+ gap: 8px;
66
+ padding: 8px 16px;
67
+ background: var(--bg-tertiary);
68
+ border-radius: 6px;
69
+ transition: all 0.2s;
70
+ }
71
+ .back-btn:hover { color: var(--text); background: var(--border); }
72
+ .ticket-key {
73
+ font-family: 'SF Mono', Monaco, monospace;
74
+ font-size: 12px;
75
+ color: var(--accent);
76
+ background: rgba(99, 102, 241, 0.15);
77
+ padding: 4px 10px;
78
+ border-radius: 4px;
79
+ font-weight: 600;
80
+ }
81
+ .column-slug {
82
+ font-family: 'SF Mono', Monaco, monospace;
83
+ font-size: 14px;
84
+ color: var(--yellow);
85
+ background: rgba(250, 204, 21, 0.15);
86
+ padding: 6px 12px;
87
+ border-radius: 4px;
88
+ font-weight: 500;
89
+ }
90
+ .page-title {
91
+ flex: 1;
92
+ font-size: 18px;
93
+ font-weight: 600;
94
+ display: flex;
95
+ align-items: center;
96
+ gap: 12px;
97
+ }
98
+ .main {
99
+ flex: 1;
100
+ padding: 24px;
101
+ display: flex;
102
+ flex-direction: column;
103
+ }
104
+ .prompt-container {
105
+ flex: 1;
106
+ background: var(--bg-secondary);
107
+ border: 1px solid var(--border);
108
+ border-radius: 12px;
109
+ display: flex;
110
+ flex-direction: column;
111
+ overflow: hidden;
112
+ }
113
+ .prompt-header {
114
+ display: flex;
115
+ align-items: center;
116
+ gap: 12px;
117
+ padding: 12px 16px;
118
+ background: var(--bg-tertiary);
119
+ border-bottom: 1px solid var(--border);
120
+ }
121
+ .prompt-status {
122
+ font-size: 12px;
123
+ padding: 4px 12px;
124
+ border-radius: 12px;
125
+ font-weight: 500;
126
+ }
127
+ .prompt-status.loaded { background: rgba(74, 222, 128, 0.15); color: var(--green); }
128
+ .prompt-status.loading { background: rgba(251, 146, 60, 0.15); color: var(--orange); }
129
+ .prompt-status.error { background: rgba(248, 113, 113, 0.15); color: var(--red); }
130
+ .prompt-content {
131
+ flex: 1;
132
+ padding: 24px;
133
+ overflow-y: auto;
134
+ font-size: 14px;
135
+ line-height: 1.6;
136
+ word-break: break-word;
137
+ }
138
+ .no-prompt {
139
+ color: var(--muted);
140
+ text-align: center;
141
+ padding: 48px;
142
+ font-size: 14px;
143
+ }
144
+ /* Markdown styles */
145
+ .prompt-content h1 { font-size: 1.8em; font-weight: 600; margin: 1em 0 0.5em 0; color: var(--text); font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; }
146
+ .prompt-content h2 { font-size: 1.5em; font-weight: 600; margin: 1em 0 0.5em 0; color: var(--text); font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; }
147
+ .prompt-content h3 { font-size: 1.25em; font-weight: 600; margin: 1em 0 0.5em 0; color: var(--text); font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; }
148
+ .prompt-content h4, .prompt-content h5, .prompt-content h6 { font-size: 1.1em; font-weight: 600; margin: 1em 0 0.5em 0; color: var(--text); font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; }
149
+ .prompt-content p { margin: 0.8em 0; }
150
+ .prompt-content ul, .prompt-content ol { margin: 0.8em 0; padding-left: 2em; }
151
+ .prompt-content li { margin: 0.3em 0; }
152
+ .prompt-content code { background: var(--bg-tertiary); padding: 2px 6px; border-radius: 4px; font-size: 0.9em; }
153
+ .prompt-content pre { background: var(--bg-tertiary); padding: 16px; border-radius: 8px; overflow-x: auto; margin: 1em 0; }
154
+ .prompt-content pre code { background: none; padding: 0; }
155
+ .prompt-content blockquote { border-left: 3px solid var(--accent); padding-left: 16px; margin: 1em 0; color: var(--muted); font-style: italic; }
156
+ .prompt-content a { color: var(--blue); text-decoration: none; }
157
+ .prompt-content a:hover { text-decoration: underline; }
158
+ .prompt-content hr { border: none; border-top: 1px solid var(--border); margin: 1.5em 0; }
159
+ .prompt-content table { border-collapse: collapse; width: 100%; margin: 1em 0; }
160
+ .prompt-content th, .prompt-content td { border: 1px solid var(--border); padding: 8px 12px; text-align: left; }
161
+ .prompt-content th { background: var(--bg-tertiary); }
162
+ .prompt-content strong { font-weight: 600; }
163
+ .prompt-content em { font-style: italic; }
164
+ </style>
165
+ <script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
166
+ </head>
167
+ <body>
168
+ <header class="header">
169
+ <a href="/ticket/${ticketKey}" class="back-btn">← Retour</a>
170
+ <span class="ticket-key">${ticketKey}</span>
171
+ <div class="page-title">
172
+ <span>Prompt →</span>
173
+ <span class="column-slug">${escapeHtml(columnSlug)}</span>
174
+ </div>
175
+ </header>
176
+
177
+ <main class="main">
178
+ <div class="prompt-container">
179
+ <div class="prompt-header">
180
+ <span class="prompt-status loading" id="prompt-status">Chargement...</span>
181
+ </div>
182
+ <div class="prompt-content" id="prompt-content">
183
+ <div class="no-prompt">Chargement du prompt...</div>
184
+ </div>
185
+ </div>
186
+ </main>
187
+
188
+ <script>
189
+ const TICKET_KEY = '${ticketKey}';
190
+ const COLUMN_SLUG = '${escapeHtml(columnSlug)}';
191
+
192
+ function escapeHtml(str) {
193
+ if (typeof str !== 'string') return '';
194
+ return str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
195
+ }
196
+
197
+ async function fetchPrompt() {
198
+ const content = document.getElementById('prompt-content');
199
+ const status = document.getElementById('prompt-status');
200
+
201
+ try {
202
+ const res = await fetch('/api/tickets/' + TICKET_KEY + '/prompt/' + COLUMN_SLUG);
203
+ const json = await res.json();
204
+
205
+ if (json.success && json.data && json.data.prompt) {
206
+ content.innerHTML = marked.parse(json.data.prompt);
207
+ status.className = 'prompt-status loaded';
208
+ status.textContent = 'Chargé';
209
+ } else {
210
+ content.innerHTML = '<div class="no-prompt">Aucun prompt disponible pour cette colonne.</div>';
211
+ status.className = 'prompt-status error';
212
+ status.textContent = 'Non disponible';
213
+ }
214
+ } catch (e) {
215
+ console.error('Prompt fetch error:', e);
216
+ content.innerHTML = '<div class="no-prompt">Erreur de chargement.</div>';
217
+ status.className = 'prompt-status error';
218
+ status.textContent = 'Erreur';
219
+ }
220
+ }
221
+
222
+ // Init
223
+ fetchPrompt();
224
+ </script>
225
+ </body>
226
+ </html>`;
227
+ }
228
+ //# sourceMappingURL=column-prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"column-prompt.js","sourceRoot":"","sources":["../../../../src/server/dashboard/pages/column-prompt.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,SAAiB,EAAE,UAAkB,EAAE,IAAY;IAC1F,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAEjD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,eAAe,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO;cACK,IAAI;;;;oBAIE,UAAU,CAAC,UAAU,CAAC,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uBAmJlC,SAAS;+BACD,SAAS;;;kCAGN,UAAU,CAAC,UAAU,CAAC;;;;;;;;;;;;;;;;0BAgB9B,SAAS;2BACR,UAAU,CAAC,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAoCzC,CAAC;AACT,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Column terminal page generator
3
+ */
4
+ /**
5
+ * Generate the column terminal page
6
+ */
7
+ export declare function generateColumnTerminalPage(ticketKey: string, columnSlug: string, lang: string): string;
8
+ //# sourceMappingURL=column-terminal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"column-terminal.d.ts","sourceRoot":"","sources":["../../../../src/server/dashboard/pages/column-terminal.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAugBtG"}