Skip to content

Commit 2484948

Browse files
Enable new project creation from Copier templates (#4)
* Add Copier template support for creating new projects - Add isCopierTemplate field to repositories table - Create /api/copier endpoints for fetching questions and creating projects - Add New Project wizard dialog with multi-step flow: - Select template (saved repos or custom URL/path) - Answer template questions from copier.yml - Choose output directory and project name - Add template checkbox to repository create/edit forms - Auto-add created projects as repositories * Rename use-task-sync.ts to .tsx for JSX support * Improve new project dialog UX - Use uvx to run copier (with uv installation check) - Filter out Jinja2 template answers to let copier compute them - Preserve form answers when navigating between steps - Add required field validation with * indicators - Add scroll indicator (bouncing chevron) when more content exists - Add scrollbar-visible CSS class for consistent scrollbar styling * Use warm white for light mode cards and surfaces - Change card/popover/secondary from pure white (#ffffff) to warm white (#fdfcfa) for softer contrast against porcelain background - Add card background to repository detail form for readability - Update browser preview container to use bg-card * Add directory support to terminal tabs - Add optional directory field to terminal tabs schema - When creating terminals in a tab with a directory, use that as default cwd - Replace inline tab editing with modal dialog for name and directory - Add "Open in Terminal" button to repository cards and detail view - Creates a tab with the repo's directory if one doesn't exist - Navigates to the tab if it already exists - Show folder icon on tabs that have a directory set * Add debug logging to useOpenInTerminal hook * Improve terminal tab UX and fix terminal creation bug - Add modal dialog for creating new tabs with name and directory - Allow editing tabs via double-click or right-click - Fix bug where new terminals couldn't be created in regular tabs (deduplication was too aggressive, now only applies to task terminals) * Improve button icons and mobile responsiveness - Use TaskAdd01Icon for new task buttons instead of plus - Use ComputerTerminal01Icon for new terminal button - Fix vertical alignment of TaskAdd01Icon with -translate-y-px - Add Editor text label to editor button in repo detail view - Hide button text labels on mobile (show icons only) - Add Add02Icon to save button in repo detail view - Remove breadcrumb navigation from repo detail view * Add Tasks button to repo detail and store repo filter in URL - Reorder navbar: Tasks, Terminals, Repositories, Review, Worktrees, Monitoring - Add Tasks button to repository detail view (navigates to /tasks?repo=...) - Store repo filter in /tasks URL as ?repo= search param - Remove unused PlusSignIcon import from terminals * Use LibraryIcon for repositories and add clickable repo link in task detail - Change navbar Repositories icon from Database01Icon to LibraryIcon - Make repository name in task detail view a clickable link to repo page - Add LibraryIcon next to repository name in task header * Redesign repository card with mobile-first action buttons - Replace card-as-link with explicit Settings button - Add all actions in a button row: New Task, Tasks, Terminal, Editor, Settings, Delete - Show labels on desktop, icons only on mobile (max-sm:hidden) - Add Tasks button to navigate to filtered /tasks view - Simplify card to show only name and path * Make repositories header mobile-friendly - Hide title on mobile, show only count - Make New Project and Add Repository buttons icon-only on mobile * Move worktrees from navbar to monitoring tab - Remove worktrees from navbar navigation items - Add worktrees as a tab within the monitoring page - Include full worktrees functionality: filtering, bulk cleanup, delete * Add commit guidance to task system prompt Instructs Claude to commit after completing each logical unit of work (feature, fix, refactor) to preserve progress and avoid losing work when context runs out. * Fix lint errors in Neutralino type definitions * Separate git buttons into distinct main/origin operations - Pull from main: ArrowRight icon (rebase from main branch) - Merge to main: ArrowLeft icon (merge worktree into main) - Push to origin: ArrowUp icon (push worktree branch to remote) Previously the up arrow conditionally did push or merge based on PR status. Now each operation has its own dedicated button. * Use Arrow03 icon variants for git buttons * Update GitActionsButtons with separate main/origin operations * Bump version to 2.7.0 * Enlarge goat icon in toast notifications Override sonner's fixed 16x16 icon container to allow larger custom image icons. Increased notification icon from size-4 to size-8. * Add goat.jpeg to static files for production
1 parent 0b1a65a commit 2484948

43 files changed

Lines changed: 3321 additions & 336 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.claude-plugin/marketplace.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
"name": "vibora",
99
"source": "./plugins/vibora",
1010
"description": "Task orchestration for Claude Code",
11-
"version": "2.6.3"
11+
"version": "2.7.0"
1212
}
1313
]
1414
}

bun.lock

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

