Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
d7d4b47
replay: prior Periscope synthesis delta
diazMelgarejo Jul 28, 2026
485bee5
refactor(identity): port Periscope runtime onto current AgentsView
diazMelgarejo Jul 28, 2026
8667d4b
build(release): adapt Periscope shipping contracts to upstream
diazMelgarejo Jul 28, 2026
cf8c254
docs(sync): codify safe upstream modernization workflow
diazMelgarejo Jul 28, 2026
c8dedce
chore(integration): restore ECC guards and rename catalogue
diazMelgarejo Jul 28, 2026
ac5a9bf
fix(identity): complete Periscope migration contracts
diazMelgarejo Jul 28, 2026
7fd1fae
test(modernization): close upstream replay regressions
diazMelgarejo Jul 28, 2026
edde64c
fix(modernization): satisfy final verification gates
diazMelgarejo Jul 28, 2026
1ba4bb6
test(modernization): stabilize final cross-platform gates
diazMelgarejo Jul 28, 2026
a45250d
fix(cli): expand leading tilde in DuckDB mirror paths (#1274)
rodboev Jul 28, 2026
d3f8b63
Add artifact publication ledger and export pipeline (#1251)
wesm Jul 28, 2026
5951716
feat(parser): add Omnigent support (#1284)
wesm Jul 28, 2026
0af9bae
fix(imports): use periscope module paths for Omnigent cherry-pick
diazMelgarejo Jul 29, 2026
e7a841c
fix(pricing): vendor LiteLLM snapshot for periscope embed builds
diazMelgarejo Jul 29, 2026
c14935f
fix(ci): resolve PR #26 lint, paths, schema, docs, and kit-ui failures
diazMelgarejo Jul 29, 2026
5a33adb
fix(ci): use local workflow, docs upstream fallback, and kit-ui scope
diazMelgarejo Jul 29, 2026
4473f78
feat(ui): migrate context visualizer to kit-ui primitives
diazMelgarejo Jul 29, 2026
4c4430a
fix(ci): land fork CI workflow, docs upstream hydrate, and kit-ui mig…
diazMelgarejo Jul 29, 2026
481ec5f
fix(ci): apply fork workflow, docs hydrate, and kit-ui migration (sta…
diazMelgarejo Jul 29, 2026
69f6f41
fix(git): sync hardened commit-clean staging guards from orama
diazMelgarejo Jul 29, 2026
ec11bca
docs: use repo-relative link for v1-ui-spec in v1 plan
diazMelgarejo Jul 29, 2026
821b985
docs: fix stale links to renamed periscope-spec.md
diazMelgarejo Jul 29, 2026
494beba
fix(git): align commit-clean test harness with orama guard bundle
diazMelgarejo Jul 29, 2026
2742add
docs: fix superpowers and script links excluded from zensical build
diazMelgarejo Jul 29, 2026
ff8cd5b
Merge pull request #26 from diazMelgarejo/cursor/periscope-pr23-duckd…
cursor[bot] Jul 29, 2026
32d3c28
merge: synthesize purified+PR26 onto merged (history-preserving)
diazMelgarejo Jul 29, 2026
732720c
docs(synthesis): document history-preserving merge policy and progress
diazMelgarejo Jul 29, 2026
f963d00
fix(synthesis): correct merge overlay — purified base + minimal merge…
diazMelgarejo Jul 29, 2026
25ad919
docs(synthesis): clarify minimal merged overlay scope
diazMelgarejo Jul 29, 2026
45dac3d
fix(synthesis): trim overlay to ECC+sync+jetbrains; fix docs links
diazMelgarejo Jul 29, 2026
e6fa88c
fix(duckdb-watch): tombstone deletions on unwatched/deferred roots (#31)
diazMelgarejo Jul 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
48 changes: 48 additions & 0 deletions .agents/skills/localization-paraglide/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
---
name: localization-paraglide
description: Use when adding, reviewing, or fixing localized UI copy in agentsview's Svelte frontend with Paraglide JS. Trigger for frontend/messages/*.json edits, generated m.* message usage, locale-aware number/date/relative-time formatting, pluralization, language switching, or hard-coded user-facing English in frontend/src.
---

# Localization Paraglide

## Workflow

1. Read `frontend/project.inlang/settings.json`, `frontend/src/lib/i18n/index.ts`,
and nearby localized components before editing.
2. Put user-facing copy in `frontend/messages/en.json` and
`frontend/messages/zh-CN.json` with identical keys.
3. Import app localization through `frontend/src/lib/i18n/index.ts`:

```ts
import { m } from "../../i18n/index.js";
```

4. Call generated Paraglide messages as functions, for example
`m.nav_sessions()` or `m.shared_active_filters_remove_agent({ agent })`.
5. Use Paraglide message declarations for plural, number, datetime, and relative
time when the formatted value is part of translatable copy.
6. Use `formatDateTime()` from `frontend/src/lib/i18n/index.ts` for standalone
visible date/time labels that need the active Paraglide locale.
7. Keep technical identifiers untranslated: agent names, model names, file paths,
CLI commands, IDs, and raw API values.
8. Run `npm run i18n:compile` and `npm run check` from `frontend/` after message
or component changes.

## Message Rules

- Keep key names scoped and descriptive, such as
`settings_terminal_title` or `activity_concurrency_empty`.
- Do not concatenate translated sentence fragments. Prefer one complete message
with parameters.
- Pass numbers as numbers to pluralized messages. Pass strings only for display
fragments that have already been intentionally formatted.
- In Svelte, put arrays or objects containing translated labels in `$derived` or
`$derived.by` when they must update after locale changes.
- Do not import from `frontend/src/lib/paraglide/*` directly in components unless
changing the i18n wrapper itself.

## Formatting

Read `references/paraglide-formatting.md` when adding pluralization, ordinal
rules, date/time formatting, relative dates, compact numbers, currencies, or
mixed selector messages.
4 changes: 4 additions & 0 deletions .agents/skills/localization-paraglide/agents/openai.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
interface:
display_name: "Paraglide Localization"
short_description: "Use Paraglide localization correctly"
default_prompt: "Use $localization-paraglide to localize this agentsview UI change with Paraglide."
Original file line number Diff line number Diff line change
@@ -0,0 +1,180 @@
# Paraglide Formatting Reference

Official docs:

- Basic usage and generated messages:
<https://github.com/opral/paraglide-js/blob/main/docs/basics.md>
- Variants and plural selectors:
<https://github.com/opral/paraglide-js/blob/main/docs/variants.md>
- Number, datetime, and relative-time formatting:
<https://github.com/opral/paraglide-js/blob/main/docs/formatting.md>

## Generated Messages

Use generated message functions through the app wrapper:

```ts
import { m } from "../../i18n/index.js";

m.greeting({ name: "Ada" });
```

Messages live in `frontend/messages/{locale}.json`. The English and Simplified
Chinese catalogs must have the same keys.

## Cardinal Plurals

Use variant messages for counts. Paraglide's `plural` selector uses
`Intl.PluralRules`, so it works for locales with more than English singular and
plural categories.

```json
{
"tool_call_group_call_count": [
{
"declarations": [
"input count",
"local countPlural = count: plural"
],
"selectors": ["countPlural"],
"match": {
"countPlural=one": "{count} tool call",
"countPlural=other": "{count} tool calls"
}
}
]
}
```

Call with a number:

```ts
m.tool_call_group_call_count({ count: 3 });
```

For `zh-CN`, use the same declaration and provide the matching locale text; a
single `other` or wildcard branch is often enough only when the locale truly has
no visible plural distinction.

## Ordinals

Use `type=ordinal` for values such as 1st, 2nd, and 3rd.

```json
{
"ranking_place": [
{
"declarations": [
"input place",
"local placePlural = place: plural type=ordinal"
],
"selectors": ["placePlural"],
"match": {
"placePlural=one": "{place}st",
"placePlural=two": "{place}nd",
"placePlural=few": "{place}rd",
"placePlural=*": "{place}th"
}
}
]
}
```

## Date And Time

For dates inside translatable copy, use the Paraglide `datetime` formatter in the
message declaration so locale formatting and word order stay in the catalog.

```json
{
"session_started_at": [
{
"declarations": [
"input startedAt",
"local started = startedAt: datetime dateStyle=medium timeStyle=short"
],
"match": {
"startedAt=*": "Started {started}"
}
}
]
}
```

For standalone visible date/time labels in components, use the app helper:

```ts
import { formatDateTime } from "../../i18n/index.js";

formatDateTime(timestamp, {
month: "short",
day: "numeric",
timeZone,
});
```

Do not hard-code `"en"` or `"en-US"` for visible UI formatting. It is acceptable
to use a fixed locale for internal sentinel calculations when the formatted
string is not displayed.

## Relative Dates

Use Paraglide's `relativetime` formatter. The `unit` option is required.

```json
{
"status_bar_synced_ago": [
{
"declarations": [
"input duration",
"local formattedDuration = duration: relativetime unit=minute numeric=auto"
],
"match": {
"duration=*": "synced {formattedDuration}"
}
}
]
}
```

Use a variable unit only when the caller computes the unit intentionally:

```json
{
"updated_relative": [
{
"declarations": [
"input duration",
"input unit",
"local formattedDuration = duration: relativetime unit=$unit style=short"
],
"match": {
"duration=*,unit=*": "Updated {formattedDuration}"
}
}
]
}
```

## Numbers And Currency

Prefer Paraglide's `number` formatter for numbers embedded in messages:

```json
{
"usage_total_cost": [
{
"declarations": [
"input amount",
"local cost = amount: number style=currency currency=USD"
],
"match": {
"amount=*": "Total cost {cost}"
}
}
]
}
```

Use raw `toLocaleString()` only for non-sentence labels where the browser or
app-level locale behavior is already intentional.
Loading
Loading