Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 2 additions & 7 deletions .github/workflows/daily-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,17 +15,12 @@ jobs:
strategy:
matrix:
os: [ubuntu-latest, windows-latest]
defaults:
run:
working-directory: agentic-pipelines
steps:
- uses: actions/checkout@v4

- uses: dtolnay/rust-toolchain@stable

- uses: Swatinem/rust-cache@v2
with:
workspaces: agentic-pipelines

- name: Build
run: cargo build --release --verbose
Expand All @@ -36,5 +31,5 @@ jobs:
- name: Upload build artifact
uses: actions/upload-artifact@v4
with:
name: agentic-pipelines-${{ runner.os == 'Windows' && 'win' || 'lin' }}
path: agentic-pipelines/target/release/agentic-pipelines${{ runner.os == 'Windows' && '.exe' || '' }}
name: ado-aw-${{ runner.os == 'Windows' && 'win' || 'lin' }}
path: target/release/ado-aw${{ runner.os == 'Windows' && '.exe' || '' }}
16 changes: 8 additions & 8 deletions .github/workflows/doc-freshness-check.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ safe-outputs:

# Documentation Freshness Check

You are a technical documentation auditor for the **agentic-pipelines** project — a Rust CLI compiler that transforms markdown agent definitions into Azure DevOps pipeline YAML.
You are a technical documentation auditor for the **ado-aw** project — a Rust CLI compiler that transforms markdown agent definitions into Azure DevOps pipeline YAML.

## Your Task

Expand All @@ -31,8 +31,8 @@ Audit the project documentation for accuracy and completeness by comparing docs
Compare the directory tree in `.github/copilot-instructions.md` against actual files:

```bash
find agentic-pipelines/src -type f -name '*.rs' | sort
find agentic-pipelines/templates -type f | sort
find src -type f -name '*.rs' | sort
find templates -type f | sort
```

Look for:
Expand All @@ -42,7 +42,7 @@ Look for:

### 2. CLI Commands

Extract the actual CLI commands from `agentic-pipelines/src/main.rs` (look at the `Commands` enum with clap derive) and compare against documented commands in `.github/copilot-instructions.md`.
Extract the actual CLI commands from `src/main.rs` (look at the `Commands` enum with clap derive) and compare against documented commands in `.github/copilot-instructions.md`.

Check:
- All subcommands are documented
Expand All @@ -51,7 +51,7 @@ Check:

### 3. Front Matter Fields

Compare the `FrontMatter` struct in `agentic-pipelines/src/compile/types.rs` against the documented fields:
Compare the `FrontMatter` struct in `src/compile/types.rs` against the documented fields:

- Are all struct fields documented?
- Do documented defaults match `#[serde(default)]` values?
Expand All @@ -63,8 +63,8 @@ Compare the `FrontMatter` struct in `agentic-pipelines/src/compile/types.rs` aga
Scan template files for markers:

```bash
grep -oP '\{\{[^}]+\}\}' agentic-pipelines/templates/base.yml
grep -oP '\{\{[^}]+\}\}' agentic-pipelines/templates/1es-base.yml
grep -oP '\{\{[^}]+\}\}' templates/base.yml
grep -oP '\{\{[^}]+\}\}' templates/1es-base.yml
```

Compare against documented markers in `.github/copilot-instructions.md`. Check for:
Expand All @@ -74,7 +74,7 @@ Compare against documented markers in `.github/copilot-instructions.md`. Check f

### 5. Safe Output Tools

Compare tools defined in `agentic-pipelines/src/tools/` against what's documented:
Compare tools defined in `src/tools/` against what's documented:
- Are all tools documented with correct parameters?
- Do configuration options match the actual implementation?

Expand Down
8 changes: 6 additions & 2 deletions .github/workflows/rust-pr-reviewer.lock.yml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 6 additions & 2 deletions .github/workflows/rust-pr-reviewer.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,11 @@ on:
pull_request:
types: [opened, synchronize]
paths:
- "agentic-pipelines/**"
- "src/**"
- "tests/**"
- "templates/**"
- "Cargo.toml"
- "Cargo.lock"
description: Reviews Rust code changes for quality, error handling, security, and project conventions
permissions:
contents: read
Expand All @@ -21,7 +25,7 @@ safe-outputs:

