@sascha384/tic 0.1.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 (87) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +221 -0
  3. package/dist/app.d.ts +17 -0
  4. package/dist/app.js +27 -0
  5. package/dist/app.js.map +1 -0
  6. package/dist/backends/factory.d.ts +5 -0
  7. package/dist/backends/factory.js +42 -0
  8. package/dist/backends/factory.js.map +1 -0
  9. package/dist/backends/github/gh.d.ts +2 -0
  10. package/dist/backends/github/gh.js +17 -0
  11. package/dist/backends/github/gh.js.map +1 -0
  12. package/dist/backends/github/index.d.ts +26 -0
  13. package/dist/backends/github/index.js +188 -0
  14. package/dist/backends/github/index.js.map +1 -0
  15. package/dist/backends/github/mappers.d.ts +33 -0
  16. package/dist/backends/github/mappers.js +26 -0
  17. package/dist/backends/github/mappers.js.map +1 -0
  18. package/dist/backends/gitlab/glab.d.ts +2 -0
  19. package/dist/backends/gitlab/glab.js +17 -0
  20. package/dist/backends/gitlab/glab.js.map +1 -0
  21. package/dist/backends/gitlab/group.d.ts +1 -0
  22. package/dist/backends/gitlab/group.js +33 -0
  23. package/dist/backends/gitlab/group.js.map +1 -0
  24. package/dist/backends/gitlab/index.d.ts +29 -0
  25. package/dist/backends/gitlab/index.js +296 -0
  26. package/dist/backends/gitlab/index.js.map +1 -0
  27. package/dist/backends/gitlab/mappers.d.ts +43 -0
  28. package/dist/backends/gitlab/mappers.js +44 -0
  29. package/dist/backends/gitlab/mappers.js.map +1 -0
  30. package/dist/backends/local/config.d.ts +12 -0
  31. package/dist/backends/local/config.js +28 -0
  32. package/dist/backends/local/config.js.map +1 -0
  33. package/dist/backends/local/index.d.ts +26 -0
  34. package/dist/backends/local/index.js +212 -0
  35. package/dist/backends/local/index.js.map +1 -0
  36. package/dist/backends/local/items.d.ts +6 -0
  37. package/dist/backends/local/items.js +118 -0
  38. package/dist/backends/local/items.js.map +1 -0
  39. package/dist/backends/types.d.ts +56 -0
  40. package/dist/backends/types.js +39 -0
  41. package/dist/backends/types.js.map +1 -0
  42. package/dist/cli/commands/config.d.ts +2 -0
  43. package/dist/cli/commands/config.js +40 -0
  44. package/dist/cli/commands/config.js.map +1 -0
  45. package/dist/cli/commands/init.d.ts +6 -0
  46. package/dist/cli/commands/init.js +12 -0
  47. package/dist/cli/commands/init.js.map +1 -0
  48. package/dist/cli/commands/item.d.ts +41 -0
  49. package/dist/cli/commands/item.js +80 -0
  50. package/dist/cli/commands/item.js.map +1 -0
  51. package/dist/cli/commands/iteration.d.ts +7 -0
  52. package/dist/cli/commands/iteration.js +10 -0
  53. package/dist/cli/commands/iteration.js.map +1 -0
  54. package/dist/cli/commands/mcp.d.ts +85 -0
  55. package/dist/cli/commands/mcp.js +448 -0
  56. package/dist/cli/commands/mcp.js.map +1 -0
  57. package/dist/cli/format.d.ts +3 -0
  58. package/dist/cli/format.js +10 -0
  59. package/dist/cli/format.js.map +1 -0
  60. package/dist/cli/index.d.ts +4 -0
  61. package/dist/cli/index.js +426 -0
  62. package/dist/cli/index.js.map +1 -0
  63. package/dist/components/IterationPicker.d.ts +1 -0
  64. package/dist/components/IterationPicker.js +18 -0
  65. package/dist/components/IterationPicker.js.map +1 -0
  66. package/dist/components/Settings.d.ts +1 -0
  67. package/dist/components/Settings.js +40 -0
  68. package/dist/components/Settings.js.map +1 -0
  69. package/dist/components/WorkItemForm.d.ts +1 -0
  70. package/dist/components/WorkItemForm.js +270 -0
  71. package/dist/components/WorkItemForm.js.map +1 -0
  72. package/dist/components/WorkItemList.d.ts +1 -0
  73. package/dist/components/WorkItemList.js +219 -0
  74. package/dist/components/WorkItemList.js.map +1 -0
  75. package/dist/git.d.ts +38 -0
  76. package/dist/git.js +115 -0
  77. package/dist/git.js.map +1 -0
  78. package/dist/implement.d.ts +25 -0
  79. package/dist/implement.js +130 -0
  80. package/dist/implement.js.map +1 -0
  81. package/dist/index.d.ts +2 -0
  82. package/dist/index.js +14 -0
  83. package/dist/index.js.map +1 -0
  84. package/dist/types.d.ts +26 -0
  85. package/dist/types.js +2 -0
  86. package/dist/types.js.map +1 -0
  87. package/package.json +66 -0
