Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion LICENSE
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
MIT License

Copyright (c) 2026 cekrauseee
Copyright (c) 2026 shell

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# cekrauseee
# shell

A terminal-style AI chat shell built with Next.js and the OpenAI Responses API. It is the foundation for a future conversational portfolio; the current assistant has no personal knowledge about cekrauseee.
An interactive AI chat shell built with Next.js and the OpenAI Responses API.

## Prerequisites

Expand Down
Binary file removed app/favicon.ico
Binary file not shown.
16 changes: 8 additions & 8 deletions docs/architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,13 @@ The project is a Next.js 16 App Router application. A Client Component owns the

## Components

- `app/` defines the root layout, metadata, global styling, and the `/` route.
- `features/chat/components/chat-shell.tsx` owns the conversation, composer, keyboard controls, errors, and accessibility announcements.
- `features/chat/components/block-cursor-input.tsx` mirrors the textarea content to draw a caret-aware block cursor while retaining a native textarea for input.
- `features/chat/components/markdown-response.tsx` renders safe GitHub Flavored Markdown and applies the word-reveal presentation. Raw HTML is not enabled, and links opened in a new tab use `noopener` and `noreferrer`.
- `features/chat/hooks/` contains textarea sizing and in-memory prompt history behavior.
- `features/chat/actions.ts` validates messages and calls the OpenAI Responses API from the server.
- `lib/openai.ts` lazily creates and reuses the server-side OpenAI client.
- `src/app/` defines the root layout, metadata, global styling, and the `/` route.
- `src/features/chat/components/chat-shell.tsx` owns the conversation, composer, keyboard controls, errors, and accessibility announcements.
- `src/features/chat/components/block-cursor-input.tsx` mirrors the textarea content to draw a caret-aware block cursor while retaining a native textarea for input.
- `src/features/chat/components/markdown-response.tsx` renders safe GitHub Flavored Markdown and applies the word-reveal presentation. Raw HTML is not enabled, and links opened in a new tab use `noopener` and `noreferrer`.
- `src/features/chat/hooks/` contains textarea sizing and in-memory prompt history behavior.
- `src/features/chat/actions.ts` validates messages and calls the OpenAI Responses API from the server.
- `src/lib/openai.ts` lazily creates and reuses the server-side OpenAI client.

## Data Flow

Expand All @@ -30,6 +30,6 @@ The project is a Next.js 16 App Router application. A Client Component owns the
- Only user and assistant roles cross the Server Action boundary, and the final submitted message must be from the user.
- The application does not persist conversations; browser state is the current source of truth.
- OpenAI response storage remains disabled with `store: false`.
- The current request contains no personal context or knowledge source about cekrauseee.
- The current request contains no application-specific context or knowledge source about shell.
- Clearing the shell invalidates any in-flight response so it cannot repopulate the cleared conversation.
- Public deployment requires authentication, rate limiting, quotas, or equivalent abuse and cost controls not present in this repository.
4 changes: 2 additions & 2 deletions docs/development.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,12 +41,12 @@ npm run typecheck

There is currently no automated test suite. For behavior changes, also verify the following in a browser:

- The empty full-screen shell follows the system light or dark preference and shows `visitor@cekrauseee:/` with a block cursor, without visible onboarding or placeholder text.
- The empty full-screen shell follows the system light or dark preference and shows `$` with a block cursor, without visible onboarding or placeholder text.
- Enter submits, Shift+Enter adds a line, the arrow keys recall prompt history, and Control/Command+L clears the conversation.
- Clicking outside the textarea focuses the active prompt at its end.
- Pending and error states are announced, and the custom cursor remains usable for selection and input method composition.
- Responses reveal word by word, respect reduced-motion preferences, and render Markdown without raw HTML.
- Answers remain generic and language-aware; personal cekrauseee knowledge is not implemented.
- Answers remain generic and language-aware; application-specific shell knowledge is not implemented.

## Conventions

Expand Down
6 changes: 3 additions & 3 deletions docs/project.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@

## Purpose

