velaclaw-dev 0.2.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.
Files changed (63) hide show
  1. package/.gitignore +14 -0
  2. package/ARCHITECTURE.md +143 -0
  3. package/README.dev.md +208 -0
  4. package/README.local-before-remote-sync.md +224 -0
  5. package/README.md +211 -0
  6. package/README.public.md +115 -0
  7. package/RELEASING.md +162 -0
  8. package/TESTING.md +195 -0
  9. package/dist/cli.js +213 -0
  10. package/dist/data.js +2988 -0
  11. package/dist/server.js +1020 -0
  12. package/dist/ui.js +1486 -0
  13. package/members/LAUNCH_CHECKLIST.md +13 -0
  14. package/members/README.md +17 -0
  15. package/members/member-template/README.md +9 -0
  16. package/members/member-template/private-docs/README.md +3 -0
  17. package/members/member-template/private-memory/README.md +3 -0
  18. package/members/member-template/private-skills/README.md +4 -0
  19. package/members/member-template/private-tools/README.md +4 -0
  20. package/members/member-template/runtime/config/README.md +3 -0
  21. package/members/member-template/runtime/config/local-plugins/member-quota-guard/index.js +123 -0
  22. package/members/member-template/runtime/config/local-plugins/member-quota-guard/openclaw.plugin.json +19 -0
  23. package/members/member-template/runtime/config/local-plugins/member-quota-guard/package.json +10 -0
  24. package/members/member-template/runtime/config/local-plugins/member-runtime-upgrader/index.js +97 -0
  25. package/members/member-template/runtime/config/local-plugins/member-runtime-upgrader/openclaw.plugin.json +21 -0
  26. package/members/member-template/runtime/config/local-plugins/member-runtime-upgrader/package.json +10 -0
  27. package/members/member-template/runtime/config/local-plugins/shared-asset-injector/index.js +548 -0
  28. package/members/member-template/runtime/config/local-plugins/shared-asset-injector/openclaw.plugin.json +33 -0
  29. package/members/member-template/runtime/config/local-plugins/shared-asset-injector/package.json +10 -0
  30. package/members/member-template/runtime/config/openclaw.json +104 -0
  31. package/members/member-template/runtime/docker-compose.yml +53 -0
  32. package/members/member-template/runtime/logs/README.md +3 -0
  33. package/members/member-template/runtime/secrets/.gitkeep +1 -0
  34. package/members/member-template/runtime/secrets/README.md +3 -0
  35. package/members/member-template/runtime/workspace/.gitkeep +1 -0
  36. package/members/member-template/runtime/workspace/README.md +3 -0
  37. package/package.json +57 -0
  38. package/pic/banner.jpg +0 -0
  39. package/provision-member.md +87 -0
  40. package/scripts/shared-asset-stack-test.mjs +369 -0
  41. package/scripts/shared-skill-combo-test.mjs +282 -0
  42. package/scripts/team-load-test.mjs +358 -0
  43. package/scripts/verify-install.mjs +44 -0
  44. package/services/litellm/config.yaml +35 -0
  45. package/services/litellm/docker-compose.yml +36 -0
  46. package/services/litellm/litellm.env.example +13 -0
  47. package/shared-snapshots/README.md +16 -0
  48. package/shared-snapshots/docs/README.md +3 -0
  49. package/shared-snapshots/memory/README.md +3 -0
  50. package/shared-snapshots/skills/README.md +3 -0
  51. package/shared-snapshots/tools/README.md +4 -0
  52. package/shared-snapshots/workflows/README.md +3 -0
  53. package/team-assets/README.md +11 -0
  54. package/team-assets/policies/README.md +7 -0
  55. package/team-assets/policies/asset-visibility.md +24 -0
  56. package/team-assets/policies/high-risk-action-approval.md +18 -0
  57. package/team-assets/policies/promotion-rules.md +25 -0
  58. package/team-assets/policies/tool-binding-rules.md +26 -0
  59. package/team-assets/shared-docs/README.md +3 -0
  60. package/team-assets/shared-memory/README.md +8 -0
  61. package/team-assets/shared-skills/README.md +8 -0
  62. package/team-assets/shared-tools/README.md +8 -0
  63. package/team-assets/shared-workflows/README.md +9 -0
