You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Automated inspection of the gh-aw CLI (all top-level commands + subcommands of env, mcp, secrets, pr, project) against its own --help output and docs/src/content/docs/setup/cli.md. Overall the CLI is clean and consistent; a handful of documentation gaps, one inverted convention, and several minor naming inconsistencies were found.
Method: Built gh-aw from source, ran --help for every command/subcommand, captured ~2200 lines of output, and analyzed it with three focused passes: typo/grammar, docs-vs-help diff, and flag-naming consistency.
Severity breakdown: High: 1 · Medium: 6 · Low: 10
🔴 High severity
1. audit docs describe wrong default output path
Docs says (docs/src/content/docs/setup/cli.md): "Logs are saved to logs/run-{id}/ with filenames indicating the extraction level."
Actual CLI (gh-aw audit --help): -o, --output string Output directory for generated files (default ".github/aw/logs")
Issue: The real default output path is .github/aw/logs/run-{id}/, not logs/run-{id}/. This could send users looking in the wrong directory.
Suggested fix: Update docs to say .github/aw/logs/run-{id}/.
🟠 Medium severity
6 medium-severity findings (click to expand)
2. audit --artifacts valid values list missing evals
Docs says: "Valid sets include activation, agent, all, detection, experiment, firewall, github-api, mcp, and usage."
Actual CLI: --artifacts strings ... Valid sets: activation, agent, all, detection, evals, experiment, firewall, github-api, mcp, usage
Issue: Docs omit the valid evals artifact set.
Suggested fix: Add evals to the documented list.
3. fix inverts the --dry-run convention used everywhere else
Affected commands: run, trial, env update use an opt-in --dry-run flag (dry-run is off by default). fix instead defaults to dry-run and requires an opt-in --write flag: --write Write changes to files (without this flag, no changes are made).
Issue: Same underlying concept ("preview vs apply changes") is expressed with an inverted flag polarity in fix compared to the rest of the CLI, which can confuse users switching between commands.
Suggested fix: Either add a --dry-run alias to fix for consistency, or explicitly call out the inverted convention in the command's long description (partially done today via "dry-run by default" but not flagged as an exception to CLI-wide convention).
4. -l shorthand maps to two different flags depending on command
Affected commands: compile/trial use -l, --logical-repo string (repository to simulate workflow execution against); project new uses -l, --link string (repository to link project to).
Issue: Same shorthand (-l), different semantics — easy to mistype/misremember across commands.
Suggested fix: Reserve -l for one meaning CLI-wide, or drop the shorthand alias for one of the two flags.
5. --repo help text format inconsistent across commands (GHES host prefix)
Affected commands: Most commands (e.g. audit, checks, disable, enable) document --repo as Target repository ([HOST/]owner/repo format). Defaults to current repository. But doctor and env get/env update document it as just Target repository (owner/repo format) — no [HOST/] prefix mentioned.
Issue: Unclear whether GHES host-qualified repo values (HOST/owner/repo) are supported in doctor/env get/env update, or if the help text is simply out of sync with the rest of the CLI.
Suggested fix: Standardize the --repo flag help string (ideally from a single shared template) across all commands.
6. --force flag reused for three unrelated meanings
Affected commands: add -f/--force ("Overwrite existing workflow files without confirmation"), deploy -f/--force (file overwrite) + deploy -y/--yes (org-mode bulk confirmation) simultaneously, and update --force ("force update even if no changes").
Issue: --force and --yes both express "skip confirmation," but for different sub-concerns, and --force additionally has a third, unrelated meaning in update (bypass no-op detection).
Suggested fix: Reserve --force strictly for destructive overwrite actions and --yes/-y strictly for prompt auto-accept; document each command's specific semantics explicitly, and avoid reusing --force for "override no-op detection" in update.
7. Top-level --version flag undocumented in Global Options
Docs says: Global Options table only lists -h/--help, -v/--verbose, --banner.
Actual CLI: gh-aw --help also lists --version Print the current version as a top-level global flag (in addition to the gh aw version subcommand).
Suggested fix: Add --version to the Global Options table in cli.md.
11. fix --help numbered list mixes verb tense/form
Quote: Item 4 "Writes updated files back to disk." vs items 5-8 "Delete deprecated .github/aw/schemas/agentic-workflow.json file if it exists.", "Delete old template files...", "Refresh the dispatcher skill..."
Issue: Inconsistent verb form (present tense "Writes" vs imperative "Delete"/"Refresh") within the same numbered list.
Suggested fix: Normalize all list items to one consistent verb form (e.g., all imperative: "Write... / Delete... / Delete... / Delete... / Refresh...").
12. --repo (singular) vs --repos (plural glob filter) naming too similar
Affected commands: deploy, update, upgrade — --repo (single target repo) vs --repos (glob patterns, only used with --org).
Issue: The two flags differ only by a trailing "s" but represent very different concepts (single target vs. multi-repo glob filter), which is easy to confuse in scripts/docs.
Suggested fix: Consider renaming --repos to something more distinct, e.g. --repo-filter or --org-repos.
13. Inconsistent boolean negation pattern (--no-X only vs paired --flag/--no-flag)
Affected commands: add/add-wizard/fix/init/update/upgrade ship negative-only flags like --no-gitattributes, --no-security-scanner, --no-stop-after (implying default true, no positive counterpart). logs instead ships both--firewall and --no-firewall as separate flags, duplicating surface area versus the single-flag pattern used elsewhere.
Suggested fix: Standardize on a single boolean flag per concept following the Cobra --flag/--no-flag convention; avoid shipping both a positive and negative flag for the same boolean where one flag would suffice.
14. --label (singular, single value) vs strings-typed plural flags elsewhere
Affected commands: list/status use --label string (single value only) while logs/audit use --artifacts strings (multi-value) and deploy/update/upgrade use --repos strings (multi-value).
Issue: No indication in the flag name whether multiple labels can be filtered; inconsistent with the strings-typed multi-value pattern used for similar filters elsewhere.
Suggested fix: If multi-label filtering is ever needed, add a strings-typed --labels flag for consistency; otherwise no action needed, but worth a docs note.
15. -o/--output default value documented inconsistently
Affected commands: audit/logs document -o, --output string Output directory for generated files (default ".github/aw/logs"), but outcomes shows -o, --output string Output directory for generated files with no default value shown.
Suggested fix: Ensure all -o/--output flags document their default value consistently (or confirm outcomes has no default and note that explicitly).
16. logs --last duplicates --count/-c
Quote: -c, --count int Maximum number of matching workflow runs to return...(default 10) and --last int Alias for --count/-c: number of recent runs to download.
Issue: Two flags providing identical behavior in the same command is redundant flag surface not seen in similar commands (forecast --sample, health --days).
Suggested fix: Consider deprecating --last in favor of --count/-c, or clearly mark it as a deprecated alias in the help text (it is already called an "Alias" but could be marked deprecated).
17. remove lacks a confirmation-skip flag present on similar destructive commands
Affected command: remove (deletes workflow files) only exposes --dir, --no-remove-orphans — no -f/--force or -y/--yes, unlike add/deploy/new (-f/--force) or trial/update/upgrade/deploy (-y/--yes).
Suggested fix: Consider adding a confirmation-skip flag to remove for consistency, or explicitly document that remove is always non-interactive by design.
Method: Built the gh-aw binary from the repo source, collected --help output for every command/subcommand (~2200 lines total), then ran three focused analysis passes (typo/grammar extraction, docs-vs-help diff against docs/src/content/docs/setup/cli.md, and flag-naming/negation-style consistency) over the captured output.
Note: No spelling typos, broken examples, or incorrect .github/workflows path references were found; the documentation is largely accurate and in sync with the CLI.
Warning
Firewall blocked 1 domain
The following domain was blocked by the firewall during workflow execution:
proxy.golang.org
To allow these domains, add them to the network.allowed list in your workflow frontmatter:
Caution
agentic threat detected
Threat detection flagged this output in warn mode. Manual review is REQUIRED before any follow-up automation.
Details
The threat detection engine failed to produce results.
Review the workflow run logs for details.
Summary
Automated inspection of the
gh-awCLI (all top-level commands + subcommands ofenv,mcp,secrets,pr,project) against its own--helpoutput anddocs/src/content/docs/setup/cli.md. Overall the CLI is clean and consistent; a handful of documentation gaps, one inverted convention, and several minor naming inconsistencies were found.Method: Built
gh-awfrom source, ran--helpfor every command/subcommand, captured ~2200 lines of output, and analyzed it with three focused passes: typo/grammar, docs-vs-help diff, and flag-naming consistency.Severity breakdown: High: 1 · Medium: 6 · Low: 10
🔴 High severity
1.
auditdocs describe wrong default output pathdocs/src/content/docs/setup/cli.md): "Logs are saved tologs/run-{id}/with filenames indicating the extraction level."gh-aw audit --help):-o, --output string Output directory for generated files (default ".github/aw/logs").github/aw/logs/run-{id}/, notlogs/run-{id}/. This could send users looking in the wrong directory..github/aw/logs/run-{id}/.🟠 Medium severity
6 medium-severity findings (click to expand)
2.
audit --artifactsvalid values list missingevalsactivation,agent,all,detection,experiment,firewall,github-api,mcp, andusage."--artifacts strings ... Valid sets: activation, agent, all, detection, evals, experiment, firewall, github-api, mcp, usageevalsartifact set.evalsto the documented list.3.
fixinverts the--dry-runconvention used everywhere elserun,trial,env updateuse an opt-in--dry-runflag (dry-run is off by default).fixinstead defaults to dry-run and requires an opt-in--writeflag:--write Write changes to files (without this flag, no changes are made).fixcompared to the rest of the CLI, which can confuse users switching between commands.--dry-runalias tofixfor consistency, or explicitly call out the inverted convention in the command's long description (partially done today via "dry-run by default" but not flagged as an exception to CLI-wide convention).4.
-lshorthand maps to two different flags depending on commandcompile/trialuse-l, --logical-repo string(repository to simulate workflow execution against);project newuses-l, --link string(repository to link project to).-l), different semantics — easy to mistype/misremember across commands.-lfor one meaning CLI-wide, or drop the shorthand alias for one of the two flags.5.
--repohelp text format inconsistent across commands (GHES host prefix)audit,checks,disable,enable) document--repoasTarget repository ([HOST/]owner/repo format). Defaults to current repository. Butdoctorandenv get/env updatedocument it as justTarget repository (owner/repo format)— no[HOST/]prefix mentioned.HOST/owner/repo) are supported indoctor/env get/env update, or if the help text is simply out of sync with the rest of the CLI.--repoflag help string (ideally from a single shared template) across all commands.6.
--forceflag reused for three unrelated meaningsadd -f/--force("Overwrite existing workflow files without confirmation"),deploy -f/--force(file overwrite) +deploy -y/--yes(org-mode bulk confirmation) simultaneously, andupdate --force("force update even if no changes").--forceand--yesboth express "skip confirmation," but for different sub-concerns, and--forceadditionally has a third, unrelated meaning inupdate(bypass no-op detection).--forcestrictly for destructive overwrite actions and--yes/-ystrictly for prompt auto-accept; document each command's specific semantics explicitly, and avoid reusing--forcefor "override no-op detection" inupdate.7. Top-level
--versionflag undocumented in Global Options-h/--help,-v/--verbose,--banner.gh-aw --helpalso lists--version Print the current versionas a top-level global flag (in addition to thegh aw versionsubcommand).--versionto the Global Options table incli.md.🟡 Low severity
10 low-severity findings (click to expand)
8.
forecast --concurrencyflag undocumentedforecastOptions list):--days,--period,--sample,--eval,--timeout,--repo/-r,--json/-j.--concurrency int Maximum number of concurrent usage-artifact downloads (0 = use default)is present but missing from docs.--concurrencyto the documentedforecastoptions.9.
secrets bootstrap --reposhort alias-rundocumented--repowithout noting the-rshort alias, inconsistent with how other commands document--repo/-rtogether.-r, --repo string Target repository...--repo/-rfor consistency with other commands.10.
project new --help: "Tracker Id" capitalization inconsistentCustom fields (Tracker Id, Worker Workflow, Target Repo, Priority, Size, dates)Custom fields (Tracker ID, Worker Workflow, Target Repo, Priority, Size, dates)11.
fix --helpnumbered list mixes verb tense/form12.
--repo(singular) vs--repos(plural glob filter) naming too similardeploy,update,upgrade—--repo(single target repo) vs--repos(glob patterns, only used with--org).--reposto something more distinct, e.g.--repo-filteror--org-repos.13. Inconsistent boolean negation pattern (
--no-Xonly vs paired--flag/--no-flag)add/add-wizard/fix/init/update/upgradeship negative-only flags like--no-gitattributes,--no-security-scanner,--no-stop-after(implying default true, no positive counterpart).logsinstead ships both--firewalland--no-firewallas separate flags, duplicating surface area versus the single-flag pattern used elsewhere.--flag/--no-flagconvention; avoid shipping both a positive and negative flag for the same boolean where one flag would suffice.14.
--label(singular, single value) vsstrings-typed plural flags elsewherelist/statususe--label string(single value only) whilelogs/audituse--artifacts strings(multi-value) anddeploy/update/upgradeuse--repos strings(multi-value).strings-typed multi-value pattern used for similar filters elsewhere.strings-typed--labelsflag for consistency; otherwise no action needed, but worth a docs note.15.
-o/--outputdefault value documented inconsistentlyaudit/logsdocument-o, --output string Output directory for generated files (default ".github/aw/logs"), butoutcomesshows-o, --output string Output directory for generated fileswith no default value shown.-o/--outputflags document their default value consistently (or confirmoutcomeshas no default and note that explicitly).16.
logs --lastduplicates--count/-c-c, --count int Maximum number of matching workflow runs to return...(default 10)and--last int Alias for --count/-c: number of recent runs to download.forecast --sample,health --days).--lastin favor of--count/-c, or clearly mark it as a deprecated alias in the help text (it is already called an "Alias" but could be marked deprecated).17.
removelacks a confirmation-skip flag present on similar destructive commandsremove(deletes workflow files) only exposes--dir,--no-remove-orphans— no-f/--forceor-y/--yes, unlikeadd/deploy/new(-f/--force) ortrial/update/upgrade/deploy(-y/--yes).removefor consistency, or explicitly document thatremoveis always non-interactive by design.Inspection metadata
gh-awcommands (add,add-wizard,audit,checks,compile,completion,deploy,disable,doctor,domains,enable,env,experiments,fix,forecast,hash-frontmatter,health,init,lint,list,logs,mcp,mcp-server,new,outcomes,pr,project,remove,run,secrets,status,trial,update,upgrade,validate,version) plus subcommands ofenv,mcp,secrets,pr,project.gh-awbinary from the repo source, collected--helpoutput for every command/subcommand (~2200 lines total), then ran three focused analysis passes (typo/grammar extraction, docs-vs-help diff againstdocs/src/content/docs/setup/cli.md, and flag-naming/negation-style consistency) over the captured output..github/workflowspath references were found; the documentation is largely accurate and in sync with the CLI.Warning
Firewall blocked 1 domain
The following domain was blocked by the firewall during workflow execution:
proxy.golang.orgTo allow these domains, add them to the
network.allowedlist in your workflow frontmatter:See Network Configuration for more information.