mixdog 0.7.7 → 0.7.8

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/CHANGELOG.md CHANGED
@@ -2,6 +2,17 @@
2
2
 
3
3
  Notable changes are tracked per release, starting at 0.7.1.
4
4
 
5
+ ## 0.7.8 — 2026-06-18
6
+
7
+ - Add `mixdog install --demo`: runs the real setup-wizard UI (menus,
8
+ checkboxes, progress) in an isolated temp sandbox that is auto-cleaned, so
9
+ you can try the install experience without writing anything to your real
10
+ config.
11
+ - Honor `CLAUDE_CONFIG_DIR` in the first-install seed helpers
12
+ (`disable-claude-builtins`, user-data backups) instead of hardcoding
13
+ `~/.claude` — fixes a latent path bug for anyone using `CLAUDE_CONFIG_DIR`
14
+ and makes the demo sandbox fully isolated.
15
+
5
16
  ## 0.7.7 — 2026-06-18
6
17
 
7
18
  - Add in-app OAuth sign-in for the Codex (`openai-oauth`) and Claude
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mixdog",
3
- "version": "0.7.7",
3
+ "version": "0.7.8",
4
4
  "description": "Claude Code all-in-one bridge plugin: role-based bridge workers, continuous memory, and syntax-aware code editing.",
5
5
  "author": "mixdog contributors <dev@tribgames.com>",
6
6
  "license": "MIT",
package/setup/install.mjs CHANGED
@@ -19,9 +19,11 @@ import {
19
19
  existsSync,
20
20
  mkdirSync,
21
21
  copyFileSync,
22
+ mkdtempSync,
23
+ rmSync,
22
24
  } from 'node:fs';
23
25
  import { join, dirname } from 'node:path';
24
- import { homedir } from 'node:os';
26
+ import { homedir, tmpdir } from 'node:os';
25
27
  import { realpathSync } from 'node:fs';
26
28
  import { fileURLToPath } from 'node:url';
27
29
  import { createInterface } from 'node:readline';
@@ -213,7 +215,51 @@ function logDryRunWizard() {
213
215
  }
214
216
  }
215
217
 
218
+ async function runInstallDemo() {
219
+ const tmpRoot = mkdtempSync(join(tmpdir(), 'mixdog-demo-'));
220
+ const configDir = join(tmpRoot, 'config');
221
+ const dataDir = join(tmpRoot, 'data');
222
+ process.env.CLAUDE_CONFIG_DIR = configDir;
223
+ process.env.CLAUDE_PLUGIN_DATA = dataDir;
224
+ mkdirSync(configDir, { recursive: true });
225
+ mkdirSync(dataDir, { recursive: true });
226
+
227
+ process.on('exit', () => {
228
+ try {
229
+ rmSync(tmpRoot, { recursive: true, force: true });
230
+ } catch {}
231
+ });
232
+
233
+ console.log('\n🎬 mixdog demo — real wizard UI, nothing saved (isolated temp, auto-cleaned).\n');
234
+
235
+ const claudePath = resolveClaudeExecutable();
236
+ if (claudePath) {
237
+ console.log(`[demo] Claude Code detected at ${claudePath}`);
238
+ } else {
239
+ console.log('[demo] Claude Code not detected');
240
+ }
241
+
242
+ console.log('[demo] skipping plugin registration');
243
+
244
+ const { runSetupWizard } = await import('./wizard.mjs');
245
+ await runSetupWizard();
246
+
247
+ console.log('[demo] skipping runtime dependency install');
248
+
249
+ console.log('\n✓ Demo complete — nothing was saved to your real config.');
250
+ try {
251
+ rmSync(tmpRoot, { recursive: true, force: true });
252
+ } catch {}
253
+ }
254
+
216
255
  export async function runInstall() {
256
+ const demo =
257
+ process.argv.includes('--demo') || process.env.MIXDOG_SETUP_DEMO === '1';
258
+ if (demo) {
259
+ await runInstallDemo();
260
+ return;
261
+ }
262
+
217
263
  const dryRun =
218
264
  process.argv.includes('--dry-run') || process.env.MIXDOG_SETUP_DRY_RUN === '1';
219
265
 
@@ -11,12 +11,15 @@ import { getBackupRoot } from './user-data-guard.mjs';
11
11
  // behaviour can be restored. The createOnly gate in seed.mjs guarantees this
12
12
  // runs exactly once, so we never reapply on later boots.
13
13
 
14
- // Settings path is a parameter (defaulting to ~/.claude/settings.json) so it
15
- // can be redirected via MIXDOG_CLAUDE_SETTINGS_PATH for testing without a real
16
- // homedir.
14
+ function claudeConfigBaseDir() {
15
+ return process.env.CLAUDE_CONFIG_DIR || join(homedir(), '.claude');
16
+ }
17
+
18
+ // Settings path is a parameter (defaulting to <CLAUDE_CONFIG_DIR or ~/.claude>/settings.json)
19
+ // so it can be redirected via MIXDOG_CLAUDE_SETTINGS_PATH for testing without a real homedir.
17
20
  export function resolveClaudeSettingsPath() {
18
21
  return process.env.MIXDOG_CLAUDE_SETTINGS_PATH
19
- || join(homedir(), '.claude', 'settings.json');
22
+ || join(claudeConfigBaseDir(), 'settings.json');
20
23
  }
21
24
 
22
25
  function readJsonOrNull(filePath) {
@@ -12,9 +12,13 @@ import { dirname, join, resolve } from 'path';
12
12
  import { homedir } from 'os';
13
13
  import { createHash } from 'crypto';
14
14
 
15
+ function claudeConfigBaseDir() {
16
+ return process.env.CLAUDE_CONFIG_DIR || join(homedir(), '.claude');
17
+ }
18
+
15
19
  export function getBackupRoot() {
16
20
  return process.env.MIXDOG_USER_DATA_BACKUP_ROOT
17
- || join(homedir(), '.claude', 'backups', 'mixdog-user-data');
21
+ || join(claudeConfigBaseDir(), 'backups', 'mixdog-user-data');
18
22
  }
19
23
  const RECOVERY_NOTICE = 'RECOVERY-REQUIRED.txt';
20
24