@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.
- package/.developer-control-center/metrics.json +1 -0
- package/.developer-control-center/status.json +1 -0
- package/.developer-control-center/timings.jsonl +3 -0
- package/.github/workflows/ci.yml +47 -0
- package/AGENTS.md +51 -0
- package/PLUGINS.md +145 -0
- package/README.md +147 -0
- package/developer-control-center.config.example.js +91 -0
- package/developer-control-center.config.js +177 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +223 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/index.d.ts +3 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +2 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/loader.d.ts +4 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +96 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/loader.test.d.ts +2 -0
- package/dist/config/loader.test.d.ts.map +1 -0
- package/dist/config/loader.test.js +25 -0
- package/dist/config/loader.test.js.map +1 -0
- package/dist/config/presets/node.d.ts +10 -0
- package/dist/config/presets/node.d.ts.map +1 -0
- package/dist/config/presets/node.js +31 -0
- package/dist/config/presets/node.js.map +1 -0
- package/dist/config/presets/react.d.ts +10 -0
- package/dist/config/presets/react.d.ts.map +1 -0
- package/dist/config/presets/react.js +36 -0
- package/dist/config/presets/react.js.map +1 -0
- package/dist/config/types.d.ts +55 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +2 -0
- package/dist/config/types.js.map +1 -0
- package/dist/config/types.test.d.ts +2 -0
- package/dist/config/types.test.d.ts.map +1 -0
- package/dist/config/types.test.js +23 -0
- package/dist/config/types.test.js.map +1 -0
- package/dist/core/ci.d.ts +6 -0
- package/dist/core/ci.d.ts.map +1 -0
- package/dist/core/ci.js +22 -0
- package/dist/core/ci.js.map +1 -0
- package/dist/core/ci.test.d.ts +2 -0
- package/dist/core/ci.test.d.ts.map +1 -0
- package/dist/core/ci.test.js +45 -0
- package/dist/core/ci.test.js.map +1 -0
- package/dist/core/event-bus.d.ts +18 -0
- package/dist/core/event-bus.d.ts.map +1 -0
- package/dist/core/event-bus.js +19 -0
- package/dist/core/event-bus.js.map +1 -0
- package/dist/core/event-bus.test.d.ts +2 -0
- package/dist/core/event-bus.test.d.ts.map +1 -0
- package/dist/core/event-bus.test.js +49 -0
- package/dist/core/event-bus.test.js.map +1 -0
- package/dist/core/index.d.ts +9 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +7 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/notifier.d.ts +2 -0
- package/dist/core/notifier.d.ts.map +1 -0
- package/dist/core/notifier.js +28 -0
- package/dist/core/notifier.js.map +1 -0
- package/dist/core/notifier.test.d.ts +2 -0
- package/dist/core/notifier.test.d.ts.map +1 -0
- package/dist/core/notifier.test.js +25 -0
- package/dist/core/notifier.test.js.map +1 -0
- package/dist/core/runtime.d.ts +25 -0
- package/dist/core/runtime.d.ts.map +1 -0
- package/dist/core/runtime.js +85 -0
- package/dist/core/runtime.js.map +1 -0
- package/dist/core/task-runner.d.ts +26 -0
- package/dist/core/task-runner.d.ts.map +1 -0
- package/dist/core/task-runner.js +354 -0
- package/dist/core/task-runner.js.map +1 -0
- package/dist/core/timer-plugin.d.ts +3 -0
- package/dist/core/timer-plugin.d.ts.map +1 -0
- package/dist/core/timer-plugin.js +34 -0
- package/dist/core/timer-plugin.js.map +1 -0
- package/dist/core/workspaces.d.ts +6 -0
- package/dist/core/workspaces.d.ts.map +1 -0
- package/dist/core/workspaces.js +60 -0
- package/dist/core/workspaces.js.map +1 -0
- package/dist/core/workspaces.test.d.ts +2 -0
- package/dist/core/workspaces.test.d.ts.map +1 -0
- package/dist/core/workspaces.test.js +62 -0
- package/dist/core/workspaces.test.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/plugins/index.d.ts +3 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +2 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/manager.d.ts +13 -0
- package/dist/plugins/manager.d.ts.map +1 -0
- package/dist/plugins/manager.js +43 -0
- package/dist/plugins/manager.js.map +1 -0
- package/dist/plugins/manager.test.d.ts +2 -0
- package/dist/plugins/manager.test.d.ts.map +1 -0
- package/dist/plugins/manager.test.js +79 -0
- package/dist/plugins/manager.test.js.map +1 -0
- package/dist/plugins/types.d.ts +17 -0
- package/dist/plugins/types.d.ts.map +1 -0
- package/dist/plugins/types.js +2 -0
- package/dist/plugins/types.js.map +1 -0
- package/dist/status/index.d.ts +3 -0
- package/dist/status/index.d.ts.map +1 -0
- package/dist/status/index.js +2 -0
- package/dist/status/index.js.map +1 -0
- package/dist/status/store.d.ts +18 -0
- package/dist/status/store.d.ts.map +1 -0
- package/dist/status/store.js +76 -0
- package/dist/status/store.js.map +1 -0
- package/dist/status/store.test.d.ts +2 -0
- package/dist/status/store.test.d.ts.map +1 -0
- package/dist/status/store.test.js +107 -0
- package/dist/status/store.test.js.map +1 -0
- package/dist/status/types.d.ts +12 -0
- package/dist/status/types.d.ts.map +1 -0
- package/dist/status/types.js +2 -0
- package/dist/status/types.js.map +1 -0
- package/dist/ui/app.d.ts +10 -0
- package/dist/ui/app.d.ts.map +1 -0
- package/dist/ui/app.js +479 -0
- package/dist/ui/app.js.map +1 -0
- package/dist/ui/command-list.d.ts +30 -0
- package/dist/ui/command-list.d.ts.map +1 -0
- package/dist/ui/command-list.js +45 -0
- package/dist/ui/command-list.js.map +1 -0
- package/dist/ui/index.d.ts +4 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +8 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/metrics-panel.d.ts +10 -0
- package/dist/ui/metrics-panel.d.ts.map +1 -0
- package/dist/ui/metrics-panel.js +139 -0
- package/dist/ui/metrics-panel.js.map +1 -0
- package/dist/ui/panel.d.ts +16 -0
- package/dist/ui/panel.d.ts.map +1 -0
- package/dist/ui/panel.js +16 -0
- package/dist/ui/panel.js.map +1 -0
- package/dist/ui/status-panel.d.ts +16 -0
- package/dist/ui/status-panel.d.ts.map +1 -0
- package/dist/ui/status-panel.js +52 -0
- package/dist/ui/status-panel.js.map +1 -0
- package/docs/architecture.md +29 -0
- package/docs/config.md +15 -0
- package/docs/mvp.md +17 -0
- package/docs/phases.md +49 -0
- package/docs/technical-decisions.md +19 -0
- package/docs/ui.md +14 -0
- package/package.json +30 -0
- package/src/cli.ts +242 -0
- package/src/config/index.ts +2 -0
- package/src/config/loader.test.ts +30 -0
- package/src/config/loader.ts +123 -0
- package/src/config/presets/node.ts +30 -0
- package/src/config/presets/react.ts +35 -0
- package/src/config/types.test.ts +24 -0
- package/src/config/types.ts +52 -0
- package/src/core/ci.test.ts +54 -0
- package/src/core/ci.ts +26 -0
- package/src/core/event-bus.test.ts +56 -0
- package/src/core/event-bus.ts +34 -0
- package/src/core/index.ts +8 -0
- package/src/core/notifier.test.ts +30 -0
- package/src/core/notifier.ts +34 -0
- package/src/core/runtime.ts +99 -0
- package/src/core/task-runner.ts +408 -0
- package/src/core/timer-plugin.ts +34 -0
- package/src/core/workspaces.test.ts +72 -0
- package/src/core/workspaces.ts +73 -0
- package/src/index.ts +15 -0
- package/src/plugins/index.ts +2 -0
- package/src/plugins/manager.test.ts +92 -0
- package/src/plugins/manager.ts +54 -0
- package/src/plugins/types.ts +18 -0
- package/src/status/index.ts +2 -0
- package/src/status/store.test.ts +122 -0
- package/src/status/store.ts +88 -0
- package/src/status/types.ts +12 -0
- package/src/ui/app.tsx +606 -0
- package/src/ui/command-list.tsx +163 -0
- package/src/ui/index.tsx +10 -0
- package/src/ui/metrics-panel.tsx +234 -0
- package/src/ui/panel.tsx +76 -0
- package/src/ui/status-panel.tsx +160 -0
- package/tsconfig.json +21 -0
- 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 @@
|
|
|
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":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACxB,IAAI,GAAa,CAAC;IAElB,UAAU,CAAC,GAAG,EAAE;QACd,GAAG,GAAG,IAAI,QAAQ,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACjD,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC1B,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACpD,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACpD,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACrB,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,MAAM,EAAE,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACxC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAChB,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACnB,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACjB,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACnB,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACnC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACnC,GAAG,CAAC,SAAS,EAAE,CAAC;QAChB,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACd,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACd,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,IAAI,GAAU,EAAE,CAAC;QACvB,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,CAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/C,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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"}
|