@@ -0,0 +1,426 @@
1
+ import { Command } from 'commander';
2
+ import { createBackend as createBackendFromConfig, detectBackend, VALID_BACKENDS, } from '../backends/factory.js';
3
+ import { formatTsvRow, formatTsvKeyValue, formatJson } from './format.js';
4
+ import { runInit } from './commands/init.js';
5
+ import { runConfigGet, runConfigSet } from './commands/config.js';
6
+ import { runItemList, runItemShow, runItemCreate, runItemUpdate, runItemDelete, runItemOpen, runItemComment, } from './commands/item.js';
7
+ import { runIterationList, runIterationSet } from './commands/iteration.js';
8
+ import { startMcpServer } from './commands/mcp.js';
9
+ import fs from 'node:fs';
10
+ import path from 'node:path';
11
+ function itemToTsvRow(item) {
12
+ return formatTsvRow([
13
+ String(item.id),
14
+ item.type,
15
+ item.status,
16
+ item.priority,
17
+ item.title,
18
+ item.iteration,
19
+ ]);
20
+ }
21
+ function itemToTsvDetail(item) {
22
+ const pairs = [
23
+ ['id', String(item.id)],
24
+ ['title', item.title],
25
+ ['type', item.type],
26
+ ['status', item.status],
27
+ ['priority', item.priority],
28
+ ['iteration', item.iteration],
29
+ ['assignee', item.assignee],
30
+ ['labels', item.labels.join(',')],
31
+ ['parent', item.parent !== null ? String(item.parent) : ''],
32
+ ['depends_on', item.dependsOn.join(',')],
33
+ ['created', item.created],
34
+ ['updated', item.updated],
35
+ ];
36
+ let output = formatTsvKeyValue(pairs);
37
+ if (item.description) {
38
+ output += '\n\n' + item.description;
39
+ }
40
+ return output;
41
+ }
42
+ function readStdin() {
43
+ if (process.stdin.isTTY)
44
+ return '';
45
+ return fs.readFileSync(0, 'utf-8').trim();
46
+ }
47
+ export function requireTicProject(root) {
48
+ const ticDir = path.join(root, '.tic');
49
+ if (!fs.existsSync(ticDir)) {
50
+ throw new Error("Not a tic project (no .tic/ directory found). Run 'tic init' first.");
51
+ }
52
+ }
53
+ function createBackend() {
54
+ requireTicProject(process.cwd());
55
+ return createBackendFromConfig(process.cwd());
56
+ }
57
+ function tryGetCapabilities() {
58
+ try {
59
+ requireTicProject(process.cwd());
60
+ const backend = createBackendFromConfig(process.cwd());
61
+ return backend.getCapabilities();
62
+ }
63
+ catch {
64
+ return null; // no project — show all options
65
+ }
66
+ }
67
+ function output(data, tsvFn, opts) {
68
+ if (opts.quiet)
69
+ return;
70
+ if (opts.json) {
71
+ console.log(formatJson(data));
72
+ }
73
+ else {
74
+ console.log(tsvFn());
75
+ }
76
+ }
77
+ function handleError(err, json) {
78
+ const message = err instanceof Error ? err.message : String(err);
79
+ if (json) {
80
+ console.error(formatJson({ error: message }));
81
+ }
82
+ else {
83
+ console.error(`Error: ${message}`);
84
+ }
85
+ process.exit(1);
86
+ }
87
+ export function createProgram() {
88
+ const program = new Command();
89
+ program.name('tic').version('0.1.0').description('Terminal issue tracker');
90
+ const caps = tryGetCapabilities();
91
+ // tic init
92
+ program
93
+ .command('init')
94
+ .description('Initialize a new .tic project')
95
+ .option('--backend <backend>', 'Backend type (local, github, gitlab, azure)')
96
+ .action((opts) => {
97
+ const parentOpts = program.opts();
98
+ try {
99
+ let backend = opts.backend;
100
+ if (!backend) {
101
+ const detected = detectBackend(process.cwd());
102
+ if (process.stdin.isTTY) {
103
+ console.log(`Detected backend: ${detected}`);
104
+ console.log(`Available backends: ${VALID_BACKENDS.join(', ')}`);
105
+ console.log(`Using: ${detected} (pass --backend to override)`);
106
+ }
107
+ backend = detected;
108
+ }
109
+ if (!VALID_BACKENDS.includes(backend)) {
110
+ throw new Error(`Invalid backend "${backend}". Valid: ${VALID_BACKENDS.join(', ')}`);
111
+ }
112
+ const result = runInit(process.cwd(), backend);
113
+ if (result.alreadyExists) {
114
+ console.log('Already initialized in .tic/');
115
+ }
116
+ else {
117
+ output({ initialized: true, backend }, () => `Initialized .tic/ with backend: ${backend}`, parentOpts);
118
+ }
119
+ }
120
+ catch (err) {
121
+ handleError(err, parentOpts.json);
122
+ }
123
+ });
124
+ // tic item ...
125
+ const item = program.command('item').description('Manage work items');
126
+ item
127
+ .command('list')
128
+ .description('List work items')
129
+ .option('--status <status>', 'Filter by status')
130
+ .option('--type <type>', 'Filter by work item type')
131
+ .option('--iteration <name>', 'Filter by iteration')
132
+ .option('--all', 'Show all iterations')
133
+ .option('--headers', 'Include column headers')
134
+ .action((opts) => {
135
+ const parentOpts = program.opts();
136
+ try {
137
+ const backend = createBackend();
138
+ const items = runItemList(backend, opts);
139
+ if (parentOpts.quiet)
140
+ return;
141
+ if (parentOpts.json) {
142
+ console.log(formatJson(items));
143
+ }
144
+ else {
145
+ if (opts.headers) {
146
+ console.log(formatTsvRow([
147
+ 'id',
148
+ 'type',
149
+ 'status',
150
+ 'priority',
151
+ 'title',
152
+ 'iteration',
153
+ ]));
154
+ }
155
+ for (const i of items) {
156
+ console.log(itemToTsvRow(i));
157
+ }
158
+ }
159
+ }
160
+ catch (err) {
161
+ handleError(err, parentOpts.json);
162
+ }
163
+ });
164
+ item
165
+ .command('show')
166
+ .description('Show work item details')
167
+ .argument('<id>', 'Work item ID')
168
+ .action((idStr) => {
169
+ const parentOpts = program.opts();
170
+ try {
171
+ const backend = createBackend();
172
+ const wi = runItemShow(backend, idStr);
173
+ output(wi, () => itemToTsvDetail(wi), parentOpts);
174
+ }
175
+ catch (err) {
176
+ handleError(err, parentOpts.json);
177
+ }
178
+ });
179
+ item
180
+ .command('open')
181
+ .description('Open a work item in an external editor or browser')
182
+ .argument('<id>', 'Work item ID')
183
+ .action((idStr) => {
184
+ const parentOpts = program.opts();
185
+ try {
186
+ const backend = createBackend();
187
+ runItemOpen(backend, idStr);
188
+ }
189
+ catch (err) {
190
+ handleError(err, parentOpts.json);
191
+ }
192
+ });
193
+ const create = item
194
+ .command('create')
195
+ .description('Create a new work item')
196
+ .argument('<title>', 'Work item title')
197
+ .option('--status <status>', 'Initial status');
198
+ if (!caps || caps.customTypes)
199
+ create.option('--type <type>', 'Work item type');
200
+ if (!caps || caps.fields.priority)
201
+ create.option('--priority <priority>', 'Priority level');
202
+ if (!caps || caps.fields.assignee)
203
+ create.option('--assignee <name>', 'Assignee');
204
+ if (!caps || caps.fields.labels)
205
+ create.option('--labels <labels>', 'Comma-separated labels');
206
+ if (!caps || caps.iterations)
207
+ create.option('--iteration <name>', 'Iteration');
208
+ if (!caps || caps.fields.parent)
209
+ create.option('--parent <id>', 'Parent item ID');
210
+ if (!caps || caps.fields.dependsOn)
211
+ create.option('--depends-on <ids>', 'Comma-separated dependency IDs');
212
+ create.action((title, opts) => {
213
+ const parentOpts = program.opts();
214
+ try {
215
+ const backend = createBackend();
216
+ const description = readStdin();
217
+ const wi = runItemCreate(backend, title, {
218
+ ...opts,
219
+ dependsOn: opts.dependsOn,
220
+ description,
221
+ });
222
+ output(wi, () => itemToTsvRow(wi), parentOpts);
223
+ }
224
+ catch (err) {
225
+ handleError(err, parentOpts.json);
226
+ }
227
+ });
228
+ const update = item
229
+ .command('update')
230
+ .description('Update a work item')
231
+ .argument('<id>', 'Work item ID')
232
+ .option('--title <title>', 'New title')
233
+ .option('--status <status>', 'Status');
234
+ if (!caps || caps.customTypes)
235
+ update.option('--type <type>', 'Work item type');
236
+ if (!caps || caps.fields.priority)
237
+ update.option('--priority <priority>', 'Priority level');
238
+ if (!caps || caps.fields.assignee)
239
+ update.option('--assignee <name>', 'Assignee');
240
+ if (!caps || caps.fields.labels)
241
+ update.option('--labels <labels>', 'Comma-separated labels');
242
+ if (!caps || caps.iterations)
243
+ update.option('--iteration <name>', 'Iteration');
244
+ if (!caps || caps.fields.parent)
245
+ update.option('--parent <id>', 'Parent item ID');
246
+ if (!caps || caps.fields.dependsOn)
247
+ update.option('--depends-on <ids>', 'Comma-separated dependency IDs');
248
+ update.action((idStr, opts) => {
249
+ const parentOpts = program.opts();
250
+ try {
251
+ const backend = createBackend();
252
+ const description = readStdin();
253
+ const updateOpts = {
254
+ ...opts,
255
+ dependsOn: opts.dependsOn,
256
+ ...(description ? { description } : {}),
257
+ };
258
+ const wi = runItemUpdate(backend, idStr, updateOpts);
259
+ output(wi, () => itemToTsvRow(wi), parentOpts);
260
+ }
261
+ catch (err) {
262
+ handleError(err, parentOpts.json);
263
+ }
264
+ });
265
+ item
266
+ .command('delete')
267
+ .description('Delete a work item')
268
+ .argument('<id>', 'Work item ID')
269
+ .action((idStr) => {
270
+ const parentOpts = program.opts();
271
+ try {
272
+ const backend = createBackend();
273
+ runItemDelete(backend, idStr);
274
+ if (!parentOpts.quiet) {
275
+ if (parentOpts.json) {
276
+ console.log(formatJson({ deleted: idStr }));
277
+ }
278
+ else {
279
+ console.log(`Deleted item ${idStr}`);
280
+ }
281
+ }
282
+ }
283
+ catch (err) {
284
+ handleError(err, parentOpts.json);
285
+ }
286
+ });
287
+ if (!caps || caps.comments) {
288
+ item
289
+ .command('comment')
290
+ .description('Add a comment to a work item')
291
+ .argument('<id>', 'Work item ID')
292
+ .argument('<text>', 'Comment text')
293
+ .option('--author <name>', 'Comment author')
294
+ .action((idStr, text, opts) => {
295
+ const parentOpts = program.opts();
296
+ try {
297
+ const backend = createBackend();
298
+ const comment = runItemComment(backend, idStr, text, opts);
299
+ output(comment, () => formatTsvRow([comment.author, comment.date, comment.body]), parentOpts);
300
+ }
301
+ catch (err) {
302
+ handleError(err, parentOpts.json);
303
+ }
304
+ });
305
+ }
306
+ // tic iteration ...
307
+ if (!caps || caps.iterations) {
308
+ const iteration = program
309
+ .command('iteration')
310
+ .description('Manage iterations');
311
+ iteration
312
+ .command('list')
313
+ .description('List iterations')
314
+ .action(() => {
315
+ const parentOpts = program.opts();
316
+ try {
317
+ const backend = createBackend();
318
+ const result = runIterationList(backend);
319
+ if (parentOpts.quiet)
320
+ return;
321
+ if (parentOpts.json) {
322
+ console.log(formatJson(result));
323
+ }
324
+ else {
325
+ for (const iter of result.iterations) {
326
+ const marker = iter === result.current ? '*' : ' ';
327
+ console.log(`${marker}\t${iter}`);
328
+ }
329
+ }
330
+ }
331
+ catch (err) {
332
+ handleError(err, parentOpts.json);
333
+ }
334
+ });
335
+ iteration
336
+ .command('set')
337
+ .description('Set current iteration')
338
+ .argument('<name>', 'Iteration name')
339
+ .action((name) => {
340
+ const parentOpts = program.opts();
341
+ try {
342
+ const backend = createBackend();
343
+ runIterationSet(backend, name);
344
+ if (!parentOpts.quiet) {
345
+ if (parentOpts.json) {
346
+ console.log(formatJson({ current_iteration: name }));
347
+ }
348
+ else {
349
+ console.log(`Current iteration set to ${name}`);
350
+ }
351
+ }
352
+ }
353
+ catch (err) {
354
+ handleError(err, parentOpts.json);
355
+ }
356
+ });
357
+ }
358
+ // tic config ...
359
+ const config = program
360
+ .command('config')
361
+ .description('Manage project configuration');
362
+ config
363
+ .command('get')
364
+ .description('Get a configuration value')
365
+ .argument('<key>', 'Config key')
366
+ .action((key) => {
367
+ const parentOpts = program.opts();
368
+ try {
369
+ requireTicProject(process.cwd());
370
+ const value = runConfigGet(process.cwd(), key);
371
+ if (parentOpts.quiet)
372
+ return;
373
+ if (parentOpts.json) {
374
+ console.log(formatJson({ [key]: value }));
375
+ }
376
+ else {
377
+ console.log(Array.isArray(value) ? value.join('\n') : String(value));
378
+ }
379
+ }
380
+ catch (err) {
381
+ handleError(err, parentOpts.json);
382
+ }
383
+ });
384
+ config
385
+ .command('set')
386
+ .description('Set a configuration value')
387
+ .argument('<key>', 'Config key')
388
+ .argument('<value>', 'Config value')
389
+ .action((key, value) => {
390
+ const parentOpts = program.opts();
391
+ try {
392
+ requireTicProject(process.cwd());
393
+ runConfigSet(process.cwd(), key, value);
394
+ if (!parentOpts.quiet) {
395
+ if (parentOpts.json) {
396
+ console.log(formatJson({ [key]: value }));
397
+ }
398
+ else {
399
+ console.log(`Set ${key} = ${value}`);
400
+ }
401
+ }
402
+ }
403
+ catch (err) {
404
+ handleError(err, parentOpts.json);
405
+ }
406
+ });
407
+ // tic mcp ...
408
+ const mcp = program
409
+ .command('mcp')
410
+ .description('Model Context Protocol (MCP) server for AI assistants');
411
+ mcp
412
+ .command('serve')
413
+ .description('Start the MCP server on stdio, exposing 14 tools for work item management')
414
+ .action(async () => {
415
+ await startMcpServer();
416
+ });
417
+ // Global options
418
+ program.option('--json', 'Output as JSON');
419
+ program.option('--quiet', 'Suppress output on mutations');
420
+ return program;
421
+ }
422
+ export async function runCli(argv) {
423
+ const program = createProgram();
424
+ await program.parseAsync(argv);
425
+ }
426
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function IterationPicker(): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,18 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from 'ink';
3
+ import SelectInput from 'ink-select-input';
4
+ import { useAppState } from '../app.js';
5
+ export function IterationPicker() {
6
+ const { backend, navigate } = useAppState();
7
+ const iterations = backend.getIterations();
8
+ const current = backend.getCurrentIteration();
9
+ const items = iterations.map((it) => ({
10
+ label: it === current ? `${it} (current)` : it,
11
+ value: it,
12
+ }));
13
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { marginBottom: 1, children: _jsx(Text, { bold: true, children: "Switch Iteration" }) }), _jsx(SelectInput, { items: items, initialIndex: iterations.indexOf(current), onSelect: (item) => {
14
+ backend.setCurrentIteration(item.value);
15
+ navigate('list');
16
+ } }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { dimColor: true, children: "up/down: navigate enter: select" }) })] }));
17
+ }
18
+ //# sourceMappingURL=IterationPicker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IterationPicker.js","sourceRoot":"","sources":["../../src/components/IterationPicker.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,WAAW,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,MAAM,UAAU,eAAe;IAC7B,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,WAAW,EAAE,CAAC;IAC5C,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAC3C,MAAM,OAAO,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAE9C,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACpC,KAAK,EAAE,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE;QAC9C,KAAK,EAAE,EAAE;KACV,CAAC,CAAC,CAAC;IAEJ,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,KAAC,GAAG,IAAC,YAAY,EAAE,CAAC,YAClB,KAAC,IAAI,IAAC,IAAI,uCAAwB,GAC9B,EACN,KAAC,WAAW,IACV,KAAK,EAAE,KAAK,EACZ,YAAY,EAAE,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,EACzC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE;oBACjB,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACxC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACnB,CAAC,GACD,EACF,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,KAAC,IAAI,IAAC,QAAQ,sDAAuC,GACjD,IACF,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function Settings(): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,40 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState, useMemo } from 'react';
3
+ import { Box, Text, useInput } from 'ink';
4
+ import { useAppState } from '../app.js';
5
+ import { readConfig, writeConfig } from '../backends/local/config.js';
6
+ import { VALID_BACKENDS } from '../backends/factory.js';
7
+ export function Settings() {
8
+ const { navigate } = useAppState();
9
+ const root = process.cwd();
10
+ const config = useMemo(() => readConfig(root), [root]);
11
+ const [cursor, setCursor] = useState(Math.max(0, VALID_BACKENDS.indexOf(config.backend)));
12
+ useInput((input, key) => {
13
+ if (key.escape || input === ',') {
14
+ navigate('list');
15
+ return;
16
+ }
17
+ if (key.upArrow) {
18
+ setCursor((c) => Math.max(0, c - 1));
19
+ }
20
+ if (key.downArrow) {
21
+ setCursor((c) => Math.min(VALID_BACKENDS.length - 1, c + 1));
22
+ }
23
+ if (key.return) {
24
+ const selected = VALID_BACKENDS[cursor];
25
+ if (selected !== 'local' && selected !== 'github') {
26
+ // Non-local/github backends not yet available
27
+ return;
28
+ }
29
+ config.backend = selected;
30
+ writeConfig(root, config);
31
+ }
32
+ });
33
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { marginBottom: 1, children: _jsx(Text, { bold: true, color: "cyan", children: "Settings" }) }), _jsx(Text, { bold: true, children: "Backend:" }), VALID_BACKENDS.map((b, idx) => {
34
+ const selected = idx === cursor;
35
+ const isCurrent = b === config.backend;
36
+ const available = b === 'local' || b === 'github';
37
+ return (_jsxs(Box, { children: [_jsxs(Text, { color: selected ? 'cyan' : undefined, children: [selected ? '>' : ' ', ' '] }), _jsxs(Text, { color: selected ? 'cyan' : undefined, bold: selected, dimColor: !available, children: [b, isCurrent ? ' (current)' : '', !available ? ' (not yet available)' : ''] })] }, b));
38
+ }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { bold: true, children: "Project Config:" }), _jsx(Box, { marginLeft: 2, children: _jsxs(Text, { dimColor: true, children: ["Types: ", config.types.join(', ')] }) }), _jsx(Box, { marginLeft: 2, children: _jsxs(Text, { dimColor: true, children: ["Statuses: ", config.statuses.join(', ')] }) }), _jsx(Box, { marginLeft: 2, children: _jsxs(Text, { dimColor: true, children: ["Iterations: ", config.iterations.join(', ')] }) }), _jsx(Box, { marginLeft: 2, children: _jsxs(Text, { dimColor: true, children: ["Current iteration: ", config.current_iteration] }) })] }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { dimColor: true, children: "up/down: navigate enter: select esc/,: back" }) })] }));
39
+ }
40
+ //# sourceMappingURL=Settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Settings.js","sourceRoot":"","sources":["../../src/components/Settings.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function WorkItemForm(): import("react/jsx-runtime").JSX.Element;