@cryptiklemur/lattice 1.20.1 → 1.20.3
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/.github/workflows/ci.yml +2 -42
- package/package.json +1 -1
- package/server/src/handlers/editor.ts +2 -2
- package/shared/src/messages.ts +13 -0
- package/tests/accessibility.spec.ts +3 -3
- package/tests/keyboard-shortcuts.spec.ts +3 -7
- package/tests/message-actions.spec.ts +1 -1
- package/tests/onboarding.spec.ts +1 -1
- package/tests/session-flow.spec.ts +1 -1
- package/tests/session-preview.spec.ts +1 -1
package/.github/workflows/ci.yml
CHANGED
|
@@ -77,45 +77,5 @@ jobs:
|
|
|
77
77
|
- name: Build client
|
|
78
78
|
run: cd client && npx vite build
|
|
79
79
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
runs-on: ubuntu-latest
|
|
83
|
-
continue-on-error: true
|
|
84
|
-
steps:
|
|
85
|
-
- name: Checkout
|
|
86
|
-
uses: actions/checkout@v5
|
|
87
|
-
|
|
88
|
-
- name: Setup Bun
|
|
89
|
-
uses: oven-sh/setup-bun@v2
|
|
90
|
-
with:
|
|
91
|
-
bun-version: latest
|
|
92
|
-
|
|
93
|
-
- name: Setup Node.js
|
|
94
|
-
uses: actions/setup-node@v4
|
|
95
|
-
with:
|
|
96
|
-
node-version: 22
|
|
97
|
-
|
|
98
|
-
- name: Cache bun install
|
|
99
|
-
uses: actions/cache@v4
|
|
100
|
-
with:
|
|
101
|
-
path: ~/.bun/install/cache
|
|
102
|
-
key: ${{ runner.os }}-bun-${{ hashFiles('bun.lock') }}
|
|
103
|
-
restore-keys: |
|
|
104
|
-
${{ runner.os }}-bun-
|
|
105
|
-
|
|
106
|
-
- name: Install dependencies
|
|
107
|
-
run: bun install --frozen-lockfile
|
|
108
|
-
|
|
109
|
-
- name: Install Playwright browsers
|
|
110
|
-
run: bunx playwright install --with-deps chromium
|
|
111
|
-
|
|
112
|
-
- name: Run Playwright tests
|
|
113
|
-
run: bunx playwright test
|
|
114
|
-
|
|
115
|
-
- name: Upload test results
|
|
116
|
-
if: always()
|
|
117
|
-
uses: actions/upload-artifact@v4
|
|
118
|
-
with:
|
|
119
|
-
name: playwright-results
|
|
120
|
-
path: test-results/
|
|
121
|
-
retention-days: 7
|
|
80
|
+
# Playwright tests require a running server (localhost:7654)
|
|
81
|
+
# Run locally with: bunx playwright test
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cryptiklemur/lattice",
|
|
3
|
-
"version": "1.20.
|
|
3
|
+
"version": "1.20.3",
|
|
4
4
|
"description": "Multi-machine agentic dashboard for Claude Code. Monitor sessions, manage MCP servers and skills, orchestrate across mesh-networked nodes.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Aaron Scherer <me@aaronscherer.me>",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { execSync } from "node:child_process";
|
|
2
2
|
import { existsSync, mkdirSync, writeFileSync } from "node:fs";
|
|
3
3
|
import { join } from "node:path";
|
|
4
|
-
import type { ClientMessage, EditorDetectMessage } from "@lattice/shared";
|
|
4
|
+
import type { ClientMessage, EditorDetectMessage, EditorEnsureProjectMessage } from "@lattice/shared";
|
|
5
5
|
import { registerHandler } from "../ws/router";
|
|
6
6
|
import { sendTo } from "../ws/broadcast";
|
|
7
7
|
import { loadConfig } from "../config";
|
|
@@ -57,7 +57,7 @@ registerHandler("editor", function (clientId: string, message: ClientMessage) {
|
|
|
57
57
|
}
|
|
58
58
|
|
|
59
59
|
if (message.type === "editor:ensure-project") {
|
|
60
|
-
var ensureMsg = message as
|
|
60
|
+
var ensureMsg = message as EditorEnsureProjectMessage;
|
|
61
61
|
var config = loadConfig();
|
|
62
62
|
var project = config.projects.find(function (p: typeof config.projects[number]) { return p.slug === ensureMsg.projectSlug; });
|
|
63
63
|
if (project) {
|
package/shared/src/messages.ts
CHANGED
|
@@ -360,12 +360,23 @@ export interface EditorDetectMessage {
|
|
|
360
360
|
editorType: string;
|
|
361
361
|
}
|
|
362
362
|
|
|
363
|
+
export interface EditorEnsureProjectMessage {
|
|
364
|
+
type: "editor:ensure-project";
|
|
365
|
+
projectSlug: string;
|
|
366
|
+
}
|
|
367
|
+
|
|
363
368
|
export interface EditorDetectResultMessage {
|
|
364
369
|
type: "editor:detect_result";
|
|
365
370
|
editorType: string;
|
|
366
371
|
path: string | null;
|
|
367
372
|
}
|
|
368
373
|
|
|
374
|
+
export interface EditorEnsureProjectResultMessage {
|
|
375
|
+
type: "editor:ensure-project_result";
|
|
376
|
+
projectSlug: string;
|
|
377
|
+
ideProjectName: string;
|
|
378
|
+
}
|
|
379
|
+
|
|
369
380
|
export interface ProjectSettingsGetMessage {
|
|
370
381
|
type: "project-settings:get";
|
|
371
382
|
projectSlug: string;
|
|
@@ -498,6 +509,7 @@ export type ClientMessage =
|
|
|
498
509
|
| BrowseSuggestionsMessage
|
|
499
510
|
| EditorOpenMessage
|
|
500
511
|
| EditorDetectMessage
|
|
512
|
+
| EditorEnsureProjectMessage
|
|
501
513
|
| ChatPromptResponseMessage
|
|
502
514
|
| AnalyticsRequestMessage
|
|
503
515
|
| SessionPreviewRequestMessage
|
|
@@ -902,6 +914,7 @@ export type ServerMessage =
|
|
|
902
914
|
| MemoryDeleteResultMessage
|
|
903
915
|
| BrowseSuggestionsResultMessage
|
|
904
916
|
| EditorDetectResultMessage
|
|
917
|
+
| EditorEnsureProjectResultMessage
|
|
905
918
|
| AttachmentProgressMessage
|
|
906
919
|
| AttachmentErrorMessage
|
|
907
920
|
| ChatPromptRequestMessage
|
|
@@ -7,7 +7,7 @@ test.beforeEach(async function ({ page }) {
|
|
|
7
7
|
registrations.forEach(function (r) { r.unregister(); });
|
|
8
8
|
});
|
|
9
9
|
}
|
|
10
|
-
caches.keys().then(function (names) {
|
|
10
|
+
if (typeof caches !== "undefined") caches.keys().then(function (names) {
|
|
11
11
|
names.forEach(function (name) { caches.delete(name); });
|
|
12
12
|
});
|
|
13
13
|
});
|
|
@@ -26,8 +26,8 @@ test.describe("Focus and modal behavior", function () {
|
|
|
26
26
|
var modal = page.locator("[role='dialog'][aria-label='Add Project']");
|
|
27
27
|
await expect(modal).toBeVisible({ timeout: 5000 });
|
|
28
28
|
|
|
29
|
-
var
|
|
30
|
-
await expect(
|
|
29
|
+
var focusInModal = modal.locator(":focus");
|
|
30
|
+
await expect(focusInModal).toHaveCount(1);
|
|
31
31
|
|
|
32
32
|
var focusableElements = modal.locator(
|
|
33
33
|
"input, button, [tabindex]:not([tabindex='-1'])"
|
|
@@ -7,7 +7,7 @@ test.beforeEach(async function ({ page }) {
|
|
|
7
7
|
registrations.forEach(function (r) { r.unregister(); });
|
|
8
8
|
});
|
|
9
9
|
}
|
|
10
|
-
caches.keys().then(function (names) {
|
|
10
|
+
if (typeof caches !== "undefined") caches.keys().then(function (names) {
|
|
11
11
|
names.forEach(function (name) { caches.delete(name); });
|
|
12
12
|
});
|
|
13
13
|
});
|
|
@@ -48,9 +48,7 @@ test.describe("Keyboard interactions", function () {
|
|
|
48
48
|
await page.keyboard.press("Control+k");
|
|
49
49
|
await page.waitForTimeout(300);
|
|
50
50
|
|
|
51
|
-
var paletteInput = page.locator("input[placeholder*='
|
|
52
|
-
page.locator("[role='dialog'] input[type='text']")
|
|
53
|
-
);
|
|
51
|
+
var paletteInput = page.locator("input[placeholder*='command']");
|
|
54
52
|
await expect(paletteInput.first()).toBeVisible({ timeout: 5000 });
|
|
55
53
|
});
|
|
56
54
|
|
|
@@ -61,9 +59,7 @@ test.describe("Keyboard interactions", function () {
|
|
|
61
59
|
await page.keyboard.press("Control+k");
|
|
62
60
|
await page.waitForTimeout(300);
|
|
63
61
|
|
|
64
|
-
var paletteInput = page.locator("input[placeholder*='
|
|
65
|
-
page.locator("[role='dialog'] input[type='text']")
|
|
66
|
-
);
|
|
62
|
+
var paletteInput = page.locator("input[placeholder*='command']");
|
|
67
63
|
await expect(paletteInput.first()).toBeVisible({ timeout: 5000 });
|
|
68
64
|
|
|
69
65
|
await page.keyboard.press("Escape");
|
|
@@ -7,7 +7,7 @@ test.beforeEach(async function ({ page }) {
|
|
|
7
7
|
registrations.forEach(function (r) { r.unregister(); });
|
|
8
8
|
});
|
|
9
9
|
}
|
|
10
|
-
caches.keys().then(function (names) {
|
|
10
|
+
if (typeof caches !== "undefined") caches.keys().then(function (names) {
|
|
11
11
|
names.forEach(function (name) { caches.delete(name); });
|
|
12
12
|
});
|
|
13
13
|
});
|
package/tests/onboarding.spec.ts
CHANGED
|
@@ -7,7 +7,7 @@ test.beforeEach(async function ({ page }) {
|
|
|
7
7
|
registrations.forEach(function (r) { r.unregister(); });
|
|
8
8
|
});
|
|
9
9
|
}
|
|
10
|
-
caches.keys().then(function (names) {
|
|
10
|
+
if (typeof caches !== "undefined") caches.keys().then(function (names) {
|
|
11
11
|
names.forEach(function (name) { caches.delete(name); });
|
|
12
12
|
});
|
|
13
13
|
});
|
|
@@ -7,7 +7,7 @@ test.beforeEach(async function ({ page }) {
|
|
|
7
7
|
registrations.forEach(function (r) { r.unregister(); });
|
|
8
8
|
});
|
|
9
9
|
}
|
|
10
|
-
caches.keys().then(function (names) {
|
|
10
|
+
if (typeof caches !== "undefined") caches.keys().then(function (names) {
|
|
11
11
|
names.forEach(function (name) { caches.delete(name); });
|
|
12
12
|
});
|
|
13
13
|
});
|
|
@@ -7,7 +7,7 @@ test.beforeEach(async function ({ page }) {
|
|
|
7
7
|
registrations.forEach(function (r) { r.unregister(); });
|
|
8
8
|
});
|
|
9
9
|
}
|
|
10
|
-
caches.keys().then(function (names) {
|
|
10
|
+
if (typeof caches !== "undefined") caches.keys().then(function (names) {
|
|
11
11
|
names.forEach(function (name) { caches.delete(name); });
|
|
12
12
|
});
|
|
13
13
|
});
|