0.5.1-pre.004
This commit is contained in:
@@ -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 ;
|
||||
|
||||
@@ -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 d’environnement `KS_*` et séparera les représentations source, runtime et publiques afin qu’aucun 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 d’environnement `KS_*` / `KB_*` par ownership et séparera les représentations source, runtime et publiques afin qu’aucun secret résolu ne soit exposé.
|
||||
|
||||
## Documents
|
||||
|
||||
|
||||
@@ -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 d’environnement 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 à l’exé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 qu’un secret résolu soit sérialisé, loggé, inclus dans une erreur ou transmis via Tauri.
|
||||
- [ ] `0.5.1` - supprimer l’exposition frontend de `AppConfig` et `ProfileConfig` résolus complets.
|
||||
- [ ] Migration - fournir une table exhaustive des anciens noms d’environnement vers `KS_*` et une stratégie explicite pour le format `0.4.8`.
|
||||
- [ ] Contrat - maintenir l’identité entre chaque schéma embarqué et son fichier sous `config/`.
|
||||
- [ ] Tests - ajouter les tests d’API externe, de migration multi-fichiers et les canaris de non-divulgation.
|
||||
- [ ] Documentation - mettre à jour guides, exemples et `.env.example` seulement avec l’implémentation correspondante.
|
||||
|
||||
@@ -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 d’environnement ; la migration `0.5.1` imposera le namespace `KS_*`.
|
||||
`EnvironmentLoadReport` indique le fichier chargé, s’il 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 d’environnement 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"));
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
|
||||
Reference in New Issue
Block a user