arkaos 4.13.1 → 4.13.2

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 (35) hide show
  1. package/VERSION +1 -1
  2. package/bin/arka-doctor +15 -1
  3. package/core/governance/__pycache__/evidence_checks.cpython-313.pyc +0 -0
  4. package/core/governance/evidence_checks.py +85 -4
  5. package/core/workflow/__pycache__/design_authorization.cpython-313.pyc +0 -0
  6. package/core/workflow/__pycache__/frontend_gate.cpython-313.pyc +0 -0
  7. package/core/workflow/design_authorization.py +106 -0
  8. package/core/workflow/frontend_gate.py +54 -22
  9. package/dashboard/app/app.config.ts +2 -2
  10. package/dashboard/app/assets/css/main.css +285 -13
  11. package/dashboard/app/components/ArkaConstellation.vue +239 -0
  12. package/dashboard/app/components/ArkaCountUp.vue +35 -0
  13. package/dashboard/app/components/ArkaGlowCard.vue +25 -0
  14. package/dashboard/app/components/ArkaLiveFeed.vue +122 -0
  15. package/dashboard/app/components/ArkaNavGroupLabel.vue +11 -0
  16. package/dashboard/app/components/ArkaPageHero.vue +42 -0
  17. package/dashboard/app/components/ArkaSection.vue +20 -0
  18. package/dashboard/app/components/ArkaStarfield.vue +3 -0
  19. package/dashboard/app/components/ArkaStatCard.vue +38 -0
  20. package/dashboard/app/components/ArkaSystemPill.vue +54 -0
  21. package/dashboard/app/components/ArkaTrendChart.vue +68 -0
  22. package/dashboard/app/composables/useCountUp.ts +30 -0
  23. package/dashboard/app/composables/useDashboard.ts +2 -1
  24. package/dashboard/app/composables/useTaskStream.ts +39 -0
  25. package/dashboard/app/layouts/default.vue +11 -2
  26. package/dashboard/app/pages/design-lab.vue +257 -0
  27. package/dashboard/app/pages/index.vue +268 -213
  28. package/dashboard/nuxt.config.ts +21 -0
  29. package/dashboard/package.json +1 -0
  30. package/departments/content/skills/video-produce/SKILL.md +9 -1
  31. package/departments/content/skills/video-setup/SKILL.md +15 -4
  32. package/installer/doctor.js +13 -8
  33. package/package.json +1 -1
  34. package/pyproject.toml +1 -1
  35. package/scripts/start-dashboard.sh +3 -1
@@ -27,9 +27,10 @@ const _useDashboard = () => {
27
27
  'g-e': () => router.push('/health'),
28
28
  'g-s': () => router.push('/settings'),
29
29
  'g-r': () => router.push('/trash'),
30
- n: () => contextualNew(),
30
+ 'n': () => contextualNew(),
31
31
  '?': () => { shortcutsHelpOpen.value = !shortcutsHelpOpen.value },
32
32
  '/': () => { searchOpen.value = true },
33
+ 'meta_k': () => { searchOpen.value = true }
33
34
  })
34
35
 
35
36
  return { shortcutsHelpOpen, searchOpen }
