@trungtamcongnghedigital/vsaf 1.0.1 → 1.1.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 +1 -1
- package/packages/cli/dist/commands/install/skill-hooks.d.ts +17 -4
- package/packages/cli/dist/commands/install/skill-hooks.d.ts.map +1 -1
- package/packages/cli/dist/commands/install/skill-hooks.js +21 -5
- package/packages/cli/dist/commands/install/skill-hooks.js.map +1 -1
- package/packages/cli/dist/commands/telemetry-skill.d.ts +47 -10
- package/packages/cli/dist/commands/telemetry-skill.d.ts.map +1 -1
- package/packages/cli/dist/commands/telemetry-skill.js +392 -106
- package/packages/cli/dist/commands/telemetry-skill.js.map +1 -1
- package/packages/cli/dist/index.js +15 -4
- package/packages/cli/dist/index.js.map +1 -1
- package/packages/cli/dist/telemetry/otel-sdk.d.ts +13 -0
- package/packages/cli/dist/telemetry/otel-sdk.d.ts.map +1 -1
- package/packages/cli/dist/telemetry/otel-sdk.js +11 -0
- package/packages/cli/dist/telemetry/otel-sdk.js.map +1 -1
- package/packages/cli/dist/telemetry/otel-tracer.d.ts +13 -1
- package/packages/cli/dist/telemetry/otel-tracer.d.ts.map +1 -1
- package/packages/cli/dist/telemetry/otel-tracer.js +38 -4
- package/packages/cli/dist/telemetry/otel-tracer.js.map +1 -1
- package/packages/cli/dist/telemetry/project-root.d.ts +18 -0
- package/packages/cli/dist/telemetry/project-root.d.ts.map +1 -0
- package/packages/cli/dist/telemetry/project-root.js +57 -0
- package/packages/cli/dist/telemetry/project-root.js.map +1 -0
- package/packages/cli/dist/telemetry/tracer.d.ts +41 -1
- package/packages/cli/dist/telemetry/tracer.d.ts.map +1 -1
- package/packages/cli/dist/telemetry/tracer.js.map +1 -1
package/package.json
CHANGED
|
@@ -1,12 +1,25 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Ba hook kẹp lấy một lần gọi skill.
|
|
3
3
|
*
|
|
4
|
-
* Mốc bắt đầu là `PreToolUse` matcher `Skill`. Mốc
|
|
5
|
-
* `PostToolUse`: tool `Skill` chỉ nạp file hướng dẫn ra rồi trả về gần như ngay,
|
|
6
|
-
* `PostToolUse` nổ lúc việc thật còn chưa bắt đầu.
|
|
4
|
+
* Mốc bắt đầu là `PreToolUse` matcher `Skill`. Mốc đo từng chặng là `Stop` chứ KHÔNG
|
|
5
|
+
* phải `PostToolUse`: tool `Skill` chỉ nạp file hướng dẫn ra rồi trả về gần như ngay,
|
|
6
|
+
* nên `PostToolUse` nổ lúc việc thật còn chưa bắt đầu.
|
|
7
|
+
*
|
|
8
|
+
* `Stop` nổ ở MỌI lượt trả lời, mà một lần gọi skill trải nhiều lượt, nên nó không
|
|
9
|
+
* phải mốc kết thúc — nó gửi phần chênh của lượt rồi dời mốc. `SessionEnd` mới là chỗ
|
|
10
|
+
* đóng chuỗi: gửi phần còn lại và bỏ file chờ.
|
|
7
11
|
*/
|
|
8
12
|
export declare const SKILL_OPEN_HOOK_COMMAND = "vsaf telemetry skill-open";
|
|
13
|
+
/**
|
|
14
|
+
* Mốc bắt đầu thứ hai, cho skill người dùng gõ thẳng `/tên-skill`.
|
|
15
|
+
*
|
|
16
|
+
* Đường gõ tay KHÔNG đi qua tool nào — Claude Code dán nội dung skill vào chính câu hỏi
|
|
17
|
+
* của người dùng — nên `PreToolUse` không có sự kiện để bám. Thiếu hook này thì khoảng
|
|
18
|
+
* một phần tư số lần gọi skill biến mất khỏi sổ mà không có dấu hiệu gì.
|
|
19
|
+
*/
|
|
20
|
+
export declare const SKILL_PROMPT_HOOK_COMMAND = "vsaf telemetry skill-open --from-prompt";
|
|
9
21
|
export declare const SKILL_CLOSE_HOOK_COMMAND = "vsaf telemetry skill-close";
|
|
22
|
+
export declare const SKILL_FINAL_HOOK_COMMAND = "vsaf telemetry skill-close --final";
|
|
10
23
|
/**
|
|
11
24
|
* Đảm bảo `.claude/settings.json` còn hai hook quan sát skill.
|
|
12
25
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-hooks.d.ts","sourceRoot":"","sources":["../../../src/commands/install/skill-hooks.ts"],"names":[],"mappings":"AAGA
|
|
1
|
+
{"version":3,"file":"skill-hooks.d.ts","sourceRoot":"","sources":["../../../src/commands/install/skill-hooks.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;GAUG;AACH,eAAO,MAAM,uBAAuB,8BAA8B,CAAC;AACnE;;;;;;GAMG;AACH,eAAO,MAAM,yBAAyB,4CAA4C,CAAC;AACnF,eAAO,MAAM,wBAAwB,+BAA+B,CAAC;AACrE,eAAO,MAAM,wBAAwB,uCAAuC,CAAC;AAiC7E;;;;;;;GAOG;AACH,wBAAgB,6BAA6B,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,YAAY,CA+BlG"}
|
|
@@ -1,18 +1,31 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.SKILL_CLOSE_HOOK_COMMAND = exports.SKILL_OPEN_HOOK_COMMAND = void 0;
|
|
3
|
+
exports.SKILL_FINAL_HOOK_COMMAND = exports.SKILL_CLOSE_HOOK_COMMAND = exports.SKILL_PROMPT_HOOK_COMMAND = exports.SKILL_OPEN_HOOK_COMMAND = void 0;
|
|
4
4
|
exports.ensureSkillObservabilityHooks = ensureSkillObservabilityHooks;
|
|
5
5
|
const fs_1 = require("fs");
|
|
6
6
|
const path_1 = require("path");
|
|
7
7
|
/**
|
|
8
|
-
*
|
|
8
|
+
* Ba hook kẹp lấy một lần gọi skill.
|
|
9
9
|
*
|
|
10
|
-
* Mốc bắt đầu là `PreToolUse` matcher `Skill`. Mốc
|
|
11
|
-
* `PostToolUse`: tool `Skill` chỉ nạp file hướng dẫn ra rồi trả về gần như ngay,
|
|
12
|
-
* `PostToolUse` nổ lúc việc thật còn chưa bắt đầu.
|
|
10
|
+
* Mốc bắt đầu là `PreToolUse` matcher `Skill`. Mốc đo từng chặng là `Stop` chứ KHÔNG
|
|
11
|
+
* phải `PostToolUse`: tool `Skill` chỉ nạp file hướng dẫn ra rồi trả về gần như ngay,
|
|
12
|
+
* nên `PostToolUse` nổ lúc việc thật còn chưa bắt đầu.
|
|
13
|
+
*
|
|
14
|
+
* `Stop` nổ ở MỌI lượt trả lời, mà một lần gọi skill trải nhiều lượt, nên nó không
|
|
15
|
+
* phải mốc kết thúc — nó gửi phần chênh của lượt rồi dời mốc. `SessionEnd` mới là chỗ
|
|
16
|
+
* đóng chuỗi: gửi phần còn lại và bỏ file chờ.
|
|
13
17
|
*/
|
|
14
18
|
exports.SKILL_OPEN_HOOK_COMMAND = 'vsaf telemetry skill-open';
|
|
19
|
+
/**
|
|
20
|
+
* Mốc bắt đầu thứ hai, cho skill người dùng gõ thẳng `/tên-skill`.
|
|
21
|
+
*
|
|
22
|
+
* Đường gõ tay KHÔNG đi qua tool nào — Claude Code dán nội dung skill vào chính câu hỏi
|
|
23
|
+
* của người dùng — nên `PreToolUse` không có sự kiện để bám. Thiếu hook này thì khoảng
|
|
24
|
+
* một phần tư số lần gọi skill biến mất khỏi sổ mà không có dấu hiệu gì.
|
|
25
|
+
*/
|
|
26
|
+
exports.SKILL_PROMPT_HOOK_COMMAND = 'vsaf telemetry skill-open --from-prompt';
|
|
15
27
|
exports.SKILL_CLOSE_HOOK_COMMAND = 'vsaf telemetry skill-close';
|
|
28
|
+
exports.SKILL_FINAL_HOOK_COMMAND = 'vsaf telemetry skill-close --final';
|
|
16
29
|
/**
|
|
17
30
|
* Chỉ thêm, và de-dupe theo nội dung `command`.
|
|
18
31
|
*
|
|
@@ -61,8 +74,11 @@ function ensureSkillObservabilityHooks(projectPath) {
|
|
|
61
74
|
const hooks = (settings.hooks ??= {});
|
|
62
75
|
const changed = [
|
|
63
76
|
addHook((hooks.PreToolUse ??= []), 'Skill', exports.SKILL_OPEN_HOOK_COMMAND),
|
|
77
|
+
// `UserPromptSubmit` không nhận `matcher` — nó fire ở mọi lượt người dùng gửi.
|
|
78
|
+
addHook((hooks.UserPromptSubmit ??= []), undefined, exports.SKILL_PROMPT_HOOK_COMMAND),
|
|
64
79
|
// `Stop` không nhận `matcher` — nó fire ở mọi lượt kết thúc.
|
|
65
80
|
addHook((hooks.Stop ??= []), undefined, exports.SKILL_CLOSE_HOOK_COMMAND),
|
|
81
|
+
addHook((hooks.SessionEnd ??= []), undefined, exports.SKILL_FINAL_HOOK_COMMAND),
|
|
66
82
|
].some(Boolean);
|
|
67
83
|
if (!changed)
|
|
68
84
|
return 'kept';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-hooks.js","sourceRoot":"","sources":["../../../src/commands/install/skill-hooks.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"skill-hooks.js","sourceRoot":"","sources":["../../../src/commands/install/skill-hooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -38,8 +38,18 @@ export declare function traceNameFor(skills: string[]): string;
|
|
|
38
38
|
* Hook "đóng" thử MỌI ứng viên, nên bên nào thiếu field cũng vẫn tìm ra file của mình.
|
|
39
39
|
*/
|
|
40
40
|
export declare function pairingKeysOf(payload: unknown): string[];
|
|
41
|
-
/**
|
|
42
|
-
|
|
41
|
+
/**
|
|
42
|
+
* Khoá đặt tên file chờ — theo PHIÊN, không theo lượt.
|
|
43
|
+
*
|
|
44
|
+
* Trước đây chỗ này lấy `prompt_id` (khoá của một lượt) để lượt sau không nhặt file
|
|
45
|
+
* chờ sót của lượt trước. Nhưng chuỗi đo bây giờ CỐ Ý sống qua nhiều lượt, nên khoá
|
|
46
|
+
* theo lượt làm hook đóng của lượt thứ hai không tìm thấy chính file nó vừa tái vũ
|
|
47
|
+
* trang — tức mọi việc sau câu hỏi đầu tiên của skill lại biến mất y như cũ.
|
|
48
|
+
*
|
|
49
|
+
* Rủi ro cũ (file sót bị gán sai lượt) đã được xử ở chỗ khác: mỗi lần đóng đều chụp
|
|
50
|
+
* lại mốc mới, nên ảnh chụp luôn tươi; và chuỗi bị bỏ dở thì `sweepStale` dọn.
|
|
51
|
+
*/
|
|
52
|
+
export declare function chainKeyOf(payload: unknown): string | undefined;
|
|
43
53
|
/**
|
|
44
54
|
* Session id THẬT do Claude Code cấp, nếu payload có.
|
|
45
55
|
*
|
|
@@ -51,23 +61,50 @@ export declare function sessionKeyOf(payload: unknown): string | undefined;
|
|
|
51
61
|
export declare function claudeSessionIdOf(payload: unknown): string | undefined;
|
|
52
62
|
export type SkillOpenResult = 'written' | 'skipped-excluded' | 'skipped-workflow-wrapper' | 'skipped-in-workflow' | 'skipped-no-skill';
|
|
53
63
|
/**
|
|
54
|
-
*
|
|
64
|
+
* Tên skill trong một lượt người dùng gõ `/tên-skill`, nếu có.
|
|
55
65
|
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
66
|
+
* Nhận CẢ HAI dạng vì payload khác nhau tuỳ phiên bản Claude Code: dạng đã bung thẻ
|
|
67
|
+
* (`<command-name>` + `<command-args>`, đúng thứ transcript ghi lại) và dạng thô người
|
|
68
|
+
* dùng vừa gõ. Chỉ đỡ một dạng thì hôm nay chạy, bản sau im lặng ngừng đo — mà im lặng
|
|
69
|
+
* chính là kiểu hỏng đã làm mất trắng số liệu suốt từ đầu.
|
|
70
|
+
*/
|
|
71
|
+
export declare function parseSlashCommand(payload: unknown): {
|
|
72
|
+
skill: string;
|
|
73
|
+
args: string;
|
|
74
|
+
} | undefined;
|
|
75
|
+
/**
|
|
76
|
+
* Hook `PreToolUse` (matcher `Skill`): model tự quyết định gọi một skill.
|
|
58
77
|
*/
|
|
59
78
|
export declare function skillOpen(projectPath: string, payload: unknown, now?: number, staleMs?: number): SkillOpenResult;
|
|
79
|
+
/**
|
|
80
|
+
* Hook `UserPromptSubmit`: người dùng gõ thẳng `/tên-skill`.
|
|
81
|
+
*
|
|
82
|
+
* Đường này KHÔNG đi qua tool nào cả — Claude Code đọc file skill rồi dán vào chính
|
|
83
|
+
* câu hỏi của người dùng, nên `PreToolUse` không có gì để bám vào. Đo được ngày
|
|
84
|
+
* 07/09 trên `hi-spec`: một lượt gõ tay sinh ra 152 dòng thiết kế đã commit mà sổ
|
|
85
|
+
* trắng trơn, và trên toàn máy khoảng một phần tư số lần gọi skill đi bằng đường này.
|
|
86
|
+
*/
|
|
87
|
+
export declare function skillOpenFromPrompt(projectPath: string, payload: unknown, now?: number, staleMs?: number): SkillOpenResult;
|
|
60
88
|
/** Đọc stdin với ngân sách thời gian rõ ràng — không bao giờ treo tiến trình hook. */
|
|
61
89
|
export declare function readStdin(timeoutMs?: number): Promise<string>;
|
|
62
90
|
/**
|
|
63
|
-
* Hook `Stop`: đo
|
|
91
|
+
* Hook `Stop`: đo phần việc của lượt vừa rồi, phát một span TĂNG DẦN, rồi chụp lại mốc.
|
|
92
|
+
*
|
|
93
|
+
* Điểm khác bản đầu: file chờ KHÔNG bị tiêu thụ. `Stop` nổ ở mọi lượt trả lời, còn một
|
|
94
|
+
* lần gọi skill trải nhiều lượt — tiêu thụ ở lượt đầu là bỏ trắng toàn bộ việc thật
|
|
95
|
+
* (đo được: 8 file của `grill-with-docs` ghi sau khi span đã đóng và không lượt nào
|
|
96
|
+
* phát thêm). Nên mỗi lượt gửi phần chênh của riêng nó vào ĐÚNG trace của chuỗi, rồi
|
|
97
|
+
* mốc được dời tới hiện tại.
|
|
98
|
+
*
|
|
99
|
+
* Lượt không sinh gì thì im (trừ lượt đầu, vẫn phát để có bằng chứng skill đã chạy):
|
|
100
|
+
* chuỗi sống tới hết phiên nên nếu lượt nào cũng phát thì trace đầy span rỗng.
|
|
64
101
|
*
|
|
65
|
-
*
|
|
66
|
-
* làm mốc — từ đó tới bây giờ là trọn cửa sổ của cả lượt. Không cần trộn nhiều ảnh:
|
|
67
|
-
* trộn vừa khó vừa không thêm thông tin nào.
|
|
102
|
+
* `final` (hook `SessionEnd`): gửi phần còn lại rồi ĐÓNG chuỗi, không chụp lại nữa.
|
|
68
103
|
*/
|
|
69
104
|
export declare function skillClose(projectPath: string, sessionKey: string | string[] | undefined, deps?: {
|
|
70
105
|
tracer?: Tracer;
|
|
71
106
|
claudeSessionId?: string;
|
|
72
|
-
|
|
107
|
+
final?: boolean;
|
|
108
|
+
now?: number;
|
|
109
|
+
}): Promise<'emitted' | 'no-pending' | 'skipped-in-workflow' | 'no-output'>;
|
|
73
110
|
//# sourceMappingURL=telemetry-skill.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry-skill.d.ts","sourceRoot":"","sources":["../../src/commands/telemetry-skill.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"telemetry-skill.d.ts","sourceRoot":"","sources":["../../src/commands/telemetry-skill.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAMrD;;;;;GAKG;AACH,eAAO,MAAM,eAAe,UAAmB,CAAC;AAEhD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAMrD;AA0BD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAG5D;AAkID;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAIrD;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,EAAE,CAOxD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAM/D;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAGtE;AAkBD,MAAM,MAAM,eAAe,GACvB,SAAS,GACT,kBAAkB,GAClB,0BAA0B,GAC1B,qBAAqB,GACrB,kBAAkB,CAAC;AA8CvB;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAwB/F;AAqGD;;GAEG;AACH,wBAAgB,SAAS,CACvB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,OAAO,EAChB,GAAG,GAAE,MAAmB,EACxB,OAAO,GAAE,MAAiB,GACzB,eAAe,CAWjB;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,OAAO,EAChB,GAAG,GAAE,MAAmB,EACxB,OAAO,GAAE,MAAiB,GACzB,eAAe,CAQjB;AAED,sFAAsF;AACtF,wBAAgB,SAAS,CAAC,SAAS,SAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAc3D;AA8CD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,UAAU,CAC9B,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,EACzC,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GACtF,OAAO,CAAC,SAAS,GAAG,YAAY,GAAG,qBAAqB,GAAG,WAAW,CAAC,CAqJzE"}
|