@rozek/nanoclaw 0.0.4 → 0.0.5

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.
@@ -167,7 +167,7 @@ npx @rozek/nanoclaw --port 8080 --workspace ~/my-workspace --token mySecretToken
167
167
 
168
168
  ```
169
169
  Options:
170
- --host <address> Bind address for the web channel (default: 127.0.0.1)
170
+ --host <address> Bind address for the web channel (default: 127.0.0.1)
171
171
  --port <number> Port for the web channel (default: 3099)
172
172
  --workspace <path> Workspace directory (default: current directory)
173
173
  --key <api-key> Anthropic API key
@@ -307,7 +307,8 @@ The following files were added or changed relative to [qwibitai/nanoclaw](https:
307
307
 
308
308
  | File | What changed |
309
309
  |------|-------------|
310
- | `package.json` | Added `"bin": {"nanoclaw": "dist/cli.js"}` so the package works as an `npx` command |
310
+ | `package.json` | Added `"bin": {"nanoclaw": "dist/cli.js"}` so the package works as an `npx` command; `setup/` must be included in the TypeScript compilation (`tsconfig.json`) so `dist/setup/index.js` is available at runtime |
311
+ | `src/cli.ts` | Added `runFirstTimeSetup()`: detects first run by checking for `store/messages.db`; if missing, automatically runs the setup steps `environment`, `container`, `mounts --empty`, and `verify` before starting NanoClaw — makes `npx @rozek/nanoclaw` self-configuring on first launch |
311
312
  | `src/channels/index.ts` | Exports the new web channel |
312
313
  | `src/channels/registry.ts` | Adds `registerGroup` and `onCancelRequest` to `ChannelOpts` so channels can register groups and handle cancel requests |
313
314
  | `src/index.ts` | Integrates the web channel and session commands into the orchestrator's main loop; exports `main()` for use by `cli.ts`; adds `formatApiError()` to display Anthropic API errors (401/429/529/500) as user-facing chat messages; uses per-session chat IDs as Claude session keys; adds `statusCallback` to forward live tool-use events to the channel; adds `initWorkspace()` which runs at startup and creates all required workspace directories (`store/`, `groups/main/`, `groups/global/`, `data/ipc/`, `data/sessions/`, `groups/main/Tools/`, `groups/main/Skills/`, `groups/main/MCP-Servers/`, `groups/main/conversations/`) if they don't exist yet |
package/dist/cli.js CHANGED
@@ -8,9 +8,10 @@
8
8
  *
9
9
  * Parses arguments, validates them (fail-fast), then starts NanoClaw.
10
10
  */
11
- import { execSync } from 'child_process';
11
+ import { execSync, spawnSync } from 'child_process';
12
12
  import { existsSync } from 'fs';
13
- import { resolve } from 'path';
13
+ import { dirname, resolve } from 'path';
14
+ import { fileURLToPath } from 'url';
14
15
  import { parseArgs } from 'util';
15
16
  // ─── Help text ───────────────────────────────────────────────────────────────
16
17
  const HELP = `
@@ -67,6 +68,37 @@ function detectSandbox() {
67
68
  return 'apple';
68
69
  return null;
69
70
  }
71
+ // ─── First-time setup ────────────────────────────────────────────────────────
72
+ function runFirstTimeSetup(sandboxType) {
73
+ // setup/ scripts are run via tsx (they use .ts imports and are not compiled by tsc)
74
+ const distDir = dirname(fileURLToPath(import.meta.url)); // dist/
75
+ const setupIndex = resolve(distDir, '../setup/index.ts');
76
+ const tsxBin = resolve(distDir, '../node_modules/.bin/tsx');
77
+ const runner = existsSync(tsxBin) ? tsxBin : 'tsx';
78
+ if (!existsSync(setupIndex)) {
79
+ console.warn('Setup scripts not found — skipping first-time setup.');
80
+ return;
81
+ }
82
+ console.log('\n┌─────────────────────────────────────────────┐');
83
+ console.log('│ NanoClaw — First-Time Setup │');
84
+ console.log('└─────────────────────────────────────────────┘\n');
85
+ const step = (name, extraArgs = []) => {
86
+ const bar = '─'.repeat(Math.max(0, 38 - name.length));
87
+ console.log(`\n── ${name} ${bar}`);
88
+ const r = spawnSync(runner, [setupIndex, '--step', name, ...extraArgs], {
89
+ stdio: 'inherit',
90
+ cwd: process.cwd(),
91
+ });
92
+ if (r.status !== 0) {
93
+ console.warn(`Setup step "${name}" exited with code ${r.status}.`);
94
+ }
95
+ };
96
+ step('environment');
97
+ step('container', ['--runtime', sandboxType]);
98
+ step('mounts', ['--empty']);
99
+ step('verify');
100
+ console.log('\nSetup complete. Starting NanoClaw…\n');
101
+ }
70
102
  // ─── Main ────────────────────────────────────────────────────────────────────
