Merge main into kanban-scaling

Resolves merge conflicts while preserving:
- Kanban scaling improvements (window sizing, bounce prevention, debouncing)
- Main's sidebar refactoring into hooks
- Main's openInEditor functionality for VS Code integration

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
trueheads
2025-12-22 01:49:45 -06:00
599 changed files with 26666 additions and 24168 deletions

View File

@@ -5,7 +5,7 @@
/**
* Available enhancement modes for transforming task descriptions
*/
export type EnhancementMode = "improve" | "technical" | "simplify" | "acceptance";
export type EnhancementMode = 'improve' | 'technical' | 'simplify' | 'acceptance';
/**
* Example input/output pair for few-shot learning

View File

@@ -1,7 +1,7 @@
/**
* Error type classification
*/
export type ErrorType = "authentication" | "cancellation" | "abort" | "execution" | "unknown";
export type ErrorType = 'authentication' | 'cancellation' | 'abort' | 'execution' | 'unknown';
/**
* Classified error information

View File

@@ -3,27 +3,27 @@
*/
export type EventType =
| "agent:stream"
| "auto-mode:event"
| "auto-mode:started"
| "auto-mode:stopped"
| "auto-mode:idle"
| "auto-mode:error"
| "feature:started"
| "feature:completed"
| "feature:stopped"
| "feature:error"
| "feature:progress"
| "feature:tool-use"
| "feature:follow-up-started"
| "feature:follow-up-completed"
| "feature:verified"
| "feature:committed"
| "project:analysis-started"
| "project:analysis-progress"
| "project:analysis-completed"
| "project:analysis-error"
| "suggestions:event"
| "spec-regeneration:event";
| 'agent:stream'
| 'auto-mode:event'
| 'auto-mode:started'
| 'auto-mode:stopped'
| 'auto-mode:idle'
| 'auto-mode:error'
| 'feature:started'
| 'feature:completed'
| 'feature:stopped'
| 'feature:error'
| 'feature:progress'
| 'feature:tool-use'
| 'feature:follow-up-started'
| 'feature:follow-up-completed'
| 'feature:verified'
| 'feature:committed'
| 'project:analysis-started'
| 'project:analysis-progress'
| 'project:analysis-completed'
| 'project:analysis-error'
| 'suggestions:event'
| 'spec-regeneration:event';
export type EventCallback = (type: EventType, payload: unknown) => void;

View File