cekrauseee is a terminal-inspired AI chat shell and the foundation for a future conversational portfolio. The current model is a generic assistant that replies helpfully in the language of the visitor's latest message. Personal knowledge about cekrauseee, including work, experience, and projects, is future scope.
shell is a terminal-inspired interactive AI chat shell. The current model is a generic assistant that replies helpfully in the language of the visitor's latest message.

## Scope

The application currently contains one App Router page and one full-screen chat experience. It uses a neutral monochrome palette that follows the system light or dark preference. The empty state shows only the root prompt `visitor@cekrauseee:/` and a custom block cursor; there is no visible onboarding copy or input placeholder.
The application currently contains one App Router page and one full-screen chat experience. It uses a neutral monochrome palette that follows the system light or dark preference. The empty state shows only the `$` prompt and a custom block cursor; there is no visible onboarding copy or input placeholder.

The interface supports multiline prompts, prompt history with the up and down arrow keys, submission with Enter, new lines with Shift+Enter, conversation clearing with Control/Command+L, pending and error states, and accessible status announcements. Clicking outside the textarea focuses the active prompt and moves the caret to its end.

Expand All @@ -22,5 +22,5 @@ The browser holds the active messages and prompt history in React state. Each su
- The application has no persistence layer.
- OpenAI requests set `store: false`; the application itself does not save request or response content.
- The OpenAI API key remains server-side and must be supplied as `OPENAI_API_KEY`.
- Personal portfolio knowledge is not implemented yet; do not present generic model answers as facts about cekrauseee.
- Application-specific knowledge is not implemented yet; do not present generic model answers as facts about shell.
- The current shell is a development chat experience, not a production-ready public service.
8 changes: 0 additions & 8 deletions features/chat/components/prompt-prefix.tsx

This file was deleted.

5 changes: 0 additions & 5 deletions next.config.ts

This file was deleted.

4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"name": "cekrauseee",
"name": "shell",
"version": "0.1.0",
"private": true,
"scripts": {
Expand Down
1 change: 0 additions & 1 deletion public/file.svg

This file was deleted.

1 change: 0 additions & 1 deletion public/globe.svg

This file was deleted.

1 change: 0 additions & 1 deletion public/next.svg

This file was deleted.

1 change: 0 additions & 1 deletion public/vercel.svg

This file was deleted.

1 change: 0 additions & 1 deletion public/window.svg

This file was deleted.

1 change: 0 additions & 1 deletion app/globals.css → src/app/globals.css
Original file line number Diff line number Diff line change
Expand Up @@ -324,7 +324,6 @@ textarea {
box-shadow: inset 0 0 0 1px var(--text);
color: var(--text);
line-height: 1.25;
vertical-align: -0.13em;
animation: block-cursor-blink 1s steps(1, end) infinite;
}

Expand Down
4 changes: 2 additions & 2 deletions app/layout.tsx → src/app/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ const geistMono = Geist_Mono({
});

export const metadata: Metadata = {
title: "cekrauseee — conversational shell",
description: "A minimal conversational shell.",
title: "shell",
description: "An interactive shell.",
};

export default function RootLayout({ children }: { children: ReactNode }) {
Expand Down
File renamed without changes.
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ export function ChatShell() {
style={{ translate: `0 ${-lineOffset}lh` }}
>
<div className="shell__inner">
<h1 className="sr-only">cekrauseee conversational shell</h1>
<h1 className="sr-only">shell interactive shell</h1>

<ol className="conversation" aria-label="Conversation">
{messages.map((message, index) => (
Expand Down
8 changes: 8 additions & 0 deletions src/features/chat/components/prompt-prefix.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
export function PromptPrefix() {
return (
<span className="prompt">
<span className="sr-only">shell prompt</span>
<span aria-hidden="true">$</span>
</span>
);
}
File renamed without changes.
File renamed without changes.
2 changes: 1 addition & 1 deletion tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
}
],
"paths": {
"@/*": ["./*"]
"@/*": ["./src/*"]
}
},
"include": [
Expand Down
Loading