# Rust PR Reviewer

You are a senior Rust engineer reviewing pull requests for the **agentic-pipelines** compiler — a CLI tool that compiles markdown agent definitions into Azure DevOps pipeline YAML.
You are a senior Rust engineer reviewing pull requests for the **ado-aw** compiler — a CLI tool that compiles markdown agent definitions into Azure DevOps pipeline YAML.

## Your Review Focus

Expand Down
11 changes: 5 additions & 6 deletions .github/workflows/rust-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,11 @@ name: Rust Tests
on:
pull_request:
paths:
- "agentic-pipelines/**"
- "src/**"
- "tests/**"
- "templates/**"
- "Cargo.toml"
- "Cargo.lock"

env:
CARGO_TERM_COLOR: always
Expand All @@ -12,17 +16,12 @@ jobs:
test:
name: Build & Test
runs-on: ubuntu-latest
defaults:
run:
working-directory: agentic-pipelines
steps:
- uses: actions/checkout@v4

- uses: dtolnay/rust-toolchain@stable

- uses: Swatinem/rust-cache@v2
with:
workspaces: agentic-pipelines

- name: Build
run: cargo build --verbose
Expand Down
8 changes: 4 additions & 4 deletions .github/workflows/test-gap-finder.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ safe-outputs:

# Test Gap Finder

You are a test engineering specialist for the **agentic-pipelines** Rust project — a CLI compiler that transforms markdown agent definitions into Azure DevOps pipeline YAML.
You are a test engineering specialist for the **ado-aw** Rust project — a CLI compiler that transforms markdown agent definitions into Azure DevOps pipeline YAML.

## Your Task

Expand All @@ -37,7 +37,7 @@ cat /tmp/gh-aw/cache-memory/test-gap-state.json 2>/dev/null || echo "No previous
## Step 2: Build and Run Tests

```bash
cd agentic-pipelines
# Project is at repo root
cargo test 2>&1
cargo test -- --list 2>&1
```
Expand All @@ -59,10 +59,10 @@ For each source file:

```bash
# Count public functions
grep -c 'pub fn\|pub async fn' agentic-pipelines/src/<file>.rs
grep -c 'pub fn\|pub async fn' src/<file>.rs

# Count test functions
grep -c '#\[test\]' agentic-pipelines/src/<file>.rs
grep -c '#\[test\]' src/<file>.rs
```

### What Constitutes a Gap
Expand Down
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
target
agentic-pipelines/examples/sample-agent.yml
examples/sample-agent.yml
86 changes: 42 additions & 44 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ This repository contains a compiler for Azure DevOps pipelines that transforms n

### Purpose

The `agentic-pipelines` compiler enables users to write pipeline definitions in a human-friendly markdown format with YAML front matter, which gets compiled into proper Azure DevOps YAML pipeline definitions. This approach:
The `ado-aw` compiler enables users to write pipeline definitions in a human-friendly markdown format with YAML front matter, which gets compiled into proper Azure DevOps YAML pipeline definitions. This approach:

- Makes pipeline authoring more accessible through natural language
- Enables AI agents to work safely in network-isolated sandboxes (via OneBranch)
Expand All @@ -18,44 +18,43 @@ Alongside the correctly generated pipeline yaml, an agent file is generated from
### Architecture

