Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
169 commits
Select commit Hold shift + click to select a range
00f3fee
refactor(workspace): introduce WorkspaceCx reactor abstraction for GP…
matej21 Jun 24, 2026
a1f4319
feat(remote-server): shared local-daemon discovery + token mint (Fáze 1)
matej21 Jun 24, 2026
40876e6
feat(remote-server): spawn_daemon + wait_until_ready primitives (Fáze…
matej21 Jun 24, 2026
d24f37b
docs: full headless migration roadmap (daemon + thin clients)
matej21 Jun 24, 2026
577df6e
feat(remote-server): ensure_local_daemon orchestration (Fáze 1c)
matej21 Jun 24, 2026
24785c9
refactor(remote-server): make gpui an optional feature (Fáze 4 ground…
matej21 Jun 24, 2026
7cfc29b
refactor(hooks): make gpui an optional feature (Fáze 4 groundwork)
matej21 Jun 24, 2026
f426db9
refactor(workspace): de-GPUI the hook chain via WorkspaceCx service a…
matej21 Jun 24, 2026
36f488e
refactor(workspace): make gpui an optional feature (Fáze 4 milestone)
matej21 Jun 24, 2026
c710977
refactor(services): introduce ServiceCx reactor trait, de-GPUI Servic…
matej21 Jun 24, 2026
e814c54
refactor(services): make gpui an optional feature (Fáze 4)
matej21 Jun 24, 2026
621a66b
refactor(app-core): de-GPUI execute_action production path
matej21 Jun 24, 2026
3d72ff8
refactor(app-core): make gpui optional; sever okena-workspace gpui chain
matej21 Jun 24, 2026
0925cd9
refactor(theme): make gpui an optional feature (Fáze 4 groundwork)
matej21 Jun 24, 2026
ec8826f
refactor(files): split gpui-free file ops from the gpui viewer
matej21 Jun 24, 2026
28f0e19
feat(daemon-core): scaffold gpui-free crate + tokio reactor trait impls
matej21 Jun 24, 2026
a867a20
docs: client/daemon split rule (data vs presentation) + Model A for r…
matej21 Jun 24, 2026
90560a0
feat(daemon-core): observer reactor (autosave / state_version / servi…
matej21 Jun 24, 2026
46f66c1
feat(daemon-core): gpui-free PTY event loop + git-status poller
matej21 Jun 24, 2026
829c837
feat(daemon-core): gpui-free settings/theme handlers (daemon_config)
matej21 Jun 24, 2026
95eb6e9
refactor(remote-server): de-default okena-workspace dep (gpui-optional)
matej21 Jun 24, 2026
086680d
feat(daemon-core): gpui-free remote command loop
matej21 Jun 24, 2026
edb2c3a
feat(daemon-core): DaemonCore assembly (server + reactor + loops)
matej21 Jun 24, 2026
09b6df0
feat(daemon): standalone gpui-free okena-daemon binary
matej21 Jun 24, 2026
15cf7ab
docs: record Phase E (daemon-core) + Phase F (okena-daemon binary) done
matej21 Jun 24, 2026
17ba1ce
feat(daemon): honor OKENA_PROFILE + spawn_daemon launches okena-daemon
matej21 Jun 24, 2026
84d2618
docs: Phase B prerequisite (single-writer to daemon) + exact desktop …
matej21 Jun 24, 2026
0086e4a
feat(app): --daemon-client mode (lifecycle + loopback attach)
matej21 Jun 24, 2026
79791d7
fix(daemon): DaemonCore acquires the single-writer instance lock
matej21 Jun 24, 2026
082675a
feat(daemon): wire lifecycle hooks (HookRunner + HookMonitor)
matej21 Jun 25, 2026
90f427f
docs: record Phase A + single-writer + hooks; verified StateResponse …
matej21 Jun 25, 2026
c4cee86
feat(app): Phase B — hide loopback daemon connection from REMOTE section
matej21 Jun 25, 2026
991b5a3
feat(app): Phase D1 — flip default to daemon-client (GUI is always a …
matej21 Jun 25, 2026
251af36
refactor(app): Phase D2 — delete the in-process local PROJECT path
matej21 Jun 25, 2026
290d68f
refactor(app): Phase D3 — delete the GUI's dead in-process infrastruc…
matej21 Jun 25, 2026
7aeddae
docs: record Phases B + D done; architectural goal met + follow-ups
matej21 Jun 25, 2026
ea7fd66
fix(app): repaint project column on workspace change (stale git info)
matej21 Jun 25, 2026
8401644
fix(git): carry review_base over the wire (branch-vs-base diff chip)
matej21 Jun 25, 2026
fc5a828
fix(app): stop the GUI client clobbering the daemon's workspace.json
matej21 Jun 25, 2026
b2adc09
fix(services): start docker services with `up -d`, not `start`
matej21 Jun 25, 2026
b3b5de4
fix(daemon): materialize restored terminals at startup (blank terminals)
matej21 Jun 25, 2026
6c4f9e8
feat(daemon): panic hook + okena-daemon.log (capture random crashes)
matej21 Jun 25, 2026
fad87e1
fix(daemon): loopback daemon serves plain http (TLS only off-host)
matej21 Jun 25, 2026
97cd0dc
fix(git): port gh PR/CI enrichment into the daemon git poll
matej21 Jun 25, 2026
59c47b4
chore: add daemon-client gap audit script
matej21 Jun 25, 2026
90a41df
fix(app): stop workspace.json clobber on profile switch
matej21 Jun 25, 2026
b236688
fix(app): route project/worktree lifecycle handlers to the daemon
matej21 Jun 25, 2026
47c2cd9
feat(daemon): carry pinned/activity/shell/hook-terminals over the wir…
matej21 Jun 25, 2026
b6aa5cd
feat(daemon): route terminal shell-switch through a SwitchTerminalShe…
matej21 Jun 25, 2026
265dd63
feat(daemon): route discovered-worktree tracking through an AddDiscov…
matej21 Jun 25, 2026
2b2f916
feat(daemon): route hook-terminal rerun through a RerunHook action
matej21 Jun 25, 2026
17eb4cb
docs(app): mark session-switch as the deferred last daemon-client gap
matej21 Jun 25, 2026
91abe27
feat(app): client-owned window-layout persistence (restore multiple w…
matej21 Jun 25, 2026
0d680e4
chore(audit): anchor add_project/delete_project patterns to the ws re…
matej21 Jun 25, 2026
d17e2f6
feat(daemon): make sessions work in the daemon-client model (load/sav…
matej21 Jun 25, 2026
fd0219d
fix(workspace): stop daemon show_in_overview from clobbering client p…
matej21 Jun 25, 2026
58b622a
fix(app): auto-reset compounded window-layout visibility (v1 → v2 mig…
matej21 Jun 25, 2026
e777240
fix(workspace): make window-layout migration non-destructive
matej21 Jun 26, 2026
9af7163
fix(daemon): poll git status for all projects; gate gh PR/CI by what …
matej21 Jun 26, 2026
5298ba9
fix(app): make CI-checks popover (and commit log) work in daemon-clie…
matej21 Jun 26, 2026
56dac63
feat(daemon): carry per-project hooks over the wire + edit them via a…
matej21 Jun 26, 2026
a54f811
feat(daemon): forward daemon-originated toasts to thin clients over WS
matej21 Jun 26, 2026
4bc1e6f
fix(daemon): project hooks onto the wire in daemon-core's build_api_p…
matej21 Jun 26, 2026
334fb36
feat(app): fire OS notifications for remote (daemon-served) terminals
matej21 Jun 26, 2026
c8e843d
feat(app): add Restart Daemon action with confirm + reconnect
matej21 Jun 26, 2026
bf050bc
chore: update Cargo.lock for okena-daemon -> okena-remote-server dep
matej21 Jun 26, 2026
802a28b
feat(core): snapshot config before upgrade for revert safety-net
matej21 Jun 26, 2026
9451a14
refactor(git,files): delete dead local-side providers
matej21 Jun 26, 2026
6d1fe39
fix(app): route detached terminal windows through the remote transport
matej21 Jun 26, 2026
35c6e3c
fix(app): answer remote terminals' OSC52 clipboard reads client-side
matej21 Jun 26, 2026
a751260
feat(daemon): port terminal-exit lifecycle into the gpui-free PTY loop
matej21 Jun 26, 2026
dc5b734
feat(git): route branch switch/create through the remote transport
matej21 Jun 26, 2026
9220124
feat(daemon): stamp command-finished activity + apply CLAUDE_CONFIG_DIR
matej21 Jun 26, 2026
1e9e66a
fix(git): gate git menus on mirrored status, not local fs check
matej21 Jun 26, 2026
e857ccb
refactor(app): delete the dead in-process PTY machinery from the GUI
matej21 Jun 26, 2026
d7b75b7
feat(daemon): complete worktree removal on hook-close
matej21 Jun 26, 2026
14411c4
fix(files): route file viewer rename/delete through the daemon
matej21 Jun 26, 2026
1df539c
docs(headless): record GUI PTY-loop retirement + lifecycle ports
matej21 Jun 26, 2026
a545f0d
fix(project): route rename-directory through the daemon action
matej21 Jun 26, 2026
110a8d4
fix(git): use mirrored git status in project switcher + review-changes
matej21 Jun 26, 2026
fa57e5d
fix(services): open service port links on the daemon host, not localhost
matej21 Jun 26, 2026
01c8c72
fix(terminal): show the shell selector for remote backends
matej21 Jun 26, 2026
f5dee31
feat(git): fetch worktree list from the daemon for Manage Worktrees
matej21 Jun 26, 2026
28a5fa4
feat(git): generate quick-worktree branch name on the daemon
matej21 Jun 26, 2026
7275d74
feat(terminal): open ctrl-clicked files via daemon viewer for remote …
matej21 Jun 26, 2026
e24d40d
feat(git): fetch close-worktree dialog info from the daemon
matej21 Jun 26, 2026
f1984b5
feat(git): add daemon-side close-worktree pipeline + CloseWorktree ac…
matej21 Jun 26, 2026
0392baa
refactor(git): route worktree-close through the daemon CloseWorktree …
matej21 Jun 26, 2026
a5800c9
fix(files,git): copy the daemon-side absolute path in headless mode
matej21 Jun 27, 2026
487c278
feat(terminal): export terminal buffer via the daemon in headless mode
matej21 Jun 27, 2026
d4e223c
feat(core): carry toast actions over the wire
matej21 Jun 27, 2026
cb6de8f
feat(daemon): grace-period soft-close lifecycle on the daemon
matej21 Jun 27, 2026
b4b5d4e
feat(daemon,app): wire soft-close Undo / Close-now end to end
matej21 Jun 27, 2026
bd021f6
refactor(app): drop the dead client-side soft-close orchestrator
matej21 Jun 27, 2026
6ea1f39
feat(app,daemon): route sidebar and split mutations through the daemon
matej21 Jun 28, 2026
ddd5d34
fix(daemon): tear down terminals queued by workspace actions
matej21 Jun 28, 2026
5de8ed9
refactor(daemon,app): stamp bell/notification activity on the daemon
matej21 Jun 28, 2026
082a56c
fix(app): reap a restarted detached daemon on quit
matej21 Jun 28, 2026
5440824
build: ship the okena-daemon binary in packaging
matej21 Jun 28, 2026
7c8c2fc
feat(cli): explain empty action list on a headless daemon
matej21 Jun 28, 2026
4b3947f
fix(lint): clear clippy -D warnings exposed by the headless refactor
matej21 Jun 28, 2026
8ad4d26
fix(core): correct soft-close toast action ids
matej21 Jun 28, 2026
a477da8
fix(daemon): repair daemon-client pairing flow
matej21 Jun 28, 2026
9a8de88
fix(updater): move update orchestration to daemon
matej21 Jun 28, 2026
adb7ea1
feat(daemon): use local socket for daemon client transport
matej21 Jun 28, 2026
015eeb7
test(terminal): add notification test script
matej21 Jun 29, 2026
17bf2c7
fix(lint): clear websocket stream clippy warning
matej21 Jun 29, 2026
61dc4ff
fix(daemon): repair release packaging and local binds
matej21 Jun 29, 2026
cacd14c
feat(web): expand remote API coverage
matej21 Jun 29, 2026
88f2f3f
feat(web): show remote sidebar metadata
matej21 Jun 29, 2026
1a9d4d7
feat(web): add terminal rename action
matej21 Jun 29, 2026
c6ca7eb
fix(daemon): address daemon-client split follow-ups
matej21 Jun 29, 2026
95cbe58
fix(daemon): bind unix socket inside tokio runtime
matej21 Jun 29, 2026
6610caf
feat(web): add git status panel
matej21 Jun 29, 2026
bd13006
feat(web): add file browser panel
matej21 Jun 29, 2026
3f4c7b8
fix(app): correct worktree project header titles
matej21 Jun 29, 2026
037085f
fix(daemon): reconnect after local daemon restart
matej21 Jun 29, 2026
d8755d9
feat(web): improve project overview
matej21 Jun 29, 2026
0e5ecad
fix(cli): call local daemon over socket
matej21 Jun 29, 2026
a0c3015
fix(lint): clear CI clippy warnings
matej21 Jun 30, 2026
d52e247
fix(workspace): preserve hidden projects after daemon migration
matej21 Jun 30, 2026
09d1b86
fix(app): focus new daemon split terminals
matej21 Jun 30, 2026
a0e4886
fix(git): carry default_branch over the wire (hide redundant base label)
matej21 Jun 30, 2026
deb2474
feat(soft-close): unify grace-period close across daemon + headless l…
jonasnobile Jul 1, 2026
e8c7802
refactor(daemon): extract shared remote snapshot + service handlers
jonasnobile Jul 1, 2026
e8bb03c
refactor(config): unify settings/theme handlers over a ConfigBackend …
jonasnobile Jul 1, 2026
cd85277
fix(clippy): drop redundant closures around config handlers
jonasnobile Jul 1, 2026
42c576a
fix(theme): use neutral footer colors for REMOTE/Pair
jonasnobile Jul 2, 2026
95cbe89
feat(toast): redesign toasts to notification style
jonasnobile Jul 2, 2026
5542307
fix(daemon): trust local socket connections
matej21 Jul 1, 2026
03bf3f0
fix(daemon): wait for local health before connecting
matej21 Jul 1, 2026
7a3c070
fix(workspace): avoid restoring stale extra windows
matej21 Jul 1, 2026
3be2b6e
fix(remote): keep resize ownership with input owner
matej21 Jul 1, 2026
1bd8091
fix(daemon): skip tokens for local sockets
matej21 Jul 1, 2026
4553f60
fix(remote): keep resize authority process-global
matej21 Jul 1, 2026
a58a7d9
fix(remote): release resize ownership on disconnect
matej21 Jul 2, 2026
86a8bb3
feat(remote): add status popover
matej21 Jul 2, 2026
3805d93
fix(daemon): refresh git status after branch switch
matej21 Jul 2, 2026
0917537
feat(terminal): open new terminals in the focused terminal's cwd
jonasnobile Jul 2, 2026
33bb855
fix(terminal): answer terminal queries only on the daemon, not the cl…
jonasnobile Jul 2, 2026
97d85a0
fix(lint): clear workspace clippy warnings to green CI
jonasnobile Jul 2, 2026
96b0613
fix(toast): render countdown as bottom line
matej21 Jul 2, 2026
1be990d
fix(remote): make resize ownership follow real user input only
matej21 Jul 2, 2026
b78f588
feat(remote): client-aware graceful daemon shutdown endpoint
matej21 Jul 2, 2026
1ae6e06
fix(app): graceful daemon shutdown at quit + self-heal local connection
matej21 Jul 2, 2026
1c4a7c7
fix(terminal): never GC non-dtach sockets from the runtime dir
matej21 Jul 2, 2026
78fa205
fix(remote): clean up socket and lock on headless hard-exit shutdown
matej21 Jul 2, 2026
84bc3b1
fix(app): recovery escalation for alive-but-unreachable local daemon
matej21 Jul 2, 2026
6337642
feat(remote): show system stats in status popover
matej21 Jul 2, 2026
6cb070e
feat(tui): add remote client proof of concept
matej21 Jul 2, 2026
43eb2fc
fix(toast): ignore Codex MainThread terminal title
matej21 Jul 2, 2026
38b5cee
fix(lint): satisfy new clippy warnings
matej21 Jul 7, 2026
a54a202
refactor(daemon): deduplicate action test helpers
matej21 Jul 7, 2026
5d0cba2
refactor(remote): deduplicate daemon listen address policy
matej21 Jul 7, 2026
564e9f2
refactor(remote): share terminal transport messages
matej21 Jul 7, 2026
693cedd
refactor(actions): deduplicate terminal lookup handling
matej21 Jul 7, 2026
fd503e8
refactor(workspace): centralize data mutation notification
matej21 Jul 7, 2026
057e777
refactor(mobile): deduplicate action dispatch wrappers
matej21 Jul 7, 2026
b4cc388
refactor(transport): share layout terminal id collection
matej21 Jul 7, 2026
066896a
refactor(git): deduplicate remote provider actions
matej21 Jul 7, 2026
1c7597e
refactor(actions): deduplicate project existence guards
matej21 Jul 7, 2026
4432c56
refactor(core): centralize process liveness checks
matej21 Jul 7, 2026
284d6f7
docs: add duplicate detection skill
matej21 Jul 7, 2026
ee49c8f
fix(git): refresh visible projects immediately
matej21 Jul 7, 2026
85e8af4
fix(claude): show scoped usage limits
matej21 Jul 7, 2026
ea21dff
fix(lint): collapse nested if in git watcher
matej21 Jul 7, 2026
87bae16
fix(git): ignore stale PR and origin head state
matej21 Jul 7, 2026
2e99ff5
fix(git): refresh visible projects without opening a terminal
matej21 Jul 7, 2026
441c79d
docs: reframe okena --headless as standard single-binary daemon
matej21 Jul 7, 2026
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
114 changes: 114 additions & 0 deletions .claude/skills/duplicate-detection/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
---
name: duplicate-detection
description: Detect duplicated code and choose safe deduplication targets in Rust or general codebases. Use when the user asks to find code clones, dedupe a PR or branch, run duplicate-code tools, reduce repeated logic, identify dangerous duplication that may drift, or continue incremental refactors driven by duplicate-detection reports.
---

# Duplicate Detection

Use this skill to turn clone reports into small, safe refactors. Prefer removing duplication that can cause behavior drift over reducing a metric for its own sake.

## Workflow

1. Establish scope.
- Inspect the current branch, worktree state, language mix, and test commands.
- For PR work, determine the correct merge base before judging whether duplication is new.
- Check whether CI already runs linting such as `cargo clippy`; clippy is useful but is not a duplicate-code detector.

2. Generate duplicate reports.
- Use at least one structural or token-based detector.
- Exclude generated output, vendored dependencies, build artifacts, lockfiles, snapshots, and large fixtures unless the user explicitly wants them included.
- Save reports under `/tmp` or another disposable path; do not commit report output unless asked.

3. Triage the reports before editing.
- Prioritize logic that can drift: policy checks, wire protocol construction, persistence, filesystem/process/network behavior, lifecycle transitions, cache invalidation, notifications, and cross-entrypoint behavior.
- Treat tests as lower priority unless duplicated setup hides product behavior, makes assertions diverge, or blocks future maintenance.
- Ignore harmless symmetry when abstraction would obscure intent: simple DTO conversions, repeated enum arms, tiny wrappers, trivial UI layout, or generated-looking glue.

4. Refactor in small slices.
- Extract the smallest shared helper that matches an existing module boundary.
- Preserve public APIs, FFI boundaries, serialized formats, and observable error text unless the user asked to change them.
- Avoid macro layers, broad architecture moves, or generic frameworks unless the payoff is obvious; ask first when unsure.
- Commit each coherent refactor separately when the user asks for incremental commits.

5. Verify and report.
- Run targeted tests or checks for touched code; run broader checks when shared behavior moved.
- Re-run the duplicate detector after meaningful refactors and report before/after counts.
- Explain which duplicate classes remain and why they are lower priority.

## Rust Commands

Use `cargo-dupes` for Rust-focused clone reports when available:

```bash
cargo dupes --path . \
--exclude target \
--exclude node_modules \
--exclude-tests \
--min-lines 8 \
--min-nodes 20 \
--threshold 0.85 \
--format json report > /tmp/duplicate-detection-cargo-dupes.json
```

If it is missing and installing tools is acceptable in the environment:

```bash
cargo install cargo-dupes --locked
```

`cargo-dupes` may emit multiple JSON values. Read the first report object with `jq -s`:

```bash
jq -s '.[0] | {
exact_groups: .exact_duplicate_groups,
exact_lines: .exact_duplicate_lines,
near_groups: .near_duplicate_groups,
near_lines: .near_duplicate_lines
}' /tmp/duplicate-detection-cargo-dupes.json
```

Run normal Rust quality gates for changed behavior:

```bash
cargo test
cargo clippy --all-targets --all-features -- -D warnings
```

Adjust those commands to match the repo's documented CI.

## General Commands

Use `jscpd` for broad token/text clone detection across mixed-language repos:

```bash
npx --yes jscpd@5 . \
--min-lines 8 \
--min-tokens 80 \
--ignore "**/target/**,**/.git/**,**/node_modules/**,**/dist/**,**/build/**,**/coverage/**,**/Cargo.lock,**/package-lock.json,**/pnpm-lock.yaml,**/yarn.lock" \
--reporters json,silent \
--output /tmp/duplicate-detection-jscpd
```

When the repo is mostly Rust, add `--format rust` to reduce noise. For mixed repos, let `jscpd` auto-detect formats or pass a comma-separated format list.

Summarize the JSON report:

```bash
jq '.statistics.total | {
clones: .clones,
duplicated_lines: .duplicatedLines,
duplicated_percentage: .percentage
}' /tmp/duplicate-detection-jscpd/jscpd-report.json
```

## Review Heuristics

Ask these questions for each candidate:

- Would a future change likely need to update both places?
- Is one copy already subtly different in a way that looks accidental?
- Does the duplication cross a boundary where behavior should stay aligned, such as local versus remote, daemon versus client, or API versus UI?
- Can the shared helper be named after a real domain concept rather than after the duplicated syntax?
- Will the refactor reduce branching and tests, or just hide two readable blocks behind indirection?

Proceed when the answers point to drift risk and the extraction is local. Leave the duplication alone when a shared abstraction would be more fragile than the repeated code.
16 changes: 15 additions & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,14 @@ jobs:
- name: Clippy
run: cargo clippy --workspace --all-targets -- -D warnings

- name: Daemon/client split gates
run: |
scripts/audit-daemon-client-gaps.sh
if cargo tree -p okena-daemon --edges no-dev | grep -E 'gpui|gpui-component'; then
echo "okena-daemon must stay GPUI-free"
exit 1
fi

- name: Run tests
run: cargo test

Expand Down Expand Up @@ -163,14 +171,18 @@ jobs:
run: cd web && bun install --frozen-lockfile && bun run build

- name: Build
run: cargo build --release --target ${{ matrix.target }}
run: cargo build --release --target ${{ matrix.target }} -p okena -p okena-daemon

- name: Prepare artifact (Linux)
if: runner.os == 'Linux'
run: |
mkdir -p dist/icons
cp target/${{ matrix.target }}/release/okena dist/
chmod +x dist/okena
# Ship the GPUI-free daemon sibling so the app runs the real daemon
# binary instead of falling back to `okena --headless`.
cp target/${{ matrix.target }}/release/okena-daemon dist/
chmod +x dist/okena-daemon
# Bundle icons for Linux installation
cp assets/app-icon-16.png assets/app-icon-32.png assets/app-icon-48.png \
assets/app-icon-64.png assets/app-icon-128.png assets/app-icon-256.png \
Expand All @@ -188,6 +200,8 @@ jobs:
run: |
mkdir dist
copy target\${{ matrix.target }}\release\okena.exe dist\
rem Ship the GPUI-free daemon sibling (see Linux step).
copy target\${{ matrix.target }}\release\okena-daemon.exe dist\

- name: Upload artifact
uses: actions/upload-artifact@v4
Expand Down
105 changes: 100 additions & 5 deletions Cargo.lock

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

12 changes: 10 additions & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
[workspace]
members = [".", "crates/okena-mobile-ffi", "crates/okena-core", "crates/okena-transport", "crates/okena-git", "crates/okena-views-git", "crates/okena-views-services", "crates/okena-views-sidebar", "crates/okena-views-terminal", "crates/okena-terminal", "crates/okena-layout", "crates/okena-state", "crates/okena-hooks", "crates/okena-workspace", "crates/okena-ui", "crates/okena-usage", "crates/okena-files", "crates/okena-markdown", "crates/okena-extensions", "crates/okena-ext-claude", "crates/okena-ext-codex", "crates/okena-ext-github", "crates/okena-ext-updater", "crates/okena-services", "crates/okena-remote-client", "crates/okena-remote-server", "crates/okena-views-remote", "crates/okena-theme", "crates/okena-cli", "crates/okena-app-core", "crates/okena-app"]
members = [".", "crates/okena-mobile-ffi", "crates/okena-core", "crates/okena-transport", "crates/okena-git", "crates/okena-views-git", "crates/okena-views-services", "crates/okena-views-sidebar", "crates/okena-views-terminal", "crates/okena-terminal", "crates/okena-layout", "crates/okena-state", "crates/okena-hooks", "crates/okena-workspace", "crates/okena-ui", "crates/okena-usage", "crates/okena-files", "crates/okena-markdown", "crates/okena-extensions", "crates/okena-ext-claude", "crates/okena-ext-codex", "crates/okena-ext-github", "crates/okena-ext-updater", "crates/okena-services", "crates/okena-remote-client", "crates/okena-remote-server", "crates/okena-views-remote", "crates/okena-theme", "crates/okena-cli", "crates/okena-app-core", "crates/okena-app", "crates/okena-daemon-core", "crates/okena-daemon", "crates/okena-tui"]
resolver = "2"

[workspace.package]
version = "0.27.0"

[package]
name = "okena"
version = "0.27.0"
version.workspace = true
edition = "2024"
license = "MIT"

Expand All @@ -26,6 +29,11 @@ okena-views-terminal = { path = "crates/okena-views-terminal" }
okena-views-git = { path = "crates/okena-views-git" }
okena-ui = { path = "crates/okena-ui" }

# `--daemon-client` startup: ensure_local_daemon() (discover-or-spawn the local
# headless daemon + mint a loopback token). Already a transitive dep via
# okena-app, so this adds no new linkage — only a direct path to the `local` API.
okena-remote-server = { path = "crates/okena-remote-server" }

# Extension system — registered at startup in main.rs.
okena-extensions = { path = "crates/okena-extensions" }
okena-ext-claude = { path = "crates/okena-ext-claude" }
Expand Down
Loading
Loading