redmine-context 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (229) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +449 -0
  3. package/dist/bundle/index.d.ts +5 -0
  4. package/dist/bundle/index.js +5 -0
  5. package/dist/bundle/json.d.ts +90 -0
  6. package/dist/bundle/json.js +266 -0
  7. package/dist/bundle/markdown.d.ts +75 -0
  8. package/dist/bundle/markdown.js +294 -0
  9. package/dist/bundle/search-list.d.ts +43 -0
  10. package/dist/bundle/search-list.js +53 -0
  11. package/dist/bundle/stable-stringify.d.ts +26 -0
  12. package/dist/bundle/stable-stringify.js +50 -0
  13. package/dist/cache/contract.d.ts +157 -0
  14. package/dist/cache/contract.js +0 -0
  15. package/dist/cache/disk-index.d.ts +82 -0
  16. package/dist/cache/disk-index.js +220 -0
  17. package/dist/cache/disk.d.ts +133 -0
  18. package/dist/cache/disk.js +313 -0
  19. package/dist/cache/gc.d.ts +78 -0
  20. package/dist/cache/gc.js +123 -0
  21. package/dist/cache/get-or-compute.d.ts +36 -0
  22. package/dist/cache/get-or-compute.js +52 -0
  23. package/dist/cache/index.d.ts +9 -0
  24. package/dist/cache/index.js +8 -0
  25. package/dist/cache/keys.d.ts +76 -0
  26. package/dist/cache/keys.js +78 -0
  27. package/dist/cache/memory.d.ts +48 -0
  28. package/dist/cache/memory.js +110 -0
  29. package/dist/cache-first.d.ts +127 -0
  30. package/dist/cache-first.js +227 -0
  31. package/dist/client/errors.d.ts +33 -0
  32. package/dist/client/errors.js +49 -0
  33. package/dist/client/http.d.ts +110 -0
  34. package/dist/client/http.js +207 -0
  35. package/dist/client/index.d.ts +5 -0
  36. package/dist/client/index.js +5 -0
  37. package/dist/client/issues.d.ts +71 -0
  38. package/dist/client/issues.js +100 -0
  39. package/dist/client/search.d.ts +58 -0
  40. package/dist/client/search.js +81 -0
  41. package/dist/config/credentials.d.ts +247 -0
  42. package/dist/config/credentials.js +427 -0
  43. package/dist/config/doctor.d.ts +123 -0
  44. package/dist/config/doctor.js +260 -0
  45. package/dist/config/index.d.ts +6 -0
  46. package/dist/config/index.js +6 -0
  47. package/dist/config/keyring.d.ts +96 -0
  48. package/dist/config/keyring.js +158 -0
  49. package/dist/config/login.d.ts +97 -0
  50. package/dist/config/login.js +189 -0
  51. package/dist/config/settings.d.ts +94 -0
  52. package/dist/config/settings.js +140 -0
  53. package/dist/contract.d.ts +173 -0
  54. package/dist/contract.js +27 -0
  55. package/dist/core.d.ts +1 -0
  56. package/dist/core.js +8 -0
  57. package/dist/extract/audio-extractor.d.ts +105 -0
  58. package/dist/extract/audio-extractor.js +156 -0
  59. package/dist/extract/audio.d.ts +126 -0
  60. package/dist/extract/audio.js +184 -0
  61. package/dist/extract/dispatcher.d.ts +132 -0
  62. package/dist/extract/dispatcher.js +115 -0
  63. package/dist/extract/download.d.ts +111 -0
  64. package/dist/extract/download.js +261 -0
  65. package/dist/extract/duration.d.ts +106 -0
  66. package/dist/extract/duration.js +148 -0
  67. package/dist/extract/ffmpeg.d.ts +56 -0
  68. package/dist/extract/ffmpeg.js +95 -0
  69. package/dist/extract/gguf.d.ts +137 -0
  70. package/dist/extract/gguf.js +215 -0
  71. package/dist/extract/index.d.ts +19 -0
  72. package/dist/extract/index.js +19 -0
  73. package/dist/extract/magic.d.ts +80 -0
  74. package/dist/extract/magic.js +282 -0
  75. package/dist/extract/ooxml.d.ts +131 -0
  76. package/dist/extract/ooxml.js +336 -0
  77. package/dist/extract/pdf.d.ts +147 -0
  78. package/dist/extract/pdf.js +322 -0
  79. package/dist/extract/queue.d.ts +167 -0
  80. package/dist/extract/queue.js +217 -0
  81. package/dist/extract/subprocess.d.ts +145 -0
  82. package/dist/extract/subprocess.js +181 -0
  83. package/dist/extract/tesseract.d.ts +153 -0
  84. package/dist/extract/tesseract.js +321 -0
  85. package/dist/extract/video-extractor.d.ts +84 -0
  86. package/dist/extract/video-extractor.js +89 -0
  87. package/dist/extract/video.d.ts +198 -0
  88. package/dist/extract/video.js +418 -0
  89. package/dist/extract/which.d.ts +63 -0
  90. package/dist/extract/which.js +72 -0
  91. package/dist/extract/whisper-extract.d.ts +211 -0
  92. package/dist/extract/whisper-extract.js +323 -0
  93. package/dist/extract/whisper.d.ts +50 -0
  94. package/dist/extract/whisper.js +67 -0
  95. package/dist/extract/zip.d.ts +50 -0
  96. package/dist/extract/zip.js +165 -0
  97. package/dist/extract-issue-attachments.d.ts +82 -0
  98. package/dist/extract-issue-attachments.js +156 -0
  99. package/dist/fetch-attachment-text.d.ts +113 -0
  100. package/dist/fetch-attachment-text.js +155 -0
  101. package/dist/fetch-issue-bundle.d.ts +81 -0
  102. package/dist/fetch-issue-bundle.js +93 -0
  103. package/dist/fetch-issue-search.d.ts +74 -0
  104. package/dist/fetch-issue-search.js +120 -0
  105. package/dist/index.d.ts +21 -0
  106. package/dist/index.js +67 -0
  107. package/dist/normalize/collections.d.ts +52 -0
  108. package/dist/normalize/collections.js +170 -0
  109. package/dist/normalize/helpers.d.ts +35 -0
  110. package/dist/normalize/helpers.js +59 -0
  111. package/dist/normalize/index.d.ts +2 -0
  112. package/dist/normalize/index.js +2 -0
  113. package/dist/normalize/issue.d.ts +34 -0
  114. package/dist/normalize/issue.js +154 -0
  115. package/dist/surfaces/cli/commands.d.ts +61 -0
  116. package/dist/surfaces/cli/commands.js +262 -0
  117. package/dist/surfaces/cli/main.d.ts +32 -0
  118. package/dist/surfaces/cli/main.js +210 -0
  119. package/dist/surfaces/cli/prompts.d.ts +66 -0
  120. package/dist/surfaces/cli/prompts.js +147 -0
  121. package/dist/surfaces/cli/tty.d.ts +27 -0
  122. package/dist/surfaces/cli/tty.js +35 -0
  123. package/dist/surfaces/cli/types.d.ts +39 -0
  124. package/dist/surfaces/cli/types.js +7 -0
  125. package/dist/surfaces/mcp/server.d.ts +171 -0
  126. package/dist/surfaces/mcp/server.js +427 -0
  127. package/dist/surfaces/tui/app.d.ts +55 -0
  128. package/dist/surfaces/tui/app.js +180 -0
  129. package/dist/surfaces/tui/attachment-status.d.ts +79 -0
  130. package/dist/surfaces/tui/attachment-status.js +113 -0
  131. package/dist/surfaces/tui/components/breadcrumb.d.ts +7 -0
  132. package/dist/surfaces/tui/components/breadcrumb.js +31 -0
  133. package/dist/surfaces/tui/components/gradient-text.d.ts +23 -0
  134. package/dist/surfaces/tui/components/gradient-text.js +75 -0
  135. package/dist/surfaces/tui/components/scroll-view.d.ts +25 -0
  136. package/dist/surfaces/tui/components/scroll-view.js +77 -0
  137. package/dist/surfaces/tui/components/spinner.d.ts +12 -0
  138. package/dist/surfaces/tui/components/spinner.js +39 -0
  139. package/dist/surfaces/tui/components/text-input.d.ts +45 -0
  140. package/dist/surfaces/tui/components/text-input.js +114 -0
  141. package/dist/surfaces/tui/format-file-size.d.ts +24 -0
  142. package/dist/surfaces/tui/format-file-size.js +43 -0
  143. package/dist/surfaces/tui/glyphs.d.ts +47 -0
  144. package/dist/surfaces/tui/glyphs.js +84 -0
  145. package/dist/surfaces/tui/hooks/use-auth-guard.d.ts +39 -0
  146. package/dist/surfaces/tui/hooks/use-auth-guard.js +135 -0
  147. package/dist/surfaces/tui/hooks/use-doctor-status.d.ts +64 -0
  148. package/dist/surfaces/tui/hooks/use-doctor-status.js +123 -0
  149. package/dist/surfaces/tui/hooks/use-escape-interceptor.d.ts +25 -0
  150. package/dist/surfaces/tui/hooks/use-escape-interceptor.js +65 -0
  151. package/dist/surfaces/tui/hooks/use-exit-guard.d.ts +18 -0
  152. package/dist/surfaces/tui/hooks/use-exit-guard.js +66 -0
  153. package/dist/surfaces/tui/hooks/use-export-bundle.d.ts +62 -0
  154. package/dist/surfaces/tui/hooks/use-export-bundle.js +100 -0
  155. package/dist/surfaces/tui/hooks/use-issue-detail.d.ts +61 -0
  156. package/dist/surfaces/tui/hooks/use-issue-detail.js +132 -0
  157. package/dist/surfaces/tui/hooks/use-issue-search.d.ts +71 -0
  158. package/dist/surfaces/tui/hooks/use-issue-search.js +168 -0
  159. package/dist/surfaces/tui/hooks/use-list-navigation.d.ts +44 -0
  160. package/dist/surfaces/tui/hooks/use-list-navigation.js +82 -0
  161. package/dist/surfaces/tui/hooks/use-media-binaries.d.ts +24 -0
  162. package/dist/surfaces/tui/hooks/use-media-binaries.js +44 -0
  163. package/dist/surfaces/tui/hooks/use-my-issues.d.ts +66 -0
  164. package/dist/surfaces/tui/hooks/use-my-issues.js +151 -0
  165. package/dist/surfaces/tui/hooks/use-onboarding-callbacks.d.ts +11 -0
  166. package/dist/surfaces/tui/hooks/use-onboarding-callbacks.js +104 -0
  167. package/dist/surfaces/tui/hooks/use-terminal-width.d.ts +52 -0
  168. package/dist/surfaces/tui/hooks/use-terminal-width.js +90 -0
  169. package/dist/surfaces/tui/index.d.ts +50 -0
  170. package/dist/surfaces/tui/index.js +158 -0
  171. package/dist/surfaces/tui/instance.d.ts +37 -0
  172. package/dist/surfaces/tui/instance.js +36 -0
  173. package/dist/surfaces/tui/job-registry.d.ts +113 -0
  174. package/dist/surfaces/tui/job-registry.js +123 -0
  175. package/dist/surfaces/tui/job-status.d.ts +45 -0
  176. package/dist/surfaces/tui/job-status.js +81 -0
  177. package/dist/surfaces/tui/navigation.d.ts +74 -0
  178. package/dist/surfaces/tui/navigation.js +87 -0
  179. package/dist/surfaces/tui/palettes.d.ts +38 -0
  180. package/dist/surfaces/tui/palettes.js +244 -0
  181. package/dist/surfaces/tui/screen.d.ts +30 -0
  182. package/dist/surfaces/tui/screen.js +51 -0
  183. package/dist/surfaces/tui/screens/about.d.ts +2 -0
  184. package/dist/surfaces/tui/screens/about.js +35 -0
  185. package/dist/surfaces/tui/screens/appearance.d.ts +2 -0
  186. package/dist/surfaces/tui/screens/appearance.js +74 -0
  187. package/dist/surfaces/tui/screens/config.d.ts +2 -0
  188. package/dist/surfaces/tui/screens/config.js +82 -0
  189. package/dist/surfaces/tui/screens/doctor.d.ts +2 -0
  190. package/dist/surfaces/tui/screens/doctor.js +109 -0
  191. package/dist/surfaces/tui/screens/export.d.ts +2 -0
  192. package/dist/surfaces/tui/screens/export.js +168 -0
  193. package/dist/surfaces/tui/screens/home-selection.d.ts +70 -0
  194. package/dist/surfaces/tui/screens/home-selection.js +80 -0
  195. package/dist/surfaces/tui/screens/home.d.ts +2 -0
  196. package/dist/surfaces/tui/screens/home.js +200 -0
  197. package/dist/surfaces/tui/screens/issue-detail.d.ts +6 -0
  198. package/dist/surfaces/tui/screens/issue-detail.js +182 -0
  199. package/dist/surfaces/tui/screens/jobs.d.ts +7 -0
  200. package/dist/surfaces/tui/screens/jobs.js +89 -0
  201. package/dist/surfaces/tui/screens/loaded-issue-context.d.ts +49 -0
  202. package/dist/surfaces/tui/screens/loaded-issue-context.js +57 -0
  203. package/dist/surfaces/tui/screens/onboarding/api-key.d.ts +2 -0
  204. package/dist/surfaces/tui/screens/onboarding/api-key.js +69 -0
  205. package/dist/surfaces/tui/screens/onboarding/login.d.ts +2 -0
  206. package/dist/surfaces/tui/screens/onboarding/login.js +50 -0
  207. package/dist/surfaces/tui/screens/onboarding/mode.d.ts +2 -0
  208. package/dist/surfaces/tui/screens/onboarding/mode.js +42 -0
  209. package/dist/surfaces/tui/screens/onboarding/onboarding-context.d.ts +221 -0
  210. package/dist/surfaces/tui/screens/onboarding/onboarding-context.js +131 -0
  211. package/dist/surfaces/tui/screens/onboarding/success.d.ts +2 -0
  212. package/dist/surfaces/tui/screens/onboarding/success.js +41 -0
  213. package/dist/surfaces/tui/screens/onboarding/url.d.ts +24 -0
  214. package/dist/surfaces/tui/screens/onboarding/url.js +84 -0
  215. package/dist/surfaces/tui/screens/onboarding/validating.d.ts +1 -0
  216. package/dist/surfaces/tui/screens/onboarding/validating.js +86 -0
  217. package/dist/surfaces/tui/screens/welcome.d.ts +6 -0
  218. package/dist/surfaces/tui/screens/welcome.js +95 -0
  219. package/dist/surfaces/tui/status-color.d.ts +21 -0
  220. package/dist/surfaces/tui/status-color.js +23 -0
  221. package/dist/surfaces/tui/symbols.d.ts +231 -0
  222. package/dist/surfaces/tui/symbols.js +14 -0
  223. package/dist/surfaces/tui/terminal-colors.d.ts +29 -0
  224. package/dist/surfaces/tui/terminal-colors.js +39 -0
  225. package/dist/surfaces/tui/theme.d.ts +156 -0
  226. package/dist/surfaces/tui/theme.js +86 -0
  227. package/dist/surfaces/tui/truncate.d.ts +31 -0
  228. package/dist/surfaces/tui/truncate.js +81 -0
  229. package/package.json +93 -0
