chore(fire-tools): upgrade stamp to v1.13.2

- pnpm catalog: centralize version governance for biome, ts, vitest,
  zod, semantic-release, react, vite, and testing deps
- biome 1.9.4 → 2.4.13: migrate config (organizeImports → assist,
  files.ignore → files.includes, enable tailwindDirectives for @theme)
- zod 3.24.3 → 4.3.6: update error message API to { message: "..." }
  and .errors → .issues in all 4 Zod-using files
- vitest 3.2.3 → 4.1.5
- semantic-release 24.x → 25.0.3
- typescript 6.0.3 (ahead of 5.9.x standard; intentional)
- add commitlint 20.x with conventional config
- add husky 9.x with commit-msg and pre-commit hooks
- add .github/actions/setup composite action; update all 3 workflows
- fix: remove pnpm version: 9 from all workflows (reads packageManager)
- fix: node-version 20 → 24 in all 3 workflows
- add Makefile with dev/build/test/lint/typecheck/install targets
This commit is contained in:
Offending Commit
2026-04-27 11:20:47 -05:00
parent 8052a7d27a
commit 988ab36c32
61 changed files with 1056 additions and 822 deletions

View File

@@ -1,12 +1,12 @@
import { Link, useParams } from "@tanstack/react-router";
import { AnimatePresence, motion } from "framer-motion";
import { Brain, Send } from "lucide-react";
import { useEffect, useRef, useState } from "react";
import { useChat } from "@/api/queries";
import { LoadingSpinner } from "@/components/shared/LoadingSpinner";
import { Button } from "@/components/ui/button";
import { Textarea } from "@/components/ui/input";
import { SectionHeading } from "@/components/ui/typography";
import { Link, useParams } from "@tanstack/react-router";
import { AnimatePresence, motion } from "framer-motion";
import { Brain, Send } from "lucide-react";
import { useEffect, useRef, useState } from "react";
interface Message {
id: string;

View File

@@ -1,3 +1,8 @@
import { Link, useParams } from "@tanstack/react-router";
import { AnimatePresence, motion } from "framer-motion";
import { ArrowLeft, Eye, Lightbulb, Plus, Search, Trash2, X } from "lucide-react";
import { useMemo, useState } from "react";
import { z } from "zod";
import {
useConclusions,
useCreateConclusion,
@@ -18,18 +23,13 @@ import { Input, Textarea } from "@/components/ui/input";
import { Label } from "@/components/ui/label";
import { Body, Caption, MonoCaption, Muted, PageTitle } from "@/components/ui/typography";
import { COLOR } from "@/lib/constants";
import { Link, useParams } from "@tanstack/react-router";
import { AnimatePresence, motion } from "framer-motion";
import { ArrowLeft, Eye, Lightbulb, Plus, Search, Trash2, X } from "lucide-react";
import { useMemo, useState } from "react";
import { z } from "zod";
type Conclusion = components["schemas"]["Conclusion"];
const createSchema = z.object({
observer_id: z.string().min(1, "Observer peer ID is required"),
observed_id: z.string().min(1, "Observed peer ID is required"),
content: z.string().min(1, "Content is required"),
observer_id: z.string().min(1, { message: "Observer peer ID is required" }),
observed_id: z.string().min(1, { message: "Observed peer ID is required" }),
content: z.string().min(1, { message: "Content is required" }),
session_id: z.string().optional(),
});
@@ -348,7 +348,7 @@ function CreateConclusionModal({
const result = createSchema.safeParse(fields);
if (!result.success) {
const errs: Record<string, string> = {};
for (const issue of result.error.errors) errs[issue.path[0] as string] = issue.message;
for (const issue of result.error.issues) errs[issue.path[0] as string] = issue.message;
setValidationErrors(errs);
return;
}

View File

@@ -1,3 +1,7 @@
import { Link } from "@tanstack/react-router";
import { motion } from "framer-motion";
import { Activity, Boxes, ChevronRight, CircleDot, LayoutDashboard } from "lucide-react";
import { useState } from "react";
import { useQueueStatus, useWorkspaces } from "@/api/queries";
import type { components } from "@/api/schema.d.ts";
import { ErrorAlert } from "@/components/shared/ErrorAlert";
@@ -5,10 +9,6 @@ import { PageLoader } from "@/components/shared/LoadingSpinner";
import { Body, Muted, PageTitle, SectionHeading } from "@/components/ui/typography";
import { COLOR } from "@/lib/constants";
import { formatCount } from "@/lib/utils";
import { Link } from "@tanstack/react-router";
import { motion } from "framer-motion";
import { Activity, Boxes, ChevronRight, CircleDot, LayoutDashboard } from "lucide-react";
import { useState } from "react";
type QueueStatus = components["schemas"]["QueueStatus"];

View File

@@ -1,9 +1,9 @@
import { useTheme } from "@/hooks/useTheme";
import { loadConfig } from "@/lib/config";
import { COLOR } from "@/lib/constants";
import { Link, useMatchRoute } from "@tanstack/react-router";
import { motion } from "framer-motion";
import { Boxes, Brain, ChevronRight, LayoutDashboard, Moon, Settings, Sun } from "lucide-react";
import { useTheme } from "@/hooks/useTheme";
import { loadConfig } from "@/lib/config";
import { COLOR } from "@/lib/constants";
const navItems = [
{ to: "/" as const, label: "Dashboard", icon: LayoutDashboard, exact: true },

View File

@@ -1,3 +1,17 @@
import { Link, useNavigate, useParams } from "@tanstack/react-router";
import { AnimatePresence, motion } from "framer-motion";
import {
ChevronDown,
Eye,
EyeOff,
MessageCircle,
Save,
Search,
User,
Users,
X,
} from "lucide-react";
import { useState } from "react";
import {
usePeer,
usePeerCard,
@@ -23,20 +37,6 @@ import {
SectionHeading,
} from "@/components/ui/typography";
import { COLOR } from "@/lib/constants";
import { Link, useNavigate, useParams } from "@tanstack/react-router";
import { AnimatePresence, motion } from "framer-motion";
import {
ChevronDown,
Eye,
EyeOff,
MessageCircle,
Save,
Search,
User,
Users,
X,
} from "lucide-react";
import { useState } from "react";
export function PeerDetail() {
const { workspaceId, peerId } = useParams({ strict: false }) as {

View File

@@ -1,3 +1,7 @@
import { Link, useNavigate, useParams } from "@tanstack/react-router";
import { motion, type Variants } from "framer-motion";
import { ArrowLeft, ChevronRight, Clock, Eye, Users } from "lucide-react";
import { useMemo, useState } from "react";
import { usePeers } from "@/api/queries";
import type { components } from "@/api/schema.d.ts";
import { EmptyState } from "@/components/shared/EmptyState";
@@ -8,10 +12,6 @@ import { Pagination } from "@/components/shared/Pagination";
import { SortControl, type SortDir } from "@/components/shared/SortControl";
import { MonoCaption, PageTitle } from "@/components/ui/typography";
import { COLOR } from "@/lib/constants";
import { Link, useNavigate, useParams } from "@tanstack/react-router";
import { type Variants, motion } from "framer-motion";
import { ArrowLeft, ChevronRight, Clock, Eye, Users } from "lucide-react";
import { useMemo, useState } from "react";
type Peer = components["schemas"]["Peer"];

View File

@@ -1,3 +1,7 @@
import { Link, useNavigate, useParams } from "@tanstack/react-router";
import { AnimatePresence, motion } from "framer-motion";
import { AlignLeft, Clock, Copy, MessageSquare, Search, Trash2, Users, X } from "lucide-react";
import { useState } from "react";
import {
useAddPeersToSession,
useCloneSession,
@@ -26,10 +30,6 @@ import {
PageTitle,
SectionHeading,
} from "@/components/ui/typography";
import { Link, useNavigate, useParams } from "@tanstack/react-router";
import { AnimatePresence, motion } from "framer-motion";
import { AlignLeft, Clock, Copy, MessageSquare, Search, Trash2, Users, X } from "lucide-react";
import { useState } from "react";
type Message = components["schemas"]["Message"];
type SessionSummaries = components["schemas"]["SessionSummaries"];

View File

@@ -1,3 +1,7 @@
import { Link, useNavigate, useParams } from "@tanstack/react-router";
import { motion, type Variants } from "framer-motion";
import { ArrowLeft, ChevronRight, CircleDot, Clock, MessageSquare } from "lucide-react";
import { useMemo, useState } from "react";
import { useSessions } from "@/api/queries";
import type { components } from "@/api/schema.d.ts";
import { EmptyState } from "@/components/shared/EmptyState";
@@ -7,10 +11,6 @@ import { Pagination } from "@/components/shared/Pagination";
import { SortControl, type SortDir } from "@/components/shared/SortControl";
import { MonoCaption, PageTitle } from "@/components/ui/typography";
import { COLOR } from "@/lib/constants";
import { Link, useNavigate, useParams } from "@tanstack/react-router";
import { type Variants, motion } from "framer-motion";
import { ArrowLeft, ChevronRight, CircleDot, Clock, MessageSquare } from "lucide-react";
import { useMemo, useState } from "react";
type Session = components["schemas"]["Session"];

View File

@@ -1,19 +1,19 @@
import { AnimatePresence, motion } from "framer-motion";
import { AlertCircle, CheckCircle, Loader, Lock, LockOpen, Wifi, WifiOff } from "lucide-react";
import { useState } from "react";
import { Button } from "@/components/ui/button";
import { Input, Textarea } from "@/components/ui/input";
import { Label } from "@/components/ui/label";
import { Muted } from "@/components/ui/typography";
import {
type Config,
type HealthStatus,
checkConnection,
configSchema,
type HealthStatus,
loadConfig,
saveConfig,
} from "@/lib/config";
import { COLOR } from "@/lib/constants";
import { AnimatePresence, motion } from "framer-motion";
import { AlertCircle, CheckCircle, Loader, Lock, LockOpen, Wifi, WifiOff } from "lucide-react";
import { useState } from "react";
interface SettingsFormProps {
onSaved?: () => void;

View File

@@ -1,3 +1,4 @@
import { AlertTriangle } from "lucide-react";
import { Button } from "@/components/ui/button";
import {
Dialog,
@@ -7,7 +8,6 @@ import {
DialogTitle,
} from "@/components/ui/dialog";
import { COLOR } from "@/lib/constants";
import { AlertTriangle } from "lucide-react";
interface ConfirmDialogProps {
open: boolean;

View File

@@ -1,7 +1,7 @@
import { Body, Caption } from "@/components/ui/typography";
import { COLOR } from "@/lib/constants";
import { motion } from "framer-motion";
import type { LucideIcon } from "lucide-react";
import { Body, Caption } from "@/components/ui/typography";
import { COLOR } from "@/lib/constants";
interface EmptyStateProps {
icon?: LucideIcon;

View File

@@ -1,5 +1,5 @@
import { COLOR } from "@/lib/constants";
import { motion } from "framer-motion";
import { COLOR } from "@/lib/constants";
interface LoadingSpinnerProps {
size?: "sm" | "md" | "lg";

View File

@@ -1,9 +1,9 @@
import { TimestampChip } from "@/components/shared/TimestampChip";
import { COLOR } from "@/lib/constants";
import { Link } from "@tanstack/react-router";
import { DateTime } from "luxon";
import ReactMarkdown, { type Components } from "react-markdown";
import remarkGfm from "remark-gfm";
import { TimestampChip } from "@/components/shared/TimestampChip";
import { COLOR } from "@/lib/constants";
// ─── Types ────────────────────────────────────────────────────────────────────

View File

@@ -1,8 +1,8 @@
import { ChevronDown } from "lucide-react";
import { useState } from "react";
import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@/components/ui/collapsible";
import { COLOR } from "@/lib/constants";
import { cn } from "@/lib/utils";
import { ChevronDown } from "lucide-react";
import { useState } from "react";
interface Props {
lines: string[];

View File

@@ -1,5 +1,5 @@
import { COLOR } from "@/lib/constants";
import { ArrowDown, ArrowUp } from "lucide-react";
import { COLOR } from "@/lib/constants";
export type SortDir = "asc" | "desc";

View File

@@ -1,6 +1,6 @@
import { DateTime } from "luxon";
import { COLOR } from "@/lib/constants";
import { cn } from "@/lib/utils";
import { DateTime } from "luxon";
interface Props {
/** ISO-like string: "2026-04-24 18:18:48" or any Luxon-parseable string */

View File

@@ -1,6 +1,6 @@
import { cn } from "@/lib/utils";
import { type VariantProps, cva } from "class-variance-authority";
import { cva, type VariantProps } from "class-variance-authority";
import type { HTMLAttributes } from "react";
import { cn } from "@/lib/utils";
const badgeVariants = cva(
"inline-flex items-center gap-1 rounded-md border px-2 py-0.5 text-xs font-medium transition-colors",

View File

@@ -1,7 +1,7 @@
import { cn } from "@/lib/utils";
import { Slot } from "@radix-ui/react-slot";
import { type VariantProps, cva } from "class-variance-authority";
import { cva, type VariantProps } from "class-variance-authority";
import { forwardRef } from "react";
import { cn } from "@/lib/utils";
const buttonVariants = cva(
[

View File

@@ -1,5 +1,5 @@
import { cn } from "@/lib/utils";
import type { HTMLAttributes } from "react";
import { cn } from "@/lib/utils";
export function Card({ className, ...props }: HTMLAttributes<HTMLDivElement>) {
return (

View File

@@ -6,4 +6,4 @@ const Collapsible = CollapsiblePrimitive.Root;
const CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger;
const CollapsibleContent = CollapsiblePrimitive.CollapsibleContent;
export { Collapsible, CollapsibleTrigger, CollapsibleContent };
export { Collapsible, CollapsibleContent, CollapsibleTrigger };

View File

@@ -1,7 +1,7 @@
import { cn } from "@/lib/utils";
import * as DialogPrimitive from "@radix-ui/react-dialog";
import { X } from "lucide-react";
import { forwardRef } from "react";
import { cn } from "@/lib/utils";
export const Dialog = DialogPrimitive.Root;
export const DialogTrigger = DialogPrimitive.Trigger;

View File

@@ -1,5 +1,5 @@
import { cn } from "@/lib/utils";
import { forwardRef } from "react";
import { cn } from "@/lib/utils";
export type InputProps = React.InputHTMLAttributes<HTMLInputElement>;

View File

@@ -1,6 +1,6 @@
import { cn } from "@/lib/utils";
import * as LabelPrimitive from "@radix-ui/react-label";
import { forwardRef } from "react";
import { cn } from "@/lib/utils";
export const Label = forwardRef<
React.ComponentRef<typeof LabelPrimitive.Root>,

View File

@@ -1,6 +1,6 @@
import { cn } from "@/lib/utils";
import * as SeparatorPrimitive from "@radix-ui/react-separator";
import { forwardRef } from "react";
import { cn } from "@/lib/utils";
export const Separator = forwardRef<
React.ComponentRef<typeof SeparatorPrimitive.Root>,

View File

@@ -1,5 +1,5 @@
import { cn } from "@/lib/utils";
import { forwardRef } from "react";
import { cn } from "@/lib/utils";
export const Table = forwardRef<HTMLTableElement, React.HTMLAttributes<HTMLTableElement>>(
({ className, ...props }, ref) => (

View File

@@ -1,5 +1,5 @@
import { cn } from "@/lib/utils";
import * as TooltipPrimitive from "@radix-ui/react-tooltip";
import { cn } from "@/lib/utils";
export const TooltipProvider = TooltipPrimitive.Provider;
export const Tooltip = TooltipPrimitive.Root;

View File

@@ -1,15 +1,15 @@
import type { UseMutationResult } from "@tanstack/react-query";
import { useState } from "react";
import { z } from "zod";
import { FormModal } from "@/components/shared/FormModal";
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
import { Label } from "@/components/ui/label";
import { Caption } from "@/components/ui/typography";
import { COLOR } from "@/lib/constants";
import type { UseMutationResult } from "@tanstack/react-query";
import { useState } from "react";
import { z } from "zod";
const schema = z.object({
observer: z.string().min(1, "Observer peer ID is required"),
observer: z.string().min(1, { message: "Observer peer ID is required" }),
observed: z.string().optional(),
session_id: z.string().optional(),
});
@@ -46,7 +46,7 @@ export function ScheduleDreamModal({ open, onClose, mutation }: Props) {
session_id: sessionId || undefined,
});
if (!result.success) {
setValidationError(result.error.errors[0].message);
setValidationError(result.error.issues[0].message);
return;
}
await mutation.mutateAsync({

View File

@@ -1,3 +1,9 @@
import { Link } from "@tanstack/react-router";
import { open } from "@tauri-apps/plugin-shell";
import { AnimatePresence, motion } from "framer-motion";
import { ArrowLeft, ExternalLink, Plus, Trash2, Webhook, Zap } from "lucide-react";
import { useState } from "react";
import { z } from "zod";
import { useCreateWebhook, useDeleteWebhook, useTestWebhook, useWebhooks } from "@/api/queries";
import { ConfirmDialog } from "@/components/shared/ConfirmDialog";
import { ErrorAlert } from "@/components/shared/ErrorAlert";
@@ -6,14 +12,8 @@ import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
import { Body, Muted, PageTitle, SectionHeading } from "@/components/ui/typography";
import { COLOR } from "@/lib/constants";
import { Link } from "@tanstack/react-router";
import { open } from "@tauri-apps/plugin-shell";
import { AnimatePresence, motion } from "framer-motion";
import { ArrowLeft, ExternalLink, Plus, Trash2, Webhook, Zap } from "lucide-react";
import { useState } from "react";
import { z } from "zod";
const urlSchema = z.string().url("Must be a valid URL");
const urlSchema = z.string().url({ message: "Must be a valid URL" });
interface Props {
workspaceId: string;
@@ -34,7 +34,7 @@ export function WebhookManager({ workspaceId }: Props) {
e.preventDefault();
const result = urlSchema.safeParse(url);
if (!result.success) {
setUrlError(result.error.errors[0].message);
setUrlError(result.error.issues[0].message);
return;
}
await createWebhook.mutateAsync(url);

View File

@@ -1,12 +1,3 @@
import { useDeleteWorkspace, useQueueStatus, useScheduleDream, useWorkspace } from "@/api/queries";
import { ConfirmDialog } from "@/components/shared/ConfirmDialog";
import { ErrorAlert } from "@/components/shared/ErrorAlert";
import { JsonViewer } from "@/components/shared/JsonViewer";
import { PageLoader } from "@/components/shared/LoadingSpinner";
import { Button } from "@/components/ui/button";
import { Body, Caption, PageTitle, SectionHeading } from "@/components/ui/typography";
import { ScheduleDreamModal } from "@/components/workspaces/ScheduleDreamModal";
import { COLOR } from "@/lib/constants";
import { Link, useNavigate, useParams } from "@tanstack/react-router";
import { AnimatePresence, motion } from "framer-motion";
import {
@@ -22,6 +13,15 @@ import {
Zap,
} from "lucide-react";
import { useState } from "react";
import { useDeleteWorkspace, useQueueStatus, useScheduleDream, useWorkspace } from "@/api/queries";
import { ConfirmDialog } from "@/components/shared/ConfirmDialog";
import { ErrorAlert } from "@/components/shared/ErrorAlert";
import { JsonViewer } from "@/components/shared/JsonViewer";
import { PageLoader } from "@/components/shared/LoadingSpinner";
import { Button } from "@/components/ui/button";
import { Body, Caption, PageTitle, SectionHeading } from "@/components/ui/typography";
import { ScheduleDreamModal } from "@/components/workspaces/ScheduleDreamModal";
import { COLOR } from "@/lib/constants";
const NAV_SECTIONS = [
{

View File

@@ -1,3 +1,7 @@
import { useNavigate } from "@tanstack/react-router";
import { motion, type Variants } from "framer-motion";
import { Boxes, ChevronRight, Clock } from "lucide-react";
import { useMemo, useState } from "react";
import { useWorkspaces } from "@/api/queries";
import type { components } from "@/api/schema.d.ts";
import { EmptyState } from "@/components/shared/EmptyState";
@@ -7,10 +11,6 @@ import { Pagination } from "@/components/shared/Pagination";
import { SortControl, type SortDir } from "@/components/shared/SortControl";
import { MonoCaption, Muted, PageTitle } from "@/components/ui/typography";
import { COLOR } from "@/lib/constants";
import { useNavigate } from "@tanstack/react-router";
import { type Variants, motion } from "framer-motion";
import { Boxes, ChevronRight, Clock } from "lucide-react";
import { useMemo, useState } from "react";
type Workspace = components["schemas"]["Workspace"];