crewly 1.0.0 → 1.0.1
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/config/constants.ts +40 -2
- package/config/skills/_common/lib.sh +2 -1
- package/config/skills/agent/computer-use/execute.sh +151 -0
- package/config/skills/agent/computer-use/instructions.md +60 -0
- package/config/skills/agent/computer-use/skill.json +22 -0
- package/config/skills/agent/heartbeat/execute.sh +22 -0
- package/config/skills/agent/heartbeat/instructions.md +23 -0
- package/config/skills/agent/heartbeat/skill.json +20 -0
- package/config/skills/orchestrator/schedule-check/execute.sh +1 -1
- package/config/skills/orchestrator/send-pdf-to-slack/execute.sh +28 -5
- package/config/skills/orchestrator/send-pdf-to-slack/instructions.md +49 -10
- package/config/skills/orchestrator/send-pdf-to-slack/skill.json +1 -1
- package/config/skills/orchestrator/subscribe-event/execute.sh +2 -2
- package/dist/backend/backend/src/constants.d.ts +24 -2
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +13 -3
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/session/session.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/session/session.controller.js +16 -7
- package/dist/backend/backend/src/controllers/session/session.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/team/team.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/team/team.controller.js +27 -0
- package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
- package/dist/backend/backend/src/index.d.ts +7 -0
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +131 -0
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/middleware/agent-heartbeat.middleware.d.ts +3 -2
- package/dist/backend/backend/src/middleware/agent-heartbeat.middleware.d.ts.map +1 -1
- package/dist/backend/backend/src/middleware/agent-heartbeat.middleware.js +8 -2
- package/dist/backend/backend/src/middleware/agent-heartbeat.middleware.js.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-heartbeat-monitor.service.d.ts +185 -0
- package/dist/backend/backend/src/services/agent/agent-heartbeat-monitor.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/agent-heartbeat-monitor.service.js +508 -0
- package/dist/backend/backend/src/services/agent/agent-heartbeat-monitor.service.js.map +1 -0
- package/dist/backend/backend/src/services/agent/agent-heartbeat.service.d.ts +5 -5
- package/dist/backend/backend/src/services/agent/agent-heartbeat.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-heartbeat.service.js +3 -3
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.js +36 -13
- package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/disk-cleanup.service.d.ts +24 -3
- package/dist/backend/backend/src/services/agent/disk-cleanup.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/disk-cleanup.service.js +15 -3
- package/dist/backend/backend/src/services/agent/disk-cleanup.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/idle-detection.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/idle-detection.service.js +18 -0
- package/dist/backend/backend/src/services/agent/idle-detection.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/pty-activity-tracker.service.d.ts +7 -2
- package/dist/backend/backend/src/services/agent/pty-activity-tracker.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/pty-activity-tracker.service.js +11 -3
- package/dist/backend/backend/src/services/agent/pty-activity-tracker.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.d.ts +42 -0
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js +190 -1
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/tmux.service.js +2 -2
- package/dist/backend/backend/src/services/agent/tmux.service.js.map +1 -1
- package/dist/backend/backend/src/services/monitoring/activity-monitor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/monitoring/activity-monitor.service.js +13 -19
- package/dist/backend/backend/src/services/monitoring/activity-monitor.service.js.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/orchestrator-heartbeat-monitor.service.d.ts +129 -0
- package/dist/backend/backend/src/services/orchestrator/orchestrator-heartbeat-monitor.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/orchestrator/orchestrator-heartbeat-monitor.service.js +253 -0
- package/dist/backend/backend/src/services/orchestrator/orchestrator-heartbeat-monitor.service.js.map +1 -0
- package/dist/backend/backend/src/services/session/pty/pty-session-backend.d.ts.map +1 -1
- package/dist/backend/backend/src/services/session/pty/pty-session-backend.js +5 -1
- package/dist/backend/backend/src/services/session/pty/pty-session-backend.js.map +1 -1
- package/dist/backend/backend/src/services/session/session-state-persistence.d.ts +4 -1
- package/dist/backend/backend/src/services/session/session-state-persistence.d.ts.map +1 -1
- package/dist/backend/backend/src/services/session/session-state-persistence.js +3 -1
- package/dist/backend/backend/src/services/session/session-state-persistence.js.map +1 -1
- package/dist/backend/backend/src/services/workflow/scheduler.service.d.ts +1 -0
- package/dist/backend/backend/src/services/workflow/scheduler.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/workflow/scheduler.service.js +1 -0
- package/dist/backend/backend/src/services/workflow/scheduler.service.js.map +1 -1
- package/dist/backend/backend/src/types/index.d.ts +2 -0
- package/dist/backend/backend/src/types/index.d.ts.map +1 -1
- package/dist/backend/backend/src/types/index.js.map +1 -1
- package/dist/backend/backend/src/types/scheduler.types.d.ts +17 -0
- package/dist/backend/backend/src/types/scheduler.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/scheduler.types.js.map +1 -1
- package/dist/backend/config/constants.d.ts +36 -2
- package/dist/backend/config/constants.d.ts.map +1 -1
- package/dist/backend/config/constants.js +37 -2
- package/dist/backend/config/constants.js.map +1 -1
- package/dist/backend/config/index.d.ts +1 -1
- package/dist/cli/cli/src/constants.d.ts +1 -1
- package/dist/cli/cli/src/index.js +1 -1
- package/dist/cli/cli/src/index.js.map +1 -1
- package/dist/cli/config/constants.d.ts +36 -2
- package/dist/cli/config/constants.d.ts.map +1 -1
- package/dist/cli/config/constants.js +37 -2
- package/dist/cli/config/constants.js.map +1 -1
- package/dist/cli/config/index.d.ts +1 -1
- package/frontend/dist/assets/{index-77b6a2a0.js → index-4c56763b.js} +31 -31
- package/frontend/dist/assets/{index-5ddf71c8.css → index-c1dd0b10.css} +1 -1
- package/frontend/dist/index.html +2 -2
- package/package.json +8 -4
- package/config/constants.test.ts +0 -469
- package/config/quality-gates/default-gates.test.ts +0 -246
- package/config/skills/agent/nano-banana-image/.env +0 -2
- package/config/skills/agent/nano-banana-image/.env.example +0 -6
- package/config/skills/nano-banana-image/.env +0 -2
- package/config/skills/nano-banana-image/.env.example +0 -6
|
@@ -1,246 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for Default Quality Gate Configuration
|
|
3
|
-
*
|
|
4
|
-
* @module config/quality-gates/default-gates.test
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
// Jest globals (describe, it, expect) are available automatically
|
|
8
|
-
import {
|
|
9
|
-
DEFAULT_GATES,
|
|
10
|
-
MINIMAL_GATES,
|
|
11
|
-
FULL_GATES,
|
|
12
|
-
DEFAULT_SETTINGS,
|
|
13
|
-
DEFAULT_REQUIRED_GATES,
|
|
14
|
-
DEFAULT_OPTIONAL_GATES,
|
|
15
|
-
TYPECHECK_GATE,
|
|
16
|
-
TESTS_GATE,
|
|
17
|
-
BUILD_GATE,
|
|
18
|
-
LINT_GATE,
|
|
19
|
-
COVERAGE_GATE,
|
|
20
|
-
createGateConfig,
|
|
21
|
-
createGate,
|
|
22
|
-
} from './default-gates.js';
|
|
23
|
-
import { GATE_TIMEOUTS, STANDARD_GATES } from '../../backend/src/types/quality-gate.types.js';
|
|
24
|
-
|
|
25
|
-
describe('Default Quality Gate Configuration', () => {
|
|
26
|
-
describe('DEFAULT_SETTINGS', () => {
|
|
27
|
-
it('should have correct default settings', () => {
|
|
28
|
-
expect(DEFAULT_SETTINGS.runInParallel).toBe(false);
|
|
29
|
-
expect(DEFAULT_SETTINGS.stopOnFirstFailure).toBe(false);
|
|
30
|
-
expect(DEFAULT_SETTINGS.timeout).toBe(GATE_TIMEOUTS.TOTAL);
|
|
31
|
-
});
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
describe('Individual Gates', () => {
|
|
35
|
-
describe('TYPECHECK_GATE', () => {
|
|
36
|
-
it('should be correctly configured', () => {
|
|
37
|
-
expect(TYPECHECK_GATE.name).toBe(STANDARD_GATES.TYPECHECK);
|
|
38
|
-
expect(TYPECHECK_GATE.command).toBe('npm run typecheck');
|
|
39
|
-
expect(TYPECHECK_GATE.timeout).toBe(GATE_TIMEOUTS.TYPECHECK);
|
|
40
|
-
expect(TYPECHECK_GATE.required).toBe(true);
|
|
41
|
-
expect(TYPECHECK_GATE.description).toBe('TypeScript compilation check');
|
|
42
|
-
});
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
describe('TESTS_GATE', () => {
|
|
46
|
-
it('should be correctly configured', () => {
|
|
47
|
-
expect(TESTS_GATE.name).toBe(STANDARD_GATES.TESTS);
|
|
48
|
-
expect(TESTS_GATE.command).toBe('npm test -- --passWithNoTests');
|
|
49
|
-
expect(TESTS_GATE.timeout).toBe(GATE_TIMEOUTS.TESTS);
|
|
50
|
-
expect(TESTS_GATE.required).toBe(true);
|
|
51
|
-
expect(TESTS_GATE.env).toEqual({ CI: 'true' });
|
|
52
|
-
});
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
describe('BUILD_GATE', () => {
|
|
56
|
-
it('should be correctly configured', () => {
|
|
57
|
-
expect(BUILD_GATE.name).toBe(STANDARD_GATES.BUILD);
|
|
58
|
-
expect(BUILD_GATE.command).toBe('npm run build');
|
|
59
|
-
expect(BUILD_GATE.timeout).toBe(GATE_TIMEOUTS.BUILD);
|
|
60
|
-
expect(BUILD_GATE.required).toBe(true);
|
|
61
|
-
});
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
describe('LINT_GATE', () => {
|
|
65
|
-
it('should be correctly configured as optional', () => {
|
|
66
|
-
expect(LINT_GATE.name).toBe(STANDARD_GATES.LINT);
|
|
67
|
-
expect(LINT_GATE.command).toBe('npm run lint');
|
|
68
|
-
expect(LINT_GATE.timeout).toBe(GATE_TIMEOUTS.LINT);
|
|
69
|
-
expect(LINT_GATE.required).toBe(false);
|
|
70
|
-
expect(LINT_GATE.allowFailure).toBe(true);
|
|
71
|
-
});
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
describe('COVERAGE_GATE', () => {
|
|
75
|
-
it('should be correctly configured with thresholds', () => {
|
|
76
|
-
expect(COVERAGE_GATE.name).toBe(STANDARD_GATES.COVERAGE);
|
|
77
|
-
expect(COVERAGE_GATE.required).toBe(false);
|
|
78
|
-
expect(COVERAGE_GATE.threshold).toEqual({
|
|
79
|
-
lines: 80,
|
|
80
|
-
branches: 70,
|
|
81
|
-
functions: 80,
|
|
82
|
-
statements: 80,
|
|
83
|
-
});
|
|
84
|
-
});
|
|
85
|
-
});
|
|
86
|
-
});
|
|
87
|
-
|
|
88
|
-
describe('Gate Arrays', () => {
|
|
89
|
-
describe('DEFAULT_REQUIRED_GATES', () => {
|
|
90
|
-
it('should contain typecheck, tests, and build', () => {
|
|
91
|
-
expect(DEFAULT_REQUIRED_GATES).toHaveLength(3);
|
|
92
|
-
expect(DEFAULT_REQUIRED_GATES.map(g => g.name)).toEqual([
|
|
93
|
-
'typecheck',
|
|
94
|
-
'tests',
|
|
95
|
-
'build',
|
|
96
|
-
]);
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
it('should all be marked as required', () => {
|
|
100
|
-
expect(DEFAULT_REQUIRED_GATES.every(g => g.required)).toBe(true);
|
|
101
|
-
});
|
|
102
|
-
});
|
|
103
|
-
|
|
104
|
-
describe('DEFAULT_OPTIONAL_GATES', () => {
|
|
105
|
-
it('should contain lint gate', () => {
|
|
106
|
-
expect(DEFAULT_OPTIONAL_GATES).toHaveLength(1);
|
|
107
|
-
expect(DEFAULT_OPTIONAL_GATES[0].name).toBe('lint');
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
it('should all be marked as not required', () => {
|
|
111
|
-
expect(DEFAULT_OPTIONAL_GATES.every(g => !g.required)).toBe(true);
|
|
112
|
-
});
|
|
113
|
-
});
|
|
114
|
-
});
|
|
115
|
-
|
|
116
|
-
describe('Gate Configurations', () => {
|
|
117
|
-
describe('DEFAULT_GATES', () => {
|
|
118
|
-
it('should have default settings', () => {
|
|
119
|
-
expect(DEFAULT_GATES.settings).toEqual(DEFAULT_SETTINGS);
|
|
120
|
-
});
|
|
121
|
-
|
|
122
|
-
it('should have required gates', () => {
|
|
123
|
-
expect(DEFAULT_GATES.required).toEqual(DEFAULT_REQUIRED_GATES);
|
|
124
|
-
});
|
|
125
|
-
|
|
126
|
-
it('should have optional gates', () => {
|
|
127
|
-
expect(DEFAULT_GATES.optional).toEqual(DEFAULT_OPTIONAL_GATES);
|
|
128
|
-
});
|
|
129
|
-
|
|
130
|
-
it('should have empty custom gates', () => {
|
|
131
|
-
expect(DEFAULT_GATES.custom).toEqual([]);
|
|
132
|
-
});
|
|
133
|
-
});
|
|
134
|
-
|
|
135
|
-
describe('MINIMAL_GATES', () => {
|
|
136
|
-
it('should only have typecheck as required', () => {
|
|
137
|
-
expect(MINIMAL_GATES.required).toHaveLength(1);
|
|
138
|
-
expect(MINIMAL_GATES.required[0].name).toBe('typecheck');
|
|
139
|
-
});
|
|
140
|
-
|
|
141
|
-
it('should have no optional or custom gates', () => {
|
|
142
|
-
expect(MINIMAL_GATES.optional).toHaveLength(0);
|
|
143
|
-
expect(MINIMAL_GATES.custom).toHaveLength(0);
|
|
144
|
-
});
|
|
145
|
-
});
|
|
146
|
-
|
|
147
|
-
describe('FULL_GATES', () => {
|
|
148
|
-
it('should have extended timeout', () => {
|
|
149
|
-
expect(FULL_GATES.settings.timeout).toBe(GATE_TIMEOUTS.TOTAL * 2);
|
|
150
|
-
});
|
|
151
|
-
|
|
152
|
-
it('should have all required gates', () => {
|
|
153
|
-
expect(FULL_GATES.required).toHaveLength(3);
|
|
154
|
-
});
|
|
155
|
-
|
|
156
|
-
it('should have lint and coverage as optional', () => {
|
|
157
|
-
expect(FULL_GATES.optional).toHaveLength(2);
|
|
158
|
-
expect(FULL_GATES.optional.map(g => g.name)).toContain('lint');
|
|
159
|
-
expect(FULL_GATES.optional.map(g => g.name)).toContain('coverage');
|
|
160
|
-
});
|
|
161
|
-
});
|
|
162
|
-
});
|
|
163
|
-
|
|
164
|
-
describe('createGateConfig', () => {
|
|
165
|
-
it('should create config with defaults when no overrides', () => {
|
|
166
|
-
const config = createGateConfig({});
|
|
167
|
-
expect(config.settings).toEqual(DEFAULT_SETTINGS);
|
|
168
|
-
expect(config.required).toEqual(DEFAULT_REQUIRED_GATES);
|
|
169
|
-
expect(config.optional).toEqual(DEFAULT_OPTIONAL_GATES);
|
|
170
|
-
expect(config.custom).toEqual([]);
|
|
171
|
-
});
|
|
172
|
-
|
|
173
|
-
it('should override settings', () => {
|
|
174
|
-
const config = createGateConfig({
|
|
175
|
-
settings: {
|
|
176
|
-
runInParallel: true,
|
|
177
|
-
stopOnFirstFailure: true,
|
|
178
|
-
timeout: 600000,
|
|
179
|
-
},
|
|
180
|
-
});
|
|
181
|
-
expect(config.settings.runInParallel).toBe(true);
|
|
182
|
-
expect(config.settings.stopOnFirstFailure).toBe(true);
|
|
183
|
-
expect(config.settings.timeout).toBe(600000);
|
|
184
|
-
});
|
|
185
|
-
|
|
186
|
-
it('should override required gates', () => {
|
|
187
|
-
const customRequired = [TYPECHECK_GATE];
|
|
188
|
-
const config = createGateConfig({ required: customRequired });
|
|
189
|
-
expect(config.required).toEqual(customRequired);
|
|
190
|
-
});
|
|
191
|
-
|
|
192
|
-
it('should override optional gates', () => {
|
|
193
|
-
const config = createGateConfig({ optional: [] });
|
|
194
|
-
expect(config.optional).toEqual([]);
|
|
195
|
-
});
|
|
196
|
-
|
|
197
|
-
it('should add custom gates', () => {
|
|
198
|
-
const customGate = createGate('custom', 'npm run custom');
|
|
199
|
-
const config = createGateConfig({ custom: [customGate] });
|
|
200
|
-
expect(config.custom).toHaveLength(1);
|
|
201
|
-
expect(config.custom[0].name).toBe('custom');
|
|
202
|
-
});
|
|
203
|
-
});
|
|
204
|
-
|
|
205
|
-
describe('createGate', () => {
|
|
206
|
-
it('should create a gate with minimal options', () => {
|
|
207
|
-
const gate = createGate('test', 'npm test');
|
|
208
|
-
expect(gate.name).toBe('test');
|
|
209
|
-
expect(gate.command).toBe('npm test');
|
|
210
|
-
expect(gate.timeout).toBe(GATE_TIMEOUTS.DEFAULT);
|
|
211
|
-
expect(gate.required).toBe(false);
|
|
212
|
-
});
|
|
213
|
-
|
|
214
|
-
it('should create a gate with all options', () => {
|
|
215
|
-
const gate = createGate('coverage', 'npm run coverage', {
|
|
216
|
-
timeout: 180000,
|
|
217
|
-
required: true,
|
|
218
|
-
description: 'Coverage check',
|
|
219
|
-
allowFailure: false,
|
|
220
|
-
env: { CI: 'true' },
|
|
221
|
-
runOn: ['main'],
|
|
222
|
-
threshold: { lines: 90 },
|
|
223
|
-
});
|
|
224
|
-
|
|
225
|
-
expect(gate.name).toBe('coverage');
|
|
226
|
-
expect(gate.command).toBe('npm run coverage');
|
|
227
|
-
expect(gate.timeout).toBe(180000);
|
|
228
|
-
expect(gate.required).toBe(true);
|
|
229
|
-
expect(gate.description).toBe('Coverage check');
|
|
230
|
-
expect(gate.allowFailure).toBe(false);
|
|
231
|
-
expect(gate.env).toEqual({ CI: 'true' });
|
|
232
|
-
expect(gate.runOn).toEqual(['main']);
|
|
233
|
-
expect(gate.threshold).toEqual({ lines: 90 });
|
|
234
|
-
});
|
|
235
|
-
|
|
236
|
-
it('should use default timeout when not specified', () => {
|
|
237
|
-
const gate = createGate('lint', 'npm run lint');
|
|
238
|
-
expect(gate.timeout).toBe(GATE_TIMEOUTS.DEFAULT);
|
|
239
|
-
});
|
|
240
|
-
|
|
241
|
-
it('should default required to false', () => {
|
|
242
|
-
const gate = createGate('optional', 'npm run optional');
|
|
243
|
-
expect(gate.required).toBe(false);
|
|
244
|
-
});
|
|
245
|
-
});
|
|
246
|
-
});
|