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
31 changes: 31 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,36 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

- CLI npm package name is `okcodes`. Install with `npm install -g okcodes`; the `okcode` binary name is unchanged.

## [0.0.7] - 2026-03-31

See [docs/releases/v0.0.7.md](docs/releases/v0.0.7.md) for full notes and [docs/releases/v0.0.7/assets.md](docs/releases/v0.0.7/assets.md) for release asset inventory.

### Added

- Add a command palette for project and thread switching.
- Add GitHub clone flow from repository URLs.
- Add checklist views for proposed plans.
- Add browser viewport presets to the preview panel.
- Add skill CRUD and slash-command support.
- Add `rec` command option mapping for review replies.

### Changed

- Refresh UI fonts and theme presets.
- Improve PR panel accessibility and keyboard shortcuts.
- Reorganize conflict intake UI and expandable summaries.
- Fallback to available git branches when creating new worktrees.
- Collapse consecutive work entries in the timeline.
- Polish sidebar project add-row styling and workspace search filters.

### Fixed

- Harden selection highlight styling for accessibility and contrast compatibility.

### Removed

- None.

## [0.0.6] - 2026-03-28

See [docs/releases/v0.0.6.md](docs/releases/v0.0.6.md) for full notes and [docs/releases/v0.0.6/assets.md](docs/releases/v0.0.6/assets.md) for release asset inventory.
Expand Down Expand Up @@ -151,5 +181,6 @@ First public version tag. See [docs/releases/v0.0.1.md](docs/releases/v0.0.1.md)
[0.0.3]: https://github.com/OpenKnots/okcode/releases/tag/v0.0.3
[0.0.2]: https://github.com/OpenKnots/okcode/releases/tag/v0.0.2
[0.0.1]: https://github.com/OpenKnots/okcode/releases/tag/v0.0.1
[0.0.7]: https://github.com/OpenKnots/okcode/releases/tag/v0.0.7
[0.0.5]: https://github.com/OpenKnots/okcode/releases/tag/v0.0.5
[0.0.6]: https://github.com/OpenKnots/okcode/releases/tag/v0.0.6
3 changes: 3 additions & 0 deletions apps/server/src/prReview/Layers/PrReview.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { Effect, Layer } from "effect";
import type {
PrConflictAnalysis,
GitHubUserPreview,
PrReviewAddThreadInput,
PrReviewComment,
PrReviewConfig,
Expand All @@ -12,9 +13,11 @@ import type {
PrReviewReplyToThreadInput,
PrReviewResolveThreadInput,
PrReviewSearchUsersInput,
PrReviewSearchUsersResult,
PrReviewSummary,
PrReviewUserPreviewInput,
PrSubmitReviewInput,
PrSubmitReviewResult,
PrWorkflowStepRunResult,
} from "@okcode/contracts";
import { GitHubCli } from "../../git/Services/GitHubCli.ts";
Expand Down
16 changes: 12 additions & 4 deletions apps/web/src/components/CommandPalette.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,13 @@ function commandScore(command: PaletteCommand, query: string): number {
return best;
}

function sortByCommandScore(
commands: ReadonlyArray<PaletteCommand>,
query: string,
): PaletteCommand[] {
return commands.toSorted((a, b) => commandScore(b, query) - commandScore(a, query));
}

// ── Command palette component ───────────────────────────────────────

export function CommandPalette() {
Expand Down Expand Up @@ -344,9 +351,10 @@ function CommandsView() {
// Filter commands by query
const filtered = useMemo(() => {
if (query.length === 0) return commands;
return commands
.filter((cmd) => commandMatchesQuery(cmd, query))
.toSorted((a, b) => commandScore(b, query) - commandScore(a, query));
return sortByCommandScore(
commands.filter((cmd) => commandMatchesQuery(cmd, query)),
query,
);
}, [commands, query]);

// Group filtered commands
Expand Down Expand Up @@ -492,7 +500,7 @@ function ProjectsView() {
? projects.filter((p) => fuzzyMatch(query, p.name) || fuzzyMatch(query, p.cwd))
: projects;

return [...filtered].toSorted((a, b) => {
return filtered.toSorted((a, b) => {
const aIndex = mruProjectIds.indexOf(a.id);
const bIndex = mruProjectIds.indexOf(b.id);
if (aIndex >= 0 && bIndex >= 0) return aIndex - bIndex;
Expand Down
2 changes: 1 addition & 1 deletion apps/web/src/components/PlanChecklist.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ const PlanChecklist = memo(function PlanChecklist({
<div className="rounded-xl border border-border/50 bg-background/40">
{items.map((item, index) => (
<PlanChecklistRow
key={item.text}
key={`${item.status}:${item.text}`}
item={item}
index={index}
isLast={index === items.length - 1}
Expand Down
15 changes: 5 additions & 10 deletions apps/web/src/hooks/useTheme.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,5 @@
import { useCallback, useEffect, useSyncExternalStore } from "react";
import {
applyCustomTheme,
applyFontOverride,
applyRadiusOverride,
getStoredCustomTheme,
initCustomTheme,
removeCustomTheme,
} from "../lib/customTheme";
import { initCustomTheme } from "../lib/customTheme";

type Theme = "light" | "dark" | "system";
type ColorTheme =
Expand All @@ -16,7 +9,8 @@ type ColorTheme =
| "midnight-clarity"
| "carbon"
| "vapor"
| "cathedral-circuit";
| "cathedral-circuit"
| "custom";

type FontFamily = "dm-sans" | "inter" | "plus-jakarta-sans";

Expand Down Expand Up @@ -75,7 +69,8 @@ function getStoredColorTheme(): ColorTheme {
raw === "midnight-clarity" ||
raw === "carbon" ||
raw === "vapor" ||
raw === "cathedral-circuit"
raw === "cathedral-circuit" ||
raw === "custom"
) {
return raw;
}
Expand Down
14 changes: 14 additions & 0 deletions apps/web/src/routes/_chat.settings.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ import { SidebarTrigger } from "../components/ui/sidebar";
import { Switch } from "../components/ui/switch";
import { SidebarInset } from "../components/ui/sidebar";
import { Tooltip, TooltipPopup, TooltipTrigger } from "../components/ui/tooltip";
import { CustomThemeDialog } from "../components/CustomThemeDialog";
import { resolveAndPersistPreferredEditor } from "../editorPreferences";
import { isElectron } from "../env";
import { useTheme, COLOR_THEMES, FONT_FAMILIES } from "../hooks/useTheme";
Expand All @@ -47,6 +48,19 @@ import {
globalEnvironmentVariablesQueryOptions,
projectEnvironmentVariablesQueryOptions,
} from "../lib/environmentVariablesReactQuery";
import {
applyCustomTheme,
clearFontOverride,
clearRadiusOverride,
clearStoredCustomTheme,
getStoredCustomTheme,
getStoredFontOverride,
getStoredRadiusOverride,
removeCustomTheme,
setStoredFontOverride,
setStoredRadiusOverride,
type CustomThemeData,
} from "../lib/customTheme";
import { serverConfigQueryOptions } from "../lib/serverReactQuery";
import { cn } from "../lib/utils";
import { ensureNativeApi, readNativeApi } from "../nativeApi";
Expand Down
4 changes: 3 additions & 1 deletion apps/web/src/selection-styles.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,9 @@ function readSrc(relativePath: string): string {
return readFileSync(resolve(__dirname, relativePath), "utf-8");
}

const gamma = (c: number) => (c <= 0.0031308 ? 12.92 * c : 1.055 * Math.pow(c, 1 / 2.4) - 0.055);
function gamma(c: number): number {
return c <= 0.0031308 ? 12.92 * c : 1.055 * Math.pow(c, 1 / 2.4) - 0.055;
}

// ═══════════════════════════════════════════════════════════════════════════
// oklch → sRGB conversion (used for WCAG contrast checks)
Expand Down
4 changes: 3 additions & 1 deletion apps/web/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@
"lib": ["ES2023", "DOM", "DOM.Iterable"],
"types": ["vite/client"],
"paths": {
"~/*": ["./src/*"]
"effect": ["../../node_modules/effect"],
"effect/*": ["../../node_modules/effect/*"],
"~/*": ["./apps/web/src/*"]
},
"plugins": [
{
Expand Down
1 change: 0 additions & 1 deletion bun.lock

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

1 change: 1 addition & 0 deletions docs/releases/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ Human-readable notes and asset inventories for tagged releases.

| Version | Notes | Assets |
| ------------------ | ---------------------------------------------------------- | ---------------------------- |
| [0.0.7](v0.0.7.md) | Navigation, clone flow, plan checklists, preview presets | [manifest](v0.0.7/assets.md) |
| [0.0.6](v0.0.6.md) | PR + preview polish, env persistence, search, landing page | [manifest](v0.0.6/assets.md) |
| [0.0.5](v0.0.5.md) | Git workflows, PR review, mobile shell | [manifest](v0.0.5/assets.md) |
| [0.0.4](v0.0.4.md) | PR review, desktop preview, release tooling | [manifest](v0.0.4/assets.md) |
Expand Down
32 changes: 32 additions & 0 deletions docs/releases/v0.0.7.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# OK Code v0.0.7

**Date:** 2026-03-31
**Tag:** [`v0.0.7`](https://github.com/OpenKnots/okcode/releases/tag/v0.0.7)

## Summary

OK Code v0.0.7 focuses on faster navigation, stronger workspace setup, and better day-to-day ergonomics across the web UI, preview panel, and release tooling.

## Highlights

- **Add a command palette for project and thread switching.**
- **Add GitHub clone flow from repository URLs.**
- **Add checklist views for proposed plans.**
- **Add browser viewport presets to the preview panel.**
- **Refresh UI fonts and theme presets.**
- **Improve PR panel accessibility and keyboard shortcuts.**
- **Reorganize conflict intake UI and expandable summaries.**
- **Fallback to available git branches when creating new worktrees.**

## Breaking changes

- None.

## Upgrade and install

- **CLI:** `npm install -g okcodes@0.0.7` (after the package is published to npm manually).
- **Desktop:** Download from [GitHub Releases](https://github.com/OpenKnots/okcode/releases/tag/v0.0.7). Filenames are listed in [assets.md](v0.0.7/assets.md).

## Known limitations

OK Code remains early work in progress. Expect rough edges around session recovery, streaming edge cases, and platform-specific desktop behavior. Report issues on GitHub.
36 changes: 36 additions & 0 deletions docs/releases/v0.0.7/assets.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# v0.0.7 - Release assets (manifest)

Binaries are **not** stored in this git repository; they are attached to the [GitHub Release for `v0.0.7`](https://github.com/OpenKnots/okcode/releases/tag/v0.0.7) by the [Release Desktop workflow](../../.github/workflows/release.yml).

The GitHub Release also includes **documentation attachments** (same content as in-repo, stable filenames for download):

| File | Source in repo |
| --------------------------- | ------------------------------------- |
| `okcode-CHANGELOG.md` | [CHANGELOG.md](../../../CHANGELOG.md) |
| `okcode-RELEASE-NOTES.md` | [v0.0.7.md](../v0.0.7.md) |
| `okcode-ASSETS-MANIFEST.md` | This file |

After the workflow completes, expect **installer and updater** artifacts similar to the following (exact names may include the product name `OK Code` and version `0.0.7`).

## Desktop installers and payloads

| Platform | Kind | Typical pattern |
| ------------------- | -------------- | --------------- |
| macOS Apple Silicon | DMG | `*.dmg` (arm64) |
| macOS Intel | DMG | `*.dmg` (x64) |
| macOS | ZIP (updater) | `*.zip` |
| Linux x64 | AppImage | `*.AppImage` |
| Windows x64 | NSIS installer | `*.exe` |

## Electron updater metadata

| File | Purpose |
| ------------------ | --------------------------------------------------------- |
| `latest-mac.yml` | macOS update manifest (merged from per-arch builds in CI) |
| `latest-linux.yml` | Linux update manifest |
| `latest.yml` | Windows update manifest |
| `*.blockmap` | Differential download block maps |

## Checksums

SHA-256 checksums are not committed here; verify downloads via GitHub's release UI or `gh release download` if you use the GitHub CLI.
2 changes: 1 addition & 1 deletion scripts/build-desktop-artifact.ts
Original file line number Diff line number Diff line change
Expand Up @@ -863,5 +863,5 @@ const buildDesktopArtifactCli = Command.make("build-desktop-artifact", {
Command.run(buildDesktopArtifactCli, { version: "0.0.0" }).pipe(
Effect.scoped,
Effect.provide([Logger.layer([Logger.consolePretty()]), NodeServices.layer]),
(program) => NodeRuntime.runMain(program as Effect.Effect<void, never, never>),
(effect) => NodeRuntime.runMain(effect as never),
);
2 changes: 1 addition & 1 deletion scripts/dev-runner.ts
Original file line number Diff line number Diff line change
Expand Up @@ -555,5 +555,5 @@ const runtimeProgram = Command.run(devRunnerCli, { version: "0.0.0" }).pipe(
) as Effect.Effect<void, never, never>;

if (import.meta.main) {
NodeRuntime.runMain(runtimeProgram);
NodeRuntime.runMain(runtimeProgram as never);
}
7 changes: 6 additions & 1 deletion tsconfig.base.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
{
"compilerOptions": {
"baseUrl": ".",
"target": "ES2023",
"module": "ESNext",
"moduleResolution": "Bundler",
Expand All @@ -12,6 +13,10 @@
"skipLibCheck": true,
"allowSyntheticDefaultImports": true,
"esModuleInterop": true,
"resolveJsonModule": true
"resolveJsonModule": true,
"paths": {
"effect": ["./node_modules/effect"],
"effect/*": ["./node_modules/effect/*"]
}
}
}
Loading