@@ -0,0 +1,39 @@
1
+ // Self-contained /ws/tasks subscription (additive — tasks.vue and
2
+ // PersonaWizard keep their own connections). Emits normalized events;
3
+ // silently stays closed on failure so poll-based consumers degrade clean.
4
+ export interface TaskStreamEvent {
5
+ type: 'job_progress' | 'job_complete' | 'job_failed' | 'job_cancelled'
6
+ job_id: string
7
+ message?: string
8
+ progress?: number
9
+ error?: string
10
+ ts: number
11
+ }
12
+
13
+ export function useTaskStream(onEvent: (e: TaskStreamEvent) => void) {
14
+ const { apiBase } = useApi()
15
+ let ws: WebSocket | null = null
16
+
17
+ onMounted(() => {
18
+ try {
19
+ ws = new WebSocket(`${apiBase.replace(/^http/, 'ws')}/ws/tasks`)
20
+ ws.onmessage = (msg) => {
21
+ try {
22
+ const data = JSON.parse(msg.data)
23
+ if (typeof data?.type === 'string' && data.type.startsWith('job_')) {
24
+ onEvent({ ...data, ts: Date.now() })
25
+ }
26
+ } catch {
27
+ // non-JSON frame — ignore
28
+ }
29
+ }
30
+ } catch {
31
+ ws = null
32
+ }
33
+ })
34
+
35
+ onUnmounted(() => {
36
+ ws?.close()
37
+ ws = null
38
+ })
39
+ }
@@ -150,9 +150,11 @@ const links = [[{
150
150
  class="flex items-center w-full"
151
151
  :class="collapsed ? 'justify-center' : 'justify-between gap-2'"
152
152
  >
153
- <div class="flex items-center gap-2">
153
+ <div class="flex items-baseline gap-2">
154
154
  <span class="text-xl font-bold text-primary">A</span>
155
- <span v-if="!collapsed" class="font-semibold">ArkaOS</span>
155
+ <span v-if="!collapsed" class="text-lg">
156
+ <span class="font-semibold">Arka</span><span class="arka-serif-accent text-primary">OS</span>
157
+ </span>
156
158
  </div>
157
159
  <div v-if="!collapsed" class="flex items-center gap-1">
158
160
  <NotificationsBell />
@@ -162,6 +164,7 @@ const links = [[{
162
164
  </template>
163
165
 
164
166
  <template #default="{ collapsed }">
167
+ <ArkaNavGroupLabel v-if="!collapsed" label="workspace" />
165
168
  <UNavigationMenu
166
169
  :collapsed="collapsed"
167
170
  :items="links[0]"
@@ -176,6 +179,7 @@ const links = [[{
176
179
  <!-- PR87d v3.22.0 — quick stats widget above the bottom nav. -->
177
180
  <SidebarStatsWidget v-if="!collapsed" />
178
181
 
182
+ <ArkaNavGroupLabel v-if="!collapsed" label="system" />
179
183
  <UNavigationMenu
180
184
  :collapsed="collapsed"
181
185
  :items="links[1]"
@@ -184,8 +188,13 @@ const links = [[{
184
188
  :class="collapsed ? 'mt-auto' : ''"
185
189
  />
186
190
  </template>
191
+
192
+ <template #footer="{ collapsed }">
193
+ <ArkaSystemPill v-if="!collapsed" class="w-full justify-center" />
194
+ </template>
187
195
  </UDashboardSidebar>
188
196
 
197
+ <ArkaStarfield />
189
198
  <slot />
190
199
  <KeyboardShortcutsHelp />
191
200
  <GlobalSearch />
@@ -0,0 +1,257 @@
1
+ <script setup lang="ts">
2
+ // Internal reference page for the ArkaOS Pulse design system.
3
+ // Every visual decision on this page comes from tokens in main.css —
4
+ // if something here needs a hardcoded value, the token set is incomplete.
5
+ const surfaces = [
6
+ { name: 'bg', varName: '--ui-bg', role: 'Page void' },
7
+ { name: 'bg-muted', varName: '--ui-bg-muted', role: 'Quiet sections' },
8
+ { name: 'bg-elevated', varName: '--ui-bg-elevated', role: 'Cards, panels' },
9
+ { name: 'bg-accented', varName: '--ui-bg-accented', role: 'Hover, selection' }
10
+ ]
11
+
12
+ const arkaScale = [50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950]
13
+
14
+ const semantics = [
15
+ { label: 'live', class: 'bg-primary', meaning: 'Alive — live data, primary action' },
16
+ { label: 'warning', class: 'bg-warning', meaning: 'Degraded, needs attention' },
17
+ { label: 'error', class: 'bg-error', meaning: 'Failed, blocked' },
18
+ { label: 'info', class: 'bg-info', meaning: 'Secondary data voice' }
19
+ ]
20
+
21
+ const typeScale = [
22
+ { size: 'text-4xl', px: '36', use: 'Page title', font: 'font-display' },
23
+ { size: 'text-2xl', px: '24', use: 'Section heading', font: 'font-display' },
24
+ { size: 'text-lg', px: '18', use: 'Card heading', font: 'font-display' },
25
+ { size: 'text-base', px: '16', use: 'Body', font: 'font-sans' },
26
+ { size: 'text-sm', px: '14', use: 'Secondary body', font: 'font-sans' },
27
+ { size: 'text-xs', px: '12', use: 'Metadata', font: 'font-sans' }
28
+ ]
29
+
30
+ const liveAgents = [
31
+ { name: 'Paulo', dept: 'dev', status: 'executing', tasks: 12 },
32
+ { name: 'Valentina', dept: 'brand', status: 'reviewing', tasks: 4 },
33
+ { name: 'Marta', dept: 'quality', status: 'gate', tasks: 7 }
34
+ ]
35
+
36
+ const streamKey = ref(0)
37
+ </script>
38
+
39
+ <template>
40
+ <UDashboardPanel id="design-lab">
41
+ <template #header>
42
+ <UDashboardNavbar title="Design Lab">
43
+ <template #leading>
44
+ <UDashboardSidebarCollapse />
45
+ </template>
46
+ <template #trailing>
47
+ <span class="arka-data text-xs text-muted">pulse · v1</span>
48
+ </template>
49
+ </UDashboardNavbar>
50
+ </template>
51
+ <template #body>
52
+ <div class="mx-auto w-full max-w-5xl space-y-16 py-6">
53
+ <!-- Hero: the system introducing itself in its own vernacular -->
54
+ <header class="space-y-4">
55
+ <p class="arka-eyebrow">
56
+ arka://design-system · v1
57
+ </p>
58
+ <h1 class="font-display text-4xl font-bold tracking-tight">
59
+ ArkaOS Pulse
60
+ </h1>
61
+ <p class="max-w-2xl text-muted">
62
+ The dashboard is a living system: green means alive, motion means
63
+ data arriving, and silence means rest. Dark is the flagship mode.
64
+ </p>
65
+ <div class="arka-pulse-line max-w-2xl" aria-hidden="true" />
66
+ </header>
67
+
68
+ <!-- Surfaces -->
69
+ <section class="space-y-4">
70
+ <p class="arka-eyebrow">
71
+ surfaces
72
+ </p>
73
+ <div class="grid grid-cols-2 gap-3 sm:grid-cols-4">
74
+ <div
75
+ v-for="s in surfaces"
76
+ :key="s.name"
77
+ class="rounded-lg border border-default p-4"
78
+ :style="{ background: `var(${s.varName})` }"
79
+ >
80
+ <span class="arka-data block text-xs text-muted">{{ s.varName }}</span>
81
+ <span class="mt-6 block text-sm">{{ s.role }}</span>
82
+ </div>
83
+ </div>
84
+ </section>
85
+
86
+ <!-- Brand scale -->
87
+ <section class="space-y-4">
88
+ <p class="arka-eyebrow">
89
+ arka · signal green
90
+ </p>
91
+ <div class="flex overflow-hidden rounded-lg border border-default">
92
+ <div
93
+ v-for="step in arkaScale"
94
+ :key="step"
95
+ class="flex h-20 min-w-0 flex-1 items-end justify-center pb-2"
96
+ :style="{ background: `var(--color-arka-${step})` }"
97
+ >
98
+ <span
99
+ class="arka-data text-[10px]"
100
+ :class="step < 500 ? 'text-carbon-950' : 'text-carbon-50'"
101
+ >{{ step }}</span>
102
+ </div>
103
+ </div>
104
+ <div class="grid gap-2 sm:grid-cols-2">
105
+ <div
106
+ v-for="s in semantics"
107
+ :key="s.label"
108
+ class="flex items-center gap-3 rounded-lg border border-default bg-elevated p-3"
109
+ >
110
+ <span class="size-3 rounded-full" :class="s.class" />
111
+ <span class="arka-data text-xs uppercase">{{ s.label }}</span>
112
+ <span class="text-sm text-muted">{{ s.meaning }}</span>
113
+ </div>
114
+ </div>
115
+ </section>
116
+
117
+ <!-- Typography -->
118
+ <section class="space-y-4">
119
+ <p class="arka-eyebrow">
120
+ typography
121
+ </p>
122
+ <div class="space-y-3 rounded-lg border border-default bg-elevated p-6">
123
+ <div
124
+ v-for="t in typeScale"
125
+ :key="t.size"
126
+ class="flex items-baseline gap-6 border-b border-muted pb-3 last:border-0 last:pb-0"
127
+ >
128
+ <span class="arka-data w-10 shrink-0 text-xs text-muted">{{ t.px }}</span>
129
+ <span :class="[t.size, t.font]" class="truncate">
130
+ Agents ship, gates verify
131
+ </span>
132
+ <span class="ml-auto shrink-0 text-xs text-muted">{{ t.use }}</span>
133
+ </div>
134
+ <p class="arka-data pt-2 text-sm">
135
+ data: 86 agents · 17 departments · uptime 99.98% · 142,842 tokens
136
+ </p>
137
+ </div>
138
+ </section>
139
+
140
+ <!-- Motion -->
141
+ <section class="space-y-4">
142
+ <p class="arka-eyebrow">
143
+ motion · one rhythm
144
+ </p>
145
+ <div class="grid gap-3 sm:grid-cols-3">
146
+ <UCard>
147
+ <div class="flex items-center gap-3">
148
+ <span class="arka-live-dot" />
149
+ <div>
150
+ <p class="text-sm font-medium">
151
+ Pulse
152
+ </p>
153
+ <p class="text-xs text-muted">
154
+ Only what is live may breathe
155
+ </p>
156
+ </div>
157
+ </div>
158
+ </UCard>
159
+ <UCard>
160
+ <div class="space-y-2">
161
+ <p class="text-sm font-medium">
162
+ Stream-in
163
+ </p>
164
+ <div :key="streamKey" class="space-y-1">
165
+ <div
166
+ v-for="(a, i) in liveAgents"
167
+ :key="a.name"
168
+ class="arka-stream-in flex items-center gap-2 text-xs"
169
+ :style="{ animationDelay: `calc(var(--arka-stagger-step) * ${i})` }"
170
+ >
171
+ <span class="size-1.5 rounded-full bg-primary" />
172
+ <span>{{ a.name }}</span>
173
+ <span class="arka-data ml-auto text-muted">{{ a.status }}</span>
174
+ </div>
175
+ </div>
176
+ <UButton size="xs" variant="ghost" @click="streamKey++">
177
+ Replay
178
+ </UButton>
179
+ </div>
180
+ </UCard>
181
+ <UCard>
182
+ <div class="space-y-2">
183
+ <p class="text-sm font-medium">
184
+ Durations
185
+ </p>
186
+ <p class="arka-data text-xs text-muted">
187
+ fast 150ms · base 240ms · slow 400ms
188
+ </p>
189
+ <p class="text-xs text-muted">
190
+ Enter decelerates; exit runs at ~65% of enter. Respects reduced motion.
191
+ </p>
192
+ </div>
193
+ </UCard>
194
+ </div>
195
+ </section>
196
+
197
+ <!-- Components in theme -->
198
+ <section class="space-y-4">
199
+ <p class="arka-eyebrow">
200
+ components
201
+ </p>
202
+ <UCard>
203
+ <div class="flex flex-wrap items-center gap-3">
204
+ <UButton>Dispatch agent</UButton>
205
+ <UButton variant="outline">
206
+ Review
207
+ </UButton>
208
+ <UButton variant="ghost">
209
+ Cancel
210
+ </UButton>
211
+ <UButton color="error" variant="soft">
212
+ Stop run
213
+ </UButton>
214
+ <UBadge variant="subtle">
215
+ APPROVED
216
+ </UBadge>
217
+ <UBadge color="warning" variant="subtle">
218
+ PENDING
219
+ </UBadge>
220
+ <USwitch default-value />
221
+ </div>
222
+ </UCard>
223
+ <UCard>
224
+ <template #header>
225
+ <div class="flex items-center gap-3">
226
+ <span class="arka-live-dot" />
227
+ <span class="font-display text-lg font-semibold">Live squad</span>
228
+ <span class="arka-data ml-auto text-xs text-muted">3 active</span>
229
+ </div>
230
+ </template>
231
+ <ul class="divide-y divide-default">
232
+ <li
233
+ v-for="a in liveAgents"
234
+ :key="a.name"
235
+ class="flex items-center gap-4 py-3 first:pt-0 last:pb-0"
236
+ >
237
+ <UAvatar :alt="a.name" size="sm" />
238
+ <div>
239
+ <p class="text-sm font-medium">
240
+ {{ a.name }}
241
+ </p>
242
+ <p class="text-xs text-muted">
243
+ {{ a.dept }}
244
+ </p>
245
+ </div>
246
+ <span class="arka-data ml-auto text-xs">{{ a.tasks }} tasks</span>
247
+ <UBadge variant="subtle" size="sm">
248
+ {{ a.status }}
249
+ </UBadge>
250
+ </li>
251
+ </ul>
252
+ </UCard>
253
+ </section>
254
+ </div>
255
+ </template>
256
+ </UDashboardPanel>
257
+ </template>