0.5.1-pre.007

This commit is contained in:
2026-08-10 09:28:57 +02:00
parent 34a670eaec
commit a2820062eb
81 changed files with 3357 additions and 2381 deletions

View File

@@ -1,5 +1,5 @@
// file: ks-pipeline-demo-scenarios/src/environment.rs
// version: 6
// version: 7
//! Environment initialization for opt-in demonstration scenarios.
@@ -10,6 +10,36 @@ pub fn initialize_demo_scenario_environment(
return ks_config::load_workspace_environment(workspace_root);
}
/// Loads the shared default Solana configuration or one explicit scenario composition override.
///
/// Shared documents are the canonical default when `KS_DEVNET_CONFIG_PATH` is absent.
/// An explicit path may select a dedicated composition without making one mandatory for scenarios.
pub fn load_demo_scenario_config(
workspace_root: &std::path::Path,
) -> ks_core::Result<ks_config::AppConfig> {
match initialize_demo_scenario_environment(workspace_root) {
std::result::Result::Ok(_) => (),
std::result::Result::Err(error) => return std::result::Result::Err(error),
}
let configured_path = std::env::var("KS_DEVNET_CONFIG_PATH")
.ok()
.map(|value| return value.trim().to_string())
.filter(|value| return !value.is_empty());
if let std::option::Option::Some(value) = configured_path {
let path = std::path::PathBuf::from(value);
let resolved_path = if path.is_absolute() { path } else { workspace_root.join(path) };
let composed = match ks_config::read_composed_app_config_with_environment(
resolved_path.as_path(),
workspace_root,
) {
std::result::Result::Ok(value) => value,
std::result::Result::Err(error) => return std::result::Result::Err(error),
};
return std::result::Result::Ok(composed.app_config);
}
return ks_config::read_default_shared_app_config_with_environment(workspace_root);
}
/// Resolves one compatible Devnet profile for demo scenarios.
///
/// An explicit name has priority, followed by `KS_DEVNET_PROFILE`, then the

View File

@@ -1,5 +1,5 @@
// file: ks-pipeline-demo-scenarios/src/lib.rs
// version: 28
// version: 29
#![forbid(unsafe_code)]
#![deny(unreachable_pub)]
@@ -17,6 +17,8 @@ mod spl;
pub use self::environment::DevnetProfileStoreReadiness;
/// Loads the workspace environment for opt-in demo and Devnet scenarios.
pub use self::environment::initialize_demo_scenario_environment;
/// Loads the shared default configuration or an explicit scenario composition override.
pub use self::environment::load_demo_scenario_config;
/// Verifies or initializes the PostgreSQL schema selected by one Devnet profile.
pub use self::environment::prepare_demo_devnet_profile_store;
/// Resolves one configured Devnet profile for UI, CLI and test scenarios.

View File

@@ -1,5 +1,5 @@
// file: ks-pipeline-demo-scenarios/src/metadata/metaplex_token_metadata/collection_verify_campaign.rs
// version: 5
// version: 6
//! Confirmed Devnet collection parent/member `Verify -> Unverify` campaign.
@@ -643,21 +643,8 @@ mod tests {
std::option::Option::Some(value) => value,
std::option::Option::None => panic!("workspace root cannot be resolved"),
};
let config_path = match std::env::var("KS_DEVNET_CONFIG_PATH") {
std::result::Result::Ok(value) => {
let path = std::path::PathBuf::from(value);
if path.is_absolute() { path } else { workspace_root.join(path) }
},
std::result::Result::Err(_) => {
workspace_root.join("config/ks-pipeline-demo-scenarios.default.config.json")
},
};
let composed = ks_config::read_composed_app_config_with_environment(
config_path.as_path(),
workspace_root,
)
.unwrap_or_else(|error| panic!("Devnet configuration loading failed: {error}"));
let config = composed.app_config;
let config = crate::load_demo_scenario_config(workspace_root)
.unwrap_or_else(|error| panic!("Devnet configuration loading failed: {error}"));
let profile_name = std::env::var("KS_DEVNET_PROFILE").ok();
let mut profile = crate::resolve_demo_devnet_profile(&config, profile_name.as_deref())
.unwrap_or_else(|error| panic!("Devnet profile resolution failed: {error}"));

View File

