@robbiesrobotics/alice-agents 1.2.9 → 1.3.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/README.md CHANGED
@@ -139,7 +139,7 @@ If you're already running NemoClaw, A.L.I.C.E. works out of the box — no extra
139
139
 
140
140
  - [OpenClaw](https://openclaw.ai) or [NemoClaw](https://nemoclaw.com) installed and configured
141
141
  - Node.js 18+
142
- - At least one AI provider configured in OpenClaw (Anthropic, OpenAI, Ollama, or any other supported provider)
142
+ - At least one model configured in OpenClaw or NemoClaw no specific API key required. A.L.I.C.E. uses whatever you already have set up.
143
143
 
144
144
  ## License
145
145
 
package/bin/.gitkeep ADDED
File without changes
@@ -1,10 +1,19 @@
1
1
  #!/usr/bin/env node
2
2
 
3
+ import { readFileSync } from 'node:fs';
4
+ import { createRequire } from 'node:module';
3
5
  import { runInstall, runUninstall } from '../lib/installer.mjs';
6
+ import { runDoctor } from '../lib/doctor.mjs';
4
7
 
5
8
  const args = process.argv.slice(2);
6
9
  const flags = new Set(args);
7
10
 
11
+ if (flags.has('--version') || flags.has('-v')) {
12
+ const pkg = JSON.parse(readFileSync(new URL('../package.json', import.meta.url)));
13
+ console.log(pkg.version);
14
+ process.exit(0);
15
+ }
16
+
8
17
  if (flags.has('--help') || flags.has('-h')) {
9
18
  console.log(`
10
19
  alice-agents — A.L.I.C.E. Agent Framework Installer
@@ -12,17 +21,33 @@ if (flags.has('--help') || flags.has('-h')) {
12
21
  Usage:
13
22
  npx @robbiesrobotics/alice-agents Interactive install
14
23
  npx @robbiesrobotics/alice-agents --yes Non-interactive install with defaults
24
+ npx @robbiesrobotics/alice-agents --update Non-interactive upgrade to latest agents
15
25
  npx @robbiesrobotics/alice-agents --uninstall Remove A.L.I.C.E. agents from config
26
+ npx @robbiesrobotics/alice-agents --doctor Run diagnostics on your A.L.I.C.E. install
27
+ npx @robbiesrobotics/alice-agents --version Show version
16
28
  npx @robbiesrobotics/alice-agents --help Show this help
17
29
 
18
30
  Options:
19
31
  --yes Skip prompts, use defaults (Sonnet, Starter tier)
32
+ --update Non-interactive upgrade (alias for --yes with upgrade mode)
20
33
  --uninstall Remove A.L.I.C.E. agents (preserves non-ALICE agents)
34
+ --doctor Run diagnostics and check install health
35
+ --version Print package version
21
36
  `);
22
37
  process.exit(0);
23
38
  }
24
39
 
25
- if (flags.has('--uninstall')) {
40
+ if (flags.has('--doctor')) {
41
+ runDoctor().then((ok) => process.exit(ok ? 0 : 1)).catch((err) => {
42
+ console.error(' ❌ Doctor failed:', err.message);
43
+ process.exit(1);
44
+ });
45
+ } else if (flags.has('--update')) {
46
+ runInstall({ yes: true, modeOverride: 'upgrade' }).catch((err) => {
47
+ console.error(' ❌ Update failed:', err.message);
48
+ process.exit(1);
49
+ });
50
+ } else if (flags.has('--uninstall')) {
26
51
  runUninstall({ yes: flags.has('--yes') }).catch((err) => {
27
52
  console.error(' ❌ Uninstall failed:', err.message);
28
53
  process.exit(1);
package/lib/.gitkeep ADDED
File without changes
package/lib/doctor.mjs ADDED
@@ -0,0 +1,169 @@
1
+ import { readFileSync, existsSync } from 'node:fs';
2
+ import { join, dirname } from 'node:path';
3
+ import { homedir } from 'node:os';
4
+ import { execSync } from 'node:child_process';
5
+ import { fileURLToPath } from 'node:url';
6
+
7
+ const __dirname = dirname(fileURLToPath(import.meta.url));
8
+ const HOME = homedir();
9
+ const OPENCLAW_DIR = join(HOME, '.openclaw');
10
+
11
+ const STARTER_AGENTS = [
12
+ 'olivia', 'dylan', 'selena', 'devon', 'quinn',
13
+ 'felix', 'daphne', 'rowan', 'darius', 'sophie',
14
+ ];
15
+
16
+ function check(label, ok, hint) {
17
+ const icon = ok ? '✓' : '✗';
18
+ console.log(` ${icon} ${label}`);
19
+ if (!ok && hint) console.log(` → ${hint}`);
20
+ return ok;
21
+ }
22
+
23
+ function getRuntime() {
24
+ try {
25
+ const v = execSync('nemoclaw --version', { stdio: 'pipe', encoding: 'utf8' }).trim();
26
+ return { name: 'NemoClaw', ok: true, version: v };
27
+ } catch {}
28
+ try {
29
+ const v = execSync('openclaw --version', { stdio: 'pipe', encoding: 'utf8' }).trim();
30
+ return { name: 'OpenClaw', ok: true, version: v };
31
+ } catch {}
32
+ return { name: 'openclaw/nemoclaw', ok: false, version: null };
33
+ }
34
+
35
+ function loadConfig() {
36
+ const configPath = join(OPENCLAW_DIR, 'openclaw.json');
37
+ if (!existsSync(configPath)) return null;
38
+ try {
39
+ return JSON.parse(readFileSync(configPath, 'utf8'));
40
+ } catch {
41
+ return 'invalid';
42
+ }
43
+ }
44
+
45
+ export async function runDoctor() {
46
+ console.log('\n 🩺 A.L.I.C.E. Doctor — Diagnostic Report\n');
47
+ let allOk = true;
48
+
49
+ // 1. Runtime check
50
+ const runtime = getRuntime();
51
+ const runtimeOk = check(
52
+ runtime.ok
53
+ ? `${runtime.name} installed (${runtime.version})`
54
+ : `${runtime.name} not found`,
55
+ runtime.ok,
56
+ 'Install OpenClaw: npm install -g openclaw'
57
+ );
58
+ allOk = allOk && runtimeOk;
59
+
60
+ // 2. Config exists and valid JSON
61
+ const configPath = join(OPENCLAW_DIR, 'openclaw.json');
62
+ const configExists = existsSync(configPath);
63
+ check('openclaw.json exists', configExists, 'Run: openclaw configure');
64
+
65
+ if (!configExists) {
66
+ allOk = false;
67
+ console.log('\n ⚠️ Cannot continue checks — openclaw.json missing.\n');
68
+ return false;
69
+ }
70
+
71
+ const config = loadConfig();
72
+ const configValid = config !== null && config !== 'invalid';
73
+ check(
74
+ 'openclaw.json is valid JSON',
75
+ configValid,
76
+ `Fix JSON syntax in ${configPath}`
77
+ );
78
+ if (!configValid) {
79
+ allOk = false;
80
+ console.log('\n ⚠️ Cannot continue checks — config is invalid JSON.\n');
81
+ return false;
82
+ }
83
+
84
+ // 3. A.L.I.C.E. agents in config
85
+ const configAgents = Array.isArray(config.agents) ? config.agents : [];
86
+ const agentsInConfig = configAgents
87
+ .filter((a) => a && STARTER_AGENTS.includes(a.id))
88
+ .map((a) => a.id);
89
+
90
+ const agentsOk = agentsInConfig.length > 0;
91
+ check(
92
+ agentsOk
93
+ ? `A.L.I.C.E. agents in config: ${agentsInConfig.join(', ')}`
94
+ : 'No A.L.I.C.E. agents found in config',
95
+ agentsOk,
96
+ 'Run: npx @robbiesrobotics/alice-agents to install'
97
+ );
98
+ allOk = allOk && agentsOk;
99
+
100
+ // Check for missing agents from full starter set
101
+ if (agentsInConfig.length > 0 && agentsInConfig.length < STARTER_AGENTS.length) {
102
+ const missing = STARTER_AGENTS.filter((id) => !agentsInConfig.includes(id));
103
+ check(
104
+ `All starter agents present (missing: ${missing.join(', ')})`,
105
+ false,
106
+ 'Run: npx @robbiesrobotics/alice-agents --update'
107
+ );
108
+ allOk = false;
109
+ } else if (agentsInConfig.length === STARTER_AGENTS.length) {
110
+ check('All starter agents present', true);
111
+ }
112
+
113
+ // 4. Agent workspaces exist on disk
114
+ if (agentsInConfig.length > 0) {
115
+ let missingWorkspaces = [];
116
+ for (const id of agentsInConfig) {
117
+ const wsDir = join(OPENCLAW_DIR, `workspace-${id}`);
118
+ if (!existsSync(wsDir)) {
119
+ missingWorkspaces.push(id);
120
+ }
121
+ }
122
+ const workspacesOk = missingWorkspaces.length === 0;
123
+ check(
124
+ workspacesOk
125
+ ? `Agent workspaces exist (${agentsInConfig.length})`
126
+ : `Agent workspaces missing: ${missingWorkspaces.join(', ')}`,
127
+ workspacesOk,
128
+ 'Run: npx @robbiesrobotics/alice-agents --update to scaffold missing workspaces'
129
+ );
130
+ allOk = allOk && workspacesOk;
131
+ }
132
+
133
+ // 5. At least one model/provider configured
134
+ let modelOk = false;
135
+ let modelLabel = null;
136
+
137
+ if (config.default_model) {
138
+ modelOk = true;
139
+ modelLabel = config.default_model;
140
+ } else if (config.models && Object.keys(config.models).length > 0) {
141
+ modelOk = true;
142
+ modelLabel = Object.keys(config.models)[0];
143
+ } else if (config.providers && Object.keys(config.providers).length > 0) {
144
+ modelOk = true;
145
+ modelLabel = Object.keys(config.providers)[0];
146
+ } else if (config.llm && Object.keys(config.llm).length > 0) {
147
+ modelOk = true;
148
+ modelLabel = Object.keys(config.llm)[0];
149
+ }
150
+
151
+ check(
152
+ modelOk
153
+ ? `Model/provider configured: ${modelLabel}`
154
+ : 'No model/provider configured',
155
+ modelOk,
156
+ 'Run: openclaw configure to set up a model provider'
157
+ );
158
+ allOk = allOk && modelOk;
159
+
160
+ // Summary
161
+ console.log();
162
+ if (allOk) {
163
+ console.log(' ✅ A.L.I.C.E. is healthy!\n');
164
+ } else {
165
+ console.log(' ⚠️ Issues found — follow the hints above to fix them.\n');
166
+ }
167
+
168
+ return allOk;
169
+ }
package/lib/installer.mjs CHANGED
@@ -253,7 +253,9 @@ export async function runInstall(options = {}) {
253
253
 
254
254
  // 2. Install mode
255
255
  let mode;
256
- if (auto) {
256
+ if (options.modeOverride) {
257
+ mode = options.modeOverride;
258
+ } else if (auto) {
257
259
  const manifest = readManifest();
258
260
  mode = manifest ? 'upgrade' : 'fresh';
259
261
  } else {
@@ -12,7 +12,7 @@ const SKILLS_DIR = join(OPENCLAW_DIR, 'skills');
12
12
  const PRODUCT_FILES = ['SOUL.md', 'AGENTS.md', 'IDENTITY.md', 'TOOLS.md'];
13
13
 
14
14
  // User files — only created if missing
15
- const USER_FILES = ['PLAYBOOK.md', 'LEARNINGS.md', 'FEEDBACK.md', 'USER.md'];
15
+ const USER_FILES = ['PLAYBOOK.md', 'LEARNINGS.md', 'FEEDBACK.md', 'USER.md', 'MEMORY.md'];
16
16
 
17
17
  function renderTemplate(template, vars) {
18
18
  let result = template;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@robbiesrobotics/alice-agents",
3
- "version": "1.2.9",
3
+ "version": "1.3.0",
4
4
  "description": "A.L.I.C.E. — 28 AI agents for OpenClaw. One conversation, one team.",
5
5
  "bin": {
6
6
  "alice-agents": "bin/alice-install.mjs"
@@ -28,6 +28,10 @@
28
28
  "SELF-HEALING-SPEC.md",
29
29
  "README.md"
30
30
  ],
31
+ "scripts": {
32
+ "test": "node --test test/*.test.mjs",
33
+ "test:check": "node --check lib/*.mjs bin/*.mjs"
34
+ },
31
35
  "publishConfig": {
32
36
  "access": "public"
33
37
  }
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -0,0 +1,22 @@
1
+ # MEMORY.md — {{agentName}}
2
+
3
+ > Persistent memory for {{agentName}}, {{agentDomain}} specialist.
4
+ > This file is yours — add notes, context, and learnings that should persist across sessions.
5
+
6
+ ## Identity
7
+
8
+ - **Name:** {{agentName}}
9
+ - **Domain:** {{agentDomain}}
10
+ - **Team:** A.L.I.C.E.
11
+
12
+ ## Active Projects
13
+
14
+ <!-- Add ongoing projects and their current status here -->
15
+
16
+ ## Key Notes
17
+
18
+ <!-- Jot down anything important to remember across sessions -->
19
+
20
+ ## Decisions Made
21
+
22
+ <!-- Record significant decisions and their rationale -->
package/tools/.gitkeep ADDED
File without changes