@hartvig/developer-control-center 0.8.5 → 0.8.7

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 (97) hide show
  1. package/.developer-control-center/metrics.json +1 -1
  2. package/.developer-control-center/status.json +1 -1
  3. package/.developer-control-center/timings.jsonl +24 -0
  4. package/.github/workflows/ci.yml +1 -7
  5. package/coverage/Developer Control Center/dcc.config.js.html +628 -0
  6. package/coverage/Developer Control Center/index.html +116 -0
  7. package/coverage/Developer Control Center/src/config/index.html +116 -0
  8. package/coverage/Developer Control Center/src/config/loader.ts.html +454 -0
  9. package/coverage/Developer Control Center/src/core/ci.ts.html +163 -0
  10. package/coverage/Developer Control Center/src/core/event-bus.ts.html +187 -0
  11. package/coverage/Developer Control Center/src/core/index.html +191 -0
  12. package/coverage/Developer Control Center/src/core/notifier.ts.html +187 -0
  13. package/coverage/Developer Control Center/src/core/persistence.ts.html +88 -0
  14. package/coverage/Developer Control Center/src/core/task-runner.ts.html +1498 -0
  15. package/coverage/Developer Control Center/src/core/workspaces.ts.html +304 -0
  16. package/coverage/Developer Control Center/src/plugins/index.html +116 -0
  17. package/coverage/Developer Control Center/src/plugins/manager.ts.html +259 -0
  18. package/coverage/Developer Control Center/src/status/index.html +116 -0
  19. package/coverage/Developer Control Center/src/status/store.ts.html +349 -0
  20. package/coverage/Developer Control Center/src/ui/command-list.tsx.html +574 -0
  21. package/coverage/Developer Control Center/src/ui/index.html +161 -0
  22. package/coverage/Developer Control Center/src/ui/metrics-panel.tsx.html +787 -0
  23. package/coverage/Developer Control Center/src/ui/panel.tsx.html +313 -0
  24. package/coverage/Developer Control Center/src/ui/status-panel.tsx.html +565 -0
  25. package/coverage/base.css +224 -0
  26. package/coverage/block-navigation.js +87 -0
  27. package/coverage/clover.xml +588 -0
  28. package/coverage/coverage-final.json +15 -0
  29. package/coverage/favicon.png +0 -0
  30. package/coverage/index.html +191 -0
  31. package/coverage/prettify.css +1 -0
  32. package/coverage/prettify.js +2 -0
  33. package/coverage/sort-arrow-sprite.png +0 -0
  34. package/coverage/sorter.js +210 -0
  35. package/dcc.config.js +8 -4
  36. package/dist/cli.js +0 -0
  37. package/dist/core/persistence.d.ts +2 -0
  38. package/dist/core/persistence.d.ts.map +1 -0
  39. package/dist/core/persistence.js +2 -0
  40. package/dist/core/persistence.js.map +1 -0
  41. package/dist/core/runtime.d.ts.map +1 -1
  42. package/dist/core/runtime.js +5 -2
  43. package/dist/core/runtime.js.map +1 -1
  44. package/dist/core/task-runner.d.ts +1 -0
  45. package/dist/core/task-runner.d.ts.map +1 -1
  46. package/dist/core/task-runner.js +24 -4
  47. package/dist/core/task-runner.js.map +1 -1
  48. package/dist/core/task-runner.test.d.ts +2 -0
  49. package/dist/core/task-runner.test.d.ts.map +1 -0
  50. package/dist/core/task-runner.test.js +326 -0
  51. package/dist/core/task-runner.test.js.map +1 -0
  52. package/dist/core/timer-plugin.d.ts.map +1 -1
  53. package/dist/core/timer-plugin.js +2 -1
  54. package/dist/core/timer-plugin.js.map +1 -1
  55. package/dist/plugins/manager.d.ts +2 -0
  56. package/dist/plugins/manager.d.ts.map +1 -1
  57. package/dist/plugins/manager.js +6 -2
  58. package/dist/plugins/manager.js.map +1 -1
  59. package/dist/plugins/manager.test.js +5 -2
  60. package/dist/plugins/manager.test.js.map +1 -1
  61. package/dist/ui/app.d.ts.map +1 -1
  62. package/dist/ui/app.js +106 -19
  63. package/dist/ui/app.js.map +1 -1
  64. package/dist/ui/command-list.test.d.ts +2 -0
  65. package/dist/ui/command-list.test.d.ts.map +1 -0
  66. package/dist/ui/command-list.test.js +104 -0
  67. package/dist/ui/command-list.test.js.map +1 -0
  68. package/dist/ui/metrics-panel.d.ts.map +1 -1
  69. package/dist/ui/metrics-panel.js +10 -9
  70. package/dist/ui/metrics-panel.js.map +1 -1
  71. package/dist/ui/metrics-panel.test.d.ts +2 -0
  72. package/dist/ui/metrics-panel.test.d.ts.map +1 -0
  73. package/dist/ui/metrics-panel.test.js +111 -0
  74. package/dist/ui/metrics-panel.test.js.map +1 -0
  75. package/dist/ui/panel.test.d.ts +2 -0
  76. package/dist/ui/panel.test.d.ts.map +1 -0
  77. package/dist/ui/panel.test.js +51 -0
  78. package/dist/ui/panel.test.js.map +1 -0
  79. package/dist/ui/status-panel.test.d.ts +2 -0
  80. package/dist/ui/status-panel.test.d.ts.map +1 -0
  81. package/dist/ui/status-panel.test.js +88 -0
  82. package/dist/ui/status-panel.test.js.map +1 -0
  83. package/package.json +3 -1
  84. package/src/core/persistence.ts +1 -0
  85. package/src/core/runtime.ts +7 -2
  86. package/src/core/task-runner.test.ts +395 -0
  87. package/src/core/task-runner.ts +26 -5
  88. package/src/core/timer-plugin.ts +2 -1
  89. package/src/plugins/manager.test.ts +5 -2
  90. package/src/plugins/manager.ts +6 -2
  91. package/src/ui/app.tsx +151 -31
  92. package/src/ui/command-list.test.tsx +124 -0
  93. package/src/ui/metrics-panel.test.tsx +128 -0
  94. package/src/ui/metrics-panel.tsx +10 -10
  95. package/src/ui/panel.test.tsx +84 -0
  96. package/src/ui/status-panel.test.tsx +116 -0
  97. package/vitest.config.ts +1 -1
