@crewx/dreaming 0.1.0-rc.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/SKILL.md +97 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +130 -0
- package/dist/cli.js.map +1 -0
- package/dist/src/analyzer.d.ts +14 -0
- package/dist/src/analyzer.d.ts.map +1 -0
- package/dist/src/analyzer.js +414 -0
- package/dist/src/analyzer.js.map +1 -0
- package/dist/src/renderer.d.ts +4 -0
- package/dist/src/renderer.d.ts.map +1 -0
- package/dist/src/renderer.js +147 -0
- package/dist/src/renderer.js.map +1 -0
- package/dist/src/types.d.ts +84 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +3 -0
- package/dist/src/types.js.map +1 -0
- package/package.json +46 -0
package/SKILL.md
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: crewx/dreaming
|
|
3
|
+
description: >
|
|
4
|
+
선별 실행하는 필수 회고 스킬. 태스크/대화 단위로 에이전트 행동을 되돌아보는
|
|
5
|
+
1급 자기성찰 도구. memory/doc/search와 동급으로 상황 판단해 주도적으로 호출한다.
|
|
6
|
+
metadata:
|
|
7
|
+
version: 0.1.0
|
|
8
|
+
built-in: true
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Dreaming — 필수 회고 스킬
|
|
12
|
+
|
|
13
|
+
**dreaming은 에이전트의 1급 자기성찰 도구다.**
|
|
14
|
+
memory(기억 저장/검색), doc(설계서 탐색), search(코드 검색)와 동급으로,
|
|
15
|
+
에이전트가 상황을 판단해 **스스로 호출**한다. 수동 요청이 오기를 기다리지 않는다.
|
|
16
|
+
|
|
17
|
+
## 두 가지 시야
|
|
18
|
+
|
|
19
|
+
| 명령어 | 시야 | 쓰는 때 |
|
|
20
|
+
|--------|------|---------|
|
|
21
|
+
| `crewx dreaming --task=tsk_xxx` | 돋보기 | 태스크 1건을 깊게 — 행동 타임라인, 삽질 패턴, 효율 패턴, 스킬 사용 현황 |
|
|
22
|
+
| `crewx dreaming --thread=thd_xxx --recent=N` | 지도 | 대화 내 최근 N개 태스크 목록 + 각 종료상태 |
|
|
23
|
+
|
|
24
|
+
## 언제 호출할까 (에이전트 판단 기준)
|
|
25
|
+
|
|
26
|
+
- **작업 시작 전**: 방금 끊긴 태스크가 있는지 확인 → `--thread` 목록 확인
|
|
27
|
+
- **실패 태스크 재시도**: 직전에 어디까지 하다 멈췄는지 → `--task` 로 타임라인 확인
|
|
28
|
+
- **대화 맥락 파악**: 이 대화에서 뭘 시켰는지 목록으로 파악 → `--thread --recent=5`
|
|
29
|
+
- **작업 후 자기 점검**: 삽질 패턴 / 효율 패턴 확인 → `--task` 로 회고
|
|
30
|
+
|
|
31
|
+
## 사용법
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
# 태스크 1건 깊이 회고
|
|
35
|
+
crewx dreaming --task=tsk_abc123
|
|
36
|
+
|
|
37
|
+
# 대화 내 최근 5건 목록 (기본값)
|
|
38
|
+
crewx dreaming --thread=thd_xyz789
|
|
39
|
+
|
|
40
|
+
# 더 많이 보기
|
|
41
|
+
crewx dreaming --thread=thd_xyz789 --recent=20
|
|
42
|
+
|
|
43
|
+
# 특정 태스크 드릴다운
|
|
44
|
+
crewx dreaming --task=tsk_abc123 --json
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## 출력 예시 — --task 모드
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
━━━ Dreaming: task tsk_abc123 ━━━
|
|
51
|
+
Agent: core_dev (acp/claude) | Status: success | Duration: 312s | Tools: 47 calls
|
|
52
|
+
📋 지시: dreaming 빌트인 승격 작업
|
|
53
|
+
📝 결론: packages/built-in/dreaming/ 생성 완료
|
|
54
|
+
|
|
55
|
+
[타임라인]
|
|
56
|
+
1. Read packages/built-in/memory/package.json
|
|
57
|
+
2. Read packages/built-in/doc/tsconfig.json
|
|
58
|
+
3. Edit packages/built-in/dreaming/package.json
|
|
59
|
+
...
|
|
60
|
+
41. Bash npx tsc --noEmit → ❌ error TS2345
|
|
61
|
+
42. Edit packages/built-in/dreaming/src/analyzer.ts ← 같은 파일 재수정
|
|
62
|
+
43. Bash npx tsc --noEmit → ✅ pass
|
|
63
|
+
💡 삽질: analyzer.ts 2회 수정 (41→43) — 타입 불일치
|
|
64
|
+
|
|
65
|
+
[스킬 사용]
|
|
66
|
+
crewx/memory 3회 (index, find, save)
|
|
67
|
+
crewx/doc 2회 (toc, section)
|
|
68
|
+
|
|
69
|
+
[회고 요약]
|
|
70
|
+
⚠️ 삽질 패턴: 같은 파일 반복 수정 1건 (analyzer.ts 2회)
|
|
71
|
+
💡 인사이트: 에러 대부분 타입 불일치 (1건)
|
|
72
|
+
🔍 코드 분석 활용 — tsserver 5회 사용
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## 출력 예시 — --thread 모드
|
|
76
|
+
|
|
77
|
+
```
|
|
78
|
+
━━━ Dreaming: thread thd_xyz789 — 최근 5건 ━━━
|
|
79
|
+
태스크 목록: 5건
|
|
80
|
+
|
|
81
|
+
1. ✅ tsk_abc123 | core_dev | success | 312s | dreaming 빌트인 승격 작업
|
|
82
|
+
2. ❌ tsk_def456 | core_dev | failed | 45s | tsc 빌드 검증
|
|
83
|
+
3. ✅ tsk_ghi789 | ui_lead | completed | 180s | UI 컴포넌트 리뷰
|
|
84
|
+
4. ✅ tsk_jkl012 | core_dev | success | 240s | SDK 리포지토리 패턴 적용
|
|
85
|
+
5. ✅ tsk_mno345 | core_dev | success | 90s | CLI registry 등록
|
|
86
|
+
|
|
87
|
+
드릴다운: crewx dreaming --task=<id>
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## Options
|
|
91
|
+
|
|
92
|
+
| 옵션 | 기본값 | 설명 |
|
|
93
|
+
|------|--------|------|
|
|
94
|
+
| `--task=ID` | — | 태스크 ID (tsk_xxx) |
|
|
95
|
+
| `--thread=ID` | — | 스레드 ID (thd_xxx) |
|
|
96
|
+
| `--recent=N` | 5 | --thread 시 최근 N건 |
|
|
97
|
+
| `--json` | false | JSON 출력 |
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../cli.ts"],"names":[],"mappings":";AAoEA,wBAAsB,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAkE9D"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.main = main;
|
|
5
|
+
const sdk_1 = require("@crewx/sdk");
|
|
6
|
+
const analyzer_js_1 = require("./src/analyzer.js");
|
|
7
|
+
const renderer_js_1 = require("./src/renderer.js");
|
|
8
|
+
function parseFlags(argv) {
|
|
9
|
+
const flags = {
|
|
10
|
+
task: null,
|
|
11
|
+
thread: null,
|
|
12
|
+
agent: null,
|
|
13
|
+
days: 1,
|
|
14
|
+
recent: null,
|
|
15
|
+
json: false,
|
|
16
|
+
all: false,
|
|
17
|
+
};
|
|
18
|
+
for (const a of argv) {
|
|
19
|
+
if (a === '--json')
|
|
20
|
+
flags.json = true;
|
|
21
|
+
else if (a === '--all')
|
|
22
|
+
flags.all = true;
|
|
23
|
+
else if (a.startsWith('--task='))
|
|
24
|
+
flags.task = a.slice('--task='.length);
|
|
25
|
+
else if (a.startsWith('--thread='))
|
|
26
|
+
flags.thread = a.slice('--thread='.length);
|
|
27
|
+
else if (a.startsWith('--agent='))
|
|
28
|
+
flags.agent = a.slice('--agent='.length);
|
|
29
|
+
else if (a.startsWith('--days='))
|
|
30
|
+
flags.days = parseInt(a.slice('--days='.length), 10);
|
|
31
|
+
else if (a.startsWith('--recent='))
|
|
32
|
+
flags.recent = parseInt(a.slice('--recent='.length), 10);
|
|
33
|
+
else if (a === '--help' || a === '-h') {
|
|
34
|
+
printUsage();
|
|
35
|
+
process.exit(0);
|
|
36
|
+
}
|
|
37
|
+
else if (a.startsWith('--')) {
|
|
38
|
+
console.error(`Unknown option: ${a}\nRun with --help for usage.`);
|
|
39
|
+
process.exit(1);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return flags;
|
|
43
|
+
}
|
|
44
|
+
function printUsage() {
|
|
45
|
+
console.log(`crewx dreaming — 선별 실행하는 필수 회고 스킬
|
|
46
|
+
|
|
47
|
+
에이전트가 작업 전/후, 재시도 시 상황을 파악하기 위해 호출하는 1급 자기성찰 도구.
|
|
48
|
+
memory/doc/search와 동급으로, 상황에 따라 주도적으로 실행한다.
|
|
49
|
+
|
|
50
|
+
Usage:
|
|
51
|
+
crewx dreaming --task=TASK_ID
|
|
52
|
+
crewx dreaming --thread=THREAD_ID [--recent=N]
|
|
53
|
+
|
|
54
|
+
Options:
|
|
55
|
+
--task=ID 태스크 1건 깊이 회고 (행동 타임라인 + 스킬 사용 + 삽질/효율 요약)
|
|
56
|
+
--thread=ID 대화 내 최근 N개 태스크 목록 + 각 종료상태
|
|
57
|
+
--recent=N --thread 시 최근 N건 (기본값: 5)
|
|
58
|
+
--json JSON 출력
|
|
59
|
+
--help, -h 도움말
|
|
60
|
+
|
|
61
|
+
언제 호출할까:
|
|
62
|
+
- 작업 시작 전: 방금 끊긴 태스크가 있는지 확인
|
|
63
|
+
- 실패 재시도 전: 직전에 어디까지 하다 멈췄는지 확인
|
|
64
|
+
- 대화 맥락 파악: --thread 로 이 대화에서 뭘 시켰는지 목록 확인
|
|
65
|
+
- 작업 후 자기 점검: 삽질 패턴 / 효율 패턴 회고
|
|
66
|
+
|
|
67
|
+
Examples:
|
|
68
|
+
crewx dreaming --task=tsk_abc123
|
|
69
|
+
crewx dreaming --thread=thd_xyz789 --recent=5
|
|
70
|
+
crewx dreaming --thread=thd_xyz789 --recent=20
|
|
71
|
+
`);
|
|
72
|
+
}
|
|
73
|
+
async function main(inputArgs) {
|
|
74
|
+
const args = inputArgs ?? process.argv.slice(2);
|
|
75
|
+
if (!args.length || args[0] === '--help' || args[0] === '-h') {
|
|
76
|
+
printUsage();
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
const flags = parseFlags(args);
|
|
80
|
+
if (!flags.task && !flags.thread) {
|
|
81
|
+
console.error('Error: --task=<id> or --thread=<id> is required.\nRun crewx dreaming --help for usage.');
|
|
82
|
+
process.exit(1);
|
|
83
|
+
}
|
|
84
|
+
const taskRepo = new sdk_1.TaskRepository();
|
|
85
|
+
const spanRepo = new sdk_1.SpanRepository();
|
|
86
|
+
if (flags.task) {
|
|
87
|
+
const row = taskRepo.getTask(flags.task);
|
|
88
|
+
if (!row) {
|
|
89
|
+
console.log(`No task found: ${flags.task}`);
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
const spans = spanRepo.findByTaskId(flags.task);
|
|
93
|
+
const result = (0, analyzer_js_1.analyzeTask)(row, spans);
|
|
94
|
+
if (flags.json) {
|
|
95
|
+
process.stdout.write(JSON.stringify(result, null, 2) + '\n');
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
console.log((0, renderer_js_1.renderTaskFull)(result));
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
if (flags.thread) {
|
|
102
|
+
const recent = flags.recent ?? 5;
|
|
103
|
+
const allTasks = taskRepo.findTasksByThread(flags.thread);
|
|
104
|
+
const topLevel = allTasks
|
|
105
|
+
.filter((t) => !t.parent_task_id)
|
|
106
|
+
.sort((a, b) => (b.started_at > a.started_at ? 1 : -1))
|
|
107
|
+
.slice(0, recent);
|
|
108
|
+
const summaryRows = topLevel.map((t) => ({
|
|
109
|
+
taskId: t.id,
|
|
110
|
+
agentId: t.agent_id,
|
|
111
|
+
status: t.status,
|
|
112
|
+
promptSummary: t.prompt ? t.prompt.split('\n')[0].slice(0, 100) : null,
|
|
113
|
+
startedAt: t.started_at,
|
|
114
|
+
duration: t.duration_ms != null ? Math.round(t.duration_ms / 1000) : null,
|
|
115
|
+
}));
|
|
116
|
+
if (flags.json) {
|
|
117
|
+
process.stdout.write(JSON.stringify(summaryRows, null, 2) + '\n');
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
console.log((0, renderer_js_1.renderThreadTaskList)(summaryRows, flags.thread, recent));
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
if (require.main === module) {
|
|
125
|
+
main().catch((e) => {
|
|
126
|
+
console.error(e.message);
|
|
127
|
+
process.exit(1);
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { SpanRow, TaskRow } from '@crewx/sdk';
|
|
2
|
+
import type { TaskAnalysis } from './types.js';
|
|
3
|
+
export declare function normalizeToolName(name: string | null | undefined): string;
|
|
4
|
+
interface RawToolCall {
|
|
5
|
+
toolUseId: string | null;
|
|
6
|
+
name: string;
|
|
7
|
+
input: string | null;
|
|
8
|
+
isError: boolean | null;
|
|
9
|
+
resultPreview: string | null;
|
|
10
|
+
}
|
|
11
|
+
export declare function extractToolCallsFromLogs(logs: unknown[]): RawToolCall[];
|
|
12
|
+
export declare function analyzeTask(row: TaskRow, spans: SpanRow[]): TaskAnalysis;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=analyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyzer.d.ts","sourceRoot":"","sources":["../../src/analyzer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,KAAK,EAIV,YAAY,EACb,MAAM,YAAY,CAAC;AA6BpB,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAUzE;AAyDD,UAAU,WAAW;IACnB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACxB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,WAAW,EAAE,CA6DvE;AAoLD,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,YAAY,CAmExE"}
|
|
@@ -0,0 +1,414 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.normalizeToolName = normalizeToolName;
|
|
4
|
+
exports.extractToolCallsFromLogs = extractToolCallsFromLogs;
|
|
5
|
+
exports.analyzeTask = analyzeTask;
|
|
6
|
+
const sdk_1 = require("@crewx/sdk");
|
|
7
|
+
const VERIFY_COMMANDS = [
|
|
8
|
+
'tsc', 'npm test', 'npm run test', 'npm run lint', 'eslint',
|
|
9
|
+
'prettier', 'jest', 'vitest', 'biome', 'npx tsc',
|
|
10
|
+
];
|
|
11
|
+
const BASH_ERROR_PATTERNS = [
|
|
12
|
+
/error/i, /failed/i, /exit code [^0]/, /cannot find/i,
|
|
13
|
+
/does not exist/i, /FAILED/, /✗/, /ERR!/,
|
|
14
|
+
];
|
|
15
|
+
const ERROR_CATEGORIES = [
|
|
16
|
+
[/Type .+ is not assignable to type/i, '타입 불일치'],
|
|
17
|
+
[/Cannot find module/i, '모듈 경로 오류'],
|
|
18
|
+
[/Property .+ does not exist/i, '존재하지 않는 프로퍼티'],
|
|
19
|
+
[/Expected \d+ arguments/i, '인자 수 불일치'],
|
|
20
|
+
[/Cannot find name/i, '미선언 변수/함수'],
|
|
21
|
+
[/has no exported member/i, 'export 누락'],
|
|
22
|
+
[/FAIL|AssertionError|expect\(/i, '테스트 실패'],
|
|
23
|
+
[/SyntaxError|Unexpected token/i, '구문 오류'],
|
|
24
|
+
];
|
|
25
|
+
const FILE_PLACEHOLDERS = new Set(['Read File', 'Edit File', 'Write File', 'Terminal', '{}', '']);
|
|
26
|
+
function normalizeToolName(name) {
|
|
27
|
+
if (!name)
|
|
28
|
+
return '';
|
|
29
|
+
const lower = name.toLowerCase();
|
|
30
|
+
if (lower === 'bash' || lower === 'terminal')
|
|
31
|
+
return 'Bash';
|
|
32
|
+
if (lower === 'read' || lower === 'view')
|
|
33
|
+
return 'Read';
|
|
34
|
+
if (lower === 'edit' || lower === 'apply_patch')
|
|
35
|
+
return 'Edit';
|
|
36
|
+
if (lower === 'write')
|
|
37
|
+
return 'Write';
|
|
38
|
+
if (lower === 'grep' || lower === 'rg')
|
|
39
|
+
return 'Grep';
|
|
40
|
+
if (lower === 'glob' || lower === 'find')
|
|
41
|
+
return 'Find';
|
|
42
|
+
return name;
|
|
43
|
+
}
|
|
44
|
+
function shortenPath(p) {
|
|
45
|
+
const segments = p.replace(/\\/g, '/').split('/').filter(Boolean);
|
|
46
|
+
const keep = segments.length <= 3 ? segments : segments.slice(-3);
|
|
47
|
+
return keep.join('/');
|
|
48
|
+
}
|
|
49
|
+
function extractFilePath(toolName, input) {
|
|
50
|
+
const normalized = normalizeToolName(toolName);
|
|
51
|
+
if (normalized !== 'Read' && normalized !== 'Edit' && normalized !== 'Write')
|
|
52
|
+
return null;
|
|
53
|
+
if (!input)
|
|
54
|
+
return null;
|
|
55
|
+
if (FILE_PLACEHOLDERS.has(input))
|
|
56
|
+
return null;
|
|
57
|
+
if (input.includes('*** Update File:') || input.includes('*** Add File:')) {
|
|
58
|
+
const paths = [];
|
|
59
|
+
for (const m of input.matchAll(/\*\*\*\s+(?:Update|Add)\s+File:\s*(.+)/g)) {
|
|
60
|
+
const fp = m[1].trim();
|
|
61
|
+
if (fp)
|
|
62
|
+
paths.push(shortenPath(fp));
|
|
63
|
+
}
|
|
64
|
+
return paths.length ? paths : null;
|
|
65
|
+
}
|
|
66
|
+
let cleaned = input;
|
|
67
|
+
if (/^(Read|Edit|Write|View)\s+/.test(cleaned)) {
|
|
68
|
+
cleaned = cleaned.replace(/^(Read|Edit|Write|View)\s+/, '');
|
|
69
|
+
}
|
|
70
|
+
if (/[*?{}]/.test(cleaned))
|
|
71
|
+
return null;
|
|
72
|
+
if (cleaned.length > 300)
|
|
73
|
+
return null;
|
|
74
|
+
if (!/\.\w+$/.test(cleaned) && !cleaned.includes('/'))
|
|
75
|
+
return null;
|
|
76
|
+
if (cleaned.startsWith('/') || /^[A-Za-z]:[\\/]/.test(cleaned)) {
|
|
77
|
+
return shortenPath(cleaned);
|
|
78
|
+
}
|
|
79
|
+
return cleaned;
|
|
80
|
+
}
|
|
81
|
+
function detectProvider(stdoutLines) {
|
|
82
|
+
const types = new Set();
|
|
83
|
+
for (const line of stdoutLines) {
|
|
84
|
+
try {
|
|
85
|
+
const p = JSON.parse(line);
|
|
86
|
+
if (p.type)
|
|
87
|
+
types.add(p.type);
|
|
88
|
+
}
|
|
89
|
+
catch { }
|
|
90
|
+
}
|
|
91
|
+
if (types.has('turn.started') || types.has('turn.failed') || types.has('thread.started'))
|
|
92
|
+
return 'codex';
|
|
93
|
+
if (types.has('assistant.message_delta') || types.has('tool.execution_complete'))
|
|
94
|
+
return 'copilot';
|
|
95
|
+
if (types.has('step_start') && types.has('step_finish'))
|
|
96
|
+
return 'opencode';
|
|
97
|
+
if (types.has('system') && types.has('result'))
|
|
98
|
+
return 'claude';
|
|
99
|
+
if (types.has('init') && types.has('message'))
|
|
100
|
+
return 'gemini';
|
|
101
|
+
if (types.has('result') && types.has('assistant'))
|
|
102
|
+
return 'claude';
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
function extractToolCallsFromLogs(logs) {
|
|
106
|
+
if (!Array.isArray(logs))
|
|
107
|
+
return [];
|
|
108
|
+
const logEntries = logs;
|
|
109
|
+
const stdoutLines = logEntries
|
|
110
|
+
.filter((e) => e.level === 'stdout' && e.message)
|
|
111
|
+
.map((e) => e.message);
|
|
112
|
+
const provider = detectProvider(stdoutLines);
|
|
113
|
+
const allEntries = [];
|
|
114
|
+
for (const entry of logEntries) {
|
|
115
|
+
if (entry.level === 'info' && entry.message) {
|
|
116
|
+
allEntries.push(...(0, sdk_1.defaultParseEvent)(entry.message, entry.timestamp));
|
|
117
|
+
}
|
|
118
|
+
else if (entry.level === 'stdout' && entry.message && provider) {
|
|
119
|
+
allEntries.push(...(0, sdk_1.parseStdoutEvent)('', entry.message, provider));
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
if (!allEntries.length)
|
|
123
|
+
return [];
|
|
124
|
+
const toolUseMap = new Map();
|
|
125
|
+
const toolUseOrder = [];
|
|
126
|
+
for (const e of allEntries) {
|
|
127
|
+
if (e.type === 'tool_use') {
|
|
128
|
+
const tc = {
|
|
129
|
+
toolUseId: e.toolUseId ?? null,
|
|
130
|
+
name: normalizeToolName(e.toolName),
|
|
131
|
+
input: e.toolInput ?? null,
|
|
132
|
+
isError: null,
|
|
133
|
+
resultPreview: null,
|
|
134
|
+
};
|
|
135
|
+
const id = tc.toolUseId;
|
|
136
|
+
if (id) {
|
|
137
|
+
if (toolUseMap.has(id)) {
|
|
138
|
+
toolUseMap.get(id).input = tc.input;
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
toolUseMap.set(id, tc);
|
|
142
|
+
}
|
|
143
|
+
toolUseOrder.push(tc);
|
|
144
|
+
}
|
|
145
|
+
else if (e.type === 'tool_result') {
|
|
146
|
+
const resultE = e;
|
|
147
|
+
if (resultE.toolUseId && toolUseMap.has(resultE.toolUseId)) {
|
|
148
|
+
const tc = toolUseMap.get(resultE.toolUseId);
|
|
149
|
+
tc.isError = resultE.isError === true;
|
|
150
|
+
tc.resultPreview = resultE.resultPreview ?? null;
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
for (let i = toolUseOrder.length - 1; i >= 0; i--) {
|
|
154
|
+
const tc2 = toolUseOrder[i];
|
|
155
|
+
if (tc2.resultPreview === null) {
|
|
156
|
+
tc2.isError = resultE.isError === true;
|
|
157
|
+
tc2.resultPreview = resultE.resultPreview ?? null;
|
|
158
|
+
break;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return toolUseOrder;
|
|
165
|
+
}
|
|
166
|
+
function normalizeSkillName(spanName) {
|
|
167
|
+
const bracket = spanName.match(/^\[skill:([^\]]+)\]/);
|
|
168
|
+
if (bracket) {
|
|
169
|
+
const raw = bracket[1];
|
|
170
|
+
if (raw === 'memory-v2')
|
|
171
|
+
return 'crewx/memory';
|
|
172
|
+
return raw;
|
|
173
|
+
}
|
|
174
|
+
if (spanName.startsWith('skill:'))
|
|
175
|
+
return spanName.slice(6);
|
|
176
|
+
return spanName;
|
|
177
|
+
}
|
|
178
|
+
function extractSkillSubCmd(skillName, input) {
|
|
179
|
+
if (!input)
|
|
180
|
+
return null;
|
|
181
|
+
const tokens = input.trim().split(/\s+/);
|
|
182
|
+
const stripMap = {
|
|
183
|
+
'crewx/memory': 'memory', 'crewx/doc': 'doc', 'crewx/skill': 'skill',
|
|
184
|
+
'crewx/workflow': 'workflow', 'tsserver': 'tsserver',
|
|
185
|
+
};
|
|
186
|
+
if (skillName === 'crewx/search')
|
|
187
|
+
return null;
|
|
188
|
+
let i = 0;
|
|
189
|
+
const prefix = stripMap[skillName];
|
|
190
|
+
if (prefix && tokens[0] === prefix)
|
|
191
|
+
i++;
|
|
192
|
+
const sub = tokens[i];
|
|
193
|
+
if (!sub || sub.startsWith('-') || sub.startsWith('/'))
|
|
194
|
+
return null;
|
|
195
|
+
return sub;
|
|
196
|
+
}
|
|
197
|
+
function aggregateSpans(spans) {
|
|
198
|
+
const bySkill = {};
|
|
199
|
+
for (const s of spans) {
|
|
200
|
+
if (s.input && s.input.includes('summarize-dirty'))
|
|
201
|
+
continue;
|
|
202
|
+
const skill = normalizeSkillName(s.name);
|
|
203
|
+
if (!bySkill[skill])
|
|
204
|
+
bySkill[skill] = { count: 0, subCmds: {} };
|
|
205
|
+
bySkill[skill].count++;
|
|
206
|
+
const sub = extractSkillSubCmd(skill, s.input ?? null);
|
|
207
|
+
if (sub)
|
|
208
|
+
bySkill[skill].subCmds[sub] = (bySkill[skill].subCmds[sub] ?? 0) + 1;
|
|
209
|
+
}
|
|
210
|
+
return bySkill;
|
|
211
|
+
}
|
|
212
|
+
function classifyBashCmd(cmd) {
|
|
213
|
+
if (!cmd)
|
|
214
|
+
return null;
|
|
215
|
+
for (const v of VERIFY_COMMANDS) {
|
|
216
|
+
if (cmd.includes(v))
|
|
217
|
+
return v;
|
|
218
|
+
}
|
|
219
|
+
return null;
|
|
220
|
+
}
|
|
221
|
+
function isBashFailed(tc) {
|
|
222
|
+
if (tc.isError === true)
|
|
223
|
+
return true;
|
|
224
|
+
if (!tc.resultPreview)
|
|
225
|
+
return false;
|
|
226
|
+
return BASH_ERROR_PATTERNS.some((p) => p.test(tc.resultPreview));
|
|
227
|
+
}
|
|
228
|
+
function categorizeError(msg) {
|
|
229
|
+
if (!msg)
|
|
230
|
+
return null;
|
|
231
|
+
for (const [pattern, cat] of ERROR_CATEGORIES) {
|
|
232
|
+
if (pattern.test(msg))
|
|
233
|
+
return cat;
|
|
234
|
+
}
|
|
235
|
+
return null;
|
|
236
|
+
}
|
|
237
|
+
function buildTimeline(toolCalls) {
|
|
238
|
+
const fileEditCounts = {};
|
|
239
|
+
return toolCalls.map((tc) => {
|
|
240
|
+
const name = normalizeToolName(tc.name);
|
|
241
|
+
const entry = {
|
|
242
|
+
name,
|
|
243
|
+
input: tc.input,
|
|
244
|
+
isError: tc.isError,
|
|
245
|
+
resultPreview: tc.resultPreview,
|
|
246
|
+
filePath: null,
|
|
247
|
+
bashCmd: null,
|
|
248
|
+
bashResult: null,
|
|
249
|
+
bashErrorMsg: null,
|
|
250
|
+
errorCategory: null,
|
|
251
|
+
isVerify: false,
|
|
252
|
+
editCount: null,
|
|
253
|
+
};
|
|
254
|
+
if (name === 'Read' || name === 'Edit' || name === 'Write') {
|
|
255
|
+
entry.filePath = extractFilePath(tc.name, tc.input);
|
|
256
|
+
}
|
|
257
|
+
if ((name === 'Edit' || name === 'Write') && entry.filePath) {
|
|
258
|
+
const paths = Array.isArray(entry.filePath) ? entry.filePath : [entry.filePath];
|
|
259
|
+
for (const p of paths)
|
|
260
|
+
fileEditCounts[p] = (fileEditCounts[p] ?? 0) + 1;
|
|
261
|
+
entry.editCount = fileEditCounts[paths[0]] ?? null;
|
|
262
|
+
}
|
|
263
|
+
if (name === 'Bash') {
|
|
264
|
+
entry.bashCmd = tc.input ? tc.input.split('\n')[0].slice(0, 150) : '';
|
|
265
|
+
entry.isVerify = !!classifyBashCmd(entry.bashCmd);
|
|
266
|
+
const failed = isBashFailed(tc);
|
|
267
|
+
entry.bashResult = failed ? 'fail' : 'pass';
|
|
268
|
+
if (failed && tc.resultPreview) {
|
|
269
|
+
entry.bashErrorMsg = tc.resultPreview.trim().split('\n')[0].slice(0, 100);
|
|
270
|
+
entry.errorCategory = categorizeError(tc.resultPreview);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
return entry;
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
function detectPatterns(timeline) {
|
|
277
|
+
const struggles = [];
|
|
278
|
+
const efficients = [];
|
|
279
|
+
for (let i = 0; i < timeline.length; i++) {
|
|
280
|
+
const e = timeline[i];
|
|
281
|
+
if (e.name !== 'Bash' || !e.isVerify || e.bashResult !== 'pass')
|
|
282
|
+
continue;
|
|
283
|
+
const verifyType = classifyBashCmd(e.bashCmd);
|
|
284
|
+
const failIndices = [];
|
|
285
|
+
let j = i - 1;
|
|
286
|
+
while (j >= 0) {
|
|
287
|
+
const prev = timeline[j];
|
|
288
|
+
if (prev.name === 'Bash' && prev.isVerify) {
|
|
289
|
+
if (classifyBashCmd(prev.bashCmd) === verifyType && prev.bashResult === 'fail') {
|
|
290
|
+
failIndices.unshift(j);
|
|
291
|
+
}
|
|
292
|
+
else if (prev.bashResult === 'pass') {
|
|
293
|
+
break;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
j--;
|
|
297
|
+
}
|
|
298
|
+
if (failIndices.length >= 1) {
|
|
299
|
+
const startI = failIndices[0];
|
|
300
|
+
const editFiles = {};
|
|
301
|
+
const errors = [];
|
|
302
|
+
for (let k = startI; k <= i; k++) {
|
|
303
|
+
const t = timeline[k];
|
|
304
|
+
if ((t.name === 'Edit' || t.name === 'Write') && t.filePath) {
|
|
305
|
+
const paths = Array.isArray(t.filePath) ? t.filePath : [t.filePath];
|
|
306
|
+
for (const p of paths)
|
|
307
|
+
editFiles[p] = (editFiles[p] ?? 0) + 1;
|
|
308
|
+
}
|
|
309
|
+
if (t.name === 'Bash' && t.bashResult === 'fail' && t.bashErrorMsg) {
|
|
310
|
+
errors.push(t.bashErrorMsg);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
const errorCategories = errors.map(categorizeError).filter((c) => c !== null);
|
|
314
|
+
struggles.push({
|
|
315
|
+
startIdx: startI,
|
|
316
|
+
endIdx: i,
|
|
317
|
+
failCount: failIndices.length,
|
|
318
|
+
editFiles,
|
|
319
|
+
errors: [...new Set(errors)].slice(0, 3),
|
|
320
|
+
errorCategories: [...new Set(errorCategories)],
|
|
321
|
+
verifyCmd: verifyType,
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
else {
|
|
325
|
+
let editCount = 0, readCount = 0, k = i - 1;
|
|
326
|
+
while (k >= 0) {
|
|
327
|
+
const prev = timeline[k];
|
|
328
|
+
if (prev.name === 'Edit' || prev.name === 'Write')
|
|
329
|
+
editCount++;
|
|
330
|
+
else if (prev.name === 'Read' || prev.name === 'Grep' || prev.name === 'Find')
|
|
331
|
+
readCount++;
|
|
332
|
+
else
|
|
333
|
+
break;
|
|
334
|
+
k--;
|
|
335
|
+
}
|
|
336
|
+
if (editCount > 0) {
|
|
337
|
+
efficients.push({ startIdx: k + 1, endIdx: i, readCount, editCount });
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
return { struggles, efficients };
|
|
342
|
+
}
|
|
343
|
+
function analyzeTask(row, spans) {
|
|
344
|
+
let logs = [];
|
|
345
|
+
try {
|
|
346
|
+
const parsed = JSON.parse(row.logs ?? '[]');
|
|
347
|
+
if (Array.isArray(parsed))
|
|
348
|
+
logs = parsed;
|
|
349
|
+
}
|
|
350
|
+
catch { }
|
|
351
|
+
const toolCalls = extractToolCallsFromLogs(logs);
|
|
352
|
+
const duration = row.duration_ms != null ? Math.round(row.duration_ms / 1000) : null;
|
|
353
|
+
let metaProvider = null;
|
|
354
|
+
if (row.metadata) {
|
|
355
|
+
try {
|
|
356
|
+
metaProvider = JSON.parse(row.metadata).provider ?? null;
|
|
357
|
+
}
|
|
358
|
+
catch { }
|
|
359
|
+
}
|
|
360
|
+
const timeline = buildTimeline(toolCalls);
|
|
361
|
+
const patterns = detectPatterns(timeline);
|
|
362
|
+
const readFiles = new Set();
|
|
363
|
+
const editFiles = new Set();
|
|
364
|
+
let bashCount = 0, verifyRuns = 0;
|
|
365
|
+
for (const e of timeline) {
|
|
366
|
+
const paths = e.filePath
|
|
367
|
+
? (Array.isArray(e.filePath) ? e.filePath : [e.filePath])
|
|
368
|
+
: [];
|
|
369
|
+
if (e.name === 'Read')
|
|
370
|
+
paths.forEach((p) => readFiles.add(p));
|
|
371
|
+
else if (e.name === 'Edit' || e.name === 'Write')
|
|
372
|
+
paths.forEach((p) => editFiles.add(p));
|
|
373
|
+
else if (e.name === 'Bash') {
|
|
374
|
+
bashCount++;
|
|
375
|
+
if (e.isVerify)
|
|
376
|
+
verifyRuns++;
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
const skills = aggregateSpans(spans);
|
|
380
|
+
const hasEdits = editFiles.size > 0;
|
|
381
|
+
const hasDoc = !!(skills['crewx/doc'] && skills['crewx/doc'].count > 0);
|
|
382
|
+
const hasMemory = !!(skills['crewx/memory'] && skills['crewx/memory'].count > 0);
|
|
383
|
+
const hasTsserver = !!(skills['tsserver'] && skills['tsserver'].count > 0);
|
|
384
|
+
const hasSearch = !!(skills['crewx/search'] && skills['crewx/search'].count > 0);
|
|
385
|
+
const promptSummary = row.prompt ? row.prompt.split('\n')[0].slice(0, 120) : null;
|
|
386
|
+
const resultSummary = row.result ? row.result.split('\n')[0].slice(0, 120) : null;
|
|
387
|
+
return {
|
|
388
|
+
taskId: row.id,
|
|
389
|
+
agentId: row.agent_id,
|
|
390
|
+
metaProvider,
|
|
391
|
+
status: row.status,
|
|
392
|
+
promptSummary,
|
|
393
|
+
resultSummary,
|
|
394
|
+
duration,
|
|
395
|
+
toolCount: toolCalls.length,
|
|
396
|
+
timeline,
|
|
397
|
+
patterns,
|
|
398
|
+
behavior: {
|
|
399
|
+
readFiles: [...readFiles],
|
|
400
|
+
editFiles: [...editFiles],
|
|
401
|
+
bashCount,
|
|
402
|
+
},
|
|
403
|
+
metrics: {
|
|
404
|
+
struggles: patterns.struggles.length,
|
|
405
|
+
total_retries: patterns.struggles.reduce((s, r) => s + r.failCount, 0),
|
|
406
|
+
efficients: patterns.efficients.length,
|
|
407
|
+
verify_runs: verifyRuns,
|
|
408
|
+
},
|
|
409
|
+
skills,
|
|
410
|
+
skillInsights: { hasEdits, hasDoc, hasMemory, hasTsserver, hasSearch },
|
|
411
|
+
hasStruggles: patterns.struggles.length > 0,
|
|
412
|
+
};
|
|
413
|
+
}
|
|
414
|
+
//# sourceMappingURL=analyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyzer.js","sourceRoot":"","sources":["../../src/analyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { TaskAnalysis, TaskSummaryRow } from './types.js';
|
|
2
|
+
export declare function renderTaskFull(r: TaskAnalysis): string;
|
|
3
|
+
export declare function renderThreadTaskList(rows: TaskSummaryRow[], threadId: string, recent: number): string;
|
|
4
|
+
//# sourceMappingURL=renderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../src/renderer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAiB,MAAM,YAAY,CAAC;AA+B9E,wBAAgB,cAAc,CAAC,CAAC,EAAE,YAAY,GAAG,MAAM,CAwFtD;AAWD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,cAAc,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CA0BrG"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.renderTaskFull = renderTaskFull;
|
|
4
|
+
exports.renderThreadTaskList = renderThreadTaskList;
|
|
5
|
+
function renderTimelineEntry(e, numWidth, num) {
|
|
6
|
+
const n = String(num).padStart(numWidth);
|
|
7
|
+
if (e.name === 'Read' || e.name === 'Grep' || e.name === 'Find') {
|
|
8
|
+
const fp = Array.isArray(e.filePath) ? e.filePath.join(', ') : (e.filePath ?? e.input?.slice(0, 50) ?? '');
|
|
9
|
+
return ` ${n}. ${e.name.padEnd(5)} ${fp}`;
|
|
10
|
+
}
|
|
11
|
+
if (e.name === 'Edit' || e.name === 'Write') {
|
|
12
|
+
const fp = Array.isArray(e.filePath) ? e.filePath.join(', ') : (e.filePath ?? '');
|
|
13
|
+
let suffix = '';
|
|
14
|
+
if (e.editCount === 2)
|
|
15
|
+
suffix = ' ← 같은 파일 재수정';
|
|
16
|
+
else if ((e.editCount ?? 0) > 2)
|
|
17
|
+
suffix = ` ← 같은 파일 ${e.editCount}번째 수정`;
|
|
18
|
+
return ` ${n}. ${e.name.padEnd(5)} ${fp}${suffix}`;
|
|
19
|
+
}
|
|
20
|
+
if (e.name === 'Bash') {
|
|
21
|
+
const cmd = e.bashCmd ?? '';
|
|
22
|
+
const display = cmd.length > 72 ? cmd.slice(0, 71) + '…' : cmd.padEnd(72);
|
|
23
|
+
if (e.bashResult === 'fail') {
|
|
24
|
+
return ` ${n}. Bash ${display} → ❌ ${(e.bashErrorMsg ?? 'failed').slice(0, 80)}`;
|
|
25
|
+
}
|
|
26
|
+
return ` ${n}. Bash ${display} → ✅ pass`;
|
|
27
|
+
}
|
|
28
|
+
const hint = e.input ? e.input.slice(0, 80) : '';
|
|
29
|
+
return ` ${n}. ${(e.name || '?').padEnd(5)} ${hint}`;
|
|
30
|
+
}
|
|
31
|
+
function renderTaskFull(r) {
|
|
32
|
+
const out = [];
|
|
33
|
+
out.push(`\n━━━ Dreaming: task ${r.taskId} ━━━`);
|
|
34
|
+
const pTag = r.metaProvider ? ` (${r.metaProvider})` : '';
|
|
35
|
+
out.push(`Agent: ${r.agentId}${pTag} | Status: ${r.status} | Duration: ${r.duration != null ? r.duration + 's' : '-'} | Tools: ${r.toolCount} calls`);
|
|
36
|
+
if (r.promptSummary)
|
|
37
|
+
out.push(`📋 지시: ${r.promptSummary}`);
|
|
38
|
+
if (r.resultSummary)
|
|
39
|
+
out.push(`📝 결론: ${r.resultSummary}`);
|
|
40
|
+
if (!r.timeline.length) {
|
|
41
|
+
out.push('\n (tool call 데이터 없음)');
|
|
42
|
+
return out.join('\n');
|
|
43
|
+
}
|
|
44
|
+
const anno = {};
|
|
45
|
+
for (const s of r.patterns.struggles) {
|
|
46
|
+
const top = Object.entries(s.editFiles).sort((a, b) => b[1] - a[1])[0];
|
|
47
|
+
const file = top ? top[0] : '(unknown)';
|
|
48
|
+
const errHint = s.errorCategories[0] ?? (s.errors[0] ? s.errors[0].slice(0, 50) : '');
|
|
49
|
+
const cause = errHint ? ` — ${errHint}` : '';
|
|
50
|
+
anno[s.endIdx] = `💡 삽질: ${file} ${s.failCount + 1}회 수정 (${s.startIdx + 1}→${s.endIdx + 1})${cause}`;
|
|
51
|
+
}
|
|
52
|
+
for (const e of r.patterns.efficients) {
|
|
53
|
+
const parts = [];
|
|
54
|
+
if (e.readCount > 0)
|
|
55
|
+
parts.push(`Read ${e.readCount}개`);
|
|
56
|
+
parts.push(`Edit ${e.editCount}개`);
|
|
57
|
+
parts.push('검증 한방 통과');
|
|
58
|
+
anno[e.endIdx] = `💡 효율: ${parts.join(' → ')}`;
|
|
59
|
+
}
|
|
60
|
+
out.push('\n[타임라인]');
|
|
61
|
+
const nw = String(r.timeline.length).length;
|
|
62
|
+
for (let i = 0; i < r.timeline.length; i++) {
|
|
63
|
+
out.push(renderTimelineEntry(r.timeline[i], nw, i + 1));
|
|
64
|
+
if (anno[i] !== undefined)
|
|
65
|
+
out.push(` ${anno[i]}`);
|
|
66
|
+
}
|
|
67
|
+
const skillEntries = Object.entries(r.skills).sort((a, b) => b[1].count - a[1].count);
|
|
68
|
+
if (skillEntries.length > 0) {
|
|
69
|
+
out.push('\n[스킬 사용]');
|
|
70
|
+
for (const [name, data] of skillEntries) {
|
|
71
|
+
const subs = Object.entries(data.subCmds).sort((a, b) => b[1] - a[1]).map(([s]) => s);
|
|
72
|
+
const subStr = subs.length > 0 ? ` (${subs.join(', ')})` : '';
|
|
73
|
+
out.push(` ${name.padEnd(16)} ${String(data.count).padStart(2)}회${subStr}`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
out.push('\n[회고 요약]');
|
|
77
|
+
if (r.patterns.efficients.length > 0) {
|
|
78
|
+
out.push(` ✅ 효율 패턴: Read→Edit→검증 한방 통과 ${r.patterns.efficients.length}건`);
|
|
79
|
+
}
|
|
80
|
+
if (r.patterns.struggles.length > 0) {
|
|
81
|
+
const details = r.patterns.struggles.map((s) => {
|
|
82
|
+
const top = Object.entries(s.editFiles).sort((a, b) => b[1] - a[1])[0];
|
|
83
|
+
return top ? `${top[0]} ${top[1]}회` : null;
|
|
84
|
+
}).filter((x) => x !== null).join(', ');
|
|
85
|
+
out.push(` ⚠️ 삽질 패턴: 같은 파일 반복 수정 ${r.patterns.struggles.length}건 (${details})`);
|
|
86
|
+
const cats = {};
|
|
87
|
+
for (const s of r.patterns.struggles) {
|
|
88
|
+
for (const c of s.errorCategories)
|
|
89
|
+
cats[c] = (cats[c] ?? 0) + 1;
|
|
90
|
+
}
|
|
91
|
+
const topCat = Object.entries(cats).sort((a, b) => b[1] - a[1])[0];
|
|
92
|
+
if (topCat)
|
|
93
|
+
out.push(` 💡 인사이트: 에러 대부분 ${topCat[0]} (${topCat[1]}건)`);
|
|
94
|
+
}
|
|
95
|
+
if (!r.patterns.efficients.length && !r.patterns.struggles.length) {
|
|
96
|
+
out.push(' 📊 특이 패턴 없음 — 일반적인 작업 흐름');
|
|
97
|
+
}
|
|
98
|
+
const si = r.skillInsights;
|
|
99
|
+
if (si.hasEdits && !si.hasDoc) {
|
|
100
|
+
out.push(' 📚 설계서 미참조 — doc 호출 없이 Edit 시작 (설계서 먼저 확인하면 삽질 줄일 수 있음)');
|
|
101
|
+
}
|
|
102
|
+
if (!si.hasMemory) {
|
|
103
|
+
out.push(' 🧠 메모리 미확인 — 과거 기록 확인 없이 작업 (이전 결정과 충돌 가능)');
|
|
104
|
+
}
|
|
105
|
+
if (si.hasTsserver) {
|
|
106
|
+
const tsCount = r.skills['tsserver']?.count ?? 0;
|
|
107
|
+
out.push(` 🔍 코드 분석 활용 — tsserver ${tsCount}회 사용`);
|
|
108
|
+
}
|
|
109
|
+
if (si.hasSearch) {
|
|
110
|
+
const sCount = r.skills['crewx/search']?.count ?? 0;
|
|
111
|
+
out.push(` 🔎 검색 활용 — crewx/search ${sCount}회 사용`);
|
|
112
|
+
}
|
|
113
|
+
return out.join('\n');
|
|
114
|
+
}
|
|
115
|
+
function statusEmoji(status) {
|
|
116
|
+
if (status === 'success' || status === 'completed' || status === 'done')
|
|
117
|
+
return '✅';
|
|
118
|
+
if (status === 'failed')
|
|
119
|
+
return '❌';
|
|
120
|
+
if (status === 'running')
|
|
121
|
+
return '🔄';
|
|
122
|
+
return '⏸';
|
|
123
|
+
}
|
|
124
|
+
function renderThreadTaskList(rows, threadId, recent) {
|
|
125
|
+
const out = [];
|
|
126
|
+
out.push(`\n━━━ Dreaming: thread ${threadId} — 최근 ${recent}건 ━━━`);
|
|
127
|
+
out.push(`태스크 목록: ${rows.length}건`);
|
|
128
|
+
out.push('');
|
|
129
|
+
if (!rows.length) {
|
|
130
|
+
out.push(' (태스크 없음)');
|
|
131
|
+
return out.join('\n');
|
|
132
|
+
}
|
|
133
|
+
const idW = Math.max(...rows.map((r) => r.taskId.length));
|
|
134
|
+
const agentW = Math.max(...rows.map((r) => r.agentId.length));
|
|
135
|
+
for (let i = 0; i < rows.length; i++) {
|
|
136
|
+
const r = rows[i];
|
|
137
|
+
const num = String(i + 1).padStart(String(rows.length).length);
|
|
138
|
+
const icon = statusEmoji(r.status);
|
|
139
|
+
const dur = r.duration != null ? `${r.duration}s` : ' -';
|
|
140
|
+
const prompt = r.promptSummary ? r.promptSummary.slice(0, 55) : '';
|
|
141
|
+
out.push(` ${num}. ${icon} ${r.taskId.padEnd(idW)} | ${r.agentId.padEnd(agentW)} | ${r.status.padEnd(9)} | ${dur.padStart(5)} | ${prompt}`);
|
|
142
|
+
}
|
|
143
|
+
out.push('');
|
|
144
|
+
out.push(` 드릴다운: crewx dreaming --task=<id>`);
|
|
145
|
+
return out.join('\n');
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderer.js","sourceRoot":"","sources":["../../src/renderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
export interface TimelineEntry {
|
|
2
|
+
name: string;
|
|
3
|
+
input: string | null;
|
|
4
|
+
isError: boolean | null;
|
|
5
|
+
resultPreview: string | null;
|
|
6
|
+
filePath: string | string[] | null;
|
|
7
|
+
bashCmd: string | null;
|
|
8
|
+
bashResult: 'pass' | 'fail' | null;
|
|
9
|
+
bashErrorMsg: string | null;
|
|
10
|
+
errorCategory: string | null;
|
|
11
|
+
isVerify: boolean;
|
|
12
|
+
editCount: number | null;
|
|
13
|
+
}
|
|
14
|
+
export interface StrugglePattern {
|
|
15
|
+
startIdx: number;
|
|
16
|
+
endIdx: number;
|
|
17
|
+
failCount: number;
|
|
18
|
+
editFiles: Record<string, number>;
|
|
19
|
+
errors: string[];
|
|
20
|
+
errorCategories: string[];
|
|
21
|
+
verifyCmd: string;
|
|
22
|
+
}
|
|
23
|
+
export interface EfficientPattern {
|
|
24
|
+
startIdx: number;
|
|
25
|
+
endIdx: number;
|
|
26
|
+
readCount: number;
|
|
27
|
+
editCount: number;
|
|
28
|
+
}
|
|
29
|
+
export interface TaskAnalysis {
|
|
30
|
+
taskId: string;
|
|
31
|
+
agentId: string;
|
|
32
|
+
metaProvider: string | null;
|
|
33
|
+
status: string;
|
|
34
|
+
promptSummary: string | null;
|
|
35
|
+
resultSummary: string | null;
|
|
36
|
+
duration: number | null;
|
|
37
|
+
toolCount: number;
|
|
38
|
+
timeline: TimelineEntry[];
|
|
39
|
+
patterns: {
|
|
40
|
+
struggles: StrugglePattern[];
|
|
41
|
+
efficients: EfficientPattern[];
|
|
42
|
+
};
|
|
43
|
+
behavior: {
|
|
44
|
+
readFiles: string[];
|
|
45
|
+
editFiles: string[];
|
|
46
|
+
bashCount: number;
|
|
47
|
+
};
|
|
48
|
+
metrics: {
|
|
49
|
+
struggles: number;
|
|
50
|
+
total_retries: number;
|
|
51
|
+
efficients: number;
|
|
52
|
+
verify_runs: number;
|
|
53
|
+
};
|
|
54
|
+
skills: Record<string, {
|
|
55
|
+
count: number;
|
|
56
|
+
subCmds: Record<string, number>;
|
|
57
|
+
}>;
|
|
58
|
+
skillInsights: {
|
|
59
|
+
hasEdits: boolean;
|
|
60
|
+
hasDoc: boolean;
|
|
61
|
+
hasMemory: boolean;
|
|
62
|
+
hasTsserver: boolean;
|
|
63
|
+
hasSearch: boolean;
|
|
64
|
+
};
|
|
65
|
+
hasStruggles: boolean;
|
|
66
|
+
}
|
|
67
|
+
export interface TaskSummaryRow {
|
|
68
|
+
taskId: string;
|
|
69
|
+
agentId: string;
|
|
70
|
+
status: string;
|
|
71
|
+
promptSummary: string | null;
|
|
72
|
+
startedAt: string | null;
|
|
73
|
+
duration: number | null;
|
|
74
|
+
}
|
|
75
|
+
export interface DreamingFlags {
|
|
76
|
+
task: string | null;
|
|
77
|
+
thread: string | null;
|
|
78
|
+
agent: string | null;
|
|
79
|
+
days: number;
|
|
80
|
+
recent: number | null;
|
|
81
|
+
json: boolean;
|
|
82
|
+
all: boolean;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACxB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC;IACnC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACnC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,QAAQ,EAAE;QAAE,SAAS,EAAE,eAAe,EAAE,CAAC;QAAC,UAAU,EAAE,gBAAgB,EAAE,CAAA;KAAE,CAAC;IAC3E,QAAQ,EAAE;QAAE,SAAS,EAAE,MAAM,EAAE,CAAC;QAAC,SAAS,EAAE,MAAM,EAAE,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1E,OAAO,EAAE;QACP,SAAS,EAAE,MAAM,CAAC;QAClB,aAAa,EAAE,MAAM,CAAC;QACtB,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC,CAAC;IAC3E,aAAa,EAAE;QACb,QAAQ,EAAE,OAAO,CAAC;QAClB,MAAM,EAAE,OAAO,CAAC;QAChB,SAAS,EAAE,OAAO,CAAC;QACnB,WAAW,EAAE,OAAO,CAAC;QACrB,SAAS,EAAE,OAAO,CAAC;KACpB,CAAC;IACF,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,EAAE,OAAO,CAAC;IACd,GAAG,EAAE,OAAO,CAAC;CACd"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@crewx/dreaming",
|
|
3
|
+
"version": "0.1.0-rc.1",
|
|
4
|
+
"description": "Dreaming — mandatory retrospection skill for CrewX agents (task/thread review)",
|
|
5
|
+
"type": "commonjs",
|
|
6
|
+
"main": "dist/cli.js",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"import": "./dist/cli.js",
|
|
10
|
+
"require": "./dist/cli.js",
|
|
11
|
+
"default": "./dist/cli.js"
|
|
12
|
+
},
|
|
13
|
+
"./cli": {
|
|
14
|
+
"import": "./dist/cli.js",
|
|
15
|
+
"require": "./dist/cli.js",
|
|
16
|
+
"default": "./dist/cli.js"
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
"bin": {
|
|
20
|
+
"dreaming": "./dist/cli.js"
|
|
21
|
+
},
|
|
22
|
+
"files": [
|
|
23
|
+
"dist",
|
|
24
|
+
"SKILL.md"
|
|
25
|
+
],
|
|
26
|
+
"keywords": [
|
|
27
|
+
"crewx",
|
|
28
|
+
"dreaming",
|
|
29
|
+
"retrospection",
|
|
30
|
+
"analytics"
|
|
31
|
+
],
|
|
32
|
+
"license": "MIT",
|
|
33
|
+
"dependencies": {
|
|
34
|
+
"@crewx/sdk": "0.8.8-rc.19",
|
|
35
|
+
"@crewx/shared": "0.0.5"
|
|
36
|
+
},
|
|
37
|
+
"devDependencies": {
|
|
38
|
+
"@types/node": "^20.0.0",
|
|
39
|
+
"typescript": "^5.0.0"
|
|
40
|
+
},
|
|
41
|
+
"scripts": {
|
|
42
|
+
"build": "tsc",
|
|
43
|
+
"clean": "rm -rf dist",
|
|
44
|
+
"test": "echo no tests"
|
|
45
|
+
}
|
|
46
|
+
}
|