Skip to content

Commit 6f5e1b8

Browse files
committed
chore: release v0.4.0-rc.3
1 parent abeae98 commit 6f5e1b8

12 files changed

Lines changed: 195 additions & 78 deletions

CHANGELOG.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,16 @@
22

33
All notable changes to Copicu are documented here.
44

5+
## [0.4.0-rc.3] - 2026-07-27
6+
7+
### Added
8+
9+
- Bundle the Extract URLs and Join Selected as Markdown scripts with the Windows installer. They are copied to the default scripts folder only when missing, preserving user-owned versions and files.
10+
11+
### Fixed
12+
13+
- Open persistent auxiliary windows on the active monitor, restore position and size per monitor, and scale default/minimum bounds correctly at 150% and other DPI settings.
14+
515
## [0.4.0-rc.2] - 2026-07-27
616

717
### Fixed
@@ -39,6 +49,7 @@ All notable changes to Copicu are documented here.
3949
- Made metadata editing target the last item activated with `Enter` after the picker hides and resets.
4050
- Restored reliable initial focus for the metadata input.
4151

52+
[0.4.0-rc.3]: https://github.com/jpsala/copicu/releases/tag/v0.4.0-rc.3
4253
[0.4.0-rc.2]: https://github.com/jpsala/copicu/releases/tag/v0.4.0-rc.2
4354
[0.4.0-rc.1]: https://github.com/jpsala/copicu/releases/tag/v0.4.0-rc.1
4455
[0.3.9]: https://github.com/jpsala/copicu/releases/tag/v0.3.9

README.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,9 @@ Compact inline metadata editing with #tag autocomplete, reliable keyboard select
3838

3939
Release candidate for testers:
4040