```
├── agentic-pipelines/ # Rust CLI compiler
│ ├── src/
│ │ ├── main.rs # Entry point with clap CLI
│ │ ├── allowed_hosts.rs # Core network allowlist definitions
│ │ ├── compile/ # Pipeline compilation module
│ │ │ ├── mod.rs # Module entry point and Compiler trait
│ │ │ ├── common.rs # Shared helpers across targets
│ │ │ ├── standalone.rs # Standalone pipeline compiler
│ │ │ ├── onees.rs # 1ES Pipeline Template compiler
│ │ │ └── types.rs # Front matter grammar and types
│ │ ├── create.rs # Interactive agent creation wizard
│ │ ├── execute.rs # Stage 2 safe output execution
│ │ ├── fuzzy_schedule.rs # Fuzzy schedule parsing
│ │ ├── logging.rs # File-based logging infrastructure
│ │ ├── mcp.rs # SafeOutputs MCP server
│ │ ├── mcp_firewall.rs # MCP Firewall server
│ │ ├── mcp_metadata.rs # Bundled MCP metadata
│ │ ├── ndjson.rs # NDJSON parsing utilities
│ │ ├── proxy.rs # Network proxy implementation
│ │ ├── sanitize.rs # Input sanitization for safe outputs
│ │ └── tools/ # MCP tool implementations
│ │ ├── mod.rs
│ │ ├── create_pr.rs
│ │ ├── create_work_item.rs
│ │ ├── memory.rs
│ │ ├── missing_data.rs
│ │ ├── missing_tool.rs
│ │ ├── noop.rs
│ │ └── result.rs
│ ├── templates/
│ │ ├── base.yml # Base pipeline template for standalone
│ │ ├── 1es-base.yml # Base pipeline template for 1ES target
│ │ └── threat-analysis.md # Threat detection analysis prompt template
│ ├── mcp-metadata.json # Bundled MCP tool definitions
│ ├── examples/ # Example agent definitions
│ ├── tests/ # Integration tests and fixtures
│ └── Cargo.toml # Rust dependencies
└── README.md # Project documentation
├── src/
│ ├── main.rs # Entry point with clap CLI
│ ├── allowed_hosts.rs # Core network allowlist definitions
│ ├── compile/ # Pipeline compilation module
│ │ ├── mod.rs # Module entry point and Compiler trait
│ │ ├── common.rs # Shared helpers across targets
│ │ ├── standalone.rs # Standalone pipeline compiler
│ │ ├── onees.rs # 1ES Pipeline Template compiler
│ │ └── types.rs # Front matter grammar and types
│ ├── create.rs # Interactive agent creation wizard
│ ├── execute.rs # Stage 2 safe output execution
│ ├── fuzzy_schedule.rs # Fuzzy schedule parsing
│ ├── logging.rs # File-based logging infrastructure
│ ├── mcp.rs # SafeOutputs MCP server
│ ├── mcp_firewall.rs # MCP Firewall server
│ ├── mcp_metadata.rs # Bundled MCP metadata
│ ├── ndjson.rs # NDJSON parsing utilities
│ ├── proxy.rs # Network proxy implementation
│ ├── sanitize.rs # Input sanitization for safe outputs
│ └── tools/ # MCP tool implementations
│ ├── mod.rs
│ ├── create_pr.rs
│ ├── create_work_item.rs
│ ├── memory.rs
│ ├── missing_data.rs
│ ├── missing_tool.rs
│ ├── noop.rs
│ └── result.rs
├── templates/
│ ├── base.yml # Base pipeline template for standalone
│ ├── 1es-base.yml # Base pipeline template for 1ES target
│ └── threat-analysis.md # Threat detection analysis prompt template
├── mcp-metadata.json # Bundled MCP tool definitions
├── examples/ # Example agent definitions
├── tests/ # Integration tests and fixtures
├── Cargo.toml # Rust dependencies
└── README.md # Project documentation
```

## Technology Stack
Expand Down Expand Up @@ -305,8 +304,8 @@ When using `target: 1es`, the pipeline will extend `1es/1ES.Unofficial.PipelineT

The compiler transforms the input into valid Azure DevOps pipeline YAML based on the target platform:

- **Standalone**: Uses `agentic-pipelines/templates/base.yml`
- **1ES**: Uses `agentic-pipelines/templates/1es-base.yml`
- **Standalone**: Uses `templates/base.yml`
- **1ES**: Uses `templates/1es-base.yml`

Explicit markings are embedded in these templates that the compiler is allowed to replace e.g. `{{ agency_params }}` denotes parameters which are passed to the agency command line tool. The compiler should not replace sections denoted by `${{ some content }}`. What follows is a mapping of markings to responsibilities (primarily for the standalone template).

Expand Down Expand Up @@ -821,7 +820,6 @@ Following the gh-aw security model:

```bash
# Build the compiler
cd agentic-pipelines
cargo build

# Run tests
Expand Down Expand Up @@ -1121,7 +1119,7 @@ This prevents tool name collisions and makes it clear which upstream handles eac

```bash
# Start the MCP firewall server
agentic-pipelines mcp-firewall --config /path/to/config.json
ado-aw mcp-firewall --config /path/to/config.json
```

