# @fusion/tui
Terminal UI components for fn, built with [Ink](https://github.com/vadimdemedes/ink) (React for the command line).
## Status
This package is under active development and not yet published.
## Installation
This package is part of the fn workspace and is not installed separately. It is available as a private workspace package.
## API Reference
### FusionProvider
The `FusionProvider` component initializes a `TaskStore` and provides it via React context.
```tsx
import { FusionProvider } from "@fusion/tui";
function App() {
return (
);
}
```
#### Props
| Prop | Type | Description |
|------|------|-------------|
| `projectDir` | `string` (optional) | Explicit project directory override. When provided, skips auto-detection. |
| `children` | `React.ReactNode` | Child components that will have access to the Fusion context. |
#### Behavior
- On mount, auto-detects the Fusion project by walking up from `process.cwd()` looking for `.fusion/fusion.db`
- If no project is found, renders a red error message
- On unmount, calls `store.close()` to cleanly shut down the SQLite connection
### useFusion
Hook to access the Fusion context. Must be used within a `FusionProvider`.
```tsx
import { useFusion } from "@fusion/tui";
function TaskList() {
const { store, projectPath } = useFusion();
useEffect(() => {
store.listTasks().then((tasks) => {
// Render tasks...
});
}, [store]);
return Project: {projectPath};
}
```
#### Returns
| Property | Type | Description |
|----------|------|-------------|
| `store` | `TaskStore` | The initialized TaskStore instance |
| `projectPath` | `string` | Absolute path to the project directory |
#### Throws
`Error` if used outside of a `FusionProvider`.
### detectProjectDir
Detect the Fusion project root directory by walking up from a starting path.
```typescript
import { detectProjectDir } from "@fusion/tui";
// Find project from current directory
const projectPath = detectProjectDir();
// Find project from a specific directory
const projectPath = detectProjectDir("/Users/me/code/my-project/src");
```
#### Parameters
| Parameter | Type | Description |
|-----------|------|-------------|
| `startPath` | `string` (optional) | Starting directory for the search (defaults to `process.cwd()`) |
#### Returns
The absolute path to the project root, or `null` if no project directory is detected.
## Example
```tsx
import React from "react";
import { render, Box, Text } from "ink";
import { FusionProvider, useFusion } from "@fusion/tui";
function ProjectInfo() {
const { store, projectPath } = useFusion();
const [tasks, setTasks] = React.useState([]);
React.useEffect(() => {
store.listTasks().then(setTasks);
}, [store]);
return (
Project: {projectPath}
Tasks: {tasks.length}
);
}
render(
);
```