@pixelbyte-software/pixcode 1.46.5 → 1.46.7
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/dist/assets/{index-DzyrwWOg.js → index-DFtAfb5e.js} +185 -185
- package/dist/assets/index-ZVH3XpuN.css +32 -0
- package/dist/index.html +2 -2
- package/package.json +1 -1
- package/scripts/smoke/control-room-ux-redesign.mjs +91 -0
- package/scripts/smoke/default-landing-routing.mjs +42 -0
- package/scripts/smoke/v146-control-room-ui.mjs +21 -9
- package/dist/assets/index--oHyXFtw.css +0 -32
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import assert from 'node:assert/strict';
|
|
4
|
+
import fs from 'node:fs';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
|
|
7
|
+
const root = process.cwd();
|
|
8
|
+
|
|
9
|
+
function read(relativePath) {
|
|
10
|
+
return fs.readFileSync(path.join(root, relativePath), 'utf8');
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
function assertIncludes(file, pattern, message) {
|
|
14
|
+
assert.match(file, pattern instanceof RegExp ? pattern : new RegExp(pattern), message);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const page = read('src/components/control-room/ControlRoomPage.tsx');
|
|
18
|
+
const primitives = read('src/components/control-room/ControlRoomPrimitives.tsx');
|
|
19
|
+
const motion = read('src/lib/animations.ts');
|
|
20
|
+
|
|
21
|
+
for (const symbol of [
|
|
22
|
+
'CONTROL_ROOM_GROUPS',
|
|
23
|
+
'OVERVIEW_CARDS',
|
|
24
|
+
'operations',
|
|
25
|
+
'people',
|
|
26
|
+
'access',
|
|
27
|
+
'security',
|
|
28
|
+
'insights',
|
|
29
|
+
]) {
|
|
30
|
+
assertIncludes(page, new RegExp(symbol), `Control Room should include grouped ${symbol} IA.`);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const overviewCards = page.match(/id: 'overview-card-/g) || [];
|
|
34
|
+
assert.equal(overviewCards.length, 6, 'Control Room first screen should expose exactly six overview action cards.');
|
|
35
|
+
|
|
36
|
+
assert.doesNotMatch(page, /const sections:/, 'Control Room should not use the old flat feature-wall section list.');
|
|
37
|
+
assert.doesNotMatch(page, /v1\.46 launch surface/, 'Control Room should not frame the UI as a release inventory.');
|
|
38
|
+
assert.doesNotMatch(page, /activeSection === 'admin'[\s\S]{0,3000}activeSection === 'team'/, 'Control Room should group people/admin concepts instead of flat adjacent sections.');
|
|
39
|
+
|
|
40
|
+
for (const primitive of [
|
|
41
|
+
'CommandCard',
|
|
42
|
+
'SummaryCard',
|
|
43
|
+
'ControlRoomPanel',
|
|
44
|
+
'ContextDrawer',
|
|
45
|
+
'GuidanceCard',
|
|
46
|
+
'EmptyGuidance',
|
|
47
|
+
'TimelineItem',
|
|
48
|
+
'ActionRow',
|
|
49
|
+
'ResponsiveDataList',
|
|
50
|
+
'AdvancedDisclosure',
|
|
51
|
+
]) {
|
|
52
|
+
assertIncludes(primitives, new RegExp(`function ${primitive}|const ${primitive}`), `Control Room primitives should include ${primitive}.`);
|
|
53
|
+
assertIncludes(page, new RegExp(primitive), `ControlRoomPage should use ${primitive}.`);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
for (const copy of [
|
|
57
|
+
'What needs attention',
|
|
58
|
+
'Running now',
|
|
59
|
+
'Team and access',
|
|
60
|
+
'Security and secrets',
|
|
61
|
+
'Usage and evaluations',
|
|
62
|
+
'Run timeline',
|
|
63
|
+
'Recommended next step',
|
|
64
|
+
'What this means',
|
|
65
|
+
]) {
|
|
66
|
+
assertIncludes(page, copy.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), `Control Room should include plain-language copy: ${copy}.`);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
assertIncludes(page, /lg:grid-cols-\[220px_minmax\(0,1fr\)_320px\]/, 'Desktop Control Room should use a master-detail grid.');
|
|
70
|
+
assertIncludes(page, /overflow-x-auto lg:hidden/, 'Mobile Control Room should use compact horizontal group navigation.');
|
|
71
|
+
assertIncludes(page, /min-h-\[44px\]|h-11/, 'Primary controls should keep mobile touch targets at or above 44px.');
|
|
72
|
+
assertIncludes(page, /AdvancedDisclosure/, 'Advanced forms should be hidden behind progressive disclosure.');
|
|
73
|
+
assertIncludes(page, /TimelineItem[\s\S]*actor[\s\S]*result/, 'Run timeline should expose readable actor/action/result fields.');
|
|
74
|
+
assertIncludes(page, /ContextDrawer/, 'Control Room should include a contextual detail rail or sheet.');
|
|
75
|
+
|
|
76
|
+
for (const motionSymbol of [
|
|
77
|
+
'surface',
|
|
78
|
+
'drawer',
|
|
79
|
+
'status',
|
|
80
|
+
'useGsapSurfaceTransition',
|
|
81
|
+
'useGsapListReveal',
|
|
82
|
+
'useGsapStatusHighlight',
|
|
83
|
+
'prefersReducedMotion',
|
|
84
|
+
]) {
|
|
85
|
+
assertIncludes(motion, new RegExp(motionSymbol), `Shared motion system should include ${motionSymbol}.`);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
assertIncludes(motion, /prefers-reduced-motion: reduce/, 'Motion utilities should respect prefers-reduced-motion.');
|
|
89
|
+
assertIncludes(motion, /opacityOnly|reduced motion|Reduced/, 'Motion utilities should document or implement reduced-motion fallback.');
|
|
90
|
+
|
|
91
|
+
console.log('control room UX redesign smoke passed');
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import assert from 'node:assert/strict';
|
|
4
|
+
import fs from 'node:fs';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
|
|
7
|
+
const root = process.cwd();
|
|
8
|
+
|
|
9
|
+
function read(relativePath) {
|
|
10
|
+
return fs.readFileSync(path.join(root, relativePath), 'utf8');
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const projectsState = read('src/hooks/useProjectsState.ts');
|
|
14
|
+
assert.match(projectsState, /NON_RESTORABLE_TABS/, 'Non-default utility tabs should be excluded from startup restore.');
|
|
15
|
+
assert.match(projectsState, /controlRoom/, 'Control Room should be treated as a non-restorable startup tab.');
|
|
16
|
+
assert.match(projectsState, /getPersistableTab/, 'Active tab persistence should normalize non-restorable tabs.');
|
|
17
|
+
assert.match(projectsState, /handleQuickStartTasks/, 'Project state should expose a Task quick-start flow.');
|
|
18
|
+
assert.match(projectsState, /quickStartIntoTab\('tasks'\)/, 'Task quick-start should land on the tasks tab.');
|
|
19
|
+
assert.match(projectsState, /setTasksEnabled\?\.?\(true\)|setTasksEnabled\(true\)/, 'Task quick-start should enable the Tasks surface before opening it.');
|
|
20
|
+
|
|
21
|
+
const appContent = read('src/components/app/AppContent.tsx');
|
|
22
|
+
assert.match(appContent, /handleQuickStartTasks/, 'App content should pass the Task quick-start flow into MainContent.');
|
|
23
|
+
assert.match(appContent, /onQuickStartTasks=\{handleQuickStartTasks\}/, 'MainContent should receive a Task quick-start callback.');
|
|
24
|
+
|
|
25
|
+
const mainContentTypes = read('src/components/main-content/types/types.ts');
|
|
26
|
+
assert.match(mainContentTypes, /onQuickStartTasks/, 'Main content props should include Task quick-start support.');
|
|
27
|
+
|
|
28
|
+
const mainContent = read('src/components/main-content/view/MainContent.tsx');
|
|
29
|
+
assert.match(mainContent, /const shouldShowTasksTab = Boolean\(tasksEnabled\)/, 'Tasks tab visibility should be controlled by the user-facing tasks setting, not CLI install state.');
|
|
30
|
+
assert.doesNotMatch(mainContent, /!shouldShowTasksTab && activeTab === 'tasks'/, 'Selecting Tasks should not immediately redirect back to chat because installation is still being checked.');
|
|
31
|
+
assert.match(mainContent, /onQuickStartTasks=\{onQuickStartTasks\}/, 'Empty landing state should receive the Task quick-start callback.');
|
|
32
|
+
|
|
33
|
+
const emptyState = read('src/components/main-content/view/subcomponents/MainContentStateView.tsx');
|
|
34
|
+
assert.match(emptyState, /onQuickStartTasks/, 'Empty state should expose a Task quick-start callback.');
|
|
35
|
+
assert.match(emptyState, /void onQuickStartTasks\?\.\(\)/, 'Task landing card should call the Task quick-start callback.');
|
|
36
|
+
assert.doesNotMatch(
|
|
37
|
+
emptyState,
|
|
38
|
+
/ClipboardCheck[\s\S]{0,900}pixcode:create-project/,
|
|
39
|
+
'Task landing card should not reuse the generic create-project flow that drops users into chat.',
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
console.log('default landing routing smoke passed');
|
|
@@ -12,14 +12,24 @@ function read(relativePath) {
|
|
|
12
12
|
|
|
13
13
|
const controlRoom = read('src/components/control-room/ControlRoomPage.tsx');
|
|
14
14
|
for (const phrase of [
|
|
15
|
-
'
|
|
16
|
-
'
|
|
17
|
-
'
|
|
18
|
-
'
|
|
19
|
-
'
|
|
20
|
-
'
|
|
21
|
-
'
|
|
22
|
-
'
|
|
15
|
+
'CONTROL_ROOM_GROUPS',
|
|
16
|
+
'OVERVIEW_CARDS',
|
|
17
|
+
'overview-card-attention',
|
|
18
|
+
'overview-card-running',
|
|
19
|
+
'overview-card-reviews',
|
|
20
|
+
'overview-card-team-access',
|
|
21
|
+
'overview-card-security-secrets',
|
|
22
|
+
'overview-card-usage-evals',
|
|
23
|
+
'What needs attention',
|
|
24
|
+
'Running now',
|
|
25
|
+
'Team and access',
|
|
26
|
+
'Security and secrets',
|
|
27
|
+
'Usage and evaluations',
|
|
28
|
+
'Run timeline',
|
|
29
|
+
'AdvancedDisclosure',
|
|
30
|
+
'ContextDrawer',
|
|
31
|
+
'TimelineItem',
|
|
32
|
+
'ResponsiveDataList',
|
|
23
33
|
'/api/production-agent-loop/github/issue-to-pr',
|
|
24
34
|
'/api/platformization/admin/users',
|
|
25
35
|
'/api/platformization/project-collaborators',
|
|
@@ -27,8 +37,10 @@ for (const phrase of [
|
|
|
27
37
|
assert.match(controlRoom, new RegExp(phrase.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')), `Control room UI should include ${phrase}.`);
|
|
28
38
|
}
|
|
29
39
|
assert.doesNotMatch(controlRoom, /sections\.access|Self-hosted access|remote-access\/health/, 'Self-hosted access belongs in Settings, not inside Control Room.');
|
|
40
|
+
assert.doesNotMatch(controlRoom, /const sections\s*=/, 'Control Room should not return to the old flat feature-wall section list.');
|
|
30
41
|
|
|
31
|
-
assert.match(controlRoom, /lg:
|
|
42
|
+
assert.match(controlRoom, /lg:grid-cols-\[220px_minmax\(0,1fr\)_320px\]/, 'Control room must use a desktop master-detail layout.');
|
|
43
|
+
assert.match(controlRoom, /overflow-x-auto lg:hidden/, 'Control room must expose mobile-first grouped navigation.');
|
|
32
44
|
assert.match(controlRoom, /sm:grid-cols-2/, 'Control room must include mobile-first responsive grids.');
|
|
33
45
|
assert.match(controlRoom, /xl:grid-cols/, 'Control room must scale to wide screens.');
|
|
34
46
|
|