@@ -1,5 +1,5 @@
// file: ks-pipeline-demo-scenarios/src/metadata/metaplex_token_metadata/create_mint_campaign.rs
// version: 13
// version: 14
//! Confirmed Devnet `Create -> Mint` campaign for one Metaplex asset family.
@@ -59,7 +59,7 @@ where
+ Sync,
O: crate::SolanaExecutionObserver,
{
if !profile.wallet.devnet_send_enabled {
if !profile.execution.devnet_send_enabled {
return std::result::Result::Err(ks_core::Error::config(
"Metaplex Create -> Mint Devnet campaign requires devnet_send_enabled=true",
));
@@ -808,21 +808,8 @@ mod tests {
std::option::Option::Some(value) => value,
std::option::Option::None => panic!("workspace root cannot be resolved"),
};
let config_path = match std::env::var("KS_DEVNET_CONFIG_PATH") {
std::result::Result::Ok(value) => {
let path = std::path::PathBuf::from(value);
if path.is_absolute() { path } else { workspace_root.join(path) }
},
std::result::Result::Err(_) => {
workspace_root.join("config/ks-pipeline-demo-scenarios.default.config.json")
},
};
let composed = ks_config::read_composed_app_config_with_environment(
config_path.as_path(),
workspace_root,
)
.unwrap_or_else(|error| panic!("Devnet configuration loading failed: {error}"));
let config = composed.app_config;
let config = crate::load_demo_scenario_config(workspace_root)
.unwrap_or_else(|error| panic!("Devnet configuration loading failed: {error}"));
let profile_name = std::env::var("KS_DEVNET_PROFILE").ok();
let mut profile = crate::resolve_demo_devnet_profile(&config, profile_name.as_deref())
.unwrap_or_else(|error| panic!("Devnet profile resolution failed: {error}"));

View File

@@ -1,5 +1,5 @@
// file: ks-pipeline-demo-scenarios/src/metadata/metaplex_token_metadata/devnet_execution.rs
// version: 21
// version: 22
//! Real Devnet simulation and submission for current Metaplex Token Metadata operations.
@@ -1185,7 +1185,7 @@ fn validate_profile(
"Metaplex Devnet orchestration requires simulation",
));
}
if request.submit && !profile.wallet.devnet_send_enabled {
if request.submit && !profile.execution.devnet_send_enabled {
return std::result::Result::Err(ks_core::Error::config(
"Devnet transaction submission is disabled by the wallet profile",
));

View File

@@ -1,5 +1,5 @@
// file: ks-pipeline-demo-scenarios/src/metadata/metaplex_token_metadata/escrow_campaign.rs
// version: 5
// version: 6
//! Confirmed Devnet Token Owned Escrow campaign for current Metaplex escrow operations.
@@ -71,7 +71,7 @@ where
+ Sync,
O: crate::SolanaExecutionObserver,
{
if !profile.wallet.devnet_send_enabled {
if !profile.execution.devnet_send_enabled {
return std::result::Result::Err(ks_core::Error::config(
"Metaplex escrow Devnet campaign requires devnet_send_enabled=true",
));
@@ -968,21 +968,8 @@ mod tests {
std::option::Option::Some(value) => value,
std::option::Option::None => panic!("workspace root cannot be resolved"),
};
let config_path = match std::env::var("KS_DEVNET_CONFIG_PATH") {
std::result::Result::Ok(value) => {
let path = std::path::PathBuf::from(value);
if path.is_absolute() { path } else { workspace_root.join(path) }
},
std::result::Result::Err(_) => {
workspace_root.join("config/ks-pipeline-demo-scenarios.default.config.json")
},
};
let composed = ks_config::read_composed_app_config_with_environment(
config_path.as_path(),
workspace_root,
)
.unwrap_or_else(|error| panic!("Devnet configuration loading failed: {error}"));
let config = composed.app_config;
let config = crate::load_demo_scenario_config(workspace_root)
.unwrap_or_else(|error| panic!("Devnet configuration loading failed: {error}"));
let profile_name = std::env::var("KS_DEVNET_PROFILE").ok();
let mut profile = crate::resolve_demo_devnet_profile(&config, profile_name.as_deref())
.unwrap_or_else(|error| panic!("Devnet profile resolution failed: {error}"));

View File

@@ -1,5 +1,5 @@
// file: ks-pipeline-demo-scenarios/src/metadata/metaplex_token_metadata/fixture.rs
// version: 20
// version: 21
//! Native Metaplex Token Metadata fixture preparation for Devnet demos.
@@ -120,7 +120,7 @@ pub async fn prepare_metaplex_create_fixture(
"Metaplex fixture endpoint roles must not be empty",
));
}
if !profile.wallet.devnet_send_enabled {
if !profile.execution.devnet_send_enabled {
return std::result::Result::Err(ks_core::Error::config(
"Metaplex fixture preparation requires devnet_send_enabled=true",
));

View File

@@ -1,5 +1,5 @@
// file: ks-pipeline-demo-scenarios/src/metadata/metaplex_token_metadata/maintenance_campaign.rs
// version: 7
// version: 8
//! Final bounded Devnet qualification campaign for current Metaplex maintenance operations.
@@ -572,21 +572,8 @@ mod tests {
std::option::Option::Some(value) => value,
std::option::Option::None => panic!("workspace root cannot be resolved"),
};
let config_path = match std::env::var("KS_DEVNET_CONFIG_PATH") {
std::result::Result::Ok(value) => {
let path = std::path::PathBuf::from(value);
if path.is_absolute() { path } else { workspace_root.join(path) }
},
std::result::Result::Err(_) => {
workspace_root.join("config/ks-pipeline-demo-scenarios.default.config.json")
},
};
let composed = ks_config::read_composed_app_config_with_environment(
config_path.as_path(),
workspace_root,
)
.unwrap_or_else(|error| panic!("Devnet configuration loading failed: {error}"));
let config = composed.app_config;
let config = crate::load_demo_scenario_config(workspace_root)
.unwrap_or_else(|error| panic!("Devnet configuration loading failed: {error}"));
let profile_name = std::env::var("KS_DEVNET_PROFILE").ok();
let mut profile = crate::resolve_demo_devnet_profile(&config, profile_name.as_deref())
.unwrap_or_else(|error| panic!("Devnet profile resolution failed: {error}"));

View File

@@ -1,5 +1,5 @@
// file: ks-pipeline-demo-scenarios/src/metadata/metaplex_token_metadata/pnft_lifecycle_campaign.rs
// version: 7
// version: 8
//! Confirmed Devnet pNFT delegate, lock, unlock, revoke and transfer campaign.
@@ -1066,21 +1066,8 @@ mod tests {
std::option::Option::Some(value) => value,
std::option::Option::None => panic!("workspace root cannot be resolved"),
};
let config_path = match std::env::var("KS_DEVNET_CONFIG_PATH") {
std::result::Result::Ok(value) => {
let path = std::path::PathBuf::from(value);
if path.is_absolute() { path } else { workspace_root.join(path) }
},
std::result::Result::Err(_) => {
workspace_root.join("config/ks-pipeline-demo-scenarios.default.config.json")
},
};
let composed = ks_config::read_composed_app_config_with_environment(
config_path.as_path(),
workspace_root,
)
.unwrap_or_else(|error| panic!("Devnet configuration loading failed: {error}"));
let config = composed.app_config;
let config = crate::load_demo_scenario_config(workspace_root)
.unwrap_or_else(|error| panic!("Devnet configuration loading failed: {error}"));
let profile_name = std::env::var("KS_DEVNET_PROFILE").ok();
let mut profile = crate::resolve_demo_devnet_profile(&config, profile_name.as_deref())
.unwrap_or_else(|error| panic!("Devnet profile resolution failed: {error}"));

View File

@@ -1,5 +1,5 @@
// file: ks-pipeline-demo-scenarios/src/metadata/metaplex_token_metadata/print_burn_campaign.rs
// version: 8
// version: 9
//! Devnet printable master NFT `Print -> Burn` campaign.
@@ -1175,21 +1175,8 @@ mod tests {
std::option::Option::Some(value) => value,
std::option::Option::None => panic!("workspace root cannot be resolved"),
};
let config_path = match std::env::var("KS_DEVNET_CONFIG_PATH") {
std::result::Result::Ok(value) => {
let path = std::path::PathBuf::from(value);
if path.is_absolute() { path } else { workspace_root.join(path) }
},
std::result::Result::Err(_) => {
workspace_root.join("config/ks-pipeline-demo-scenarios.default.config.json")
},
};
let composed = ks_config::read_composed_app_config_with_environment(
config_path.as_path(),
workspace_root,
)
.unwrap_or_else(|error| panic!("Devnet configuration loading failed: {error}"));
let config = composed.app_config;
let config = crate::load_demo_scenario_config(workspace_root)
.unwrap_or_else(|error| panic!("Devnet configuration loading failed: {error}"));
let profile_name = std::env::var("KS_DEVNET_PROFILE").ok();
let mut profile = crate::resolve_demo_devnet_profile(&config, profile_name.as_deref())
.unwrap_or_else(|error| panic!("Devnet profile resolution failed: {error}"));

View File

@@ -1,5 +1,5 @@
// file: ks-pipeline-demo-scenarios/src/metadata/metaplex_token_metadata/use_campaign.rs
// version: 5
// version: 6
//! Bounded Devnet availability probe for the current Metaplex `Use` surface.
@@ -420,21 +420,8 @@ mod tests {
std::option::Option::Some(value) => value,
std::option::Option::None => panic!("workspace root cannot be resolved"),
};
let config_path = match std::env::var("KS_DEVNET_CONFIG_PATH") {
std::result::Result::Ok(value) => {
let path = std::path::PathBuf::from(value);
if path.is_absolute() { path } else { workspace_root.join(path) }
},
std::result::Result::Err(_) => {
workspace_root.join("config/ks-pipeline-demo-scenarios.default.config.json")
},
};
let composed = ks_config::read_composed_app_config_with_environment(
config_path.as_path(),
workspace_root,
)
.unwrap_or_else(|error| panic!("Devnet configuration loading failed: {error}"));
let config = composed.app_config;
let config = crate::load_demo_scenario_config(workspace_root)
.unwrap_or_else(|error| panic!("Devnet configuration loading failed: {error}"));
let profile_name = std::env::var("KS_DEVNET_PROFILE").ok();
let mut profile = crate::resolve_demo_devnet_profile(&config, profile_name.as_deref())
.unwrap_or_else(|error| panic!("Devnet profile resolution failed: {error}"));

View File

@@ -1,5 +1,5 @@
// file: ks-pipeline-demo-scenarios/src/metadata/solana_program/devnet_execution.rs
// version: 3
// version: 4
//! Real Devnet simulation and controlled submission for Solana Program Metadata.
@@ -635,7 +635,7 @@ fn validate_profile(
"Solana Program Metadata orchestration requires simulation",
));
}
if request.submit && !profile.wallet.devnet_send_enabled {
if request.submit && !profile.execution.devnet_send_enabled {
return std::result::Result::Err(ks_core::Error::config(
"Devnet transaction submission is disabled by the wallet profile",
));

View File

@@ -1,5 +1,5 @@
// file: ks-pipeline-demo-scenarios/src/metadata/solana_program/fixture.rs
// version: 7
// version: 8
//! Native Solana Program Metadata fixture preparation for Devnet journeys.
@@ -118,7 +118,7 @@ pub async fn prepare_solana_program_metadata_fixture(
));
}
if profile.wallet.cluster != "devnet"
|| !profile.wallet.devnet_send_enabled
|| !profile.execution.devnet_send_enabled
|| !profile.wallet.temporary_wallet_enabled
|| !profile.wallet.temporary_wallet_persist
{

View File

@@ -1,5 +1,5 @@
// file: ks-pipeline-demo-scenarios/src/solana.rs
// version: 15
// version: 16
//! Devnet Solana execution orchestration with canonical post-validation.
@@ -967,7 +967,7 @@ fn validate_devnet_profile(
request.airdrop_lamports, profile.execution.devnet_airdrop_max_lamports
)));
}
if request.submit && !profile.wallet.devnet_send_enabled {
if request.submit && !profile.execution.devnet_send_enabled {
return std::result::Result::Err(ks_core::Error::config(
"Devnet transaction submission is disabled by the wallet profile",
));

View File

@@ -1,5 +1,5 @@
// file: ks-pipeline-demo-scenarios/src/spl/associated_token_account.rs
// version: 14
// version: 15
//! Devnet ATA execution with stateful and canonical post-validation.
@@ -686,7 +686,7 @@ fn validate_profile(
"SPL Associated Token Account Devnet orchestration requires simulation",
));
}
if request.submit && !profile.wallet.devnet_send_enabled {
if request.submit && !profile.execution.devnet_send_enabled {
return std::result::Result::Err(ks_core::Error::config(
"Devnet transaction submission is disabled by the wallet profile",
));

View File

@@ -1,5 +1,5 @@
// file: ks-pipeline-demo-scenarios/src/spl/memo.rs
// version: 10
// version: 11
//! Devnet SPL Memo v4 execution with canonical post-validation.
@@ -544,7 +544,7 @@ fn validate_profile(
"Memo Devnet orchestration requires simulation",
));
}
if request.submit && !profile.wallet.devnet_send_enabled {
if request.submit && !profile.execution.devnet_send_enabled {
return std::result::Result::Err(ks_core::Error::config(
"Devnet transaction submission is disabled by the wallet profile",
));

View File

@@ -1,5 +1,5 @@
// file: ks-pipeline-demo-scenarios/src/spl/token/execution.rs
// version: 14
// version: 15
//! Devnet classic SPL Token execution with stateful and canonical post-validation.
@@ -642,7 +642,7 @@ fn validate_profile(
"SPL Token Devnet orchestration requires simulation",
));
}
if request.submit && !profile.wallet.devnet_send_enabled {
if request.submit && !profile.execution.devnet_send_enabled {
return std::result::Result::Err(ks_core::Error::config(
"Devnet transaction submission is disabled by the wallet profile",
));

View File

@@ -1,5 +1,5 @@
// file: ks-pipeline-demo-scenarios/src/spl/token/lifecycle.rs
// version: 13
// version: 14
//! Controlled Devnet lifecycle for freshly prepared classic SPL Token accounts.
@@ -295,7 +295,7 @@ where
return std::result::Result::Err(error);
}
if profile.wallet.cluster != "devnet"
|| !profile.wallet.devnet_send_enabled
|| !profile.execution.devnet_send_enabled
|| !profile.execution.require_simulation
{
return std::result::Result::Err(ks_core::Error::config(

View File

@@ -1,5 +1,5 @@
// file: ks-pipeline-demo-scenarios/src/spl/token_2022/devnet_execution.rs
// version: 8
// version: 9
//! Devnet Token-2022 execution with stateful and canonical post-validation.
@@ -882,7 +882,7 @@ fn validate_profile(
"Token-2022 Devnet orchestration requires simulation",
));
}
if request.submit && !profile.wallet.devnet_send_enabled {
if request.submit && !profile.execution.devnet_send_enabled {
return std::result::Result::Err(ks_core::Error::config(
"Devnet transaction submission is disabled by the wallet profile",
));

View File

@@ -1,5 +1,5 @@
// file: ks-pipeline-demo-scenarios/src/spl/token_2022/metadata/campaign.rs
// version: 8
// version: 9
//! Ordered confirmed Devnet campaign for the five Token-2022 Token Metadata instructions.
@@ -497,21 +497,8 @@ mod tests {
std::option::Option::Some(value) => value,
std::option::Option::None => panic!("workspace root cannot be resolved"),
};
let config_path = match std::env::var("KS_DEVNET_CONFIG_PATH") {
std::result::Result::Ok(value) => {
let path = std::path::PathBuf::from(value);
if path.is_absolute() { path } else { workspace_root.join(path) }
},
std::result::Result::Err(_) => {
workspace_root.join("config/ks-pipeline-demo-scenarios.default.config.json")
},
};
let composed = ks_config::read_composed_app_config_with_environment(
config_path.as_path(),
workspace_root,
)
.unwrap_or_else(|error| panic!("Devnet configuration loading failed: {error}"));
let config = composed.app_config;
let config = crate::load_demo_scenario_config(workspace_root)
.unwrap_or_else(|error| panic!("Devnet configuration loading failed: {error}"));
let profile_name = std::env::var("KS_DEVNET_PROFILE").ok();
let mut profile = crate::resolve_demo_devnet_profile(&config, profile_name.as_deref())
.unwrap_or_else(|error| panic!("Devnet profile resolution failed: {error}"));

View File

@@ -1,5 +1,5 @@
// file: ks-pipeline-demo-scenarios/src/spl/token_2022/metadata/fixture.rs
// version: 4
// version: 5
//! Native Token-2022 mint preparation for the embedded Token Metadata Devnet campaign.
@@ -91,7 +91,7 @@ pub async fn prepare_token_2022_metadata_fixture(
"Token-2022 metadata fixture requires a persistent Devnet wallet profile",
));
}
if !profile.wallet.devnet_send_enabled || !options.operator_confirmed {
if !profile.execution.devnet_send_enabled || !options.operator_confirmed {
return std::result::Result::Err(ks_core::Error::config(
"Token-2022 metadata fixture requires enabled Devnet submission and explicit operator confirmation",
));