@autocode-cli/autocode 0.1.14 → 0.1.17

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 (211) hide show
  1. package/README.md +38 -38
  2. package/dist/cli/commands/comment.d.ts +1 -1
  3. package/dist/cli/commands/comment.js +11 -11
  4. package/dist/cli/commands/comment.js.map +1 -1
  5. package/dist/cli/commands/init.js +1 -1
  6. package/dist/cli/commands/init.js.map +1 -1
  7. package/dist/cli/commands/list.d.ts +1 -1
  8. package/dist/cli/commands/list.d.ts.map +1 -1
  9. package/dist/cli/commands/list.js +65 -22
  10. package/dist/cli/commands/list.js.map +1 -1
  11. package/dist/cli/commands/move.d.ts +1 -1
  12. package/dist/cli/commands/move.js +12 -12
  13. package/dist/cli/commands/move.js.map +1 -1
  14. package/dist/cli/commands/new.d.ts +1 -1
  15. package/dist/cli/commands/new.d.ts.map +1 -1
  16. package/dist/cli/commands/new.js +26 -13
  17. package/dist/cli/commands/new.js.map +1 -1
  18. package/dist/cli/commands/next.d.ts +1 -1
  19. package/dist/cli/commands/next.js +15 -15
  20. package/dist/cli/commands/next.js.map +1 -1
  21. package/dist/cli/commands/parent.d.ts +9 -0
  22. package/dist/cli/commands/parent.d.ts.map +1 -0
  23. package/dist/cli/commands/parent.js +94 -0
  24. package/dist/cli/commands/parent.js.map +1 -0
  25. package/dist/cli/commands/serve.js +8 -8
  26. package/dist/cli/commands/serve.js.map +1 -1
  27. package/dist/cli/commands/show.d.ts +1 -1
  28. package/dist/cli/commands/show.d.ts.map +1 -1
  29. package/dist/cli/commands/show.js +51 -31
  30. package/dist/cli/commands/show.js.map +1 -1
  31. package/dist/cli/commands/stats.js +2 -2
  32. package/dist/cli/commands/stats.js.map +1 -1
  33. package/dist/cli/commands/sync.js +3 -3
  34. package/dist/cli/commands/sync.js.map +1 -1
  35. package/dist/cli/parser.d.ts.map +1 -1
  36. package/dist/cli/parser.js +5 -3
  37. package/dist/cli/parser.js.map +1 -1
  38. package/dist/core/column.js +2 -2
  39. package/dist/core/column.js.map +1 -1
  40. package/dist/core/hierarchy.d.ts +97 -0
  41. package/dist/core/hierarchy.d.ts.map +1 -0
  42. package/dist/core/hierarchy.js +274 -0
  43. package/dist/core/hierarchy.js.map +1 -0
  44. package/dist/core/issue.d.ts +62 -0
  45. package/dist/core/issue.d.ts.map +1 -0
  46. package/dist/core/issue.js +247 -0
  47. package/dist/core/issue.js.map +1 -0
  48. package/dist/core/sync.d.ts +9 -9
  49. package/dist/core/sync.d.ts.map +1 -1
  50. package/dist/core/sync.js +61 -58
  51. package/dist/core/sync.js.map +1 -1
  52. package/dist/core/workflow.d.ts +22 -20
  53. package/dist/core/workflow.d.ts.map +1 -1
  54. package/dist/core/workflow.js +68 -51
  55. package/dist/core/workflow.js.map +1 -1
  56. package/dist/index.d.ts +1 -1
  57. package/dist/index.js +1 -1
  58. package/dist/server/api-autocomplete.test.d.ts +6 -0
  59. package/dist/server/api-autocomplete.test.d.ts.map +1 -0
  60. package/dist/server/api-autocomplete.test.js +249 -0
  61. package/dist/server/api-autocomplete.test.js.map +1 -0
  62. package/dist/server/api.d.ts.map +1 -1
  63. package/dist/server/api.js +216 -106
  64. package/dist/server/api.js.map +1 -1
  65. package/dist/server/dashboard/pages/column-prompt.d.ts +1 -1
  66. package/dist/server/dashboard/pages/column-prompt.d.ts.map +1 -1
  67. package/dist/server/dashboard/pages/column-prompt.js +11 -11
  68. package/dist/server/dashboard/pages/column-prompt.js.map +1 -1
  69. package/dist/server/dashboard/pages/column-terminal.d.ts +1 -1
  70. package/dist/server/dashboard/pages/column-terminal.d.ts.map +1 -1
  71. package/dist/server/dashboard/pages/column-terminal.js +14 -14
  72. package/dist/server/dashboard/pages/column-terminal.js.map +1 -1
  73. package/dist/server/dashboard/pages/index.d.ts +3 -1
  74. package/dist/server/dashboard/pages/index.d.ts.map +1 -1
  75. package/dist/server/dashboard/pages/index.js +3 -1
  76. package/dist/server/dashboard/pages/index.js.map +1 -1
  77. package/dist/server/dashboard/pages/issue-graph.d.ts +9 -0
  78. package/dist/server/dashboard/pages/issue-graph.d.ts.map +1 -0
  79. package/dist/server/dashboard/pages/issue-graph.js +581 -0
  80. package/dist/server/dashboard/pages/issue-graph.js.map +1 -0
  81. package/dist/server/dashboard/pages/issue-view.d.ts +8 -0
  82. package/dist/server/dashboard/pages/issue-view.d.ts.map +1 -0
  83. package/dist/server/dashboard/pages/{ticket-view.js → issue-view.js} +128 -128
  84. package/dist/server/dashboard/pages/issue-view.js.map +1 -0
  85. package/dist/server/dashboard/pages/main-dashboard.js +21 -21
  86. package/dist/server/dashboard/pages/main-dashboard.js.map +1 -1
  87. package/dist/server/dashboard/pages/new-issue.d.ts +8 -0
  88. package/dist/server/dashboard/pages/new-issue.d.ts.map +1 -0
  89. package/dist/server/dashboard/pages/new-issue.js +648 -0
  90. package/dist/server/dashboard/pages/new-issue.js.map +1 -0
  91. package/dist/server/dashboard/pages/new-issue.test.d.ts +6 -0
  92. package/dist/server/dashboard/pages/new-issue.test.d.ts.map +1 -0
  93. package/dist/server/dashboard/pages/new-issue.test.js +349 -0
  94. package/dist/server/dashboard/pages/new-issue.test.js.map +1 -0
  95. package/dist/server/dashboard/pages/pipeline-configurator.js +1 -1
  96. package/dist/server/dashboard/pages/shared.d.ts +2 -2
  97. package/dist/server/dashboard/pages/shared.d.ts.map +1 -1
  98. package/dist/server/dashboard/pages/shared.js +5 -5
  99. package/dist/server/dashboard/pages/shared.js.map +1 -1
  100. package/dist/server/dashboard/pages/stats-page.js +11 -11
  101. package/dist/server/dashboard/scripts/index.js +134 -134
  102. package/dist/server/dashboard/styles/board.d.ts +1 -1
  103. package/dist/server/dashboard/styles/board.js +10 -10
  104. package/dist/server/dashboard.d.ts +1 -1
  105. package/dist/server/dashboard.d.ts.map +1 -1
  106. package/dist/server/dashboard.js +1 -1
  107. package/dist/server/dashboard.js.map +1 -1
  108. package/dist/server/index.d.ts.map +1 -1
  109. package/dist/server/index.js +40 -24
  110. package/dist/server/index.js.map +1 -1
  111. package/dist/server/websocket.d.ts +6 -6
  112. package/dist/server/websocket.d.ts.map +1 -1
  113. package/dist/server/websocket.js +10 -10
  114. package/dist/server/websocket.js.map +1 -1
  115. package/dist/services/claude.d.ts +13 -13
  116. package/dist/services/claude.d.ts.map +1 -1
  117. package/dist/services/claude.js +98 -98
  118. package/dist/services/claude.js.map +1 -1
  119. package/dist/services/issue-io.d.ts +81 -0
  120. package/dist/services/issue-io.d.ts.map +1 -0
  121. package/dist/services/{ticket-io.js → issue-io.js} +54 -53
  122. package/dist/services/issue-io.js.map +1 -0
  123. package/dist/services/stats.d.ts +2 -0
  124. package/dist/services/stats.d.ts.map +1 -1
  125. package/dist/services/stats.js.map +1 -1
  126. package/dist/types/index.d.ts +6 -4
  127. package/dist/types/index.d.ts.map +1 -1
  128. package/dist/utils/fs.d.ts +2 -2
  129. package/dist/utils/fs.d.ts.map +1 -1
  130. package/dist/utils/fs.js +2 -2
  131. package/dist/utils/fs.js.map +1 -1
  132. package/package.json +3 -3
  133. package/templates/catalog.yaml +2 -2
  134. package/templates/prompts/api-endpoints-test.en.md +2 -2
  135. package/templates/prompts/api-endpoints-test.fr.md +2 -2
  136. package/templates/prompts/backlog.en.md +6 -6
  137. package/templates/prompts/backlog.fr.md +1 -1
  138. package/templates/prompts/changelog.en.md +6 -6
  139. package/templates/prompts/changelog.fr.md +3 -3
  140. package/templates/prompts/dashboard-responsive.en.md +1 -1
  141. package/templates/prompts/deploy-prod.en.md +3 -3
  142. package/templates/prompts/deploy-prod.fr.md +3 -3
  143. package/templates/prompts/deploy-staging.en.md +3 -3
  144. package/templates/prompts/deploy-staging.fr.md +3 -3
  145. package/templates/prompts/design.en.md +5 -5
  146. package/templates/prompts/design.fr.md +3 -3
  147. package/templates/prompts/dev.en.md +4 -4
  148. package/templates/prompts/dev.fr.md +3 -3
  149. package/templates/prompts/done.en.md +5 -5
  150. package/templates/prompts/done.fr.md +2 -2
  151. package/templates/prompts/error-handling-review.en.md +1 -1
  152. package/templates/prompts/error-handling-review.fr.md +1 -1
  153. package/templates/prompts/file-watcher-test.en.md +4 -4
  154. package/templates/prompts/file-watcher-test.fr.md +1 -1
  155. package/templates/prompts/git-commit.en.md +5 -5
  156. package/templates/prompts/git-commit.fr.md +3 -3
  157. package/templates/prompts/git-push.en.md +3 -3
  158. package/templates/prompts/git-push.fr.md +3 -3
  159. package/templates/prompts/git-tag.en.md +3 -3
  160. package/templates/prompts/git-tag.fr.md +3 -3
  161. package/templates/prompts/in-progress.en.md +6 -6
  162. package/templates/prompts/in-progress.fr.md +3 -3
  163. package/templates/prompts/qualification.en.md +8 -8
  164. package/templates/prompts/qualification.fr.md +3 -3
  165. package/templates/prompts/retest-cypress.en.md +3 -3
  166. package/templates/prompts/retest-cypress.fr.md +3 -3
  167. package/templates/prompts/retest-playwright.en.md +4 -4
  168. package/templates/prompts/retest-playwright.fr.md +3 -3
  169. package/templates/prompts/retest.en.md +4 -4
  170. package/templates/prompts/retest.fr.md +3 -3
  171. package/templates/prompts/review-best-practices.en.md +3 -3
  172. package/templates/prompts/review-best-practices.fr.md +3 -3
  173. package/templates/prompts/review-code.en.md +4 -4
  174. package/templates/prompts/review-code.fr.md +3 -3
  175. package/templates/prompts/review-consistency.en.md +3 -3
  176. package/templates/prompts/review-consistency.fr.md +3 -3
  177. package/templates/prompts/review-no-duplication.en.md +3 -3
  178. package/templates/prompts/review-no-duplication.fr.md +3 -3
  179. package/templates/prompts/review-security.en.md +4 -4
  180. package/templates/prompts/review-security.fr.md +3 -3
  181. package/templates/prompts/specification.en.md +5 -5
  182. package/templates/prompts/specification.fr.md +3 -3
  183. package/templates/prompts/splitter.en.md +13 -13
  184. package/templates/prompts/splitter.fr.md +3 -3
  185. package/templates/prompts/template-validation.en.md +1 -1
  186. package/templates/prompts/template-validation.fr.md +1 -1
  187. package/templates/prompts/testing-coverage.en.md +1 -1
  188. package/templates/prompts/testing-coverage.fr.md +1 -1
  189. package/templates/prompts/testing-cypress.en.md +4 -4
  190. package/templates/prompts/testing-cypress.fr.md +3 -3
  191. package/templates/prompts/testing-integration.en.md +4 -4
  192. package/templates/prompts/testing-integration.fr.md +3 -3
  193. package/templates/prompts/testing-playwright.en.md +4 -4
  194. package/templates/prompts/testing-playwright.fr.md +3 -3
  195. package/templates/prompts/testing-unit.en.md +4 -4
  196. package/templates/prompts/testing-unit.fr.md +3 -3
  197. package/templates/prompts/update-docs.en.md +3 -3
  198. package/templates/prompts/update-docs.fr.md +3 -3
  199. package/templates/prompts/validate-staging.en.md +3 -3
  200. package/templates/prompts/validate-staging.fr.md +3 -3
  201. package/templates/prompts/websocket-test.en.md +1 -1
  202. package/dist/core/ticket.d.ts +0 -50
  203. package/dist/core/ticket.d.ts.map +0 -1
  204. package/dist/core/ticket.js +0 -224
  205. package/dist/core/ticket.js.map +0 -1
  206. package/dist/server/dashboard/pages/ticket-view.d.ts +0 -8
  207. package/dist/server/dashboard/pages/ticket-view.d.ts.map +0 -1
  208. package/dist/server/dashboard/pages/ticket-view.js.map +0 -1
  209. package/dist/services/ticket-io.d.ts +0 -80
  210. package/dist/services/ticket-io.d.ts.map +0 -1
  211. package/dist/services/ticket-io.js.map +0 -1
