Files
wehub-resource-sync 8a21a212f8
Deploy Documentation / deploy (push) Has been cancelled
Canary / build-cli (push) Has been skipped
Canary / Upload Install Script (push) Has been skipped
Canary / bundle-desktop (push) Has been skipped
Canary / bundle-desktop-intel (push) Has been skipped
Canary / bundle-desktop-linux (push) Has been skipped
Canary / bundle-desktop-windows (push) Has been skipped
Canary / bundle-desktop-windows-cuda (push) Has been skipped
Canary / Release (push) Has been skipped
Cargo Deny / deny (push) Has been skipped
Unused Dependencies / machete (push) Has been skipped
Canary / Prepare Version (push) Failing after 1s
Live Provider Tests / check-fork (push) Failing after 0s
Create Minor Release PR / check-version-bump-pr (push) Has been skipped
Publish Ask AI Bot Docker Image / docker (push) Failing after 1s
Live Provider Tests / changes (push) Has been skipped
Scorecard supply-chain security / Scorecard analysis (push) Has been skipped
Publish Docker Image / docker (push) Failing after 1s
CI / changes (push) Failing after 8s
Create Minor Release PR / release (push) Has been skipped
Live Provider Tests / Smoke Tests (push) Has been cancelled
Live Provider Tests / Smoke Tests (Code Execution) (push) Has been cancelled
Live Provider Tests / Compaction Tests (push) Has been cancelled
CI / Build Rust Project on Windows (push) Has been cancelled
Live Provider Tests / Build Binary (push) Has been cancelled
CI / Lint Rust Code (push) Has been cancelled
CI / Check Generated Schemas are Up-to-Date (push) Has been cancelled
CI / Test and Lint Electron Desktop App (push) Has been cancelled
CI / Check Rust Code Format (push) Has been cancelled
CI / Build and Test Rust Project (push) Has been cancelled
CI / Check MSRV (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:04:08 +08:00

337 lines
14 KiB
Markdown

# CLI Command Tracking
Automated pipeline for detecting and documenting CLI command changes between goose releases.
## Overview
This automation keeps the [CLI Commands Guide](https://goose-docs.ai/docs/guides/goose-cli-commands) synchronized with code changes by:
1. **Extracting** CLI structure from goose binary using `--help` output (deterministic)
2. **Detecting** changes between versions (deterministic diff)
3. **Synthesizing** human-readable change documentation (AI-powered)
4. **Updating** the CLI Commands Guide (AI-powered)
The automation runs automatically on new releases via GitHub Actions, or can be run manually for testing.
## Quick Start
### Automated (GitHub Actions)
The automation runs automatically when a new release is published. See [TESTING.md](./TESTING.md) for testing instructions.
### Manual (Local Testing)
```bash
# Set the goose repository path
export GOOSE_REPO=/path/to/goose
# Run the complete pipeline with auto-detected versions
./scripts/run-pipeline.sh
# Or specify versions explicitly
./scripts/run-pipeline.sh v1.17.0 v1.19.0
# Or run individual steps:
# 1. Extract CLI structures
./scripts/extract-cli-structure.sh v1.17.0 > output/old-cli-structure.json
./scripts/extract-cli-structure.sh v1.19.0 > output/new-cli-structure.json
# 2. Detect changes
python3 scripts/diff-cli-structures.py output/old-cli-structure.json \
output/new-cli-structure.json \
> output/cli-changes.json
# 3. Generate human-readable change documentation
cd output && goose run --recipe ../recipes/synthesize-cli-changes.yaml
# 4. Update goose-cli-commands.md
cd output && goose run --recipe ../recipes/update-cli-commands.yaml
```
### Version Detection
The pipeline automatically detects versions when not specified:
- **Old version**: Second-most-recent release tag (via `gh release list`)
- **New version**: Most recent release tag, or `RELEASE_TAG` env var (for CI)
- **Fallback**: Uses git tags if `gh` CLI not available
To test unreleased changes, explicitly pass `HEAD`:
```bash
./scripts/run-pipeline.sh v1.19.0 HEAD
```
## Architecture
### Modular Pipeline Design
The automation uses a **hybrid approach**: deterministic scripts for data extraction/diffing, AI recipes for analysis and documentation updates.
```
┌─────────────────────────────────────────────────────────────────┐
│ EXTRACTION (Deterministic) │
├─────────────────────────────────────────────────────────────────┤
│ extract-cli-structure.sh → extract-cli-structure.py │
│ ↓ │
│ cli-structure.json (commands, options, subcommands, aliases) │
└─────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│ DIFFING (Deterministic) │
├─────────────────────────────────────────────────────────────────┤
│ diff-cli-structures.py │
│ ↓ │
│ cli-changes.json (added, removed, modified commands/options) │
└─────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│ SYNTHESIS (AI-Powered) │
├─────────────────────────────────────────────────────────────────┤
│ synthesize-cli-changes.yaml │
│ ↓ │
│ cli-changes.md (human-readable) │
└─────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│ UPDATE (AI-Powered) │
├─────────────────────────────────────────────────────────────────┤
│ update-cli-commands.yaml │
│ ↓ │
│ goose-cli-commands.md (updated) + update-summary.md │
└─────────────────────────────────────────────────────────────────┘
```
### Why This Design?
**Scripts handle deterministic tasks:**
- Building goose from specific git tags
- Running `--help` commands and parsing output
- JSON structure comparison
- No interpretation or inference - direct extraction
**AI recipes handle synthesis and updates:**
- Analyzing changes and explaining implications
- Generating migration guidance and examples
- Updating documentation with proper formatting and context
**Benefits:**
- **Reliability**: Extraction is deterministic and reproducible
- **Testability**: Each stage has clear inputs/outputs
- **Maintainability**: Easy to update individual components
- **Transparency**: Intermediate files can be inspected
### Data Flow
All stages communicate via JSON/Markdown files in the `output/` directory:
| File | Producer | Consumer | Purpose |
|------|----------|----------|---------|
| `old-cli-structure.json` | `extract-cli-structure.sh` | `diff-cli-structures.py` | Previous version CLI structure |
| `new-cli-structure.json` | `extract-cli-structure.sh` | `diff-cli-structures.py` | Current version CLI structure |
| `cli-changes.json` | `diff-cli-structures.py` | `synthesize-cli-changes.yaml` | Detected changes (structured) |
| `cli-changes.md` | `synthesize-cli-changes.yaml` | `update-cli-commands.yaml` | Human-readable change documentation |
| `update-summary.md` | `update-cli-commands.yaml` | Human review | Summary of documentation updates |
## Configuration
### Environment Variables
| Variable | Required | Default | Description |
|----------|----------|---------|-------------|
| `GOOSE_REPO` | Yes (local) | - | Path to goose repository root |
| `CLI_COMMANDS_PATH` | No | `$GOOSE_REPO/documentation/docs/guides/goose-cli-commands.md` | Full path to target doc file |
| `RELEASE_TAG` | No | - | Used by GitHub Actions to specify the new version |
**Example:**
```bash
export GOOSE_REPO=/Users/you/goose
# CLI_COMMANDS_PATH is auto-constructed from GOOSE_REPO
```
### Skipped Commands
Some commands are intentionally excluded from extraction and documentation tracking. These are configured in `config/skip-commands.json`:
```json
{
"description": "Commands to skip during extraction (not documented intentionally)",
"skip_commands": [
{
"name": "term",
"reason": "Terminal integration documented via @goose/@g aliases"
}
]
}
```
To add or remove skipped commands, edit the config file - no code changes required.
## Scripts
### `extract-cli-structure.sh`
Builds goose from a specific git tag and extracts CLI structure using `--help` output.
**Usage:**
```bash
./scripts/extract-cli-structure.sh [version] > output/cli-structure.json
```
**Arguments:**
- `version` (optional): Git tag or commit to extract from (default: HEAD)
**Output:** JSON with complete command tree including options, subcommands, aliases
**Example:**
```bash
# Extract from current code
./scripts/extract-cli-structure.sh HEAD > output/new-cli-structure.json
# Extract from specific version
./scripts/extract-cli-structure.sh v1.15.0 > output/old-cli-structure.json
```
### `diff-cli-structures.py`
Compares two CLI structure files and outputs detected changes.
**Usage:**
```bash
python3 scripts/diff-cli-structures.py <old-file> <new-file> > output/cli-changes.json
```
**Arguments:**
- `old-file`: Path to old CLI structure JSON
- `new-file`: Path to new CLI structure JSON
**Output:** JSON with categorized changes:
- `commands.added`: New commands
- `commands.removed`: Deleted commands
- `commands.modified`: Changed commands (options, description, aliases)
- `breaking_changes`: Categorized breaking changes
**Example:**
```bash
python3 scripts/diff-cli-structures.py \
output/old-cli-structure.json \
output/new-cli-structure.json \
> output/cli-changes.json
```
## Recipes
### `synthesize-cli-changes.yaml`
Analyzes detected changes and generates human-readable documentation.
**Inputs:**
- `output/cli-changes.json` - Detected changes from diff script
- `output/old-cli-structure.json` - Previous version structure
- `output/new-cli-structure.json` - Current version structure
**Output:**
- `output/cli-changes.md` - Human-readable change documentation with:
- Breaking changes with migration guidance
- New commands with usage examples
- Modified commands with details
- Non-breaking changes summary
**Usage:**
```bash
cd output
goose run --recipe ../recipes/synthesize-cli-changes.yaml
```
### `update-cli-commands.yaml`
Updates the CLI Commands Guide based on synthesized changes.
**Inputs:**
- `output/cli-changes.md` - Change documentation from synthesis recipe
- `goose-cli-commands.md` - Target documentation file (path from `CLI_COMMANDS_PATH` or `GOOSE_REPO` env var)
**Outputs:**
- Updated `goose-cli-commands.md` with changes applied
- `output/update-summary.md` - Summary of changes for review
**Usage:**
```bash
export CLI_COMMANDS_PATH=/path/to/goose-cli-commands.md
cd output
goose run --recipe ../recipes/update-cli-commands.yaml
```
## Directory Structure
```
cli-command-tracking/
├── README.md # This file
├── TESTING.md # Testing guide for GitHub Actions workflow
├── .gitignore # Excludes output/ directory
├── config/ # Configuration files
│ └── skip-commands.json # Commands to exclude from tracking
├── scripts/ # Extraction and diff scripts
│ ├── extract-cli-structure.sh # Wrapper that builds goose and runs Python
│ ├── extract-cli-structure.py # Python script to parse --help output
│ ├── diff-cli-structures.py # Compare structures and detect changes
│ └── run-pipeline.sh # End-to-end pipeline runner
├── recipes/ # AI recipes
│ ├── synthesize-cli-changes.yaml # Generate change docs
│ └── update-cli-commands.yaml # Update documentation
├── .github/workflows/ # GitHub Actions workflow
│ └── docs-update-cli-ref.yml # Workflow definition
└── output/ # Generated files (gitignored)
├── old-cli-structure.json # Previous version structure
├── new-cli-structure.json # Current version structure
├── cli-changes.json # Detected changes (structured)
├── cli-changes.md # Change documentation (human-readable)
├── update-summary.md # Documentation update summary
└── pipeline.log # Pipeline execution log
```
## GitHub Actions Workflow
The automation runs via `.github/workflows/docs-update-cli-ref.yml`:
- **Trigger**: Automatically on new releases, or manually for testing
- **Process**: Builds goose for both versions, extracts CLI structures, detects changes, updates documentation
- **Output**: Creates a PR with updated `goose-cli-commands.md` if changes detected
- **Testing**: See [TESTING.md](./TESTING.md) for detailed testing instructions
## What Gets Tracked
### Commands
- ✅ Commands added/removed
- ✅ Command descriptions changed
- ✅ Command aliases added/removed
- ✅ Subcommands added/removed
### Options
- ✅ Options added/removed
- ✅ Option help text changed
- ✅ Default values changed
- ✅ Possible values changed (enums)
- ✅ Short/long flags changed
### Breaking Changes (Auto-Categorized)
- Command removed (high severity)
- Option removed (high severity)
- Option renamed (high severity)
- Default value changed (medium severity)
- Enum values removed (high severity)
- Alias removed (medium severity)
## Maintenance
When modifying the automation:
1. **Test locally first**: Run `./scripts/run-pipeline.sh` with test versions
2. **Verify outputs**: Check generated files against actual CLI changes
3. **Test in fork**: Use GitHub Actions workflow with dry-run mode
4. **Document changes**: Update this README with design decisions
## Related Documentation
- [TESTING.md](./TESTING.md) - How to test the GitHub Actions workflow
- [Automation Overview](../README.md) - All automation projects
- [CLI Commands Guide](../../docs/guides/goose-cli-commands.md) - Target documentation