@hartvig/developer-control-center 0.8.2

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 (193) hide show
  1. package/.developer-control-center/metrics.json +1 -0
  2. package/.developer-control-center/status.json +1 -0
  3. package/.developer-control-center/timings.jsonl +3 -0
  4. package/.github/workflows/ci.yml +47 -0
  5. package/AGENTS.md +51 -0
  6. package/PLUGINS.md +145 -0
  7. package/README.md +147 -0
  8. package/developer-control-center.config.example.js +91 -0
  9. package/developer-control-center.config.js +177 -0
  10. package/dist/cli.d.ts +3 -0
  11. package/dist/cli.d.ts.map +1 -0
  12. package/dist/cli.js +223 -0
  13. package/dist/cli.js.map +1 -0
  14. package/dist/config/index.d.ts +3 -0
  15. package/dist/config/index.d.ts.map +1 -0
  16. package/dist/config/index.js +2 -0
  17. package/dist/config/index.js.map +1 -0
  18. package/dist/config/loader.d.ts +4 -0
  19. package/dist/config/loader.d.ts.map +1 -0
  20. package/dist/config/loader.js +96 -0
  21. package/dist/config/loader.js.map +1 -0
  22. package/dist/config/loader.test.d.ts +2 -0
  23. package/dist/config/loader.test.d.ts.map +1 -0
  24. package/dist/config/loader.test.js +25 -0
  25. package/dist/config/loader.test.js.map +1 -0
  26. package/dist/config/presets/node.d.ts +10 -0
  27. package/dist/config/presets/node.d.ts.map +1 -0
  28. package/dist/config/presets/node.js +31 -0
  29. package/dist/config/presets/node.js.map +1 -0
  30. package/dist/config/presets/react.d.ts +10 -0
  31. package/dist/config/presets/react.d.ts.map +1 -0
  32. package/dist/config/presets/react.js +36 -0
  33. package/dist/config/presets/react.js.map +1 -0
  34. package/dist/config/types.d.ts +55 -0
  35. package/dist/config/types.d.ts.map +1 -0
  36. package/dist/config/types.js +2 -0
  37. package/dist/config/types.js.map +1 -0
  38. package/dist/config/types.test.d.ts +2 -0
  39. package/dist/config/types.test.d.ts.map +1 -0
  40. package/dist/config/types.test.js +23 -0
  41. package/dist/config/types.test.js.map +1 -0
  42. package/dist/core/ci.d.ts +6 -0
  43. package/dist/core/ci.d.ts.map +1 -0
  44. package/dist/core/ci.js +22 -0
  45. package/dist/core/ci.js.map +1 -0
  46. package/dist/core/ci.test.d.ts +2 -0
  47. package/dist/core/ci.test.d.ts.map +1 -0
  48. package/dist/core/ci.test.js +45 -0
  49. package/dist/core/ci.test.js.map +1 -0
  50. package/dist/core/event-bus.d.ts +18 -0
  51. package/dist/core/event-bus.d.ts.map +1 -0
  52. package/dist/core/event-bus.js +19 -0
  53. package/dist/core/event-bus.js.map +1 -0
  54. package/dist/core/event-bus.test.d.ts +2 -0
  55. package/dist/core/event-bus.test.d.ts.map +1 -0
  56. package/dist/core/event-bus.test.js +49 -0
  57. package/dist/core/event-bus.test.js.map +1 -0
  58. package/dist/core/index.d.ts +9 -0
  59. package/dist/core/index.d.ts.map +1 -0
  60. package/dist/core/index.js +7 -0
  61. package/dist/core/index.js.map +1 -0
  62. package/dist/core/notifier.d.ts +2 -0
  63. package/dist/core/notifier.d.ts.map +1 -0
  64. package/dist/core/notifier.js +28 -0
  65. package/dist/core/notifier.js.map +1 -0
  66. package/dist/core/notifier.test.d.ts +2 -0
  67. package/dist/core/notifier.test.d.ts.map +1 -0
  68. package/dist/core/notifier.test.js +25 -0
  69. package/dist/core/notifier.test.js.map +1 -0
  70. package/dist/core/runtime.d.ts +25 -0
  71. package/dist/core/runtime.d.ts.map +1 -0
  72. package/dist/core/runtime.js +85 -0
  73. package/dist/core/runtime.js.map +1 -0
  74. package/dist/core/task-runner.d.ts +26 -0
  75. package/dist/core/task-runner.d.ts.map +1 -0
  76. package/dist/core/task-runner.js +354 -0
  77. package/dist/core/task-runner.js.map +1 -0
  78. package/dist/core/timer-plugin.d.ts +3 -0
  79. package/dist/core/timer-plugin.d.ts.map +1 -0
  80. package/dist/core/timer-plugin.js +34 -0
  81. package/dist/core/timer-plugin.js.map +1 -0
  82. package/dist/core/workspaces.d.ts +6 -0
  83. package/dist/core/workspaces.d.ts.map +1 -0
  84. package/dist/core/workspaces.js +60 -0
  85. package/dist/core/workspaces.js.map +1 -0
  86. package/dist/core/workspaces.test.d.ts +2 -0
  87. package/dist/core/workspaces.test.d.ts.map +1 -0
  88. package/dist/core/workspaces.test.js +62 -0
  89. package/dist/core/workspaces.test.js.map +1 -0
  90. package/dist/index.d.ts +16 -0
  91. package/dist/index.d.ts.map +1 -0
  92. package/dist/index.js +11 -0
  93. package/dist/index.js.map +1 -0
  94. package/dist/plugins/index.d.ts +3 -0
  95. package/dist/plugins/index.d.ts.map +1 -0
  96. package/dist/plugins/index.js +2 -0
  97. package/dist/plugins/index.js.map +1 -0
  98. package/dist/plugins/manager.d.ts +13 -0
  99. package/dist/plugins/manager.d.ts.map +1 -0
  100. package/dist/plugins/manager.js +43 -0
  101. package/dist/plugins/manager.js.map +1 -0
  102. package/dist/plugins/manager.test.d.ts +2 -0
  103. package/dist/plugins/manager.test.d.ts.map +1 -0
  104. package/dist/plugins/manager.test.js +79 -0
  105. package/dist/plugins/manager.test.js.map +1 -0
  106. package/dist/plugins/types.d.ts +17 -0
  107. package/dist/plugins/types.d.ts.map +1 -0
  108. package/dist/plugins/types.js +2 -0
  109. package/dist/plugins/types.js.map +1 -0
  110. package/dist/status/index.d.ts +3 -0
  111. package/dist/status/index.d.ts.map +1 -0
  112. package/dist/status/index.js +2 -0
  113. package/dist/status/index.js.map +1 -0
  114. package/dist/status/store.d.ts +18 -0
  115. package/dist/status/store.d.ts.map +1 -0
  116. package/dist/status/store.js +76 -0
  117. package/dist/status/store.js.map +1 -0
  118. package/dist/status/store.test.d.ts +2 -0
  119. package/dist/status/store.test.d.ts.map +1 -0
  120. package/dist/status/store.test.js +107 -0
  121. package/dist/status/store.test.js.map +1 -0
  122. package/dist/status/types.d.ts +12 -0
  123. package/dist/status/types.d.ts.map +1 -0
  124. package/dist/status/types.js +2 -0
  125. package/dist/status/types.js.map +1 -0
  126. package/dist/ui/app.d.ts +10 -0
  127. package/dist/ui/app.d.ts.map +1 -0
  128. package/dist/ui/app.js +479 -0
  129. package/dist/ui/app.js.map +1 -0
  130. package/dist/ui/command-list.d.ts +30 -0
  131. package/dist/ui/command-list.d.ts.map +1 -0
  132. package/dist/ui/command-list.js +45 -0
  133. package/dist/ui/command-list.js.map +1 -0
  134. package/dist/ui/index.d.ts +4 -0
  135. package/dist/ui/index.d.ts.map +1 -0
  136. package/dist/ui/index.js +8 -0
  137. package/dist/ui/index.js.map +1 -0
  138. package/dist/ui/metrics-panel.d.ts +10 -0
  139. package/dist/ui/metrics-panel.d.ts.map +1 -0
  140. package/dist/ui/metrics-panel.js +139 -0
  141. package/dist/ui/metrics-panel.js.map +1 -0
  142. package/dist/ui/panel.d.ts +16 -0
  143. package/dist/ui/panel.d.ts.map +1 -0
  144. package/dist/ui/panel.js +16 -0
  145. package/dist/ui/panel.js.map +1 -0
  146. package/dist/ui/status-panel.d.ts +16 -0
  147. package/dist/ui/status-panel.d.ts.map +1 -0
  148. package/dist/ui/status-panel.js +52 -0
  149. package/dist/ui/status-panel.js.map +1 -0
  150. package/docs/architecture.md +29 -0
  151. package/docs/config.md +15 -0
  152. package/docs/mvp.md +17 -0
  153. package/docs/phases.md +49 -0
  154. package/docs/technical-decisions.md +19 -0
  155. package/docs/ui.md +14 -0
  156. package/package.json +30 -0
  157. package/src/cli.ts +242 -0
  158. package/src/config/index.ts +2 -0
  159. package/src/config/loader.test.ts +30 -0
  160. package/src/config/loader.ts +123 -0
  161. package/src/config/presets/node.ts +30 -0
  162. package/src/config/presets/react.ts +35 -0
  163. package/src/config/types.test.ts +24 -0
  164. package/src/config/types.ts +52 -0
  165. package/src/core/ci.test.ts +54 -0
  166. package/src/core/ci.ts +26 -0
  167. package/src/core/event-bus.test.ts +56 -0
  168. package/src/core/event-bus.ts +34 -0
  169. package/src/core/index.ts +8 -0
  170. package/src/core/notifier.test.ts +30 -0
  171. package/src/core/notifier.ts +34 -0
  172. package/src/core/runtime.ts +99 -0
  173. package/src/core/task-runner.ts +408 -0
  174. package/src/core/timer-plugin.ts +34 -0
  175. package/src/core/workspaces.test.ts +72 -0
  176. package/src/core/workspaces.ts +73 -0
  177. package/src/index.ts +15 -0
  178. package/src/plugins/index.ts +2 -0
  179. package/src/plugins/manager.test.ts +92 -0
  180. package/src/plugins/manager.ts +54 -0
  181. package/src/plugins/types.ts +18 -0
  182. package/src/status/index.ts +2 -0
  183. package/src/status/store.test.ts +122 -0
  184. package/src/status/store.ts +88 -0
  185. package/src/status/types.ts +12 -0
  186. package/src/ui/app.tsx +606 -0
  187. package/src/ui/command-list.tsx +163 -0
  188. package/src/ui/index.tsx +10 -0
  189. package/src/ui/metrics-panel.tsx +234 -0
  190. package/src/ui/panel.tsx +76 -0
  191. package/src/ui/status-panel.tsx +160 -0
  192. package/tsconfig.json +21 -0
  193. package/vitest.config.ts +8 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ci.test.d.ts","sourceRoot":"","sources":["../../src/core/ci.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,45 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import { detectCI } from './ci.js';
