Skip to content

Commit a0bbcee

Browse files
committed
feat: Implement Roo-Code todo list component and subtasks across all chat modes
- Add shared TodoListPanel component with subtask support - Integrate todo lists into Fullstack, Backend, and Frontend chat modes - Add Jotai state management for todo persistence - Update chat headers to include todo list toggle - Modify forge config to disable signing for local builds - Bump version to 0.0.46 for release
1 parent 0d2cb00 commit a0bbcee

File tree

8 files changed

+453
-77
lines changed

8 files changed

+453
-77
lines changed

forge.config.ts

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -60,18 +60,8 @@ const config: ForgeConfig = {
6060
],
6161
icon: "./assets/icon/logo",
6262

63-
osxSign: isEndToEndTestBuild
64-
? undefined
65-
: {
66-
identity: process.env.APPLE_TEAM_ID,
67-
},
68-
osxNotarize: isEndToEndTestBuild
69-
? undefined
70-
: {
71-
appleId: process.env.APPLE_ID!,
72-
appleIdPassword: process.env.APPLE_PASSWORD!,
73-
teamId: process.env.APPLE_TEAM_ID!,
74-
},
63+
osxSign: undefined, // Temporarily disable signing for development build
64+
osxNotarize: undefined, // Temporarily disable notarization for development build
7565
asar: true,
7666
ignore,
7767
// ignore: [/node_modules\/(?!(better-sqlite3|bindings|file-uri-to-path)\/)/],

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "alifullstack",
33
"productName": "AliFullStack",
4-
"version": "0.24.0",
4+
"version": "0.0.46",
55
"description": "Free, local, open-source AI app builder",
66
"main": ".vite/build/main.js",
77
"repository": {

src/atoms/todoAtoms.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
export interface Subtask {
2+
id: string;
3+
title: string;
4+
completed: boolean;
5+
createdAt: Date;
6+
updatedAt: Date;
7+
}
8+
9+
export interface TodoItem {
10+
id: string;
11+
title: string;
12+
description?: string;
13+
status: "pending" | "in_progress" | "completed";
14+
subtasks: Subtask[];
15+
chatId: number;
16+
createdAt: Date;
17+
updatedAt: Date;
18+
}
19+
20+
import { atom } from "jotai";
21+
22+
// Atoms for todo management
23+
export const todoListAtom = atom<TodoItem[]>([]);
24+
export const isTodoPanelOpenAtom = atom<boolean>(false);

src/components/ChatPanel.tsx

Lines changed: 41 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { useState, useRef, useEffect, useCallback } from "react";
22
import { useAtom, useAtomValue } from "jotai";
33
import { chatMessagesAtom, chatStreamCountAtom } from "../atoms/chatAtoms";
4+
import { isTodoPanelOpenAtom } from "../atoms/todoAtoms";
45
import { IpcClient } from "@/ipc/ipc_client";
56
import { useSettings } from "@/hooks/useSettings";
67

@@ -9,6 +10,7 @@ import { MessagesList } from "./chat/MessagesList";
910
import { ChatInput } from "./chat/ChatInput";
1011
import { VersionPane } from "./chat/VersionPane";
1112
import { ChatError } from "./chat/ChatError";
13+
import { TodoListPanel } from "./TodoListPanel";
1214

1315
// Backend components
1416
import { BackendChatPanel as BackendChatPanelComponent } from "./backend-chat/BackendChatPanel";
@@ -26,11 +28,17 @@ export function ChatPanel({
2628
}: ChatPanelProps) {
2729
const { settings } = useSettings();
2830
const isBackendMode = settings?.selectedChatMode === "backend";
31+
const isFullstackMode = settings?.selectedChatMode === "fullstack";
32+
const isFrontendMode = settings?.selectedChatMode === "build";
2933

3034
const [messages, setMessages] = useAtom(chatMessagesAtom);
35+
const [isTodoPanelOpen, setIsTodoPanelOpen] = useAtom(isTodoPanelOpenAtom);
3136
const [isVersionPaneOpen, setIsVersionPaneOpen] = useState(false);
3237
const [error, setError] = useState<string | null>(null);
3338
const streamCount = useAtomValue(chatStreamCountAtom);
39+
40+
// Debug logging
41+
console.log("ChatPanel render:", { isBackendMode, isFullstackMode, isFrontendMode, isTodoPanelOpen, showTodoToggle: isFullstackMode || isFrontendMode });
3442
// Reference to store the processed prompt so we don't submit it twice
3543

3644
const messagesEndRef = useRef<HTMLDivElement | null>(null);
@@ -134,30 +142,41 @@ export function ChatPanel({
134142

135143
// Default frontend mode
136144
return (
137-
<div className="flex flex-col h-full">
138-
<ChatHeader
139-
isVersionPaneOpen={isVersionPaneOpen}
140-
isPreviewOpen={isPreviewOpen}
141-
onTogglePreview={onTogglePreview}
142-
onVersionClick={() => setIsVersionPaneOpen(!isVersionPaneOpen)}
143-
/>
144-
<div className="flex flex-1 overflow-hidden">
145-
{!isVersionPaneOpen && (
146-
<div className="flex-1 flex flex-col min-w-0">
147-
<MessagesList
148-
messages={messages}
149-
messagesEndRef={messagesEndRef}
150-
ref={messagesContainerRef}
151-
/>
152-
<ChatError error={error} onDismiss={() => setError(null)} />
153-
<ChatInput chatId={chatId} />
154-
</div>
155-
)}
156-
<VersionPane
157-
isVisible={isVersionPaneOpen}
158-
onClose={() => setIsVersionPaneOpen(false)}
145+
<div className="flex h-full">
146+
<div className="flex flex-col flex-1">
147+
<ChatHeader
148+
isVersionPaneOpen={isVersionPaneOpen}
149+
isPreviewOpen={isPreviewOpen}
150+
onTogglePreview={onTogglePreview}
151+
onVersionClick={() => setIsVersionPaneOpen(!isVersionPaneOpen)}
152+
showTodoToggle={isFullstackMode || isFrontendMode}
153+
isTodoPanelOpen={isTodoPanelOpen}
154+
onToggleTodo={() => setIsTodoPanelOpen(!isTodoPanelOpen)}
159155
/>
156+
<div className="flex flex-1 overflow-hidden">
157+
{!isVersionPaneOpen && (
158+
<div className="flex-1 flex flex-col min-w-0">
159+
<MessagesList
160+
messages={messages}
161+
messagesEndRef={messagesEndRef}
162+
ref={messagesContainerRef}
163+
/>
164+
<ChatError error={error} onDismiss={() => setError(null)} />
165+
<ChatInput chatId={chatId} />
166+
</div>
167+
)}
168+
<VersionPane
169+
isVisible={isVersionPaneOpen}
170+
onClose={() => setIsVersionPaneOpen(false)}
171+
/>
172+
</div>
160173
</div>
174+
{(isFullstackMode || isFrontendMode) && (
175+
<TodoListPanel
176+
isOpen={isTodoPanelOpen}
177+
onClose={() => setIsTodoPanelOpen(false)}
178+
/>
179+
)}
161180
</div>
162181
);
163182
}

0 commit comments

Comments
 (0)