41-
- [v0.4.0-rc.2](https://github.com/jpsala/copicu/releases/tag/v0.4.0-rc.2)
41+
- [v0.4.0-rc.3](https://github.com/jpsala/copicu/releases/tag/v0.4.0-rc.3)
4242
- Asset: `Copicu_0.4.0_x64-setup.exe`
43-
- SHA256: `4C6EE9827EC60A0934D6F21F050E51FB7051C647A04B009814FB233F2B57C5EB`
43+
- SHA256: `E75236346760097330272D36516DD5742EB84F08071CE8E9A1200DF9C103A848`
4444
- Prerelease only: it does not replace `v0.3.9` on the stable updater channel.
4545

4646
Copicu is used daily by its maintainer, but it is still alpha software. Windows may show SmartScreen or Defender warnings for a young/unsigned desktop app that monitors clipboard and keyboard shortcuts. Verify downloads from GitHub Releases and the published SHA256.
@@ -150,6 +150,8 @@ The repo already includes runnable showcase examples under [scripts/examples/](s
150150
- [extract URLs from selected text](scripts/examples/030-extract-urls-copy.ts)`Ctrl+Alt+L`;
151151
- [join selected clips as Markdown](scripts/examples/031-join-selected-markdown-copy.ts)`Ctrl+Alt+M`.
152152

153+
The Windows installer seeds only **Extract URLs** (`030`) and **Join Selected as Markdown** (`031`) into the default scripts folder, and only when those files are missing. Existing or customized scripts are never overwritten. The other files remain development examples and API fixtures in the repository.
154+
153155
Press `Ctrl+Alt+Q` in the picker to open **Quick Actions**, a context-aware action picker that shows runnable scripts/actions for the current selection so you do not need to memorize every shortcut.
154156

155157
Scripts are trusted local automation, not a secure sandbox or marketplace. Treat scripts like code you choose to run on your own machine.

docs/.generated/context-index.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
Generated cache. Do not edit by hand.
44

5-
Generated: 2026-07-27T02:12:02.724Z
5+
Generated: 2026-07-27T14:24:09.531Z
66

77
## Topics
88

docs/WORKING_MEMORY.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,11 @@ Router operativo corto. Si un detalle crece, moverlo a topic, track, spec o refe
1919
| Area | Estado | Abrir primero | Siguiente accion |
2020
| --- | --- | --- | --- |
2121
| Actions modularization | active | `docs/tracks/017-actions-modularization.md` | Proxima extraccion mecanica chica sin tocar runner Node. |
22-
| Actions/scripts/hotkeys | complete | `docs/tracks/012-tags-and-hotkeys.md`, `docs/topics/tag-management-hotkeys.md`, `docs/tracks/004-actions-scripting.md` | Metadata global simplificada a un textarea: `#tokens` inline se parsean a tags, el resto a notes; `title` no se expone. |
22+
| Actions/scripts/hotkeys | complete | `docs/tracks/012-tags-and-hotkeys.md`, `docs/topics/tag-management-hotkeys.md`, `docs/tracks/004-actions-scripting.md` | Installer distribuye solo `030` Extract URLs y `031` Join Markdown, sin sobrescribir; ejemplos restantes quedan como fixtures del repo. |
2323
| Future workflows | parked | `docs/tracks/019-paste-queue.md`, `docs/tracks/020-secure-clips-password.md` | Discutir antes de implementar: Paste Queue y secure clips con metadata `@pass`. |
2424
| Search / AI / metadata | active/dogfood | `docs/topics/filtering-and-query-syntax.md`, `docs/tracks/008-filtering-search-foundation.md`, `specs/005-search-plan-engine/` | Triggers, chips/explain y diagnostico sintactico listos. Autocomplete local esta en worktree y requiere validacion independiente antes de marcarlo aplicado; luego saved searches o highlighting. |
2525
| Performance/UI windows | active | `docs/tracks/014-performance-memory.md`, `docs/topics/custom-window-system.md`, `docs/tracks/010-ui-rethink.md`, `docs/topics/window-state-and-monitor-policy.md` | UI modularizada; proximo split seguro: `UiHostApp`; revisar `LastMonitor` si importa. |
26-
| Open source/release | active | `docs/tracks/018-public-launch-readiness.md`, `docs/tracks/021-distribution-trust-code-signing.md`, `docs/topics/windows-installer.md` | `v0.3.9` estable; `v0.4.0-rc.2` en feature freeze sin reemplazar el canal stable. Proximo: observar regresiones y promover a `v0.4.0`. |
26+
| Open source/release | active | `docs/tracks/018-public-launch-readiness.md`, `docs/tracks/021-distribution-trust-code-signing.md`, `docs/topics/windows-installer.md` | `v0.3.9` estable; `v0.4.0-rc.3` en feature freeze sin reemplazar el canal stable. Proximo: observar regresiones y promover a `v0.4.0`. |
2727
| Picker dogfood / Computer Use | active | `tests/manual/dogfood/README.md`, `docs/topics/picker-interaction.md`, `docs/topics/pi-agentic-os.md` | Mantener oracle C0: app externa -> hotkey -> type sin focus manual escribe en search. |
2828
| OS / sistema agentico | active | `docs/topics/docs-knowledge-system.md`, `docs/topics/pi-agentic-os.md`, `docs/topics/agentic-os-operations.md` | Copicu es downstream AOS; mantener ruta caliente corta. Pendiente: compactar TOPICS/topics grandes cuando molesten. |
2929

@@ -33,7 +33,7 @@ Router operativo corto. Si un detalle crece, moverlo a topic, track, spec o refe
3333

3434
## Decisiones Vigentes
3535

36-
Copicu es CopyQ-inspired (no compatible), stack Tauri 2 + React/Vite/TS + Rust + SQLite, UI keyboard-first y rapida. Instalada diaria: `%APPDATA%\dev.jpsala.copicu`; dev aislado: `.codex-run\dev-isolated`; release estable `v0.3.9`; candidate `v0.4.0-rc.2`. Scripts/AI usan host APIs/capabilities, no SQL/shell/fs/network crudo. Clipboard enrichment v1 es interna post-capture; `metadata` standalone queda `CachedHidden` + prewarm salvo evidencia. Skills canonicas en `docs/skills/`; `.agents/skills` es compatibilidad. Copicu es downstream AOS: no copiar registry/memoria/tracks/decisiones del kit; memoria durable vive en docs versionados. Para UI, abrir `docs/topics/ui-design-and-impeccable.md`.
36+
Copicu es CopyQ-inspired (no compatible), stack Tauri 2 + React/Vite/TS + Rust + SQLite, UI keyboard-first y rapida. Instalada diaria: `%APPDATA%\dev.jpsala.copicu`; dev aislado: `.codex-run\dev-isolated`; release estable `v0.3.9`; candidate `v0.4.0-rc.3`. Scripts/AI usan host APIs/capabilities, no SQL/shell/fs/network crudo. Clipboard enrichment v1 es interna post-capture; `metadata` standalone queda `CachedHidden` + prewarm salvo evidencia. Skills canonicas en `docs/skills/`; `.agents/skills` es compatibilidad. Copicu es downstream AOS: no copiar registry/memoria/tracks/decisiones del kit; memoria durable vive en docs versionados. Para UI, abrir `docs/topics/ui-design-and-impeccable.md`.
3737

3838
## Riesgos / Pendientes Tecnicos
3939

docs/topics/window-state-and-monitor-policy.md

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,9 @@ Estado actual:
4242
| Label | Resize | Persist bounds | Por monitor | Nota |
4343
| --- | --- | --- | --- | --- |
4444
| `main` | si | si | si | Picker rapido; al abrir usa el monitor del cursor. |
45-
| `settings` | si | si | si | Ventana document; usa ultimo monitor disponible. |
46-
| `ai-output` | si | si | si | Ventana document para Markdown/output. |
47-
| `metadata` | si | si | si | Utility para metadata; prewarm/cached hidden. |
45+
| `settings` | si | si | si | Abre en monitor activo y restaura su perfil de bounds. |
46+
| `ai-output` | si | si | si | Abre en monitor activo y restaura su perfil de bounds. |
47+
| `metadata` | si | si | si | Utility prewarm/cached; al mostrar abre en monitor activo. |
4848
| `ui-host` | no | no | no | Prompt compacto; tamano calculado por request. |
4949
| `notifications` | no | no | no | Posicionada por codigo junto al monitor de `main`; tamano fijo. |
5050
| `whichkey` | no | no | no | Utility temporal; tamano fijo hasta reactivar/validar. |
@@ -54,13 +54,13 @@ Estado actual:
5454
Fuentes consultadas el 2026-06-09:
5555

5656
- Microsoft documenta una preferencia de Windows para "Remember window locations based on monitor connection" y minimizacion al desconectar monitor. Esto confirma que el modelo esperado por usuarios multi-monitor no es solo coordenadas globales, sino posiciones asociadas a configuracion/monitor.
57-
- https://support.microsoft.com/en-us/windows/how-to-use-multiple-monitors-in-windows-329c6962-5a4d-b481-7baa-bec9671f728a
57+
- <https://support.microsoft.com/en-us/windows/how-to-use-multiple-monitors-in-windows-329c6962-5a4d-b481-7baa-bec9671f728a>
5858
- Tauri `window-state` guarda/restaura posiciones y tamanos, pero opera como plugin general. Copicu necesita control por ventana y por monitor, por eso se implementa una capa propia chica.
59-
- https://v2.tauri.app/plugin/window-state/
59+
- <https://v2.tauri.app/plugin/window-state/>
6060
- Tauri expone APIs de monitores: monitor actual, monitor por punto, monitores disponibles, cursor, `workArea`, posicion, tamano y escala.
61-
- https://v2.tauri.app/reference/javascript/api/namespacewindow/
61+
- <https://v2.tauri.app/reference/javascript/api/namespacewindow/>
6262
- Electron RFC de persistencia de estado valida el patron de comprobar display/work area y ajustar bounds si al restaurar quedan fuera o no entran en pantalla.
63-
- https://github.com/electron/rfcs/blob/main/text/0016-save-restore-window-state.md
63+
- <https://github.com/electron/rfcs/blob/main/text/0016-save-restore-window-state.md>
6464

6565
## Formato Persistido
6666

@@ -87,23 +87,21 @@ Formato conceptual:
8787

8888
## Restauracion
8989

90-
Estado observado 2026-06-29: la persistencia existe y guarda `lastMonitorKey`, `lastBounds` y `boundsByMonitor` en app data. Hay un matiz pendiente: la politica `LastMonitor` actualmente elige el monitor objetivo desde primario/disponible y luego considera bounds guardados; si el primario tiene bounds previos, puede no preferir exactamente `lastMonitorKey`. Si JP pide precision de ultimo monitor para `settings`/`metadata`/`ai-output`, ajustar `choose_target_monitor`/restore para priorizar `lastMonitorKey` conectado y caer al disponible solo si desaparecio.
90+
Decision 2026-07-27: todas las ventanas persistentes eligen el monitor activo con la misma politica `CursorMonitor` del picker. `LastMonitor` queda solo para restauraciones ocultas/prewarm que se vuelven a resolver al mostrar. Nunca se reutilizan coordenadas de otro monitor para una apertura visible.
9191

9292
Al mostrar una ventana persistente:
9393

9494
1. Resolver la politica de esa ventana desde `WindowStateRegistry`.
95-
2. Elegir monitor objetivo:
96-
- `main`: monitor bajo el cursor al momento de abrir.
97-
- `settings`/`ai-output`: monitor actual o primario disponible.
95+
2. Elegir monitor objetivo bajo el cursor al momento de abrir; si no se puede resolver, caer al primario/disponible.
9896
3. Si hay bounds guardados para ese monitor, usarlos.
99-
4. Si no hay bounds para ese monitor pero existe ultimo monitor conectado guardado, usar esos bounds ajustados.
100-
5. Si no hay estado, centrar con defaults en el monitor objetivo.
97+
4. Si no hay perfil para ese monitor, centrar con defaults en el monitor objetivo; no trasladar coordenadas del monitor anterior.
98+
5. Interpretar defaults y minimos como dimensiones logicas y escalarlos al DPI del monitor antes de aplicar `PhysicalSize`.
10199
6. Validar contra `workArea`:
102100
- clamp de tamano a minimo y area disponible;
103101
- si la ventana queda casi fuera de pantalla, centrar;
104102
- si solo sobresale, empujarla dentro del area visible.
105103

106-
Regla importante: `boundsByMonitor` conserva posiciones por monitor. Si un monitor externo no esta conectado, la ventana puede abrir en el monitor disponible sin borrar la posicion previa del externo.
104+
Regla importante: `boundsByMonitor` conserva posiciones y tamanos fisicos por monitor. Si un monitor externo no esta conectado, la ventana abre centrada en el activo sin borrar el perfil previo del externo. En DPI 125/150/200%, defaults y minimos se escalan con `Monitor::scale_factor()` para evitar utilities fisicamente chicas.
107105

108106
## Resize En Frameless
109107

docs/topics/windows-installer.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,16 @@ La ventana Settings incluye seccion `About` desde `v0.2.7`, con descripcion, ver
147147

148148
`v0.2.8` agrego diagnostics persistente para release/instalada en `%APPDATA%\dev.jpsala.copicu\diagnostics.jsonl` con rotacion simple a `diagnostics.previous.jsonl` al pasar ~5 MB. Registra eventos sin payloads: `app.startup`, `storage.ready`, `window.*`, `updater.*`, `clipboard.event.*` con duracion/outcome/tamano y `renderer.heartbeat` cada ~30 s. Si una instancia instalada vuelve a quedar `Hung=True`, revisar el ultimo heartbeat/evento antes de reiniciar; el dump local del incidente previo quedo en `.codex-run\hang-dumps\copicu-installed-hung-20260623-113818.dmp`.
149149

150+
## Scripts Incluidos
151+
152+
El instalador NSIS distribuye una seleccion minima de scripts utiles:
153+
154+
- `030-extract-urls-copy.ts`;
155+
- `031-join-selected-markdown-copy.ts`;
156+
- `copicu-action.d.ts`, necesario para tipos/autocomplete al editarlos.
157+
158+
El hook copia estos archivos a `$DOCUMENTS\Copicu\Scripts` solo cuando cada destino no existe. Una actualizacion nunca sobrescribe scripts modificados por el usuario y el uninstall no los borra. Los demas archivos bajo `scripts/examples/` son fixtures y contratos de desarrollo, no contenido instalado.
159+
150160
## Launch On Windows Startup
151161

152162
La opcion Settings -> General -> `Launch on Windows startup` usa `tauri-plugin-autostart`, que en Windows escribe `HKCU\Software\Microsoft\Windows\CurrentVersion\Run` con el app name de Tauri (`Copicu`) y marca `Explorer\StartupApproved\Run` como enabled cuando existe.

docs/tracks/018-public-launch-readiness.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -490,6 +490,13 @@ Checkpoint 2026-07-27 `v0.4.0-rc.2`:
490490
- Instalador `Copicu_0.4.0_x64-setup.exe`; SHA256 `4C6EE9827EC60A0934D6F21F050E51FB7051C647A04B009814FB233F2B57C5EB`.
491491
- `v0.3.9` sigue siendo stable/latest; `rc.2` permanece prerelease.
492492

493+
Checkpoint 2026-07-27 `v0.4.0-rc.3`:
494+
495+
- Ventanas persistentes abren en el monitor activo, restauran bounds por monitor y escalan defaults/minimos para DPI 125/150/200%.
496+
- El instalador distribuye solo `030-extract-urls-copy.ts`, `031-join-selected-markdown-copy.ts` y tipos, sin sobrescribir archivos existentes.
497+
- Instalador `Copicu_0.4.0_x64-setup.exe`; SHA256 `E75236346760097330272D36516DD5742EB84F08071CE8E9A1200DF9C103A848`.
498+
- `v0.3.9` sigue siendo stable/latest; `rc.3` permanece prerelease y Authenticode sigue pendiente.
499+
493500
Pendiente inmediato:
494501

495502
1. Respaldar fuera del repo la key/password vigente de `.codex-run/secrets/`.

src-tauri/nsis-hooks.nsh

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,17 @@
22
IfFileExists "$INSTDIR\resources\WebView2Loader.dll" 0 +2
33
CopyFiles /SILENT "$INSTDIR\resources\WebView2Loader.dll" "$INSTDIR\WebView2Loader.dll"
44
Delete "$INSTDIR\bench_history_search.exe"
5+
6+
CreateDirectory "$DOCUMENTS\Copicu\Scripts"
7+
IfFileExists "$DOCUMENTS\Copicu\Scripts\030-extract-urls-copy.ts" bundled_script_030_done
8+
CopyFiles /SILENT "$INSTDIR\bundled-scripts\030-extract-urls-copy.ts" "$DOCUMENTS\Copicu\Scripts\030-extract-urls-copy.ts"
9+
bundled_script_030_done:
10+
IfFileExists "$DOCUMENTS\Copicu\Scripts\031-join-selected-markdown-copy.ts" bundled_script_031_done
11+
CopyFiles /SILENT "$INSTDIR\bundled-scripts\031-join-selected-markdown-copy.ts" "$DOCUMENTS\Copicu\Scripts\031-join-selected-markdown-copy.ts"
12+
bundled_script_031_done:
13+
IfFileExists "$DOCUMENTS\Copicu\Scripts\copicu-action.d.ts" bundled_script_types_done
14+
CopyFiles /SILENT "$INSTDIR\bundled-scripts\copicu-action.d.ts" "$DOCUMENTS\Copicu\Scripts\copicu-action.d.ts"
15+
bundled_script_types_done:
516
!macroend
617

718
!macro NSIS_HOOK_POSTUNINSTALL

src-tauri/src/lib.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2525,7 +2525,7 @@ fn open_settings_window_on_main_thread<R: tauri::Runtime>(
25252525

25262526
if let Some(registry) = app.try_state::<window_state::WindowStateRegistry>() {
25272527
registry
2528-
.restore(&window, window_state::RestoreTarget::LastMonitor)
2528+
.restore(&window, window_state::RestoreTarget::CursorMonitor)
25292529
.map_err(|error| format!("settings window state restore failed: {error}"))?;
25302530
}
25312531
window
@@ -2595,7 +2595,7 @@ pub(crate) fn open_ai_output_window<R: tauri::Runtime>(
25952595

25962596
if let Some(registry) = app.try_state::<window_state::WindowStateRegistry>() {
25972597
registry
2598-
.restore(&window, window_state::RestoreTarget::LastMonitor)
2598+
.restore(&window, window_state::RestoreTarget::CursorMonitor)
25992599
.map_err(|error| format!("ai-output window state restore failed: {error}"))?;
26002600
}
26012601
window
@@ -2654,7 +2654,7 @@ fn open_metadata_editor_window<R: tauri::Runtime>(
26542654
if let Some(registry) = app.try_state::<window_state::WindowStateRegistry>() {
26552655
let restore_started_at = Instant::now();
26562656
registry
2657-
.restore(&window, window_state::RestoreTarget::LastMonitor)
2657+
.restore(&window, window_state::RestoreTarget::CursorMonitor)
26582658
.map_err(|error| format!("metadata window state restore failed: {error}"))?;
26592659
diag_log(
26602660
"metadata.open.restore.done",

src-tauri/src/surface_registry.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ pub enum SurfaceLifecycle {
2626
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
2727
pub enum BoundsPolicy {
2828
CursorMonitor,
29-
LastMonitor,
3029
FixedPosition,
3130
None,
3231
}
@@ -97,7 +96,7 @@ pub const SURFACES: &[SurfaceWindow] = &[
9796
kind: SurfaceKind::Document,
9897
chrome: ChromeVariant::Document,
9998
lifecycle: SurfaceLifecycle::CachedHidden,
100-
bounds_policy: BoundsPolicy::LastMonitor,
99+
bounds_policy: BoundsPolicy::CursorMonitor,
101100
capability: "surface-settings",
102101
width: 820,
103102
height: 620,
@@ -121,7 +120,7 @@ pub const SURFACES: &[SurfaceWindow] = &[
121120
kind: SurfaceKind::Document,
122121
chrome: ChromeVariant::Document,
123122
lifecycle: SurfaceLifecycle::CachedHidden,
124-
bounds_policy: BoundsPolicy::LastMonitor,
123+
bounds_policy: BoundsPolicy::CursorMonitor,
125124
capability: "surface-ai-output",
126125
width: 940,
127126
height: 680,
@@ -145,7 +144,7 @@ pub const SURFACES: &[SurfaceWindow] = &[
145144
kind: SurfaceKind::Utility,
146145
chrome: ChromeVariant::Utility,
147146
lifecycle: SurfaceLifecycle::CachedHidden,
148-
bounds_policy: BoundsPolicy::LastMonitor,
147+
bounds_policy: BoundsPolicy::CursorMonitor,
149148
capability: "surface-metadata",
150149
width: 480,
151150
height: 340,

0 commit comments

Comments
 (0)