@@ -0,0 +1,86 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ * Tema central da TUI (M2-02).
4
+ *
5
+ * Fonte de literais de cor da TUI (junto de `palettes.ts`, #190, que guarda os
6
+ * hex das paletas como DADOS de objeto, não como props JSX): toda tela consome
7
+ * cores via {@link useTheme}, nunca com `color="magenta"` direto no JSX — a
8
+ * varredura `tests/surfaces/tui/no-hardcoded-colors.test.ts` garante isso em CI
9
+ * (ela pega `color=`/`backgroundColor=` com literal; as chaves `primary:` de
10
+ * `palettes.ts` não são props, por isso passam). Centralizar aqui/em `palettes.ts`
11
+ * torna trocar a paleta uma mudança localizada.
12
+ *
13
+ * ## Paleta e guideline de uso
14
+ *
15
+ * Combinação sóbria sobre fundo escuro (a paleta padrão de 16 cores do
16
+ * terminal, resolvida pelo próprio emulador — sem hex fixo, para respeitar o
17
+ * esquema de cores do usuário):
18
+ *
19
+ * - **primary** (`cyan`) — cor de identidade/foco: títulos, item selecionado,
20
+ * estado ativo. É a cor mais usada na TUI; se uma tela parece "sem cor
21
+ * nenhuma", provavelmente falta um `primary` nela.
22
+ * - **accent** (`magenta`) — destaque raro: uma call-to-action pontual (ex.:
23
+ * a tecla que o usuário deve apertar agora). Usar com moderação — se
24
+ * `accent` aparece em toda linha da tela, ele deixou de ser um destaque.
25
+ * - **muted** (`gray`) — texto secundário/de apoio: dicas, timestamps,
26
+ * metadados. Substitui o uso solto de `dimColor` por um tom deliberado.
27
+ * - **success** (`green`) / **warning** (`yellow`) / **danger** (`red`) —
28
+ * reservadas para *estado*, nunca para decoração: resultado de uma
29
+ * operação (sucesso/erro) ou um alerta acionável. Não usar `danger` só
30
+ * porque "fica bonito" — é reservada para sinalizar problema real.
31
+ *
32
+ * Reaproveita os nomes de cor nativos do Ink/chalk (paleta ANSI de 16 cores),
33
+ * então funciona em qualquer terminal sem depender de suporte a true color.
34
+ */
35
+ import { createContext, useContext } from 'react';
36
+ /** Tema padrão da TUI — ver guideline de uso na documentação do arquivo. */
37
+ export const DEFAULT_THEME = {
38
+ primary: 'cyan',
39
+ accent: 'magenta',
40
+ muted: 'gray',
41
+ success: 'green',
42
+ warning: 'yellow',
43
+ danger: 'red',
44
+ border: 'gray',
45
+ };
46
+ const ThemeContext = createContext(undefined);
47
+ /**
48
+ * Provider do tema — envolve toda a árvore da TUI em `app.tsx`.
49
+ *
50
+ * Aceita um `theme` customizado (para testes ou temas alternativos
51
+ * futuros); sem ele, usa {@link DEFAULT_THEME}.
52
+ */
53
+ export function ThemeProvider({ theme = DEFAULT_THEME, children, }) {
54
+ return _jsx(ThemeContext.Provider, { value: theme, children: children });
55
+ }
56
+ /**
57
+ * Hook de tema consumido pelas telas — única forma permitida de obter uma
58
+ * cor na TUI (ver varredura anti-hardcode).
59
+ *
60
+ * @throws {Error} Se chamado fora de um `<ThemeProvider>` — indica erro de
61
+ * composição (tela renderizada sem passar pelo roteador/`app.tsx`).
62
+ */
63
+ export function useTheme() {
64
+ const theme = useContext(ThemeContext);
65
+ if (theme === undefined) {
66
+ throw new Error('useTheme() usado fora de <ThemeProvider>.');
67
+ }
68
+ return theme;
69
+ }
70
+ const ThemeControllerContext = createContext(undefined);
71
+ /** Provider do controlador de paleta — montado pelo `App`. */
72
+ export function ThemeControllerProvider({ value, children, }) {
73
+ return _jsx(ThemeControllerContext.Provider, { value: value, children: children });
74
+ }
75
+ /**
76
+ * Hook do controlador de paleta — usado pelo seletor de tema.
77
+ *
78
+ * @throws {Error} Se chamado fora de um `<ThemeControllerProvider>`.
79
+ */
80
+ export function useThemeController() {
81
+ const controller = useContext(ThemeControllerContext);
82
+ if (controller === undefined) {
83
+ throw new Error('useThemeController() usado fora de <ThemeControllerProvider>.');
84
+ }
85
+ return controller;
86
+ }
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Trunca `text` em `max` caracteres a partir do FIM, terminando com o marcador
3
+ * de corte quando corta. Uso padrão — subjects, rótulos, qualquer string onde
4
+ * o INÍCIO é a parte mais relevante.
5
+ *
6
+ * @param text - String candidata a corte.
7
+ * @param max - Largura máxima permitida (colunas). `max <= 0` retorna vazio.
8
+ * @param ellipsis - Marcador de corte (default: `glyphs.ellipsis`, ASCII no
9
+ * terminal legado do Windows). Seu comprimento é descontado do orçamento.
10
+ * @returns `text` inalterado (couber) ou cortado com reticências ao final.
11
+ *
12
+ * @example
13
+ * truncate('Refatorar o pipeline de exportação de anexos', 20); // 'Refatorar o pipel…'
14
+ */
15
+ export declare function truncate(text: string, max: number, ellipsis?: string): string;
16
+ /**
17
+ * Trunca `text` em `max` caracteres a partir do INÍCIO, iniciando com o
18
+ * marcador de corte quando corta. Uso em caminhos/campos em edição — onde o
19
+ * FIM é a parte mais relevante (nome do arquivo ao final de um path, ou o
20
+ * cursor de digitação de um campo de texto ainda ativo).
21
+ *
22
+ * @param text - String candidata a corte.
23
+ * @param max - Largura máxima permitida (colunas). `max <= 0` retorna vazio.
24
+ * @param ellipsis - Marcador de corte (default: `glyphs.ellipsis`, ASCII no
25
+ * terminal legado do Windows). Seu comprimento é descontado do orçamento.
26
+ * @returns `text` inalterado (couber) ou cortado com reticências no início.
27
+ *
28
+ * @example
29
+ * truncateStart('/home/usuario/projetos/redmine-context/saida', 20); // '…text/redmine-context/saida'.slice — ver teste para o valor exato
30
+ */
31
+ export declare function truncateStart(text: string, max: number, ellipsis?: string): string;
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Truncamento por largura, unificado (M2-16, #39) — fonte única para cortar
3
+ * strings que podem estourar a largura do terminal (subject da issue, valor
4
+ * de um `StatusRow` do doctor, caminho de destino/exportação etc.). Antes
5
+ * duplicado como função local em `screens/home.tsx`.
6
+ *
7
+ * Por que isso é necessário mesmo o Ink já quebrando `<Text>` automaticamente
8
+ * em várias linhas: dentro de um `<Box>` em linha (`flexDirection: 'row'`, o
9
+ * padrão do componente), CADA `<Text>` IRMÃ tenta se auto-ajustar à largura
10
+ * restante de forma independente — quando uma delas (ex.: o subject de uma
11
+ * issue) é mais longa que o espaço sobrando, o resultado observado é
12
+ * sobreposição ilegível entre o conteúdo dela e o das irmãs seguintes
13
+ * (confirmado empiricamente antes desta mudança: um subject comprido "vazava"
14
+ * por cima do badge de status da linha). Truncar explicitamente o campo
15
+ * variável ANTES de renderizar evita esse caso — diferente de um bloco de
16
+ * texto isolado (ex.: descrição/journals em `screens/issue-detail.tsx`), que
17
+ * pode seguir confiando no wrap nativo do Ink sem risco de sobreposição.
18
+ *
19
+ * LIMITAÇÃO ACEITA (review #126): mede em unidades UTF-16 (`.length`), não em
20
+ * largura visual de terminal — acentos PT-BR ocupam 1 coluna e funcionam;
21
+ * CJK/emoji (largura dupla) podem estourar o orçamento. Suporte real de
22
+ * largura visual (ex.: string-width) fica para quando houver demanda — ver
23
+ * issue de follow-up da responsividade.
24
+ *
25
+ * HARDENING WINDOWS LEGADO (M5-09, #84): o marcador de corte deixou de ser um
26
+ * literal fixo `'…'` e passa a vir de `./glyphs.ts`, que degrada para `'...'`
27
+ * no terminal legado do Windows (evitando o mojibake da reticência Unicode).
28
+ * Como o fallback ASCII tem LARGURA 3 (vs. 1 do `'…'`), a matemática de corte
29
+ * agora desconta `ellipsis.length` em vez de assumir 1 — do contrário o
30
+ * resultado ASCII estouraria a largura orçada. O marcador é um parâmetro com
31
+ * default (`glyphs.ellipsis`) para manter as funções puras e testáveis com
32
+ * qualquer largura de reticência.
33
+ */
34
+ import { glyphs } from './glyphs.js';
35
+ /**
36
+ * Trunca `text` em `max` caracteres a partir do FIM, terminando com o marcador
37
+ * de corte quando corta. Uso padrão — subjects, rótulos, qualquer string onde
38
+ * o INÍCIO é a parte mais relevante.
39
+ *
40
+ * @param text - String candidata a corte.
41
+ * @param max - Largura máxima permitida (colunas). `max <= 0` retorna vazio.
42
+ * @param ellipsis - Marcador de corte (default: `glyphs.ellipsis`, ASCII no
43
+ * terminal legado do Windows). Seu comprimento é descontado do orçamento.
44
+ * @returns `text` inalterado (couber) ou cortado com reticências ao final.
45
+ *
46
+ * @example
47
+ * truncate('Refatorar o pipeline de exportação de anexos', 20); // 'Refatorar o pipel…'
48
+ */
49
+ export function truncate(text, max, ellipsis = glyphs.ellipsis) {
50
+ if (max <= 0)
51
+ return '';
52
+ if (text.length <= max)
53
+ return text;
54
+ if (max <= ellipsis.length)
55
+ return ellipsis.slice(0, max);
56
+ return `${text.slice(0, max - ellipsis.length)}${ellipsis}`;
57
+ }
58
+ /**
59
+ * Trunca `text` em `max` caracteres a partir do INÍCIO, iniciando com o
60
+ * marcador de corte quando corta. Uso em caminhos/campos em edição — onde o
61
+ * FIM é a parte mais relevante (nome do arquivo ao final de um path, ou o
62
+ * cursor de digitação de um campo de texto ainda ativo).
63
+ *
64
+ * @param text - String candidata a corte.
65
+ * @param max - Largura máxima permitida (colunas). `max <= 0` retorna vazio.
66
+ * @param ellipsis - Marcador de corte (default: `glyphs.ellipsis`, ASCII no
67
+ * terminal legado do Windows). Seu comprimento é descontado do orçamento.
68
+ * @returns `text` inalterado (couber) ou cortado com reticências no início.
69
+ *
70
+ * @example
71
+ * truncateStart('/home/usuario/projetos/redmine-context/saida', 20); // '…text/redmine-context/saida'.slice — ver teste para o valor exato
72
+ */
73
+ export function truncateStart(text, max, ellipsis = glyphs.ellipsis) {
74
+ if (max <= 0)
75
+ return '';
76
+ if (text.length <= max)
77
+ return text;
78
+ if (max <= ellipsis.length)
79
+ return ellipsis.slice(0, max);
80
+ return `${ellipsis}${text.slice(text.length - (max - ellipsis.length))}`;
81
+ }
package/package.json ADDED
@@ -0,0 +1,93 @@
1
+ {
2
+ "name": "redmine-context",
3
+ "version": "1.0.0",
4
+ "description": "Consumidor de Redmine que entrega contexto completo de issues (texto + mídia extraída localmente) para qualquer LLM",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "author": "Victor Deserto",
8
+ "keywords": [
9
+ "redmine",
10
+ "mcp",
11
+ "model-context-protocol",
12
+ "llm",
13
+ "context",
14
+ "cli",
15
+ "tui",
16
+ "ink",
17
+ "ocr",
18
+ "transcription",
19
+ "issue-tracker"
20
+ ],
21
+ "repository": {
22
+ "type": "git",
23
+ "url": "git+https://github.com/vdeserto/redmine-context.git"
24
+ },
25
+ "homepage": "https://github.com/vdeserto/redmine-context#readme",
26
+ "bugs": {
27
+ "url": "https://github.com/vdeserto/redmine-context/issues"
28
+ },
29
+ "publishConfig": {
30
+ "access": "public",
31
+ "provenance": true
32
+ },
33
+ "bin": {
34
+ "redmine-context": "dist/surfaces/cli/main.js"
35
+ },
36
+ "exports": {
37
+ ".": {
38
+ "types": "./dist/index.d.ts",
39
+ "import": "./dist/index.js"
40
+ }
41
+ },
42
+ "files": [
43
+ "dist",
44
+ "README.md",
45
+ "LICENSE"
46
+ ],
47
+ "engines": {
48
+ "node": ">=20"
49
+ },
50
+ "scripts": {
51
+ "build": "tsc",
52
+ "prepack": "npm run build",
53
+ "typecheck": "tsc --noEmit",
54
+ "lint": "eslint .",
55
+ "test": "vitest run --coverage",
56
+ "seed": "node scripts/seed.mjs",
57
+ "e2e": "node scripts/e2e.mjs",
58
+ "e2e:ci": "node scripts/e2e-ci.mjs",
59
+ "ci:e2e:up": "bash scripts/ci-e2e-up.sh",
60
+ "record:fixtures": "node scripts/record-fixtures.mjs",
61
+ "changeset": "changeset",
62
+ "version": "changeset version",
63
+ "release": "changeset publish"
64
+ },
65
+ "devDependencies": {
66
+ "@changesets/cli": "^2.31.1",
67
+ "@types/node": "^20.19.43",
68
+ "@types/react": "^19.2.17",
69
+ "@vitest/coverage-v8": "^3.2.4",
70
+ "eslint": "^9.31.0",
71
+ "ink-testing-library": "^4.0.0",
72
+ "typescript": "^5.8.3",
73
+ "typescript-eslint": "^8.36.0",
74
+ "vitest": "^3.2.4"
75
+ },
76
+ "dependencies": {
77
+ "@inkjs/ui": "^2.0.0",
78
+ "@modelcontextprotocol/sdk": "^1.29.0",
79
+ "@napi-rs/keyring": "^1.3.0",
80
+ "env-paths": "^4.0.0",
81
+ "figures": "^6.1.0",
82
+ "ink": "^6.8.0",
83
+ "ink-task-list": "^2.0.0",
84
+ "react": "^19.2.8",
85
+ "zod": "^4.4.3"
86
+ },
87
+ "optionalDependencies": {
88
+ "@napi-rs/keyring-darwin-arm64": "^1.3.0",
89
+ "@napi-rs/keyring-darwin-x64": "^1.3.0",
90
+ "@napi-rs/keyring-linux-x64-gnu": "^1.3.0",
91
+ "@napi-rs/keyring-win32-x64-msvc": "^1.3.0"
92
+ }
93
+ }