@@ -0,0 +1,116 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import React from 'react';
3
+ import { render } from 'ink-testing-library';
4
+ import { StatusPanel } from './status-panel.js';
5
+
6
+ function makeTask(overrides: Record<string, any> = {}) {
7
+ return {
8
+ id: 'test',
9
+ label: 'Test Task',
10
+ status: 'running',
11
+ output: '',
12
+ startTime: Date.now(),
13
+ ...overrides,
14
+ } as any;
15
+ }
16
+
17
+ describe('StatusPanel', () => {
18
+ const baseProps = {
19
+ tasks: new Map(),
20
+ scrollOffsets: new Map(),
21
+ focusedPane: 'commands' as const,
22
+ width: 60,
23
+ menuRows: 10,
24
+ };
25
+
26
+ it('shows no tasks yet when empty', () => {
27
+ const { lastFrame } = render(<StatusPanel {...baseProps} />);
28
+ expect(lastFrame()).toContain('No tasks yet');
29
+ });
30
+
31
+ it('displays the task label and status', () => {
32
+ const tasks = new Map([['test', makeTask({ label: 'My Task', status: 'running' })]]);
33
+ const { lastFrame } = render(<StatusPanel {...baseProps} tasks={tasks} />);
34
+ const frame = lastFrame();
35
+ expect(frame).toContain('My Task');
36
+ expect(frame).toContain('RUNNING');
37
+ });
38
+
39
+ it('shows success status with green icon', () => {
40
+ const tasks = new Map([['test', makeTask({ status: 'success' })]]);
41
+ const { lastFrame } = render(<StatusPanel {...baseProps} tasks={tasks} />);
42
+ expect(lastFrame()).toContain('PASS');
43
+ });
44
+
45
+ it('shows failure status', () => {
46
+ const tasks = new Map([['test', makeTask({ status: 'failure', exitCode: 1 })]]);
47
+ const { lastFrame } = render(<StatusPanel {...baseProps} tasks={tasks} />);
48
+ expect(lastFrame()).toContain('FAIL');
49
+ expect(lastFrame()).toContain('exit 1');
50
+ });
51
+
52
+ it('displays output lines', () => {
53
+ const tasks = new Map([['test', makeTask({ output: 'line1\nline2\nline3' })]]) as any;
54
+ const { lastFrame } = render(<StatusPanel {...baseProps} tasks={tasks} />);
55
+ const frame = lastFrame();
56
+ expect(frame).toContain('line1');
57
+ expect(frame).toContain('line2');
58
+ expect(frame).toContain('line3');
59
+ });
60
+
61
+ it('shows confirm prompt when confirmingCommand is set', () => {
62
+ const { lastFrame } = render(
63
+ <StatusPanel
64
+ {...baseProps}
65
+ confirmingCommand={{ id: 'deploy', label: 'Deploy', command: 'npm run deploy' } as any}
66
+ />,
67
+ );
68
+ const frame = lastFrame();
69
+ expect(frame).toContain('Run');
70
+ expect(frame).toContain('Deploy');
71
+ });
72
+
73
+ it('shows input prompt when inputCommand is set', () => {
74
+ const { lastFrame } = render(
75
+ <StatusPanel
76
+ {...baseProps}
77
+ inputCommand={{ id: 'greet', label: 'Greet', command: 'echo', input: { message: 'Enter name:' } } as any}
78
+ />,
79
+ );
80
+ const frame = lastFrame();
81
+ expect(frame).toContain('Enter name:');
82
+ });
83
+
84
+ it('shows input value', () => {
85
+ const { lastFrame } = render(
86
+ <StatusPanel
87
+ {...baseProps}
88
+ inputCommand={{ id: 'greet', label: 'Greet', command: 'echo', input: {} } as any}
89
+ inputValue="hello"
90
+ />,
91
+ );
92
+ expect(lastFrame()).toContain('hello');
93
+ });
94
+
95
+ it('sanitizes ANSI escape codes from output', () => {
96
+ const tasks = new Map([['test', makeTask({ output: '\x1B[31mred\x1B[0m' })]]) as any;
97
+ const { lastFrame } = render(<StatusPanel {...baseProps} tasks={tasks} />);
98
+ expect(lastFrame()).not.toContain('\x1B[');
99
+ expect(lastFrame()).toContain('red');
100
+ });
101
+
102
+ it('shows duration for completed tasks', () => {
103
+ const now = Date.now();
104
+ const tasks = new Map([
105
+ ['test', makeTask({ startTime: now - 5000, endTime: now, status: 'success' })],
106
+ ]) as any;
107
+ const { lastFrame } = render(<StatusPanel {...baseProps} tasks={tasks} />);
108
+ expect(lastFrame()).toContain('5.0s');
109
+ });
110
+
111
+ it('shows watch mode indicator', () => {
112
+ const tasks = new Map([['test', makeTask({ watchMode: true, status: 'running' })]]);
113
+ const { lastFrame } = render(<StatusPanel {...baseProps} tasks={tasks} />);
114
+ expect(lastFrame()).toContain('WATCH');
115
+ });
116
+ });
package/vitest.config.ts CHANGED
@@ -2,7 +2,7 @@ import { defineConfig } from 'vitest/config';
2
2
 
3
3
  export default defineConfig({
4
4
  test: {
5
- include: ['src/**/*.test.ts'],
5
+ include: ['src/**/*.test.ts', 'src/**/*.test.tsx'],
6
6
  globals: true,
7
7
  },
8
8
  });