### Pipeline Integration
Expand All @@ -1136,7 +1134,7 @@ The firewall config is written to `$(Agent.TempDirectory)/staging/mcp-firewall-c

### Audit Logging

All tool call attempts are logged to the centralized log file at `$HOME/.agentic-pipelines/logs/YYYY-MM-DD.log`:
All tool call attempts are logged to the centralized log file at `$HOME/.ado-aw/logs/YYYY-MM-DD.log`:

```
[2026-01-29T10:15:32Z] [INFO] [firewall] ALLOWED icm:create_incident (args: {"title": "...", "severity": 3})
Expand Down
2 changes: 1 addition & 1 deletion agentic-pipelines/Cargo.lock → Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion agentic-pipelines/Cargo.toml → Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[package]
name = "agentic-pipelines"
name = "ado-aw"
version = "0.1.0"
edition = "2024"

Expand Down
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
2 changes: 1 addition & 1 deletion agentic-pipelines/src/create.rs → src/create.rs
Original file line number Diff line number Diff line change
Expand Up @@ -330,7 +330,7 @@ pub async fn create_agent(output_dir: Option<PathBuf>) -> Result<()> {
println!("\nNext steps:");
println!(" 1. Edit the file to add your agent instructions");
println!(
" 2. Compile with: agentic-pipelines compile {}",
" 2. Compile with: ado-aw compile {}",
output_path.display()
);
println!(" 3. Commit both the .md and generated .yml files");
Expand Down
File renamed without changes.
File renamed without changes.
14 changes: 7 additions & 7 deletions agentic-pipelines/src/logging.rs → src/logging.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
//! Centralized file-based logging for agentic-pipelines
//! Centralized file-based logging for ado-aw
//!
//! All commands log to `$HOME/.agentic-pipelines/logs/` with daily log files.
//! All commands log to `$HOME/.ado-aw/logs/` with daily log files.
//! Each session is marked with timestamp, build ID (if in pipeline), and command name.
//! In pipeline environments, these logs are copied to the staging directory for artifact upload.

Expand All @@ -14,11 +14,11 @@ use std::sync::Mutex;

/// Get the standard log directory path
///
/// Returns `$HOME/.agentic-pipelines/logs/` on Unix/macOS
/// Returns `%USERPROFILE%\.agentic-pipelines\logs\` on Windows
/// Returns `$HOME/.ado-aw/logs/` on Unix/macOS
/// Returns `%USERPROFILE%\.ado-aw\logs\` on Windows
pub fn log_directory() -> Result<PathBuf> {
let home = dirs::home_dir().context("Could not determine home directory")?;
Ok(home.join(".agentic-pipelines").join("logs"))
Ok(home.join(".ado-aw").join("logs"))
}

/// Get the path for today's log file
Expand Down Expand Up @@ -105,7 +105,7 @@ impl log::Log for FileLogger {

/// Initialize file-based logging for a command
///
/// Creates/appends to today's log file at `$HOME/.agentic-pipelines/logs/YYYY-MM-DD.log`
/// Creates/appends to today's log file at `$HOME/.ado-aw/logs/YYYY-MM-DD.log`
/// and writes a session marker with build context for correlation.
///
/// # Arguments
Expand Down Expand Up @@ -201,7 +201,7 @@ mod tests {
fn test_log_directory() {
let dir = log_directory().unwrap();
assert!(
dir.ends_with(".agentic-pipelines/logs") || dir.ends_with(".agentic-pipelines\\logs")
dir.ends_with(".ado-aw/logs") || dir.ends_with(".ado-aw\\logs")
);
}

Expand Down
4 changes: 2 additions & 2 deletions agentic-pipelines/src/main.rs → src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -107,10 +107,10 @@ async fn main() -> Result<()> {
Some(Commands::Execute { .. }) => "execute",
Some(Commands::Proxy { .. }) => "proxy",
Some(Commands::McpFirewall { .. }) => "mcp-firewall",
None => "agentic-pipelines",
None => "ado-aw",
};

// Initialize file-based logging to $HOME/.agentic-pipelines/logs/{command}.log
// Initialize file-based logging to $HOME/.ado-aw/logs/{command}.log
let _log_path = logging::init_logging(command_name, args.debug, args.verbose);

if let Some(command) = args.command {
Expand Down
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Loading
Loading