0.5.1-pre.004

This commit is contained in:
2026-08-09 22:52:37 +02:00
parent 6151bb25e7
commit ec07ddbd80
53 changed files with 989 additions and 886 deletions

View File

@@ -1,8 +1,14 @@
<!-- file: ks-config/CHANGELOG.md -->
<!-- version: 13 -->
<!-- version: 14 -->
# CHANGELOG — ks-config
## `0.5.1-pre.004`
- migre le sélecteur d'environnement vers `KS_ENV_FILE` et les placeholders PostgreSQL/Helius vers `KS_SECRET_*` ;
- aligne `.env.example`, `config/example.config.json`, les tests et la documentation sur le namespace Khadhroony Solana ;
- ne met pas encore en œuvre le camouflage ou la propagation de sensibilité, réservés à la frontière runtime/public après le split config/logging.
## `0.5.1-pre.003`
- aligne `config/example.config.json` sur les identités hiérarchiques `ks-lib-*` afin que les routes de logging de référence suivent les producteurs renommés ;

View File

@@ -1,5 +1,5 @@
<!-- file: ks-config/README.md -->
<!-- version: 6 -->
<!-- version: 7 -->
# ks-config
@@ -10,8 +10,8 @@
- exposer `AppConfig` et les sections de configuration publiques ;
- valider le JSON contre le schéma embarqué ;
- appliquer les invariants métier après désérialisation ;
- charger `.env` et `.env.local` depuis la racine du workspace ;
- résoudre les placeholders `${NAME}` et `${NAME:-fallback}` ;
- charger `.env`, ou le fichier explicitement sélectionné par `KS_ENV_FILE`, depuis la racine du workspace ;
- résoudre les placeholders namespacés `${KS_*}` / `${KB_*}` et leurs fallbacks ;
- sélectionner le profil actif ;
- exporter les types nécessaires au frontend avec `ts-rs`.
@@ -31,7 +31,7 @@ Les principales fonctions sont `read_config_json_file_with_environment`, `parse_
## Statut
La configuration actuelle est fonctionnelle et validée, mais son format `0.4.8` reste monolithique. Le cadrage `0.5.0-pre.002` confirme que `0.5.1` séparera la configuration générale et le logging en documents et schémas distincts, introduira le namespace denvironnement `KS_*` et séparera les représentations source, runtime et publiques afin quaucun secret résolu ne soit exposé.
La configuration actuelle est fonctionnelle et validée, mais son format `0.4.8` reste monolithique. Le cadrage `0.5.0-pre.002` confirme que `0.5.1` séparera la configuration générale et le logging en documents et schémas distincts, applique les namespaces denvironnement `KS_*` / `KB_*` par ownership et séparera les représentations source, runtime et publiques afin quaucun secret résolu ne soit exposé.
## Documents

View File

@@ -1,5 +1,5 @@
<!-- file: ks-config/TODO.md -->
<!-- version: 5 -->
<!-- version: 6 -->
# TODO — ks-config
@@ -8,12 +8,10 @@
- [ ] `0.5.1` - séparer la configuration générale et le logging en documents et schémas JSON distincts.
- [ ] `0.5.1` - rendre la sélection du profil logging indépendante du profil généraliste.
- [ ] `0.5.1` - définir un propriétaire unique du contrat source logging et supprimer la conversion manuelle du desktop.
- [ ] `0.5.1` - migrer toutes les variables denvironnement propres au projet vers le namespace `KS_*`.
- [ ] `0.5.1` - appliquer les classes `KS_SECRET_*`, `KS_PUBLIC_*` et `KS_*` interne avec propagation de sensibilité aux valeurs composées.
- [ ] `0.5.1` - appliquer à lexécution les classes `KS_SECRET_*` / `KB_SECRET_*`, `KS_PUBLIC_*` / `KB_PUBLIC_*` et internes, avec propagation de sensibilité aux valeurs composées.
- [ ] `0.5.1` - séparer les représentations source, runtime résolue, publique et diagnostic.
- [ ] `0.5.1` - interdire quun secret résolu soit sérialisé, loggé, inclus dans une erreur ou transmis via Tauri.
- [ ] `0.5.1` - supprimer lexposition frontend de `AppConfig` et `ProfileConfig` résolus complets.
- [ ] Migration - fournir une table exhaustive des anciens noms denvironnement vers `KS_*` et une stratégie explicite pour le format `0.4.8`.
- [ ] Contrat - maintenir lidentité entre chaque schéma embarqué et son fichier sous `config/`.
- [ ] Tests - ajouter les tests dAPI externe, de migration multi-fichiers et les canaris de non-divulgation.
- [ ] Documentation - mettre à jour guides, exemples et `.env.example` seulement avec limplémentation correspondante.

View File

@@ -1,5 +1,5 @@
<!-- file: ks-config/USAGE.md -->
<!-- version: 5 -->
<!-- version: 6 -->
# Utilisation de ks-config
@@ -30,17 +30,17 @@ let report = match ks_config::load_workspace_environment(std::path::Path::new(".
Err(error) => return Err(error),
};
for path in report.loaded_files {
if let Some(path) = report.loaded_path {
println!("environment file: {}", path.display());
}
```
`EnvironmentLoadReport` indique les fichiers chargés. Les placeholders non résolus sans fallback restent visibles afin que la validation ou le consommateur puisse les signaler explicitement. Le format `0.4.8` accepte encore les anciens noms denvironnement ; la migration `0.5.1` imposera le namespace `KS_*`.
`EnvironmentLoadReport` indique le fichier chargé, sil existe. Par défaut, `ks-config` sélectionne `.env`; `KS_ENV_FILE` permet de choisir explicitement un autre fichier sans écraser les variables déjà présentes dans le processus. Les placeholders non résolus sans fallback restent visibles afin que la validation ou le consommateur puisse les signaler explicitement. Les contrats denvironnement du workspace utilisent désormais `KS_*` pour Khadhroony Solana et `KB_*` pour les futurs besoins réellement propres au Bot.
## Résolution explicite des placeholders
```rust
let raw = r#"{"databaseUrl":"${KB_DATABASE_URL:-postgres://localhost/kb}"}"#;
let raw = r#"{"databaseUrl":"${KS_SECRET_POSTGRES_DEVNET_URL:-postgres://localhost/kb}"}"#;
let resolved = ks_config::resolve_environment_placeholders(raw);
assert!(resolved.contains("databaseUrl"));

View File

@@ -1,5 +1,5 @@
// file: ks-config/src/environment.rs
// version: 4
// version: 5
//! Environment-file loading and configuration placeholder resolution.
@@ -17,7 +17,7 @@ pub struct EnvironmentLoadReport {
pub fn load_workspace_environment(
workspace_root: &std::path::Path,
) -> ks_core::Result<EnvironmentLoadReport> {
let explicit_path = std::env::var("KB_ENV_FILE").ok();
let explicit_path = std::env::var("KS_ENV_FILE").ok();
let selected_path = match explicit_path {
std::option::Option::Some(path) if !path.trim().is_empty() => {
let candidate = std::path::PathBuf::from(path);
@@ -82,14 +82,14 @@ mod tests {
#[test]
fn fallback_is_used_when_variable_is_absent() {
let resolved =
super::resolve_environment_placeholders("${KB_CONFIG_TEST_MISSING:-fallback}");
super::resolve_environment_placeholders("${KS_CONFIG_TEST_MISSING:-fallback}");
assert_eq!(resolved, "fallback");
}
#[test]
fn unresolved_required_placeholder_is_preserved() {
let resolved =
super::resolve_environment_placeholders("prefix-${KB_CONFIG_TEST_MISSING}-suffix");
assert_eq!(resolved, "prefix-${KB_CONFIG_TEST_MISSING}-suffix");
super::resolve_environment_placeholders("prefix-${KS_CONFIG_TEST_MISSING}-suffix");
assert_eq!(resolved, "prefix-${KS_CONFIG_TEST_MISSING}-suffix");
}
}

View File

@@ -1,5 +1,5 @@
// file: ks-config/src/settings.rs
// version: 18
// version: 19
//! Typed configuration models shared by applications and workers.
@@ -1453,15 +1453,15 @@ mod tests {
let value = parse_example_value();
assert_eq!(
value["profiles"][0]["database"]["postgres"]["url"],
serde_json::Value::String("${KB_POSTGRES_DEVNET_URL}".to_string())
serde_json::Value::String("${KS_SECRET_POSTGRES_DEVNET_URL}".to_string())
);
assert_eq!(
value["profiles"][1]["database"]["postgres"]["url"],
serde_json::Value::String("${KB_POSTGRES_MAINNET_URL}".to_string())
serde_json::Value::String("${KS_SECRET_POSTGRES_MAINNET_URL}".to_string())
);
assert_eq!(
value["profiles"][2]["database"]["postgres"]["url"],
serde_json::Value::String("${KB_POSTGRES_MAINNET_URL}".to_string())
serde_json::Value::String("${KS_SECRET_POSTGRES_MAINNET_URL}".to_string())
);
}
@@ -1487,7 +1487,7 @@ mod tests {
fn schema_rejects_unknown_endpoint_secret_field() {
let mut value = parse_example_value();
value["profiles"][0]["solana"]["http_endpoints"][0]["secret_env_field"] =
serde_json::Value::String("HELIUS_API_KEY".to_string());
serde_json::Value::String("KS_SECRET_HELIUS_API_KEY".to_string());
let raw_json = value_to_json(&value);
let result = super::validate_config_json_schema(&raw_json);
assert!(result.is_err());