Skip to content

Commit a654986

Browse files
alari76claude
andcommitted
update CLAUDE.md to disable auto-deploy, keep auto build/commit/push
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 6a82b97 commit a654986

5 files changed

Lines changed: 60 additions & 40 deletions

File tree

CLAUDE.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ The deploy script:
2727
3. Restarts the cc-web WebSocket server on the configured port
2828

2929
**Important**: Always run `npm run build` before deploying if you changed frontend code, so the dist/ is up to date.
30-
**Important**: After completing any code change, always build, commit with a descriptive message, `git push`, then run `./.codekin/scripts/deploy.sh`. Do not wait for the user to ask. Deploy must be last because it restarts the server and terminates the current process.
30+
**Important**: After completing any code change, always build, commit with a descriptive message, and `git push`. Do not wait for the user to ask. Do **not** auto-deploy — only deploy when the user explicitly requests it.
3131

3232
## Key Directories
3333

src/components/LeftSidebar.tsx

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,6 @@ function buildRepoNodes(
9898
): RepoNode[] {
9999
const map = new Map<string, Session[]>()
100100
for (const s of sessions) {
101-
if (s.source === 'workflow') continue // workflow sessions shown separately
102101
const key = groupKey(s)
103102
const list = map.get(key) ?? []
104103
list.push(s)
@@ -566,9 +565,9 @@ function RepoSection({
566565
}`}
567566
>
568567
{s.source === 'workflow'
569-
? <IconSparkles size={12} className="flex-shrink-0 opacity-60" />
568+
? <IconSparkles size={12} className={`flex-shrink-0 ${dotColor.replace(/bg-/g, 'text-')}`} />
570569
: s.source === 'webhook'
571-
? <IconRobot size={12} className="flex-shrink-0 opacity-60" />
570+
? <IconRobot size={12} className={`flex-shrink-0 ${dotColor.replace(/bg-/g, 'text-')}`} />
572571
: <span className={`inline-block h-1.5 w-1.5 rounded-full flex-shrink-0 ${dotColor}`} />
573572
}
574573
{isEditing ? (

src/components/SessionBar.tsx

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
* Tabs can be closed to remove all sessions for that repo.
88
*/
99

10-
import { IconTimeline } from '@tabler/icons-react'
1110
import type { Session } from '../types'
1211

1312
interface Props {
@@ -63,21 +62,10 @@ function groupByRepo(sessions: Session[], waitingSessions: Record<string, boolea
6362
export function SessionBar({ sessions, waitingSessions, tentativeQueues, onSelectRepo, onDeleteRepo, activeWorkingDir }: Props) {
6463
if (sessions.length === 0) return null
6564

66-
const workflowSessions = sessions.filter(s => s.source === 'workflow')
67-
const regularSessions = sessions.filter(s => s.source !== 'workflow')
68-
const groups = groupByRepo(regularSessions, waitingSessions, tentativeQueues ?? {})
69-
70-
const workflowCount = workflowSessions.length
71-
const hasActiveWorkflow = workflowSessions.some(s => s.active)
65+
const groups = groupByRepo(sessions, waitingSessions, tentativeQueues ?? {})
7266

7367
return (
7468
<div className="flex items-center gap-1 overflow-x-auto pl-4">
75-
{workflowCount > 0 && (
76-
<span className="flex items-center gap-1 rounded px-2 py-1 text-[13px] text-neutral-4 border border-transparent">
77-
<IconTimeline size={14} stroke={2} />
78-
<span className={hasActiveWorkflow ? 'text-accent-3' : ''}>{workflowCount}</span>
79-
</span>
80-
)}
8169
{groups.map(g => {
8270
const isActive = g.workingDir === activeWorkingDir
8371
return (

src/components/SessionList.tsx

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,32 @@ function compactAge(created: string): string {
3737
return `${days}d`
3838
}
3939

40+
/** Returns [textColorClass, animationClass] for session state indicators */
41+
function sessionStateClasses(
42+
s: Session,
43+
waitingSessions: Record<string, boolean>,
44+
tentativeQueues?: Record<string, string[]>,
45+
): [string, string] {
46+
if ((tentativeQueues?.[s.id]?.length ?? 0) > 0) return ['text-accent-6', 'animate-pulse']
47+
if (waitingSessions[s.id]) return ['text-warning-5', 'animate-pulse']
48+
if (s.isProcessing) return ['text-success-6', 'animate-pulse']
49+
if (s.active) return ['text-neutral-5', '']
50+
return ['text-neutral-7', '']
51+
}
52+
53+
/** Corresponding bg- classes for the dot indicator */
54+
function sessionDotClasses(
55+
s: Session,
56+
waitingSessions: Record<string, boolean>,
57+
tentativeQueues?: Record<string, string[]>,
58+
): string {
59+
if ((tentativeQueues?.[s.id]?.length ?? 0) > 0) return 'bg-accent-6 animate-pulse'
60+
if (waitingSessions[s.id]) return 'bg-warning-5 animate-pulse'
61+
if (s.isProcessing) return 'bg-success-6 animate-pulse'
62+
if (s.active) return 'bg-neutral-5'
63+
return 'bg-neutral-7'
64+
}
65+
4066
export function SessionList({ sessions, activeSessionId, waitingSessions, tentativeQueues, onSelect, onDelete, onNew }: Props) {
4167
if (sessions.length === 0) return null
4268

@@ -70,19 +96,11 @@ export function SessionList({ sessions, activeSessionId, waitingSessions, tentat
7096
}`}
7197
>
7298
{s.source === 'workflow' ? (
73-
<IconTimeline size={14} className="shrink-0 opacity-70" />
99+
<IconTimeline size={14} className={`shrink-0 ${sessionStateClasses(s, waitingSessions, tentativeQueues).join(' ')}`} />
74100
) : s.source === 'webhook' ? (
75-
<IconRobot size={14} className="shrink-0 opacity-70" />
101+
<IconRobot size={14} className={`shrink-0 ${sessionStateClasses(s, waitingSessions, tentativeQueues).join(' ')}`} />
76102
) : (
77-
<span
78-
className={`inline-block h-1.5 w-1.5 rounded-full flex-shrink-0 ${
79-
(tentativeQueues?.[s.id]?.length ?? 0) > 0
80-
? 'bg-accent-6 animate-pulse'
81-
: waitingSessions[s.id]
82-
? 'bg-warning-5 animate-pulse'
83-
: s.isProcessing ? 'bg-success-6 animate-pulse' : s.active ? 'bg-neutral-5' : 'bg-neutral-7'
84-
}`}
85-
/>
103+
<span className={`inline-block h-1.5 w-1.5 rounded-full flex-shrink-0 ${sessionDotClasses(s, waitingSessions, tentativeQueues)}`} />
86104
)}
87105
<span className="flex-1 truncate text-[15px]">{displayName(s)}</span>
88106
<span className="shrink-0 text-[13px] text-neutral-5 tabular-nums">{compactAge(s.created)}</span>

src/components/SessionListPanel.tsx

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,30 @@ function compactAge(created: string): string {
3535
return `${days}d`
3636
}
3737

38+
function sessionStateClasses(
39+
s: Session,
40+
waitingSessions: Record<string, boolean>,
41+
tentativeQueues?: Record<string, string[]>,
42+
): [string, string] {
43+
if ((tentativeQueues?.[s.id]?.length ?? 0) > 0) return ['text-accent-6', 'animate-pulse']
44+
if (waitingSessions[s.id]) return ['text-warning-5', 'animate-pulse']
45+
if (s.isProcessing) return ['text-success-6', 'animate-pulse']
46+
if (s.active) return ['text-neutral-5', '']
47+
return ['text-neutral-7', '']
48+
}
49+
50+
function sessionDotClasses(
51+
s: Session,
52+
waitingSessions: Record<string, boolean>,
53+
tentativeQueues?: Record<string, string[]>,
54+
): string {
55+
if ((tentativeQueues?.[s.id]?.length ?? 0) > 0) return 'bg-accent-6 animate-pulse'
56+
if (waitingSessions[s.id]) return 'bg-warning-5 animate-pulse'
57+
if (s.isProcessing) return 'bg-success-6 animate-pulse'
58+
if (s.active) return 'bg-neutral-5'
59+
return 'bg-neutral-7'
60+
}
61+
3862
export function SessionListPanel({ sessions, activeSessionId, waitingSessions, tentativeQueues, onSelect, onDelete, onNew }: Props) {
3963
if (sessions.length === 0) return null
4064

@@ -56,7 +80,6 @@ export function SessionListPanel({ sessions, activeSessionId, waitingSessions, t
5680
<div className="flex flex-col py-0.5 overflow-y-auto max-h-[200px]">
5781
{sessions.map(s => {
5882
const isActive = s.id === activeSessionId
59-
const isTentative = (tentativeQueues?.[s.id]?.length ?? 0) > 0
6083
return (
6184
<button
6285
key={s.id}
@@ -68,19 +91,11 @@ export function SessionListPanel({ sessions, activeSessionId, waitingSessions, t
6891
}`}
6992
>
7093
{s.source === 'workflow' ? (
71-
<IconTimeline size={12} className="shrink-0 opacity-70" />
94+
<IconTimeline size={12} className={`shrink-0 ${sessionStateClasses(s, waitingSessions, tentativeQueues).join(' ')}`} />
7295
) : s.source === 'webhook' ? (
73-
<IconRobot size={12} className="shrink-0 opacity-70" />
96+
<IconRobot size={12} className={`shrink-0 ${sessionStateClasses(s, waitingSessions, tentativeQueues).join(' ')}`} />
7497
) : (
75-
<span
76-
className={`inline-block h-1.5 w-1.5 rounded-full flex-shrink-0 ${
77-
isTentative
78-
? 'bg-accent-6 animate-pulse'
79-
: waitingSessions[s.id]
80-
? 'bg-warning-5 animate-pulse'
81-
: s.isProcessing ? 'bg-success-6 animate-pulse' : s.active ? 'bg-neutral-5' : 'bg-neutral-7'
82-
}`}
83-
/>
98+
<span className={`inline-block h-1.5 w-1.5 rounded-full flex-shrink-0 ${sessionDotClasses(s, waitingSessions, tentativeQueues)}`} />
8499
)}
85100
<span className="flex-1 truncate text-[15px]">{displayName(s)}</span>
86101
<span className="shrink-0 text-[13px] text-neutral-5 tabular-nums">{compactAge(s.created)}</span>

0 commit comments

Comments
 (0)