@archznn/crewloop-skills 0.4.3 → 0.6.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.
- package/package.json +3 -2
- package/packages/cli/dist/agents.d.ts +9 -0
- package/packages/cli/dist/agents.d.ts.map +1 -1
- package/packages/cli/dist/agents.js +62 -5
- package/packages/cli/dist/agents.js.map +1 -1
- package/packages/cli/dist/cli.d.ts +1 -0
- package/packages/cli/dist/cli.d.ts.map +1 -1
- package/packages/cli/dist/cli.js +57 -5
- package/packages/cli/dist/cli.js.map +1 -1
- package/packages/cli/dist/hooks.d.ts +37 -0
- package/packages/cli/dist/hooks.d.ts.map +1 -0
- package/packages/cli/dist/hooks.js +282 -0
- package/packages/cli/dist/hooks.js.map +1 -0
- package/packages/cli/dist/mcp.d.ts +8 -0
- package/packages/cli/dist/mcp.d.ts.map +1 -1
- package/packages/cli/dist/mcp.js +19 -1
- package/packages/cli/dist/mcp.js.map +1 -1
- package/packages/cli/dist/tests/cli.test.js +21 -0
- package/packages/cli/dist/tests/cli.test.js.map +1 -1
- package/packages/cli/dist/tests/hooks.test.d.ts +2 -0
- package/packages/cli/dist/tests/hooks.test.d.ts.map +1 -0
- package/packages/cli/dist/tests/hooks.test.js +179 -0
- package/packages/cli/dist/tests/hooks.test.js.map +1 -0
- package/packages/cli/dist/tests/mcp.test.js +79 -0
- package/packages/cli/dist/tests/mcp.test.js.map +1 -1
- package/servers/dashboard/bin/crewloop-shim.js +4 -0
- package/servers/dashboard/dist/adapters/codex.d.ts +1 -0
- package/servers/dashboard/dist/adapters/codex.d.ts.map +1 -1
- package/servers/dashboard/dist/adapters/codex.js +1 -0
- package/servers/dashboard/dist/adapters/codex.js.map +1 -1
- package/servers/dashboard/dist/adapters/kimi.d.ts +1 -0
- package/servers/dashboard/dist/adapters/kimi.d.ts.map +1 -1
- package/servers/dashboard/dist/adapters/kimi.js +1 -0
- package/servers/dashboard/dist/adapters/kimi.js.map +1 -1
- package/servers/dashboard/dist/adapters/shim.d.ts +2 -1
- package/servers/dashboard/dist/adapters/shim.d.ts.map +1 -1
- package/servers/dashboard/dist/adapters/shim.js +15 -2
- package/servers/dashboard/dist/adapters/shim.js.map +1 -1
- package/servers/dashboard/dist/adapters/shim.test.js +43 -0
- package/servers/dashboard/dist/adapters/shim.test.js.map +1 -1
- package/servers/dashboard/dist/presenter.d.ts.map +1 -1
- package/servers/dashboard/dist/presenter.js +2 -0
- package/servers/dashboard/dist/presenter.js.map +1 -1
- package/servers/dashboard/dist/presenter.test.js +7 -0
- package/servers/dashboard/dist/presenter.test.js.map +1 -1
- package/servers/dashboard/dist/skills/infer.d.ts.map +1 -1
- package/servers/dashboard/dist/skills/infer.js +5 -0
- package/servers/dashboard/dist/skills/infer.js.map +1 -1
- package/servers/dashboard/dist/skills/infer.test.js +9 -0
- package/servers/dashboard/dist/skills/infer.test.js.map +1 -1
- package/servers/dashboard/dist/state.d.ts.map +1 -1
- package/servers/dashboard/dist/state.js +19 -1
- package/servers/dashboard/dist/state.js.map +1 -1
- package/servers/dashboard/dist/state.test.js +37 -0
- package/servers/dashboard/dist/state.test.js.map +1 -1
- package/servers/dashboard/dist/tests/shim.test.d.ts +2 -0
- package/servers/dashboard/dist/tests/shim.test.d.ts.map +1 -0
- package/servers/dashboard/dist/tests/shim.test.js +47 -0
- package/servers/dashboard/dist/tests/shim.test.js.map +1 -0
- package/servers/dashboard/dist/types.d.ts +4 -0
- package/servers/dashboard/dist/types.d.ts.map +1 -1
- package/servers/dashboard/package.json +3 -2
- package/servers/dashboard/public/app.js +81 -12
- package/servers/dashboard/public/styles.css +174 -19
- package/servers/dashboard/src/adapters/codex.ts +2 -0
- package/servers/dashboard/src/adapters/kimi.ts +2 -0
- package/servers/dashboard/src/adapters/shim.test.ts +64 -1
- package/servers/dashboard/src/adapters/shim.ts +18 -2
- package/servers/dashboard/src/presenter.test.ts +8 -0
- package/servers/dashboard/src/presenter.ts +2 -0
- package/servers/dashboard/src/skills/infer.test.ts +10 -0
- package/servers/dashboard/src/skills/infer.ts +8 -0
- package/servers/dashboard/src/state.test.ts +43 -0
- package/servers/dashboard/src/state.ts +20 -1
- package/servers/dashboard/src/tests/shim.test.ts +45 -0
- package/servers/dashboard/src/types.ts +4 -0
- package/skills/orchestrator/SKILL.md +6 -0
|
@@ -32,11 +32,19 @@ export class StateStore {
|
|
|
32
32
|
session.tool_counts[event.tool] = (session.tool_counts[event.tool] || 0) + 1;
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
-
if (event.skill) {
|
|
35
|
+
if (event.event_type === 'session_start' && event.skill) {
|
|
36
|
+
session.active_skill = event.skill;
|
|
37
|
+
session.active_confidence = 'explicit';
|
|
38
|
+
} else if (event.skill) {
|
|
36
39
|
session.active_skill = event.skill;
|
|
37
40
|
session.active_confidence = event.event_type === 'skill_change' ? 'explicit' : 'heuristic';
|
|
38
41
|
}
|
|
39
42
|
|
|
43
|
+
if (event.event_type === 'session_end') {
|
|
44
|
+
session.ended_at = event.timestamp;
|
|
45
|
+
}
|
|
46
|
+
session.lifecycle = deriveLifecycle(event, session);
|
|
47
|
+
|
|
40
48
|
session.status = deriveSessionStatus(event);
|
|
41
49
|
|
|
42
50
|
this.sessions.set(event.session_id, session);
|
|
@@ -91,6 +99,7 @@ export class StateStore {
|
|
|
91
99
|
source,
|
|
92
100
|
events: [],
|
|
93
101
|
tool_counts: {},
|
|
102
|
+
lifecycle: 'starting',
|
|
94
103
|
started_at: now,
|
|
95
104
|
last_event_at: now,
|
|
96
105
|
};
|
|
@@ -99,6 +108,16 @@ export class StateStore {
|
|
|
99
108
|
}
|
|
100
109
|
}
|
|
101
110
|
|
|
111
|
+
function deriveLifecycle(event: DashboardEvent, session: Session): 'starting' | 'running' | 'ended' {
|
|
112
|
+
if (event.event_type === 'session_end' || session.ended_at) {
|
|
113
|
+
return 'ended';
|
|
114
|
+
}
|
|
115
|
+
if (event.event_type === 'session_start' && session.events.length <= 1) {
|
|
116
|
+
return 'starting';
|
|
117
|
+
}
|
|
118
|
+
return 'running';
|
|
119
|
+
}
|
|
120
|
+
|
|
102
121
|
function deriveSessionStatus(event: DashboardEvent): EventStatus | undefined {
|
|
103
122
|
switch (event.event_type) {
|
|
104
123
|
case 'session_start':
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { describe, it } from 'node:test';
|
|
2
|
+
import assert from 'node:assert';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { spawn } from 'node:child_process';
|
|
5
|
+
import { runShim } from '../adapters/shim';
|
|
6
|
+
|
|
7
|
+
function runBin(args: string[], input?: string): Promise<{ exitCode: number | null; stderr: string }> {
|
|
8
|
+
const binPath = path.join(__dirname, '..', '..', 'bin', 'crewloop-shim.js');
|
|
9
|
+
return new Promise((resolve, reject) => {
|
|
10
|
+
const child = spawn(process.execPath, [binPath, ...args], {
|
|
11
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
12
|
+
});
|
|
13
|
+
let stderr = '';
|
|
14
|
+
child.stderr!.on('data', (chunk) => {
|
|
15
|
+
stderr += chunk.toString();
|
|
16
|
+
});
|
|
17
|
+
child.on('error', reject);
|
|
18
|
+
child.on('close', (exitCode) => {
|
|
19
|
+
resolve({ exitCode, stderr });
|
|
20
|
+
});
|
|
21
|
+
if (input !== undefined) {
|
|
22
|
+
child.stdin!.write(input);
|
|
23
|
+
}
|
|
24
|
+
child.stdin!.end();
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
describe('shim binary', () => {
|
|
29
|
+
it('exports runShim from adapters/shim', () => {
|
|
30
|
+
assert.strictEqual(typeof runShim, 'function');
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it('exits 0 for a supported source with empty stdin', async () => {
|
|
34
|
+
const { exitCode, stderr } = await runBin(['kimi']);
|
|
35
|
+
assert.strictEqual(exitCode, 0);
|
|
36
|
+
assert.strictEqual(stderr, '');
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it('exits 1 and prints usage for an unsupported source', async () => {
|
|
40
|
+
const { exitCode, stderr } = await runBin(['unknown']);
|
|
41
|
+
assert.strictEqual(exitCode, 1);
|
|
42
|
+
assert.ok(stderr.includes('unknown source'));
|
|
43
|
+
assert.ok(stderr.includes('crewloop-shim <kimi|codex>'));
|
|
44
|
+
});
|
|
45
|
+
});
|
|
@@ -28,10 +28,12 @@ export interface Session {
|
|
|
28
28
|
active_skill?: string;
|
|
29
29
|
active_confidence?: 'explicit' | 'heuristic' | 'unknown';
|
|
30
30
|
status?: EventStatus;
|
|
31
|
+
lifecycle: 'starting' | 'running' | 'ended';
|
|
31
32
|
events: DashboardEvent[];
|
|
32
33
|
tool_counts: Record<string, number>;
|
|
33
34
|
started_at: number;
|
|
34
35
|
last_event_at: number;
|
|
36
|
+
ended_at?: number;
|
|
35
37
|
}
|
|
36
38
|
|
|
37
39
|
export interface DashboardState {
|
|
@@ -60,9 +62,11 @@ export interface ClientSession {
|
|
|
60
62
|
skill?: string;
|
|
61
63
|
activeSkill?: ClientActiveSkill;
|
|
62
64
|
status?: EventStatus;
|
|
65
|
+
lifecycle: 'starting' | 'running' | 'ended';
|
|
63
66
|
events: ClientEvent[];
|
|
64
67
|
startTime: number;
|
|
65
68
|
lastActivity: number;
|
|
69
|
+
endedAt?: number;
|
|
66
70
|
toolCounts: Record<string, number>;
|
|
67
71
|
}
|
|
68
72
|
|
|
@@ -11,6 +11,12 @@ You are a technical product manager and discovery specialist. Your job is to ext
|
|
|
11
11
|
|
|
12
12
|
---
|
|
13
13
|
|
|
14
|
+
## DASHBOARD LIFECYCLE
|
|
15
|
+
|
|
16
|
+
When this skill is loaded at the start of a session, the CrewLoop dashboard should display an active session named `orchestrator`. If the agent supports lifecycle hooks, ensure the first event sent to the dashboard marks `orchestrator` as the active skill.
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
14
20
|
### 🚨 MANDATORY: Read Reference & Template Files
|
|
15
21
|
Before taking any action, you MUST read the global conventions in [conventions.md](../../references/conventions.md), the workflow in [workflow.md](../../references/workflow.md), and any local reference files or directories (such as `references/` or `assets/`) if present. Never skip this step or make assumptions about the guidelines.
|
|
16
22
|
|