3
+ const ORIG_ENV = { ...process.env };
4
+ beforeEach(() => {
5
+ // Clear CI-related env vars
6
+ for (const key of Object.keys(process.env)) {
7
+ if (['GITHUB_ACTIONS', 'GITLAB_CI', 'CIRCLECI', 'JENKINS_URL', 'CI'].includes(key)) {
8
+ delete process.env[key];
9
+ }
10
+ }
11
+ });
12
+ afterEach(() => {
13
+ Object.assign(process.env, ORIG_ENV);
14
+ });
15
+ describe('detectCI', () => {
16
+ it('returns not CI when no CI env vars', () => {
17
+ expect(detectCI()).toEqual({ isCI: false });
18
+ });
19
+ it('detects GitHub Actions', () => {
20
+ process.env.GITHUB_ACTIONS = 'true';
21
+ expect(detectCI()).toEqual({ isCI: true, name: 'GitHub Actions' });
22
+ });
23
+ it('detects GitLab CI', () => {
24
+ process.env.GITLAB_CI = 'true';
25
+ expect(detectCI()).toEqual({ isCI: true, name: 'GitLab CI' });
26
+ });
27
+ it('detects CircleCI', () => {
28
+ process.env.CIRCLECI = 'true';
29
+ expect(detectCI()).toEqual({ isCI: true, name: 'CircleCI' });
30
+ });
31
+ it('detects Jenkins', () => {
32
+ process.env.JENKINS_URL = 'http://jenkins.example.com';
33
+ expect(detectCI()).toEqual({ isCI: true, name: 'Jenkins' });
34
+ });
35
+ it('detects generic CI', () => {
36
+ process.env.CI = 'true';
37
+ expect(detectCI()).toEqual({ isCI: true, name: 'CI' });
38
+ });
39
+ it('prefers specific CI over generic', () => {
40
+ process.env.CI = 'true';
41
+ process.env.GITHUB_ACTIONS = 'true';
42
+ expect(detectCI()).toEqual({ isCI: true, name: 'GitHub Actions' });
43
+ });
44
+ });
45
+ //# sourceMappingURL=ci.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ci.test.js","sourceRoot":"","sources":["../../src/core/ci.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { ProkomCommand } from '../config/types.js';
2
+ export interface EventMap {
3
+ 'task:start': [command: ProkomCommand];
4
+ 'task:complete': [id: string, exitCode: number | null];
5
+ 'task:output': [id: string, text: string];
6
+ 'task:error': [id: string, error: Error];
7
+ [event: string]: any[];
8
+ }
9
+ type Handler<A extends any[]> = (...args: A) => void;
10
+ export declare class EventBus {
11
+ private listeners;
12
+ on<E extends keyof EventMap>(event: E, handler: Handler<EventMap[E]>): void;
13
+ off<E extends keyof EventMap>(event: E, handler: Handler<EventMap[E]>): void;
14
+ emit<E extends keyof EventMap>(event: E, ...args: EventMap[E]): void;
15
+ removeAll(): void;
16
+ }
17
+ export {};
18
+ //# sourceMappingURL=event-bus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-bus.d.ts","sourceRoot":"","sources":["../../src/core/event-bus.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,MAAM,WAAW,QAAQ;IACvB,YAAY,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IACvC,eAAe,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;IACvD,aAAa,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAC1C,YAAY,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IACzC,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,EAAE,CAAC;CACxB;AAED,KAAK,OAAO,CAAC,CAAC,SAAS,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC;AAErD,qBAAa,QAAQ;IACnB,OAAO,CAAC,SAAS,CAAoD;IAErE,EAAE,CAAC,CAAC,SAAS,MAAM,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;IAO3E,GAAG,CAAC,CAAC,SAAS,MAAM,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;IAI5E,IAAI,CAAC,CAAC,SAAS,MAAM,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI;IAIpE,SAAS,IAAI,IAAI;CAGlB"}
@@ -0,0 +1,19 @@
1
+ export class EventBus {
2
+ listeners = new Map();
3
+ on(event, handler) {
4
+ if (!this.listeners.has(event)) {
5
+ this.listeners.set(event, new Set());
6
+ }
7
+ this.listeners.get(event).add(handler);
8
+ }
9
+ off(event, handler) {
10
+ this.listeners.get(event)?.delete(handler);
11
+ }
12
+ emit(event, ...args) {
13
+ this.listeners.get(event)?.forEach((h) => h(...args));
14
+ }
15
+ removeAll() {
16
+ this.listeners.clear();
17
+ }
18
+ }
19
+ //# sourceMappingURL=event-bus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-bus.js","sourceRoot":"","sources":["../../src/core/event-bus.ts"],"names":[],"mappings":"AAYA,MAAM,OAAO,QAAQ;IACX,SAAS,GAAG,IAAI,GAAG,EAAyC,CAAC;IAErE,EAAE,CAA2B,KAAQ,EAAE,OAA6B;QAClE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAe,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAe,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QACjD,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAe,CAAE,CAAC,GAAG,CAAC,OAAmC,CAAC,CAAC;IAChF,CAAC;IAED,GAAG,CAA2B,KAAQ,EAAE,OAA6B;QACnE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAe,CAAC,EAAE,MAAM,CAAC,OAAmC,CAAC,CAAC;IACnF,CAAC;IAED,IAAI,CAA2B,KAAQ,EAAE,GAAG,IAAiB;QAC3D,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAe,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,SAAS;QACP,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=event-bus.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-bus.test.d.ts","sourceRoot":"","sources":["../../src/core/event-bus.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,49 @@
1
+ import { describe, it, expect, beforeEach } from 'vitest';
2
+ import { EventBus } from './event-bus.js';
3
+ describe('EventBus', () => {
4
+ let bus;
5
+ beforeEach(() => {
6
+ bus = new EventBus();
7
+ });
8
+ it('emits to registered listeners', () => {
9
+ const calls = [];
10
+ bus.on('test', (msg) => calls.push(msg));
11
+ bus.emit('test', 'hello');
12
+ expect(calls).toEqual(['hello']);
13
+ });
14
+ it('emits to multiple listeners', () => {
15
+ const results = [];
16
+ bus.on('count', (n) => results.push(n * 2));
17
+ bus.on('count', (n) => results.push(n * 3));
18
+ bus.emit('count', 5);
19
+ expect(results).toEqual([10, 15]);
20
+ });
21
+ it('supports off/unsubscribe', () => {
22
+ const calls = [];
23
+ const fn = (x) => calls.push(x);
24
+ bus.on('e', fn);
25
+ bus.emit('e', 'a');
26
+ bus.off('e', fn);
27
+ bus.emit('e', 'b');
28
+ expect(calls).toEqual(['a']);
29
+ });
30
+ it('removeAll clears all listeners', () => {
31
+ const calls = [];
32
+ bus.on('x', () => calls.push('x'));
33
+ bus.on('y', () => calls.push('y'));
34
+ bus.removeAll();
35
+ bus.emit('x');
36
+ bus.emit('y');
37
+ expect(calls).toEqual([]);
38
+ });
39
+ it('does nothing for unregistered events', () => {
40
+ expect(() => bus.emit('nothing')).not.toThrow();
41
+ });
42
+ it('passes multiple arguments', () => {
43
+ const args = [];
44
+ bus.on('multi', (...a) => args.push(a));
45
+ bus.emit('multi', 1, 'two', true);
46
+ expect(args).toEqual([[1, 'two', true]]);
47
+ });
48
+ });
49
+ //# sourceMappingURL=event-bus.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-bus.test.js","sourceRoot":"","sources":["../../src/core/event-bus.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export { Runtime } from './runtime.js';
2
+ export { EventBus } from './event-bus.js';
3
+ export { TaskRunner } from './task-runner.js';
4
+ export type { WorkspacePackage } from './workspaces.js';
5
+ export { detectWorkspaces } from './workspaces.js';
6
+ export type { CIInfo } from './ci.js';
7
+ export { detectCI } from './ci.js';
8
+ export { sendNotification } from './notifier.js';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,YAAY,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,YAAY,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,7 @@
1
+ export { Runtime } from './runtime.js';
2
+ export { EventBus } from './event-bus.js';
3
+ export { TaskRunner } from './task-runner.js';
4
+ export { detectWorkspaces } from './workspaces.js';
5
+ export { detectCI } from './ci.js';
6
+ export { sendNotification } from './notifier.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function sendNotification(title: string, message: string): void;
2
+ //# sourceMappingURL=notifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifier.d.ts","sourceRoot":"","sources":["../../src/core/notifier.ts"],"names":[],"mappings":"AAIA,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GACd,IAAI,CA0BN"}
@@ -0,0 +1,28 @@
1
+ import { spawn } from 'child_process';
2
+ const children = new Set();
3
+ export function sendNotification(title, message) {
4
+ let child;
5
+ switch (process.platform) {
6
+ case 'linux':
7
+ child = spawn('notify-send', [title, message], {
8
+ stdio: 'ignore',
9
+ });
10
+ break;
11
+ case 'darwin': {
12
+ const escaped = (s) => s.replace(/"/g, '\\"');
13
+ child = spawn('osascript', ['-e',
14
+ `display notification "${escaped(message)}" with title "${escaped(title)}"`,
15
+ ], { stdio: 'ignore' });
16
+ break;
17
+ }
18
+ }
19
+ if (child) {
20
+ children.add(child);
21
+ child.on('error', () => { });
22
+ child.on('close', () => {
23
+ children.delete(child);
24
+ });
25
+ child.unref();
26
+ }
27
+ }
28
+ //# sourceMappingURL=notifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifier.js","sourceRoot":"","sources":["../../src/core/notifier.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAgB,MAAM,eAAe,CAAC;AAEpD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAgB,CAAC;AAEzC,MAAM,UAAU,gBAAgB,CAC9B,KAAa,EACb,OAAe;IAEf,IAAI,KAA+B,CAAC;IAEpC,QAAQ,OAAO,CAAC,QAAQ,EAAE,CAAC;QACzB,KAAK,OAAO;YACV,KAAK,GAAG,KAAK,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE;gBAC7C,KAAK,EAAE,QAAQ;aAChB,CAAC,CAAC;YACH,MAAM;QACR,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,OAAO,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACtD,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,IAAI;gBAC9B,yBAAyB,OAAO,CAAC,OAAO,CAAC,iBAAiB,OAAO,CAAC,KAAK,CAAC,GAAG;aAC5E,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YACxB,MAAM;QACR,CAAC;IACH,CAAC;IAED,IAAI,KAAK,EAAE,CAAC;QACV,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACpB,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAA2C,CAAC,CAAC,CAAC;QACrE,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACrB,QAAQ,CAAC,MAAM,CAAC,KAAM,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,KAAK,EAAE,CAAC;IAChB,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=notifier.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifier.test.d.ts","sourceRoot":"","sources":["../../src/core/notifier.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,25 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+ vi.mock('child_process', () => {
3
+ const spawn = vi.fn(() => {
4
+ const child = { on: vi.fn(), unref: vi.fn(), stdout: null, stderr: null };
5
+ child.on.mockReturnValue(child);
6
+ return child;
7
+ });
8
+ return { spawn, execSync: vi.fn() };
9
+ });
10
+ import { sendNotification } from './notifier.js';
11
+ describe('sendNotification', () => {
12
+ beforeEach(() => {
13
+ vi.clearAllMocks();
14
+ });
15
+ it('does not throw when called', () => {
16
+ expect(() => sendNotification('Test', 'Hello')).not.toThrow();
17
+ });
18
+ it('handles special characters in title', () => {
19
+ expect(() => sendNotification('Test "quote"', 'Message')).not.toThrow();
20
+ });
21
+ it('handles special characters in message', () => {
22
+ expect(() => sendNotification('Test', 'Message with "quotes" and $ymbols')).not.toThrow();
23
+ });
24
+ });
25
+ //# sourceMappingURL=notifier.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifier.test.js","sourceRoot":"","sources":["../../src/core/notifier.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAE9D,EAAE,CAAC,IAAI,CAAC,eAAe,EAAE,GAAG,EAAE;IAC5B,MAAM,KAAK,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE;QACvB,MAAM,KAAK,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QAC1E,KAAK,CAAC,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAChC,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;AACtC,CAAC,CAAC,CAAC;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEjD,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,MAAM,EAAE,mCAAmC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IAC5F,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { ProkomConfig } from '../config/index.js';
2
+ import { StatusStore } from '../status/index.js';
3
+ import { PluginManager } from '../plugins/index.js';
4
+ import { EventBus } from './event-bus.js';
5
+ import { TaskRunner } from './task-runner.js';
6
+ import { WorkspacePackage } from './workspaces.js';
7
+ import { CIInfo } from './ci.js';
8
+ export declare class Runtime {
9
+ readonly config: ProkomConfig;
10
+ readonly eventBus: EventBus;
11
+ readonly statusStore: StatusStore;
12
+ readonly taskRunner: TaskRunner;
13
+ readonly pluginManager: PluginManager;
14
+ readonly gitBranch: string | undefined;
15
+ readonly workspaces: WorkspacePackage[];
16
+ readonly ci: CIInfo;
17
+ private persistenceDir;
18
+ private unsubPersistence?;
19
+ private unsubNotifier?;
20
+ constructor(config: ProkomConfig);
21
+ start(): Promise<void>;
22
+ stop(): void;
23
+ private startNotifier;
24
+ }
25
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/core/runtime.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAoB,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAErE,OAAO,EAAY,MAAM,EAAE,MAAM,SAAS,CAAC;AAe3C,qBAAa,OAAO;IAaN,QAAQ,CAAC,MAAM,EAAE,YAAY;IAZzC,QAAQ,CAAC,QAAQ,WAAkB;IACnC,QAAQ,CAAC,WAAW,cAAqB;IACzC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,aAAa,gBAAuB;IAC7C,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,UAAU,EAAE,gBAAgB,EAAE,CAAC;IACxC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAEpB,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,gBAAgB,CAAC,CAAa;IACtC,OAAO,CAAC,aAAa,CAAC,CAAa;gBAEd,MAAM,EAAE,YAAY;IAanC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB5B,IAAI,IAAI,IAAI;IAOZ,OAAO,CAAC,aAAa;CAyBtB"}
@@ -0,0 +1,85 @@
1
+ import { execSync } from 'child_process';
2
+ import { StatusStore } from '../status/index.js';
3
+ import { PluginManager } from '../plugins/index.js';
4
+ import { EventBus } from './event-bus.js';
5
+ import { TaskRunner } from './task-runner.js';
6
+ import { detectWorkspaces } from './workspaces.js';
7
+ import { sendNotification } from './notifier.js';
8
+ import { detectCI } from './ci.js';
9
+ import { timerPlugin } from './timer-plugin.js';
10
+ function getGitBranch() {
11
+ try {
12
+ return execSync('git rev-parse --abbrev-ref HEAD', {
13
+ encoding: 'utf-8',
14
+ timeout: 2000,
15
+ stdio: 'pipe',
16
+ }).trim();
17
+ }
18
+ catch {
19
+ return undefined;
20
+ }
21
+ }
22
+ export class Runtime {
23
+ config;
24
+ eventBus = new EventBus();
25
+ statusStore = new StatusStore();
26
+ taskRunner;
27
+ pluginManager = new PluginManager();
28
+ gitBranch;
29
+ workspaces;
30
+ ci;
31
+ persistenceDir = '.developer-control-center';
32
+ unsubPersistence;
33
+ unsubNotifier;
34
+ constructor(config) {
35
+ this.config = config;
36
+ this.taskRunner = new TaskRunner(this.statusStore, this.eventBus, this.pluginManager, config.commands);
37
+ this.pluginManager.register(timerPlugin);
38
+ this.gitBranch = getGitBranch();
39
+ this.workspaces = detectWorkspaces(process.cwd());
40
+ this.ci = detectCI();
41
+ }
42
+ async start() {
43
+ this.statusStore.loadDir(this.persistenceDir);
44
+ this.unsubPersistence = this.statusStore.subscribe(() => {
45
+ try {
46
+ this.statusStore.saveDir(this.persistenceDir);
47
+ }
48
+ catch {
49
+ // non-critical
50
+ }
51
+ });
52
+ await this.pluginManager.loadFromConfig(this.config.plugins);
53
+ if (this.config.notifications !== false) {
54
+ this.unsubNotifier = this.startNotifier();
55
+ }
56
+ }
57
+ stop() {
58
+ this.taskRunner.abortAll();
59
+ this.eventBus.removeAll();
60
+ this.unsubPersistence?.();
61
+ this.unsubNotifier?.();
62
+ }
63
+ startNotifier() {
64
+ const onComplete = (id, exitCode) => {
65
+ const task = this.statusStore.getTask(id);
66
+ if (!task)
67
+ return;
68
+ const ok = exitCode === 0;
69
+ sendNotification(ok ? 'Task completed' : 'Task failed', `${task.label} — ${ok ? 'success' : `exit ${exitCode}`}`);
70
+ };
71
+ const onError = (id) => {
72
+ const task = this.statusStore.getTask(id);
73
+ if (!task)
74
+ return;
75
+ sendNotification('Task error', `${task.label} — failed with error`);
76
+ };
77
+ this.eventBus.on('task:complete', onComplete);
78
+ this.eventBus.on('task:error', onError);
79
+ return () => {
80
+ this.eventBus.off('task:complete', onComplete);
81
+ this.eventBus.off('task:error', onError);
82
+ };
83
+ }
84
+ }
85
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/core/runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { ProkomCommand } from '../config/types.js';
2
+ import { StatusStore } from '../status/store.js';
3
+ import { PluginManager } from '../plugins/index.js';
4
+ import { EventBus } from './event-bus.js';
5
+ export declare class TaskRunner {
6
+ private statusStore;
7
+ private eventBus;
8
+ private pluginManager?;
9
+ private commands;
10
+ private running;
11
+ private watchers;
12
+ constructor(statusStore: StatusStore, eventBus: EventBus, pluginManager?: PluginManager | undefined, commands?: ProkomCommand[]);
13
+ setCommands(commands: ProkomCommand[]): void;
14
+ run(command: ProkomCommand, skipClear?: boolean): Promise<void>;
15
+ abort(id: string): void;
16
+ abortAll(): void;
17
+ stop(command: ProkomCommand): void;
18
+ private runPipeline;
19
+ private runParallelSteps;
20
+ private finishPipeline;
21
+ private runAndWait;
22
+ private startWatcher;
23
+ private killChild;
24
+ private stopWatcher;
25
+ }
26
+ //# sourceMappingURL=task-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-runner.d.ts","sourceRoot":"","sources":["../../src/core/task-runner.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AA2B1C,qBAAa,UAAU;IAKnB,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,aAAa,CAAC;IACtB,OAAO,CAAC,QAAQ;IAPlB,OAAO,CAAC,OAAO,CAAmC;IAClD,OAAO,CAAC,QAAQ,CAAkC;gBAGxC,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,QAAQ,EAClB,aAAa,CAAC,EAAE,aAAa,YAAA,EAC7B,QAAQ,GAAE,aAAa,EAAO;IAGxC,WAAW,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,IAAI;IAItC,GAAG,CAAC,OAAO,EAAE,aAAa,EAAE,SAAS,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IA4GnE,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IASvB,QAAQ,IAAI,IAAI;IAUhB,IAAI,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;YAuBpB,WAAW;YAiDX,gBAAgB;IAyE9B,OAAO,CAAC,cAAc;IAmBtB,OAAO,CAAC,UAAU;IAqClB,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,SAAS;IAgBjB,OAAO,CAAC,WAAW;CAOpB"}