@ran-sh/dsh-crew 2.2.2 → 2.2.3

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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-crew",
3
- "version": "2.2.2",
3
+ "version": "2.2.3",
4
4
  "description": "Dispatch subtasks to DeepSeek Harness (DSH) agents as native subagents with live progress",
5
5
  "author": {
6
6
  "name": "ZSeven-W"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ran-sh/dsh-crew",
3
- "version": "2.2.2",
3
+ "version": "2.2.3",
4
4
  "type": "module",
5
5
  "main": "./src/hub/entry.mjs",
6
6
  "bin": {
package/scripts/setup.mjs CHANGED
@@ -359,7 +359,10 @@ export async function setupUninstall({
359
359
  export async function setupStatus({ log = console.log, root = ROOT, home = homedir(), installer = realInstaller } = {}) {
360
360
  const st = installer.installStatus ? installer.installStatus({ home, root }) : realInstaller.installStatus({ home, root });
361
361
  const integrationLabel = (entry) => !entry?.installed ? 'not installed' : entry.ready === true ? 'installed' : 'needs repair';
362
- const claude = integrationLabel(st?.claude);
362
+ // A host without the Claude CLI has no install to repair: the settings are
363
+ // registered best-effort and the CLI step that creates the plugin snapshot is
364
+ // skipped, so the footprint can never be ready there.
365
+ const claude = st?.claude?.host_detected === false ? 'not installed' : integrationLabel(st?.claude);
363
366
  const codex = integrationLabel(st?.codex);
364
367
  const zcode = integrationLabel(st?.zcode);
365
368
  const startupState = installer.windowsStartupStatus
@@ -497,7 +497,7 @@ export function writeGlobalConfig(patch) {
497
497
  }
498
498
 
499
499
  /** What is currently installed where — drives the settings-page buttons. */
500
- export function installStatus({ home = homedir(), root = ROOT, env = process.env } = {}) {
500
+ export function installStatus({ home = homedir(), root = ROOT, env = process.env, claudeDetected = undefined } = {}) {
501
501
  // Host integrations are installed from the profile's loader link, not from the
502
502
  // release directory, so an upgrade re-points one link instead of rewriting four
503
503
  // host configurations. Readiness has to judge them against the path they were
@@ -549,9 +549,16 @@ export function installStatus({ home = homedir(), root = ROOT, env = process.env
549
549
  || existsSync(join(codexRoot, 'agents', 'ds-flash.toml'))
550
550
  || existsSync(join(codexRoot, 'agents', 'ds-pro.toml'));
551
551
  const missing = Object.entries(components).filter(([, present]) => !present).map(([key]) => key);
552
+ // `installed` stays the footprint: the settings name our plugin, which is a
553
+ // deliberate distinction from `ready` (an enabled setting is not a callable
554
+ // plugin). `host_detected` records the other half a renderer needs — a machine
555
+ // with no Claude Code has nothing installed and nothing to repair, even though
556
+ // the best-effort settings are there.
557
+ const claudeHostDetected = claudeDetected === undefined ? resolveClaudeCommand() !== null : claudeDetected === true;
552
558
  return {
553
559
  claude: {
554
560
  installed: claudeFootprint,
561
+ host_detected: claudeHostDetected,
555
562
  ready: claudeMissing.length === 0,
556
563
  hud: hudWired,
557
564
  components: claudeComponents,
@@ -3284,7 +3284,13 @@ export function npxStatus({
3284
3284
  const integrationLabel = (entry) => !entry?.installed ? 'not installed' : entry.ready === true ? 'installed' : 'needs repair';
3285
3285
  const codex = integrationLabel(st?.codex);
3286
3286
  const zcode = integrationLabel(st?.zcode);
3287
- const claude = integrationLabel(st?.claude);
3287
+ // Claude Code installs best-effort: on a host without the CLI the settings are
3288
+ // registered and the CLI step — the only one that can create the plugin snapshot
3289
+ // — is skipped, so such a machine carries a footprint that can never be ready.
3290
+ // Nothing there is repairable, and "needs repair" told operators to fix an
3291
+ // integration they never installed. A host whose CLI IS present with an
3292
+ // unfinished install still reads as needing repair.
3293
+ const claude = st?.claude?.host_detected === false ? 'not installed' : integrationLabel(st?.claude);
3288
3294
  const official = officialWebIntegrationStatus({ home, releaseDir: pointer?.path });
3289
3295
  const officialWeb = !official.legacy_present ? 'not present (native 3210 control plane)' : official.healthy ? 'legacy full bridge present (deprecated; manual cleanup available)' : 'legacy full bridge record present but unhealthy (deprecated)';
3290
3296
  const startupState = installer.windowsStartupStatus?.({ home, root: runningPackageRoot() });
@@ -36,7 +36,7 @@ export {
36
36
  // included in the identity contract.
37
37
  const RUNTIME_ID = randomUUID();
38
38
 
39
- export const RUNTIME_VERSION = '2.2.2';
39
+ export const RUNTIME_VERSION = '2.2.3';
40
40
  export const HUB_PROTOCOL_VERSION = 1;
41
41
 
42
42
  export const HUB_CAPABILITIES = Object.freeze([