sillyspec 3.20.2 → 3.20.4
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/.claude/skills/sillyspec-archive/SKILL.md +21 -21
- package/.claude/skills/sillyspec-auto/SKILL.md +83 -83
- package/.claude/skills/sillyspec-brainstorm/SKILL.md +44 -44
- package/.claude/skills/sillyspec-commit/SKILL.md +106 -106
- package/.claude/skills/sillyspec-continue/SKILL.md +45 -45
- package/.claude/skills/sillyspec-doctor/SKILL.md +31 -31
- package/.claude/skills/sillyspec-execute/SKILL.md +30 -30
- package/.claude/skills/sillyspec-explore/SKILL.md +109 -109
- package/.claude/skills/sillyspec-knowledge/SKILL.md +269 -269
- package/.claude/skills/sillyspec-plan/SKILL.md +21 -21
- package/.claude/skills/sillyspec-propose/SKILL.md +21 -21
- package/.claude/skills/sillyspec-quick/SKILL.md +21 -21
- package/.claude/skills/sillyspec-resume/SKILL.md +68 -68
- package/.claude/skills/sillyspec-scan/SKILL.md +21 -21
- package/.claude/skills/sillyspec-state/SKILL.md +54 -54
- package/.claude/skills/sillyspec-status/SKILL.md +21 -21
- package/.claude/skills/sillyspec-verify/SKILL.md +21 -21
- package/.claude/skills/sillyspec-workspace/SKILL.md +157 -157
- package/.husky/pre-push +13 -13
- package/CLAUDE.md +18 -18
- package/README.md +198 -188
- package/SKILL.md +90 -91
- package/bin/sillyspec.js +2 -2
- package/docs/brainstorm-plan-contract.md +64 -64
- package/docs/plan-execute-contract.md +123 -123
- package/docs/platform-scan-protocol.md +298 -298
- package/docs/revision-mode.md +115 -115
- package/docs/sillyspec/file-lifecycle/known-implementation-gaps.md +99 -99
- package/docs/sillyspec/file-lifecycle/platform-workflows-sync.md +218 -218
- package/docs/sillyspec/file-lifecycle/stage-artifacts.md +167 -167
- package/docs/sillyspec/file-lifecycle/storage-and-state.md +148 -148
- package/docs/sillyspec/file-lifecycle/worktree-and-guard.md +211 -193
- package/docs/sillyspec/file-lifecycle.md +125 -125
- package/docs/workflow-contract-regression.md +106 -106
- package/docs/worktree-isolation.md +252 -252
- package/package.json +40 -40
- package/packages/dashboard/dist/assets/index-Bq_Z2hne.js +7446 -7446
- package/packages/dashboard/dist/assets/index-O2W5RV4z.css +1 -1
- package/packages/dashboard/dist/index.html +16 -16
- package/packages/dashboard/index.html +15 -15
- package/packages/dashboard/package-lock.json +2384 -2384
- package/packages/dashboard/package.json +25 -25
- package/packages/dashboard/server/executor.js +86 -86
- package/packages/dashboard/server/index.js +588 -588
- package/packages/dashboard/server/parser.js +526 -526
- package/packages/dashboard/server/watcher.js +344 -344
- package/packages/dashboard/src/App.vue +558 -558
- package/packages/dashboard/src/components/ActionBar.vue +93 -93
- package/packages/dashboard/src/components/CommandPalette.vue +96 -96
- package/packages/dashboard/src/components/DetailPanel.vue +137 -137
- package/packages/dashboard/src/components/LogStream.vue +65 -65
- package/packages/dashboard/src/components/PipelineStage.vue +95 -95
- package/packages/dashboard/src/components/PipelineView.vue +156 -156
- package/packages/dashboard/src/components/ProjectList.vue +210 -210
- package/packages/dashboard/src/components/StageBadge.vue +67 -67
- package/packages/dashboard/src/components/StepCard.vue +94 -94
- package/packages/dashboard/src/components/detail/DocsDetail.vue +48 -48
- package/packages/dashboard/src/components/detail/GitDetail.vue +61 -61
- package/packages/dashboard/src/components/detail/TechDetail.vue +43 -43
- package/packages/dashboard/src/composables/useDashboard.js +170 -170
- package/packages/dashboard/src/composables/useKeyboard.js +119 -119
- package/packages/dashboard/src/composables/useWebSocket.js +129 -129
- package/packages/dashboard/src/main.js +8 -8
- package/packages/dashboard/src/style.css +132 -132
- package/packages/dashboard/vite.config.js +18 -18
- package/src/brainstorm-postcheck.js +158 -158
- package/src/change-list.js +52 -52
- package/src/change-risk-profile.js +352 -352
- package/src/classify-change.js +73 -73
- package/src/constants.js +70 -70
- package/src/contract-matrix.js +278 -278
- package/src/db.js +201 -201
- package/src/endpoint-extractor.js +315 -315
- package/src/hooks/claude-pre-tool-use.cjs +125 -125
- package/src/hooks/worktree-guard.js +653 -653
- package/src/index.js +922 -900
- package/src/init.js +431 -431
- package/src/knowledge-match.js +130 -130
- package/src/migrate.js +117 -117
- package/src/modules.js +482 -482
- package/src/progress.js +1734 -1734
- package/src/run.js +3465 -3358
- package/src/scan-postcheck.js +387 -383
- package/src/setup.js +398 -398
- package/src/stage-contract.js +700 -700
- package/src/stages/archive.js +160 -160
- package/src/stages/brainstorm-auto.js +229 -229
- package/src/stages/brainstorm.js +645 -645
- package/src/stages/doctor.js +365 -365
- package/src/stages/execute.js +625 -625
- package/src/stages/explore.js +34 -34
- package/src/stages/index.js +29 -29
- package/src/stages/knowledge.js +498 -498
- package/src/stages/plan-postcheck.js +511 -513
- package/src/stages/plan.js +582 -582
- package/src/stages/propose.js +174 -174
- package/src/stages/quick.js +82 -82
- package/src/stages/scan.js +558 -558
- package/src/stages/status.js +65 -65
- package/src/stages/verify.js +322 -322
- package/src/sync.js +497 -497
- package/src/task-review.js +346 -346
- package/src/workflow.js +785 -785
- package/src/worktree-apply.js +549 -549
- package/src/worktree-deps.js +185 -0
- package/src/worktree.js +982 -932
- package/templates/workflows/archive-impact.yaml +79 -79
- package/templates/workflows/scan-docs.yaml +132 -132
- package/test/brainstorm-plan-contract.test.mjs +273 -273
- package/test/check-syntax.mjs +26 -26
- package/test/contract-artifacts.test.mjs +323 -323
- package/test/decision-supersede.test.mjs +277 -277
- package/test/knowledge-match.test.mjs +231 -231
- package/test/plan-execute-contract.test.mjs +330 -330
- package/test/plan-optimization.test.mjs +572 -572
- package/test/platform-artifacts.test.mjs +166 -166
- package/test/platform-failure-samples.test.mjs +199 -199
- package/test/platform-recovery-chain.test.mjs +167 -167
- package/test/platform-recovery.test.mjs +136 -136
- package/test/platform-scan-p0.test.mjs +168 -168
- package/test/revision-v1.test.mjs +1145 -1145
- package/test/run-scan-project-parse.test.mjs +200 -200
- package/test/run-tests.mjs +48 -48
- package/test/scan-knowledge.test.mjs +175 -175
- package/test/scan-paths.test.mjs +68 -68
- package/test/scan-postcheck.test.mjs +197 -197
- package/test/spec-dir.test.mjs +206 -206
- package/test/stage-contract.test.mjs +299 -299
- package/test/stage-definitions.test.mjs +39 -39
- package/test/wait-gates.test.mjs +496 -496
- package/test/worktree-deps-provision.test.mjs +148 -0
- package/test/worktree-guard.test.mjs +71 -71
- package/test/worktree-native-overlay.test.mjs +188 -188
|
@@ -1,129 +1,129 @@
|
|
|
1
|
-
import { ref, onMounted, onUnmounted } from 'vue'
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* WebSocket connection composable with auto-reconnect
|
|
5
|
-
* @returns {object} WebSocket API
|
|
6
|
-
*/
|
|
7
|
-
export function useWebSocket() {
|
|
8
|
-
const ws = ref(null)
|
|
9
|
-
const connected = ref(false)
|
|
10
|
-
const reconnectTimeout = ref(null)
|
|
11
|
-
const handlers = new Map()
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Connect to WebSocket server
|
|
15
|
-
*/
|
|
16
|
-
function connect() {
|
|
17
|
-
const protocol = location.protocol === 'https:' ? 'wss:' : 'ws:'
|
|
18
|
-
const wsUrl = `${protocol}//${location.host}`
|
|
19
|
-
|
|
20
|
-
ws.value = new WebSocket(wsUrl)
|
|
21
|
-
|
|
22
|
-
ws.value.onopen = () => {
|
|
23
|
-
connected.value = true
|
|
24
|
-
console.log('WebSocket connected')
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
ws.value.onclose = () => {
|
|
28
|
-
connected.value = false
|
|
29
|
-
console.log('WebSocket disconnected, reconnecting in 3s...')
|
|
30
|
-
|
|
31
|
-
// Auto-reconnect after 3 seconds
|
|
32
|
-
reconnectTimeout.value = setTimeout(() => {
|
|
33
|
-
connect()
|
|
34
|
-
}, 3000)
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
ws.value.onerror = (err) => {
|
|
38
|
-
console.error('WebSocket error:', err)
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
ws.value.onmessage = (event) => {
|
|
42
|
-
try {
|
|
43
|
-
const message = JSON.parse(event.data)
|
|
44
|
-
const { type, data } = message
|
|
45
|
-
|
|
46
|
-
// Call registered handlers for this message type
|
|
47
|
-
const typeHandlers = handlers.get(type) || []
|
|
48
|
-
typeHandlers.forEach(handler => handler(data))
|
|
49
|
-
|
|
50
|
-
// Call wildcard handlers
|
|
51
|
-
const wildcardHandlers = handlers.get('*') || []
|
|
52
|
-
wildcardHandlers.forEach(handler => handler(message))
|
|
53
|
-
} catch (err) {
|
|
54
|
-
console.error('Error parsing WebSocket message:', err)
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* Register event handler for a message type
|
|
61
|
-
* @param {string} type - Message type
|
|
62
|
-
* @param {function} handler - Handler function
|
|
63
|
-
* @returns {function} Unsubscribe function
|
|
64
|
-
*/
|
|
65
|
-
function on(type, handler) {
|
|
66
|
-
if (!handlers.has(type)) {
|
|
67
|
-
handlers.set(type, [])
|
|
68
|
-
}
|
|
69
|
-
handlers.get(type).push(handler)
|
|
70
|
-
|
|
71
|
-
// Return unsubscribe function
|
|
72
|
-
return () => {
|
|
73
|
-
const typeHandlers = handlers.get(type)
|
|
74
|
-
if (typeHandlers) {
|
|
75
|
-
const index = typeHandlers.indexOf(handler)
|
|
76
|
-
if (index > -1) {
|
|
77
|
-
typeHandlers.splice(index, 1)
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
/**
|
|
84
|
-
* Send message to server
|
|
85
|
-
* @param {object} data - Message data
|
|
86
|
-
*/
|
|
87
|
-
function send(data) {
|
|
88
|
-
if (ws.value && connected.value) {
|
|
89
|
-
ws.value.send(JSON.stringify(data))
|
|
90
|
-
} else {
|
|
91
|
-
console.warn('Cannot send message: WebSocket not connected')
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
/**
|
|
96
|
-
* Disconnect WebSocket
|
|
97
|
-
*/
|
|
98
|
-
function disconnect() {
|
|
99
|
-
if (reconnectTimeout.value) {
|
|
100
|
-
clearTimeout(reconnectTimeout.value)
|
|
101
|
-
reconnectTimeout.value = null
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
if (ws.value) {
|
|
105
|
-
ws.value.close()
|
|
106
|
-
ws.value = null
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
connected.value = false
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
// Auto-connect on mount
|
|
113
|
-
onMounted(() => {
|
|
114
|
-
connect()
|
|
115
|
-
})
|
|
116
|
-
|
|
117
|
-
// Cleanup on unmount
|
|
118
|
-
onUnmounted(() => {
|
|
119
|
-
disconnect()
|
|
120
|
-
})
|
|
121
|
-
|
|
122
|
-
return {
|
|
123
|
-
connected,
|
|
124
|
-
on,
|
|
125
|
-
send,
|
|
126
|
-
disconnect,
|
|
127
|
-
reconnect: connect
|
|
128
|
-
}
|
|
129
|
-
}
|
|
1
|
+
import { ref, onMounted, onUnmounted } from 'vue'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* WebSocket connection composable with auto-reconnect
|
|
5
|
+
* @returns {object} WebSocket API
|
|
6
|
+
*/
|
|
7
|
+
export function useWebSocket() {
|
|
8
|
+
const ws = ref(null)
|
|
9
|
+
const connected = ref(false)
|
|
10
|
+
const reconnectTimeout = ref(null)
|
|
11
|
+
const handlers = new Map()
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Connect to WebSocket server
|
|
15
|
+
*/
|
|
16
|
+
function connect() {
|
|
17
|
+
const protocol = location.protocol === 'https:' ? 'wss:' : 'ws:'
|
|
18
|
+
const wsUrl = `${protocol}//${location.host}`
|
|
19
|
+
|
|
20
|
+
ws.value = new WebSocket(wsUrl)
|
|
21
|
+
|
|
22
|
+
ws.value.onopen = () => {
|
|
23
|
+
connected.value = true
|
|
24
|
+
console.log('WebSocket connected')
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
ws.value.onclose = () => {
|
|
28
|
+
connected.value = false
|
|
29
|
+
console.log('WebSocket disconnected, reconnecting in 3s...')
|
|
30
|
+
|
|
31
|
+
// Auto-reconnect after 3 seconds
|
|
32
|
+
reconnectTimeout.value = setTimeout(() => {
|
|
33
|
+
connect()
|
|
34
|
+
}, 3000)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
ws.value.onerror = (err) => {
|
|
38
|
+
console.error('WebSocket error:', err)
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
ws.value.onmessage = (event) => {
|
|
42
|
+
try {
|
|
43
|
+
const message = JSON.parse(event.data)
|
|
44
|
+
const { type, data } = message
|
|
45
|
+
|
|
46
|
+
// Call registered handlers for this message type
|
|
47
|
+
const typeHandlers = handlers.get(type) || []
|
|
48
|
+
typeHandlers.forEach(handler => handler(data))
|
|
49
|
+
|
|
50
|
+
// Call wildcard handlers
|
|
51
|
+
const wildcardHandlers = handlers.get('*') || []
|
|
52
|
+
wildcardHandlers.forEach(handler => handler(message))
|
|
53
|
+
} catch (err) {
|
|
54
|
+
console.error('Error parsing WebSocket message:', err)
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Register event handler for a message type
|
|
61
|
+
* @param {string} type - Message type
|
|
62
|
+
* @param {function} handler - Handler function
|
|
63
|
+
* @returns {function} Unsubscribe function
|
|
64
|
+
*/
|
|
65
|
+
function on(type, handler) {
|
|
66
|
+
if (!handlers.has(type)) {
|
|
67
|
+
handlers.set(type, [])
|
|
68
|
+
}
|
|
69
|
+
handlers.get(type).push(handler)
|
|
70
|
+
|
|
71
|
+
// Return unsubscribe function
|
|
72
|
+
return () => {
|
|
73
|
+
const typeHandlers = handlers.get(type)
|
|
74
|
+
if (typeHandlers) {
|
|
75
|
+
const index = typeHandlers.indexOf(handler)
|
|
76
|
+
if (index > -1) {
|
|
77
|
+
typeHandlers.splice(index, 1)
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Send message to server
|
|
85
|
+
* @param {object} data - Message data
|
|
86
|
+
*/
|
|
87
|
+
function send(data) {
|
|
88
|
+
if (ws.value && connected.value) {
|
|
89
|
+
ws.value.send(JSON.stringify(data))
|
|
90
|
+
} else {
|
|
91
|
+
console.warn('Cannot send message: WebSocket not connected')
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Disconnect WebSocket
|
|
97
|
+
*/
|
|
98
|
+
function disconnect() {
|
|
99
|
+
if (reconnectTimeout.value) {
|
|
100
|
+
clearTimeout(reconnectTimeout.value)
|
|
101
|
+
reconnectTimeout.value = null
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
if (ws.value) {
|
|
105
|
+
ws.value.close()
|
|
106
|
+
ws.value = null
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
connected.value = false
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// Auto-connect on mount
|
|
113
|
+
onMounted(() => {
|
|
114
|
+
connect()
|
|
115
|
+
})
|
|
116
|
+
|
|
117
|
+
// Cleanup on unmount
|
|
118
|
+
onUnmounted(() => {
|
|
119
|
+
disconnect()
|
|
120
|
+
})
|
|
121
|
+
|
|
122
|
+
return {
|
|
123
|
+
connected,
|
|
124
|
+
on,
|
|
125
|
+
send,
|
|
126
|
+
disconnect,
|
|
127
|
+
reconnect: connect
|
|
128
|
+
}
|
|
129
|
+
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { createApp } from 'vue'
|
|
2
|
-
import naive from 'naive-ui'
|
|
3
|
-
import App from './App.vue'
|
|
4
|
-
import './style.css'
|
|
5
|
-
|
|
6
|
-
const app = createApp(App)
|
|
7
|
-
app.use(naive)
|
|
8
|
-
app.mount('#app')
|
|
1
|
+
import { createApp } from 'vue'
|
|
2
|
+
import naive from 'naive-ui'
|
|
3
|
+
import App from './App.vue'
|
|
4
|
+
import './style.css'
|
|
5
|
+
|
|
6
|
+
const app = createApp(App)
|
|
7
|
+
app.use(naive)
|
|
8
|
+
app.mount('#app')
|
|
@@ -1,132 +1,132 @@
|
|
|
1
|
-
@import "tailwindcss";
|
|
2
|
-
|
|
3
|
-
@theme {
|
|
4
|
-
--color-bg: #F5F5F7;
|
|
5
|
-
--color-primary: #D97706;
|
|
6
|
-
--color-primary-dim: #92400E;
|
|
7
|
-
--color-warning: #EA580C;
|
|
8
|
-
--color-danger: #DC2626;
|
|
9
|
-
--color-muted: #6B7280;
|
|
10
|
-
--color-surface: #FFFFFF;
|
|
11
|
-
--color-surface-2: #F0F0F3;
|
|
12
|
-
--color-border: #E5E5EA;
|
|
13
|
-
--color-border-light: #D1D1D6;
|
|
14
|
-
--color-text: #1C1C1E;
|
|
15
|
-
--color-text-secondary: #636366;
|
|
16
|
-
--color-info: #2563EB;
|
|
17
|
-
--color-success: #16A34A;
|
|
18
|
-
|
|
19
|
-
--font-display: 'JetBrains Mono', monospace;
|
|
20
|
-
--font-body: 'DM Sans', sans-serif;
|
|
21
|
-
|
|
22
|
-
--animate-pulse-glow: pulse-glow 2s ease-in-out infinite;
|
|
23
|
-
--animate-pulse-dot: pulse-dot 1.5s ease-in-out infinite;
|
|
24
|
-
--animate-breathe: breathe 3s ease-in-out infinite;
|
|
25
|
-
--animate-shimmer: shimmer 2s linear infinite;
|
|
26
|
-
--animate-slide-in: slide-in 300ms cubic-bezier(0.16, 1, 0.3, 1);
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
@keyframes pulse-glow {
|
|
30
|
-
0%, 100% { box-shadow: 0 0 0 0 rgba(251, 191, 36, 0.4); }
|
|
31
|
-
50% { box-shadow: 0 0 12px 2px rgba(251, 191, 36, 0.15); }
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
@keyframes pulse-dot {
|
|
35
|
-
0%, 100% { opacity: 1; transform: scale(1); }
|
|
36
|
-
50% { opacity: 0.4; transform: scale(1.5); }
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
@keyframes breathe {
|
|
40
|
-
0%, 100% { opacity: 0.5; }
|
|
41
|
-
50% { opacity: 1; }
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
@keyframes shimmer {
|
|
45
|
-
0% { background-position: -200% 0; }
|
|
46
|
-
100% { background-position: 200% 0; }
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
@keyframes slide-in {
|
|
50
|
-
from { opacity: 0; transform: translateY(6px); }
|
|
51
|
-
to { opacity: 1; transform: translateY(0); }
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
@keyframes glow-border {
|
|
55
|
-
0%, 100% { border-color: rgba(251, 191, 36, 0.15); }
|
|
56
|
-
50% { border-color: rgba(251, 191, 36, 0.5); }
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
@keyframes float {
|
|
60
|
-
0%, 100% { transform: translateY(0px); }
|
|
61
|
-
50% { transform: translateY(-3px); }
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
.font-mono-log {
|
|
65
|
-
font-family: 'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
/* Noise texture background */
|
|
69
|
-
.noise-bg {
|
|
70
|
-
position: relative;
|
|
71
|
-
}
|
|
72
|
-
.noise-bg::before {
|
|
73
|
-
content: '';
|
|
74
|
-
position: absolute;
|
|
75
|
-
inset: 0;
|
|
76
|
-
background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.03'/%3E%3C/svg%3E");
|
|
77
|
-
pointer-events: none;
|
|
78
|
-
z-index: 0;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
/* Diagonal accent stripe */
|
|
82
|
-
.accent-stripe {
|
|
83
|
-
background: repeating-linear-gradient(
|
|
84
|
-
-45deg,
|
|
85
|
-
transparent,
|
|
86
|
-
transparent 8px,
|
|
87
|
-
rgba(251, 191, 36, 0.03) 8px,
|
|
88
|
-
rgba(251, 191, 36, 0.03) 9px
|
|
89
|
-
);
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
/* Progress bar */
|
|
93
|
-
.progress-gradient {
|
|
94
|
-
background: linear-gradient(90deg, #FBBF24, #F59E0B, #FB923C);
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
/* Skeleton shimmer */
|
|
98
|
-
.skeleton-shimmer {
|
|
99
|
-
background: linear-gradient(90deg, #1A1E28 25%, #2A3040 50%, #1A1E28 75%);
|
|
100
|
-
background-size: 200% 100%;
|
|
101
|
-
animation: shimmer 1.5s ease-in-out infinite;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
/* Scrollbar */
|
|
105
|
-
::-webkit-scrollbar {
|
|
106
|
-
width: 5px;
|
|
107
|
-
height: 5px;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
::-webkit-scrollbar-track {
|
|
111
|
-
background: transparent;
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
::-webkit-scrollbar-thumb {
|
|
115
|
-
background: #2A3040;
|
|
116
|
-
border-radius: 10px;
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
::-webkit-scrollbar-thumb:hover {
|
|
120
|
-
background: #3A4555;
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
* {
|
|
124
|
-
scrollbar-width: thin;
|
|
125
|
-
scrollbar-color: #2A2A2D transparent;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
/* Selection */
|
|
129
|
-
::selection {
|
|
130
|
-
background: rgba(251, 191, 36, 0.2);
|
|
131
|
-
color: #FBBF24;
|
|
132
|
-
}
|
|
1
|
+
@import "tailwindcss";
|
|
2
|
+
|
|
3
|
+
@theme {
|
|
4
|
+
--color-bg: #F5F5F7;
|
|
5
|
+
--color-primary: #D97706;
|
|
6
|
+
--color-primary-dim: #92400E;
|
|
7
|
+
--color-warning: #EA580C;
|
|
8
|
+
--color-danger: #DC2626;
|
|
9
|
+
--color-muted: #6B7280;
|
|
10
|
+
--color-surface: #FFFFFF;
|
|
11
|
+
--color-surface-2: #F0F0F3;
|
|
12
|
+
--color-border: #E5E5EA;
|
|
13
|
+
--color-border-light: #D1D1D6;
|
|
14
|
+
--color-text: #1C1C1E;
|
|
15
|
+
--color-text-secondary: #636366;
|
|
16
|
+
--color-info: #2563EB;
|
|
17
|
+
--color-success: #16A34A;
|
|
18
|
+
|
|
19
|
+
--font-display: 'JetBrains Mono', monospace;
|
|
20
|
+
--font-body: 'DM Sans', sans-serif;
|
|
21
|
+
|
|
22
|
+
--animate-pulse-glow: pulse-glow 2s ease-in-out infinite;
|
|
23
|
+
--animate-pulse-dot: pulse-dot 1.5s ease-in-out infinite;
|
|
24
|
+
--animate-breathe: breathe 3s ease-in-out infinite;
|
|
25
|
+
--animate-shimmer: shimmer 2s linear infinite;
|
|
26
|
+
--animate-slide-in: slide-in 300ms cubic-bezier(0.16, 1, 0.3, 1);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
@keyframes pulse-glow {
|
|
30
|
+
0%, 100% { box-shadow: 0 0 0 0 rgba(251, 191, 36, 0.4); }
|
|
31
|
+
50% { box-shadow: 0 0 12px 2px rgba(251, 191, 36, 0.15); }
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
@keyframes pulse-dot {
|
|
35
|
+
0%, 100% { opacity: 1; transform: scale(1); }
|
|
36
|
+
50% { opacity: 0.4; transform: scale(1.5); }
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
@keyframes breathe {
|
|
40
|
+
0%, 100% { opacity: 0.5; }
|
|
41
|
+
50% { opacity: 1; }
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
@keyframes shimmer {
|
|
45
|
+
0% { background-position: -200% 0; }
|
|
46
|
+
100% { background-position: 200% 0; }
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
@keyframes slide-in {
|
|
50
|
+
from { opacity: 0; transform: translateY(6px); }
|
|
51
|
+
to { opacity: 1; transform: translateY(0); }
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
@keyframes glow-border {
|
|
55
|
+
0%, 100% { border-color: rgba(251, 191, 36, 0.15); }
|
|
56
|
+
50% { border-color: rgba(251, 191, 36, 0.5); }
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
@keyframes float {
|
|
60
|
+
0%, 100% { transform: translateY(0px); }
|
|
61
|
+
50% { transform: translateY(-3px); }
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
.font-mono-log {
|
|
65
|
+
font-family: 'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/* Noise texture background */
|
|
69
|
+
.noise-bg {
|
|
70
|
+
position: relative;
|
|
71
|
+
}
|
|
72
|
+
.noise-bg::before {
|
|
73
|
+
content: '';
|
|
74
|
+
position: absolute;
|
|
75
|
+
inset: 0;
|
|
76
|
+
background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.03'/%3E%3C/svg%3E");
|
|
77
|
+
pointer-events: none;
|
|
78
|
+
z-index: 0;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/* Diagonal accent stripe */
|
|
82
|
+
.accent-stripe {
|
|
83
|
+
background: repeating-linear-gradient(
|
|
84
|
+
-45deg,
|
|
85
|
+
transparent,
|
|
86
|
+
transparent 8px,
|
|
87
|
+
rgba(251, 191, 36, 0.03) 8px,
|
|
88
|
+
rgba(251, 191, 36, 0.03) 9px
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/* Progress bar */
|
|
93
|
+
.progress-gradient {
|
|
94
|
+
background: linear-gradient(90deg, #FBBF24, #F59E0B, #FB923C);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/* Skeleton shimmer */
|
|
98
|
+
.skeleton-shimmer {
|
|
99
|
+
background: linear-gradient(90deg, #1A1E28 25%, #2A3040 50%, #1A1E28 75%);
|
|
100
|
+
background-size: 200% 100%;
|
|
101
|
+
animation: shimmer 1.5s ease-in-out infinite;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/* Scrollbar */
|
|
105
|
+
::-webkit-scrollbar {
|
|
106
|
+
width: 5px;
|
|
107
|
+
height: 5px;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
::-webkit-scrollbar-track {
|
|
111
|
+
background: transparent;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
::-webkit-scrollbar-thumb {
|
|
115
|
+
background: #2A3040;
|
|
116
|
+
border-radius: 10px;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
::-webkit-scrollbar-thumb:hover {
|
|
120
|
+
background: #3A4555;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
* {
|
|
124
|
+
scrollbar-width: thin;
|
|
125
|
+
scrollbar-color: #2A2A2D transparent;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/* Selection */
|
|
129
|
+
::selection {
|
|
130
|
+
background: rgba(251, 191, 36, 0.2);
|
|
131
|
+
color: #FBBF24;
|
|
132
|
+
}
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
import vue from '@vitejs/plugin-vue'
|
|
2
|
-
import tailwindcss from '@tailwindcss/vite'
|
|
3
|
-
import { resolve } from 'path'
|
|
4
|
-
|
|
5
|
-
export default {
|
|
6
|
-
plugins: [vue(), tailwindcss()],
|
|
7
|
-
build: {
|
|
8
|
-
outDir: 'dist'
|
|
9
|
-
},
|
|
10
|
-
server: {
|
|
11
|
-
port: 3456
|
|
12
|
-
},
|
|
13
|
-
resolve: {
|
|
14
|
-
alias: {
|
|
15
|
-
'@': resolve(__dirname, 'src')
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
}
|
|
1
|
+
import vue from '@vitejs/plugin-vue'
|
|
2
|
+
import tailwindcss from '@tailwindcss/vite'
|
|
3
|
+
import { resolve } from 'path'
|
|
4
|
+
|
|
5
|
+
export default {
|
|
6
|
+
plugins: [vue(), tailwindcss()],
|
|
7
|
+
build: {
|
|
8
|
+
outDir: 'dist'
|
|
9
|
+
},
|
|
10
|
+
server: {
|
|
11
|
+
port: 3456
|
|
12
|
+
},
|
|
13
|
+
resolve: {
|
|
14
|
+
alias: {
|
|
15
|
+
'@': resolve(__dirname, 'src')
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|