Vendor the JosefinSans variable font (upright + italic, weight range
100-700), OFL licensed. _AppRoot installs it as the ambient
DefaultTextStyle at weight w300 (Light); ClideText inherits rather
than re-specifying the family, so Alchemist's Ahem injection keeps
goldens deterministic per D-024 while production renders the
intended face.
typography.dart gains clideUiFamily + clideUiFamilyFallback
alongside the existing mono constants; .gitignore learns about
Alchemist's failures/ diff output dir so local re-runs don't leak
into `git status`.
Co-Authored-By: Claude <noreply@anthropic.com>
Ports settled-reach's decisions_sync.py + ticket + decision scripts,
Scrum-stripped. Writes to .pql/pql.db (gitignored). Verb shape
mirrors the eventual `pql` subcommands so migration is a call-site
find-replace once pql ships feature parity (D-040, R-011).
Ticket IDs are T-NNN (TEXT PKs) — reshape from settled-reach's
integer auto-increment so the stopgap's writes are compatible with
pql's future reads without a data migration. No `sprints` table; the
pyramid is kanban / waterfall (D-035).
Verified end-to-end: sync parses 71 records (39 confirmed, 23 open
questions, 9 rejected) with 62 cross-refs and zero broken links;
`ticket new`, `ticket status`, `ticket board`, and `decisions show
--with-refs` all round-trip correctly.
Co-Authored-By: Claude <noreply@anthropic.com>
First real content under app/. Lays the whole Tier 0 foundation in one
commit because the pieces depend on each other circularly (kernel →
extension → widgets → built-ins all reference types from the layer
below); splitting would leave intermediate commits that don't compile.
Key shapes:
* bare WidgetsApp root — no Material, no Cupertino, no Scaffold.
ClideTheme InheritedWidget is the only source of tokens.
* ClideKernel InheritedWidget aggregates 18 services (settings,
project, extensions, theme, panels, events, ipc, commands +
palette + keybindings, clipboard, files, notify, dialog, tray,
secrets, os, net, focus, log, i18n). ExtensionContext exposes
them through a stable interface.
* ClideExtension + sealed ContributionPoint hierarchy (Tab,
StatusItem, Toolbar, Command, TrayItem, LayoutPreset). One
manifest ships N contributions into kernel slots.
* Three-tier theme pipeline: palette (named colors) → semantic
roles → ~60 surface tokens. Defaults at each layer so legacy
palette-only themes produce a complete SurfaceTokens.
* A11y baked in from day one — every interactive primitive wraps
in Semantics(label:, hint:, button:); ensureSemantics() at boot;
theme/contrast.dart helper exposes token pairs for the WCAG
gate in the a11y test suite.
* i18n ported from fframe's L10n pattern (text-driven, namespaced
JSON catalogs, caller-supplied placeholders) with a proper
locale fallback chain (exact → language → default → placeholder)
fframe lacks.
* Four Tier-0 built-ins live (default-layout, welcome, ipc-status,
theme-picker) plus 17 id-reserving stubs so later tiers fill in
without rename churn.
.gitignore extended to cover app/ sub-package artefacts and the
Playwright harness scratch dirs.
Co-Authored-By: Claude <noreply@anthropic.com>
ADR 0005 supersedes ADR 0002. The "sidecar vs app" split was
load-bearing on Go-vs-Dart being a meaningful boundary. Going
all-Dart collapses that — the daemon becomes clide --daemon mode
of the same AOT binary the CLI lives in, both sharing lib/ with
the Flutter app. The one native gap (Dart's multi-threaded VM
can't safely fork+exec) is filled by a small C supporter tool —
ptyc, Project Terminal Controller, peer of pql — rather than
introducing a second core language.
ADR 0006 defines the CLI/event surface on top of that Dart core:
subsystem list (pane/tab/editor/panel/tree/git/pql/canvas/graph/
theme/settings/project), command shape, versioned JSON event
schema, pql-parity exit codes, and command-event duality as the
operational form of user/Claude parity.
Deleted: sidecar/cmd, sidecar/go.mod, every sidecar/internal
package. Rewritten: Makefile (dart compile exe, flutter
analyze/format/test, build-linux/build-macos, ptyc-build),
ci/*.sh, .githooks/pre-push (no more GOBIN PATH dance),
.gitignore (Flutter/Dart at repo root, ptyc section),
project.yaml (drop module: and go_version:), CLAUDE.md
(guardrails, dependencies, commands refreshed).
Co-Authored-By: Claude <noreply@anthropic.com>
project.yaml is fresh and declares version 2.0.0-dev — a clean break
from Python clide's v1.2.0 (which remains under legacy/). It carries
module path, toolchain pins (go >=1.25, Flutter stable, Dart >=3.5),
and the Gitea repository URL. Same schema as the Makefile will read
via awk for sidecar version stamping.
README.md and LICENSE land alongside. The README pitches the rebuild
tersely and points at docs/initial-plan.md for the full story; the
Python README is preserved under legacy/README.md.
.gitignore is rewritten for the new toolchain. The previous file was
wall-to-wall Python rules; now the root ignores Flutter/Dart/Go build
output plus the usual OS/editor/secrets/.claude-local entries, and
Python-specific rules scope to legacy/** so they don't fire on any
stray caches at the repo root.
.editorconfig sets tabs for Go, two-space for Dart and everything
else, and the usual EOL + trailing-whitespace rules.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Ports the patterns that crystallized during the short-lived claudian
plugin project (discarded in favour of this Flutter rebuild):
- ADRs 0001-0004 capture decisions that survive the host change —
CLI-first over MCP, Go for the sidecar, pql as a supporter tool
that becomes a clide-managed subsystem when present, and the
ignore-file strategy that wires all file-enumerating surfaces
through one knob in .pql/config.yaml.
- .claude/settings.json and the git-commit and skill-create skills
come over with naming updated for clide. The git-commit skill's
"no Conventional Commits" convention supersedes the Python-era
clide style under legacy/; the Keep-a-Changelog discipline and
the project.yaml-version-and-changelog-bumped-together rule
apply going forward.
- CHANGELOG.md starts fresh at the repo root to track the Flutter
rebuild. The Python changelog is preserved under legacy/.
.gitignore narrows from `.claude/` to just `.claude/settings.local.json`
so project-level config and skills travel with the repo.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Set up the TUI IDE wrapper for Claude Code CLI with:
- Core app structure using Textual framework
- Panel architecture (sidebar, workspace, claude, context)
- Theme system with 22 built-in themes (Summer Night default)
- Pydantic models for configuration and data
- Makefile for development commands
- Project documentation and specs
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>