desktop/neutralino.config.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"$schema": "https://raw.githubusercontent.com/neutralinojs/neutralinojs/main/schemas/neutralino.config.schema.json",
33
"applicationId": "io.vibora.desktop",
4-
"version": "2.6.3",
4+
"version": "2.7.0",
55
"defaultMode": "window",
66
"port": 0,
77
"documentRoot": "/resources/",
@@ -26,7 +26,7 @@
2626
],
2727
"globalVariables": {
2828
"APP_NAME": "Vibora",
29-
"APP_VERSION": "2.6.3"
29+
"APP_VERSION": "2.7.0"
3030
},
3131
"modes": {
3232
"window": {

desktop/resources/js/neutralino.d.ts

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ declare function openFile(path: string): Promise<number>;
114114
declare function createWatcher(path: string): Promise<number>;
115115
declare function removeWatcher(id: number): Promise<number>;
116116
declare function getWatchers(): Promise<Watcher[]>;
117-
declare function updateOpenedFile(id: number, event: string, data?: any): Promise<void>;
117+
declare function updateOpenedFile(id: number, event: string, data?: unknown): Promise<void>;
118118
declare function getOpenedFileInfo(id: number): Promise<OpenedFile>;
119119
declare function readDirectory(path: string, options?: DirectoryReaderOptions): Promise<DirectoryEntry[]>;
120120
declare function copy(source: string, destination: string, options?: CopyOptions): Promise<void>;
@@ -180,7 +180,7 @@ export interface TrayMenuItem {
180180
export type KnownPath = "config" | "data" | "cache" | "documents" | "pictures" | "music" | "video" | "downloads" | "savedGames1" | "savedGames2" | "temp";
181181
declare function execCommand(command: string, options?: ExecCommandOptions): Promise<ExecCommandResult>;
182182
declare function spawnProcess(command: string, options?: SpawnedProcessOptions): Promise<SpawnedProcess>;
183-
declare function updateSpawnedProcess(id: number, event: string, data?: any): Promise<void>;
183+
declare function updateSpawnedProcess(id: number, event: string, data?: unknown): Promise<void>;
184184
declare function getSpawnedProcesses(): Promise<SpawnedProcess[]>;
185185
declare function getEnv(key: string): Promise<string>;
186186
declare function getEnvs(): Promise<Envs>;
@@ -257,8 +257,8 @@ export interface RestartOptions {
257257
declare function exit(code?: number): Promise<void>;
258258
declare function killProcess(): Promise<void>;
259259
declare function restartProcess(options?: RestartOptions): Promise<void>;
260-
declare function getConfig(): Promise<any>;
261-
declare function broadcast(event: string, data?: any): Promise<void>;
260+
declare function getConfig(): Promise<unknown>;
261+
declare function broadcast(event: string, data?: unknown): Promise<void>;
262262
declare function readProcessInput(readAll?: boolean): Promise<string>;
263263
declare function writeProcessOutput(data: string): Promise<void>;
264264
declare function writeProcessError(data: string): Promise<void>;
@@ -293,8 +293,7 @@ export interface WindowPosOptions {
293293
x: number;
294294
y: number;
295295
}
296-
export interface WindowMenu extends Array<WindowMenuItem> {
297-
}
296+
export type WindowMenu = WindowMenuItem[];
298297
export interface WindowMenuItem {
299298
id?: string;
300299
text: string;
@@ -353,14 +352,14 @@ interface Response$1 {
353352
export type Builtin = "ready" | "trayMenuItemClicked" | "windowClose" | "serverOffline" | "clientConnect" | "clientDisconnect" | "appClientConnect" | "appClientDisconnect" | "extClientConnect" | "extClientDisconnect" | "extensionReady" | "neuDev_reloadApp";
354353
declare function on(event: string, handler: (ev: CustomEvent) => void): Promise<Response$1>;
355354
declare function off(event: string, handler: (ev: CustomEvent) => void): Promise<Response$1>;
356-
declare function dispatch(event: string, data?: any): Promise<Response$1>;
357-
declare function broadcast$1(event: string, data?: any): Promise<void>;
355+
declare function dispatch(event: string, data?: unknown): Promise<Response$1>;
356+
declare function broadcast$1(event: string, data?: unknown): Promise<void>;
358357
export interface ExtensionStats {
359358
loaded: string[];
360359
connected: string[];
361360
}
362-
declare function dispatch$1(extensionId: string, event: string, data?: any): Promise<void>;
363-
declare function broadcast$2(event: string, data?: any): Promise<void>;
361+
declare function dispatch$1(extensionId: string, event: string, data?: unknown): Promise<void>;
362+
declare function broadcast$2(event: string, data?: unknown): Promise<void>;
364363
declare function getStats$1(): Promise<ExtensionStats>;
365364
export interface Manifest {
366365
applicationId: string;
@@ -458,7 +457,7 @@ declare global {
458457
NL_CMETHODS: string[];
459458
}
460459
/** Neutralino global object for custom methods **/
461-
const Neutralino: any;
460+
const Neutralino: unknown;
462461
}
463462

464463
declare namespace custom {

drizzle/0009_jittery_sir_ram.sql

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
ALTER TABLE `repositories` ADD `is_copier_template` integer DEFAULT false;
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
ALTER TABLE `terminal_tabs` ADD `directory` text;

0 commit comments

Comments
 (0)