diff --git a/LICENSE b/LICENSE index 317c262..406253f 100644 --- a/LICENSE +++ b/LICENSE @@ -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 diff --git a/README.md b/README.md index 09936cb..4f0c687 100644 --- a/README.md +++ b/README.md @@ -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 diff --git a/app/favicon.ico b/app/favicon.ico deleted file mode 100644 index 718d6fe..0000000 Binary files a/app/favicon.ico and /dev/null differ diff --git a/docs/architecture.md b/docs/architecture.md index 95b2a67..f4daa0c 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -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 @@ -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. diff --git a/docs/development.md b/docs/development.md index 3acc829..e7f6aba 100644 --- a/docs/development.md +++ b/docs/development.md @@ -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 diff --git a/docs/project.md b/docs/project.md index 38e20a3..c2b7f1b 100644 --- a/docs/project.md +++ b/docs/project.md @@ -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. @@ -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. diff --git a/features/chat/components/prompt-prefix.tsx b/features/chat/components/prompt-prefix.tsx deleted file mode 100644 index c8e5d36..0000000 --- a/features/chat/components/prompt-prefix.tsx +++ /dev/null @@ -1,8 +0,0 @@ -export function PromptPrefix() { - return ( - - visitor at cekrauseee, root directory - - - ); -} diff --git a/next.config.ts b/next.config.ts deleted file mode 100644 index 41a9c18..0000000 --- a/next.config.ts +++ /dev/null @@ -1,5 +0,0 @@ -import type { NextConfig } from "next"; - -const nextConfig: NextConfig = {/* config options here */}; - -export default nextConfig; diff --git a/package-lock.json b/package-lock.json index daed9c1..139f676 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,11 @@ { - "name": "cekrauseee", + "name": "shell", "version": "0.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "cekrauseee", + "name": "shell", "version": "0.1.0", "dependencies": { "next": "16.3.1", diff --git a/package.json b/package.json index c69bf9a..5e9ee26 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "cekrauseee", + "name": "shell", "version": "0.1.0", "private": true, "scripts": { diff --git a/public/file.svg b/public/file.svg deleted file mode 100644 index 004145c..0000000 --- a/public/file.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/globe.svg b/public/globe.svg deleted file mode 100644 index 567f17b..0000000 --- a/public/globe.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/next.svg b/public/next.svg deleted file mode 100644 index 5174b28..0000000 --- a/public/next.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/vercel.svg b/public/vercel.svg deleted file mode 100644 index 7705396..0000000 --- a/public/vercel.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/window.svg b/public/window.svg deleted file mode 100644 index b2b2a44..0000000 --- a/public/window.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/app/globals.css b/src/app/globals.css similarity index 99% rename from app/globals.css rename to src/app/globals.css index 28d89c6..1354310 100644 --- a/app/globals.css +++ b/src/app/globals.css @@ -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; } diff --git a/app/layout.tsx b/src/app/layout.tsx similarity index 82% rename from app/layout.tsx rename to src/app/layout.tsx index 62617d2..fcf4723 100644 --- a/app/layout.tsx +++ b/src/app/layout.tsx @@ -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 }) { diff --git a/app/page.tsx b/src/app/page.tsx similarity index 100% rename from app/page.tsx rename to src/app/page.tsx diff --git a/features/chat/actions.ts b/src/features/chat/actions.ts similarity index 100% rename from features/chat/actions.ts rename to src/features/chat/actions.ts diff --git a/features/chat/components/block-cursor-input.tsx b/src/features/chat/components/block-cursor-input.tsx similarity index 100% rename from features/chat/components/block-cursor-input.tsx rename to src/features/chat/components/block-cursor-input.tsx diff --git a/features/chat/components/chat-shell.tsx b/src/features/chat/components/chat-shell.tsx similarity index 99% rename from features/chat/components/chat-shell.tsx rename to src/features/chat/components/chat-shell.tsx index d8dd230..31eb2d5 100644 --- a/features/chat/components/chat-shell.tsx +++ b/src/features/chat/components/chat-shell.tsx @@ -164,7 +164,7 @@ export function ChatShell() { style={{ translate: `0 ${-lineOffset}lh` }} >