71
103
  async function cli() {
72
104
  // --- Parse arguments -------------------------------------------------------
@@ -157,6 +189,10 @@ async function cli() {
157
189
  ' Requires macOS Sequoia 15 or later.');
158
190
  }
159
191
  }
192
+ // --- First-run detection ---------------------------------------------------
193
+ if (!existsSync(resolve(process.cwd(), 'store', 'messages.db'))) {
194
+ runFirstTimeSetup(sandboxType);
195
+ }
160
196
  // --- Apply settings to process.env so downstream modules pick them up ------
161
197
  // web.ts reads NANOCLAW_HOST / NANOCLAW_PORT / NANOCLAW_TOKEN;
162
198
  // credential-proxy reads ANTHROPIC_API_KEY.
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rozek/nanoclaw",
3
- "version": "0.0.4",
3
+ "version": "0.0.5",
4
4
  "description": "Personal Claude assistant. Lightweight, secure, customizable.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
package/src/cli.ts CHANGED
@@ -9,9 +9,10 @@
9
9
  * Parses arguments, validates them (fail-fast), then starts NanoClaw.
10
10
  */
11
11
 
12
- import { execSync } from 'child_process';
12
+ import { execSync, spawnSync } from 'child_process';
13
13
  import { existsSync } from 'fs';
14
- import { resolve } from 'path';
14
+ import { dirname, resolve } from 'path';
15
+ import { fileURLToPath } from 'url';
15
16
  import { parseArgs } from 'util';
16
17
 
17
18
  // ─── Help text ───────────────────────────────────────────────────────────────
@@ -72,6 +73,44 @@ function detectSandbox(): 'docker' | 'apple' | null {
72
73
  return null;
73
74
  }
74
75
 
76
+ // ─── First-time setup ────────────────────────────────────────────────────────
77
+
78
+ function runFirstTimeSetup(sandboxType: 'docker' | 'apple'): void {
79
+ // setup/ scripts are run via tsx (they use .ts imports and are not compiled by tsc)
80
+ const distDir = dirname(fileURLToPath(import.meta.url)); // dist/
81
+ const setupIndex = resolve(distDir, '../setup/index.ts');
82
+ const tsxBin = resolve(distDir, '../node_modules/.bin/tsx');
83
+ const runner = existsSync(tsxBin) ? tsxBin : 'tsx';
84
+
85
+ if (!existsSync(setupIndex)) {
86
+ console.warn('Setup scripts not found — skipping first-time setup.');
87
+ return;
88
+ }
89
+
90
+ console.log('\n┌─────────────────────────────────────────────┐');
91
+ console.log('│ NanoClaw — First-Time Setup │');
92
+ console.log('└─────────────────────────────────────────────┘\n');
93
+
94
+ const step = (name: string, extraArgs: string[] = []): void => {
95
+ const bar = '─'.repeat(Math.max(0, 38 - name.length));
96
+ console.log(`\n── ${name} ${bar}`);
97
+ const r = spawnSync(runner, [setupIndex, '--step', name, ...extraArgs], {
98
+ stdio: 'inherit',
99
+ cwd: process.cwd(),
100
+ });
101
+ if (r.status !== 0) {
102
+ console.warn(`Setup step "${name}" exited with code ${r.status}.`);
103
+ }
104
+ };
105
+
106
+ step('environment');
107
+ step('container', ['--runtime', sandboxType]);
108
+ step('mounts', ['--empty']);
109
+ step('verify');
110
+
111
+ console.log('\nSetup complete. Starting NanoClaw…\n');
112
+ }
113
+
75
114
  // ─── Main ────────────────────────────────────────────────────────────────────
76
115
 
77
116
  async function cli(): Promise<void> {
@@ -185,6 +224,11 @@ async function cli(): Promise<void> {
185
224
  }
186
225
  }
187
226
 
227
+ // --- First-run detection ---------------------------------------------------
228
+ if (!existsSync(resolve(process.cwd(), 'store', 'messages.db'))) {
229
+ runFirstTimeSetup(sandboxType);
230
+ }
231
+
188
232
  // --- Apply settings to process.env so downstream modules pick them up ------
189
233
  // web.ts reads NANOCLAW_HOST / NANOCLAW_PORT / NANOCLAW_TOKEN;
190
234
  // credential-proxy reads ANTHROPIC_API_KEY.
package/tsconfig.json CHANGED
@@ -15,6 +15,6 @@
15
15
  "declarationMap": true,
16
16
  "sourceMap": true
17
17
  },
18
- "include": ["src/**/*"],
19
- "exclude": ["node_modules", "dist"]
18
+ "exclude": ["node_modules", "dist", "setup/**/*.test.ts"],
19
+ "include": ["src/**/*"]
20
20
  }