@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 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,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * dsh-tui — 双态启动器(delegating launcher,0.9.1)。
3
+ * dsh-tui — 双态启动器(delegating launcher,0.9.2)。
4
4
  *
5
5
  * 同一个文件按“自己住在哪”决定扮演的角色:
6
6
  *
@@ -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 = "e1b902b0f95f4280a8e68d414ec7a4d25d6ce106";
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 = 'e1b902b0f95f4280a8e68d414ec7a4d25d6ce106';
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';
@@ -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":"AAMA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAKlD,OAAO,EAAE,UAAU,EAAE,CAAA;AAmCrB;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAEnF;AAED,0EAA0E;AAC1E,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAc3D;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAMrD;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;CACf;AAED,4DAA4D;AAC5D,MAAM,MAAM,eAAe,GACvB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3E;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAA;AAEvB,MAAM,WAAW,eAAe;IAC9B,8EAA8E;IAC9E,UAAU,EAAE,MAAM,CAAA;IAClB;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,gFAAgF;AAChF,wBAAgB,mBAAmB,IAAI,MAAM,GAAG,SAAS,CAiBxD;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,GAAE,SAAS,MAAM,EAAiB,GAAG,MAAM,GAAG,SAAS,CAahG;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAW5C;AAED,6EAA6E;AAC7E,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAIzE;AAED;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAG7D;AA4BD;;;;;;;;;;;;GAYG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,eAAe,CAAC,CAcvE;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAG5E;AA6DD,gFAAgF;AAChF,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAIrF;AAED;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEhE;AAED;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEhE;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAGzD;AAED,iEAAiE;AACjE,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,UAAU,EAAE,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAA;IAC3C,2EAA2E;IAC3E,OAAO,EAAE,MAAM,EAAE,CAAA;CAClB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,mBAAmB,CA+B9E;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,CA2C/C;AAED,kEAAkE;AAClE,MAAM,WAAW,gBAAgB;IAC/B,wEAAwE;IACxE,IAAI,EAAE,MAAM,CAAA;IACZ,gEAAgE;IAChE,WAAW,EAAE,MAAM,CAAA;IACnB,6DAA6D;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,SAAS,CAC7B,OAAO,EAAE,MAAM,EACf,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,gBAAgB,CAAC,CAsF3B;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,eAAe,CAAC,CAiB1B;AAED;;;;;;;;GAQG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA8ChE;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,MAAM,WAAW,iBAAiB;IAChC,uEAAuE;IACvE,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC5B;;;;OAIG;IACH,IAAI,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAA;CAC5B;AAED,wBAAsB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,MAAM,CAAC,CA8HpG"}
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/update.ts"],"names":[],"mappings":"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"}
@@ -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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deepseek-harness-tui/dsh-tui",
3
- "version": "0.9.1",
3
+ "version": "0.9.2",
4
4
  "description": "Claude Code style interactive TUI front door for DeepSeek Harness agents, built on the ported Ink core.",
5
5
  "license": "MIT",
6
6
  "repository": {