@covibes/zeroshot 4.0.0 → 4.1.0

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
@@ -1,3 +1,10 @@
1
+ # [4.1.0](https://github.com/covibes/zeroshot/compare/v4.0.0...v4.1.0) (2026-01-05)
2
+
3
+
4
+ ### Features
5
+
6
+ * **settings:** improve Docker config display with grouped format ([b743673](https://github.com/covibes/zeroshot/commit/b743673f32d101bb0b86c1b619d85e856a1378c4)), closes [#19](https://github.com/covibes/zeroshot/issues/19)
7
+
1
8
  # [4.0.0](https://github.com/covibes/zeroshot/compare/v3.1.0...v4.0.0) (2026-01-04)
2
9
 
3
10
 
package/README.md CHANGED
@@ -139,10 +139,12 @@ zeroshot purge # NUCLEAR: kill all + delete all
139
139
  <details>
140
140
  <summary><strong>FAQ</strong></summary>
141
141
 
142
- **Q: Why Claude-only?**
142
+ **Q: Why Claude-only (for now)?**
143
143
 
144
144
  Claude Code is the most capable agentic coding tool available. We wrap it directly - same tools, same reliability, no custom implementations to break.
145
145
 
146
+ Multi-model support (Codex CLI, Gemini CLI) is planned - see [#19](https://github.com/covibes/zeroshot/issues/19).
147
+
146
148
  **Q: Why do single-agent coding sessions get sloppy?**
147
149
 
148
150
  Three failure modes compound when one agent does everything in one session:
@@ -348,7 +350,8 @@ Full isolation in a fresh container. Your workspace stays untouched. Good for ri
348
350
  | Running multiple tasks in parallel | `--docker` |
349
351
  | Full automation, no review needed | `--ship` |
350
352
 
351
- ### Docker Credential Mounts
353
+ <details>
354
+ <summary><strong>Docker Credential Mounts</strong></summary>
352
355
 
353
356
  When using `--docker`, zeroshot mounts credential directories so Claude can access tools like AWS, Azure, kubectl.
354
357
 
@@ -394,6 +397,8 @@ zeroshot run 123 --docker --container-home /home/node
394
397
  zeroshot settings set dockerEnvPassthrough '["MY_API_KEY", "TF_VAR_*"]'
395
398
  ```
396
399
 
400
+ </details>
401
+
397
402
  ---
398
403
 
399
404
  ## More
package/cli/index.js CHANGED
@@ -46,6 +46,7 @@ const {
46
46
  coerceValue,
47
47
  DEFAULT_SETTINGS,
48
48
  } = require('../lib/settings');
49
+ const { MOUNT_PRESETS, resolveEnvs } = require('../lib/docker-config');
49
50
  const { requirePreflight } = require('../src/preflight');
50
51
  const { checkFirstRun } = require('./lib/first-run');
51
52
  const { checkForUpdates } = require('./lib/update-checker');
@@ -2763,19 +2764,112 @@ program
2763
2764
  // Settings management
2764
2765
  const settingsCmd = program.command('settings').description('Manage zeroshot settings');
2765
2766
 
2767
+ /**
2768
+ * Format settings list with grouped Docker configuration
2769
+ * Docker mounts shown as expanded table instead of raw JSON
2770
+ */
2771
+ function formatSettingsList(settings, showUsage = false) {
2772
+ const DOCKER_KEYS = ['dockerMounts', 'dockerEnvPassthrough', 'dockerContainerHome'];
2773
+
2774
+ console.log(chalk.bold('\nCrew Settings:\n'));
2775
+
2776
+ // Non-docker settings first
2777
+ for (const [key, value] of Object.entries(settings)) {
2778
+ if (DOCKER_KEYS.includes(key)) continue;
2779
+
2780
+ const isDefault = JSON.stringify(DEFAULT_SETTINGS[key]) === JSON.stringify(value);
2781
+ const label = isDefault ? chalk.dim(key) : chalk.cyan(key);
2782
+ const val = isDefault ? chalk.dim(String(value)) : chalk.white(String(value));
2783
+ console.log(` ${label.padEnd(30)} ${val}`);
2784
+ }
2785
+
2786
+ // Docker configuration section (collapsible/grouped)
2787
+ console.log('');
2788
+ console.log(chalk.bold(' Docker Configuration:'));
2789
+
2790
+ const containerHome = settings.dockerContainerHome || '/root';
2791
+ const mounts = settings.dockerMounts || [];
2792
+ const envPassthrough = settings.dockerEnvPassthrough || [];
2793
+
2794
+ // Count presets vs custom mounts
2795
+ const presets = mounts.filter((m) => typeof m === 'string');
2796
+ const customMounts = mounts.filter((m) => typeof m === 'object');
2797
+
2798
+ // Mounts header with count
2799
+ const mountLabel =
2800
+ customMounts.length > 0
2801
+ ? `Mounts (${presets.length} presets, ${customMounts.length} custom):`
2802
+ : `Mounts (${presets.length} presets):`;
2803
+ console.log(chalk.dim(` ${mountLabel}`));
2804
+
2805
+ // Display each mount as a formatted row
2806
+ for (const mount of mounts) {
2807
+ if (typeof mount === 'string') {
2808
+ const preset = MOUNT_PRESETS[mount];
2809
+ if (preset) {
2810
+ const container = preset.container.replace(/\$HOME/g, containerHome);
2811
+ const rwFlag = preset.readonly ? chalk.dim('ro') : chalk.green('rw');
2812
+ console.log(
2813
+ ` ${chalk.cyan(mount.padEnd(10))} ${chalk.dim(preset.host.padEnd(20))} → ${container.padEnd(24)} (${rwFlag})`
2814
+ );
2815
+ } else {
2816
+ console.log(` ${chalk.red(mount.padEnd(10))} ${chalk.red('(unknown preset)')}`);
2817
+ }
2818
+ } else {
2819
+ // Custom mount object
2820
+ const container = mount.container.replace(/\$HOME/g, containerHome);
2821
+ const rwFlag = mount.readonly !== false ? chalk.dim('ro') : chalk.green('rw');
2822
+ console.log(
2823
+ ` ${chalk.yellow('custom'.padEnd(10))} ${chalk.dim(mount.host.padEnd(20))} → ${container.padEnd(24)} (${rwFlag})`
2824
+ );
2825
+ }
2826
+ }
2827
+
2828
+ if (mounts.length === 0) {
2829
+ console.log(chalk.dim(' (none)'));
2830
+ }
2831
+
2832
+ // Environment variables (resolved from presets + explicit)
2833
+ const resolvedEnvs = resolveEnvs(mounts, envPassthrough);
2834
+ if (resolvedEnvs.length > 0) {
2835
+ console.log(chalk.dim(` Environment (${resolvedEnvs.length} vars):`));
2836
+ // Group by source for clarity
2837
+ const fromPresets = resolvedEnvs.filter((e) => !envPassthrough.includes(e));
2838
+ const explicit = envPassthrough;
2839
+
2840
+ if (fromPresets.length > 0) {
2841
+ console.log(` ${chalk.dim('From presets:')} ${fromPresets.join(', ')}`);
2842
+ }
2843
+ if (explicit.length > 0) {
2844
+ console.log(` ${chalk.cyan('Explicit:')} ${explicit.join(', ')}`);
2845
+ }
2846
+ } else {
2847
+ console.log(chalk.dim(' Environment: (none)'));
2848
+ }
2849
+
2850
+ // Container home
2851
+ const homeIsDefault = containerHome === '/root';
2852
+ const homeLabel = homeIsDefault ? chalk.dim('Container home:') : chalk.cyan('Container home:');
2853
+ const homeVal = homeIsDefault ? chalk.dim(containerHome) : chalk.white(containerHome);
2854
+ console.log(` ${homeLabel} ${homeVal}`);
2855
+
2856
+ console.log('');
2857
+
2858
+ if (showUsage) {
2859
+ console.log(chalk.dim('Usage:'));
2860
+ console.log(chalk.dim(' zeroshot settings set <key> <value>'));
2861
+ console.log(chalk.dim(' zeroshot settings get <key>'));
2862
+ console.log(chalk.dim(' zeroshot settings reset'));
2863
+ console.log('');
2864
+ }
2865
+ }
2866
+
2766
2867
  settingsCmd
2767
2868
  .command('list')
2768
2869
  .description('Show all settings')
2769
2870
  .action(() => {
2770
2871
  const settings = loadSettings();
2771
- console.log(chalk.bold('\nCrew Settings:\n'));
2772
- for (const [key, value] of Object.entries(settings)) {
2773
- const isDefault = DEFAULT_SETTINGS[key] === value;
2774
- const label = isDefault ? chalk.dim(key) : chalk.cyan(key);
2775
- const val = isDefault ? chalk.dim(String(value)) : chalk.white(String(value));
2776
- console.log(` ${label.padEnd(30)} ${val}`);
2777
- }
2778
- console.log('');
2872
+ formatSettingsList(settings, false);
2779
2873
  });
2780
2874
 
2781
2875
  settingsCmd
@@ -2855,21 +2949,8 @@ settingsCmd
2855
2949
 
2856
2950
  // Add alias for settings list (just `zeroshot settings`)
2857
2951
  settingsCmd.action(() => {
2858
- // Default action when no subcommand - show list
2859
2952
  const settings = loadSettings();
2860
- console.log(chalk.bold('\nCrew Settings:\n'));
2861
- for (const [key, value] of Object.entries(settings)) {
2862
- const isDefault = DEFAULT_SETTINGS[key] === value;
2863
- const label = isDefault ? chalk.dim(key) : chalk.cyan(key);
2864
- const val = isDefault ? chalk.dim(String(value)) : chalk.white(String(value));
2865
- console.log(` ${label.padEnd(30)} ${val}`);
2866
- }
2867
- console.log('');
2868
- console.log(chalk.dim('Usage:'));
2869
- console.log(chalk.dim(' zeroshot settings set <key> <value>'));
2870
- console.log(chalk.dim(' zeroshot settings get <key>'));
2871
- console.log(chalk.dim(' zeroshot settings reset'));
2872
- console.log('');
2953
+ formatSettingsList(settings, true);
2873
2954
  });
2874
2955
 
2875
2956
  // Update command
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@covibes/zeroshot",
3
- "version": "4.0.0",
3
+ "version": "4.1.0",
4
4
  "description": "Multi-agent orchestration engine for Claude - cluster coordinator and CLI",
5
5
  "main": "src/orchestrator.js",
6
6
  "bin": {