dissolve app/ into repo root (D-056)

Single Flutter package at the repo root. All code, tests, assets,
and platform directories moved from app/ to root. Package renamed
from clide_app to clide — all imports rewritten. Merged pubspec
combines core (ffi) and app (flutter, yaml, xterm) dependencies.
Makefile simplified: no APP_PRESENT conditionals, no cd, no daemon
lifecycle. 317 tests pass.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-23 00:37:20 +02:00
co-authored by Claude Opus 4.6
parent a526c5b9b7
commit 46329700d5
394 changed files with 978 additions and 1090 deletions
+3 -3
View File
@@ -1,5 +1,5 @@
{
"version": "1.0.0",
"hash": "sha256:98d7fa693fa4bcb6ccd6eb1d9d191c8f7332c9c97c221afb19741a7711bd9928",
"installed_at": "2026-04-22T11:22:39Z"
"version": "1.2.0",
"hash": "sha256:c3d0c50a4be25c7fe06c46e1c0a47ffbff4f632e1f820189c2d8abbce53ea0f8",
"installed_at": "2026-04-22T21:44:24Z"
}
+16 -1
View File
@@ -120,15 +120,30 @@ Status flow: backlog → ready → in_progress → review → done (also cancell
| Command | Purpose |
|---|---|
| `pql plan status` | Dashboard: decision counts, open Qs, ticket summary, coverage gaps |
| `pql plan export [--to FILE]` | Snapshot planning state to JSON (default: `pql-plan.json`) |
| `pql plan import [--from FILE]` | Restore planning state from a JSON snapshot |
### Versioning planning state
Planning state lives in `pql.db` (gitignored). To version it in git,
use `pql plan export` to write a committed JSON snapshot. pql does NOT
do this automatically — the user decides when and how to trigger it:
- Pre-push hook: `.githooks/pre-push` calls `pql plan export && git add pql-plan.json`
- Sprint close: a skill or script exports + commits on milestone
- Manual: run `pql plan export` before committing when state changed
On a fresh clone, `pql plan import` restores from the snapshot.
### Planning cookbook
- **Sync and list confirmed** → `pql decisions sync && pql decisions list --type confirmed`
- **Show with refs** → `pql decisions show D-005 --with-refs --pretty`
- **Create ticket** → `pql ticket new task "implement X" --decision D-005`
- **Move forward** → `pql ticket status T-001 in_progress`
- **Batch close** → `pql ticket status T-001,T-002,T-003 done`
- **Coverage gaps** → `pql decisions coverage`
- **Dashboard** → `pql plan status --pretty`
- **Snapshot for git** → `pql plan export`
---
+6
View File
@@ -0,0 +1,6 @@
project:
layout:
sidebar:
activeTab: files.tree
context:
activeTab: markdown.viewer
+2 -14
View File
@@ -1,4 +1,4 @@
# -- Flutter / Dart (app + core at repo root) ---------------------------
# -- Flutter / Dart (single package at repo root) -----------------------
/.dart_tool/
/.packages
/.flutter-plugins
@@ -16,18 +16,6 @@
/bin/clide.exe
# pubspec.lock is committed (supply-chain policy).
# Flutter app sub-package under app/. Same patterns, different prefix.
app/.dart_tool/
app/.flutter-plugins
app/.flutter-plugins-dependencies
app/build/
app/*.iml
app/ios/Pods/
app/macos/Pods/
app/windows/flutter/ephemeral/
app/linux/flutter/ephemeral/
app/macos/Flutter/ephemeral/
# UI harness (Playwright) — npm + output artefacts.
tools/ui/node_modules/
tools/ui/out/
@@ -50,7 +38,7 @@ coverage.*
# Alchemist golden-test failure artefacts (diff images written when a
# pixel-compare fails locally; the committed fixtures live under
# app/test/goldens/goldens/{ci,linux}/).
app/test/goldens/failures/
test/goldens/failures/
# -- pql per-repo state (index + planning DB, rebuilt from markdown) ----
/.pql/
View File
+19 -87
View File
@@ -1,13 +1,10 @@
# clide — local dev targets. CI scripts in ci/ shell out to these.
#
# One toolchain: Flutter + Dart. Native supporter tools (`ptyc`, future
# peers) live in their own directories with their own build targets and
# compose in under `make build`.
# Single Flutter package at the repo root. Native supporter tools
# (ptyc, future peers) live in their own directories.
INSTALL_DIR ?= $(HOME)/.local/bin
# Version stamping. Source of truth: project.yaml `version:` field. Local
# builds augment with git short SHA + dirty marker (semver build metadata).
VERSION_BASE ?= $(shell awk -F': *' '/^version:/ {gsub(/[" ]/,"",$$2); print $$2; exit}' project.yaml)
COMMIT ?= $(shell git rev-parse --short HEAD 2>/dev/null || echo unknown)
DIRTY := $(shell git diff --quiet HEAD 2>/dev/null || echo .dirty)
@@ -18,85 +15,30 @@ DATE ?= $(shell date -u +%Y-%m-%dT%H:%M:%SZ)
help: ## Show this help.
@awk 'BEGIN {FS = ":.*##"} /^[a-zA-Z0-9_-]+:.*##/ {printf " \033[36m%-22s\033[0m %s\n", $$1, $$2}' $(MAKEFILE_LIST)
# -- app + core (Flutter / Dart) ----------------------------------------
# App and core targets gracefully noop if the Dart package isn't
# scaffolded yet (pre-Tier-0 state) or if flutter isn't installed
# locally.
APP_PRESENT := $(shell test -f pubspec.yaml && echo yes || echo no)
HAS_FLUTTER := $(shell command -v flutter >/dev/null && echo yes || echo no)
.PHONY: build
build: ## Build the Dart AOT `clide` binary (CLI + --daemon modes in one binary).
ifeq ($(APP_PRESENT),yes)
dart compile exe bin/clide.dart -o bin/clide \
--define=clideVersion=$(VERSION) \
--define=clideCommit=$(COMMIT) \
--define=clideDate=$(DATE)
else
@echo "(pubspec.yaml not scaffolded yet; skipping)"
endif
DAEMON_PID_FILE := /tmp/clide-daemon-$(shell id -u).pid
# -- app (Flutter) -------------------------------------------------------
.PHONY: run
run: stop build ## Build the daemon + launch the Flutter desktop app.
ifeq ($(APP_PRESENT),yes)
@echo "Starting daemon…"
@bin/clide --daemon & echo $$! > $(DAEMON_PID_FILE)
@echo "Daemon PID $$(cat $(DAEMON_PID_FILE))"
@echo "Launching Flutter app…"
-cd app && LD_LIBRARY_PATH=$(CURDIR)/app/native/linux-x64$${LD_LIBRARY_PATH:+:$$LD_LIBRARY_PATH} flutter run -d linux
@$(MAKE) --no-print-directory stop
else
@echo "(pubspec.yaml not scaffolded yet; skipping)"
endif
.PHONY: stop
stop: ## Kill any running clide daemon.
@if [ -f $(DAEMON_PID_FILE) ]; then \
kill $$(cat $(DAEMON_PID_FILE)) 2>/dev/null && echo "daemon stopped" || true; \
rm -f $(DAEMON_PID_FILE); \
fi
.PHONY: install
install: build ## Install bin/clide into $(INSTALL_DIR).
ifeq ($(APP_PRESENT),yes)
install -m 0755 bin/clide $(INSTALL_DIR)/clide
else
@echo "(pubspec.yaml not scaffolded yet; skipping)"
endif
run: ## Launch the Flutter desktop app.
LD_LIBRARY_PATH=$(CURDIR)/native/linux-x64$${LD_LIBRARY_PATH:+:$$LD_LIBRARY_PATH} flutter run -d linux
.PHONY: pubget
pubget: ## flutter pub get (hydrate the pub cache).
ifeq ($(APP_PRESENT),yes)
pubget: ## flutter pub get.
flutter pub get
else
@echo "(pubspec.yaml not scaffolded yet; skipping)"
endif
.PHONY: analyze
analyze: ## dart analyze / flutter analyze.
ifeq ($(APP_PRESENT),yes)
analyze: ## flutter analyze.
flutter analyze
else
@echo "(pubspec.yaml not scaffolded yet; skipping)"
endif
.PHONY: format
format: ## dart format --set-exit-if-changed.
ifeq ($(APP_PRESENT),yes)
dart format --set-exit-if-changed .
else
@echo "(pubspec.yaml not scaffolded yet; skipping)"
endif
.PHONY: test
test: ## Fast: analyze + format + unit + widget + golden (<60s).
ci/test.sh
.PHONY: test-core
test-core: ## Flutter-free core tests (IPC, daemon, PTY) with hard timeout.
test-core: ## Core subsystem tests (IPC, PTY, git, pane registry).
ci/test_core.sh
.PHONY: test-a11y
@@ -108,7 +50,7 @@ test-integration: ## Integration tests (real app boot; xvfb on headless Linux).
ci/test_integration.sh
.PHONY: test-e2e
test-e2e: build ## Daemon subprocess + web WASM Playwright smoke.
test-e2e: ## End-to-end Playwright smoke.
ci/test_e2e.sh
.PHONY: test-all
@@ -122,7 +64,7 @@ coverage: ## flutter test --coverage + lcov summary.
smoke-bundle: ## Build Linux release bundle and run it under xvfb for 5s.
ci/smoke_bundle.sh
# -- web UI harness (for Claude Code to drive the app) -----------------
# -- web UI harness ------------------------------------------------------
.PHONY: ui-dev
ui-dev: ## Build web WASM + start localhost:4280 in the background.
@@ -141,23 +83,14 @@ ui-smoke: ## Build + serve + run Playwright smoke + stop.
.PHONY: build-linux
build-linux: ## flutter build linux (desktop bundle).
ifeq ($(APP_PRESENT),yes)
flutter build linux
else
@echo "(pubspec.yaml not scaffolded yet; skipping)"
endif
.PHONY: build-macos
build-macos: ## flutter build macos (desktop bundle).
ifeq ($(APP_PRESENT),yes)
flutter build macos
else
@echo "(pubspec.yaml not scaffolded yet; skipping)"
endif
# -- ptyc (C supporter tool) --------------------------------------------
# -- ptyc (C supporter tool) ---------------------------------------------
# Compiled alongside the main binary. Tiny, no deps beyond libc.
PTYC_PRESENT := $(shell test -f ptyc/Makefile && echo yes || echo no)
.PHONY: ptyc-build
@@ -184,33 +117,32 @@ else
@echo "(ptyc/ not scaffolded yet; skipping)"
endif
# -- security ------------------------------------------------------------
# -- security -------------------------------------------------------------
.PHONY: security
security: ## Dart advisory review + ptyc source review (manual — no floating deps).
security: ## Dart advisory review + ptyc source review.
@echo "security: Dart advisories reviewed manually before pubspec.yaml bumps;"
@echo " ptyc is reviewed by reading it (tiny libc-only C)."
@echo " Automated Dart CVE tooling lands here when a reliable option exists."
# -- pre-push gate -------------------------------------------------------
# -- pre-push gate --------------------------------------------------------
.PHONY: decisions-validate
decisions-validate: ## Parser dry-run over decisions/*.md (cheap pre-push gate).
decisions-validate: ## Parser dry-run over decisions/*.md.
pql decisions validate
.PHONY: push-check
push-check: decisions-validate test-core test test-a11y ## Pre-push gate: decisions + core + fast unit + widget + golden + a11y (<90s).
push-check: decisions-validate test-core test test-a11y ## Pre-push gate.
.PHONY: hooks
hooks: ## Install the repo's git hooks (points core.hooksPath at .githooks/).
hooks: ## Install the repo's git hooks.
git config core.hooksPath .githooks
@echo "hooks installed (core.hooksPath = .githooks)"
# -- housekeeping --------------------------------------------------------
# -- housekeeping ---------------------------------------------------------
.PHONY: clean
clean: ## Remove build artefacts.
rm -rf bin build .dart_tool
rm -rf build .dart_tool
$(MAKE) ptyc-clean
.DEFAULT_GOAL := help
-45
View File
@@ -1,45 +0,0 @@
# Miscellaneous
*.class
*.log
*.pyc
*.swp
.DS_Store
.atom/
.build/
.buildlog/
.history
.svn/
.swiftpm/
migrate_working_dir/
# IntelliJ related
*.iml
*.ipr
*.iws
.idea/
# The .vscode folder contains launch configuration and tasks you configure in
# VS Code which you may wish to be included in version control, so this line
# is commented out by default.
#.vscode/
# Flutter/Dart/Pub related
**/doc/api/
**/ios/Flutter/.last_build_id
.dart_tool/
.flutter-plugins-dependencies
.pub-cache/
.pub/
/build/
/coverage/
# Symbolication related
app.*.symbols
# Obfuscation related
app.*.map.json
# Android Studio will place build artifacts here
/android/app/debug
/android/app/profile
/android/app/release
-3
View File
@@ -1,3 +0,0 @@
# clide_app
A new Flutter project.
-52
View File
@@ -1,52 +0,0 @@
import 'package:clide/clide.dart';
import 'package:clide_app/builtin/claude/src/claude_pane.dart';
import 'package:clide_app/extension/extension.dart';
import 'package:clide_app/kernel/kernel.dart';
/// Claude pane. Primary per repo (tmux-persisted per D-041); optional
/// secondaries spawned via the `claude.new-secondary` command.
class ClaudeExtension extends ClideExtension {
@override
String get id => 'builtin.claude';
@override
String get title => 'Claude';
@override
String get version => '0.1.0';
@override
List<String> get dependsOn => const [];
@override
List<ContributionPoint> get contributions => [
TabContribution(
id: 'claude.primary',
slot: Slots.workspace,
title: 'Claude',
titleKey: 'tab.title',
i18nNamespace: id,
priority: 90, // just before terminal (100)
build: (_) => const ClaudePane(isPrimary: true),
),
CommandContribution(
id: 'claude.new-secondary',
command: 'claude.new-secondary',
title: 'Claude: open a secondary session',
run: (_) async {
// Secondary spawn is a UI-side concern (tab creation in
// the workspace slot). Returning OK signals the palette
// that the command exists; wiring the workspace-slot tab
// manager to open `ClaudePane(isPrimary: false,
// secondaryIndex: N)` on this command lands in a follow-up.
// D-041 policy is captured in the decision record either
// way.
return IpcResponse.ok(
id: '',
data: const {
'status': 'accepted',
'note': 'UI-side tab manager wires this up in a '
'follow-up commit.',
},
);
},
),
];
}
-347
View File
@@ -1,347 +0,0 @@
# Generated by pub
# See https://dart.dev/tools/pub/glossary#lockfile
packages:
alchemist:
dependency: "direct dev"
description:
name: alchemist
sha256: "4c5f5146b7539eb9a53211d81489f09f08fc3821f754a370f493477a9ef9e390"
url: "https://pub.dev"
source: hosted
version: "0.12.1"
async:
dependency: transitive
description:
name: async
sha256: e2eb0491ba5ddb6177742d2da23904574082139b07c1e33b8503b9f46f3e1a37
url: "https://pub.dev"
source: hosted
version: "2.13.1"
boolean_selector:
dependency: transitive
description:
name: boolean_selector
sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea"
url: "https://pub.dev"
source: hosted
version: "2.1.2"
characters:
dependency: transitive
description:
name: characters
sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b
url: "https://pub.dev"
source: hosted
version: "1.4.1"
clide:
dependency: "direct main"
description:
path: ".."
relative: true
source: path
version: "2.0.0-dev"
clock:
dependency: transitive
description:
name: clock
sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b
url: "https://pub.dev"
source: hosted
version: "1.1.2"
collection:
dependency: transitive
description:
name: collection
sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76"
url: "https://pub.dev"
source: hosted
version: "1.19.1"
convert:
dependency: transitive
description:
name: convert
sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68
url: "https://pub.dev"
source: hosted
version: "3.1.2"
equatable:
dependency: transitive
description:
name: equatable
sha256: "3e0141505477fd8ad55d6eb4e7776d3fe8430be8e497ccb1521370c3f21a3e2b"
url: "https://pub.dev"
source: hosted
version: "2.0.8"
fake_async:
dependency: transitive
description:
name: fake_async
sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44"
url: "https://pub.dev"
source: hosted
version: "1.3.3"
ffi:
dependency: transitive
description:
name: ffi
sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6"
url: "https://pub.dev"
source: hosted
version: "2.1.3"
file:
dependency: transitive
description:
name: file
sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4
url: "https://pub.dev"
source: hosted
version: "7.0.1"
flutter:
dependency: "direct main"
description: flutter
source: sdk
version: "0.0.0"
flutter_driver:
dependency: transitive
description: flutter
source: sdk
version: "0.0.0"
flutter_lints:
dependency: "direct dev"
description:
name: flutter_lints
sha256: "3105dc8492f6183fb076ccf1f351ac3d60564bff92e20bfc4af9cc1651f4e7e1"
url: "https://pub.dev"
source: hosted
version: "6.0.0"
flutter_test:
dependency: "direct dev"
description: flutter
source: sdk
version: "0.0.0"
fuchsia_remote_debug_protocol:
dependency: transitive
description: flutter
source: sdk
version: "0.0.0"
integration_test:
dependency: "direct dev"
description: flutter
source: sdk
version: "0.0.0"
leak_tracker:
dependency: transitive
description:
name: leak_tracker
sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de"
url: "https://pub.dev"
source: hosted
version: "11.0.2"
leak_tracker_flutter_testing:
dependency: transitive
description:
name: leak_tracker_flutter_testing
sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1"
url: "https://pub.dev"
source: hosted
version: "3.0.10"
leak_tracker_testing:
dependency: transitive
description:
name: leak_tracker_testing
sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1"
url: "https://pub.dev"
source: hosted
version: "3.0.2"
lints:
dependency: transitive
description:
name: lints
sha256: "12f842a479589fea194fe5c5a3095abc7be0c1f2ddfa9a0e76aed1dbd26a87df"
url: "https://pub.dev"
source: hosted
version: "6.1.0"
matcher:
dependency: transitive
description:
name: matcher
sha256: dc0b7dc7651697ea4ff3e69ef44b0407ea32c487a39fff6a4004fa585e901861
url: "https://pub.dev"
source: hosted
version: "0.12.19"
material_color_utilities:
dependency: transitive
description:
name: material_color_utilities
sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b"
url: "https://pub.dev"
source: hosted
version: "0.13.0"
meta:
dependency: transitive
description:
name: meta
sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394"
url: "https://pub.dev"
source: hosted
version: "1.17.0"
mocktail:
dependency: "direct dev"
description:
name: mocktail
sha256: "890df3f9688106f25755f26b1c60589a92b3ab91a22b8b224947ad041bf172d8"
url: "https://pub.dev"
source: hosted
version: "1.0.4"
path:
dependency: transitive
description:
name: path
sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5"
url: "https://pub.dev"
source: hosted
version: "1.9.1"
platform:
dependency: transitive
description:
name: platform
sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984"
url: "https://pub.dev"
source: hosted
version: "3.1.6"
process:
dependency: transitive
description:
name: process
sha256: c6248e4526673988586e8c00bb22a49210c258dc91df5227d5da9748ecf79744
url: "https://pub.dev"
source: hosted
version: "5.0.5"
quiver:
dependency: transitive
description:
name: quiver
sha256: ea0b925899e64ecdfbf9c7becb60d5b50e706ade44a85b2363be2a22d88117d2
url: "https://pub.dev"
source: hosted
version: "3.2.2"
sky_engine:
dependency: transitive
description: flutter
source: sdk
version: "0.0.0"
source_span:
dependency: transitive
description:
name: source_span
sha256: "56a02f1f4cd1a2d96303c0144c93bd6d909eea6bee6bf5a0e0b685edbd4c47ab"
url: "https://pub.dev"
source: hosted
version: "1.10.2"
stack_trace:
dependency: transitive
description:
name: stack_trace
sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1"
url: "https://pub.dev"
source: hosted
version: "1.12.1"
stream_channel:
dependency: transitive
description:
name: stream_channel
sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d"
url: "https://pub.dev"
source: hosted
version: "2.1.4"
string_scanner:
dependency: transitive
description:
name: string_scanner
sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43"
url: "https://pub.dev"
source: hosted
version: "1.4.1"
sync_http:
dependency: transitive
description:
name: sync_http
sha256: "7f0cd72eca000d2e026bcd6f990b81d0ca06022ef4e32fb257b30d3d1014a961"
url: "https://pub.dev"
source: hosted
version: "0.3.1"
term_glyph:
dependency: transitive
description:
name: term_glyph
sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e"
url: "https://pub.dev"
source: hosted
version: "1.2.2"
test_api:
dependency: transitive
description:
name: test_api
sha256: "8161c84903fd860b26bfdefb7963b3f0b68fee7adea0f59ef805ecca346f0c7a"
url: "https://pub.dev"
source: hosted
version: "0.7.10"
typed_data:
dependency: transitive
description:
name: typed_data
sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006
url: "https://pub.dev"
source: hosted
version: "1.4.0"
vector_math:
dependency: transitive
description:
name: vector_math
sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b
url: "https://pub.dev"
source: hosted
version: "2.2.0"
vm_service:
dependency: transitive
description:
name: vm_service
sha256: "046d3928e16fa4dc46e8350415661755ab759d9fc97fc21b5ab295f71e4f0499"
url: "https://pub.dev"
source: hosted
version: "15.1.0"
webdriver:
dependency: transitive
description:
name: webdriver
sha256: "2f3a14ca026957870cfd9c635b83507e0e51d8091568e90129fbf805aba7cade"
url: "https://pub.dev"
source: hosted
version: "3.1.0"
xterm:
dependency: "direct main"
description:
name: xterm
sha256: "168dfedca77cba33fdb6f52e2cd001e9fde216e398e89335c19b524bb22da3a2"
url: "https://pub.dev"
source: hosted
version: "4.0.0"
yaml:
dependency: "direct main"
description:
name: yaml
sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce
url: "https://pub.dev"
source: hosted
version: "3.1.3"
zmodem:
dependency: transitive
description:
name: zmodem
sha256: "3b7e5b29f3a7d8aee472029b05165a68438eff2f3f7766edf13daba1e297adbf"
url: "https://pub.dev"
source: hosted
version: "0.0.6"
sdks:
dart: ">=3.9.0-0 <4.0.0"
flutter: ">=3.32.0"
-117
View File
@@ -1,117 +0,0 @@
# clide_app — Flutter desktop UI.
#
# Renders clide's IDE surfaces; depends on the root `clide` Dart core
# package (shared with the CLI + daemon). Prefer-zero-deps; every
# third-party entry below is exact-pinned and justified. No carets.
name: clide_app
description: >-
Flutter desktop IDE for Claude Code — renders the UI. Talks to the
Dart core (CLI + daemon) via IPC; all PTY/subprocess/filesystem work
lives in the daemon (D-005).
publish_to: none
version: 2.0.0-dev
repository: https://git.schweitz.net/jpmschweitzer/clide
environment:
sdk: ">=3.5.0 <4.0.0"
flutter: ">=3.19.0"
dependencies:
flutter:
sdk: flutter
# Dart core — shared types, IPC protocol, anything CLI + daemon + app
# all import. Kept Flutter-free so `dart compile exe` produces a lean
# static binary (see D-005).
clide:
path: ../
# YAML — the one justified exception to prefer-zero-deps. Dart-team
# maintained, used for theme files and extension manifests.
yaml: 3.1.3
# xterm.dart — Flutter-native terminal emulator (ANSI / xterm / truecolor
# parser + renderer). Writing a vt100/ANSI parser that handles everything
# tmux / neovim / claude emit would be weeks of work for no fidelity
# win. Listed in licenses.yaml per D-042. MIT.
xterm: 4.0.0
dev_dependencies:
flutter_test:
sdk: flutter
flutter_lints: 6.0.0
# Integration tests for the real-app startup-regression gate.
integration_test:
sdk: flutter
# Mocks at IO/IPC boundaries; hand-rolled fakes for ChangeNotifiers.
mocktail: 1.0.4
# Golden-test framework (Ahem font, cross-platform pixel stability).
# Used only for widget primitives, not compositions.
alchemist: 0.12.1
flutter:
uses-material-design: false
assets:
- lib/kernel/src/theme/themes/
- lib/kernel/src/i18n/catalog/
# Licensing — read by the About screen. `licenses.yaml` is the
# manifest (self + runtime deps + dev deps); each `license_file`
# pointer must also be a bundled asset so the About screen can
# display each dependency's full license text at runtime.
# Root LICENSE is mirrored into assets/LICENSE for the same reason
# (root paths can't be referenced from a Flutter package's assets).
# See CLAUDE.md "Dependencies & supply chain" and D-042.
- assets/licenses.yaml
- assets/LICENSE
- assets/fonts/jetbrains_mono/OFL.txt
- assets/fonts/josefin_sans/OFL.txt
- assets/fonts/phosphor/LICENSE
- assets/logo/clide-logo.svg
- assets/logo/clide-logo-16.png
- assets/logo/clide-logo-32.png
- assets/logo/clide-logo-48.png
- assets/logo/clide-logo-192.png
- assets/logo/clide-logo-256.png
- assets/logo/clide-logo-512.png
- assets/logo/clide-logo-1024.png
# Tree-sitter WASM grammars and highlight queries.
- assets/grammars/
- assets/queries/
# Bundled fonts. OFL-licensed; license files live alongside each.
#
# JosefinSans — UI default. Variable font covers weights 100-700
# plus an italic axis companion; we default to Light (300) per the
# project's aesthetic direction.
#
# JetBrainsMono — terminal / code surfaces. Static weights keep
# rendering predictable across xterm.dart, goldens, and CI.
fonts:
- family: JosefinSans
fonts:
- asset: assets/fonts/josefin_sans/JosefinSans-VariableFont.ttf
- asset: assets/fonts/josefin_sans/JosefinSans-Italic-VariableFont.ttf
style: italic
- family: Phosphor
fonts:
- asset: assets/fonts/phosphor/Phosphor.ttf
- asset: assets/fonts/phosphor/Phosphor-Bold.ttf
weight: 700
- asset: assets/fonts/phosphor/Phosphor-Fill.ttf
- family: JetBrainsMono
fonts:
- asset: assets/fonts/jetbrains_mono/JetBrainsMono-Regular.ttf
- asset: assets/fonts/jetbrains_mono/JetBrainsMono-Italic.ttf
style: italic
- asset: assets/fonts/jetbrains_mono/JetBrainsMono-Bold.ttf
weight: 700
- asset: assets/fonts/jetbrains_mono/JetBrainsMono-BoldItalic.ttf
weight: 700
style: italic

Before

Width:  |  Height:  |  Size: 84 KiB

After

Width:  |  Height:  |  Size: 84 KiB

Before

Width:  |  Height:  |  Size: 950 B

After

Width:  |  Height:  |  Size: 950 B

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Before

Width:  |  Height:  |  Size: 408 B

After

Width:  |  Height:  |  Size: 408 B

Some files were not shown because too many files have changed in this diff Show More