feat(#25): prefix user-facing Azure DevOps PowerShell functions with az-#26
Conversation
🐚 Senior Bash EngineerSummaryThis PR renames PowerShell functions in Diff ScopeFindingsNone — there is no bash surface area in this changeset to review. Bash parity for the renamed PowerShell Sourcing Wire-UpN/A — no new files under Naming ConventionN/A — no bash aliases or functions added/modified. VerdictAPPROVE — no bash files in this diff Generated by Claude Code |
🛡️ Senior Security EngineerVerdict: APPROVE — no security findings. Scope reviewedDiff against
This is a pure literal rename. No new logic, no new external calls, no new env-var reads, no new string interpolation, no new file/path operations. Audit checklist
Bottom linePure renames don't typically introduce vulnerabilities, and this one doesn't either. The auth gate is intact, URL construction is unchanged, no Generated by Claude Code |
🧼 Senior Clean-Code EngineerSummarySingle-commit branch ( Findings
Duplication MapNo new duplicated blocks. The existing Function Sizes
Notes (informational, not blocking)
VerdictAPPROVE — pure mechanical rename, no new duplication, no oversized functions introduced, all shared helpers preserved. Ship it. https://claude.ai/code/session_01YX2HXczqxkhQD5tsUqtdY1 Generated by Claude Code |
💠 Senior PowerShell EngineerSummarySingle-commit PR ( Findings
No CRITICAL, HIGH, MEDIUM, or LOW findings. Rename completeness audit18 user-facing functions prefixed (matches issue #25 scope):
Internal helpers correctly left unprefixed — confirmed by enumerating callers:
Stale-reference auditZero unprefixed references to any of the 18 renamed functions remain inside the file. This includes:
Bash parity
Standard PowerShell rules from the skill
Approved VerbsINFO — non-approved literal Dot-Sourcing Wire-UpWIRED — VerdictAPPROVE — no blocking issues. Rename is consistent across the 18 user-facing functions, all internal callers and user-facing strings updated, README in sync, internal helpers correctly excluded. Recommend the user verify in a fresh PowerShell session with Generated by Claude Code |
✅ Criteria Check — #25: Add
|
| # | Criterion | Status | Evidence |
|---|---|---|---|
| 1 | Every user-facing function renamed to az-<OriginalName> |
✅ VERIFIED | grep -c "^function az-" powcuts_by_cli/azdevops_workitems.ps1 → 18 matches; all 18 from the issue's rename table accounted for at lines 91, 124, 144, 161, 183, 201, 213, 230, 576, 646, 737, 768, 991, 1009, 1097, 1137, 1269, 1742 |
| 2 | Internal/helper functions are not renamed | ✅ VERIFIED (with note) | Sample preserved: Test-AzDevOpsCliPresent:53, ConvertFrom-AzDevOpsAssignedItem:811, Read-AzDevOpsJsonCache:826, Find-AzDevOpsCachedWorkItem:929, Open-AzDevOpsWorkItemUrl:961, Get-AzDevOpsClassificationPaths:1448. Confirm- as internal, but the issue's explicit rename table and the file's own header (lines 13–22, "Step functions invoked by az-Connect-AzDevOps — also exposed for direct use") classify Confirm-AzDevOps* + Set-AzDevOpsDefaults as user-facing step entry points. Followed the explicit table + file header, which are the sources of truth. |
| 3 | All in-file callers updated to new names (no stale references) | ✅ VERIFIED | Full-repo grep `(Connect-AzDevOps |
| 4 | No Set-Alias shims for old names |
✅ VERIFIED | grep -nE 'Set-Alias' powcuts_by_cli/azdevops_workitems.ps1 → no matches. |
| 5 | pwsh -NoProfile parses with zero errors |
🔍 MANUAL | pwsh not on PATH in review env. PowerShell-engineer review relied on visual diff inspection and reported zero parse-blocking issues. User to verify locally. |
| 6 | az- + tab-tab in fresh PowerShell shows all 18 renamed functions |
🔍 MANUAL | Function definitions present and well-formed; tab-completion is a runtime PowerShell behavior that requires a fresh PS session with $profile dot-sourced. |
| 7 | At least one renamed function (e.g. az-Get-AzDevOpsCacheStatus) executes end-to-end |
🔍 MANUAL | Requires az CLI + an authenticated AzDevOps environment with cache populated; not testable in review sandbox. |
| 8 | README's Azure DevOps section updated | ✅ VERIFIED | grep -c against the renamed names in README.md → 16 occurrences across the Azure DevOps section. The intro paragraph (line 161), prerequisites (lines 166–167), first-run snippet (line 186), day-to-day examples (lines 198–213), stale-cache notice (line 216), live-fetch hint (line 218), and the az-New-AzDevOpsUserStory walk-through (lines 222–243) all reference the prefixed names. Zero unprefixed user-facing references remain. |
Summary
| Status | Count |
|---|---|
| ✅ VERIFIED | 5 |
| 🔍 MANUAL | 3 |
| 0 | |
| ❌ MISSING | 0 |
Manual Verification Checklist
- Local parse-check:
pwsh -NoProfile -Command "[System.Management.Automation.Language.Parser]::ParseFile('powcuts_by_cli/azdevops_workitems.ps1', [ref]\$null, [ref]\$null) | Out-Null; 'PARSE OK'" - Open a fresh PowerShell terminal, dot-source
$profile, typeaz-+ tab-tab → all 18az-*AzDevOps functions appear in the completion list - Run
az-Get-AzDevOpsCacheStatusagainst an environment whereaz-Connect-AzDevOpspreviously reported READY → prints cache freshness with no errors
Verdict
✅ PASS — all 5 automated criteria verified, 3 require manual terminal testing in a real PowerShell session.
Generated by Claude Code
Renames 22 user-facing functions in azdevops_workitems.ps1 (the original 18 plus the 4 user-facing schema-management commands added by PR #22) to start with literal lowercase az- so the full Azure DevOps PowerShell surface is tab-tab-discoverable the same way it already is in bash. New renames vs the original PR #26 commit (rebase onto post-#22 main): Initialize-AzDevOpsSchema -> az-Initialize-AzDevOpsSchema Get-AzDevOpsSchema -> az-Get-AzDevOpsSchema Edit-AzDevOpsSchema -> az-Edit-AzDevOpsSchema Test-AzDevOpsSchema -> az-Test-AzDevOpsSchema Internal helpers (Test-/ConvertFrom-/Read-/Write-/Initialize-/Format-/ Measure-/Invoke-/Get- helpers, plus Find-AzDevOpsCachedWorkItem / Open-AzDevOpsWorkItemUrl / Get-AzDevOpsClassificationPaths and the Assert-AzDevOpsAuthOrAbort / Schema* private helpers) stay unprefixed since they don't surface to user tab-completion. Conflict resolution against post-#22 main: - Adopted main's Assert-AzDevOpsAuthOrAbort helper inside az-Sync-AzDevOpsCache and az-New-AzDevOpsUserStory, replacing the inline Test-AzDevOpsAuth + Write-Host abort pattern from the original PR #26 commit. -CommandName argument updated to the renamed function name in each call site. Header docblock + README.md schema-management section updated to match. https://claude.ai/code/session_01P7znUKccAohZYEwYRBNVfo
d3eefed to
bab9dc3
Compare
🔁 Rebased onto current
|
| Today | After |
|---|---|
Initialize-AzDevOpsSchema |
az-Initialize-AzDevOpsSchema |
Get-AzDevOpsSchema |
az-Get-AzDevOpsSchema |
Edit-AzDevOpsSchema |
az-Edit-AzDevOpsSchema |
Test-AzDevOpsSchema |
az-Test-AzDevOpsSchema |
Internal schema helpers (Get-AzDevOpsSchemaValidTypes, Get-AzDevOpsSchemaWorkItemTypes, Get-AzDevOpsSchemaSystemRefs, Get-AzDevOpsSchemaOrgSlug, Get-AzDevOpsSchemaPaths, Initialize-AzDevOpsSchemaDir, Get-AzDevOpsSchemaForType, New-AzDevOpsSchemaStub, Read-AzDevOpsSchemaFile, Write-AzDevOpsSchemaFile, ConvertFrom-AzDevOpsSchemaToRows, ConvertTo-AzDevOpsSchemaFieldEntry) stay unprefixed per this PR's existing convention — they don't surface to user tab-completion.
Final tally
- 22
az-prefixed user-facing functions (originally 18, +4 schema) - 0 unprefixed user-facing AzDevOps function definitions remain
- Diff vs
main:README.md(58 lines),powcuts_by_cli/azdevops_workitems.ps1(194 lines)
Re-running checks
The previous skill reports (Bash / PowerShell / Security / Clean-Code / Criteria) were against the original d3eefed commit. After this rebase the surface grew by 4 functions and adopted main's Assert-AzDevOpsAuthOrAbort helper — recommend re-running /code-review + /criteria-check against bab9dc3 before merge to confirm nothing regressed.
About PR #27 (wrapper layer)
Per merge-order plan, PR #26 ships first. After merge I'll rebase PR #27 onto the new main, re-applying the wrapper-layer call-site routing using the renamed function names (the new wrappers in azdevops_db.ps1 are internal helpers and stay unprefixed per this PR's convention, so no scope conflict between the two PRs).
https://claude.ai/code/session_01P7znUKccAohZYEwYRBNVfo
Generated by Claude Code
🐚 Senior Bash EngineerSummaryThis PR (rebased onto current Changed Files (vs
|
| Severity | Location | Issue |
|---|---|---|
| — | — | No bash files in this diff; no findings. |
Sourcing Wire-Up
N/A — no new files under bashcuts_by_cli/; .bcut_home is untouched.
Naming Convention
N/A — no bash aliases or functions changed. (PowerShell naming is the PowerShell engineer's purview.)
Syntax / Quoting / macOS start / Bashism Checks
All N/A — no bash files were touched, and the README's only embedded snippets are PowerShell.
Verdict
APPROVE — no bash files in this diff.
https://claude.ai/code/session_01P7znUKccAohZYEwYRBNVfo
Generated by Claude Code
🛡️ Senior Security EngineerVerdict: APPROVE — no security findings. Scope reviewedRe-reviewed against rebased commit Checks performed
Risk summaryRename-only PRs carry minimal security risk. The four areas where renames could have introduced an issue (CLI arg arrays, scheduled-task argument strings, scriptblock dispatch, and the https://claude.ai/code/session_01P7znUKccAohZYEwYRBNVfo Generated by Claude Code |
🧼 Senior Clean-Code EngineerVerdict: REQUEST CHANGES Reviewed However, the rebase + rename surfaced two leftover unprefixed references that the rename pass missed. 🔴 Blocking — broken function call in shared helper
function Assert-AzDevOpsAuthOrAbort {
...
if (Test-AzDevOpsAuth) { # ← line 108: function no longer exists
return $true
}
Write-Host "$CommandName aborted - Test-AzDevOpsAuth returned false. Run Connect-AzDevOps." -ForegroundColor Red
return $false
}The function was renamed to Fix: change line 108 to 🟡 User-facing string + doc references
What's good
Block on the line-108 broken call; the three string/doc fixes can ride along in the same commit. https://claude.ai/code/session_01P7znUKccAohZYEwYRBNVfo Generated by Claude Code |
💠 Senior PowerShell EngineerSummaryRe-review of PR #26 against rebased commit Findings
Dot-Sourcing Wire-UpN/A — no new files; Approved VerbsDRIFT (acknowledged in AC) — every renamed function uses Other checks
VerdictREQUEST CHANGES — 1 CRITICAL + 1 HIGH. The line-108 missed call site silently breaks every auth-gated https://claude.ai/code/session_01P7znUKccAohZYEwYRBNVfo Generated by Claude Code |
The rebase onto post-#22 main adopted the Assert-AzDevOpsAuthOrAbort helper introduced by PR #22, but missed three things flagged by the re-review against bab9dc3: CRITICAL — azdevops_workitems.ps1:108 Assert-AzDevOpsAuthOrAbort internally called the OLD function name Test-AzDevOpsAuth. Since this PR renames Test-AzDevOpsAuth to az-Test-AzDevOpsAuth at line 91, every guarded entry point (az-Sync-AzDevOpsCache, az-New-AzDevOpsUserStory, az-Initialize-AzDevOpsSchema, az-Test-AzDevOpsSchema) would have silently aborted regardless of real auth state. HIGH — line 112 Same helper's user-facing Write-Host message referenced the old unprefixed names (Test-AzDevOpsAuth + Connect-AzDevOps). Now uses az-Test-AzDevOpsAuth + az-Connect-AzDevOps. LOW — doc-comment stragglers at lines 101-105, 1902, 2055 + README:247 Internal doc-strings + the README's schema-section paragraph mentioned the unprefixed names of New-AzDevOpsUserStory, Get-AzDevOpsAssigned, Show-AzDevOpsTree. Updated for consistency. https://claude.ai/code/session_01P7znUKccAohZYEwYRBNVfo
🔧 Re-review findings addressed in
|
| Reviewer | Verdict | Findings |
|---|---|---|
| 🐚 Bash Engineer | ✅ APPROVE | N/A — no bash files in diff |
| 💠 PowerShell Engineer | ❌ REQUEST CHANGES | 1 CRITICAL + 1 HIGH (Assert-AzDevOpsAuthOrAbort:108 + :112) + 4 LOW comments |
| 🛡️ Security Engineer | ✅ APPROVE | No security findings — pure rename, argv arrays unchanged |
| 🧼 Clean-Code Engineer | ❌ REQUEST CHANGES | Same CRITICAL bug + 2 LOW doc-comment stragglers |
Fix applied in 4c9a3ff
| File:Line | Change |
|---|---|
azdevops_workitems.ps1:108 |
if (Test-AzDevOpsAuth) → if (az-Test-AzDevOpsAuth) |
azdevops_workitems.ps1:112 |
Write-Host message: Test-AzDevOpsAuth → az-Test-AzDevOpsAuth, Connect-AzDevOps → az-Connect-AzDevOps |
azdevops_workitems.ps1:101-104 |
Doc-comment refs to Sync-AzDevOpsCache, New-AzDevOpsUserStory, Test-AzDevOpsAuth, Connect-AzDevOps → az- versions |
azdevops_workitems.ps1:1902 |
Doc-comment refs to New-AzDevOpsUserStory, Get-AzDevOpsAssigned, Show-AzDevOpsTree → az- versions |
azdevops_workitems.ps1:2055 |
Doc-comment ref to New-AzDevOpsUserStory → az-New-AzDevOpsUserStory |
README.md:247 |
Schema-section paragraph: 3 unprefixed refs updated |
Sanity check
=== Stragglers after fix ===
(no stragglers)
=== Brace + paren balance ===
open-brace:465 close-brace:465 open-paren:656 close-paren:656
Combined Verdict — post-fix (4c9a3ff)
✅ Ready to merge — the CRITICAL Assert-AzDevOpsAuthOrAbort regression is patched; all 22 user-facing renames + 0 stragglers; security/bash reviews remain APPROVE; clean-code stragglers cleared.
https://claude.ai/code/session_01P7znUKccAohZYEwYRBNVfo
Generated by Claude Code
✅ Criteria Check — Issue #25 (vs
|
| # | Criterion | Status | Evidence |
|---|---|---|---|
| 1 | Every user-facing function renamed to az- (lowercase prefix kept literal) |
✅ VERIFIED | 22 az--prefixed functions defined; grep -cE '^function az-' powcuts_by_cli/azdevops_workitems.ps1 = 22 |
| 2 | Internal helpers NOT renamed | ✅ VERIFIED |
All Test-/ConvertFrom-/Read-/Write-/Initialize-/Format-/Measure-/Invoke- helpers untouched. Scope-expansion note: the issue's "Internal helpers" list mentioned Confirm-AzDevOps* + Set-AzDevOpsDefaults as keep-as-is, but PR #26 prefixed them (defensible — they print user-facing output and would otherwise collide with stock cmdlets in tab-completion). Implementer kept Find-AzDevOpsCachedWorkItem, Open-AzDevOpsWorkItemUrl, Get-AzDevOpsClassificationPaths unprefixed per the issue's Open Question. |
| 3 | All in-file callers updated to new names | ✅ VERIFIED | Final straggler scan returns zero unprefixed user-facing references. Critical fix in 4c9a3ff: Assert-AzDevOpsAuthOrAbort:108 was calling the OLD Test-AzDevOpsAuth; patched to az-Test-AzDevOpsAuth. Three doc-comment stragglers (lines 101-104, 1902, 2055) and README.md:247 also patched. |
| 4 | No Set-Alias shims for old names |
✅ VERIFIED | Zero Set-Alias back-compat shims — clean rename. |
| 5 | pwsh -NoProfile parses with zero errors |
🔍 MANUAL | pwsh not on PATH in this environment. Brace + paren balance preserved across the rebase and the post-fix commit; visual review found no syntax issues. |
| 6 | Tab-completion: az- + tab-tab shows the full surface |
🔍 MANUAL | All 22 function names start with az- at top level — completion will pick them up after dot-source. |
| 7 | At least one renamed function executes end-to-end | 🔍 MANUAL | Recommended target: az-Get-AzDevOpsCacheStatus (no auth needed beyond cache files). |
| 8 | README updated to use new names | ✅ VERIFIED | 30 az--prefixed AzDevOps references in README.md; zero unprefixed references remain. |
Summary
| Status | Count |
|---|---|
| ✅ VERIFIED | 5 |
| 🔍 MANUAL | 3 |
| 0 | |
| ❌ MISSING | 0 |
Manual Verification Checklist
-
pwsh -NoProfile -Command "[System.Management.Automation.Language.Parser]::ParseFile('powcuts_by_cli/azdevops_workitems.ps1', [ref]\$null, [ref]\$null) | Out-Null; 'PARSE OK'"— should printPARSE OK - In a fresh PowerShell terminal, dot-source
$profile, typeaz-+ tab-tab — all 22az-*names appear -
az-Get-AzDevOpsCacheStatus— prints cache freshness with no errors
Verdict
✅ PASS — all 5 automated criteria satisfied; 3 items require manual terminal testing. The CRITICAL Assert-AzDevOpsAuthOrAbort regression flagged in the re-review is patched in 4c9a3ff. Scope expansion on Confirm-* + Set-AzDevOpsDefaults is documented but not blocking.
https://claude.ai/code/session_01P7znUKccAohZYEwYRBNVfo
Generated by Claude Code
After rebasing onto post-#26 main, two doc-staleness gaps surfaced: azdevops_db.ps1:16 Header comment said "alongside Connect-AzDevOps". Updated to az-Connect-AzDevOps to match the renamed user-facing function. docs/azure-devops-diagrams.md This doc was added by PR #24 before PR #26 was authored, so it referenced every user-facing AzDO function by the unprefixed name (64 references across TOC, section headings, mermaid node labels, and sequence-diagram participants). PR #26 didn't update it (out of scope for a rename PR). Bulk-renamed every occurrence to its az- counterpart and updated the matching anchor links so the TOC jumps still work. Two shortcut-notation cases (Get-/Open-AzDevOps, Register-/Unregister-AzDevOpsSyncSchedule) needed manual touch-up since the regex couldn't see the bare half of the pair. https://claude.ai/code/session_01P7znUKccAohZYEwYRBNVfo
Summary
powcuts_by_cli/azdevops_workitems.ps1to start with literal lowercaseaz-so the full Azure DevOps PowerShell surface is tab-tab-discoverable the same way it already is in bash, and so users can tell bashcuts shortcuts apart from stock PowerShell cmdlets at a glance.Test-/ConvertFrom-/Read-/Write-/Initialize-/Format-/Measure-/Invoke-AzDevOps*, plus theFind-AzDevOpsCachedWorkItem/Open-AzDevOpsWorkItemUrl/Get-AzDevOpsClassificationPathsDRY helpers) are intentionally left unprefixed since they don't surface to user tab-completion.README.mdupdated to match the new names.Issue
Closes #25
Renamed Functions (18)
Connect-AzDevOpsaz-Connect-AzDevOpsTest-AzDevOpsAuthaz-Test-AzDevOpsAuthConfirm-AzDevOpsCliaz-Confirm-AzDevOpsCliConfirm-AzDevOpsExtensionaz-Confirm-AzDevOpsExtensionConfirm-AzDevOpsEnvVarsaz-Confirm-AzDevOpsEnvVarsConfirm-AzDevOpsLoginaz-Confirm-AzDevOpsLoginSet-AzDevOpsDefaultsaz-Set-AzDevOpsDefaultsConfirm-AzDevOpsSmokeQueryaz-Confirm-AzDevOpsSmokeQuerySync-AzDevOpsCacheaz-Sync-AzDevOpsCacheGet-AzDevOpsCacheStatusaz-Get-AzDevOpsCacheStatusRegister-AzDevOpsSyncScheduleaz-Register-AzDevOpsSyncScheduleUnregister-AzDevOpsSyncScheduleaz-Unregister-AzDevOpsSyncScheduleGet-AzDevOpsAssignedaz-Get-AzDevOpsAssignedOpen-AzDevOpsAssignedaz-Open-AzDevOpsAssignedGet-AzDevOpsMentionsaz-Get-AzDevOpsMentionsOpen-AzDevOpsMentionaz-Open-AzDevOpsMentionShow-AzDevOpsTreeaz-Show-AzDevOpsTreeNew-AzDevOpsUserStoryaz-New-AzDevOpsUserStoryTest Plan
$profile, typeaz-+ tab-tab — all 18az-*AzDevOps functions appear in the completion listaz-Get-AzDevOpsCacheStatusend-to-end against an environment whereaz-Connect-AzDevOpspreviously reported READY — should print cache freshness with no errorsgrep -nE '\b(Connect-AzDevOps|Test-AzDevOpsAuth|Confirm-AzDevOps[A-Z]|Set-AzDevOpsDefaults|Sync-AzDevOpsCache|Get-AzDevOpsCacheStatus|(Un)?Register-AzDevOpsSyncSchedule|(Get|Open)-AzDevOps(Assigned|Mention(s)?)|Show-AzDevOpsTree|New-AzDevOpsUserStory)\b' powcuts_by_cli/azdevops_workitems.ps1 README.md | grep -v 'az-'returns nothingGenerated by Claude Code