Files
wrkflw/INDEX.md
bahdotsh 05ed4d12b4 docs: add AI agent codebase navigation guides
Add CLAUDE.md, AGENTS.md, and INDEX.md — all generated by the indxr
MCP tooling to give AI coding assistants a structured way to explore
the codebase without dumping entire files into context.

CLAUDE.md is the detailed version with token cost estimates and a
full tool reference. AGENTS.md is the condensed version. INDEX.md
is an auto-generated codebase index with file summaries and symbol
maps.

While at it, add .indxr-cache/ to .gitignore because nobody needs
that in the repo.
2026-03-28 10:35:33 +05:30

3733 lines
86 KiB
Markdown

# Codebase Index: wrkflw
> Generated: 2026-03-28 05:02:20 UTC | Files: 150 | Lines: 35146
> Languages: JSON (4), Markdown (24), Rust (72), Shell (5), TOML (16), YAML (29)
## Directory Structure
```
wrkflw/
AGENTS.md
CLAUDE.md
Cargo.toml
GITLAB_USAGE.md
README.md
VERSION_MANAGEMENT.md
cliff.toml
crates/
README.md
evaluator/
Cargo.toml
README.md
src/
lib.rs
executor/
Cargo.toml
README.md
src/
dependency.rs
docker.rs
docker_test.rs
engine.rs
environment.rs
lib.rs
podman.rs
substitution.rs
github/
Cargo.toml
README.md
src/
lib.rs
gitlab/
Cargo.toml
README.md
src/
lib.rs
logging/
Cargo.toml
README.md
src/
lib.rs
matrix/
Cargo.toml
README.md
src/
lib.rs
models/
Cargo.toml
README.md
src/
lib.rs
parser/
Cargo.toml
README.md
src/
github-workflow.json
gitlab-ci.json
gitlab.rs
lib.rs
schema.rs
workflow.rs
runtime/
Cargo.toml
README.md
README_SECURITY.md
src/
container.rs
emulation.rs
emulation_test.rs
lib.rs
sandbox.rs
secure_emulation.rs
secrets/
Cargo.toml
README.md
benches/
masking_bench.rs
src/
config.rs
error.rs
lib.rs
manager.rs
masking.rs
providers/
env.rs
file.rs
mod.rs
rate_limit.rs
storage.rs
substitution.rs
validation.rs
tests/
integration_tests.rs
ui/
Cargo.toml
README.md
src/
app/
mod.rs
state.rs
components/
button.rs
checkbox.rs
mod.rs
progress_bar.rs
handlers/
mod.rs
workflow.rs
lib.rs
log_processor.rs
models/
mod.rs
utils/
mod.rs
views/
execution_tab.rs
help_overlay.rs
job_detail.rs
logs_tab.rs
mod.rs
status_bar.rs
title_bar.rs
workflows_tab.rs
utils/
Cargo.toml
README.md
src/
lib.rs
validators/
Cargo.toml
README.md
src/
actions.rs
gitlab.rs
jobs.rs
lib.rs
matrix.rs
steps.rs
triggers.rs
wrkflw/
Cargo.toml
README.md
src/
lib.rs
main.rs
examples/
secrets-demo/
README.md
secrets-workflow.yml
publish_crates.sh
schemas/
github-workflow.json
gitlab-ci.json
scripts/
bump-crate.sh
tests/
README.md
TESTING_PODMAN.md
cleanup_test.rs
fixtures/
gitlab-ci/
advanced.gitlab-ci.yml
basic.gitlab-ci.yml
docker.gitlab-ci.yml
includes.gitlab-ci.yml
invalid.gitlab-ci.yml
minimal.gitlab-ci.yml
services.gitlab-ci.yml
workflow.gitlab-ci.yml
matrix_test.rs
reusable_workflow_execution_test.rs
reusable_workflow_test.rs
safe_workflow.yml
scripts/
test-podman-basic.sh
test-preserve-containers.sh
security_comparison.yml
security_demo.yml
workflows/
1-basic-workflow.yml
2-reusable-workflow-caller.yml
3-reusable-workflow-definition.yml
4-mixed-jobs.yml
5-no-name-reusable-caller.yml
6-invalid-reusable-format.yml
7-invalid-regular-job.yml
8-cyclic-dependencies.yml
cpp-test.yml
example.yml
matrix-example.yml
node-test.yml
python-test.yml
runs-on-array-test.yml
rust-test.yml
test.yml
trigger_gitlab.sh
working-secrets-test.yml
```
---
## Public API Surface
**AGENTS.md**
- `# Codebase Navigation — Use indxr MCP tools`
**CLAUDE.md**
- `# wrkflw`
**Cargo.toml**
- `[workspace]`
- `[workspace.package]`
- `[workspace.dependencies]`
- `[profile.release]`
**GITLAB_USAGE.md**
- `# Using wrkflw with GitLab Pipelines`
- `# Trigger using the default branch`
- `# Trigger on a specific branch`
- `# Trigger with custom variables`
**README.md**
- `# WRKFLW`
- `# Install Podman (varies by OS)`
- `# On macOS with Homebrew:`
- `# On Ubuntu/Debian:`
- `# Initialize Podman machine (macOS/Windows)`
- `# Use with wrkflw`
- `# Validate all workflow files in the default location (.github/workflows)`
- `# Validate a specific workflow file`
- `# Validate workflows in a specific directory`
- `# Validate multiple files and/or directories (GitHub and GitLab are auto-detected)`
- `# Force GitLab parsing for all provided paths`
- `# Validate with verbose output`
- `# Validate GitLab CI pipelines`
- `# Disable exit codes for custom error handling (default: enabled)`
- `# In CI/CD scripts - validation failure will cause the script to exit`
- `# For custom error handling, disable exit codes`
- `# Run a workflow with Docker (default)`
- `# Run a workflow with Podman instead of Docker`
- `# Run a workflow in emulation mode (without containers)`
- `# Run with verbose output`
- `# Preserve failed containers for debugging`
- `# Open TUI with workflows from the default directory`
- `# Open TUI with a specific directory of workflows`
- `# Open TUI with a specific workflow pre-selected`
- `# Open TUI with Podman runtime`
- `# Open TUI in emulation mode`
- `# Trigger a workflow remotely on GitHub`
- `# Trigger a pipeline remotely on GitLab`
- `# Example with validation failure`
- `# Navigate to project root and run wrkflw`
- `# This will automatically load .github/workflows files into the TUI`
- `# Preserve failed containers for debugging`
- `# Also available in TUI mode`
- `# Run workflows without root privileges`
- `# List preserved containers`
- `# Inspect a preserved container's filesystem (without executing)`
- `# Or run a new container with the same volumes`
- `# Clean up all wrkflw containers`
- `# Trigger a workflow using the default branch`
- `# Trigger a workflow on a specific branch`
- `# Trigger with input parameters`
**VERSION_MANAGEMENT.md**
- `# Version Management Guide`
- `# Internal crate dependencies`
- `# ... other crates`
- `# Internal crates`
- `# Bump all crates to the same version`
- `# Or specify exact version`
- `# Commit and tag`
- `# Bump a specific crate`
- `# The script will:`
- `# 1. Update the crate's Cargo.toml to use explicit version`
- `# 2. Update workspace dependencies`
- `# 3. Show you next steps`
- `# 1. Make your changes`
- `# 2. Bump version`
- `# 3. Commit and tag`
- `# 4. Push (this triggers GitHub Actions)`
- `# 1. Use helper script or manual method above`
- `# 2. Follow the script's suggestions`
- `# 3. Optionally publish to crates.io`
- `# Navigate to the crate`
- `# Ensure all dependencies are published first`
- `# (or available on crates.io)`
- `# Publish`
- `# Use cargo-workspaces`
- `# Solution: Check workspace dependencies match crate versions`
- `# Solution: Ensure all dependencies are published to crates.io first`
- `# Or use path dependencies only for local development`
- `# Solution: Ensure tag format matches workflow trigger`
- `# List all workspace members with versions`
- `# Check all crates`
- `# Test all crates`
- `# Show dependency tree`
- `# Show outdated dependencies`
- `# Verify publishability`
**cliff.toml**
- `[changelog]`
- `[#{{ contributor.pr_number }}]`
- `[git]`
- `[git.link]`
**crates/README.md**
- `# Wrkflw Crates`
**crates/evaluator/Cargo.toml**
- `[package]`
- `[dependencies]`
**crates/evaluator/README.md**
- `## wrkflw-evaluator`
**crates/evaluator/src/lib.rs**
- `pub fn evaluate_workflow_file(path: &Path, verbose: bool) -> Result<ValidationResult, String>`
**crates/executor/Cargo.toml**
- `[package]`
- `[dependencies]`
**crates/executor/README.md**
- `## wrkflw-executor`
**crates/executor/src/dependency.rs**
- `pub fn resolve_dependencies(workflow: &WorkflowDefinition) -> Result<Vec<Vec<String>>, String>`
**crates/executor/src/docker.rs**
- `pub struct DockerRuntime`
- `pub fn is_available() -> bool`
- `pub fn track_container(id: &str)`
- `pub fn untrack_container(id: &str)`
- `pub fn track_network(id: &str)`
- `pub fn untrack_network(id: &str)`
- `pub async fn cleanup_resources(docker: &Docker)`
- `pub async fn cleanup_containers(docker: &Docker) -> Result<(), String>`
- `pub async fn cleanup_networks(docker: &Docker) -> Result<(), String>`
- `pub async fn create_job_network(docker: &Docker) -> Result<String, ContainerError>`
- `pub fn get_tracked_containers() -> Vec<String>`
- `pub fn get_tracked_networks() -> Vec<String>`
**crates/executor/src/engine.rs**
- `pub async fn execute_workflow( workflow_path: &Path, config: ExecutionConfig, ) -> Result<ExecutionResult, ExecutionError>`
- `pub enum RuntimeType`
- `pub struct ExecutionConfig`
- `pub struct ExecutionResult`
- `pub struct JobResult`
- `pub enum JobStatus`
- `pub struct StepResult`
- `pub enum StepStatus`
- `pub enum ExecutionError`
**crates/executor/src/environment.rs**
- `pub fn setup_github_environment_files(workspace_dir: &Path) -> io::Result<()>`
- `pub fn create_github_context( workflow: &WorkflowDefinition, workspace_dir: &Path, ) -> HashMap<String, String>`
- `pub fn add_matrix_context( env: &mut HashMap<String, String>, matrix_combination: &MatrixCombination, )`
**crates/executor/src/lib.rs**
- `pub mod dependency`
- `pub mod docker`
- `pub mod engine`
- `pub mod environment`
- `pub mod podman`
- `pub mod substitution`
**crates/executor/src/podman.rs**
- `pub struct PodmanRuntime`
- `pub fn is_available() -> bool`
- `pub fn track_container(id: &str)`
- `pub fn untrack_container(id: &str)`
- `pub async fn cleanup_resources()`
- `pub async fn cleanup_containers() -> Result<(), String>`
- `pub fn get_tracked_containers() -> Vec<String>`
**crates/executor/src/substitution.rs**
- `pub fn preprocess_command(command: &str, matrix_values: &HashMap<String, Value>) -> String`
- `pub fn process_step_run(run: &str, matrix_combination: &Option<HashMap<String, Value>>) -> String`
**crates/github/Cargo.toml**
- `[package]`
- `[dependencies]`
**crates/github/README.md**
- `## wrkflw-github`
- `# tokio_test::block_on(async {`
- `# Ok::<_, Box<dyn std::error::Error>>(())`
- `# })?;`
**crates/github/src/lib.rs**
- `pub enum GithubError`
- `pub struct RepoInfo`
- `pub fn get_repo_info() -> Result<RepoInfo, GithubError>`
- `pub async fn list_workflows(_repo_info: &RepoInfo) -> Result<Vec<String>, GithubError>`
- `pub async fn trigger_workflow( workflow_name: &str, branch: Option<&str>, inputs: Option<HashMap<String, String>>, ) -> Result<(), GithubError>`
**crates/gitlab/Cargo.toml**
- `[package]`
- `[dependencies]`
**crates/gitlab/README.md**
- `## wrkflw-gitlab`
- `# tokio_test::block_on(async {`
- `# Ok::<_, Box<dyn std::error::Error>>(())`
- `# })?;`
**crates/gitlab/src/lib.rs**
- `pub enum GitlabError`
- `pub struct RepoInfo`
- `pub fn get_repo_info() -> Result<RepoInfo, GitlabError>`
- `pub async fn list_pipelines(_repo_info: &RepoInfo) -> Result<Vec<String>, GitlabError>`
- `pub async fn trigger_pipeline( branch: Option<&str>, variables: Option<HashMap<String, String>>, ) -> Result<(), GitlabError>`
**crates/logging/Cargo.toml**
- `[package]`
- `[dependencies]`
**crates/logging/README.md**
- `## wrkflw-logging`
**crates/logging/src/lib.rs**
- `pub enum LogLevel`
- `pub fn set_log_level(level: LogLevel)`
- `pub fn get_log_level() -> LogLevel`
- `pub fn log(level: LogLevel, message: &str)`
- `pub fn get_logs() -> Vec<String>`
- `pub fn clear_logs()`
- `pub fn debug(message: &str)`
- `pub fn info(message: &str)`
- `pub fn warning(message: &str)`
- `pub fn error(message: &str)`
**crates/matrix/Cargo.toml**
- `[package]`
- `[dependencies]`
**crates/matrix/README.md**
- `## wrkflw-matrix`
**crates/matrix/src/lib.rs**
- `pub struct MatrixConfig`
- `pub struct MatrixCombination`
- `pub enum MatrixError`
- `pub fn expand_matrix(matrix: &MatrixConfig) -> Result<Vec<MatrixCombination>, MatrixError>`
- `pub fn format_combination_name(job_name: &str, combination: &MatrixCombination) -> String`
**crates/models/Cargo.toml**
- `[package]`
- `[dependencies]`
**crates/models/README.md**
- `## wrkflw-models`
**crates/models/src/lib.rs**
- `pub struct ValidationResult`
- `pub mod gitlab`
**crates/parser/Cargo.toml**
- `[package]`
- `[dependencies]`
- `[dev-dependencies]`
**crates/parser/README.md**
- `## wrkflw-parser`
**crates/parser/src/github-workflow.json**
- `"$schema": "http://json-schema.org/draft-07/schema#"`
- `"$id": "https://json.schemastore.org/github-workflow.json"`
- `"$comment": "https://help.github.com/en/github/automating-your-workflow-with-github-actions/workflow-syntax-for-github-actions"`
- `"additionalProperties": false`
- `"definitions": {`
- `"properties": {`
- `"required": ["on", "jobs"]`
- `"type": "object"`
**crates/parser/src/gitlab-ci.json**
- `"$schema": "http://json-schema.org/draft-07/schema#"`
- `"$id": "https://gitlab.com/.gitlab-ci.yml"`
- `"markdownDescription": "Gitlab has a built-in solution for doing CI called Gitlab CI. It is configured by supplying a file called `.gitlab-ci.yml`, which will list all the jobs that are going to run for the project. A full list of all options can be found [here](https://docs.gitlab.com/ee/ci/yaml/). [Learn More](https://docs.gitlab.com/ee/ci/)."`
- `"type": "object"`
- `"properties": {`
- `"patternProperties": {`
- `"additionalProperties": {`
- `"definitions": {`
**crates/parser/src/gitlab.rs**
- `pub enum GitlabParserError`
- `pub fn parse_pipeline(pipeline_path: &Path) -> Result<Pipeline, GitlabParserError>`
- `pub fn validate_pipeline_structure(pipeline: &Pipeline) -> ValidationResult`
- `pub fn convert_to_workflow_format(pipeline: &Pipeline) -> workflow::WorkflowDefinition`
**crates/parser/src/lib.rs**
- `pub mod gitlab`
- `pub mod schema`
- `pub mod workflow`
**crates/parser/src/schema.rs**
- `pub enum SchemaType`
- `pub struct SchemaValidator`
**crates/parser/src/workflow.rs**
- `pub struct WorkflowDefinition`
- `pub struct Job`
- `pub struct Service`
- `pub struct Step`
- `pub struct ActionInfo`
- `pub fn parse_workflow(path: &Path) -> Result<WorkflowDefinition, String>`
**crates/runtime/Cargo.toml**
- `[package]`
- `[dependencies]`
**crates/runtime/README.md**
- `## wrkflw-runtime`
**crates/runtime/README_SECURITY.md**
- `# Security Features in wrkflw Runtime`
- `# Use secure emulation mode (recommended)`
- `# Or via TUI`
- `# Legacy unsafe mode (not recommended)`
- `# This workflow will be blocked in secure emulation mode`
- `# This workflow will run successfully in secure emulation mode`
**crates/runtime/src/container.rs**
- `pub trait ContainerRuntime`
- `pub struct ContainerOutput`
- `pub enum ContainerError`
**crates/runtime/src/emulation.rs**
- `pub struct EmulationRuntime`
- `pub async fn handle_special_action(action: &str) -> Result<(), ContainerError>`
- `pub async fn cleanup_resources()`
- `pub fn track_process(pid: u32)`
- `pub fn untrack_process(pid: u32)`
- `pub fn track_workspace(path: &Path)`
- `pub fn untrack_workspace(path: &Path)`
- `pub fn get_tracked_workspaces() -> Vec<PathBuf>`
- `pub fn get_tracked_processes() -> Vec<u32>`
**crates/runtime/src/lib.rs**
- `pub mod container`
- `pub mod emulation`
- `pub mod sandbox`
- `pub mod secure_emulation`
**crates/runtime/src/sandbox.rs**
- `pub struct SandboxConfig`
- `pub enum SandboxError`
- `pub struct Sandbox`
- `pub fn create_workflow_sandbox_config() -> SandboxConfig`
- `pub fn create_strict_sandbox_config() -> SandboxConfig`
**crates/runtime/src/secure_emulation.rs**
- `pub struct SecureEmulationRuntime`
- `pub async fn handle_special_action_secure(action: &str) -> Result<(), ContainerError>`
**crates/secrets/Cargo.toml**
- `[package]`
- `[dependencies]`
- `[features]`
- `[dev-dependencies]`
- `[[bench]]`
**crates/secrets/README.md**
- `# wrkflw-secrets`
- `# Set default provider`
- `# Enable/disable secret masking`
- `# Set operation timeout`
**crates/secrets/src/config.rs**
- `pub struct SecretConfig`
- `pub enum SecretProviderConfig`
**crates/secrets/src/error.rs**
- `pub type SecretResult<T> = Result<T, SecretError>`
- `pub enum SecretError`
**crates/secrets/src/lib.rs**
- `pub mod config`
- `pub mod error`
- `pub mod manager`
- `pub mod masking`
- `pub mod providers`
- `pub mod rate_limit`
- `pub mod storage`
- `pub mod substitution`
- `pub mod validation`
- `pub mod prelude`
**crates/secrets/src/manager.rs**
- `pub struct SecretManager`
**crates/secrets/src/masking.rs**
- `pub struct SecretMasker`
**crates/secrets/src/providers/env.rs**
- `pub struct EnvironmentProvider`
**crates/secrets/src/providers/file.rs**
- `pub struct FileProvider`
**crates/secrets/src/providers/mod.rs**
- `pub mod env`
- `pub mod file`
- `pub struct SecretValue`
- `pub trait SecretProvider: Send + Sync`
**crates/secrets/src/rate_limit.rs**
- `pub struct RateLimitConfig`
- `pub struct RateLimiter`
**crates/secrets/src/storage.rs**
- `pub struct EncryptedSecretStore`
- `pub struct KeyDerivation`
**crates/secrets/src/substitution.rs**
- `pub struct SecretSubstitution<'a>`
- `pub struct SecretRef`
**crates/secrets/src/validation.rs**
- `pub const MAX_SECRET_SIZE: usize = 1024 * 1024`
- `pub const MAX_SECRET_NAME_LENGTH: usize = 255`
- `pub fn validate_secret_name(name: &str) -> SecretResult<()>`
- `pub fn validate_secret_value(value: &str) -> SecretResult<()>`
- `pub fn validate_provider_name(name: &str) -> SecretResult<()>`
- `pub fn sanitize_for_logging(input: &str) -> String`
- `pub fn looks_like_secret(value: &str) -> bool`
**crates/ui/Cargo.toml**
- `[package]`
- `[dependencies]`
**crates/ui/README.md**
- `## wrkflw-ui`
- `# tokio_test::block_on(async {`
- `# Ok::<_, Box<dyn std::error::Error>>(())`
- `# })?;`
**crates/ui/src/app/mod.rs**
- `pub async fn run_wrkflw_tui( path: Option<&PathBuf>, runtime_type: RuntimeType, verbose: bool, preserve_containers_on_failure: bool, ) -> io::Result<()>`
**crates/ui/src/app/state.rs**
- `pub struct App`
**crates/ui/src/components/button.rs**
- `pub struct Button`
**crates/ui/src/components/checkbox.rs**
- `pub struct Checkbox`
**crates/ui/src/components/progress_bar.rs**
- `pub struct ProgressBar`
**crates/ui/src/handlers/mod.rs**
- `pub mod workflow`
**crates/ui/src/handlers/workflow.rs**
- `pub fn validate_workflow(path: &Path, verbose: bool) -> io::Result<()>`
- `pub async fn execute_workflow_cli( path: &Path, runtime_type: RuntimeType, verbose: bool, ) -> io::Result<()>`
- `pub async fn execute_curl_trigger( workflow_name: &str, branch: Option<&str>, ) -> Result<(Vec<wrkflw_executor::JobResult>, ()), String>`
- `pub fn start_next_workflow_execution( app: &mut App, tx_clone: &mpsc::Sender<ExecutionResultMsg>, verbose: bool, )`
**crates/ui/src/lib.rs**
- `pub mod app`
- `pub mod components`
- `pub mod handlers`
- `pub mod log_processor`
- `pub mod models`
- `pub mod utils`
- `pub mod views`
**crates/ui/src/log_processor.rs**
- `pub struct ProcessedLogEntry`
- `pub struct LogProcessingRequest`
- `pub struct LogProcessingResponse`
- `pub struct LogProcessor`
**crates/ui/src/models/mod.rs**
- `pub type ExecutionResultMsg = (usize, Result<(Vec<wrkflw_executor::JobResult>, ()), String>)`
- `pub struct Workflow`
- `pub enum WorkflowStatus`
- `pub struct WorkflowExecution`
- `pub struct JobExecution`
- `pub struct StepExecution`
- `pub enum LogFilterLevel`
**crates/ui/src/utils/mod.rs**
- `pub fn load_workflows(dir_path: &Path) -> Vec<Workflow>`
**crates/ui/src/views/execution_tab.rs**
- `pub fn render_execution_tab( f: &mut Frame<CrosstermBackend<io::Stdout>>, app: &mut App, area: Rect, )`
**crates/ui/src/views/help_overlay.rs**
- `pub fn render_help_content( f: &mut Frame<CrosstermBackend<io::Stdout>>, area: Rect, scroll_offset: usize, )`
- `pub fn render_help_overlay(f: &mut Frame<CrosstermBackend<io::Stdout>>, scroll_offset: usize)`
**crates/ui/src/views/job_detail.rs**
- `pub fn render_job_detail_view( f: &mut Frame<CrosstermBackend<io::Stdout>>, app: &mut App, area: Rect, )`
**crates/ui/src/views/logs_tab.rs**
- `pub fn render_logs_tab(f: &mut Frame<CrosstermBackend<io::Stdout>>, app: &App, area: Rect)`
**crates/ui/src/views/mod.rs**
- `pub fn render_ui(f: &mut Frame<CrosstermBackend<io::Stdout>>, app: &mut App)`
**crates/ui/src/views/status_bar.rs**
- `pub fn render_status_bar(f: &mut Frame<CrosstermBackend<io::Stdout>>, app: &App, area: Rect)`
**crates/ui/src/views/title_bar.rs**
- `pub fn render_title_bar(f: &mut Frame<CrosstermBackend<io::Stdout>>, app: &App, area: Rect)`
**crates/ui/src/views/workflows_tab.rs**
- `pub fn render_workflows_tab( f: &mut Frame<CrosstermBackend<io::Stdout>>, app: &mut App, area: Rect, )`
**crates/utils/Cargo.toml**
- `[package]`
- `[dependencies]`
- `[target.'cfg(unix)'.dependencies]`
**crates/utils/README.md**
- `## wrkflw-utils`
**crates/utils/src/lib.rs**
- `pub fn is_workflow_file(path: &Path) -> bool`
- `pub mod fd`
**crates/validators/Cargo.toml**
- `[package]`
- `[dependencies]`
**crates/validators/README.md**
- `## wrkflw-validators`
**crates/validators/src/actions.rs**
- `pub fn validate_action_reference( action_ref: &str, job_name: &str, step_idx: usize, result: &mut ValidationResult, )`
**crates/validators/src/gitlab.rs**
- `pub fn validate_gitlab_pipeline(pipeline: &Pipeline) -> ValidationResult`
**crates/validators/src/jobs.rs**
- `pub fn validate_jobs(jobs: &Value, result: &mut ValidationResult)`
**crates/validators/src/matrix.rs**
- `pub fn validate_matrix(matrix: &Value, result: &mut ValidationResult)`
**crates/validators/src/steps.rs**
- `pub fn validate_steps(steps: &[Value], job_name: &str, result: &mut ValidationResult)`
**crates/validators/src/triggers.rs**
- `pub fn validate_triggers(on: &Value, result: &mut ValidationResult)`
**crates/wrkflw/Cargo.toml**
- `[package]`
- `[dependencies]`
- `[lib]`
- `[[bin]]`
**crates/wrkflw/README.md**
- `## WRKFLW (CLI and Library)`
- `# Launch the TUI (auto-loads .github/workflows)`
- `# Validate all workflows in the default directory`
- `# Validate a specific file or directory`
- `# Validate multiple files and/or directories`
- `# Run a workflow (Docker by default)`
- `# Use Podman or emulation instead of Docker`
- `# Open the TUI explicitly`
- `# tokio_test::block_on(async {`
- `# Ok::<_, Box<dyn std::error::Error>>(())`
- `# })?;`
- `# tokio_test::block_on(async {`
- `# Ok::<_, Box<dyn std::error::Error>>(())`
- `# })?;`
**examples/secrets-demo/README.md**
- `# wrkflw Secrets Management Demo`
- `# Set secrets as environment variables`
- `# .github/workflows/secrets-demo.yml`
- `# secrets.env`
- `# ~/.wrkflw/secrets.yml`
- `# ~/.wrkflw/secrets.yml`
- `# With prefix`
- `# Direct environment variables`
- `# Original log:`
- `# "API response: {\"token\": \"ghp_1234567890abcdef\", \"status\": \"ok\"}"`
- `# Masked log:`
- `# "API response: {\"token\": \"ghp_***\", \"status\": \"ok\"}"`
- `# Check:`
- `# Check:`
- `# Secrets appearing in logs`
- `# Check:`
- `# This works directly in wrkflw`
- `# Before (environment variables)`
- `# After (wrkflw secrets)`
- `# Set in secrets.env:`
- `# API_KEY=your_key`
- `# Use in workflow:`
- `# ${{ secrets.API_KEY }}`
**examples/secrets-demo/secrets-workflow.yml**
- `name:`
- `on:`
- `jobs:`
**publish_crates.sh**
- `show_help()`
- `update_versions()`
- `test_build()`
- `publish_crates()`
- `show_changelog_info()`
**schemas/github-workflow.json**
- `"$schema": "http://json-schema.org/draft-07/schema#"`
- `"$id": "https://json.schemastore.org/github-workflow.json"`
- `"$comment": "https://help.github.com/en/github/automating-your-workflow-with-github-actions/workflow-syntax-for-github-actions"`
- `"additionalProperties": false`
- `"definitions": {`
- `"properties": {`
- `"required": ["on", "jobs"]`
- `"type": "object"`
**schemas/gitlab-ci.json**
- `"$schema": "http://json-schema.org/draft-07/schema#"`
- `"$id": "https://gitlab.com/.gitlab-ci.yml"`
- `"markdownDescription": "Gitlab has a built-in solution for doing CI called Gitlab CI. It is configured by supplying a file called `.gitlab-ci.yml`, which will list all the jobs that are going to run for the project. A full list of all options can be found [here](https://docs.gitlab.com/ee/ci/yaml/). [Learn More](https://docs.gitlab.com/ee/ci/)."`
- `"type": "object"`
- `"properties": {`
- `"patternProperties": {`
- `"additionalProperties": {`
- `"definitions": {`
**tests/README.md**
- `# Testing Strategy`
**tests/TESTING_PODMAN.md**
- `# Testing Podman Support in WRKFLW`
- `# Fedora`
- `# RHEL/CentOS 8+`
- `# Using Chocolatey`
- `# Or download from https://podman.io/getting-started/installation`
- `# Should default to Docker`
- `# Should accept podman as runtime`
- `# Should accept emulation as runtime`
- `# Should reject invalid runtime`
- `# Ensure Podman is running`
- `# Test wrkflw detection`
- `# Temporarily make podman unavailable`
- `# Test fallback to emulation`
- `# Restore podman`
- `# Test same workflow with Docker`
- `# Test same workflow with emulation`
- `# Start TUI with Podman runtime`
- `# Start TUI with emulation runtime`
- `# Run a workflow that will fail`
- `# Check if containers were cleaned up`
- `# Check if failed container was preserved`
- `# Get container ID from previous step`
- `# Inspect the preserved container`
- `# Inside container: explore the environment, check files, etc.`
- `# Exit with: exit`
- `# Clean up manually`
- `# Create workflow that uses a specific image`
- `# Create a workflow that builds a custom image (if supported)`
- `# This tests the build_image functionality`
- `# Note: This test depends on language environment preparation`
- `# Compare results`
- `# Optional: Compare log outputs`
**tests/fixtures/gitlab-ci/advanced.gitlab-ci.yml**
- `stages:`
- `variables:`
- `workflow:`
- `default:`
- `setup:`
- `build:`
- `test-default:`
- `test-all-features:`
- `test-no-features:`
- `security:`
- `lint:`
- `package:`
- `deploy-staging:`
- `deploy-production:`
**tests/fixtures/gitlab-ci/basic.gitlab-ci.yml**
- `stages:`
- `variables:`
- `image:`
- `build:`
- `test:`
- `lint:`
- `deploy:`
**tests/fixtures/gitlab-ci/docker.gitlab-ci.yml**
- `stages:`
- `variables:`
- `build-docker:`
- `test-docker:`
- `security-scan:`
- `deploy-staging:`
- `deploy-production:`
**tests/fixtures/gitlab-ci/includes.gitlab-ci.yml**
- `stages:`
- `include:`
- `variables:`
- `default:`
- `production_deploy:`
- `staging_deploy:`
**tests/fixtures/gitlab-ci/invalid.gitlab-ci.yml**
- `variables:`
- `build:`
- `test:`
- `deploy:`
- `lint:`
- `cache-test:`
**tests/fixtures/gitlab-ci/minimal.gitlab-ci.yml**
- `image:`
- `build:`
- `test:`
**tests/fixtures/gitlab-ci/services.gitlab-ci.yml**
- `stages:`
- `variables:`
- `default:`
- `build:`
- `unit-tests:`
- `postgres-tests:`
- `redis-tests:`
- `mongo-tests:`
- `all-services-test:`
- `deploy:`
**tests/fixtures/gitlab-ci/workflow.gitlab-ci.yml**
- `stages:`
- `workflow:`
- `variables:`
- `default:`
- `prepare:`
- `build:`
- `debug-build:`
- `test:`
- `lint:`
- `benchmark:`
- `deploy-staging:`
- `deploy-prod:`
- `notify:`
**tests/safe_workflow.yml**
- `name:`
- `on:`
- `jobs:`
**tests/scripts/test-podman-basic.sh**
- `print_status()`
- `print_success()`
- `print_warning()`
- `print_error()`
**tests/scripts/test-preserve-containers.sh**
- `print_status()`
- `print_success()`
- `print_warning()`
- `print_error()`
- `count_wrkflw_containers()`
- `get_wrkflw_containers()`
**tests/security_comparison.yml**
- `name:`
- `on:`
- `jobs:`
**tests/security_demo.yml**
- `name:`
- `on:`
- `jobs:`
**tests/workflows/1-basic-workflow.yml**
- `name:`
- `on:`
- `jobs:`
**tests/workflows/2-reusable-workflow-caller.yml**
- `name:`
- `on:`
- `jobs:`
**tests/workflows/3-reusable-workflow-definition.yml**
- `name:`
- `on:`
- `jobs:`
**tests/workflows/4-mixed-jobs.yml**
- `name:`
- `on:`
- `jobs:`
**tests/workflows/5-no-name-reusable-caller.yml**
- `on:`
- `jobs:`
**tests/workflows/6-invalid-reusable-format.yml**
- `name:`
- `on:`
- `jobs:`
**tests/workflows/7-invalid-regular-job.yml**
- `name:`
- `on:`
- `jobs:`
**tests/workflows/8-cyclic-dependencies.yml**
- `name:`
- `on:`
- `jobs:`
**tests/workflows/cpp-test.yml**
- `name:`
- `on:`
- `jobs:`
**tests/workflows/example.yml**
- `name:`
- `on:`
- `env:`
- `jobs:`
**tests/workflows/matrix-example.yml**
- `name:`
- `triggers:`
- `env:`
- `jobs:`
**tests/workflows/node-test.yml**
- `name:`
- `on:`
- `jobs:`
**tests/workflows/python-test.yml**
- `name:`
- `on:`
- `jobs:`
**tests/workflows/runs-on-array-test.yml**
- `name:`
- `on:`
- `jobs:`
**tests/workflows/rust-test.yml**
- `name:`
- `on:`
- `jobs:`
**tests/workflows/test.yml**
- `name:`
- `on:`
- `jobs:`
**tests/workflows/trigger_gitlab.sh**
- `show_help()`
**tests/workflows/working-secrets-test.yml**
- `name:`
- `on:`
- `jobs:`
---
## AGENTS.md
**Language:** Markdown | **Size:** 1.2 KB | **Lines:** 27
**Declarations:**
---
## CLAUDE.md
**Language:** Markdown | **Size:** 4.4 KB | **Lines:** 66
**Declarations:**
---
## Cargo.toml
**Language:** TOML | **Size:** 2.2 KB | **Lines:** 71
**Declarations:**
---
## GITLAB_USAGE.md
**Language:** Markdown | **Size:** 2.2 KB | **Lines:** 83
**Declarations:**
---
## README.md
**Language:** Markdown | **Size:** 24.5 KB | **Lines:** 611
**Declarations:**
---
## VERSION_MANAGEMENT.md
**Language:** Markdown | **Size:** 7.2 KB | **Lines:** 279
**Declarations:**
---
## cliff.toml
**Language:** TOML | **Size:** 3.6 KB | **Lines:** 106
**Declarations:**
---
## crates/README.md
**Language:** Markdown | **Size:** 3.0 KB | **Lines:** 97
**Declarations:**
---
## crates/evaluator/Cargo.toml
**Language:** TOML | **Size:** 499 B | **Lines:** 20
**Declarations:**
---
## crates/evaluator/README.md
**Language:** Markdown | **Size:** 793 B | **Lines:** 29
**Declarations:**
---
## crates/evaluator/src/lib.rs
**Language:** Rust | **Size:** 1.8 KB | **Lines:** 60
**Imports:**
- `colored::*`
- `serde_yaml::{self, Value}`
- `std::fs`
- `std::path::Path`
- `wrkflw_models::ValidationResult`
- `wrkflw_validators::{validate_jobs, validate_triggers}`
**Declarations:**
---
## crates/executor/Cargo.toml
**Language:** TOML | **Size:** 1.0 KB | **Lines:** 42
**Imports:**
- `ignore`
**Declarations:**
---
## crates/executor/README.md
**Language:** Markdown | **Size:** 880 B | **Lines:** 29
**Declarations:**
---
## crates/executor/src/dependency.rs
**Language:** Rust | **Size:** 4.0 KB | **Lines:** 112
**Imports:**
- `std::collections::{HashMap, HashSet}`
- `wrkflw_parser::workflow::WorkflowDefinition`
**Declarations:**
---
## crates/executor/src/docker.rs
**Language:** Rust | **Size:** 44.0 KB | **Lines:** 1188
**Imports:**
- `async_trait::async_trait`
- `bollard::{
container::{Config, CreateContainerOptions},
models::HostConfig,
network::CreateNetworkOptions,
Docker,
}`
- `futures_util::StreamExt`
- `once_cell::sync::Lazy`
- `std::collections::HashMap`
- `std::path::Path`
- `std::sync::Mutex`
- `wrkflw_logging`
- `wrkflw_runtime::container::{ContainerError, ContainerOutput, ContainerRuntime}`
- `wrkflw_utils`
- *... and 1 more imports*
**Declarations:**
`static RUNNING_CONTAINERS: Lazy<Mutex<Vec<String>>> = Lazy::new(|| Mutex::new(Vec::new()))`
`static CREATED_NETWORKS: Lazy<Mutex<Vec<String>>> = Lazy::new(|| Mutex::new(Vec::new()))`
`static CUSTOMIZED_IMAGES: Lazy<Mutex<HashMap<String, String>>> = Lazy::new(|| Mutex::new(HashMap::new()))`
**`impl DockerRuntime`**
`pub fn new() -> Result<Self, ContainerError>`
`pub fn new_with_config(preserve_containers_on_failure: bool) -> Result<Self, ContainerError>`
`pub fn get_customized_image(base_image: &str, customization: &str) -> Option<String>`
`pub fn set_customized_image(base_image: &str, customization: &str, new_image: &str)`
`pub fn find_customized_image_key(image: &str, prefix: &str) -> Option<String>`
`pub fn get_language_specific_image( base_image: &str, language: &str, version: Option<&str>, ) -> Option<String>`
`pub fn set_language_specific_image( base_image: &str, language: &str, version: Option<&str>, new_image: &str, )`
`pub async fn prepare_language_environment( &self, language: &str, version: Option<&str>, additional_packages: Option<Vec<String>>, ) -> Result<String, ContainerError>`
**`impl ContainerRuntime for DockerRuntime`**
`async fn run_container( &self, image: &str, cmd: &[&str], env_vars: &[(&str, &str)], working_dir: &Path, volumes: &[(&Path, &Path)], ) -> Result<ContainerOutput, ContainerError>`
`async fn pull_image(&self, image: &str) -> Result<(), ContainerError>`
`async fn build_image(&self, dockerfile: &Path, tag: &str) -> Result<(), ContainerError>`
`async fn prepare_language_environment( &self, language: &str, version: Option<&str>, additional_packages: Option<Vec<String>>, ) -> Result<String, ContainerError>`
**`impl DockerRuntime`**
`async fn run_container_inner( &self, image: &str, cmd: &[&str], env_vars: &[(&str, &str)], working_dir: &Path, volumes: &[(&Path, &Path)], ) -> Result<ContainerOutput, ContainerError>`
`async fn pull_image_inner(&self, image: &str) -> Result<(), ContainerError>`
`async fn build_image_inner(&self, dockerfile: &Path, tag: &str) -> Result<(), ContainerError>`
---
## crates/executor/src/docker_test.rs
**Language:** Rust | **Size:** 6.4 KB | **Lines:** 197
**Imports:**
- `bollard::Docker`
- `std::{sync::Arc, path::Path}`
- `tokio::sync::Mutex`
- `crate::{
executor::{docker::{self, DockerRuntime}, RuntimeType},
runtime::container::{ContainerRuntime, ContainerOutput}
}`
**Declarations:**
`mod docker_cleanup_tests`
---
## crates/executor/src/engine.rs
**Language:** Rust | **Size:** 96.4 KB | **Lines:** 2608
**Imports:**
- `bollard::Docker`
- `futures::future`
- `regex`
- `serde_yaml::Value`
- `std::collections::HashMap`
- `std::fs`
- `std::path::Path`
- `std::process::Command`
- `thiserror::Error`
- `ignore::{gitignore::GitignoreBuilder, Match}`
- *... and 12 more imports*
**Declarations:**
`fn is_gitlab_pipeline(path: &Path) -> bool`
`async fn execute_github_workflow( workflow_path: &Path, config: ExecutionConfig, ) -> Result<ExecutionResult, ExecutionError>`
`async fn execute_gitlab_pipeline( pipeline_path: &Path, config: ExecutionConfig, ) -> Result<ExecutionResult, ExecutionError>`
`fn create_gitlab_context(pipeline: &Pipeline, workspace_dir: &Path) -> HashMap<String, String>`
`fn resolve_gitlab_dependencies( pipeline: &Pipeline, workflow: &WorkflowDefinition, ) -> Result<Vec<Vec<String>>, ExecutionError>`
`fn initialize_runtime( runtime_type: RuntimeType, preserve_containers_on_failure: bool, ) -> Result<Box<dyn ContainerRuntime>, ExecutionError>`
**`impl From<String> for ExecutionError`**
`fn from(err: String) -> Self`
`async fn prepare_action( action: &ActionInfo, runtime: &dyn ContainerRuntime, ) -> Result<String, ExecutionError>`
`fn determine_action_image(repository: &str) -> String`
`async fn execute_job_batch( jobs: &[String], workflow: &WorkflowDefinition, runtime: &dyn ContainerRuntime, env_context: &HashMap<String, String>, verbose: bool, secret_manager: Option<&SecretManager>, secret_masker: Option<&SecretMasker>, ) -> Result<Vec<JobResult>, ExecutionError>`
`struct JobExecutionContext<'a>`
> Fields: `job_name: &'a str`, `workflow: &'a WorkflowDefinition`, `runtime: &'a dyn ContainerRuntime`, `env_context: &'a HashMap<String, String>`, `verbose: bool`, `secret_manager: Option<&'a SecretManager>`, `secret_masker: Option<&'a SecretMasker>`
`async fn execute_job_with_matrix( job_name: &str, workflow: &WorkflowDefinition, runtime: &dyn ContainerRuntime, env_context: &HashMap<String, String>, verbose: bool, secret_manager: Option<&SecretManager>, secret_masker: Option<&SecretMasker>, ) -> Result<Vec<JobResult>, ExecutionError>`
`async fn execute_job(ctx: JobExecutionContext<'_>) -> Result<JobResult, ExecutionError>`
`struct MatrixExecutionContext<'a>`
> Fields: `job_name: &'a str`, `job_template: &'a Job`, `combinations: &'a [MatrixCombination]`, `max_parallel: usize`, `fail_fast: bool`, `workflow: &'a WorkflowDefinition`, `runtime: &'a dyn ContainerRuntime`, `env_context: &'a HashMap<String, String>`, `verbose: bool`, `secret_manager: Option<&'a SecretManager>`, `secret_masker: Option<&'a SecretMasker>`
`async fn execute_matrix_combinations( ctx: MatrixExecutionContext<'_>, ) -> Result<Vec<JobResult>, ExecutionError>`
`async fn execute_matrix_job( job_name: &str, job_template: &Job, combination: &MatrixCombination, workflow: &WorkflowDefinition, runtime: &dyn ContainerRuntime, base_env_context: &HashMap<String, String>, verbose: bool, ) -> Result<JobResult, ExecutionError>`
`struct StepExecutionContext<'a>`
> Fields: `step: &'a workflow::Step`, `step_idx: usize`, `job_env: &'a HashMap<String, String>`, `working_dir: &'a Path`, `runtime: &'a dyn ContainerRuntime`, `workflow: &'a WorkflowDefinition`, `runner_image: &'a str`, `verbose: bool`, `matrix_combination: &'a Option<HashMap<String, Value>>`, `secret_manager: Option<&'a SecretManager>`, `secret_masker: Option<&'a SecretMasker>`
`async fn execute_step(ctx: StepExecutionContext<'_>) -> Result<StepResult, ExecutionError>`
`fn create_gitignore_matcher( dir: &Path, ) -> Result<Option<ignore::gitignore::Gitignore>, ExecutionError>`
`fn copy_directory_contents(from: &Path, to: &Path) -> Result<(), ExecutionError>`
`fn copy_directory_contents_with_gitignore( from: &Path, to: &Path, gitignore: Option<&ignore::gitignore::Gitignore>, ) -> Result<(), ExecutionError>`
`fn get_runner_image(runs_on: &str) -> String`
`fn get_runner_image_from_opt(runs_on: &Option<Vec<String>>) -> String`
`async fn execute_reusable_workflow_job( ctx: &JobExecutionContext<'_>, uses: &str, with: Option<&HashMap<String, String>>, secrets: Option<&serde_yaml::Value>, ) -> Result<JobResult, ExecutionError>`
`async fn prepare_runner_image( image: &str, runtime: &dyn ContainerRuntime, verbose: bool, ) -> Result<(), ExecutionError>`
`fn extract_language_info(image: &str) -> Option<(&'static str, Option<&str>)>`
`async fn execute_composite_action( step: &workflow::Step, action_path: &Path, job_env: &HashMap<String, String>, working_dir: &Path, runtime: &dyn ContainerRuntime, runner_image: &str, verbose: bool, ) -> Result<StepResult, ExecutionError>`
`fn convert_yaml_to_step(step_yaml: &serde_yaml::Value) -> Result<workflow::Step, String>`
`fn evaluate_job_condition( condition: &str, env_context: &HashMap<String, String>, workflow: &WorkflowDefinition, ) -> bool`
---
## crates/executor/src/environment.rs
**Language:** Rust | **Size:** 7.1 KB | **Lines:** 242
**Imports:**
- `chrono::Utc`
- `serde_yaml::Value`
- `std::{collections::HashMap, fs, io, path::Path}`
- `wrkflw_matrix::MatrixCombination`
- `wrkflw_parser::workflow::WorkflowDefinition`
**Declarations:**
`fn value_to_string(value: &Value) -> String`
`fn get_repo_name() -> String`
`fn extract_repo_from_url(url: &str) -> Option<String>`
`fn get_event_name(workflow: &WorkflowDefinition) -> String`
`fn get_workspace_path() -> String`
`fn get_current_sha() -> String`
`fn get_current_ref() -> String`
`fn get_temp_dir() -> String`
`fn get_tool_cache_dir() -> String`
---
## crates/executor/src/lib.rs
**Language:** Rust | **Size:** 360 B | **Lines:** 16
**Imports:**
- `pub use docker::cleanup_resources`
- `pub use engine::{
execute_workflow, ExecutionConfig, JobResult, JobStatus, RuntimeType, StepResult, StepStatus,
}`
**Declarations:**
---
## crates/executor/src/podman.rs
**Language:** Rust | **Size:** 33.0 KB | **Lines:** 877
**Imports:**
- `async_trait::async_trait`
- `once_cell::sync::Lazy`
- `std::collections::HashMap`
- `std::path::Path`
- `std::process::Stdio`
- `std::sync::Mutex`
- `tempfile`
- `tokio::process::Command`
- `wrkflw_logging`
- `wrkflw_runtime::container::{ContainerError, ContainerOutput, ContainerRuntime}`
- *... and 2 more imports*
**Declarations:**
`static RUNNING_CONTAINERS: Lazy<Mutex<Vec<String>>> = Lazy::new(|| Mutex::new(Vec::new()))`
`static CUSTOMIZED_IMAGES: Lazy<Mutex<HashMap<String, String>>> = Lazy::new(|| Mutex::new(HashMap::new()))`
**`impl PodmanRuntime`**
`pub fn new() -> Result<Self, ContainerError>`
`pub fn new_with_config(preserve_containers_on_failure: bool) -> Result<Self, ContainerError>`
`pub fn get_customized_image(base_image: &str, customization: &str) -> Option<String>`
`pub fn set_customized_image(base_image: &str, customization: &str, new_image: &str)`
`pub fn find_customized_image_key(image: &str, prefix: &str) -> Option<String>`
`pub fn get_language_specific_image( base_image: &str, language: &str, version: Option<&str>, ) -> Option<String>`
`pub fn set_language_specific_image( base_image: &str, language: &str, version: Option<&str>, new_image: &str, )`
`async fn execute_podman_command( &self, args: &[&str], input: Option<&str>, ) -> Result<ContainerOutput, ContainerError>`
**`impl ContainerRuntime for PodmanRuntime`**
`async fn run_container( &self, image: &str, cmd: &[&str], env_vars: &[(&str, &str)], working_dir: &Path, volumes: &[(&Path, &Path)], ) -> Result<ContainerOutput, ContainerError>`
`async fn pull_image(&self, image: &str) -> Result<(), ContainerError>`
`async fn build_image(&self, dockerfile: &Path, tag: &str) -> Result<(), ContainerError>`
`async fn prepare_language_environment( &self, language: &str, version: Option<&str>, additional_packages: Option<Vec<String>>, ) -> Result<String, ContainerError>`
**`impl PodmanRuntime`**
`async fn run_container_inner( &self, image: &str, cmd: &[&str], env_vars: &[(&str, &str)], working_dir: &Path, volumes: &[(&Path, &Path)], ) -> Result<ContainerOutput, ContainerError>`
`async fn pull_image_inner(&self, image: &str) -> Result<(), ContainerError>`
`async fn build_image_inner(&self, dockerfile: &Path, tag: &str) -> Result<(), ContainerError>`
---
## crates/executor/src/substitution.rs
**Language:** Rust | **Size:** 3.6 KB | **Lines:** 108
**Imports:**
- `lazy_static::lazy_static`
- `regex::Regex`
- `serde_yaml::Value`
- `std::collections::HashMap`
**Declarations:**
`mod tests`
---
## crates/github/Cargo.toml
**Language:** TOML | **Size:** 604 B | **Lines:** 24
**Declarations:**
---
## crates/github/README.md
**Language:** Markdown | **Size:** 653 B | **Lines:** 23
**Declarations:**
---
## crates/github/src/lib.rs
**Language:** Rust | **Size:** 10.7 KB | **Lines:** 329
**Imports:**
- `lazy_static::lazy_static`
- `regex::Regex`
- `reqwest::header`
- `serde_json::{self}`
- `std::collections::HashMap`
- `std::fs`
- `std::path::Path`
- `std::process::Command`
- `thiserror::Error`
**Declarations:**
`async fn list_recent_workflow_runs( repo_info: &RepoInfo, workflow_name: &str, token: &str, ) -> Result<Vec<serde_json::Value>, GithubError>`
---
## crates/gitlab/Cargo.toml
**Language:** TOML | **Size:** 618 B | **Lines:** 25
**Declarations:**
---
## crates/gitlab/README.md
**Language:** Markdown | **Size:** 608 B | **Lines:** 23
**Declarations:**
---
## crates/gitlab/src/lib.rs
**Language:** Rust | **Size:** 8.7 KB | **Lines:** 278
**Imports:**
- `lazy_static::lazy_static`
- `regex::Regex`
- `reqwest::header`
- `std::collections::HashMap`
- `std::path::Path`
- `std::process::Command`
- `thiserror::Error`
**Declarations:**
`mod tests`
---
## crates/logging/Cargo.toml
**Language:** TOML | **Size:** 508 B | **Lines:** 21
**Declarations:**
---
## crates/logging/README.md
**Language:** Markdown | **Size:** 456 B | **Lines:** 22
**Declarations:**
---
## crates/logging/src/lib.rs
**Language:** Rust | **Size:** 2.7 KB | **Lines:** 107
**Imports:**
- `chrono::Local`
- `once_cell::sync::Lazy`
- `std::sync::{Arc, Mutex}`
**Declarations:**
`static LOGS: Lazy<Arc<Mutex<Vec<String>>>> = Lazy::new(|| Arc::new(Mutex::new(Vec::new())))`
`static LOG_LEVEL: Lazy<Arc<Mutex<LogLevel>>> = Lazy::new(|| Arc::new(Mutex::new(LogLevel::Info)))`
**`impl LogLevel`**
`fn prefix(&self) -> &'static str`
---
## crates/matrix/Cargo.toml
**Language:** TOML | **Size:** 514 B | **Lines:** 21
**Declarations:**
---
## crates/matrix/README.md
**Language:** Markdown | **Size:** 532 B | **Lines:** 20
**Declarations:**
---
## crates/matrix/src/lib.rs
**Language:** Rust | **Size:** 7.2 KB | **Lines:** 248
**Imports:**
- `indexmap::IndexMap`
- `serde::{Deserialize, Serialize}`
- `serde_yaml::Value`
- `std::collections::HashMap`
- `thiserror::Error`
**Declarations:**
**`impl Default for MatrixConfig`**
`fn default() -> Self`
**`impl MatrixCombination`**
`pub fn new(values: HashMap<String, Value>) -> Self`
`pub fn from_include(values: HashMap<String, Value>) -> Self`
`fn generate_base_combinations( matrix: &MatrixConfig, ) -> Result<Vec<MatrixCombination>, MatrixError>`
`fn generate_combinations( param_names: &[String], param_values: &[Vec<Value>], current_depth: usize, current_combination: &mut HashMap<String, Value>, ) -> Result<Vec<MatrixCombination>, MatrixError>`
`fn apply_exclude_filters( combinations: Vec<MatrixCombination>, exclude_patterns: &[HashMap<String, Value>], ) -> Vec<MatrixCombination>`
`fn is_excluded( combination: &MatrixCombination, exclude_patterns: &[HashMap<String, Value>], ) -> bool`
`fn value_to_string(value: &Value) -> String`
---
## crates/models/Cargo.toml
**Language:** TOML | **Size:** 442 B | **Lines:** 17
**Declarations:**
---
## crates/models/README.md
**Language:** Markdown | **Size:** 320 B | **Lines:** 16
**Declarations:**
---
## crates/models/src/lib.rs
**Language:** Rust | **Size:** 11.3 KB | **Lines:** 338
**Declarations:**
**`impl Default for ValidationResult`**
`fn default() -> Self`
**`impl ValidationResult`**
`pub fn new() -> Self`
`pub fn add_issue(&mut self, issue: String)`
---
## crates/parser/Cargo.toml
**Language:** TOML | **Size:** 607 B | **Lines:** 26
**Imports:**
- `tempfile`
**Declarations:**
---
## crates/parser/README.md
**Language:** Markdown | **Size:** 333 B | **Lines:** 13
**Declarations:**
---
## crates/parser/src/github-workflow.json
**Language:** JSON | **Size:** 90.1 KB | **Lines:** 1719
**Declarations:**
---
## crates/parser/src/gitlab-ci.json
**Language:** JSON | **Size:** 104.7 KB | **Lines:** 3012
**Declarations:**
---
## crates/parser/src/gitlab.rs
**Language:** Rust | **Size:** 8.8 KB | **Lines:** 278
**Imports:**
- `crate::schema::{SchemaType, SchemaValidator}`
- `crate::workflow`
- `std::collections::HashMap`
- `std::fs`
- `std::path::Path`
- `thiserror::Error`
- `wrkflw_models::gitlab::Pipeline`
- `wrkflw_models::ValidationResult`
**Declarations:**
`mod tests`
---
## crates/parser/src/lib.rs
**Language:** Rust | **Size:** 67 B | **Lines:** 5
**Declarations:**
---
## crates/parser/src/schema.rs
**Language:** Rust | **Size:** 3.8 KB | **Lines:** 111
**Imports:**
- `jsonschema::JSONSchema`
- `serde_json::Value`
- `std::fs`
- `std::path::Path`
**Declarations:**
`const GITHUB_WORKFLOW_SCHEMA: &str = include_str!("github-workflow.json")`
`const GITLAB_CI_SCHEMA: &str = include_str!("gitlab-ci.json")`
**`impl SchemaValidator`**
`pub fn new() -> Result<Self, String>`
`pub fn validate_workflow(&self, workflow_path: &Path) -> Result<(), String>`
`pub fn validate_with_specific_schema( &self, content: &str, schema_type: SchemaType, ) -> Result<(), String>`
---
## crates/parser/src/workflow.rs
**Language:** Rust | **Size:** 6.4 KB | **Lines:** 231
**Imports:**
- `serde::{Deserialize, Deserializer, Serialize}`
- `std::collections::HashMap`
- `std::fs`
- `std::path::Path`
- `wrkflw_matrix::MatrixConfig`
- `super::schema::SchemaValidator`
**Declarations:**
`fn deserialize_needs<'de, D>(deserializer: D) -> Result<Option<Vec<String>>, D::Error> where D: Deserializer<'de>,`
`fn deserialize_runs_on<'de, D>(deserializer: D) -> Result<Option<Vec<String>>, D::Error> where D: Deserializer<'de>,`
**`impl WorkflowDefinition`**
`pub fn resolve_action(&self, action_ref: &str) -> ActionInfo`
`fn normalize_triggers(on_value: &serde_yaml::Value) -> Result<Vec<String>, String>`
`mod tests`
---
## crates/runtime/Cargo.toml
**Language:** TOML | **Size:** 735 B | **Lines:** 30
**Imports:**
- `ignore`
**Declarations:**
---
## crates/runtime/README.md
**Language:** Markdown | **Size:** 356 B | **Lines:** 13
**Declarations:**
---
## crates/runtime/README_SECURITY.md
**Language:** Markdown | **Size:** 8.4 KB | **Lines:** 258
**Declarations:**
---
## crates/runtime/src/container.rs
**Language:** Rust | **Size:** 1.9 KB | **Lines:** 65
**Imports:**
- `async_trait::async_trait`
- `std::path::Path`
- `std::fmt`
**Declarations:**
**`impl fmt::Display for ContainerError`**
`fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result`
---
## crates/runtime/src/emulation.rs
**Language:** Rust | **Size:** 33.0 KB | **Lines:** 887
**Imports:**
- `crate::container::{ContainerError, ContainerOutput, ContainerRuntime}`
- `async_trait::async_trait`
- `once_cell::sync::Lazy`
- `std::collections::HashMap`
- `std::fs`
- `std::path::{Path, PathBuf}`
- `std::process::Command`
- `std::sync::Mutex`
- `tempfile::TempDir`
- `which`
- *... and 2 more imports*
**Declarations:**
`static EMULATION_WORKSPACES: Lazy<Mutex<Vec<PathBuf>>> = Lazy::new(|| Mutex::new(Vec::new()))`
`static EMULATION_PROCESSES: Lazy<Mutex<Vec<u32>>> = Lazy::new(|| Mutex::new(Vec::new()))`
**`impl Default for EmulationRuntime`**
`fn default() -> Self`
**`impl EmulationRuntime`**
`pub fn new() -> Self`
`fn prepare_workspace(&self, _working_dir: &Path, volumes: &[(&Path, &Path)]) -> PathBuf`
**`impl ContainerRuntime for EmulationRuntime`**
`async fn run_container( &self, _image: &str, command: &[&str], env_vars: &[(&str, &str)], working_dir: &Path, _volumes: &[(&Path, &Path)], ) -> Result<ContainerOutput, ContainerError>`
`async fn pull_image(&self, image: &str) -> Result<(), ContainerError>`
`async fn build_image(&self, dockerfile: &Path, tag: &str) -> Result<(), ContainerError>`
`async fn prepare_language_environment( &self, language: &str, version: Option<&str>, _additional_packages: Option<Vec<String>>, ) -> Result<String, ContainerError>`
`fn create_gitignore_matcher( dir: &Path, ) -> Result<Option<ignore::gitignore::Gitignore>, std::io::Error>`
`fn copy_directory_contents(source: &Path, dest: &Path) -> std::io::Result<()>`
`fn copy_directory_contents_with_gitignore( source: &Path, dest: &Path, gitignore: Option<&ignore::gitignore::Gitignore>, ) -> std::io::Result<()>`
`fn check_command_available(command: &str, name: &str, install_url: &str)`
`fn add_action_env_vars( env_map: &mut HashMap<String, String>, action: &str, with_params: &Option<HashMap<String, String>>, )`
`async fn cleanup_processes()`
`async fn cleanup_workspaces()`
---
## crates/runtime/src/emulation_test.rs
**Language:** Rust | **Size:** 8.6 KB | **Lines:** 240
**Imports:**
- `std::path::{Path, PathBuf}`
- `std::process::Command`
- `std::fs`
- `tokio::sync::Mutex`
- `once_cell::sync::Lazy`
- `crate::runtime::{
container::{ContainerRuntime, ContainerOutput, ContainerError},
emulation::{self, EmulationRuntime},
}`
**Declarations:**
`mod emulation_cleanup_tests`
---
## crates/runtime/src/lib.rs
**Language:** Rust | **Size:** 99 B | **Lines:** 6
**Declarations:**
---
## crates/runtime/src/sandbox.rs
**Language:** Rust | **Size:** 23.6 KB | **Lines:** 672
**Imports:**
- `regex::Regex`
- `std::collections::HashSet`
- `std::fs`
- `std::path::{Path, PathBuf}`
- `std::process::{Command, Stdio}`
- `std::time::Duration`
- `tempfile::TempDir`
- `wrkflw_logging`
**Declarations:**
**`impl Default for SandboxConfig`**
`fn default() -> Self`
**`impl Sandbox`**
`pub fn new(config: SandboxConfig) -> Result<Self, SandboxError>`
`pub async fn execute_command( &self, command: &[&str], env_vars: &[(&str, &str)], working_dir: &Path, ) -> Result<crate::container::ContainerOutput, SandboxError>`
`fn validate_command(&self, command_str: &str) -> Result<(), SandboxError>`
`fn split_shell_command(&self, command_str: &str) -> Vec<String>`
`fn is_shell_builtin(&self, command: &str) -> bool`
`fn setup_sandbox_environment(&self, working_dir: &Path) -> Result<PathBuf, SandboxError>`
`fn copy_safe_files(&self, source: &Path, dest: &Path) -> Result<(), SandboxError>`
`async fn execute_with_limits( &self, command: &[&str], env_vars: &[(&str, &str)], working_dir: &Path, ) -> Result<crate::container::ContainerOutput, SandboxError>`
`fn is_path_allowed(&self, path: &Path, write_access: bool) -> bool`
`fn is_env_var_safe(&self, key: &str) -> bool`
`fn should_skip_file(&self, filename: &str) -> bool`
`fn should_skip_directory(&self, dirname: &str) -> bool`
`fn compile_dangerous_patterns() -> Vec<Regex>`
`mod tests`
---
## crates/runtime/src/secure_emulation.rs
**Language:** Rust | **Size:** 12.7 KB | **Lines:** 339
**Imports:**
- `crate::container::{ContainerError, ContainerOutput, ContainerRuntime}`
- `crate::sandbox::{create_workflow_sandbox_config, Sandbox, SandboxConfig, SandboxError}`
- `async_trait::async_trait`
- `std::path::Path`
- `wrkflw_logging`
**Declarations:**
**`impl Default for SecureEmulationRuntime`**
`fn default() -> Self`
**`impl SecureEmulationRuntime`**
`pub fn new() -> Self`
`pub fn new_with_config(config: SandboxConfig) -> Result<Self, ContainerError>`
**`impl ContainerRuntime for SecureEmulationRuntime`**
`async fn run_container( &self, image: &str, command: &[&str], env_vars: &[(&str, &str)], working_dir: &Path, _volumes: &[(&Path, &Path)], ) -> Result<ContainerOutput, ContainerError>`
`async fn pull_image(&self, image: &str) -> Result<(), ContainerError>`
`async fn build_image(&self, dockerfile: &Path, tag: &str) -> Result<(), ContainerError>`
`async fn prepare_language_environment( &self, language: &str, version: Option<&str>, _additional_packages: Option<Vec<String>>, ) -> Result<String, ContainerError>`
`fn check_command_available_secure(command: &str, name: &str, install_url: &str)`
`mod tests`
---
## crates/secrets/Cargo.toml
**Language:** TOML | **Size:** 1.7 KB | **Lines:** 61
**Imports:**
- `chrono`
- `anyhow`
- `base64`
- `aes-gcm`
- `rand`
- `tracing`
- `url`
- `pbkdf2`
- `hmac`
- `sha2`
- *... and 2 more imports*
**Declarations:**
---
## crates/secrets/README.md
**Language:** Markdown | **Size:** 9.5 KB | **Lines:** 387
**Declarations:**
---
## crates/secrets/benches/masking_bench.rs
**Language:** Rust | **Size:** 2.8 KB | **Lines:** 92
**Imports:**
- `criterion::{black_box, criterion_group, criterion_main, Criterion}`
- `wrkflw_secrets::SecretMasker`
**Declarations:**
`fn bench_basic_masking(c: &mut Criterion)`
`fn bench_pattern_masking(c: &mut Criterion)`
`fn bench_large_text_masking(c: &mut Criterion)`
`fn bench_many_secrets(c: &mut Criterion)`
`fn bench_contains_secrets(c: &mut Criterion)`
---
## crates/secrets/src/config.rs
**Language:** Rust | **Size:** 6.1 KB | **Lines:** 203
**Imports:**
- `crate::rate_limit::RateLimitConfig`
- `serde::{Deserialize, Serialize}`
- `std::collections::HashMap`
**Declarations:**
**`impl Default for SecretConfig`**
`fn default() -> Self`
**`impl SecretConfig`**
`pub fn from_file(path: &str) -> crate::SecretResult<Self>`
`pub fn to_file(&self, path: &str) -> crate::SecretResult<()>`
`pub fn from_env() -> Self`
---
## crates/secrets/src/error.rs
**Language:** Rust | **Size:** 2.4 KB | **Lines:** 88
**Imports:**
- `thiserror::Error`
**Declarations:**
**`impl SecretError`**
`pub fn not_found(name: impl Into<String>) -> Self`
`pub fn provider_not_found(provider: impl Into<String>) -> Self`
`pub fn auth_failed(provider: impl Into<String>, reason: impl Into<String>) -> Self`
`pub fn invalid_config(msg: impl Into<String>) -> Self`
`pub fn internal(msg: impl Into<String>) -> Self`
---
## crates/secrets/src/lib.rs
**Language:** Rust | **Size:** 7.4 KB | **Lines:** 247
**Imports:**
- `pub use config::{SecretConfig, SecretProviderConfig}`
- `pub use error::{SecretError, SecretResult}`
- `pub use manager::SecretManager`
- `pub use masking::SecretMasker`
- `pub use providers::{SecretProvider, SecretValue}`
- `pub use substitution::SecretSubstitution`
**Declarations:**
`mod tests`
---
## crates/secrets/src/manager.rs
**Language:** Rust | **Size:** 8.6 KB | **Lines:** 267
**Imports:**
- `crate::{
config::{SecretConfig, SecretProviderConfig},
providers::{env::EnvironmentProvider, file::FileProvider, SecretProvider, SecretValue},
rate_limit::RateLimiter,
validation::{validate_provider_name, validate_secret_name},
SecretError, SecretResult,
}`
- `std::collections::HashMap`
- `std::sync::Arc`
- `tokio::sync::RwLock`
**Declarations:**
`struct CachedSecret`
> Fields: `value: SecretValue`, `expires_at: chrono::DateTime<chrono::Utc>`
**`impl SecretManager`**
`pub async fn new(config: SecretConfig) -> SecretResult<Self>`
`pub async fn default() -> SecretResult<Self>`
`pub async fn get_secret(&self, name: &str) -> SecretResult<SecretValue>`
`pub async fn get_secret_from_provider( &self, provider_name: &str, name: &str, ) -> SecretResult<SecretValue>`
`pub async fn list_all_secrets(&self) -> SecretResult<HashMap<String, Vec<String>>>`
`pub async fn health_check(&self) -> HashMap<String, SecretResult<()>>`
`pub async fn clear_cache(&self)`
`pub fn config(&self) -> &SecretConfig`
`pub fn has_provider(&self, name: &str) -> bool`
`pub fn provider_names(&self) -> Vec<String>`
`mod tests`
---
## crates/secrets/src/masking.rs
**Language:** Rust | **Size:** 10.4 KB | **Lines:** 348
**Imports:**
- `regex::Regex`
- `std::collections::{HashMap, HashSet}`
- `std::sync::OnceLock`
**Declarations:**
`struct CompiledPatterns`
> Fields: `github_pat: Regex`, `github_app: Regex`, `github_oauth: Regex`, `aws_access_key: Regex`, `aws_secret: Regex`, `jwt: Regex`, `api_key: Regex`
**`impl CompiledPatterns`**
`fn new() -> Self`
`static PATTERNS: OnceLock<CompiledPatterns> = OnceLock::new()`
**`impl SecretMasker`**
`pub fn new() -> Self`
`pub fn with_mask_char(mask_char: char) -> Self`
`pub fn add_secret(&mut self, secret: impl Into<String>)`
`pub fn add_secrets(&mut self, secrets: impl IntoIterator<Item = String>)`
`pub fn remove_secret(&mut self, secret: &str)`
`pub fn clear(&mut self)`
`pub fn mask(&self, text: &str) -> String`
`fn create_mask(&self, secret: &str) -> String`
`fn mask_patterns(&self, text: &str) -> String`
`pub fn contains_secrets(&self, text: &str) -> bool`
`fn has_secret_patterns(&self, text: &str) -> bool`
`pub fn secret_count(&self) -> usize`
`pub fn has_secret(&self, secret: &str) -> bool`
**`impl Default for SecretMasker`**
`fn default() -> Self`
`mod tests`
---
## crates/secrets/src/providers/env.rs
**Language:** Rust | **Size:** 4.3 KB | **Lines:** 143
**Imports:**
- `crate::{
validation::validate_secret_value, SecretError, SecretProvider, SecretResult, SecretValue,
}`
- `async_trait::async_trait`
- `std::collections::HashMap`
**Declarations:**
**`impl EnvironmentProvider`**
`pub fn new(prefix: Option<String>) -> Self`
**`impl Default for EnvironmentProvider`**
`fn default() -> Self`
**`impl EnvironmentProvider`**
`fn get_env_name(&self, name: &str) -> String`
**`impl SecretProvider for EnvironmentProvider`**
`async fn get_secret(&self, name: &str) -> SecretResult<SecretValue>`
`async fn list_secrets(&self) -> SecretResult<Vec<String>>`
`fn name(&self) -> &str`
`mod tests`
---
## crates/secrets/src/providers/file.rs
**Language:** Rust | **Size:** 9.4 KB | **Lines:** 288
**Imports:**
- `crate::{
validation::validate_secret_value, SecretError, SecretProvider, SecretResult, SecretValue,
}`
- `async_trait::async_trait`
- `serde_json::Value`
- `std::collections::HashMap`
- `std::path::Path`
**Declarations:**
**`impl FileProvider`**
`pub fn new(path: impl Into<String>) -> Self`
`fn expand_path(&self) -> String`
`async fn load_json_secrets(&self, file_path: &Path) -> SecretResult<HashMap<String, String>>`
`async fn load_yaml_secrets(&self, file_path: &Path) -> SecretResult<HashMap<String, String>>`
`async fn load_env_secrets(&self, file_path: &Path) -> SecretResult<HashMap<String, String>>`
`async fn load_secrets(&self) -> SecretResult<HashMap<String, String>>`
**`impl SecretProvider for FileProvider`**
`async fn get_secret(&self, name: &str) -> SecretResult<SecretValue>`
`async fn list_secrets(&self) -> SecretResult<Vec<String>>`
`fn name(&self) -> &str`
`mod tests`
---
## crates/secrets/src/providers/mod.rs
**Language:** Rust | **Size:** 2.6 KB | **Lines:** 91
**Imports:**
- `crate::{SecretError, SecretResult}`
- `async_trait::async_trait`
- `serde::{Deserialize, Serialize}`
- `std::collections::HashMap`
**Declarations:**
**`impl SecretValue`**
`pub fn new(value: impl Into<String>) -> Self`
`pub fn with_metadata(value: impl Into<String>, metadata: HashMap<String, String>) -> Self`
`pub fn value(&self) -> &str`
`pub fn is_expired(&self, ttl_seconds: u64) -> bool`
---
## crates/secrets/src/rate_limit.rs
**Language:** Rust | **Size:** 7.1 KB | **Lines:** 242
**Imports:**
- `crate::{SecretError, SecretResult}`
- `std::collections::HashMap`
- `std::sync::Arc`
- `std::time::{Duration, Instant}`
- `tokio::sync::RwLock`
**Declarations:**
**`impl Default for RateLimitConfig`**
`fn default() -> Self`
`struct RequestTracker`
> Fields: `requests: Vec<Instant>`, `first_request: Instant`
**`impl RequestTracker`**
`fn new() -> Self`
`fn add_request(&mut self, now: Instant)`
`fn cleanup_old_requests(&mut self, window_duration: Duration, now: Instant)`
`fn request_count(&self) -> usize`
**`impl RateLimiter`**
`pub fn new(config: RateLimitConfig) -> Self`
`pub async fn check_rate_limit(&self, key: &str) -> SecretResult<()>`
`pub async fn reset_rate_limit(&self, key: &str)`
`pub async fn clear_all(&self)`
`pub async fn get_request_count(&self, key: &str) -> usize`
`pub fn config(&self) -> &RateLimitConfig`
**`impl Default for RateLimiter`**
`fn default() -> Self`
`mod tests`
---
## crates/secrets/src/storage.rs
**Language:** Rust | **Size:** 10.9 KB | **Lines:** 351
**Imports:**
- `crate::{SecretError, SecretResult}`
- `aes_gcm::{
aead::{Aead, KeyInit, OsRng},
Aes256Gcm, Key, Nonce,
}`
- `base64::{engine::general_purpose, Engine as _}`
- `serde::{Deserialize, Serialize}`
- `std::collections::HashMap`
**Declarations:**
**`impl EncryptedSecretStore`**
`pub fn new() -> SecretResult<(Self, [u8; 32])>`
`pub fn from_data(secrets: HashMap<String, String>, salt: String, nonce: String) -> Self`
`pub fn add_secret(&mut self, key: &[u8; 32], name: &str, value: &str) -> SecretResult<()>`
`pub fn get_secret(&self, key: &[u8; 32], name: &str) -> SecretResult<String>`
`pub fn remove_secret(&mut self, name: &str) -> bool`
`pub fn list_secrets(&self) -> Vec<String>`
`pub fn has_secret(&self, name: &str) -> bool`
`pub fn secret_count(&self) -> usize`
`pub fn clear(&mut self)`
`fn encrypt_value(&self, key: &[u8; 32], value: &str) -> SecretResult<String>`
`fn decrypt_value(&self, key: &[u8; 32], encrypted: &str) -> SecretResult<String>`
`fn generate_salt() -> [u8; 32]`
`fn generate_nonce() -> [u8; 12]`
`pub fn to_json(&self) -> SecretResult<String>`
`pub fn from_json(json: &str) -> SecretResult<Self>`
`pub async fn save_to_file(&self, path: &str) -> SecretResult<()>`
`pub async fn load_from_file(path: &str) -> SecretResult<Self>`
**`impl Default for EncryptedSecretStore`**
`fn default() -> Self`
**`impl KeyDerivation`**
`pub fn derive_key_from_password(password: &str, salt: &[u8], iterations: u32) -> [u8; 32]`
`pub fn generate_random_key() -> [u8; 32]`
`mod tests`
---
## crates/secrets/src/substitution.rs
**Language:** Rust | **Size:** 8.8 KB | **Lines:** 252
**Imports:**
- `crate::{SecretManager, SecretResult}`
- `regex::Regex`
- `std::collections::HashMap`
**Declarations:**
**`impl<'a> SecretSubstitution<'a>`**
`pub fn new(manager: &'a SecretManager) -> Self`
`pub async fn substitute(&mut self, text: &str) -> SecretResult<String>`
`async fn substitute_provider_secrets(&mut self, text: &str) -> SecretResult<String>`
`async fn substitute_default_secrets(&mut self, text: &str) -> SecretResult<String>`
`pub fn resolved_secrets(&self) -> &HashMap<String, String>`
`pub fn contains_secrets(text: &str) -> bool`
`pub fn extract_secret_refs(text: &str) -> Vec<SecretRef>`
**`impl SecretRef`**
`pub fn cache_key(&self) -> String`
`mod tests`
---
## crates/secrets/src/validation.rs
**Language:** Rust | **Size:** 7.6 KB | **Lines:** 241
**Imports:**
- `crate::{SecretError, SecretResult}`
- `regex::Regex`
**Declarations:**
`mod tests`
---
## crates/secrets/tests/integration_tests.rs
**Language:** Rust | **Size:** 11.6 KB | **Lines:** 350
**Imports:**
- `std::collections::HashMap`
- `std::process`
- `tempfile::TempDir`
- `tokio`
- `wrkflw_secrets::{
SecretConfig, SecretManager, SecretMasker, SecretProviderConfig, SecretSubstitution,
}`
**Declarations:**
`async fn test_end_to_end_secret_workflow()`
`async fn test_error_handling()`
`async fn test_rate_limiting()`
`async fn test_concurrent_access()`
`async fn test_substitution_edge_cases()`
`async fn test_comprehensive_masking()`
---
## crates/ui/Cargo.toml
**Language:** TOML | **Size:** 841 B | **Lines:** 32
**Imports:**
- `reqwest`
**Declarations:**
---
## crates/ui/README.md
**Language:** Markdown | **Size:** 653 B | **Lines:** 23
**Declarations:**
---
## crates/ui/src/app/mod.rs
**Language:** Rust | **Size:** 21.1 KB | **Lines:** 496
**Imports:**
- `crate::handlers::workflow::start_next_workflow_execution`
- `crate::models::{ExecutionResultMsg, Workflow, WorkflowStatus}`
- `crate::utils::load_workflows`
- `crate::views::render_ui`
- `chrono::Local`
- `crossterm::{
event::{self, DisableMouseCapture, EnableMouseCapture, Event, KeyCode, KeyModifiers},
execute,
terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen},
}`
- `ratatui::{backend::CrosstermBackend, Terminal}`
- `std::io::{self, stdout}`
- `std::path::PathBuf`
- `std::sync::mpsc`
- *... and 3 more imports*
**Declarations:**
`mod state`
`fn run_tui_event_loop( terminal: &mut Terminal<CrosstermBackend<io::Stdout>>, app: &mut App, tx_clone: &mpsc::Sender<ExecutionResultMsg>, rx: &mpsc::Receiver<ExecutionResultMsg>, verbose: bool, ) -> io::Result<()>`
---
## crates/ui/src/app/state.rs
**Language:** Rust | **Size:** 40.9 KB | **Lines:** 1069
**Imports:**
- `crate::log_processor::{LogProcessingRequest, LogProcessor, ProcessedLogEntry}`
- `crate::models::{
ExecutionResultMsg, JobExecution, LogFilterLevel, StepExecution, Workflow, WorkflowExecution,
WorkflowStatus,
}`
- `chrono::Local`
- `crossterm::event::KeyCode`
- `ratatui::widgets::{ListState, TableState}`
- `std::sync::mpsc`
- `std::time::{Duration, Instant}`
- `wrkflw_executor::{JobStatus, RuntimeType, StepStatus}`
**Declarations:**
**`impl App`**
`pub fn new( runtime_type: RuntimeType, tx: mpsc::Sender<ExecutionResultMsg>, preserve_containers_on_failure: bool, ) -> App`
`pub fn toggle_selected(&mut self)`
`pub fn toggle_emulation_mode(&mut self)`
`pub fn toggle_validation_mode(&mut self)`
`pub fn runtime_type_name(&self) -> &str`
`pub fn previous_workflow(&mut self)`
`pub fn next_workflow(&mut self)`
`pub fn previous_job(&mut self)`
`pub fn next_job(&mut self)`
`pub fn previous_step(&mut self)`
`pub fn next_step(&mut self)`
`pub fn switch_tab(&mut self, tab: usize)`
`pub fn queue_selected_for_execution(&mut self)`
`pub fn start_execution(&mut self)`
`pub fn process_execution_result( &mut self, workflow_idx: usize, result: Result<(Vec<wrkflw_executor::JobResult>, ()), String>, )`
`pub fn get_next_workflow_to_execute(&mut self) -> Option<usize>`
`pub fn toggle_detailed_view(&mut self)`
`pub fn handle_log_search_input(&mut self, key: KeyCode)`
`pub fn toggle_log_search(&mut self)`
`pub fn toggle_log_filter(&mut self)`
`pub fn clear_log_search_and_filter(&mut self)`
`pub fn update_log_search_matches(&mut self)`
`pub fn next_search_match(&mut self)`
`pub fn previous_search_match(&mut self)`
`pub fn scroll_logs_up(&mut self)`
`pub fn scroll_logs_down(&mut self)`
`pub fn scroll_help_up(&mut self)`
`pub fn scroll_help_down(&mut self)`
`pub fn update_running_workflow_progress(&mut self)`
`pub fn set_status_message(&mut self, message: String)`
`pub fn tick(&mut self) -> bool`
`pub fn trigger_selected_workflow(&mut self)`
`pub fn reset_workflow_status(&mut self)`
`pub fn request_log_processing_update(&mut self)`
`pub fn check_log_processing_updates(&mut self)`
`pub fn mark_logs_for_update(&mut self)`
`pub fn get_combined_logs(&self) -> Vec<String>`
`pub fn add_log(&mut self, message: String)`
`pub fn add_timestamped_log(&mut self, message: &str)`
---
## crates/ui/src/components/button.rs
**Language:** Rust | **Size:** 1.3 KB | **Lines:** 53
**Imports:**
- `ratatui::{
style::{Color, Modifier, Style},
text::{Line, Span},
widgets::Paragraph,
}`
**Declarations:**
**`impl Button`**
`pub fn new(label: &str) -> Self`
`pub fn selected(mut self, is_selected: bool) -> Self`
`pub fn active(mut self, is_active: bool) -> Self`
`pub fn render(&self) -> Paragraph<'_>`
---
## crates/ui/src/components/checkbox.rs
**Language:** Rust | **Size:** 1.4 KB | **Lines:** 60
**Imports:**
- `ratatui::{
style::{Color, Modifier, Style},
text::{Line, Span},
widgets::Paragraph,
}`
**Declarations:**
**`impl Checkbox`**
`pub fn new(label: &str) -> Self`
`pub fn checked(mut self, is_checked: bool) -> Self`
`pub fn selected(mut self, is_selected: bool) -> Self`
`pub fn toggle(&mut self)`
`pub fn render(&self) -> Paragraph<'_>`
---
## crates/ui/src/components/mod.rs
**Language:** Rust | **Size:** 315 B | **Lines:** 12
**Imports:**
- `pub use button::Button`
- `pub use checkbox::Checkbox`
- `pub use progress_bar::ProgressBar`
**Declarations:**
`mod button`
`mod checkbox`
`mod progress_bar`
---
## crates/ui/src/components/progress_bar.rs
**Language:** Rust | **Size:** 1.3 KB | **Lines:** 53
**Imports:**
- `ratatui::{
style::{Color, Style},
widgets::Gauge,
}`
**Declarations:**
**`impl ProgressBar`**
`pub fn new(progress: f64) -> Self`
`pub fn label(mut self, label: &str) -> Self`
`pub fn color(mut self, color: Color) -> Self`
`pub fn update(&mut self, progress: f64)`
`pub fn render(&self) -> Gauge<'_>`
---
## crates/ui/src/handlers/mod.rs
**Language:** Rust | **Size:** 42 B | **Lines:** 3
**Declarations:**
---
## crates/ui/src/handlers/workflow.rs
**Language:** Rust | **Size:** 22.1 KB | **Lines:** 569
**Imports:**
- `crate::app::App`
- `crate::models::{ExecutionResultMsg, WorkflowExecution, WorkflowStatus}`
- `chrono::Local`
- `std::io`
- `std::path::{Path, PathBuf}`
- `std::sync::mpsc`
- `std::thread`
- `wrkflw_evaluator::evaluate_workflow_file`
- `wrkflw_executor::{self, JobStatus, RuntimeType, StepStatus}`
**Declarations:**
---
## crates/ui/src/lib.rs
**Language:** Rust | **Size:** 674 B | **Lines:** 23
**Imports:**
- `pub use app::run_wrkflw_tui`
- `pub use handlers::workflow::execute_workflow_cli`
- `pub use handlers::workflow::validate_workflow`
**Declarations:**
---
## crates/ui/src/log_processor.rs
**Language:** Rust | **Size:** 10.4 KB | **Lines:** 305
**Imports:**
- `crate::models::LogFilterLevel`
- `ratatui::{
style::{Color, Style},
text::{Line, Span},
widgets::{Cell, Row},
}`
- `std::sync::mpsc`
- `std::thread`
- `std::time::{Duration, Instant}`
**Declarations:**
**`impl ProcessedLogEntry`**
`pub fn to_row(&self) -> Row<'static>`
**`impl LogProcessor`**
`pub fn new() -> Self`
`pub fn request_update( &self, request: LogProcessingRequest, ) -> Result<(), mpsc::SendError<LogProcessingRequest>>`
`pub fn try_get_update(&self) -> Option<LogProcessingResponse>`
`fn worker_loop( request_rx: mpsc::Receiver<LogProcessingRequest>, response_tx: mpsc::Sender<LogProcessingResponse>, )`
`fn get_combined_logs(app_logs: &[String]) -> Vec<String>`
`fn process_logs(all_logs: &[String], request: &LogProcessingRequest) -> LogProcessingResponse`
`fn process_log_entry(log_line: &str, search_query: &str) -> ProcessedLogEntry`
`fn highlight_search_matches(content: &str, search_query: &str) -> Vec<Span<'static>>`
**`impl Default for LogProcessor`**
`fn default() -> Self`
---
## crates/ui/src/models/mod.rs
**Language:** Rust | **Size:** 2.8 KB | **Lines:** 100
**Imports:**
- `chrono::Local`
- `std::path::PathBuf`
- `wrkflw_executor::{JobStatus, StepStatus}`
**Declarations:**
**`impl LogFilterLevel`**
`pub fn matches(&self, log: &str) -> bool`
`pub fn next(&self) -> Self`
`pub fn to_string(&self) -> &str`
---
## crates/ui/src/utils/mod.rs
**Language:** Rust | **Size:** 1.9 KB | **Lines:** 53
**Imports:**
- `crate::models::{Workflow, WorkflowStatus}`
- `std::path::{Path, PathBuf}`
- `wrkflw_utils::is_workflow_file`
**Declarations:**
---
## crates/ui/src/views/execution_tab.rs
**Language:** Rust | **Size:** 14.3 KB | **Lines:** 361
**Imports:**
- `crate::app::App`
- `crate::models::WorkflowStatus`
- `ratatui::{
backend::CrosstermBackend,
layout::{Alignment, Constraint, Direction, Layout, Rect},
style::{Color, Modifier, Style},
text::{Line, Span},
widgets::{Block, BorderType, Borders, Gauge, List, ListItem, Paragraph},
Frame,
}`
- `std::io`
**Declarations:**
---
## crates/ui/src/views/help_overlay.rs
**Language:** Rust | **Size:** 14.6 KB | **Lines:** 458
**Imports:**
- `ratatui::{
backend::CrosstermBackend,
layout::{Constraint, Direction, Layout, Rect},
style::{Color, Modifier, Style},
text::{Line, Span},
widgets::{Block, BorderType, Borders, Paragraph, Wrap},
Frame,
}`
- `std::io`
**Declarations:**
---
## crates/ui/src/views/job_detail.rs
**Language:** Rust | **Size:** 9.6 KB | **Lines:** 211
**Imports:**
- `crate::app::App`
- `ratatui::{
backend::CrosstermBackend,
layout::{Constraint, Direction, Layout, Rect},
style::{Color, Modifier, Style},
text::{Line, Span},
widgets::{Block, BorderType, Borders, Paragraph, Row, Table},
Frame,
}`
- `std::io`
**Declarations:**
---
## crates/ui/src/views/logs_tab.rs
**Language:** Rust | **Size:** 7.6 KB | **Lines:** 209
**Imports:**
- `crate::app::App`
- `ratatui::{
backend::CrosstermBackend,
layout::{Alignment, Constraint, Direction, Layout, Rect},
style::{Color, Modifier, Style},
text::{Line, Span},
widgets::{Block, BorderType, Borders, Cell, Paragraph, Row, Table, TableState},
Frame,
}`
- `std::io`
**Declarations:**
---
## crates/ui/src/views/mod.rs
**Language:** Rust | **Size:** 1.7 KB | **Lines:** 57
**Imports:**
- `crate::app::App`
- `ratatui::{backend::CrosstermBackend, Frame}`
- `std::io`
**Declarations:**
`mod execution_tab`
`mod help_overlay`
`mod job_detail`
`mod logs_tab`
`mod status_bar`
`mod title_bar`
`mod workflows_tab`
---
## crates/ui/src/views/status_bar.rs
**Language:** Rust | **Size:** 7.3 KB | **Lines:** 212
**Imports:**
- `crate::app::App`
- `ratatui::{
backend::CrosstermBackend,
layout::{Alignment, Rect},
style::{Color, Style},
text::{Line, Span},
widgets::Paragraph,
Frame,
}`
- `std::io`
- `wrkflw_executor::RuntimeType`
**Declarations:**
---
## crates/ui/src/views/title_bar.rs
**Language:** Rust | **Size:** 2.5 KB | **Lines:** 74
**Imports:**
- `crate::app::App`
- `ratatui::{
backend::CrosstermBackend,
layout::{Alignment, Rect},
style::{Color, Modifier, Style},
text::{Line, Span},
widgets::{Block, BorderType, Borders, Tabs},
Frame,
}`
- `std::io`
**Declarations:**
---
## crates/ui/src/views/workflows_tab.rs
**Language:** Rust | **Size:** 4.5 KB | **Lines:** 131
**Imports:**
- `crate::app::App`
- `crate::models::WorkflowStatus`
- `ratatui::{
backend::CrosstermBackend,
layout::{Alignment, Constraint, Direction, Layout, Rect},
style::{Color, Modifier, Style},
text::{Line, Span},
widgets::{Block, BorderType, Borders, Cell, Paragraph, Row, Table, TableState},
Frame,
}`
- `std::io`
**Declarations:**
---
## crates/utils/Cargo.toml
**Language:** TOML | **Size:** 507 B | **Lines:** 22
**Declarations:**
---
## crates/utils/README.md
**Language:** Markdown | **Size:** 562 B | **Lines:** 21
**Declarations:**
---
## crates/utils/src/lib.rs
**Language:** Rust | **Size:** 6.8 KB | **Lines:** 199
**Imports:**
- `std::path::Path`
**Declarations:**
`mod tests`
---
## crates/validators/Cargo.toml
**Language:** TOML | **Size:** 494 B | **Lines:** 20
**Declarations:**
---
## crates/validators/README.md
**Language:** Markdown | **Size:** 719 B | **Lines:** 29
**Declarations:**
---
## crates/validators/src/actions.rs
**Language:** Rust | **Size:** 2.0 KB | **Lines:** 58
**Imports:**
- `wrkflw_models::ValidationResult`
**Declarations:**
---
## crates/validators/src/gitlab.rs
**Language:** Rust | **Size:** 7.7 KB | **Lines:** 234
**Imports:**
- `std::collections::HashMap`
- `wrkflw_models::gitlab::{Job, Pipeline}`
- `wrkflw_models::ValidationResult`
**Declarations:**
`fn validate_jobs(jobs: &HashMap<String, Job>, result: &mut ValidationResult)`
`fn validate_stages(stages: &[String], jobs: &HashMap<String, Job>, result: &mut ValidationResult)`
`fn validate_dependencies(jobs: &HashMap<String, Job>, result: &mut ValidationResult)`
`fn validate_extends(jobs: &HashMap<String, Job>, result: &mut ValidationResult)`
`fn check_circular_extends( job_name: &str, jobs: &HashMap<String, Job>, visited: &mut Vec<String>, result: &mut ValidationResult, )`
`fn validate_artifacts(jobs: &HashMap<String, Job>, result: &mut ValidationResult)`
---
## crates/validators/src/jobs.rs
**Language:** Rust | **Size:** 4.7 KB | **Lines:** 102
**Imports:**
- `crate::{validate_matrix, validate_steps}`
- `serde_yaml::Value`
- `wrkflw_models::ValidationResult`
**Declarations:**
---
## crates/validators/src/lib.rs
**Language:** Rust | **Size:** 310 B | **Lines:** 15
**Imports:**
- `pub use actions::validate_action_reference`
- `pub use gitlab::validate_gitlab_pipeline`
- `pub use jobs::validate_jobs`
- `pub use matrix::validate_matrix`
- `pub use steps::validate_steps`
- `pub use triggers::validate_triggers`
**Declarations:**
`mod actions`
`mod gitlab`
`mod jobs`
`mod matrix`
`mod steps`
`mod triggers`
---
## crates/validators/src/matrix.rs
**Language:** Rust | **Size:** 4.2 KB | **Lines:** 119
**Imports:**
- `serde_yaml::Value`
- `wrkflw_models::ValidationResult`
**Declarations:**
`fn validate_include_exclude(section: &Value, section_name: &str, result: &mut ValidationResult)`
`fn validate_matrix_parameter(name: &str, value: &Value, result: &mut ValidationResult)`
`fn get_value_type(value: &Value) -> &'static str`
---
## crates/validators/src/steps.rs
**Language:** Rust | **Size:** 2.2 KB | **Lines:** 57
**Imports:**
- `crate::validate_action_reference`
- `serde_yaml::Value`
- `std::collections::HashSet`
- `wrkflw_models::ValidationResult`
**Declarations:**
---
## crates/validators/src/triggers.rs
**Language:** Rust | **Size:** 3.0 KB | **Lines:** 96
**Imports:**
- `serde_yaml::Value`
- `wrkflw_models::ValidationResult`
**Declarations:**
`fn validate_cron_syntax(cron: &str, result: &mut ValidationResult)`
---
## crates/wrkflw/Cargo.toml
**Language:** TOML | **Size:** 1.5 KB | **Lines:** 65
**Imports:**
- `walkdir`
**Declarations:**
---
## crates/wrkflw/README.md
**Language:** Markdown | **Size:** 3.6 KB | **Lines:** 112
**Declarations:**
---
## crates/wrkflw/src/lib.rs
**Language:** Rust | **Size:** 408 B | **Lines:** 12
**Imports:**
- `pub use wrkflw_evaluator as evaluator`
- `pub use wrkflw_executor as executor`
- `pub use wrkflw_github as github`
- `pub use wrkflw_gitlab as gitlab`
- `pub use wrkflw_logging as logging`
- `pub use wrkflw_matrix as matrix`
- `pub use wrkflw_models as models`
- `pub use wrkflw_parser as parser`
- `pub use wrkflw_runtime as runtime`
- `pub use wrkflw_ui as ui`
- *... and 2 more imports*
---
## crates/wrkflw/src/main.rs
**Language:** Rust | **Size:** 26.7 KB | **Lines:** 708
**Imports:**
- `bollard::Docker`
- `clap::{Parser, Subcommand, ValueEnum}`
- `std::collections::HashMap`
- `std::path::Path`
- `std::path::PathBuf`
**Declarations:**
`enum RuntimeChoice`
> Variants: `Docker`, `Podman`, `Emulation`, `SecureEmulation`
**`impl From<RuntimeChoice> for wrkflw_executor::RuntimeType`**
`fn from(choice: RuntimeChoice) -> Self`
`struct Wrkflw`
> Fields: `command: Option<Commands>`, `verbose: bool`, `debug: bool`
`enum Commands`
> Variants: `Validate`, `Run`, `Tui`, `Trigger`, `TriggerGitlab`, `List`
`fn parse_key_val(s: &str) -> Result<(String, String), String>`
`async fn cleanup_on_exit()`
`async fn handle_signals()`
`fn is_gitlab_pipeline(path: &Path) -> bool`
`async fn main()`
`fn validate_github_workflow(path: &Path, verbose: bool) -> bool`
`fn validate_gitlab_pipeline(path: &Path, verbose: bool) -> bool`
`fn list_workflows_and_pipelines(verbose: bool)`
---
## examples/secrets-demo/README.md
**Language:** Markdown | **Size:** 10.6 KB | **Lines:** 505
**Declarations:**
---
## examples/secrets-demo/secrets-workflow.yml
**Language:** YAML | **Size:** 6.9 KB | **Lines:** 213
**Declarations:**
---
## publish_crates.sh
**Language:** Shell | **Size:** 5.1 KB | **Lines:** 179
**Declarations:**
---
## schemas/github-workflow.json
**Language:** JSON | **Size:** 89.9 KB | **Lines:** 1711
**Declarations:**
---
## schemas/gitlab-ci.json
**Language:** JSON | **Size:** 104.7 KB | **Lines:** 3012
**Declarations:**
---
## scripts/bump-crate.sh
**Language:** Shell | **Size:** 3.1 KB | **Lines:** 97
---
## tests/README.md
**Language:** Markdown | **Size:** 1.8 KB | **Lines:** 61
**Declarations:**
---
## tests/TESTING_PODMAN.md
**Language:** Markdown | **Size:** 13.2 KB | **Lines:** 487
**Declarations:**
---
## tests/cleanup_test.rs
**Language:** Rust | **Size:** 7.2 KB | **Lines:** 236
**Imports:**
- `bollard::Docker`
- `std::process::Command`
- `std::time::Duration`
- `uuid::Uuid`
- `wrkflw::{
cleanup_on_exit,
executor::docker,
runtime::emulation::{self, EmulationRuntime},
}`
**Declarations:**
`fn should_skip_docker_tests() -> bool`
`fn should_skip_process_tests() -> bool`
`async fn test_docker_container_cleanup()`
`async fn test_docker_network_cleanup()`
`async fn test_emulation_workspace_cleanup()`
`async fn test_emulation_process_cleanup()`
`async fn test_cleanup_on_exit_function()`
---
## tests/fixtures/gitlab-ci/advanced.gitlab-ci.yml
**Language:** YAML | **Size:** 4.0 KB | **Lines:** 197
**Declarations:**
---
## tests/fixtures/gitlab-ci/basic.gitlab-ci.yml
**Language:** YAML | **Size:** 674 B | **Lines:** 45
**Declarations:**
---
## tests/fixtures/gitlab-ci/docker.gitlab-ci.yml
**Language:** YAML | **Size:** 2.4 KB | **Lines:** 97
**Declarations:**
---
## tests/fixtures/gitlab-ci/includes.gitlab-ci.yml
**Language:** YAML | **Size:** 883 B | **Lines:** 40
**Declarations:**
---
## tests/fixtures/gitlab-ci/invalid.gitlab-ci.yml
**Language:** YAML | **Size:** 1.4 KB | **Lines:** 57
**Declarations:**
---
## tests/fixtures/gitlab-ci/minimal.gitlab-ci.yml
**Language:** YAML | **Size:** 124 B | **Lines:** 11
**Declarations:**
---
## tests/fixtures/gitlab-ci/services.gitlab-ci.yml
**Language:** YAML | **Size:** 3.3 KB | **Lines:** 167
**Declarations:**
---
## tests/fixtures/gitlab-ci/workflow.gitlab-ci.yml
**Language:** YAML | **Size:** 4.2 KB | **Lines:** 186
**Declarations:**
---
## tests/matrix_test.rs
**Language:** Rust | **Size:** 3.8 KB | **Lines:** 125
**Imports:**
- `indexmap::IndexMap`
- `serde_yaml::Value`
- `std::collections::HashMap`
- `wrkflw::matrix::{self, MatrixCombination, MatrixConfig}`
**Declarations:**
`fn create_test_matrix() -> MatrixConfig`
`fn test_matrix_expansion()`
`fn test_format_combination_name()`
---
## tests/reusable_workflow_execution_test.rs
**Language:** Rust | **Size:** 3.0 KB | **Lines:** 120
**Imports:**
- `std::fs`
- `tempfile::tempdir`
- `wrkflw::executor::engine::{execute_workflow, ExecutionConfig, RuntimeType}`
**Declarations:**
`fn write_file(path: &std::path::Path, content: &str)`
`async fn test_local_reusable_workflow_execution_success()`
`async fn test_local_reusable_workflow_execution_failure_propagates()`
---
## tests/reusable_workflow_test.rs
**Language:** Rust | **Size:** 1.6 KB | **Lines:** 64
**Imports:**
- `std::fs`
- `tempfile::tempdir`
- `wrkflw::evaluator::evaluate_workflow_file`
**Declarations:**
`fn test_reusable_workflow_validation()`
---
## tests/safe_workflow.yml
**Language:** YAML | **Size:** 816 B | **Lines:** 35
**Declarations:**
---
## tests/scripts/test-podman-basic.sh
**Language:** Shell | **Size:** 7.0 KB | **Lines:** 215
**Declarations:**
---
## tests/scripts/test-preserve-containers.sh
**Language:** Shell | **Size:** 8.8 KB | **Lines:** 256
**Declarations:**
---
## tests/security_comparison.yml
**Language:** YAML | **Size:** 674 B | **Lines:** 29
**Declarations:**
---
## tests/security_demo.yml
**Language:** YAML | **Size:** 2.5 KB | **Lines:** 92
**Declarations:**
---
## tests/workflows/1-basic-workflow.yml
**Language:** YAML | **Size:** 389 B | **Lines:** 21
**Declarations:**
---
## tests/workflows/2-reusable-workflow-caller.yml
**Language:** YAML | **Size:** 441 B | **Lines:** 20
**Declarations:**
---
## tests/workflows/3-reusable-workflow-definition.yml
**Language:** YAML | **Size:** 863 B | **Lines:** 32
**Declarations:**
---
## tests/workflows/4-mixed-jobs.yml
**Language:** YAML | **Size:** 563 B | **Lines:** 25
**Declarations:**
---
## tests/workflows/5-no-name-reusable-caller.yml
**Language:** YAML | **Size:** 234 B | **Lines:** 12
**Declarations:**
---
## tests/workflows/6-invalid-reusable-format.yml
**Language:** YAML | **Size:** 269 B | **Lines:** 17
**Declarations:**
---
## tests/workflows/7-invalid-regular-job.yml
**Language:** YAML | **Size:** 379 B | **Lines:** 19
**Declarations:**
---
## tests/workflows/8-cyclic-dependencies.yml
**Language:** YAML | **Size:** 515 B | **Lines:** 31
**Declarations:**
---
## tests/workflows/cpp-test.yml
**Language:** YAML | **Size:** 860 B | **Lines:** 38
**Declarations:**
---
## tests/workflows/example.yml
**Language:** YAML | **Size:** 503 B | **Lines:** 26
**Declarations:**
---
## tests/workflows/matrix-example.yml
**Language:** YAML | **Size:** 1.0 KB | **Lines:** 44
**Declarations:**
---
## tests/workflows/node-test.yml
**Language:** YAML | **Size:** 639 B | **Lines:** 31
**Declarations:**
---
## tests/workflows/python-test.yml
**Language:** YAML | **Size:** 635 B | **Lines:** 31
**Declarations:**
---
## tests/workflows/runs-on-array-test.yml
**Language:** YAML | **Size:** 391 B | **Lines:** 18
**Declarations:**
---
## tests/workflows/rust-test.yml
**Language:** YAML | **Size:** 797 B | **Lines:** 38
**Declarations:**
---
## tests/workflows/test.yml
**Language:** YAML | **Size:** 159 B | **Lines:** 12
**Declarations:**
---
## tests/workflows/trigger_gitlab.sh
**Language:** Shell | **Size:** 2.0 KB | **Lines:** 79
**Declarations:**
---
## tests/workflows/working-secrets-test.yml
**Language:** YAML | **Size:** 1.5 KB | **Lines:** 46
**Declarations:**