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
2 changes: 1 addition & 1 deletion .loopdeck/current-loop.md
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
Selasar revamp — prd-rebrand-tokens Phase 1 (design tokens) complete: paper/ink/teak palette + font-display token + toggle verified
Selasar revamp — prd-rebrand-tokens Phase 2 (rebrand copy audit) complete: full-repo audit recorded in PRD, tauri.conf.json/index.html renamed to Selasar, all in-app copy renamed; Phase 3 (visual pass) remains
5 changes: 5 additions & 0 deletions .loopdeck/decisions.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -175,3 +175,8 @@ _Older decisions archived to [decisions-archive.md](./decisions-archive.md)._
- **Status**: accepted
- **Context**: The PRD criterion "apply `--font-display` to the wordmark, rail mark, and project-name treatments" had no literal rail-mark text — AppShell's brand tile is an icon-only gradient (Command icon, no wordmark text), and the run interview mapped "rail mark" to the sidebar subtitle.
- **Consequences**: New `--font-display: ui-serif, Charter, "Iowan Old Style", "Palatino Linotype", Georgia, serif` token (Tailwind v4 `font-display` utility). Applied to the wordmark + subtitle in `AppShell.tsx`, and to project names at all 3 render sites: `ProjectList.tsx` row, `ProjectDetail.tsx` breadcrumb header, `ProjectDetail.tsx` tab-rail label.

## 2026-08-05 — Selasar Phase-2 copy audit + rename: full-repo tagged list in the PRD, rename scope incl. bundle id
- **Status**: accepted
- **Context**: `prd-rebrand-tokens` Phase 2 (3 loops, one combined overnight run): audit every user-visible "LoopDeck" occurrence, then rename window title, wordmark, and in-app copy to "Selasar". The run interview resolved the PRD's open questions: rename the macOS bundle identifier too, and update Rust test assertions that assert on renamed copy.
- **Consequences**: Full-repo audit recorded in the PRD (`## Phase 2 Audit — "LoopDeck" occurrences`), every occurrence tagged user-visible / comment / test-assertion / left-intact. Renamed all user-visible copy + comments to "Selasar" (wordmark, error/empty/settings/import copy, agent initial prompts, chat truncation marker, Codex clientInfo title + turn errors, run-queue notification titles, schema/deny error strings, export header, 5 hook templates), updated test assertions + smoke-test-release.sh artifact names in lockstep, and changed the bundle `identifier` to `com.selasar.app`. Left untouched: `.loopdeck/` dir, `project.yaml` schema, `config.rs` `ProjectDirs::from("com","loopdeck","LoopDeck")`, log dir `~/Library/Logs/LoopDeck/`, all lowercase `loopdeck` identifiers, and docs/ (P2 goal, deferred).
5 changes: 4 additions & 1 deletion .loopdeck/loops.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,8 +3,11 @@
## Current

