feat: l'application s'appelle Ex Ego — à l'oreille « ex aequo », à la lettre « ex-ego » ; binaire/crate renommés exego, manifest PWA, titres, README et CLAUDE.mdUnverified
Claude-Session: https://claude.ai/code/session_01FPKHKGfqvnvXKY9tNhYmkh
85f0632 parent: 6f4aaf0 modified
Cargo.lock +28 -28 | @@ -753,6 +753,34 @@ dependencies = [ | ||
| 753 | 753 | "pin-project-lite", |
| 754 | 754 | ] |
| 755 | 755 | |
| 756 | +[[package]] | |
| 757 | +name = "exego" | |
| 758 | +version = "0.1.0" | |
| 759 | +dependencies = [ | |
| 760 | + "anyhow", | |
| 761 | + "argon2", | |
| 762 | + "askama", | |
| 763 | + "axum", | |
| 764 | + "axum-extra", | |
| 765 | + "biscuit-auth", | |
| 766 | + "chrono", | |
| 767 | + "chrono-tz", | |
| 768 | + "clap", | |
| 769 | + "hex", | |
| 770 | + "hmac", | |
| 771 | + "rpassword", | |
| 772 | + "serde", | |
| 773 | + "sha2 0.10.9", | |
| 774 | + "sqlx", | |
| 775 | + "subtle", | |
| 776 | + "thiserror 2.0.19", | |
| 777 | + "time", | |
| 778 | + "tokio", | |
| 779 | + "tracing", | |
| 780 | + "tracing-subscriber", | |
| 781 | + "uuid", | |
| 782 | +] | |
| 783 | + | |
| 756 | 784 | [[package]] |
| 757 | 785 | name = "ff" |
| 758 | 786 | version = "0.13.1" |
| @@ -2479,34 +2507,6 @@ dependencies = [ | ||
| 2479 | 2507 | "time-core", |
| 2480 | 2508 | ] |
| 2481 | 2509 | |
| 2482 | -[[package]] | |
| 2483 | -name = "time-time" | |
| 2484 | -version = "0.1.0" | |
| 2485 | -dependencies = [ | |
| 2486 | - "anyhow", | |
| 2487 | - "argon2", | |
| 2488 | - "askama", | |
| 2489 | - "axum", | |
| 2490 | - "axum-extra", | |
| 2491 | - "biscuit-auth", | |
| 2492 | - "chrono", | |
| 2493 | - "chrono-tz", | |
| 2494 | - "clap", | |
| 2495 | - "hex", | |
| 2496 | - "hmac", | |
| 2497 | - "rpassword", | |
| 2498 | - "serde", | |
| 2499 | - "sha2 0.10.9", | |
| 2500 | - "sqlx", | |
| 2501 | - "subtle", | |
| 2502 | - "thiserror 2.0.19", | |
| 2503 | - "time", | |
| 2504 | - "tokio", | |
| 2505 | - "tracing", | |
| 2506 | - "tracing-subscriber", | |
| 2507 | - "uuid", | |
| 2508 | -] | |
| 2509 | - | |
| 2510 | 2510 | [[package]] |
| 2511 | 2511 | name = "tinystr" |
| 2512 | 2512 | version = "0.8.3" |
| @@ -753,6 +753,34 @@ dependencies = [ | |||
| 753 | "pin-project-lite", | 753 | "pin-project-lite", |
| 754 | ] | 754 | ] |
| 755 | 755 | ||
| 756 | +[[package]] | ||
| 757 | +name = "exego" | ||
| 758 | +version = "0.1.0" | ||
| 759 | +dependencies = [ | ||
| 760 | + "anyhow", | ||
| 761 | + "argon2", | ||
| 762 | + "askama", | ||
| 763 | + "axum", | ||
| 764 | + "axum-extra", | ||
| 765 | + "biscuit-auth", | ||
| 766 | + "chrono", | ||
| 767 | + "chrono-tz", | ||
| 768 | + "clap", | ||
| 769 | + "hex", | ||
| 770 | + "hmac", | ||
| 771 | + "rpassword", | ||
| 772 | + "serde", | ||
| 773 | + "sha2 0.10.9", | ||
| 774 | + "sqlx", | ||
| 775 | + "subtle", | ||
| 776 | + "thiserror 2.0.19", | ||
| 777 | + "time", | ||
| 778 | + "tokio", | ||
| 779 | + "tracing", | ||
| 780 | + "tracing-subscriber", | ||
| 781 | + "uuid", | ||
| 782 | +] | ||
| 783 | + | ||
| 756 | [[package]] | 784 | [[package]] |
| 757 | name = "ff" | 785 | name = "ff" |
| 758 | version = "0.13.1" | 786 | version = "0.13.1" |
| @@ -2479,34 +2507,6 @@ dependencies = [ | |||
| 2479 | "time-core", | 2507 | "time-core", |
| 2480 | ] | 2508 | ] |
| 2481 | 2509 | ||
| 2482 | -[[package]] | ||
| 2483 | -name = "time-time" | ||
| 2484 | -version = "0.1.0" | ||
| 2485 | -dependencies = [ | ||
| 2486 | - "anyhow", | ||
| 2487 | - "argon2", | ||
| 2488 | - "askama", | ||
| 2489 | - "axum", | ||
| 2490 | - "axum-extra", | ||
| 2491 | - "biscuit-auth", | ||
| 2492 | - "chrono", | ||
| 2493 | - "chrono-tz", | ||
| 2494 | - "clap", | ||
| 2495 | - "hex", | ||
| 2496 | - "hmac", | ||
| 2497 | - "rpassword", | ||
| 2498 | - "serde", | ||
| 2499 | - "sha2 0.10.9", | ||
| 2500 | - "sqlx", | ||
| 2501 | - "subtle", | ||
| 2502 | - "thiserror 2.0.19", | ||
| 2503 | - "time", | ||
| 2504 | - "tokio", | ||
| 2505 | - "tracing", | ||
| 2506 | - "tracing-subscriber", | ||
| 2507 | - "uuid", | ||
| 2508 | -] | ||
| 2509 | - | ||
| 2510 | [[package]] | 2510 | [[package]] |
| 2511 | name = "tinystr" | 2511 | name = "tinystr" |
| 2512 | version = "0.8.3" | 2512 | version = "0.8.3" |
modified
Cargo.toml +1 -1 | @@ -1,5 +1,5 @@ | ||
| 1 | 1 | [package] |
| 2 | -name = "time-time" | |
| 2 | +name = "exego" | |
| 3 | 3 | version = "0.1.0" |
| 4 | 4 | edition = "2024" |
| 5 | 5 | license = "Unlicense" |
| @@ -1,5 +1,5 @@ | |||
| 1 | [package] | 1 | [package] |
| 2 | -name = "time-time" | 2 | +name = "exego" |
| 3 | version = "0.1.0" | 3 | version = "0.1.0" |
| 4 | edition = "2024" | 4 | edition = "2024" |
| 5 | license = "Unlicense" | 5 | license = "Unlicense" |
modified
README.md +14 -11 | @@ -1,4 +1,7 @@ | ||
| 1 | -# time-time | |
| 1 | +# Ex Ego | |
| 2 | + | |
| 3 | +**Ex Ego** — à l'oreille *ex aequo* (l'objectif : à égalité), à la lettre | |
| 4 | +*ex-ego* (le moyen : on dépose l'ego et on mesure de bonne foi). | |
| 2 | 5 | |
| 3 | 6 | Application web de comptage de temps par catégorie et de tâches partagées, en |
| 4 | 7 | équipe. Mobile-first (PWA), UI trilingue (français, anglais, allemand), rendu |
| @@ -85,13 +88,13 @@ par CLI). Toutes les commandes appliquent les migrations au démarrage et | ||
| 85 | 88 | lisent la base via `POSTGRESQL_ADDON_URI` (prioritaire) ou `DATABASE_URL`. |
| 86 | 89 | |
| 87 | 90 | ```bash |
| 88 | -time-time serve # lance le serveur (défaut) | |
| 89 | -time-time keygen # génère BISCUIT_PRIVATE_KEY | |
| 90 | -time-time team add <nom> # crée une équipe | |
| 91 | -time-time user add <username> --team <équipe> # crée un compte (mdp demandé | |
| 92 | - # ou --password <mdp>) | |
| 93 | -time-time user join <username> --team <équipe> # ajoute un compte existant | |
| 94 | - # à une équipe | |
| 91 | +exego serve # lance le serveur (défaut) | |
| 92 | +exego keygen # génère BISCUIT_PRIVATE_KEY | |
| 93 | +exego team add <nom> # crée une équipe | |
| 94 | +exego user add <username> --team <équipe> # crée un compte (mdp demandé | |
| 95 | + # ou --password <mdp>) | |
| 96 | +exego user join <username> --team <équipe> # ajoute un compte existant | |
| 97 | + # à une équipe | |
| 95 | 98 | ``` |
| 96 | 99 | |
| 97 | 100 | Variables d'environnement du serveur : |
| @@ -122,11 +125,11 @@ Prérequis : [clever-tools](https://www.clever-cloud.com/doc/clever-tools/) | ||
| 122 | 125 | |
| 123 | 126 | ```bash |
| 124 | 127 | # 1. Créer l'application Rust (dans le clone du dépôt) |
| 125 | -clever create --type rust time-time | |
| 128 | +clever create --type rust exego | |
| 126 | 129 | |
| 127 | 130 | # 2. Créer l'add-on PostgreSQL et le lier à l'application |
| 128 | -clever addon create postgresql-addon time-time-db --plan dev | |
| 129 | -clever service link-addon time-time-db | |
| 131 | +clever addon create postgresql-addon exego-db --plan dev | |
| 132 | +clever service link-addon exego-db | |
| 130 | 133 | # → l'app reçoit POSTGRESQL_ADDON_URI automatiquement |
| 131 | 134 | |
| 132 | 135 | # 3. Générer et poser la clé biscuit (à garder précieusement : |
| @@ -1,4 +1,7 @@ | |||
| 1 | -# time-time | 1 | +# Ex Ego |
| 2 | + | ||
| 3 | +**Ex Ego** — à l'oreille *ex aequo* (l'objectif : à égalité), à la lettre | ||
| 4 | +*ex-ego* (le moyen : on dépose l'ego et on mesure de bonne foi). | ||
| 2 | 5 | ||
| 3 | Application web de comptage de temps par catégorie et de tâches partagées, en | 6 | Application web de comptage de temps par catégorie et de tâches partagées, en |
| 4 | équipe. Mobile-first (PWA), UI trilingue (français, anglais, allemand), rendu | 7 | équipe. Mobile-first (PWA), UI trilingue (français, anglais, allemand), rendu |
| @@ -85,13 +88,13 @@ par CLI). Toutes les commandes appliquent les migrations au démarrage et | |||
| 85 | lisent la base via `POSTGRESQL_ADDON_URI` (prioritaire) ou `DATABASE_URL`. | 88 | lisent la base via `POSTGRESQL_ADDON_URI` (prioritaire) ou `DATABASE_URL`. |
| 86 | 89 | ||
| 87 | ```bash | 90 | ```bash |
| 88 | -time-time serve # lance le serveur (défaut) | 91 | +exego serve # lance le serveur (défaut) |
| 89 | -time-time keygen # génère BISCUIT_PRIVATE_KEY | 92 | +exego keygen # génère BISCUIT_PRIVATE_KEY |
| 90 | -time-time team add <nom> # crée une équipe | 93 | +exego team add <nom> # crée une équipe |
| 91 | -time-time user add <username> --team <équipe> # crée un compte (mdp demandé | 94 | +exego user add <username> --team <équipe> # crée un compte (mdp demandé |
| 92 | - # ou --password <mdp>) | 95 | + # ou --password <mdp>) |
| 93 | -time-time user join <username> --team <équipe> # ajoute un compte existant | 96 | +exego user join <username> --team <équipe> # ajoute un compte existant |
| 94 | - # à une équipe | 97 | + # à une équipe |
| 95 | ``` | 98 | ``` |
| 96 | 99 | ||
| 97 | Variables d'environnement du serveur : | 100 | Variables d'environnement du serveur : |
| @@ -122,11 +125,11 @@ Prérequis : [clever-tools](https://www.clever-cloud.com/doc/clever-tools/) | |||
| 122 | 125 | ||
| 123 | ```bash | 126 | ```bash |
| 124 | # 1. Créer l'application Rust (dans le clone du dépôt) | 127 | # 1. Créer l'application Rust (dans le clone du dépôt) |
| 125 | -clever create --type rust time-time | 128 | +clever create --type rust exego |
| 126 | 129 | ||
| 127 | # 2. Créer l'add-on PostgreSQL et le lier à l'application | 130 | # 2. Créer l'add-on PostgreSQL et le lier à l'application |
| 128 | -clever addon create postgresql-addon time-time-db --plan dev | 131 | +clever addon create postgresql-addon exego-db --plan dev |
| 129 | -clever service link-addon time-time-db | 132 | +clever service link-addon exego-db |
| 130 | # → l'app reçoit POSTGRESQL_ADDON_URI automatiquement | 133 | # → l'app reçoit POSTGRESQL_ADDON_URI automatiquement |
| 131 | 134 | ||
| 132 | # 3. Générer et poser la clé biscuit (à garder précieusement : | 135 | # 3. Générer et poser la clé biscuit (à garder précieusement : |
modified
a11y/audit.mjs +1 -1 | @@ -4,7 +4,7 @@ | ||
| 4 | 4 | // (exit 1) à la moindre violation axe « critical » ou « serious » ; |
| 5 | 5 | // les violations moindres sont listées en avertissement. |
| 6 | 6 | // |
| 7 | -// Prérequis : un serveur time-time qui tourne (base dev !) avec un compte | |
| 7 | +// Prérequis : un serveur exego qui tourne (base dev !) avec un compte | |
| 8 | 8 | // membre d'au moins deux équipes, dont l'équipe active a ≥ 1 catégorie et |
| 9 | 9 | // ≥ 1 temps saisi. Exemple de mise en place : |
| 10 | 10 | // |
| @@ -4,7 +4,7 @@ | |||
| 4 | // (exit 1) à la moindre violation axe « critical » ou « serious » ; | 4 | // (exit 1) à la moindre violation axe « critical » ou « serious » ; |
| 5 | // les violations moindres sont listées en avertissement. | 5 | // les violations moindres sont listées en avertissement. |
| 6 | // | 6 | // |
| 7 | -// Prérequis : un serveur time-time qui tourne (base dev !) avec un compte | 7 | +// Prérequis : un serveur exego qui tourne (base dev !) avec un compte |
| 8 | // membre d'au moins deux équipes, dont l'équipe active a ≥ 1 catégorie et | 8 | // membre d'au moins deux équipes, dont l'équipe active a ≥ 1 catégorie et |
| 9 | // ≥ 1 temps saisi. Exemple de mise en place : | 9 | // ≥ 1 temps saisi. Exemple de mise en place : |
| 10 | // | 10 | // |
modified
a11y/package.json +1 -1 | @@ -1,5 +1,5 @@ | ||
| 1 | 1 | { |
| 2 | - "name": "time-time-a11y", | |
| 2 | + "name": "exego-a11y", | |
| 3 | 3 | "private": true, |
| 4 | 4 | "type": "module", |
| 5 | 5 | "scripts": { |
| @@ -1,5 +1,5 @@ | |||
| 1 | { | 1 | { |
| 2 | - "name": "time-time-a11y", | 2 | + "name": "exego-a11y", |
| 3 | "private": true, | 3 | "private": true, |
| 4 | "type": "module", | 4 | "type": "module", |
| 5 | "scripts": { | 5 | "scripts": { |
modified
assets/manifest.json +2 -2 | @@ -1,6 +1,6 @@ | ||
| 1 | 1 | { |
| 2 | - "name": "time-time", | |
| 3 | - "short_name": "time-time", | |
| 2 | + "name": "Ex Ego", | |
| 3 | + "short_name": "Ex Ego", | |
| 4 | 4 | "description": "Comptage de temps passé sur des tâches", |
| 5 | 5 | "start_url": "/", |
| 6 | 6 | "display": "standalone", |
| @@ -1,6 +1,6 @@ | |||
| 1 | { | 1 | { |
| 2 | - "name": "time-time", | 2 | + "name": "Ex Ego", |
| 3 | - "short_name": "time-time", | 3 | + "short_name": "Ex Ego", |
| 4 | "description": "Comptage de temps passé sur des tâches", | 4 | "description": "Comptage de temps passé sur des tâches", |
| 5 | "start_url": "/", | 5 | "start_url": "/", |
| 6 | "display": "standalone", | 6 | "display": "standalone", |
modified
src/cli.rs +5 -5 | @@ -25,7 +25,7 @@ async fn connect() -> Result<PgPool> { | ||
| 25 | 25 | Ok(pool) |
| 26 | 26 | } |
| 27 | 27 | |
| 28 | -/// `time-time team add <nom>` — création d'équipe côté serveur. | |
| 28 | +/// `exego team add <nom>` — création d'équipe côté serveur. | |
| 29 | 29 | pub async fn team_add(name: &str) -> Result<()> { |
| 30 | 30 | let name = name.trim(); |
| 31 | 31 | if name.is_empty() { |
| @@ -44,7 +44,7 @@ pub async fn team_add(name: &str) -> Result<()> { | ||
| 44 | 44 | } |
| 45 | 45 | } |
| 46 | 46 | |
| 47 | -/// `time-time user add <username> --team <nom>` — création de compte côté | |
| 47 | +/// `exego user add <username> --team <nom>` — création de compte côté | |
| 48 | 48 | /// serveur, toujours rattaché à une équipe (invariant : jamais sans équipe). |
| 49 | 49 | pub async fn user_add(username: &str, password_arg: Option<String>, team: &str) -> Result<()> { |
| 50 | 50 | let username = username.trim(); |
| @@ -70,7 +70,7 @@ pub async fn user_add(username: &str, password_arg: Option<String>, team: &str) | ||
| 70 | 70 | let pool = connect().await?; |
| 71 | 71 | let team_id = teams::find_by_name(&pool, team.trim()) |
| 72 | 72 | .await? |
| 73 | - .with_context(|| format!("l'équipe « {} » n'existe pas (time-time team add)", team.trim()))?; | |
| 73 | + .with_context(|| format!("l'équipe « {} » n'existe pas (exego team add)", team.trim()))?; | |
| 74 | 74 | |
| 75 | 75 | let hash = password::hash(&password)?; |
| 76 | 76 | let id = Uuid::now_v7(); |
| @@ -99,7 +99,7 @@ pub async fn user_add(username: &str, password_arg: Option<String>, team: &str) | ||
| 99 | 99 | Ok(()) |
| 100 | 100 | } |
| 101 | 101 | |
| 102 | -/// `time-time user join <username> --team <nom>` — rattache un compte | |
| 102 | +/// `exego user join <username> --team <nom>` — rattache un compte | |
| 103 | 103 | /// existant à une équipe (équivalent CLI d'une invitation acceptée). |
| 104 | 104 | pub async fn user_join(username: &str, team: &str) -> Result<()> { |
| 105 | 105 | let username = username.trim(); |
| @@ -110,7 +110,7 @@ pub async fn user_join(username: &str, team: &str) -> Result<()> { | ||
| 110 | 110 | .with_context(|| format!("l'utilisateur « {username} » n'existe pas"))?; |
| 111 | 111 | let team_id = teams::find_by_name(&pool, team) |
| 112 | 112 | .await? |
| 113 | - .with_context(|| format!("l'équipe « {team} » n'existe pas (time-time team add)"))?; | |
| 113 | + .with_context(|| format!("l'équipe « {team} » n'existe pas (exego team add)"))?; | |
| 114 | 114 | let res = sqlx::query( |
| 115 | 115 | "INSERT INTO team_members (team_id, user_id) VALUES ($1, $2) ON CONFLICT DO NOTHING", |
| 116 | 116 | ) |
| @@ -25,7 +25,7 @@ async fn connect() -> Result<PgPool> { | |||
| 25 | Ok(pool) | 25 | Ok(pool) |
| 26 | } | 26 | } |
| 27 | 27 | ||
| 28 | -/// `time-time team add <nom>` — création d'équipe côté serveur. | 28 | +/// `exego team add <nom>` — création d'équipe côté serveur. |
| 29 | pub async fn team_add(name: &str) -> Result<()> { | 29 | pub async fn team_add(name: &str) -> Result<()> { |
| 30 | let name = name.trim(); | 30 | let name = name.trim(); |
| 31 | if name.is_empty() { | 31 | if name.is_empty() { |
| @@ -44,7 +44,7 @@ pub async fn team_add(name: &str) -> Result<()> { | |||
| 44 | } | 44 | } |
| 45 | } | 45 | } |
| 46 | 46 | ||
| 47 | -/// `time-time user add <username> --team <nom>` — création de compte côté | 47 | +/// `exego user add <username> --team <nom>` — création de compte côté |
| 48 | /// serveur, toujours rattaché à une équipe (invariant : jamais sans équipe). | 48 | /// serveur, toujours rattaché à une équipe (invariant : jamais sans équipe). |
| 49 | pub async fn user_add(username: &str, password_arg: Option<String>, team: &str) -> Result<()> { | 49 | pub async fn user_add(username: &str, password_arg: Option<String>, team: &str) -> Result<()> { |
| 50 | let username = username.trim(); | 50 | let username = username.trim(); |
| @@ -70,7 +70,7 @@ pub async fn user_add(username: &str, password_arg: Option<String>, team: &str) | |||
| 70 | let pool = connect().await?; | 70 | let pool = connect().await?; |
| 71 | let team_id = teams::find_by_name(&pool, team.trim()) | 71 | let team_id = teams::find_by_name(&pool, team.trim()) |
| 72 | .await? | 72 | .await? |
| 73 | - .with_context(|| format!("l'équipe « {} » n'existe pas (time-time team add)", team.trim()))?; | 73 | + .with_context(|| format!("l'équipe « {} » n'existe pas (exego team add)", team.trim()))?; |
| 74 | 74 | ||
| 75 | let hash = password::hash(&password)?; | 75 | let hash = password::hash(&password)?; |
| 76 | let id = Uuid::now_v7(); | 76 | let id = Uuid::now_v7(); |
| @@ -99,7 +99,7 @@ pub async fn user_add(username: &str, password_arg: Option<String>, team: &str) | |||
| 99 | Ok(()) | 99 | Ok(()) |
| 100 | } | 100 | } |
| 101 | 101 | ||
| 102 | -/// `time-time user join <username> --team <nom>` — rattache un compte | 102 | +/// `exego user join <username> --team <nom>` — rattache un compte |
| 103 | /// existant à une équipe (équivalent CLI d'une invitation acceptée). | 103 | /// existant à une équipe (équivalent CLI d'une invitation acceptée). |
| 104 | pub async fn user_join(username: &str, team: &str) -> Result<()> { | 104 | pub async fn user_join(username: &str, team: &str) -> Result<()> { |
| 105 | let username = username.trim(); | 105 | let username = username.trim(); |
| @@ -110,7 +110,7 @@ pub async fn user_join(username: &str, team: &str) -> Result<()> { | |||
| 110 | .with_context(|| format!("l'utilisateur « {username} » n'existe pas"))?; | 110 | .with_context(|| format!("l'utilisateur « {username} » n'existe pas"))?; |
| 111 | let team_id = teams::find_by_name(&pool, team) | 111 | let team_id = teams::find_by_name(&pool, team) |
| 112 | .await? | 112 | .await? |
| 113 | - .with_context(|| format!("l'équipe « {team} » n'existe pas (time-time team add)"))?; | 113 | + .with_context(|| format!("l'équipe « {team} » n'existe pas (exego team add)"))?; |
| 114 | let res = sqlx::query( | 114 | let res = sqlx::query( |
| 115 | "INSERT INTO team_members (team_id, user_id) VALUES ($1, $2) ON CONFLICT DO NOTHING", | 115 | "INSERT INTO team_members (team_id, user_id) VALUES ($1, $2) ON CONFLICT DO NOTHING", |
| 116 | ) | 116 | ) |
modified
src/config.rs +1 -1 | @@ -36,7 +36,7 @@ pub fn default_lang() -> crate::i18n::Lang { | ||
| 36 | 36 | |
| 37 | 37 | pub fn biscuit_private_key_hex() -> Result<String> { |
| 38 | 38 | std::env::var("BISCUIT_PRIVATE_KEY") |
| 39 | - .context("BISCUIT_PRIVATE_KEY doit être définie (générer avec `time-time keygen`)") | |
| 39 | + .context("BISCUIT_PRIVATE_KEY doit être définie (générer avec `exego keygen`)") | |
| 40 | 40 | } |
| 41 | 41 | |
| 42 | 42 | #[cfg(test)] |
| @@ -36,7 +36,7 @@ pub fn default_lang() -> crate::i18n::Lang { | |||
| 36 | 36 | ||
| 37 | pub fn biscuit_private_key_hex() -> Result<String> { | 37 | pub fn biscuit_private_key_hex() -> Result<String> { |
| 38 | std::env::var("BISCUIT_PRIVATE_KEY") | 38 | std::env::var("BISCUIT_PRIVATE_KEY") |
| 39 | - .context("BISCUIT_PRIVATE_KEY doit être définie (générer avec `time-time keygen`)") | 39 | + .context("BISCUIT_PRIVATE_KEY doit être définie (générer avec `exego keygen`)") |
| 40 | } | 40 | } |
| 41 | 41 | ||
| 42 | #[cfg(test)] | 42 | #[cfg(test)] |
modified
src/main.rs +2 -2 | @@ -19,7 +19,7 @@ use sqlx::postgres::PgPoolOptions; | ||
| 19 | 19 | use crate::state::AppState; |
| 20 | 20 | |
| 21 | 21 | #[derive(Parser)] |
| 22 | -#[command(name = "time-time", about = "Comptage de temps passé sur des catégories")] | |
| 22 | +#[command(name = "exego", about = "Ex Ego — comptage de temps partagé par catégories")] | |
| 23 | 23 | struct Cli { |
| 24 | 24 | #[command(subcommand)] |
| 25 | 25 | command: Option<Command>, |
| @@ -50,7 +50,7 @@ enum UserCommand { | ||
| 50 | 50 | username: String, |
| 51 | 51 | #[arg(long)] |
| 52 | 52 | password: Option<String>, |
| 53 | - /// Équipe d'accueil (doit exister — `time-time team add`) | |
| 53 | + /// Équipe d'accueil (doit exister — `exego team add`) | |
| 54 | 54 | #[arg(long)] |
| 55 | 55 | team: String, |
| 56 | 56 | }, |
| @@ -19,7 +19,7 @@ use sqlx::postgres::PgPoolOptions; | |||
| 19 | use crate::state::AppState; | 19 | use crate::state::AppState; |
| 20 | 20 | ||
| 21 | #[derive(Parser)] | 21 | #[derive(Parser)] |
| 22 | -#[command(name = "time-time", about = "Comptage de temps passé sur des catégories")] | 22 | +#[command(name = "exego", about = "Ex Ego — comptage de temps partagé par catégories")] |
| 23 | struct Cli { | 23 | struct Cli { |
| 24 | #[command(subcommand)] | 24 | #[command(subcommand)] |
| 25 | command: Option<Command>, | 25 | command: Option<Command>, |
| @@ -50,7 +50,7 @@ enum UserCommand { | |||
| 50 | username: String, | 50 | username: String, |
| 51 | #[arg(long)] | 51 | #[arg(long)] |
| 52 | password: Option<String>, | 52 | password: Option<String>, |
| 53 | - /// Équipe d'accueil (doit exister — `time-time team add`) | 53 | + /// Équipe d'accueil (doit exister — `exego team add`) |
| 54 | #[arg(long)] | 54 | #[arg(long)] |
| 55 | team: String, | 55 | team: String, |
| 56 | }, | 56 | }, |
modified
templates/app.html +1 -1 | @@ -1,5 +1,5 @@ | ||
| 1 | 1 | {% extends "base.html" %} |
| 2 | -{% block title %}{{ shell.title }} · time-time{% endblock %} | |
| 2 | +{% block title %}{{ shell.title }} · Ex Ego{% endblock %} | |
| 3 | 3 | {% block lang %}{{ shell.lang_code }}{% endblock %} |
| 4 | 4 | {% block body %} |
| 5 | 5 | <header class="app-header"> |
| @@ -1,5 +1,5 @@ | |||
| 1 | {% extends "base.html" %} | 1 | {% extends "base.html" %} |
| 2 | -{% block title %}{{ shell.title }} · time-time{% endblock %} | 2 | +{% block title %}{{ shell.title }} · Ex Ego{% endblock %} |
| 3 | {% block lang %}{{ shell.lang_code }}{% endblock %} | 3 | {% block lang %}{{ shell.lang_code }}{% endblock %} |
| 4 | {% block body %} | 4 | {% block body %} |
| 5 | <header class="app-header"> | 5 | <header class="app-header"> |
modified
templates/base.html +2 -2 | @@ -4,13 +4,13 @@ | ||
| 4 | 4 | <meta charset="utf-8"> |
| 5 | 5 | <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> |
| 6 | 6 | <meta name="theme-color" content="#f5ead8"> |
| 7 | -<meta name="apple-mobile-web-app-title" content="time-time"> | |
| 7 | +<meta name="apple-mobile-web-app-title" content="Ex Ego"> | |
| 8 | 8 | <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"> |
| 9 | 9 | <link rel="manifest" href="{{ crate::routes::statics::manifest_href() }}"> |
| 10 | 10 | <link rel="icon" href="{{ crate::routes::statics::icon_href() }}"> |
| 11 | 11 | <link rel="apple-touch-icon" href="{{ crate::routes::statics::icon_href() }}"> |
| 12 | 12 | <link rel="stylesheet" href="{{ crate::routes::statics::css_href() }}"> |
| 13 | -<title>{% block title %}time-time{% endblock %}</title> | |
| 13 | +<title>{% block title %}Ex Ego{% endblock %}</title> | |
| 14 | 14 | </head> |
| 15 | 15 | <body> |
| 16 | 16 | <div class="viewport"> |
| @@ -4,13 +4,13 @@ | |||
| 4 | <meta charset="utf-8"> | 4 | <meta charset="utf-8"> |
| 5 | <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> | 5 | <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> |
| 6 | <meta name="theme-color" content="#f5ead8"> | 6 | <meta name="theme-color" content="#f5ead8"> |
| 7 | -<meta name="apple-mobile-web-app-title" content="time-time"> | 7 | +<meta name="apple-mobile-web-app-title" content="Ex Ego"> |
| 8 | <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"> | 8 | <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"> |
| 9 | <link rel="manifest" href="{{ crate::routes::statics::manifest_href() }}"> | 9 | <link rel="manifest" href="{{ crate::routes::statics::manifest_href() }}"> |
| 10 | <link rel="icon" href="{{ crate::routes::statics::icon_href() }}"> | 10 | <link rel="icon" href="{{ crate::routes::statics::icon_href() }}"> |
| 11 | <link rel="apple-touch-icon" href="{{ crate::routes::statics::icon_href() }}"> | 11 | <link rel="apple-touch-icon" href="{{ crate::routes::statics::icon_href() }}"> |
| 12 | <link rel="stylesheet" href="{{ crate::routes::statics::css_href() }}"> | 12 | <link rel="stylesheet" href="{{ crate::routes::statics::css_href() }}"> |
| 13 | -<title>{% block title %}time-time{% endblock %}</title> | 13 | +<title>{% block title %}Ex Ego{% endblock %}</title> |
| 14 | </head> | 14 | </head> |
| 15 | <body> | 15 | <body> |
| 16 | <div class="viewport"> | 16 | <div class="viewport"> |
modified
templates/login.html +2 -2 | @@ -1,12 +1,12 @@ | ||
| 1 | 1 | {% extends "base.html" %} |
| 2 | -{% block title %}{{ tr.login_title }} · time-time{% endblock %} | |
| 2 | +{% block title %}{{ tr.login_title }} · Ex Ego{% endblock %} | |
| 3 | 3 | {% block lang %}{{ lang_code }}{% endblock %} |
| 4 | 4 | {% block body %} |
| 5 | 5 | <main class="login"> |
| 6 | 6 | <div class="login-icon"> |
| 7 | 7 | <svg width="34" height="34" viewBox="0 0 24 24" fill="none" stroke="#f5ead8" stroke-width="2.75" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="9"></circle><path d="M12 7v5l3 2"></path></svg> |
| 8 | 8 | </div> |
| 9 | - <h1>time-time</h1> | |
| 9 | + <h1>Ex Ego</h1> | |
| 10 | 10 | <p class="tagline">{{ tr.tagline }}</p> |
| 11 | 11 | <form method="post" action="/login"> |
| 12 | 12 | <div class="field" style="margin-bottom:var(--space-3)"> |
| @@ -1,12 +1,12 @@ | |||
| 1 | {% extends "base.html" %} | 1 | {% extends "base.html" %} |
| 2 | -{% block title %}{{ tr.login_title }} · time-time{% endblock %} | 2 | +{% block title %}{{ tr.login_title }} · Ex Ego{% endblock %} |
| 3 | {% block lang %}{{ lang_code }}{% endblock %} | 3 | {% block lang %}{{ lang_code }}{% endblock %} |
| 4 | {% block body %} | 4 | {% block body %} |
| 5 | <main class="login"> | 5 | <main class="login"> |
| 6 | <div class="login-icon"> | 6 | <div class="login-icon"> |
| 7 | <svg width="34" height="34" viewBox="0 0 24 24" fill="none" stroke="#f5ead8" stroke-width="2.75" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="9"></circle><path d="M12 7v5l3 2"></path></svg> | 7 | <svg width="34" height="34" viewBox="0 0 24 24" fill="none" stroke="#f5ead8" stroke-width="2.75" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="9"></circle><path d="M12 7v5l3 2"></path></svg> |
| 8 | </div> | 8 | </div> |
| 9 | - <h1>time-time</h1> | 9 | + <h1>Ex Ego</h1> |
| 10 | <p class="tagline">{{ tr.tagline }}</p> | 10 | <p class="tagline">{{ tr.tagline }}</p> |
| 11 | <form method="post" action="/login"> | 11 | <form method="post" action="/login"> |
| 12 | <div class="field" style="margin-bottom:var(--space-3)"> | 12 | <div class="field" style="margin-bottom:var(--space-3)"> |