@deepseek-harness-tui/dsh-tui 0.9.1 → 0.9.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 +10 -0
- package/bin/dsh-tui.js +1 -1
- package/lib/types/plugin-spec/registry.d.ts +1 -1
- package/lib/types/plugin-spec/registry.js +1 -1
- package/lib/types/update.d.ts +20 -0
- package/lib/types/update.d.ts.map +1 -1
- package/lib/types/update.js +114 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -105,6 +105,16 @@ sh install.sh
|
|
|
105
105
|
# 之后 dsh-tui 与 dsh --profile dsh-tui 等价
|
|
106
106
|
```
|
|
107
107
|
|
|
108
|
+
> **新用户提示**:若 `dsh plugin` 安装时报 `ERR_PNPM_IGNORED_BUILDS`(pnpm ≥11 默认阻止带安装脚本的依赖,如 `@google/genai`、`protobufjs`——这些脚本运行时不需要,忽略即可),在 profile 的 `pnpm-workspace.yaml` 里加入:
|
|
109
|
+
>
|
|
110
|
+
> ```yaml
|
|
111
|
+
> allowBuilds:
|
|
112
|
+
> '@google/genai': false
|
|
113
|
+
> protobufjs: false
|
|
114
|
+
> ```
|
|
115
|
+
>
|
|
116
|
+
> `/update` 与 `dsh-tui update` 会自动写入这份配置,无需手工处理。
|
|
117
|
+
|
|
108
118
|
更面向零基础的安装流程、profile 叠加机制、源码构建与常见问题见[安装与快速开始](docs/getting-started.md)。
|
|
109
119
|
|
|
110
120
|
|
package/bin/dsh-tui.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/** Load and verify the pinned dsh-TUI admission profile. */
|
|
2
2
|
import type { ContractRegistry, PermissionRegistry, RegistryEntry } from './types.js';
|
|
3
3
|
export declare const DSH_STD_REVISION = "614dfa1ac168db79fcf4577cf0ebb34e2e3b944b";
|
|
4
|
-
export declare const ECOSYSTEM_SPEC_REVISION = "
|
|
4
|
+
export declare const ECOSYSTEM_SPEC_REVISION = "2d0236f7d4579814d9d177a58d03ebd168025960";
|
|
5
5
|
export interface SpecData {
|
|
6
6
|
dir: string;
|
|
7
7
|
registry: ContractRegistry;
|
|
@@ -5,7 +5,7 @@ import { dirname, join } from 'node:path';
|
|
|
5
5
|
import { fileURLToPath } from 'node:url';
|
|
6
6
|
import { createAdmissionCatalog } from './tui-extension.js';
|
|
7
7
|
export const DSH_STD_REVISION = '614dfa1ac168db79fcf4577cf0ebb34e2e3b944b';
|
|
8
|
-
export const ECOSYSTEM_SPEC_REVISION = '
|
|
8
|
+
export const ECOSYSTEM_SPEC_REVISION = '2d0236f7d4579814d9d177a58d03ebd168025960';
|
|
9
9
|
const REGISTRY_FILE = join('registry', 'registry-0.15.json');
|
|
10
10
|
const EXPECTED_PROFILE_VERSION = 'tui-admission/0.15';
|
|
11
11
|
const EXPECTED_STD_REPOSITORY = 'https://github.com/Yan-Zero/dsh-std';
|
package/lib/types/update.d.ts
CHANGED
|
@@ -91,6 +91,26 @@ export declare function resolveTuiUpdateTarget(): Promise<TuiUpdateTarget>;
|
|
|
91
91
|
export declare function checkForTuiUpdate(): Promise<TuiUpdateInfo | undefined>;
|
|
92
92
|
/** Build the profile-manager command, preferring a preflight-pinned version. */
|
|
93
93
|
export declare function tuiUpdatePluginArgs(profile: string, targetVersion?: string): string[];
|
|
94
|
+
/** The profile's pnpm-workspace.yaml (`$DSH_HOME ?? ~/.dsh` layout). */
|
|
95
|
+
export declare function profileWorkspaceYamlPath(profile: string): string;
|
|
96
|
+
/** What ensureProfileAllowBuilds did to the profile workspace file. */
|
|
97
|
+
export interface AllowBuildsOutcome {
|
|
98
|
+
/** Keys already present before this run (left untouched). */
|
|
99
|
+
existing: string[];
|
|
100
|
+
/** Keys this run appended. */
|
|
101
|
+
added: string[];
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Make sure the profile's pnpm-workspace.yaml carries explicit `false`
|
|
105
|
+
* allowBuilds entries for the dsh-tui chain's postinstall-only deps, so a
|
|
106
|
+
* pnpm ≥11 update is not killed by ERR_PNPM_IGNORED_BUILDS. Best effort and
|
|
107
|
+
* idempotent: existing entries are never overwritten (an explicit user
|
|
108
|
+
* decision wins), a missing `allowBuilds:` block is appended, and a missing
|
|
109
|
+
* file is created. Returns undefined when the profile directory is absent or
|
|
110
|
+
* the file could not be updated — the caller still runs pnpm, whose own
|
|
111
|
+
* ERR_PNPM_IGNORED_BUILDS diagnostic stays the visible fallback.
|
|
112
|
+
*/
|
|
113
|
+
export declare function ensureProfileAllowBuilds(profile: string): AllowBuildsOutcome | undefined;
|
|
94
114
|
/**
|
|
95
115
|
* The pnpm Windows tmp-rename race signature (issue #225): pnpm swaps a
|
|
96
116
|
* package directory via a `<name>_tmp_<pid>` staging dir, and a file lock or
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/update.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/update.ts"],"names":[],"mappings":"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"}
|
package/lib/types/update.js
CHANGED
|
@@ -279,6 +279,111 @@ export function tuiUpdatePluginArgs(profile, targetVersion) {
|
|
|
279
279
|
? ['plugin', '--profile', profile, 'update', '--latest', PACKAGE_NAME]
|
|
280
280
|
: ['plugin', '--profile', profile, 'update', `${PACKAGE_NAME}@${targetVersion}`];
|
|
281
281
|
}
|
|
282
|
+
/**
|
|
283
|
+
* Postinstall-only transitive dependencies of the dsh-tui chain
|
|
284
|
+
* (dsh-auth → @earendil-works/pi-ai → @google/genai + protobufjs, plus the
|
|
285
|
+
* esbuild/koffi peers of that chain): pnpm ≥11 refuses to run their build
|
|
286
|
+
* scripts unless the workspace allowlists them, and a profile that never
|
|
287
|
+
* opted in fails the WHOLE install with ERR_PNPM_IGNORED_BUILDS. None of
|
|
288
|
+
* these scripts is needed at runtime (the repo root allowBuilds them all to
|
|
289
|
+
* `false`), so the update flow pre-seeds the profile's pnpm-workspace.yaml
|
|
290
|
+
* with explicit `false` entries — an explicit decision pnpm honors silently.
|
|
291
|
+
*/
|
|
292
|
+
const PROFILE_ALLOW_BUILDS = {
|
|
293
|
+
'@google/genai': false,
|
|
294
|
+
esbuild: false,
|
|
295
|
+
koffi: false,
|
|
296
|
+
protobufjs: false,
|
|
297
|
+
};
|
|
298
|
+
/** The profile's pnpm-workspace.yaml (`$DSH_HOME ?? ~/.dsh` layout). */
|
|
299
|
+
export function profileWorkspaceYamlPath(profile) {
|
|
300
|
+
const dshHome = process.env.DSH_HOME ?? join(homedir(), '.dsh');
|
|
301
|
+
return join(dshHome, 'profiles', profile, 'pnpm-workspace.yaml');
|
|
302
|
+
}
|
|
303
|
+
/** YAML key spelling for an allowBuilds entry (scoped names need quotes). */
|
|
304
|
+
function allowBuildsKeyLine(key) {
|
|
305
|
+
const needsQuotes = key.includes('@') || key.includes('/');
|
|
306
|
+
return ` ${needsQuotes ? `'${key}'` : key}: false`;
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Make sure the profile's pnpm-workspace.yaml carries explicit `false`
|
|
310
|
+
* allowBuilds entries for the dsh-tui chain's postinstall-only deps, so a
|
|
311
|
+
* pnpm ≥11 update is not killed by ERR_PNPM_IGNORED_BUILDS. Best effort and
|
|
312
|
+
* idempotent: existing entries are never overwritten (an explicit user
|
|
313
|
+
* decision wins), a missing `allowBuilds:` block is appended, and a missing
|
|
314
|
+
* file is created. Returns undefined when the profile directory is absent or
|
|
315
|
+
* the file could not be updated — the caller still runs pnpm, whose own
|
|
316
|
+
* ERR_PNPM_IGNORED_BUILDS diagnostic stays the visible fallback.
|
|
317
|
+
*/
|
|
318
|
+
export function ensureProfileAllowBuilds(profile) {
|
|
319
|
+
const yamlPath = profileWorkspaceYamlPath(profile);
|
|
320
|
+
try {
|
|
321
|
+
if (!existsSafe(dirname(yamlPath)))
|
|
322
|
+
return undefined;
|
|
323
|
+
let text = '';
|
|
324
|
+
try {
|
|
325
|
+
text = readFileSync(yamlPath, 'utf8');
|
|
326
|
+
}
|
|
327
|
+
catch {
|
|
328
|
+
// Missing file — start from an empty document; writeFileSync creates it.
|
|
329
|
+
}
|
|
330
|
+
const lines = text.split(/\r?\n/u);
|
|
331
|
+
let blockStart = -1;
|
|
332
|
+
for (let i = 0; i < lines.length; i += 1) {
|
|
333
|
+
const line = lines[i];
|
|
334
|
+
if (line !== '' && line === line.trimStart() && /^allowBuilds:/u.test(line)) {
|
|
335
|
+
blockStart = i;
|
|
336
|
+
break;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
const present = new Set();
|
|
340
|
+
if (blockStart !== -1) {
|
|
341
|
+
for (let i = blockStart + 1; i < lines.length; i += 1) {
|
|
342
|
+
const line = lines[i];
|
|
343
|
+
if (line === '' || line === line.trimStart())
|
|
344
|
+
break; // dedent = block ends
|
|
345
|
+
const keyMatch = /^\s+('?)(.+?)\1:\s/u.exec(line);
|
|
346
|
+
if (keyMatch !== null)
|
|
347
|
+
present.add(keyMatch[2]);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
const added = Object.keys(PROFILE_ALLOW_BUILDS).filter(key => !present.has(key));
|
|
351
|
+
if (added.length === 0)
|
|
352
|
+
return { existing: [...present], added };
|
|
353
|
+
const insert = added.map(allowBuildsKeyLine);
|
|
354
|
+
if (blockStart !== -1) {
|
|
355
|
+
// Append after the block's last existing entry (before the next
|
|
356
|
+
// top-level key), so existing entries keep their position.
|
|
357
|
+
let blockEnd = blockStart + 1;
|
|
358
|
+
for (let i = blockStart + 1; i < lines.length; i += 1) {
|
|
359
|
+
const line = lines[i];
|
|
360
|
+
if (line === '' || line === line.trimStart())
|
|
361
|
+
break;
|
|
362
|
+
blockEnd = i + 1;
|
|
363
|
+
}
|
|
364
|
+
lines.splice(blockEnd, 0, ...insert);
|
|
365
|
+
}
|
|
366
|
+
else {
|
|
367
|
+
if (lines.length > 0 && lines[lines.length - 1] !== '')
|
|
368
|
+
lines.push('');
|
|
369
|
+
lines.push('allowBuilds:', ...insert);
|
|
370
|
+
}
|
|
371
|
+
writeFileSync(yamlPath, `${lines.join('\n')}\n`);
|
|
372
|
+
return { existing: [...present], added };
|
|
373
|
+
}
|
|
374
|
+
catch {
|
|
375
|
+
return undefined;
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
function existsSafe(path) {
|
|
379
|
+
try {
|
|
380
|
+
statSync(path);
|
|
381
|
+
return true;
|
|
382
|
+
}
|
|
383
|
+
catch {
|
|
384
|
+
return false;
|
|
385
|
+
}
|
|
386
|
+
}
|
|
282
387
|
/**
|
|
283
388
|
* The pnpm Windows tmp-rename race signature (issue #225): pnpm swaps a
|
|
284
389
|
* package directory via a `<name>_tmp_<pid>` staging dir, and a file lock or
|
|
@@ -449,6 +554,15 @@ export async function updateTui(profile, targetVersion) {
|
|
|
449
554
|
const updatedFrom = installedTuiVersion() ?? '';
|
|
450
555
|
const dsh = process.platform === 'win32' ? 'dsh.cmd' : 'dsh';
|
|
451
556
|
const updateArgs = tuiUpdatePluginArgs(profile, targetVersion);
|
|
557
|
+
// pnpm ≥11 hard-fails installs whose dependency tree carries un-allowlisted
|
|
558
|
+
// build scripts (ERR_PNPM_IGNORED_BUILDS). The dsh-auth chain pulls in
|
|
559
|
+
// postinstall-only deps (@google/genai/protobufjs via pi-ai), so pre-seed
|
|
560
|
+
// the profile workspace with explicit `false` entries before pnpm runs.
|
|
561
|
+
const allowBuilds = ensureProfileAllowBuilds(profile);
|
|
562
|
+
if (allowBuilds !== undefined && allowBuilds.added.length > 0) {
|
|
563
|
+
process.stderr.write(`dsh-tui: pre-seeded profile pnpm allowBuilds (${allowBuilds.added.join(', ')}) — ` +
|
|
564
|
+
'postinstall-only deps are explicitly ignored\n');
|
|
565
|
+
}
|
|
452
566
|
let updateStderr = '';
|
|
453
567
|
const capture = (chunk) => { updateStderr += chunk; };
|
|
454
568
|
let updateCode = await runProcess(dsh, updateArgs, { shell: true, onStderr: capture });
|
package/package.json
CHANGED