- **Started**: 2026-08-05
- **Goal**: `selasar-revamp` / `prd-rebrand-tokens` Phase 1Design tokens (the epic's first, gating PRD): replace `src/styles.css`'s light+dark token values with the paper/ink/teak palette, add a `--font-display` serif token, and verify the light/dark/system toggle against the new values. All three Phase-1 loops ran as one combined unattended overnight run; Phase 2 (rebrand copy audit) and Phase 3 (full visual pass) remain.
- **Goal**: `selasar-revamp` / `prd-rebrand-tokens` Phase 2Rebrand copy audit: grep the repo for user-visible "LoopDeck" occurrences and record the full list, rename `src-tauri/tauri.conf.json` productName/window title + `index.html` `<title>` to "Selasar", and rename all in-app user-visible copy to "Selasar" leaving `.loopdeck/`, `project.yaml` schema, and internal identifiers untouched. All three Phase-2 loops ran as one combined unattended overnight run; Phase 3 (full visual pass) remains.
- **Status**: in_progress
- ✅ **`selasar-revamp/grep-the-repo-for-user-visible-loopdeck-occurrences-component`** (2026-08-05) — Full-repo grep of every `LoopDeck`/`loopdeck` occurrence, each tagged by category (user-visible copy / comments / test assertions / left-intact on-disk paths + internal identifiers / docs & tooling); the full tagged list appended to the PRD as `## Phase 2 Audit — "LoopDeck" occurrences (2026-08-05)`, the rename source of truth for the two update loops.
- ✅ **`selasar-revamp/update-src-tauri-tauri-conf-json-s-window-title-and-product-name-to`** (2026-08-05) — `src-tauri/tauri.conf.json` `productName` (`:3`) + window `title` (`:16`) → "Selasar"; `index.html:6` `<title>` → "Selasar" (drives the WebView title bar, per the run interview); bundle `identifier` `com.loopdeck.app` → `com.selasar.app` (`:5`, Phase-2 open-question resolution). `scripts/smoke-test-release.sh` artifact names updated to match (`Selasar.app`/`Contents/MacOS/Selasar`/`com.selasar.app`); the real config-dir path `com.loopdeck.LoopDeck` (`:114`) preserved.
- ✅ **`selasar-revamp/update-all-in-app-user-visible-copy-found-in-the-audit-to-selasar`** (2026-08-05) — Renamed every user-visible "LoopDeck" to "Selasar": sidebar wordmark (`AppShell.tsx:138`), error/empty/settings/import copy (`RootErrorBoundary`/`EmptyState`/`Settings`/`ImportFlow`/`NewProjectDialog`/`KnowledgeGraphPanel`), agent initial prompts (`commands/agent.rs:1000,1011` + `run_executor.rs:152,157`), chat truncation marker (`agents.rs:844`), Codex `clientInfo` title + turn errors (`codex_session.rs:655,745,1254`), run-queue notification titles (`run_queue.rs`), schema-version + deny-reason error strings (`execution.rs`/`permission.rs`), exported-summary header (`progress.rs`), 5 hook templates' docstrings + nudge messages, and the smoke script. Comments renamed for consistency (full file list in the PRD audit); test assertions (`skills.rs` hook-content asserts) + hook templates updated in lockstep. Left untouched: `.loopdeck/` dir name, `project.yaml` schema, `config.rs` `ProjectDirs` (`com.loopdeck.LoopDeck`), log dir `~/Library/Logs/LoopDeck/`, and all lowercase `loopdeck` identifiers. Gates green: `cargo fmt --check` / `cargo clippy --lib -- -D warnings` / `cargo test` 590 passed / `tsc --noEmit` / `npm run build`.
- ✅ **`selasar-revamp/replace-src-styles-css-s-light-and-dark-token-values-with-the`** (2026-08-05) — Replaced `src/styles.css`'s `:root`/`.dark` token values with the paper/ink/teak palette from the run's 3 anchors only (paper `#F5F1E8`, ink `#241E17`, teak `#8A5A3A`): `--background`/`--foreground`/`--primary` map to the literal anchors in both schemes, neutrals are warm oklch interpolations (hue ≈73–87), functional colors (destructive/success/warning) warmed to the family, `--hljs-*` keyword/name/tag remapped to teak, `--shadow-*` ink-tinted (light) / border-based (dark), and the `card-accent-top` gradient to-color warmed. `--color-*` names unchanged. Gates: `tsc --noEmit` + `npm run build` clean.
- ✅ **`selasar-revamp/add-a-font-display-token-for-the-serif-display-font-and-apply-it`** (2026-08-05) — Added `--font-display: ui-serif, Charter, "Iowan Old Style", "Palatino Linotype", Georgia, serif` to the `@theme inline` block (generates the Tailwind `font-display` utility). Applied to the AppShell wordmark + subtitle (rail mark = subtitle per the run interview — the brand tile is icon-only, no wordmark text) and to project names at all 3 render sites (`ProjectList.tsx` row, `ProjectDetail.tsx` breadcrumb header, `ProjectDetail.tsx` tab-rail label).
- ✅ **`selasar-revamp/verify-the-existing-light-dark-system-theme-toggle-renders-correctly`** (2026-08-05) — Verified the light/dark/system toggle renders against the new values via build + structural check (the chosen mechanism — no browser/e2e infra in this repo): `tsc --noEmit` and `npm run build` clean; compiled CSS contains all 3 anchors in both `:root` (light: background `#f5f1e8`, foreground `#241e17`, primary `#8a5a3a`) and `.dark` (background `#241e17`, foreground `#f5f1e8`); `theme.tsx` mechanism untouched (`.dark` class toggle + `prefers-color-scheme` listener in auto); `font-display` utility compiled. PASS per the run interview = 3 anchors present at token level.
Expand Down
64 changes: 61 additions & 3 deletions docs/epics/selasar-revamp/prd-rebrand-tokens.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -75,12 +75,12 @@ occurrence sites are Phase 1/Phase 2 outputs, not decided yet._

### Phase 2 — Rebrand copy audit

- [] Grep the repo for user-visible "LoopDeck" occurrences (component
- [x] Grep the repo for user-visible "LoopDeck" occurrences (component
copy, `tauri.conf.json` window title/product name, Settings, empty
states, error strings) and record the full list.
- [] Update `src-tauri/tauri.conf.json`'s window title and product name to
- [x] Update `src-tauri/tauri.conf.json`'s window title and product name to
"Selasar".
- [] Update all in-app user-visible copy found in the audit to "Selasar",
- [x] Update all in-app user-visible copy found in the audit to "Selasar",
leaving `.loopdeck/` directory name, `project.yaml` schema, and
internal Rust/TS identifiers untouched.

Expand All@@ -100,3 +100,61 @@ occurrence sites are Phase 1/Phase 2 outputs, not decided yet._
- Are there `docs/` or `README.md` references that should stay "LoopDeck"
because they describe the git repository itself rather than the running
app? Resolve case-by-case during the Phase 2 audit.

## Phase 2 Audit — "LoopDeck" occurrences (2026-08-05)

Full-repo grep of every `LoopDeck`/`loopdeck` occurrence, tagged by whether it
is user-visible copy, a comment, a test assertion, internal/on-disk state,
docs, or tooling. Loops 2–3 rename the **User-visible** set; the **Comments**
set is renamed for consistency per the Phase-2 interview; the rest is left
intact. This list is the rename source of truth for the Phase-2 update loops.

### User-visible copy — renamed to "Selasar"
- `index.html:6` — `<title>LoopDeck</title>` (drives the window title bar)
- `src-tauri/tauri.conf.json:3` — `"productName": "LoopDeck"` (product/bundle name)
- `src-tauri/tauri.conf.json:16` — window `"title": "LoopDeck"`
- `src-tauri/tauri.conf.json:5` — bundle `"identifier": "com.loopdeck.app"` → `com.selasar.app` (Phase-2 open-question resolution)
- `src/components/layout/AppShell.tsx:138` — sidebar wordmark text `LoopDeck`
- `src/components/shared/RootErrorBoundary.tsx:106` — "LoopDeck ran into a problem"
- `src/components/settings/Settings.tsx:161` — agent-harness hint "…the local CLI LoopDeck uses…"
- `src/components/import/ImportFlow.tsx:107` — "Pick a folder on disk. LoopDeck discovers repositories…"
- `src/components/import/NewProjectDialog.tsx:67` — "Create a fresh folder with LoopDeck project memory…"
- `src/components/detail/KnowledgeGraphPanel.tsx:100` — "…LoopDeck only reads the output…"
- `src/components/dashboard/EmptyState.tsx:18` — "…LoopDeck stores context inside each repository."
- `src-tauri/src/commands/agent.rs:1000,1011` — agent initial prompt "You are working on this LoopDeck project…"
- `src-tauri/src/run_executor.rs:152,157` — unattended-run agent prompt "…this LoopDeck project…"
- `src-tauri/src/agents.rs:844` — chat truncation marker "[LoopDeck: response truncated — …]"
- `src-tauri/src/codex_session.rs:655,745` — Codex turn error "LoopDeck does not implement …"
- `src-tauri/src/codex_session.rs:1254` — Codex `clientInfo.title: "LoopDeck"`
- `src-tauri/src/commands/run_queue.rs:1118,1127,1286,1403,1429,1436` — notification titles "LoopDeck run killed / completed / parked"
- `src-tauri/src/execution.rs:608-609` — schema-version error "newer than this LoopDeck supports…upgrade LoopDeck…"
- `src-tauri/src/permission.rs:145` — deny reason "no matching allow rule and LoopDeck is deny-by-default"
- `src-tauri/src/progress.rs:302` — exported summary header "<!-- Generated by LoopDeck… -->"
- `templates/hooks/loopdeck-stop-hook.py:24` — transcript nudge "LoopDeck: if you made an architectural decision…"
- `templates/hooks/loopdeck-decisions-cap.py:72` — transcript message "LoopDeck: auto-archived N decision(s)…"
- `templates/hooks/orchestrator-start.py:58` — additional-context label "LoopDeck: .loopdeck/current-loop.md → …"
- `templates/hooks/loopdeck-memory-write.sh:68` — auto-written decisions.md context "…active on LoopDeck development."

### Release tooling — updated to match renamed artifact
- `scripts/smoke-test-release.sh` — `LoopDeck.app` / `Contents/MacOS/LoopDeck` / `LoopDeck_*_aarch64.dmg` / `com.loopdeck.app` references updated to `Selasar.*` / `com.selasar.app` to match Loop 2's productName/identifier change; the real config-dir path `com.loopdeck.LoopDeck` (`:114`) is preserved (that on-disk path is unchanged).

### Comments — renamed for consistency
- Frontend: `src/components/shared/RootErrorBoundary.tsx:26`, `src/components/shared/PermissionModeBadge.tsx:4`, `src/components/shared/Markdown.tsx:15`, `src/components/detail/Chat.tsx:218`, `src/components/detail/ProjectDetail.tsx:139`, `src/hooks/useStuckSessions.ts:24`, `src/types/index.ts:137,434,844,865`, `src/styles.css:175,213`
- Backend: `src-tauri/src/retry.rs:3`, `codex_session.rs:4,650,1245,1247,1264,1342`, `binary.rs:8`, `persist.rs:1`, `execution.rs:23`, `graphify.rs:8`, `harness.rs:3,93`, `agents.rs:180,205`, `runplan.rs:78`, `permission.rs:1,4,178,685,1250`, `scanner.rs:226`, `conversation.rs:143`, `claude_session.rs:531,541,1386`, `commands/agent.rs:552`, `commands/project.rs:359,530`, `skills.rs:517,1156`
- Hook-script docstrings/comments: `templates/hooks/loopdeck-stop-hook.py`, `loopdeck-memory-write.sh`, `loopdeck-dirty-flag.py`, `orchestrator-start.py`, `loopdeck-decisions-cap.py` (all `:2`-ish docstrings + inline "LoopDeck-tracked" gate comments)

### Test assertions — updated to match renamed copy
- `src-tauri/src/skills.rs:1249` — `assert!(stop_content.contains("LoopDeck Stop hook"))` → `"Selasar Stop hook"`
- `src-tauri/src/skills.rs:1254` — `assert!(mem_content.contains("LoopDeck memory auto-write"))` → `"Selasar memory auto-write"`

### Left intact — non-copy, on-disk paths, internal identifiers
- `src-tauri/src/config.rs:617` — `ProjectDirs::from("com","loopdeck","LoopDeck")` (global registry at `~/.config/loopdeck/config.yaml`); doc comments at `config.rs:435,501,614` and `secrets.rs:12` reference the same on-disk path
- `src-tauri/src/logging.rs:48` — `APP_NAME = "LoopDeck"` + log-dir comments (`logging.rs:10,190,193,212`) → `~/Library/Logs/LoopDeck/`
- `src-tauri/src/git.rs:495,541,586,730`, `multi_agent.rs:963`, `secret_scan.rs:210`, `run_queue.rs:1844` — `git config user.name "LoopDeck Test"` test fixtures (never user-visible)
- `.loopdeck/` directory name + `project.yaml` schema references throughout — persisted on-disk format
- Lowercase `loopdeck` identifiers: crate/package names (`Cargo.toml`, `package.json`, `package-lock.json`), IPC/store keys, skill names (`loopdeck-orchestrator`, …), api wrapper names — internal identifiers
- `src-tauri/src/codex_session.rs:1253` — `clientInfo.name: "loopdeck"` (protocol identifier; only the display `title` is renamed)

### Docs & tooling — out of Phase-2 scope (P2 goal)
- `README.md`, `AGENTS.md`, `CLAUDE.md`, `SECURITY.md`, `docs/**`, `docs/epics/**` — project docs; left "LoopDeck" where they describe the repo/module rather than the running app
- `templates/skills/loopdeck-*`, `.agents/skills/loopdeck-*` — developer skills; internal tooling, not in-app copy
2 changes: 1 addition & 1 deletion index.html
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,7 +3,7 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>LoopDeck</title>
<title>Selasar</title>
</head>
<body>
<div id="root"></div>
Expand Down
Loading