@@ -1,30 +1,30 @@
1
1
  /**
2
- * Ticket view page generator
2
+ * Issue view page generator
3
3
  */
4
4
  import { getConfig } from '../../../utils/config.js';
5
- import { getTicket } from '../../../core/ticket.js';
5
+ import { getIssue } from '../../../core/issue.js';
6
6
  import { getColumns } from '../../../core/column.js';
7
7
  import { escapeHtml } from '../utils.js';
8
8
  import { generate404Page } from './shared.js';
9
9
  /**
10
- * Generate the ticket view page
10
+ * Generate the issue view page
11
11
  */
12
- export function generateTicketViewPage(ticketKey, lang) {
12
+ export function generateIssueViewPage(issueKey, lang) {
13
13
  const config = getConfig();
14
- const ticket = getTicket(config.root, ticketKey);
14
+ const issue = getIssue(config.root, issueKey);
15
15
  const columns = getColumns();
16
- if (!ticket) {
17
- return generate404Page(ticketKey, lang);
16
+ if (!issue) {
17
+ return generate404Page(issueKey, lang);
18
18
  }
19
- const currentColumn = columns.find(c => c.slug === ticket.column_slug);
20
- const ticketData = JSON.stringify(ticket);
19
+ const currentColumn = columns.find(c => c.slug === issue.column_slug);
20
+ const issueData = JSON.stringify(issue);
21
21
  const columnsData = JSON.stringify(columns);
22
22
  return `<!DOCTYPE html>
23
23
  <html lang="${lang}">
24
24
  <head>
25
25
  <meta charset="UTF-8">
26
26
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
27
- <title>${escapeHtml(ticket.title)} - ${ticketKey} - AutoCode</title>
27
+ <title>${escapeHtml(issue.title)} - ${issueKey} - AutoCode</title>
28
28
  <style>
29
29
  :root {
30
30
  --bg: #0a0a0f;
@@ -68,13 +68,13 @@ export function generateTicketViewPage(ticketKey, lang) {
68
68
  gap: 8px;
69
69
  }
70
70
  .back-btn:hover { color: var(--text); }
71
- .ticket-header-info {
71
+ .issue-header-info {
72
72
  flex: 1;
73
73
  display: flex;
74
74
  align-items: center;
75
75
  gap: 16px;
76
76
  }
77
- .ticket-key {
77
+ .issue-key {
78
78
  font-family: 'SF Mono', Monaco, monospace;
79
79
  font-size: 12px;
80
80
  color: var(--accent);
@@ -83,7 +83,7 @@ export function generateTicketViewPage(ticketKey, lang) {
83
83
  border-radius: 4px;
84
84
  font-weight: 600;
85
85
  }
86
- .ticket-title {
86
+ .issue-title {
87
87
  font-size: 18px;
88
88
  font-weight: 600;
89
89
  }
@@ -103,7 +103,7 @@ export function generateTicketViewPage(ticketKey, lang) {
103
103
  }
104
104
  .lang-btn:hover { border-color: var(--accent); color: var(--text); }
105
105
  .lang-btn.active { background: var(--accent); border-color: var(--accent); color: white; }
106
- .ticket-title-input {
106
+ .issue-title-input {
107
107
  flex: 1;
108
108
  background: transparent;
109
109
  border: 1px solid transparent;
@@ -114,8 +114,8 @@ export function generateTicketViewPage(ticketKey, lang) {
114
114
  border-radius: 4px;
115
115
  font-family: inherit;
116
116
  }
117
- .ticket-title-input:hover { border-color: var(--border); }
118
- .ticket-title-input:focus {
117
+ .issue-title-input:hover { border-color: var(--border); }
118
+ .issue-title-input:focus {
119
119
  outline: none;
120
120
  border-color: var(--accent);
121
121
  background: var(--bg-tertiary);
@@ -185,8 +185,8 @@ export function generateTicketViewPage(ticketKey, lang) {
185
185
  gap: 24px;
186
186
  padding: 24px 48px;
187
187
  }
188
- .ticket-details { display: flex; flex-direction: column; gap: 24px; }
189
- .ticket-bottom {
188
+ .issue-details { display: flex; flex-direction: column; gap: 24px; }
189
+ .issue-bottom {
190
190
  display: flex;
191
191
  flex-direction: column;
192
192
  gap: 24px;
@@ -205,7 +205,7 @@ export function generateTicketViewPage(ticketKey, lang) {
205
205
  color: var(--muted);
206
206
  margin-bottom: 16px;
207
207
  }
208
- .ticket-meta {
208
+ .issue-meta {
209
209
  display: flex;
210
210
  flex-wrap: wrap;
211
211
  gap: 12px;
@@ -601,9 +601,9 @@ export function generateTicketViewPage(ticketKey, lang) {
601
601
  <body>
602
602
  <header class="header">
603
603
  <a href="/" class="back-btn">← Dashboard</a>
604
- <div class="ticket-header-info">
605
- <span class="ticket-key">${escapeHtml(ticketKey)}</span>
606
- <input type="text" class="ticket-title-input" id="ticket-title" value="${escapeHtml(ticket.title)}" />
604
+ <div class="issue-header-info">
605
+ <span class="issue-key">${escapeHtml(issueKey)}</span>
606
+ <input type="text" class="issue-title-input" id="issue-title" value="${escapeHtml(issue.title)}" />
607
607
  </div>
608
608
  <div class="lang-selector" id="lang-selector">
609
609
  <button class="lang-btn" data-lang="en">EN</button>
@@ -612,23 +612,23 @@ export function generateTicketViewPage(ticketKey, lang) {
612
612
  </header>
613
613
 
614
614
  <main class="main-content">
615
- <div class="ticket-details">
615
+ <div class="issue-details">
616
616
  <!-- Meta info -->
617
617
  <div class="section">
618
- <div class="section-title" data-i18n="ticketView.meta">Meta</div>
619
- <div class="ticket-meta">
620
- <span class="meta-badge priority-${ticket.priority}">${ticket.priority}</span>
621
- <span class="meta-badge column-badge">${escapeHtml(currentColumn?.name || ticket.column_slug)}</span>
622
- <span class="meta-badge semver-badge">${ticket.semver}</span>
618
+ <div class="section-title" data-i18n="issueView.meta">Meta</div>
619
+ <div class="issue-meta">
620
+ <span class="meta-badge priority-${issue.priority}">${issue.priority}</span>
621
+ <span class="meta-badge column-badge">${escapeHtml(currentColumn?.name || issue.column_slug)}</span>
622
+ <span class="meta-badge semver-badge">${issue.semver}</span>
623
623
  </div>
624
624
  </div>
625
625
 
626
626
  <!-- Labels -->
627
- ${ticket.labels && ticket.labels.length > 0 ? `
627
+ ${issue.labels && issue.labels.length > 0 ? `
628
628
  <div class="section">
629
- <div class="section-title" data-i18n="ticketView.labels">Labels</div>
629
+ <div class="section-title" data-i18n="issueView.labels">Labels</div>
630
630
  <div class="labels-list">
631
- ${ticket.labels.map((label) => `<span class="label-tag">${escapeHtml(label)}</span>`).join('')}
631
+ ${issue.labels.map((label) => `<span class="label-tag">${escapeHtml(label)}</span>`).join('')}
632
632
  </div>
633
633
  </div>
634
634
  ` : ''}
@@ -636,33 +636,33 @@ export function generateTicketViewPage(ticketKey, lang) {
636
636
  <!-- Description -->
637
637
  <div class="section">
638
638
  <div class="section-title">
639
- <span data-i18n="ticketView.description">Description</span>
639
+ <span data-i18n="issueView.description">Description</span>
640
640
  <button class="btn-edit-toggle" id="btn-edit-description" onclick="toggleDescriptionEdit()">✏️</button>
641
641
  </div>
642
642
  <div class="description-view" id="description-view"></div>
643
- <textarea class="description-edit" id="description-edit" style="display:none" placeholder="Description (Markdown)">${escapeHtml(ticket.description || '')}</textarea>
643
+ <textarea class="description-edit" id="description-edit" style="display:none" placeholder="Description (Markdown)">${escapeHtml(issue.description || '')}</textarea>
644
644
  </div>
645
645
 
646
646
  <!-- Acceptance Criteria -->
647
- ${ticket.acceptance_criteria && ticket.acceptance_criteria.length > 0 ? `
647
+ ${issue.acceptance_criteria && issue.acceptance_criteria.length > 0 ? `
648
648
  <div class="section">
649
- <div class="section-title" data-i18n="ticketView.criteria">Acceptance Criteria</div>
649
+ <div class="section-title" data-i18n="issueView.criteria">Acceptance Criteria</div>
650
650
  <ul class="criteria-list">
651
- ${ticket.acceptance_criteria.map((c) => `<li class="criteria-item">${escapeHtml(c)}</li>`).join('')}
651
+ ${issue.acceptance_criteria.map((c) => `<li class="criteria-item">${escapeHtml(c)}</li>`).join('')}
652
652
  </ul>
653
653
  </div>
654
654
  ` : ''}
655
655
 
656
656
  <!-- History -->
657
- ${ticket.history && ticket.history.length > 0 ? `
657
+ ${issue.history && issue.history.length > 0 ? `
658
658
  <div class="section">
659
- <div class="section-title" data-i18n="ticketView.history">History</div>
659
+ <div class="section-title" data-i18n="issueView.history">History</div>
660
660
  <ul class="history-list">
661
- ${ticket.history.map((h) => {
661
+ ${issue.history.map((h) => {
662
662
  const date = new Date(h.at);
663
663
  const dateStr = date.toLocaleDateString('en-US', { day: '2-digit', month: '2-digit', year: 'numeric', hour: '2-digit', minute: '2-digit' });
664
- const showPromptBtn = h.to && h.action !== 'created' ? `<a href="/ticket/${ticketKey}/${escapeHtml(h.to)}/prompt" class="btn-prompt" title="View prompt">📜</a>` : '';
665
- const showLogBtn = h.to && h.action !== 'created' ? `<a href="/ticket/${ticketKey}/${escapeHtml(h.to)}/terminal" class="btn-prompt" title="View terminal log">🖥️</a>` : '';
664
+ const showPromptBtn = h.to && h.action !== 'created' ? `<a href="/issue/${issueKey}/${escapeHtml(h.to)}/prompt" class="btn-prompt" title="View prompt">📜</a>` : '';
665
+ const showLogBtn = h.to && h.action !== 'created' ? `<a href="/issue/${issueKey}/${escapeHtml(h.to)}/terminal" class="btn-prompt" title="View terminal log">🖥️</a>` : '';
666
666
  return `<li class="history-item">
667
667
  <span class="history-action">${h.action}</span>
668
668
  ${h.from ? `<span class="history-from">${escapeHtml(h.from)}</span> →` : ''}
@@ -678,20 +678,20 @@ export function generateTicketViewPage(ticketKey, lang) {
678
678
 
679
679
  <!-- Actions bar -->
680
680
  <div class="actions-bar">
681
- <button class="btn btn-primary" id="btn-save" onclick="saveTicket()" data-i18n="ticketView.save">Save</button>
682
- <button class="btn btn-secondary" onclick="advanceTicket()" data-i18n="ticketView.moveNext">Move to next column</button>
683
- <button class="btn btn-danger" onclick="archiveTicket()" data-i18n="ticketView.archive">Archive</button>
681
+ <button class="btn btn-primary" id="btn-save" onclick="saveIssue()" data-i18n="issueView.save">Save</button>
682
+ <button class="btn btn-secondary" onclick="advanceIssue()" data-i18n="issueView.moveNext">Move to next column</button>
683
+ <button class="btn btn-danger" onclick="archiveIssue()" data-i18n="issueView.archive">Archive</button>
684
684
  </div>
685
685
  </div>
686
686
 
687
687
  <!-- Bottom section: Comments & Claude Terminal -->
688
- <div class="ticket-bottom">
688
+ <div class="issue-bottom">
689
689
  <!-- Comments -->
690
690
  <div class="section comments-section">
691
- <div class="section-title"><span data-i18n="ticketView.comments">Comments</span> (<span id="comments-count">${ticket.comments?.length || 0}</span>)</div>
691
+ <div class="section-title"><span data-i18n="issueView.comments">Comments</span> (<span id="comments-count">${issue.comments?.length || 0}</span>)</div>
692
692
  <div class="comments-list" id="comments-list"></div>
693
693
  <div class="add-comment">
694
- <textarea id="new-comment" placeholder="Add a comment..." data-i18n-placeholder="ticketView.addComment"></textarea>
694
+ <textarea id="new-comment" placeholder="Add a comment..." data-i18n-placeholder="issueView.addComment"></textarea>
695
695
  <button class="btn-comment" onclick="addComment()" data-i18n="btn.add">Add</button>
696
696
  </div>
697
697
  </div>
@@ -699,7 +699,7 @@ export function generateTicketViewPage(ticketKey, lang) {
699
699
  <!-- Claude Terminal -->
700
700
  <div class="section claude-section" id="claude-section">
701
701
  <div class="section-title">
702
- <span data-i18n="ticketView.claudeTerminal">Claude Terminal</span>
702
+ <span data-i18n="issueView.claudeTerminal">Claude Terminal</span>
703
703
  <span class="claude-status" id="claude-status" data-i18n="status.waiting">Waiting</span>
704
704
  </div>
705
705
  <pre class="claude-log" id="claude-log"></pre>
@@ -723,35 +723,35 @@ export function generateTicketViewPage(ticketKey, lang) {
723
723
  </div>
724
724
 
725
725
  <script>
726
- const TICKET_KEY = '${ticketKey}';
727
- const TICKET = ${ticketData};
726
+ const ISSUE_KEY = '${issueKey}';
727
+ const ISSUE = ${issueData};
728
728
  const COLUMNS = ${columnsData};
729
729
  const STORAGE_KEY = 'autocode-lang';
730
730
 
731
731
  let currentLang = localStorage.getItem(STORAGE_KEY) || 'fr';
732
- let currentComments = TICKET.comments || [];
732
+ let currentComments = ISSUE.comments || [];
733
733
 
734
734
  const translations = {
735
735
  en: {
736
- 'ticketView.meta': 'Meta',
737
- 'ticketView.labels': 'Labels',
738
- 'ticketView.description': 'Description',
739
- 'ticketView.criteria': 'Acceptance Criteria',
740
- 'ticketView.history': 'History',
741
- 'ticketView.actions': 'Actions',
742
- 'ticketView.save': 'Save',
743
- 'ticketView.moveNext': 'Move to next column',
744
- 'ticketView.archive': 'Archive',
745
- 'ticketView.confirmMove': 'Move this ticket to the next column?',
746
- 'ticketView.confirmArchive': 'Archive this ticket?',
747
- 'ticketView.comments': 'Comments',
748
- 'ticketView.addComment': 'Add a comment...',
749
- 'ticketView.noComments': 'No comments yet',
750
- 'ticketView.claudeTerminal': 'Claude Terminal',
751
- 'ticketView.noDescription': 'No description',
752
- 'ticketView.noLog': 'No log yet. Waiting for Claude processing...',
753
- 'ticketView.loadingPrompt': 'Loading prompt...',
754
- 'ticketView.promptError': 'Error',
736
+ 'issueView.meta': 'Meta',
737
+ 'issueView.labels': 'Labels',
738
+ 'issueView.description': 'Description',
739
+ 'issueView.criteria': 'Acceptance Criteria',
740
+ 'issueView.history': 'History',
741
+ 'issueView.actions': 'Actions',
742
+ 'issueView.save': 'Save',
743
+ 'issueView.moveNext': 'Move to next column',
744
+ 'issueView.archive': 'Archive',
745
+ 'issueView.confirmMove': 'Move this issue to the next column?',
746
+ 'issueView.confirmArchive': 'Archive this issue?',
747
+ 'issueView.comments': 'Comments',
748
+ 'issueView.addComment': 'Add a comment...',
749
+ 'issueView.noComments': 'No comments yet',
750
+ 'issueView.claudeTerminal': 'Claude Terminal',
751
+ 'issueView.noDescription': 'No description',
752
+ 'issueView.noLog': 'No log yet. Waiting for Claude processing...',
753
+ 'issueView.loadingPrompt': 'Loading prompt...',
754
+ 'issueView.promptError': 'Error',
755
755
  'btn.add': 'Add',
756
756
  'btn.sending': 'Sending...',
757
757
  'btn.saving': 'Saving...',
@@ -760,31 +760,31 @@ export function generateTicketViewPage(ticketKey, lang) {
760
760
  'status.completed': 'Completed',
761
761
  'status.failed': 'Failed',
762
762
  'notify.commentAdded': 'Comment added',
763
- 'notify.ticketAdvanced': 'Ticket advanced',
764
- 'notify.ticketArchived': 'Ticket archived',
765
- 'notify.ticketSaved': 'Ticket saved',
763
+ 'notify.issueAdvanced': 'Issue advanced',
764
+ 'notify.issueArchived': 'Issue archived',
765
+ 'notify.issueSaved': 'Issue saved',
766
766
  'notify.error': 'Error'
767
767
  },
768
768
  fr: {
769
- 'ticketView.meta': 'Méta',
770
- 'ticketView.labels': 'Labels',
771
- 'ticketView.description': 'Description',
772
- 'ticketView.criteria': 'Critères d\\'acceptation',
773
- 'ticketView.history': 'Historique',
774
- 'ticketView.actions': 'Actions',
775
- 'ticketView.save': 'Sauvegarder',
776
- 'ticketView.moveNext': 'Déplacer vers la colonne suivante',
777
- 'ticketView.archive': 'Archiver',
778
- 'ticketView.confirmMove': 'Déplacer ce ticket vers la colonne suivante ?',
779
- 'ticketView.confirmArchive': 'Archiver ce ticket ?',
780
- 'ticketView.comments': 'Commentaires',
781
- 'ticketView.addComment': 'Ajouter un commentaire...',
782
- 'ticketView.noComments': 'Aucun commentaire',
783
- 'ticketView.claudeTerminal': 'Terminal Claude',
784
- 'ticketView.noDescription': 'Aucune description',
785
- 'ticketView.noLog': 'Aucun log. En attente du traitement Claude...',
786
- 'ticketView.loadingPrompt': 'Chargement du prompt...',
787
- 'ticketView.promptError': 'Erreur',
769
+ 'issueView.meta': 'Méta',
770
+ 'issueView.labels': 'Labels',
771
+ 'issueView.description': 'Description',
772
+ 'issueView.criteria': 'Critères d\\'acceptation',
773
+ 'issueView.history': 'Historique',
774
+ 'issueView.actions': 'Actions',
775
+ 'issueView.save': 'Sauvegarder',
776
+ 'issueView.moveNext': 'Déplacer vers la colonne suivante',
777
+ 'issueView.archive': 'Archiver',
778
+ 'issueView.confirmMove': 'Déplacer ce ticket vers la colonne suivante ?',
779
+ 'issueView.confirmArchive': 'Archiver ce ticket ?',
780
+ 'issueView.comments': 'Commentaires',
781
+ 'issueView.addComment': 'Ajouter un commentaire...',
782
+ 'issueView.noComments': 'Aucun commentaire',
783
+ 'issueView.claudeTerminal': 'Terminal Claude',
784
+ 'issueView.noDescription': 'Aucune description',
785
+ 'issueView.noLog': 'Aucun log. En attente du traitement Claude...',
786
+ 'issueView.loadingPrompt': 'Chargement du prompt...',
787
+ 'issueView.promptError': 'Erreur',
788
788
  'btn.add': 'Ajouter',
789
789
  'btn.sending': 'Envoi...',
790
790
  'btn.saving': 'Sauvegarde...',
@@ -793,9 +793,9 @@ export function generateTicketViewPage(ticketKey, lang) {
793
793
  'status.completed': 'Terminé',
794
794
  'status.failed': 'Échec',
795
795
  'notify.commentAdded': 'Commentaire ajouté',
796
- 'notify.ticketAdvanced': 'Ticket avancé',
797
- 'notify.ticketArchived': 'Ticket archivé',
798
- 'notify.ticketSaved': 'Ticket sauvegardé',
796
+ 'notify.issueAdvanced': 'Ticket avancé',
797
+ 'notify.issueArchived': 'Ticket archivé',
798
+ 'notify.issueSaved': 'Ticket sauvegardé',
799
799
  'notify.error': 'Erreur'
800
800
  }
801
801
  };
@@ -845,7 +845,7 @@ export function generateTicketViewPage(ticketKey, lang) {
845
845
  count.textContent = currentComments.length;
846
846
 
847
847
  if (currentComments.length === 0) {
848
- list.innerHTML = '<div class="no-comments">' + t('ticketView.noComments') + '</div>';
848
+ list.innerHTML = '<div class="no-comments">' + t('issueView.noComments') + '</div>';
849
849
  return;
850
850
  }
851
851
 
@@ -885,7 +885,7 @@ export function generateTicketViewPage(ticketKey, lang) {
885
885
  btn.textContent = t('btn.sending');
886
886
 
887
887
  try {
888
- const res = await fetch('/api/tickets/' + TICKET_KEY + '/comments', {
888
+ const res = await fetch('/api/issues/' + ISSUE_KEY + '/comments', {
889
889
  method: 'POST',
890
890
  headers: { 'Content-Type': 'application/json' },
891
891
  body: JSON.stringify({ text, source: 'user' })
@@ -914,7 +914,7 @@ export function generateTicketViewPage(ticketKey, lang) {
914
914
  if (description) {
915
915
  view.innerHTML = renderMarkdown(description);
916
916
  } else {
917
- view.innerHTML = '<span style="color: var(--muted)">' + t('ticketView.noDescription') + '</span>';
917
+ view.innerHTML = '<span style="color: var(--muted)">' + t('issueView.noDescription') + '</span>';
918
918
  }
919
919
  }
920
920
 
@@ -939,23 +939,23 @@ export function generateTicketViewPage(ticketKey, lang) {
939
939
  }
940
940
  }
941
941
 
942
- async function saveTicket() {
942
+ async function saveIssue() {
943
943
  const btn = document.getElementById('btn-save');
944
944
  btn.disabled = true;
945
945
  btn.textContent = t('btn.saving');
946
946
 
947
947
  try {
948
- const res = await fetch('/api/tickets/' + TICKET_KEY, {
948
+ const res = await fetch('/api/issues/' + ISSUE_KEY, {
949
949
  method: 'PATCH',
950
950
  headers: { 'Content-Type': 'application/json' },
951
951
  body: JSON.stringify({
952
- title: document.getElementById('ticket-title').value,
952
+ title: document.getElementById('issue-title').value,
953
953
  description: document.getElementById('description-edit').value
954
954
  })
955
955
  });
956
956
  const result = await res.json();
957
957
  if (result.success) {
958
- showNotification(t('notify.ticketSaved'));
958
+ showNotification(t('notify.issueSaved'));
959
959
  if (isEditingDescription) {
960
960
  toggleDescriptionEdit();
961
961
  }
@@ -966,21 +966,21 @@ export function generateTicketViewPage(ticketKey, lang) {
966
966
  showNotification(t('notify.error') + ': ' + e.message, true);
967
967
  } finally {
968
968
  btn.disabled = false;
969
- btn.textContent = t('ticketView.save');
969
+ btn.textContent = t('issueView.save');
970
970
  }
971
971
  }
972
972
 
973
- async function advanceTicket() {
974
- if (!confirm(t('ticketView.confirmMove'))) return;
973
+ async function advanceIssue() {
974
+ if (!confirm(t('issueView.confirmMove'))) return;
975
975
  try {
976
- const res = await fetch('/api/tickets/' + TICKET_KEY + '/next', {
976
+ const res = await fetch('/api/issues/' + ISSUE_KEY + '/next', {
977
977
  method: 'POST',
978
978
  headers: { 'Content-Type': 'application/json' },
979
979
  body: JSON.stringify({ lang: currentLang })
980
980
  });
981
981
  const result = await res.json();
982
982
  if (result.success) {
983
- showNotification(t('notify.ticketAdvanced'));
983
+ showNotification(t('notify.issueAdvanced'));
984
984
  setTimeout(() => location.reload(), 1000);
985
985
  } else {
986
986
  showNotification(t('notify.error') + ': ' + result.error, true);
@@ -990,17 +990,17 @@ export function generateTicketViewPage(ticketKey, lang) {
990
990
  }
991
991
  }
992
992
 
993
- async function archiveTicket() {
994
- if (!confirm(t('ticketView.confirmArchive'))) return;
993
+ async function archiveIssue() {
994
+ if (!confirm(t('issueView.confirmArchive'))) return;
995
995
  try {
996
- const res = await fetch('/api/tickets/' + TICKET_KEY + '/archive', {
996
+ const res = await fetch('/api/issues/' + ISSUE_KEY + '/archive', {
997
997
  method: 'POST',
998
998
  headers: { 'Content-Type': 'application/json' },
999
999
  body: JSON.stringify({ lang: currentLang })
1000
1000
  });
1001
1001
  const result = await res.json();
1002
1002
  if (result.success) {
1003
- showNotification(t('notify.ticketArchived'));
1003
+ showNotification(t('notify.issueArchived'));
1004
1004
  setTimeout(() => location.href = '/', 1000);
1005
1005
  } else {
1006
1006
  showNotification(t('notify.error') + ': ' + result.error, true);
@@ -1044,23 +1044,23 @@ export function generateTicketViewPage(ticketKey, lang) {
1044
1044
  try {
1045
1045
  const data = JSON.parse(event.data);
1046
1046
  switch (data.type) {
1047
- case 'ticket_updated':
1048
- if (data.key === TICKET_KEY) {
1047
+ case 'issue_updated':
1048
+ if (data.key === ISSUE_KEY) {
1049
1049
  location.reload();
1050
1050
  }
1051
1051
  break;
1052
1052
  case 'claude_start':
1053
- if (data.ticket === TICKET_KEY) {
1053
+ if (data.issue === ISSUE_KEY) {
1054
1054
  onClaudeStart();
1055
1055
  }
1056
1056
  break;
1057
1057
  case 'claude_stream':
1058
- if (data.ticket === TICKET_KEY) {
1058
+ if (data.issue === ISSUE_KEY) {
1059
1059
  fetchLog();
1060
1060
  }
1061
1061
  break;
1062
1062
  case 'claude_end':
1063
- if (data.ticket === TICKET_KEY) {
1063
+ if (data.issue === ISSUE_KEY) {
1064
1064
  onClaudeEnd(data.success, data.duration);
1065
1065
  }
1066
1066
  break;
@@ -1255,7 +1255,7 @@ export function generateTicketViewPage(ticketKey, lang) {
1255
1255
 
1256
1256
  async function fetchLog() {
1257
1257
  try {
1258
- const res = await fetch('/api/tickets/' + TICKET_KEY + '/log');
1258
+ const res = await fetch('/api/issues/' + ISSUE_KEY + '/log');
1259
1259
  const json = await res.json();
1260
1260
  const log = document.getElementById('claude-log');
1261
1261
 
@@ -1263,7 +1263,7 @@ export function generateTicketViewPage(ticketKey, lang) {
1263
1263
  log.innerHTML = formatLogContent(json.data.content || '');
1264
1264
  log.scrollTop = log.scrollHeight;
1265
1265
  } else {
1266
- log.innerHTML = '<div class="log-entry system">' + t('ticketView.noLog') + '</div>';
1266
+ log.innerHTML = '<div class="log-entry system">' + t('issueView.noLog') + '</div>';
1267
1267
  }
1268
1268
  } catch (e) {
1269
1269
  console.error('Log fetch error:', e);
@@ -1296,22 +1296,22 @@ export function generateTicketViewPage(ticketKey, lang) {
1296
1296
  const title = document.getElementById('prompt-modal-title');
1297
1297
  const content = document.getElementById('prompt-modal-content');
1298
1298
 
1299
- title.textContent = t('ticketView.loadingPrompt');
1299
+ title.textContent = t('issueView.loadingPrompt');
1300
1300
  content.textContent = '';
1301
1301
  modal.classList.add('visible');
1302
1302
 
1303
1303
  try {
1304
- const res = await fetch('/api/tickets/' + TICKET_KEY + '/prompt/' + columnSlug);
1304
+ const res = await fetch('/api/issues/' + ISSUE_KEY + '/prompt/' + columnSlug);
1305
1305
  const json = await res.json();
1306
1306
  if (json.success) {
1307
1307
  title.textContent = 'Prompt → ' + json.data.column;
1308
1308
  content.textContent = json.data.prompt;
1309
1309
  } else {
1310
- title.textContent = t('ticketView.promptError');
1310
+ title.textContent = t('issueView.promptError');
1311
1311
  content.textContent = json.error || 'Error loading prompt';
1312
1312
  }
1313
1313
  } catch (e) {
1314
- title.textContent = t('ticketView.promptError');
1314
+ title.textContent = t('issueView.promptError');
1315
1315
  content.textContent = e.message;
1316
1316
  }
1317
1317
  }
@@ -1327,26 +1327,26 @@ export function generateTicketViewPage(ticketKey, lang) {
1327
1327
  const title = document.getElementById('prompt-modal-title');
1328
1328
  const content = document.getElementById('prompt-modal-content');
1329
1329
 
1330
- title.textContent = t('ticketView.loadingLog') || 'Loading log...';
1330
+ title.textContent = t('issueView.loadingLog') || 'Loading log...';
1331
1331
  content.textContent = '';
1332
1332
  modal.classList.add('visible');
1333
1333
 
1334
1334
  try {
1335
- const res = await fetch('/api/tickets/' + TICKET_KEY + '/log/' + columnSlug);
1335
+ const res = await fetch('/api/issues/' + ISSUE_KEY + '/log/' + columnSlug);
1336
1336
  const json = await res.json();
1337
1337
  if (json.success) {
1338
1338
  title.textContent = 'Terminal → ' + columnSlug;
1339
1339
  if (json.data.content) {
1340
1340
  content.innerHTML = formatLogContent(json.data.content);
1341
1341
  } else {
1342
- content.textContent = t('ticketView.noLog') || 'No log available';
1342
+ content.textContent = t('issueView.noLog') || 'No log available';
1343
1343
  }
1344
1344
  } else {
1345
- title.textContent = t('ticketView.logError') || 'Log Error';
1345
+ title.textContent = t('issueView.logError') || 'Log Error';
1346
1346
  content.textContent = json.error || 'Error loading log';
1347
1347
  }
1348
1348
  } catch (e) {
1349
- title.textContent = t('ticketView.logError') || 'Log Error';
1349
+ title.textContent = t('issueView.logError') || 'Log Error';
1350
1350
  content.textContent = e.message;
1351
1351
  }
1352
1352
  }
@@ -1361,4 +1361,4 @@ export function generateTicketViewPage(ticketKey, lang) {
1361
1361
  </body>
1362
1362
  </html>`;
1363
1363
  }
1364
- //# sourceMappingURL=ticket-view.js.map
1364
+ //# sourceMappingURL=issue-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue-view.js","sourceRoot":"","sources":["../../../../src/server/dashboard/pages/issue-view.ts"],"names":[],"mappings":"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"}