@@ -12,6 +12,15 @@ export interface FeatureImagePath {
[key: string]: unknown;
}
export interface FeatureTextFilePath {
id: string;
path: string;
filename: string;
mimeType: string;
content: string; // Text content of the file
[key: string]: unknown;
}
export interface Feature {
id: string;
title?: string;
@@ -26,6 +35,7 @@ export interface Feature {
spec?: string;
model?: string;
imagePaths?: Array<string | FeatureImagePath | { path: string; [key: string]: unknown }>;
textFilePaths?: FeatureTextFilePath[];
// Branch info - worktree path is derived at runtime from branchName
branchName?: string; // Name of the feature branch (undefined = use current worktree)
skipTests?: boolean;
@@ -45,7 +55,7 @@ export interface Feature {
error?: string;
summary?: string;
startedAt?: string;
[key: string]: unknown; // Keep catch-all for extensibility
[key: string]: unknown; // Keep catch-all for extensibility
}
export type FeatureStatus = 'pending' | 'running' | 'completed' | 'failed' | 'verified';

View File

@@ -12,9 +12,9 @@ export interface ImageData {
* Content block for image (Claude SDK format)
*/
export interface ImageContentBlock {
type: "image";
type: 'image';
source: {
type: "base64";
type: 'base64';
media_type: string;
data: string;
};

View File

@@ -16,11 +16,7 @@ export type {
} from './provider.js';
// Feature types
export type {
Feature,
FeatureImagePath,
FeatureStatus,
} from './feature.js';
export type { Feature, FeatureImagePath, FeatureTextFilePath, FeatureStatus } from './feature.js';
// Session types
export type {
@@ -31,44 +27,23 @@ export type {
} from './session.js';
// Error types
export type {
ErrorType,
ErrorInfo,
} from './error.js';
export type { ErrorType, ErrorInfo } from './error.js';
// Image types
export type {
ImageData,
ImageContentBlock,
} from './image.js';
export type { ImageData, ImageContentBlock } from './image.js';
// Model types and constants
export {
CLAUDE_MODEL_MAP,
DEFAULT_MODELS,
type ModelAlias,
type AgentModel,
} from './model.js';
export { CLAUDE_MODEL_MAP, DEFAULT_MODELS, type ModelAlias, type AgentModel } from './model.js';
// Event types
export type {
EventType,
EventCallback,
} from './event.js';
export type { EventType, EventCallback } from './event.js';
// Spec types
export type {
SpecOutput,
} from './spec.js';
export {
specOutputSchema,
} from './spec.js';
export type { SpecOutput } from './spec.js';
export { specOutputSchema } from './spec.js';
// Enhancement types
export type {
EnhancementMode,
EnhancementExample,
} from './enhancement.js';
export type { EnhancementMode, EnhancementExample } from './enhancement.js';
// Settings types and constants
export type {
@@ -99,10 +74,7 @@ export {
} from './settings.js';
// Model display constants
export type {
ModelOption,
ThinkingLevelOption,
} from './model-display.js';
export type { ModelOption, ThinkingLevelOption } from './model-display.js';
export {
CLAUDE_MODELS,
THINKING_LEVELS,

View File

@@ -20,7 +20,7 @@ export interface ModelOption {
/** Optional badge text (e.g., "Speed", "Balanced", "Premium") */
badge?: string;
/** AI provider (currently only "claude") */
provider: "claude";
provider: 'claude';
}
/**
@@ -40,25 +40,25 @@ export interface ThinkingLevelOption {
*/
export const CLAUDE_MODELS: ModelOption[] = [
{
id: "haiku",
label: "Claude Haiku",
description: "Fast and efficient for simple tasks.",
badge: "Speed",
provider: "claude",
id: 'haiku',
label: 'Claude Haiku',
description: 'Fast and efficient for simple tasks.',
badge: 'Speed',
provider: 'claude',
},
{
id: "sonnet",
label: "Claude Sonnet",
description: "Balanced performance with strong reasoning.",
badge: "Balanced",
provider: "claude",
id: 'sonnet',
label: 'Claude Sonnet',
description: 'Balanced performance with strong reasoning.',
badge: 'Balanced',
provider: 'claude',
},
{
id: "opus",
label: "Claude Opus",
description: "Most capable model for complex work.",
badge: "Premium",
provider: "claude",
id: 'opus',
label: 'Claude Opus',
description: 'Most capable model for complex work.',
badge: 'Premium',
provider: 'claude',
},
];
@@ -68,11 +68,11 @@ export const CLAUDE_MODELS: ModelOption[] = [
* Ordered from least to most intensive reasoning.
*/
export const THINKING_LEVELS: ThinkingLevelOption[] = [
{ id: "none", label: "None" },
{ id: "low", label: "Low" },
{ id: "medium", label: "Medium" },
{ id: "high", label: "High" },
{ id: "ultrathink", label: "Ultrathink" },
{ id: 'none', label: 'None' },
{ id: 'low', label: 'Low' },
{ id: 'medium', label: 'Medium' },
{ id: 'high', label: 'High' },
{ id: 'ultrathink', label: 'Ultrathink' },
];
/**
@@ -81,11 +81,11 @@ export const THINKING_LEVELS: ThinkingLevelOption[] = [
* Used for compact UI elements like badges or dropdowns.
*/
export const THINKING_LEVEL_LABELS: Record<ThinkingLevel, string> = {
none: "None",
low: "Low",
medium: "Med",
high: "High",
ultrathink: "Ultra",
none: 'None',
low: 'Low',
medium: 'Med',
high: 'High',
ultrathink: 'Ultra',
};
/**
@@ -103,9 +103,9 @@ export const THINKING_LEVEL_LABELS: Record<ThinkingLevel, string> = {
*/
export function getModelDisplayName(model: AgentModel | string): string {
const displayNames: Record<string, string> = {
haiku: "Claude Haiku",
sonnet: "Claude Sonnet",
opus: "Claude Opus",
haiku: 'Claude Haiku',
sonnet: 'Claude Sonnet',
opus: 'Claude Opus',
};
return displayNames[model] || model;
}

View File

@@ -2,16 +2,16 @@
* Model alias mapping for Claude models
*/
export const CLAUDE_MODEL_MAP: Record<string, string> = {
haiku: "claude-haiku-4-5",
sonnet: "claude-sonnet-4-20250514",
opus: "claude-opus-4-5-20251101",
haiku: 'claude-haiku-4-5-20251001',
sonnet: 'claude-sonnet-4-5-20250929',
opus: 'claude-opus-4-5-20251101',
} as const;
/**
* Default models per provider
*/
export const DEFAULT_MODELS = {
claude: "claude-opus-4-5-20251101",
claude: 'claude-opus-4-5-20251101',
} as const;
export type ModelAlias = keyof typeof CLAUDE_MODEL_MAP;

View File

@@ -15,7 +15,7 @@ export interface ProviderConfig {
* Message in conversation history
*/
export interface ConversationMessage {
role: "user" | "assistant";
role: 'user' | 'assistant';
content: string | Array<{ type: string; text?: string; source?: object }>;
}
@@ -39,7 +39,7 @@ export interface ExecuteOptions {
* Content block in a provider message (matches Claude SDK format)
*/
export interface ContentBlock {
type: "text" | "tool_use" | "thinking" | "tool_result";
type: 'text' | 'tool_use' | 'thinking' | 'tool_result';
text?: string;
thinking?: string;
name?: string;
@@ -52,11 +52,11 @@ export interface ContentBlock {
* Message returned by a provider (matches Claude SDK streaming format)
*/
export interface ProviderMessage {
type: "assistant" | "user" | "error" | "result";
subtype?: "success" | "error";
type: 'assistant' | 'user' | 'error' | 'result';
subtype?: 'success' | 'error';
session_id?: string;
message?: {
role: "user" | "assistant";
role: 'user' | 'assistant';
content: ContentBlock[];
};
result?: string;
@@ -71,7 +71,7 @@ export interface InstallationStatus {
installed: boolean;
path?: string;
version?: string;
method?: "cli" | "npm" | "brew" | "sdk";
method?: 'cli' | 'npm' | 'brew' | 'sdk';
hasApiKey?: boolean;
authenticated?: boolean;
error?: string;
@@ -99,6 +99,6 @@ export interface ModelDefinition {
maxOutputTokens?: number;
supportsVision?: boolean;
supportsTools?: boolean;
tier?: "basic" | "standard" | "premium";
tier?: 'basic' | 'standard' | 'premium';
default?: boolean;
}

View File

@@ -19,7 +19,7 @@ export interface SpecOutput {
development_guidelines?: string[];
implementation_roadmap?: Array<{
phase: string;
status: "completed" | "in_progress" | "pending";
status: 'completed' | 'in_progress' | 'pending';
description: string;
}>;
}
@@ -29,91 +29,90 @@ export interface SpecOutput {
* Used with Claude's structured output feature for reliable parsing
*/
export const specOutputSchema = {
type: "object",
type: 'object',
properties: {
project_name: {
type: "string",
description: "The name of the project",
type: 'string',
description: 'The name of the project',
},
overview: {
type: "string",
type: 'string',
description:
"A comprehensive description of what the project does, its purpose, and key goals",
'A comprehensive description of what the project does, its purpose, and key goals',
},
technology_stack: {
type: "array",
items: { type: "string" },
description:
"List of all technologies, frameworks, libraries, and tools used",
type: 'array',
items: { type: 'string' },
description: 'List of all technologies, frameworks, libraries, and tools used',
},
core_capabilities: {
type: "array",
items: { type: "string" },
description: "List of main features and capabilities the project provides",
type: 'array',
items: { type: 'string' },
description: 'List of main features and capabilities the project provides',
},
implemented_features: {
type: "array",
type: 'array',
items: {
type: "object",
type: 'object',
properties: {
name: {
type: "string",
description: "Name of the implemented feature",
type: 'string',
description: 'Name of the implemented feature',
},
description: {
type: "string",
description: "Description of what the feature does",
type: 'string',
description: 'Description of what the feature does',
},
file_locations: {
type: "array",
items: { type: "string" },
description: "File paths where this feature is implemented",
type: 'array',
items: { type: 'string' },
description: 'File paths where this feature is implemented',
},
},
required: ["name", "description"],
required: ['name', 'description'],
},
description: "Features that have been implemented based on code analysis",
description: 'Features that have been implemented based on code analysis',
},
additional_requirements: {
type: "array",
items: { type: "string" },
description: "Any additional requirements or constraints",
type: 'array',
items: { type: 'string' },
description: 'Any additional requirements or constraints',
},
development_guidelines: {
type: "array",
items: { type: "string" },
description: "Development standards and practices",
type: 'array',
items: { type: 'string' },
description: 'Development standards and practices',
},
implementation_roadmap: {
type: "array",
type: 'array',
items: {
type: "object",
type: 'object',
properties: {
phase: {
type: "string",
description: "Name of the implementation phase",
type: 'string',
description: 'Name of the implementation phase',
},
status: {
type: "string",
enum: ["completed", "in_progress", "pending"],
description: "Current status of this phase",
type: 'string',
enum: ['completed', 'in_progress', 'pending'],
description: 'Current status of this phase',
},
description: {
type: "string",
description: "Description of what this phase involves",
type: 'string',
description: 'Description of what this phase involves',
},
},
required: ["phase", "status", "description"],
required: ['phase', 'status', 'description'],
},
description: "Phases or roadmap items for implementation",
description: 'Phases or roadmap items for implementation',
},
},
required: [
"project_name",
"overview",
"technology_stack",
"core_capabilities",
"implemented_features",
'project_name',
'overview',
'technology_stack',
'core_capabilities',
'implemented_features',
],
additionalProperties: false,
};