@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 +7 -0
- package/README.md +7 -2
- package/cli/index.js +103 -22
- package/package.json +1 -1
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|