@clawstore/clawstore 1.0.6 → 1.0.8

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 (55) hide show
  1. package/dist/src/cli.d.ts.map +1 -1
  2. package/dist/src/cli.js +3 -1
  3. package/dist/src/cli.js.map +1 -1
  4. package/dist/src/commands.d.ts.map +1 -1
  5. package/dist/src/commands.js +2 -1
  6. package/dist/src/commands.js.map +1 -1
  7. package/dist/src/core/agent-register.d.ts +6 -0
  8. package/dist/src/core/agent-register.d.ts.map +1 -0
  9. package/dist/src/core/agent-register.js +73 -0
  10. package/dist/src/core/agent-register.js.map +1 -0
  11. package/dist/src/core/api-health.d.ts +9 -0
  12. package/dist/src/core/api-health.d.ts.map +1 -0
  13. package/dist/src/core/api-health.js +17 -0
  14. package/dist/src/core/api-health.js.map +1 -0
  15. package/dist/src/core/diagnostics.d.ts +7 -0
  16. package/dist/src/core/diagnostics.d.ts.map +1 -0
  17. package/dist/src/core/diagnostics.js +145 -0
  18. package/dist/src/core/diagnostics.js.map +1 -0
  19. package/dist/src/core/openclaw-profile.d.ts +6 -0
  20. package/dist/src/core/openclaw-profile.d.ts.map +1 -0
  21. package/dist/src/core/openclaw-profile.js +12 -0
  22. package/dist/src/core/openclaw-profile.js.map +1 -0
  23. package/dist/src/core/skill-installer.d.ts +1 -1
  24. package/dist/src/core/skill-installer.d.ts.map +1 -1
  25. package/dist/src/core/skill-installer.js +5 -25
  26. package/dist/src/core/skill-installer.js.map +1 -1
  27. package/dist/src/core/store-client.d.ts +0 -11
  28. package/dist/src/core/store-client.d.ts.map +1 -1
  29. package/dist/src/core/store-client.js +0 -19
  30. package/dist/src/core/store-client.js.map +1 -1
  31. package/dist/src/core/workspace.d.ts +0 -18
  32. package/dist/src/core/workspace.d.ts.map +1 -1
  33. package/dist/src/core/workspace.js +4 -195
  34. package/dist/src/core/workspace.js.map +1 -1
  35. package/openclaw.plugin.json +1 -1
  36. package/package.json +9 -3
  37. package/src/cli.ts +3 -1
  38. package/src/commands.ts +2 -1
  39. package/src/core/agent-register.ts +79 -0
  40. package/src/core/api-health.ts +17 -0
  41. package/src/core/diagnostics.ts +163 -0
  42. package/src/core/openclaw-profile.ts +10 -0
  43. package/src/core/skill-installer.ts +6 -27
  44. package/src/core/store-client.ts +0 -21
  45. package/src/core/workspace.ts +3 -219
  46. package/dist/src/__tests__/cli-sim.test.d.ts +0 -9
  47. package/dist/src/__tests__/cli-sim.test.d.ts.map +0 -1
  48. package/dist/src/__tests__/cli-sim.test.js +0 -275
  49. package/dist/src/__tests__/cli-sim.test.js.map +0 -1
  50. package/dist/src/__tests__/e2e.test.d.ts +0 -10
  51. package/dist/src/__tests__/e2e.test.d.ts.map +0 -1
  52. package/dist/src/__tests__/e2e.test.js +0 -159
  53. package/dist/src/__tests__/e2e.test.js.map +0 -1
  54. package/src/__tests__/cli-sim.test.ts +0 -303
  55. package/src/__tests__/e2e.test.ts +0 -186