package/dist/cli.js ADDED
@@ -0,0 +1,213 @@
1
+ #!/usr/bin/env node
2
+ import { spawn } from "node:child_process";
3
+ import fs from "node:fs/promises";
4
+ import path from "node:path";
5
+ import { fileURLToPath } from "node:url";
6
+ const PKG_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
7
+ const SCAFFOLD_FILES = [
8
+ ".gitignore",
9
+ "ARCHITECTURE.md",
10
+ "README.md",
11
+ "README.dev.md",
12
+ "README.public.md",
13
+ "TESTING.md",
14
+ "RELEASING.md",
15
+ "provision-member.md",
16
+ "members/README.md",
17
+ "members/LAUNCH_CHECKLIST.md",
18
+ "team-assets/README.md",
19
+ "shared-snapshots/README.md",
20
+ "services/litellm/docker-compose.yml",
21
+ "services/litellm/config.yaml",
22
+ "services/litellm/litellm.env.example",
23
+ "members/member-template/runtime/docker-compose.yml",
24
+ "members/member-template/runtime/config/openclaw.json",
25
+ "members/member-template/runtime/secrets/.gitkeep",
26
+ "members/member-template/runtime/workspace/.gitkeep",
27
+ "pic/banner.jpg"
28
+ ];
29
+ const SCAFFOLD_DIRS = [
30
+ "members/member-template/runtime/config/local-plugins",
31
+ "members/member-template/private-memory",
32
+ "members/member-template/private-skills",
33
+ "members/member-template/private-tools",
34
+ "members/member-template/private-docs",
35
+ "services/litellm",
36
+ "state",
37
+ "teams",
38
+ "artifacts"
39
+ ];
40
+ function printUsage() {
41
+ console.log([
42
+ "Velaclaw CLI",
43
+ "",
44
+ "Usage:",
45
+ " velaclaw init <dir>",
46
+ " velaclaw start [--root <dir>] [--port <port>]",
47
+ " velaclaw verify [--root <dir>] [--base-url <url>]",
48
+ " velaclaw smoke skills [--root <dir>]",
49
+ " velaclaw smoke assets [--root <dir>]",
50
+ " velaclaw smoke load-test [--root <dir>]",
51
+ " velaclaw version"
52
+ ].join("\n"));
53
+ }
54
+ function parseFlag(args, name) {
55
+ const index = args.indexOf(name);
56
+ if (index < 0) {
57
+ return undefined;
58
+ }
59
+ return args[index + 1];
60
+ }
61
+ function hasFlag(args, name) {
62
+ return args.includes(name);
63
+ }
64
+ async function pathExists(targetPath) {
65
+ try {
66
+ await fs.access(targetPath);
67
+ return true;
68
+ }
69
+ catch {
70
+ return false;
71
+ }
72
+ }
73
+ async function ensureEmptyOrMissingDir(targetDir, force) {
74
+ if (!(await pathExists(targetDir))) {
75
+ return;
76
+ }
77
+ const entries = await fs.readdir(targetDir);
78
+ if (!entries.length || force) {
79
+ return;
80
+ }
81
+ throw new Error(`target directory is not empty: ${targetDir}`);
82
+ }
83
+ async function copyIntoTarget(targetRoot) {
84
+ for (const dir of SCAFFOLD_DIRS) {
85
+ await fs.mkdir(path.join(targetRoot, dir), { recursive: true });
86
+ }
87
+ for (const relPath of SCAFFOLD_FILES) {
88
+ const source = path.join(PKG_ROOT, relPath);
89
+ const destination = path.join(targetRoot, relPath);
90
+ await fs.mkdir(path.dirname(destination), { recursive: true });
91
+ await fs.cp(source, destination, { recursive: true, force: true });
92
+ }
93
+ const pluginSource = path.join(PKG_ROOT, "members", "member-template", "runtime", "config", "local-plugins");
94
+ const pluginDest = path.join(targetRoot, "members", "member-template", "runtime", "config", "local-plugins");
95
+ if (await pathExists(pluginSource)) {
96
+ await fs.cp(pluginSource, pluginDest, { recursive: true, force: true });
97
+ }
98
+ await fs.writeFile(path.join(targetRoot, "state", ".gitkeep"), "", "utf8");
99
+ }
100
+ function runNodeScript(scriptPath, options) {
101
+ const child = spawn(process.execPath, [scriptPath], {
102
+ cwd: options.cwd,
103
+ env: {
104
+ ...process.env,
105
+ ...(options.env || {})
106
+ },
107
+ stdio: "inherit"
108
+ });
109
+ child.on("exit", (code) => {
110
+ process.exitCode = code ?? 1;
111
+ });
112
+ }
113
+ function resolveRoot(args) {
114
+ const raw = parseFlag(args, "--root");
115
+ return path.resolve(raw || process.cwd());
116
+ }
117
+ async function runInit(args) {
118
+ const targetArg = args[0];
119
+ if (!targetArg) {
120
+ throw new Error("init requires a target directory");
121
+ }
122
+ const targetRoot = path.resolve(targetArg);
123
+ const force = hasFlag(args, "--force");
124
+ await fs.mkdir(targetRoot, { recursive: true });
125
+ await ensureEmptyOrMissingDir(targetRoot, force);
126
+ await copyIntoTarget(targetRoot);
127
+ console.log([
128
+ `Initialized Velaclaw workspace at ${targetRoot}`,
129
+ "",
130
+ "Next steps:",
131
+ ` cp ${path.join(targetRoot, "services/litellm/litellm.env.example")} ~/.config/velaclaw/litellm.env`,
132
+ ` cd ${targetRoot}`,
133
+ " docker compose -f services/litellm/docker-compose.yml up -d",
134
+ " velaclaw start",
135
+ " velaclaw verify"
136
+ ].join("\n"));
137
+ }
138
+ async function runStart(args) {
139
+ const root = resolveRoot(args);
140
+ const port = parseFlag(args, "--port");
141
+ if (!(await pathExists(path.join(root, "members", "member-template", "runtime", "config", "openclaw.json")))) {
142
+ throw new Error(`not a Velaclaw workspace: ${root}. Run 'velaclaw init <dir>' first.`);
143
+ }
144
+ runNodeScript(path.join(PKG_ROOT, "dist", "server.js"), {
145
+ cwd: root,
146
+ env: port ? { PORT: port } : undefined
147
+ });
148
+ }
149
+ async function runVerify(args) {
150
+ const root = resolveRoot(args);
151
+ const baseUrl = parseFlag(args, "--base-url");
152
+ runNodeScript(path.join(PKG_ROOT, "scripts", "verify-install.mjs"), {
153
+ cwd: root,
154
+ env: {
155
+ VELACLAW_ROOT: root,
156
+ ...(baseUrl ? { VELACLAW_BASE_URL: baseUrl } : {})
157
+ }
158
+ });
159
+ }
160
+ async function runSmoke(args) {
161
+ const mode = args[0];
162
+ const root = resolveRoot(args);
163
+ const baseEnv = {
164
+ VELACLAW_ROOT: root
165
+ };
166
+ if (mode === "skills") {
167
+ runNodeScript(path.join(PKG_ROOT, "scripts", "shared-skill-combo-test.mjs"), { cwd: root, env: baseEnv });
168
+ return;
169
+ }
170
+ if (mode === "assets") {
171
+ runNodeScript(path.join(PKG_ROOT, "scripts", "shared-asset-stack-test.mjs"), { cwd: root, env: baseEnv });
172
+ return;
173
+ }
174
+ if (mode === "load-test") {
175
+ runNodeScript(path.join(PKG_ROOT, "scripts", "team-load-test.mjs"), { cwd: root, env: baseEnv });
176
+ return;
177
+ }
178
+ throw new Error(`unsupported smoke target: ${mode || "(missing)"}`);
179
+ }
180
+ async function main() {
181
+ const args = process.argv.slice(2);
182
+ const command = args[0];
183
+ if (!command || command === "--help" || command === "-h") {
184
+ printUsage();
185
+ return;
186
+ }
187
+ if (command === "version") {
188
+ const pkg = JSON.parse(await fs.readFile(path.join(PKG_ROOT, "package.json"), "utf8"));
189
+ console.log(pkg.version || "unknown");
190
+ return;
191
+ }
192
+ if (command === "init") {
193
+ await runInit(args.slice(1));
194
+ return;
195
+ }
196
+ if (command === "start") {
197
+ await runStart(args.slice(1));
198
+ return;
199
+ }
200
+ if (command === "verify") {
201
+ await runVerify(args.slice(1));
202
+ return;
203
+ }
204
+ if (command === "smoke") {
205
+ await runSmoke(args.slice(1));
206
+ return;
207
+ }
208
+ throw new Error(`unknown command: ${command}`);
209
+ }
210
+ main().catch((error) => {
211
+ console.error(error instanceof Error ? error.message : String(error));
212
+ process.exitCode = 1;
213
+ });