@trungtamcongnghedigital/vsaf 1.4.3 → 1.4.4-rc.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/README.md +6 -3
- package/package.json +1 -1
- package/packages/cli/dist/approval/secrets.d.ts +24 -0
- package/packages/cli/dist/approval/secrets.d.ts.map +1 -1
- package/packages/cli/dist/approval/secrets.js +14 -0
- package/packages/cli/dist/approval/secrets.js.map +1 -1
- package/packages/cli/dist/commands/install/hooks.d.ts +5 -3
- package/packages/cli/dist/commands/install/hooks.d.ts.map +1 -1
- package/packages/cli/dist/commands/install/hooks.js +5 -3
- package/packages/cli/dist/commands/install/hooks.js.map +1 -1
- package/packages/cli/dist/commands/install.d.ts +1 -1
- package/packages/cli/dist/commands/install.d.ts.map +1 -1
- package/packages/cli/dist/commands/install.js +204 -25
- package/packages/cli/dist/commands/install.js.map +1 -1
- package/packages/cli/dist/commands/run-cancel.d.ts +12 -0
- package/packages/cli/dist/commands/run-cancel.d.ts.map +1 -0
- package/packages/cli/dist/commands/run-cancel.js +34 -0
- package/packages/cli/dist/commands/run-cancel.js.map +1 -0
- package/packages/cli/dist/commands/skill.d.ts.map +1 -1
- package/packages/cli/dist/commands/skill.js +12 -3
- package/packages/cli/dist/commands/skill.js.map +1 -1
- package/packages/cli/dist/commands/source/mcp-tools.d.ts +0 -10
- package/packages/cli/dist/commands/source/mcp-tools.d.ts.map +1 -1
- package/packages/cli/dist/commands/source/mcp-tools.js +0 -19
- package/packages/cli/dist/commands/source/mcp-tools.js.map +1 -1
- package/packages/cli/dist/commands/telemetry-skill.d.ts +25 -2
- package/packages/cli/dist/commands/telemetry-skill.d.ts.map +1 -1
- package/packages/cli/dist/commands/telemetry-skill.js +90 -9
- package/packages/cli/dist/commands/telemetry-skill.js.map +1 -1
- package/packages/cli/dist/gateway/commands.d.ts +83 -0
- package/packages/cli/dist/gateway/commands.d.ts.map +1 -0
- package/packages/cli/dist/gateway/commands.js +519 -0
- package/packages/cli/dist/gateway/commands.js.map +1 -0
- package/packages/cli/dist/gateway/key-info.d.ts +70 -0
- package/packages/cli/dist/gateway/key-info.d.ts.map +1 -0
- package/packages/cli/dist/gateway/key-info.js +150 -0
- package/packages/cli/dist/gateway/key-info.js.map +1 -0
- package/packages/cli/dist/gateway/local-settings.d.ts +63 -0
- package/packages/cli/dist/gateway/local-settings.d.ts.map +1 -0
- package/packages/cli/dist/gateway/local-settings.js +252 -0
- package/packages/cli/dist/gateway/local-settings.js.map +1 -0
- package/packages/cli/dist/gateway/project-dirs.d.ts +38 -0
- package/packages/cli/dist/gateway/project-dirs.d.ts.map +1 -0
- package/packages/cli/dist/gateway/project-dirs.js +108 -0
- package/packages/cli/dist/gateway/project-dirs.js.map +1 -0
- package/packages/cli/dist/index.js +233 -7
- package/packages/cli/dist/index.js.map +1 -1
- package/packages/cli/dist/mcp/server.d.ts +92 -9
- package/packages/cli/dist/mcp/server.d.ts.map +1 -1
- package/packages/cli/dist/mcp/server.js +238 -30
- package/packages/cli/dist/mcp/server.js.map +1 -1
- package/packages/cli/dist/telemetry/active-node.d.ts +46 -0
- package/packages/cli/dist/telemetry/active-node.d.ts.map +1 -1
- package/packages/cli/dist/telemetry/active-node.js +118 -43
- package/packages/cli/dist/telemetry/active-node.js.map +1 -1
- package/packages/cli/dist/telemetry/backfill.d.ts +26 -0
- package/packages/cli/dist/telemetry/backfill.d.ts.map +1 -0
- package/packages/cli/dist/telemetry/backfill.js +198 -0
- package/packages/cli/dist/telemetry/backfill.js.map +1 -0
- package/packages/cli/dist/telemetry/callbacks.d.ts +19 -0
- package/packages/cli/dist/telemetry/callbacks.d.ts.map +1 -1
- package/packages/cli/dist/telemetry/callbacks.js +41 -0
- package/packages/cli/dist/telemetry/callbacks.js.map +1 -1
- package/packages/cli/dist/telemetry/langfuse-scores.d.ts +3 -1
- package/packages/cli/dist/telemetry/langfuse-scores.d.ts.map +1 -1
- package/packages/cli/dist/telemetry/langfuse-scores.js +5 -2
- package/packages/cli/dist/telemetry/langfuse-scores.js.map +1 -1
- package/packages/cli/dist/telemetry/otel-sdk.d.ts +54 -2
- package/packages/cli/dist/telemetry/otel-sdk.d.ts.map +1 -1
- package/packages/cli/dist/telemetry/otel-sdk.js +100 -1
- package/packages/cli/dist/telemetry/otel-sdk.js.map +1 -1
- package/packages/cli/dist/telemetry/otel-tracer.d.ts +24 -1
- package/packages/cli/dist/telemetry/otel-tracer.d.ts.map +1 -1
- package/packages/cli/dist/telemetry/otel-tracer.js +129 -1
- package/packages/cli/dist/telemetry/otel-tracer.js.map +1 -1
- package/packages/cli/dist/telemetry/tracer.d.ts +35 -0
- package/packages/cli/dist/telemetry/tracer.d.ts.map +1 -1
- package/packages/cli/dist/telemetry/tracer.js.map +1 -1
- package/packages/cli/dist/telemetry/user.d.ts +17 -4
- package/packages/cli/dist/telemetry/user.d.ts.map +1 -1
- package/packages/cli/dist/telemetry/user.js +54 -7
- package/packages/cli/dist/telemetry/user.js.map +1 -1
- package/packages/core/dist/engine/dag-executor.d.ts +4 -1
- package/packages/core/dist/engine/dag-executor.d.ts.map +1 -1
- package/packages/core/dist/engine/dag-executor.js.map +1 -1
- package/packages/core/dist/store/run-store.d.ts +17 -1
- package/packages/core/dist/store/run-store.d.ts.map +1 -1
- package/packages/core/dist/store/run-store.js +42 -0
- package/packages/core/dist/store/run-store.js.map +1 -1
- package/packages/core/dist/store/types.d.ts +27 -2
- package/packages/core/dist/store/types.d.ts.map +1 -1
- package/scripts/probe/dem-chu-nhay-cam.sh +49 -0
- package/scripts/probe/do-lop-va.mjs +313 -0
- package/scripts/probe/ho-so/domains.json +21 -0
- package/scripts/probe/soi-chu-nhay-cam.sh +106 -0
- package/scripts/probe/soi-master-knowledge.sh +188 -0
- package/scripts/probe/ten-nguoi.vi-du.txt +18 -0
package/README.md
CHANGED
|
@@ -163,8 +163,11 @@ vsaf source list [--json] # List every declared source
|
|
|
163
163
|
vsaf source remove kho # Drop one
|
|
164
164
|
```
|
|
165
165
|
|
|
166
|
-
Declared in `~/.vsaf/sources.yaml`, a separate file next to `registry.yaml`.
|
|
167
|
-
|
|
166
|
+
Declared in `~/.vsaf/sources.yaml`, a separate file next to `registry.yaml`.
|
|
167
|
+
|
|
168
|
+
These CLI commands are unchanged: they print paths, for humans and scripts. Agents take a
|
|
169
|
+
different road — the read-only MCP tool `vsaf_knowledge_query` returns **content** with citation
|
|
170
|
+
labels and never a path. The two older path-returning tools were removed in this release.
|
|
168
171
|
|
|
169
172
|
Full guide (Vietnamese): [docs/huong-dan-nguon-tren-may.md](docs/huong-dan-nguon-tren-may.md).
|
|
170
173
|
|
|
@@ -701,7 +704,7 @@ Existing `telemetry.langfuse` configs (and `LANGFUSE_*` env vars) are **auto-map
|
|
|
701
704
|
|
|
702
705
|
### Privacy note
|
|
703
706
|
|
|
704
|
-
Traces carry `user.id` (from `VSAF_USER` → `git config user.name` → OS username), the run args (truncated at 4KB), and model names — all sent to whatever endpoint is configured, exactly as with the previous Langfuse SDK. Only point telemetry at infrastructure you trust.
|
|
707
|
+
Traces carry `user.id` (from the AI Gateway user name of the key saved by `vsaf virtual key setup` → the key alias saved the same way → `VSAF_USER` → `git config user.name` → OS username), the run args (truncated at 4KB), and model names — all sent to whatever endpoint is configured, exactly as with the previous Langfuse SDK. Only point telemetry at infrastructure you trust.
|
|
705
708
|
|
|
706
709
|
### Session grouping (MCP mode) — SessionStart hook
|
|
707
710
|
|
package/package.json
CHANGED
|
@@ -27,10 +27,27 @@ export interface ProxyCredentials {
|
|
|
27
27
|
base_url?: string;
|
|
28
28
|
auth_token?: string;
|
|
29
29
|
}
|
|
30
|
+
/** Phần AI Gateway của tệp bí mật. Ghi bởi `vsaf virtual key setup` sau khi gateway xác nhận key. */
|
|
31
|
+
export interface GatewayCredentials {
|
|
32
|
+
virtual_key?: string;
|
|
33
|
+
/**
|
|
34
|
+
* Tên key (key alias) gateway trả về cho `virtual_key` lúc cài. Không phải bí mật, nằm đây
|
|
35
|
+
* để đi cùng key: đổi key thì tên đổi theo. Dùng làm `user.id` trên trace để khớp với trace
|
|
36
|
+
* của gateway. Key không đọc được tên thì không có trường này.
|
|
37
|
+
*/
|
|
38
|
+
key_alias?: string;
|
|
39
|
+
/**
|
|
40
|
+
* Tên người dùng gateway trả về cho `virtual_key` lúc cài (trường `user_name` của
|
|
41
|
+
* `/key/info`), đúng tên gateway dùng trên Langfuse. Đứng trước `key_alias` khi đặt `user.id`
|
|
42
|
+
* cho trace. Gateway đời cũ không trả, khi đó không có trường này.
|
|
43
|
+
*/
|
|
44
|
+
user_name?: string;
|
|
45
|
+
}
|
|
30
46
|
/** Toàn bộ tệp bí mật theo máy. Một tệp cho mọi bí mật, không phải mỗi thứ một chỗ. */
|
|
31
47
|
export interface VsafCredentials {
|
|
32
48
|
telegram?: TelegramCredentials;
|
|
33
49
|
proxy?: ProxyCredentials;
|
|
50
|
+
gateway?: GatewayCredentials;
|
|
34
51
|
}
|
|
35
52
|
/**
|
|
36
53
|
* Thư mục nhà của vsaf trên máy này.
|
|
@@ -95,6 +112,13 @@ export declare function daBatCapTuThongTin(credentials: VsafCredentials, env?: N
|
|
|
95
112
|
* bị đọc nhầm thành bot token hỏng, xem phần phân loại lỗi.
|
|
96
113
|
*/
|
|
97
114
|
export declare function resolveProxyAuthToken(credentials: VsafCredentials, env?: NodeJS.ProcessEnv): ResolvedSecret | null;
|
|
115
|
+
/**
|
|
116
|
+
* Virtual key của AI Gateway: biến môi trường trước, tệp sau.
|
|
117
|
+
*
|
|
118
|
+
* Cùng thứ tự với hai bí mật trên và cùng lý do: máy dùng chung và máy chạy tự động truyền
|
|
119
|
+
* key qua biến môi trường, máy cá nhân ghi tệp một lần lúc chạy lệnh cài key.
|
|
120
|
+
*/
|
|
121
|
+
export declare function resolveGatewayKey(credentials: VsafCredentials, env?: NodeJS.ProcessEnv): ResolvedSecret | null;
|
|
98
122
|
/**
|
|
99
123
|
* Xoá dấu vết bot token khỏi một đường dẫn.
|
|
100
124
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"secrets.d.ts","sourceRoot":"","sources":["../../src/approval/secrets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAMH,uFAAuF;AACvF,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,sCAAsC;AACtC,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,uFAAuF;AACvF,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IAC/B,KAAK,CAAC,EAAE,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"secrets.d.ts","sourceRoot":"","sources":["../../src/approval/secrets.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,6 +26,7 @@ exports.writeCredentials = writeCredentials;
|
|
|
26
26
|
exports.resolveBotToken = resolveBotToken;
|
|
27
27
|
exports.daBatCapTuThongTin = daBatCapTuThongTin;
|
|
28
28
|
exports.resolveProxyAuthToken = resolveProxyAuthToken;
|
|
29
|
+
exports.resolveGatewayKey = resolveGatewayKey;
|
|
29
30
|
exports.maskTokenInUrl = maskTokenInUrl;
|
|
30
31
|
exports.redactSecrets = redactSecrets;
|
|
31
32
|
exports.validateProxyAuthToken = validateProxyAuthToken;
|
|
@@ -155,6 +156,19 @@ function resolveProxyAuthToken(credentials, env = process.env) {
|
|
|
155
156
|
const fromFile = nonEmpty(credentials.proxy?.auth_token);
|
|
156
157
|
return fromFile ? { value: fromFile, source: 'file' } : null;
|
|
157
158
|
}
|
|
159
|
+
/**
|
|
160
|
+
* Virtual key của AI Gateway: biến môi trường trước, tệp sau.
|
|
161
|
+
*
|
|
162
|
+
* Cùng thứ tự với hai bí mật trên và cùng lý do: máy dùng chung và máy chạy tự động truyền
|
|
163
|
+
* key qua biến môi trường, máy cá nhân ghi tệp một lần lúc chạy lệnh cài key.
|
|
164
|
+
*/
|
|
165
|
+
function resolveGatewayKey(credentials, env = process.env) {
|
|
166
|
+
const fromEnv = nonEmpty(env.VSAF_GATEWAY_KEY);
|
|
167
|
+
if (fromEnv)
|
|
168
|
+
return { value: fromEnv, source: 'env' };
|
|
169
|
+
const fromFile = nonEmpty(credentials.gateway?.virtual_key);
|
|
170
|
+
return fromFile ? { value: fromFile, source: 'file' } : null;
|
|
171
|
+
}
|
|
158
172
|
/**
|
|
159
173
|
* Xoá dấu vết bot token khỏi một đường dẫn.
|
|
160
174
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../src/approval/secrets.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG;;;
|
|
1
|
+
{"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../src/approval/secrets.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,9 +17,11 @@ export declare function deployHooks(packDir: string, projectPath: string): strin
|
|
|
17
17
|
/**
|
|
18
18
|
* Fold a pack's event declarations into a repo's `.claude/settings.json`.
|
|
19
19
|
*
|
|
20
|
-
* The block
|
|
21
|
-
*
|
|
22
|
-
*
|
|
20
|
+
* The block lives in the committed settings file so every teammate who pulls the
|
|
21
|
+
* repo gets the pack's hooks without running anything. Claude Code adds up the
|
|
22
|
+
* hooks of `settings.json` and `settings.local.json` (checked on a real session,
|
|
23
|
+
* PLF-959), so a hook in the local file runs alongside these, not instead of them —
|
|
24
|
+
* which is also why the same hook must not be written to both files.
|
|
23
25
|
*
|
|
24
26
|
* Returns the settings path, or null when the pack declares no events.
|
|
25
27
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../../src/commands/install/hooks.ts"],"names":[],"mappings":"AA+DA;;;;;;GAMG;AACH,wBAAgB,WAAW,CACzB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EAAE,EAGrB,OAAO,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAoB,GAC9C,MAAM,GAAG,IAAI,CAwCf;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAwC1E;AAED
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../../src/commands/install/hooks.ts"],"names":[],"mappings":"AA+DA;;;;;;GAMG;AACH,wBAAgB,WAAW,CACzB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EAAE,EAGrB,OAAO,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAoB,GAC9C,MAAM,GAAG,IAAI,CAwCf;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAwC1E;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA6BlF;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CA2B3F"}
|
|
@@ -142,9 +142,11 @@ function deployHooks(packDir, projectPath) {
|
|
|
142
142
|
/**
|
|
143
143
|
* Fold a pack's event declarations into a repo's `.claude/settings.json`.
|
|
144
144
|
*
|
|
145
|
-
* The block
|
|
146
|
-
*
|
|
147
|
-
*
|
|
145
|
+
* The block lives in the committed settings file so every teammate who pulls the
|
|
146
|
+
* repo gets the pack's hooks without running anything. Claude Code adds up the
|
|
147
|
+
* hooks of `settings.json` and `settings.local.json` (checked on a real session,
|
|
148
|
+
* PLF-959), so a hook in the local file runs alongside these, not instead of them —
|
|
149
|
+
* which is also why the same hook must not be written to both files.
|
|
148
150
|
*
|
|
149
151
|
* Returns the settings path, or null when the pack declares no events.
|
|
150
152
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../../src/commands/install/hooks.ts"],"names":[],"mappings":";;AAsEA,kCA8CC;AASD,kCAwCC;
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../../src/commands/install/hooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -99,7 +99,7 @@ export interface InstallResult {
|
|
|
99
99
|
* không ai đặt chúng nữa — đường duy nhất còn lại là file kế hoạch mà `apply-pack` đọc,
|
|
100
100
|
* và hiện chưa có bên nào ghi file đó.
|
|
101
101
|
*
|
|
102
|
-
* Giữ lại chứ không xoá vì chúng là đầu vào của phần nối dây đa repo, và
|
|
102
|
+
* Giữ lại chứ không xoá vì chúng là đầu vào của phần nối dây đa repo, và chủ dự án chốt là
|
|
103
103
|
* phần đó **chuyển sang `install.sh` của flow, sửa sau** — chứ không phải bỏ. Xoá bây
|
|
104
104
|
* giờ là ném đi thứ sắp được gọi lại từ chỗ khác. Ai đọc tới đây mà `install.sh` đã có
|
|
105
105
|
* cách tự khai: nối nó vào đây, đừng dựng lại cờ ở engine.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAMA,OAAO,EAEU,KAAK,eAAe,EACpC,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
|
|
@@ -39,6 +39,7 @@ const delegate_js_1 = require("./install/delegate.js");
|
|
|
39
39
|
const precommit_js_1 = require("./install/precommit.js");
|
|
40
40
|
const init_js_1 = require("./init.js");
|
|
41
41
|
const ds_registry_js_1 = require("./install/ds-registry.js");
|
|
42
|
+
const co_moi_truong_js_1 = require("./install/co-moi-truong.js");
|
|
42
43
|
const bootstrap_repo_js_1 = require("./install/bootstrap-repo.js");
|
|
43
44
|
const spec_scaffold_js_1 = require("./install/spec-scaffold.js");
|
|
44
45
|
/**
|
|
@@ -468,11 +469,14 @@ function pullSkillsFromHub(source, wanted) {
|
|
|
468
469
|
+ `/${encodeURIComponent(s.slug)}/download`,
|
|
469
470
|
zipPath: (0, path_1.join)(dir, `${s.slug}.zip`),
|
|
470
471
|
}));
|
|
472
|
+
const versions = {};
|
|
471
473
|
for (const done of downloadAll(jobs, resolveToken(registry), dir)) {
|
|
472
474
|
if (done.error) {
|
|
473
475
|
missing.push({ name: done.name, reason: done.error });
|
|
474
476
|
continue;
|
|
475
477
|
}
|
|
478
|
+
if (done.version)
|
|
479
|
+
versions[done.name] = done.version;
|
|
476
480
|
try {
|
|
477
481
|
unzipInto((0, fs_1.readFileSync)(jobs.find(j => j.name === done.name).zipPath), (0, path_1.join)(dir, done.name));
|
|
478
482
|
pulled.push(done.name);
|
|
@@ -487,7 +491,7 @@ function pullSkillsFromHub(source, wanted) {
|
|
|
487
491
|
throw new HubUnavailableError(`Không tải được skill nào từ Skill Hub (${registry}).\n`
|
|
488
492
|
+ ` Lý do đầu tiên gặp phải: ${missing[0]?.reason ?? 'không rõ'}`);
|
|
489
493
|
}
|
|
490
|
-
return { dir, pulled, missing };
|
|
494
|
+
return { dir, pulled, missing, versions };
|
|
491
495
|
}
|
|
492
496
|
/**
|
|
493
497
|
* Tải cả loạt trong MỘT tiến trình Node con.
|
|
@@ -517,21 +521,60 @@ function downloadAll(jobs, token, dir) {
|
|
|
517
521
|
}
|
|
518
522
|
return JSON.parse((0, fs_1.readFileSync)(outFile, 'utf-8'));
|
|
519
523
|
}
|
|
524
|
+
/**
|
|
525
|
+
* Ai phụ trách bộ skill này, để thông báo lỗi chỉ được đích danh người liên hệ.
|
|
526
|
+
*
|
|
527
|
+
* Lấy từ lần cập nhật gần nhất trên bản sao repo mà engine vừa tải. Pack tạm do file cài
|
|
528
|
+
* của bộ tự dựng ra thì không phải bản sao git — khi đó lùi về `VSAF_FLOW_DIR`, là thư
|
|
529
|
+
* mục repo thật mà engine đã truyền cho file cài đó.
|
|
530
|
+
*/
|
|
531
|
+
function lienHeBoSkill(packDir) {
|
|
532
|
+
const doc = (noi, args) => {
|
|
533
|
+
try {
|
|
534
|
+
const ra = (0, child_process_1.execFileSync)('git', ['-C', noi, ...args], { stdio: 'pipe', encoding: 'utf-8' });
|
|
535
|
+
return ra.trim() || undefined;
|
|
536
|
+
}
|
|
537
|
+
catch {
|
|
538
|
+
return undefined;
|
|
539
|
+
}
|
|
540
|
+
};
|
|
541
|
+
for (const noi of [packDir, process.env.VSAF_FLOW_DIR].filter(Boolean)) {
|
|
542
|
+
const nguoi = doc(noi, ['log', '-1', '--format=%an <%ae>']);
|
|
543
|
+
if (!nguoi)
|
|
544
|
+
continue;
|
|
545
|
+
const url = doc(noi, ['remote', 'get-url', 'origin']);
|
|
546
|
+
return { repo: url?.replace(/\.git$/, '').split('/').filter(Boolean).pop(), nguoi };
|
|
547
|
+
}
|
|
548
|
+
return {};
|
|
549
|
+
}
|
|
520
550
|
/** Chạy trong tiến trình con: tải từng gói, lỗi của một skill không làm hỏng cả loạt. */
|
|
521
551
|
const DOWNLOAD_SCRIPT = `
|
|
522
552
|
import { readFileSync, writeFileSync } from 'fs';
|
|
523
553
|
const [, , jobsFile, outFile] = process.argv;
|
|
524
554
|
const token = process.env.VSAF_HUB_TOKEN;
|
|
555
|
+
const dau = token ? { Authorization: 'Bearer ' + token } : {};
|
|
525
556
|
const done = [];
|
|
557
|
+
|
|
558
|
+
// Phiên bản nằm sẵn trong tên tệp mà Hub đặt cho gói tải về, dạng <slug>-<ban>.zip.
|
|
559
|
+
// Đọc ở đây là MIỄN PHÍ và đúng hơn hỏi riêng: nó là phiên bản của chính gói vừa tải,
|
|
560
|
+
// không phải của một lượt hỏi khác có thể đã lệch.
|
|
561
|
+
function banTuTenTep(res, slug) {
|
|
562
|
+
const cd = res.headers.get('content-disposition') || '';
|
|
563
|
+
const m = cd.match(/filename\\*?=(?:UTF-8''|")?([^";]+)/i);
|
|
564
|
+
if (!m) return undefined;
|
|
565
|
+
let ten;
|
|
566
|
+
try { ten = decodeURIComponent(m[1]); } catch { ten = m[1]; }
|
|
567
|
+
const g = ten.replace(/\\.zip$/i, '').match(new RegExp('^' + slug + '-(.+)$'));
|
|
568
|
+
return g ? g[1] : undefined;
|
|
569
|
+
}
|
|
570
|
+
|
|
526
571
|
for (const job of JSON.parse(readFileSync(jobsFile, 'utf-8'))) {
|
|
527
572
|
try {
|
|
528
|
-
const res = await fetch(job.url, {
|
|
529
|
-
headers: token ? { Authorization: 'Bearer ' + token } : {},
|
|
530
|
-
redirect: 'follow',
|
|
531
|
-
});
|
|
573
|
+
const res = await fetch(job.url, { headers: dau, redirect: 'follow' });
|
|
532
574
|
if (!res.ok) { done.push({ name: job.name, error: job.slug + ' → HTTP ' + res.status }); continue; }
|
|
575
|
+
const version = banTuTenTep(res, job.slug);
|
|
533
576
|
writeFileSync(job.zipPath, Buffer.from(await res.arrayBuffer()));
|
|
534
|
-
done.push({ name: job.name });
|
|
577
|
+
done.push({ name: job.name, version });
|
|
535
578
|
} catch (error) {
|
|
536
579
|
done.push({ name: job.name, error: String((error && error.message) || error) });
|
|
537
580
|
}
|
|
@@ -611,25 +654,149 @@ function resolveSkillDir(packDir, pack, packInfo) {
|
|
|
611
654
|
].filter(s => !SKIP_SKILLS.includes(s.name));
|
|
612
655
|
if (wanted.length === 0)
|
|
613
656
|
return packDir;
|
|
657
|
+
const { repo, nguoi } = lienHeBoSkill(packDir);
|
|
658
|
+
const tenRepo = repo ? `repository ${repo} trên Bitbucket` : 'repository trên Bitbucket';
|
|
614
659
|
try {
|
|
615
|
-
const { dir, pulled, missing } = pullSkillsFromHub(source, wanted);
|
|
616
|
-
|
|
660
|
+
const { dir, pulled, missing, versions } = pullSkillsFromHub(source, wanted);
|
|
661
|
+
// Nói LẤY NHỮNG GÌ và BẢN NÀO, không chỉ lấy mấy cái. Con số trần không giúp đối
|
|
662
|
+
// chiếu được giữa hai máy, mà đó đúng là lúc người ta cần log này nhất.
|
|
663
|
+
console.log(`[vsaf] Lấy skill từ Skill Hub (${source.namespace}) — bản mới nhất: ${pulled.length}/${wanted.length} skill`);
|
|
664
|
+
const rong = Math.max(...pulled.map(n => n.length), 0);
|
|
665
|
+
for (const name of pulled) {
|
|
666
|
+
console.log(`[vsaf] ${name.padEnd(rong)} ${versions[name] ?? '(không rõ phiên bản)'}`);
|
|
667
|
+
}
|
|
617
668
|
for (const { name, reason } of missing) {
|
|
618
|
-
console.log(`[vsaf] ${name}: không lấy được từ Hub (${reason})
|
|
669
|
+
console.log(`[vsaf] ${name}: không lấy được từ Hub (${reason})`);
|
|
619
670
|
if ((0, fs_1.existsSync)((0, path_1.join)(packDir, name, 'SKILL.md'))) {
|
|
620
671
|
(0, fs_1.cpSync)((0, path_1.join)(packDir, name), (0, path_1.join)(dir, name), { recursive: true });
|
|
621
672
|
}
|
|
622
673
|
}
|
|
674
|
+
if (missing.length > 0) {
|
|
675
|
+
// Người cài không tự sửa được mấy lỗi này — skill chưa đẩy lên Hub, hay khai sai
|
|
676
|
+
// namespace, đều nằm ở phía đội làm bộ skill. Nói thẳng ra, kèm người để hỏi.
|
|
677
|
+
console.log('[vsaf] Đây là lỗi cấu hình của bộ skill, không phải của máy bạn.');
|
|
678
|
+
if (nguoi)
|
|
679
|
+
console.log(`[vsaf] Liên hệ: ${nguoi} (người cập nhật gần nhất trên ${tenRepo})`);
|
|
680
|
+
else
|
|
681
|
+
console.log(`[vsaf] Liên hệ đội phát triển bộ skill qua ${tenRepo}.`);
|
|
682
|
+
console.log(`[vsaf] Tạm thời dùng bản trong ${tenRepo}.`);
|
|
683
|
+
}
|
|
623
684
|
return dir;
|
|
624
685
|
}
|
|
625
686
|
catch (error) {
|
|
626
687
|
if (!(error instanceof HubUnavailableError))
|
|
627
688
|
throw error;
|
|
628
689
|
console.log(`[vsaf] ${error.message}`);
|
|
629
|
-
console.log(
|
|
690
|
+
console.log(`[vsaf] Dùng skill trong ${tenRepo} cho lượt cài này.`);
|
|
630
691
|
return packDir;
|
|
631
692
|
}
|
|
632
693
|
}
|
|
694
|
+
/**
|
|
695
|
+
* Hỏi một câu có/không ngay tại terminal, đồng bộ.
|
|
696
|
+
*
|
|
697
|
+
* Đọc `/dev/tty` trước rồi mới tới fd 0, cùng lý do như `waitForEnter`: một prompt trước
|
|
698
|
+
* đó trong cùng lượt chạy có thể đã đóng stdin, và khi ấy đọc fd 0 trả về rỗng ngay thay
|
|
699
|
+
* vì chờ — tức là hỏi xong tự trả lời hộ người dùng.
|
|
700
|
+
*/
|
|
701
|
+
function hoiCoKhong(cauHoi) {
|
|
702
|
+
process.stdout.write(cauHoi);
|
|
703
|
+
for (const nguon of ['/dev/tty', 0]) {
|
|
704
|
+
let fd;
|
|
705
|
+
try {
|
|
706
|
+
fd = typeof nguon === 'string' ? (0, fs_1.openSync)(nguon, 'r') : nguon;
|
|
707
|
+
const byte = Buffer.alloc(1);
|
|
708
|
+
let dong = '';
|
|
709
|
+
for (;;) {
|
|
710
|
+
if ((0, fs_1.readSync)(fd, byte, 0, 1, null) === 0)
|
|
711
|
+
break;
|
|
712
|
+
if (byte[0] === 0x0a) {
|
|
713
|
+
console.log('');
|
|
714
|
+
return /^y(es)?$/i.test(dong.trim());
|
|
715
|
+
}
|
|
716
|
+
dong += String.fromCharCode(byte[0]);
|
|
717
|
+
}
|
|
718
|
+
}
|
|
719
|
+
catch {
|
|
720
|
+
// Không có /dev/tty (Windows) hoặc không mở được: thử nguồn kế tiếp.
|
|
721
|
+
}
|
|
722
|
+
finally {
|
|
723
|
+
if (typeof nguon === 'string' && fd !== undefined)
|
|
724
|
+
(0, fs_1.closeSync)(fd);
|
|
725
|
+
}
|
|
726
|
+
}
|
|
727
|
+
console.log('');
|
|
728
|
+
return false;
|
|
729
|
+
}
|
|
730
|
+
/** Tên các skill bộ này sẽ đặt vào dự án, đúng tên sau khi cài. */
|
|
731
|
+
function tenSauKhiCai(pack, packInfo) {
|
|
732
|
+
return [
|
|
733
|
+
...packInfo.skillNames.filter(n => !SKIP_SKILLS.includes(n)).map(n => `${pack}-${n}`),
|
|
734
|
+
...packInfo.bundledNames.filter(n => !SKIP_SKILLS.includes(n)),
|
|
735
|
+
];
|
|
736
|
+
}
|
|
737
|
+
/** Gói danh sách tên thành từng dòng vừa bề ngang terminal. */
|
|
738
|
+
function chiaDong(ten, rong = 72) {
|
|
739
|
+
const dong = [];
|
|
740
|
+
let hien = '';
|
|
741
|
+
for (const t of ten) {
|
|
742
|
+
if (hien && hien.length + t.length + 2 > rong) {
|
|
743
|
+
dong.push(hien);
|
|
744
|
+
hien = '';
|
|
745
|
+
}
|
|
746
|
+
hien += (hien ? ', ' : '') + t;
|
|
747
|
+
}
|
|
748
|
+
if (hien)
|
|
749
|
+
dong.push(hien);
|
|
750
|
+
return dong;
|
|
751
|
+
}
|
|
752
|
+
/**
|
|
753
|
+
* Nói trước sẽ cài những gì, rồi mới xin phép.
|
|
754
|
+
*
|
|
755
|
+
* Chỉ gọi cho bộ khai `skillSource` — bộ chưa khai giữ nguyên hành vi cũ, không hỏi.
|
|
756
|
+
* Trả `false` thì KHÔNG cài skill nào cả: người dùng đã nói không, nên cài một phần là
|
|
757
|
+
* làm thứ họ không đồng ý.
|
|
758
|
+
*
|
|
759
|
+
* Workflow không nằm trong phạm vi câu hỏi này và không bị đụng tới — bản người dùng
|
|
760
|
+
* sửa tay vẫn được giữ như từ trước tới nay.
|
|
761
|
+
*/
|
|
762
|
+
function xinPhepCaiSkill(pack, packInfo, skillsDir, options) {
|
|
763
|
+
const ten = tenSauKhiCai(pack, packInfo);
|
|
764
|
+
if (ten.length === 0)
|
|
765
|
+
return true;
|
|
766
|
+
const daCo = ten.filter(n => (0, fs_1.existsSync)((0, path_1.join)(skillsDir, n, 'SKILL.md')));
|
|
767
|
+
console.log(`[vsaf] Lượt cài này sẽ đặt ${ten.length} skill vào ${skillsDir}:`);
|
|
768
|
+
for (const d of chiaDong(ten))
|
|
769
|
+
console.log(`[vsaf] ${d}`);
|
|
770
|
+
if (daCo.length === ten.length) {
|
|
771
|
+
// Lần cài lại: cả danh sách vừa in đều đã có sẵn. In lại y hệt lần nữa chỉ làm
|
|
772
|
+
// người đọc phải dò xem hai danh sách có khác nhau chỗ nào — mà không.
|
|
773
|
+
console.log('[vsaf] CẢ 20 skill trên đang có sẵn và sẽ bị GHI ĐÈ bằng bản trên Skill Hub.'
|
|
774
|
+
.replace('20', String(ten.length)));
|
|
775
|
+
console.log('[vsaf] Phần bạn tự sửa trong chúng sẽ mất.');
|
|
776
|
+
}
|
|
777
|
+
else if (daCo.length > 0) {
|
|
778
|
+
console.log(`[vsaf] ${daCo.length} skill trùng tên đang có sẽ bị GHI ĐÈ bằng bản trên Skill Hub:`);
|
|
779
|
+
for (const d of chiaDong(daCo))
|
|
780
|
+
console.log(`[vsaf] ${d}`);
|
|
781
|
+
console.log('[vsaf] Phần bạn tự sửa trong chúng sẽ mất.');
|
|
782
|
+
}
|
|
783
|
+
console.log('[vsaf] Workflow không bị đụng tới — bản đã sửa tay vẫn giữ nguyên.');
|
|
784
|
+
// Một đường đồng ý duy nhất. Từng có thêm `VSAF_FORCE_SKILLS` để diễn đạt "thay skill
|
|
785
|
+
// nhưng đừng đụng workflow", nhưng chính cơ chế hỏi đã làm đúng việc đó rồi: đồng ý là
|
|
786
|
+
// ghi đè skill, workflow nằm ngoài phạm vi câu hỏi. Hai biến cho cùng một kết quả chỉ
|
|
787
|
+
// làm người đọc phải đoán xem chúng khác nhau chỗ nào.
|
|
788
|
+
//
|
|
789
|
+
// Engine 1.4 cố ý không sở hữu cờ nào: file cài của bộ đọc cờ người dùng gõ rồi đặt
|
|
790
|
+
// biến môi trường. Đọc thẳng ở đây là đúng đường engine đã chọn.
|
|
791
|
+
if (options.force || (0, co_moi_truong_js_1.co)('VSAF_YES'))
|
|
792
|
+
return true;
|
|
793
|
+
if (!process.stdin.isTTY) {
|
|
794
|
+
console.log('[vsaf] Không có ai ở bàn phím để trả lời — KHÔNG cài skill lần này.');
|
|
795
|
+
console.log('[vsaf] Đặt VSAF_YES=1, hoặc gõ --yes, khi chạy tự động.');
|
|
796
|
+
return false;
|
|
797
|
+
}
|
|
798
|
+
return hoiCoKhong('[vsaf] Cài những skill trên? [y/N] ');
|
|
799
|
+
}
|
|
633
800
|
function deploySkills(packDir, packName, skills, targetDir, options) {
|
|
634
801
|
(0, fs_1.mkdirSync)(targetDir, { recursive: true });
|
|
635
802
|
const result = { deployed: [], skipped: [] };
|
|
@@ -1065,14 +1232,6 @@ function runInstall(input, projectPath, options = {}) {
|
|
|
1065
1232
|
packDir = flowSource.dir;
|
|
1066
1233
|
}
|
|
1067
1234
|
const packInfo = (0, skill_js_1.readPackInfoFrom)(packDir);
|
|
1068
|
-
// Chỗ lấy THƯ MỤC SKILL. Mặc định là kho mã vừa tải, y như trước. Bộ nào khai
|
|
1069
|
-
// `skillSource` thì kéo skill từ Skill Hub về một thư mục tạm rồi trỏ vào đó.
|
|
1070
|
-
//
|
|
1071
|
-
// Chỉ đổi mỗi biến này: `packDir` vẫn là kho mã và vẫn được dùng cho `_shared/`,
|
|
1072
|
-
// workflow, hook, rule — Hub chỉ chứa được skill, mấy thứ kia không có ở đó. Bước
|
|
1073
|
-
// chép (`deploySkills`) không biết gì về Hub, nên mọi luật phía sau — bỏ qua skill
|
|
1074
|
-
// đã có, sao lưu bản sửa tay, ghim băm, nhân bản sang IDE — giữ nguyên.
|
|
1075
|
-
const skillDir = resolveSkillDir(packDir, pack, packInfo);
|
|
1076
1235
|
// Trước khi ghi bất cứ thứ gì: flow đòi engine mới hơn thì dừng tại đây, để project
|
|
1077
1236
|
// không ở lại trạng thái cài dở mà không ai biết.
|
|
1078
1237
|
(0, engine_range_js_1.assertEngineSatisfies)(pack, packInfo.requiresEngine, (0, engine_version_js_1.resolveEngineVersion)());
|
|
@@ -1170,6 +1329,17 @@ function runInstall(input, projectPath, options = {}) {
|
|
|
1170
1329
|
// `sdlc` installs exactly as it did before the canonical/mirror split existed.
|
|
1171
1330
|
const canonical = (0, ide_mirror_js_1.resolveSkillTarget)(projectPath, packInfo.canonicalSkillsDir);
|
|
1172
1331
|
const skillsDir = options._skillsDir ?? canonical.target;
|
|
1332
|
+
// Xin phép TRƯỚC khi tải: nói rõ sắp đặt những skill nào và cái nào bị ghi đè. Hỏi
|
|
1333
|
+
// sau khi tải thì đã tốn mạng cho một câu trả lời có thể là "không".
|
|
1334
|
+
const dongYCaiSkill = packInfo.skillSource
|
|
1335
|
+
? xinPhepCaiSkill(pack, packInfo, skillsDir, options)
|
|
1336
|
+
: true;
|
|
1337
|
+
// Chỗ lấy THƯ MỤC SKILL. Mặc định là repo vừa tải, y như trước. Bộ nào khai
|
|
1338
|
+
// `skillSource` thì kéo skill từ Skill Hub về một thư mục tạm rồi trỏ vào đó.
|
|
1339
|
+
//
|
|
1340
|
+
// Chỉ đổi mỗi biến này: `packDir` vẫn là repo và vẫn được dùng cho `_shared/`,
|
|
1341
|
+
// workflow, hook, rule — Hub chỉ chứa được skill, mấy thứ kia không có ở đó.
|
|
1342
|
+
const skillDir = dongYCaiSkill ? resolveSkillDir(packDir, pack, packInfo) : packDir;
|
|
1173
1343
|
/**
|
|
1174
1344
|
* What this run has written so far.
|
|
1175
1345
|
*
|
|
@@ -1219,13 +1389,22 @@ function runInstall(input, projectPath, options = {}) {
|
|
|
1219
1389
|
let sharedDeployed = null;
|
|
1220
1390
|
let step = 0;
|
|
1221
1391
|
try {
|
|
1222
|
-
//
|
|
1223
|
-
|
|
1224
|
-
//
|
|
1225
|
-
if (
|
|
1226
|
-
const
|
|
1227
|
-
|
|
1228
|
-
deploy
|
|
1392
|
+
// Đã xin phép ở trên. Đồng ý thì ghi đè đúng các skill của bộ — đó là điều vừa
|
|
1393
|
+
// nói ra; từ chối thì không chép cái nào, vì cài một phần là làm thứ người dùng
|
|
1394
|
+
// không đồng ý. Bộ chưa khai `skillSource` đi nguyên đường cũ.
|
|
1395
|
+
if (dongYCaiSkill) {
|
|
1396
|
+
const ghiDe = packInfo.skillSource ? true : Boolean(options.force);
|
|
1397
|
+
// Step 1: Deploy skills (prefixed with pack name)
|
|
1398
|
+
deploy = deploySkills(skillDir, pack, packInfo.skillNames, skillsDir, { force: ghiDe });
|
|
1399
|
+
// Step 1b: Deploy bundled skills (no prefix — external dependencies)
|
|
1400
|
+
if (packInfo.bundledNames.length > 0) {
|
|
1401
|
+
const bundled = deploySkills(skillDir, pack, packInfo.bundledNames, skillsDir, { force: ghiDe, noPrefix: true });
|
|
1402
|
+
deploy.deployed.push(...bundled.deployed);
|
|
1403
|
+
deploy.skipped.push(...bundled.skipped);
|
|
1404
|
+
}
|
|
1405
|
+
}
|
|
1406
|
+
else {
|
|
1407
|
+
console.log(`[vsaf] Bỏ qua bước cài skill — ${skillsDir} giữ nguyên.`);
|
|
1229
1408
|
}
|
|
1230
1409
|
// Step 1c: Deploy _shared/ helper assets the pack's skills read at runtime
|
|
1231
1410
|
sharedDeployed = deploySharedAssets(packDir, pack, skillsDir);
|