@@ -1,186 +0,0 @@
1
- /**
2
- * End-to-end test for the Clawstore plugin core modules.
3
- *
4
- * Verifies: workspace resolution, manifest validation, install/uninstall
5
- * flow, pack, and diagnostic report — all against the local Persona packages.
6
- *
7
- * Run: npx tsx src/__tests__/e2e.test.ts
8
- */
9
-
10
- import { resolve, join } from "node:path";
11
- import { mkdir, rm, writeFile, readFile, access } from "node:fs/promises";
12
- import { tmpdir } from "node:os";
13
-
14
- // ─── Test infra ─────────────────────────────────────────────────────
15
-
16
- let passed = 0;
17
- let failed = 0;
18
-
19
- function assert(condition: boolean, label: string): void {
20
- if (condition) {
21
- console.log(` ✓ ${label}`);
22
- passed++;
23
- } else {
24
- console.error(` ✗ ${label}`);
25
- failed++;
26
- }
27
- }
28
-
29
- async function exists(p: string): Promise<boolean> {
30
- try { await access(p); return true; } catch { return false; }
31
- }
32
-
33
- // ─── Override paths to use temp dirs ────────────────────────────────
34
-
35
- const TEST_HOME = join(tmpdir(), `clawstore-test-${Date.now()}`);
36
- const TEST_WORKSPACE = join(TEST_HOME, "workspace");
37
-
38
- // We need to override the constants before importing modules
39
- process.env.CLAWSTORE_TEST_HOME = TEST_HOME;
40
-
41
- // ─── Dynamic imports (after env setup) ──────────────────────────────
42
-
43
- async function runTests() {
44
- console.log("\n═══ Clawstore Plugin E2E Tests ═══\n");
45
-
46
- // Setup temp dirs
47
- await mkdir(TEST_WORKSPACE, { recursive: true });
48
- await mkdir(join(TEST_HOME, "clawstore"), { recursive: true });
49
-
50
- // We'll test the core modules directly
51
- const { validatePackage, loadManifest } = await import("../core/package-installer.js");
52
- const { loadRegistry, saveRegistry, registerAgent, unregisterAgent, enableAgent, disableAgent, listInstalledAgents } = await import("../core/agent-manager.js");
53
- const { computeSha256 } = await import("../utils/checksum.js");
54
- const { formatDiagnosticReport } = await import("../core/workspace.js");
55
-
56
- // ─── Test: Persona package paths ────────────────────────────────
57
- const personaRoot = resolve(import.meta.dirname ?? ".", "../../../../Persona");
58
- const ecommercePkg = join(personaRoot, "E-commerce");
59
-
60
- console.log(" Test group: Package Validation\n");
61
-
62
- // 1. E-commerce package should be valid
63
- const ecomResult = await validatePackage(ecommercePkg);
64
- assert(ecomResult.valid === true, "E-commerce package is valid");
65
- assert(ecomResult.manifest !== null, "E-commerce manifest loaded");
66
- assert(ecomResult.manifest?.id === "sellex-ecommerce-ops", "E-commerce agent ID correct");
67
- assert(ecomResult.manifest?.version === "2.0.0", "E-commerce version is 2.0.0");
68
-
69
- // 2. Manifest fields
70
- const manifest = await loadManifest(ecommercePkg);
71
- assert(manifest.name.includes("E-commerce"), "manifest name contains E-commerce");
72
- assert(manifest.skills.length === 4, "manifest has 4 skills");
73
- assert(manifest.entry_files.length >= 3, "manifest has >= 3 entry_files");
74
-
75
- // 3. Non-existent package should fail
76
- const fakeResult = await validatePackage(join(personaRoot, "NonExistent"));
77
- assert(fakeResult.valid === false, "Non-existent package fails validation");
78
-
79
- // ─── Test: Checksum ─────────────────────────────────────────────
80
- console.log("\n Test group: Checksum\n");
81
-
82
- const testFile = join(TEST_HOME, "test_checksum.txt");
83
- await writeFile(testFile, "Hello Clawstore!", "utf-8");
84
- const cs = await computeSha256(testFile);
85
- assert(cs.startsWith("sha256:"), "Checksum starts with sha256:");
86
- assert(cs.length > 10, "Checksum has reasonable length");
87
-
88
- // ─── Test: Registry CRUD ────────────────────────────────────────
89
- console.log("\n Test group: Registry CRUD\n");
90
-
91
- // Override the registry file for testing
92
- const testRegistryFile = join(TEST_HOME, "clawstore", "installed_agents.json");
93
- await writeFile(testRegistryFile, JSON.stringify({ agents: {} }), "utf-8");
94
-
95
- // Since the module uses hardcoded paths, we'll test the registry functions
96
- // by directly using load/save with the real file path
97
- const emptyReg = await loadRegistry();
98
- assert(Object.keys(emptyReg.agents).length === 0, "Empty registry has no agents");
99
-
100
- // Register a test agent
101
- await registerAgent({
102
- id: "test-agent",
103
- name: "Test Agent",
104
- version: "1.0.0",
105
- category: "test",
106
- author: "Test",
107
- enabled: true,
108
- installed_at: new Date().toISOString(),
109
- updated_at: new Date().toISOString(),
110
- source: "/tmp/test",
111
- install_path: TEST_WORKSPACE,
112
- backup_path: "",
113
- files: ["SOUL.md"],
114
- skills: [],
115
- });
116
-
117
- const regAfterAdd = await loadRegistry();
118
- assert(regAfterAdd.agents["test-agent"] !== undefined, "Agent registered successfully");
119
- assert(regAfterAdd.agents["test-agent"].name === "Test Agent", "Agent name correct");
120
-
121
- // Enable/disable
122
- const disabled = await disableAgent("test-agent");
123
- assert(disabled?.agent.enabled === false, "Agent disabled");
124
-
125
- const enabled = await enableAgent("test-agent");
126
- assert(enabled?.enabled === true, "Agent re-enabled");
127
-
128
- // List
129
- const list = await listInstalledAgents();
130
- assert(list.length >= 1, "Listed agents includes test-agent");
131
-
132
- // Unregister
133
- const removed = await unregisterAgent("test-agent");
134
- assert(removed?.id === "test-agent", "Agent unregistered");
135
-
136
- const regAfterRemove = await loadRegistry();
137
- assert(regAfterRemove.agents["test-agent"] === undefined, "Agent removed from registry");
138
-
139
- // ─── Test: Diagnostic report formatting ─────────────────────────
140
- console.log("\n Test group: Diagnostic Formatting\n");
141
-
142
- const mockReport = {
143
- checks: [
144
- { label: "OpenClaw home", path: "/test", status: "ok" as const },
145
- { label: "Workspace", path: "/test/ws", status: "fail" as const, detail: "NOT FOUND" },
146
- ],
147
- allOk: false,
148
- };
149
- const formatted = formatDiagnosticReport(mockReport);
150
- assert(formatted.includes("Clawstore Doctor"), "Report has title");
151
- assert(formatted.includes("OK"), "Report has OK status");
152
- assert(formatted.includes("FAIL"), "Report has FAIL status");
153
- assert(formatted.includes("Some issues found"), "Report shows issues summary");
154
-
155
- // ─── Test: Multiple Persona packages ────────────────────────────
156
- console.log("\n Test group: Cross-Persona Validation\n");
157
-
158
- const personas = [
159
- "Cross-border", "Knowledge-blogger", "Development", "Retail-store",
160
- "Design", "Manufacturing", "Legal", "Finance-tax", "Headhunting",
161
- ];
162
-
163
- for (const name of personas) {
164
- const pkgPath = join(personaRoot, name);
165
- if (await exists(pkgPath)) {
166
- const result = await validatePackage(pkgPath);
167
- assert(result.valid === true, `${name} package is valid`);
168
- } else {
169
- assert(false, `${name} package directory exists`);
170
- }
171
- }
172
-
173
- // ─── Cleanup ────────────────────────────────────────────────────
174
- try {
175
- await rm(TEST_HOME, { recursive: true, force: true });
176
- } catch { /* ignore */ }
177
-
178
- // ─── Summary ────────────────────────────────────────────────────
179
- console.log(`\n═══ Results: ${passed} passed, ${failed} failed ═══\n`);
180
- process.exit(failed > 0 ? 1 : 0);
181
- }
182
-
183
- runTests().catch((err) => {
184
- console.error("Test runner failed:", err);
185
- process.exit(1);
186
- });