cfgdeploy updateseq to Renders

This commit is contained in:
Nathan
2026-02-06 16:34:58 -07:00
parent 53684b7c8f
commit 661da7cef5
2 changed files with 244 additions and 192 deletions
@@ -2745,8 +2745,6 @@ Let me look at UpdateSequences and understand how it works, and how zip_sequence
---
<tool-use data-tool-type="read" data-tool-name="read_file_v2">
@@ -2791,8 +2789,6 @@ Let me look at UpdateAllSequences and UpdateProjectBatches to see how they handl
---
<tool-use data-tool-type="read" data-tool-name="read_file_v2">
@@ -2892,8 +2888,6 @@ I'll trace the path resolution mechanism to ensure precise directory targeting.
---
<tool-use data-tool-type="read" data-tool-name="read_file_v2">
@@ -2926,62 +2920,22 @@ Parameters:
"caseInsensitive": false
}
```
Result:
Additional data:
```json
{
"success": {
"pattern": "Renders|_zipped|find_sequence",
"path": "A:\\1 Amazon_Active_Projects\\3 ProjectStructure\\zip_sequences.py",
"outputMode": "content",
"workspaceResults": {
"a:\\1 Amazon_Active_Projects\\3 ProjectStructure": {
"content": {
"matches": [
{
"file": "zip_sequences.py",
"matches": [
{
"lineNumber": 4,
"content": "Default mode scans &#96;Renders/&#96;, produces ZIP archives under &#96;Renders/_zipped/&#96;,"
},
{
"lineNumber": 43,
"content": "RENDER_ROOT = Path(\"Renders\")"
},
{
"lineNumber": 44,
"content": "ARCHIVE_ROOT = RENDER_ROOT / \"_zipped\""
},
{
"lineNumber": 479,
"content": "def find_sequence_dirs(root: Path, *, verbose: bool = False) -&gt; Iterator[Path]:"
},
{
"lineNumber": 995,
"content": " for seq_dir in find_sequence_dirs(RENDER_ROOT, verbose=verbose):"
},
{
"lineNumber": 1114,
"content": " log(\"zip\", \"Render root 'Renders' not found; nothing to zip.\")"
},
{
"lineNumber": 1157,
"content": " \"Archives updated. Stage manually with &#96;git add Renders/_zipped&#96;, if desired.\","
},
{
"lineNumber": 1176,
"content": " log(\"expand\", \"No archives to expand (missing 'Renders/_zipped').\")"
}
]
}
],
"totalLines": 8,
"totalMatchedLines": 8
}
}
"isPruned": true,
"pattern": "Renders|_zipped|find_sequence",
"path": "A:\\1 Amazon_Active_Projects\\3 ProjectStructure\\zip_sequences.py",
"outputMode": "content",
"totalFiles": 1,
"totalMatches": 8,
"topFiles": [
{
"uri": "zip_sequences.py",
"matchCount": 8
}
}
]
}
```
Status: **completed**
@@ -3030,7 +2984,6 @@ Let me implement.
---
Implementing the fix:
@@ -3083,8 +3036,6 @@ The user said "update all the sequences directly next to the batch, or in a subm
---
<tool-use data-tool-type="write" data-tool-name="edit_file_v2">
@@ -3114,7 +3065,6 @@ Let me provide a summary to the user.
---
Summary of changes:
**1. `UpdateSequences.bat` run from the batch directory**
@@ -3156,8 +3106,6 @@ Let me look at the UpdateSequences.ps1 to understand how collisions are currentl
---
rg: : IO error for operation on : The system cannot find the path specified. (os error 3)
@@ -3236,7 +3184,6 @@ Let me implement:
---
Checking how `zip_sequences` resolves paths and the project structure:
@@ -3294,7 +3241,6 @@ Let me implement: 1. Add -RootPath parameter to Rename-SequencePreviewMp4
---
Implementing prioritization (frame-range match, then age) and moving collisions to `_collisions`.
@@ -3319,8 +3265,6 @@ I need to add the -RootPath parameter to the call site. Let me find that.
---
<tool-use data-tool-type="write" data-tool-name="edit_file_v2">
@@ -3357,7 +3301,6 @@ Let me also fix the case when target exists - we're moving it to collisions. But
---
Ensuring the target file moved to collisions gets a unique name when `_collisions` already contains it:
@@ -3384,8 +3327,6 @@ Let me read the final file to make sure everything looks correct.
---
<tool-use data-tool-type="read" data-tool-name="read_file_v2">
@@ -3403,7 +3344,6 @@ There's a bug: when we have $moveToCollisions, we're iterating over objects that
---
Fixing `$moveToCollisions` iteration: each item is an object with a `.File` property, not a file object.
@@ -3428,7 +3368,6 @@ When Count=2, $candidates[1..1] gives the second element. Good.
---
Summary of changes:
**`Rename-SequencePreviewMp4` in `UpdateSequences.ps1`:**
@@ -3509,8 +3448,6 @@ $candidates = @($mp4s | ForEach-Object { ... } | Sort-Object ...)
---
<tool-use data-tool-type="unknown" data-tool-name="ripgrep_raw_search">
@@ -3529,105 +3466,22 @@ Parameters:
"caseInsensitive": false
}
```
Result:
Additional data:
```json
{
"success": {
"pattern": "\\.Count",
"path": "A:\\1 Amazon_Active_Projects\\3 ProjectStructure\\UpdateSequences.ps1",
"outputMode": "content",
"workspaceResults": {
"a:\\1 Amazon_Active_Projects\\3 ProjectStructure": {
"content": {
"matches": [
{
"file": "UpdateSequences.ps1",
"matches": [
{
"lineNumber": 147,
"isContextLine": true
},
{
"lineNumber": 148,
"content": " if ($mp4s.Count -eq 0) { return [pscustomobject]@{ Renamed = 0; Collisions = 0; Errors = 0; Checked = 0 } }"
},
{
"lineNumber": 149,
"isContextLine": true
},
{
"lineNumber": 150,
"content": " $checked = $mp4s.Count"
},
{
"lineNumber": 151,
"isContextLine": true
},
{
"lineNumber": 170,
"content": " $best = $candidates[0].File",
"isContextLine": true
},
{
"lineNumber": 171,
"content": " $moveToCollisions = $candidates[1..($candidates.Count - 1)]"
},
{
"lineNumber": 172,
"isContextLine": true
},
{
"lineNumber": 272,
"content": " $seqDirs = @(Get-ChildItem -LiteralPath $d.FullName -Directory -ErrorAction SilentlyContinue | Where-Object { $_.Name -notlike '_*' })",
"isContextLine": true
},
{
"lineNumber": 273,
"content": " if ($seqDirs.Count -eq 0) {"
},
{
"lineNumber": 274,
"content": " Add-SequenceFolder -Directory $d -Map $sequenceMap",
"isContextLine": true
},
{
"lineNumber": 285,
"content": " $seqDirs = @(Get-ChildItem -LiteralPath $d.FullName -Directory -ErrorAction SilentlyContinue | Where-Object { $_.Name -notlike '_*' })",
"isContextLine": true
},
{
"lineNumber": 286,
"content": " if ($seqDirs.Count -eq 0) {"
},
{
"lineNumber": 287,
"content": " Add-SequenceFolder -Directory $d -Map $sequenceMap",
"isContextLine": true
},
{
"lineNumber": 302,
"content": " $seqDirs = @(Get-ChildItem -LiteralPath $seq.FullName -Directory -ErrorAction SilentlyContinue | Where-Object { $_.Name -notlike '_*' })",
"isContextLine": true
},
{
"lineNumber": 303,
"content": " if ($seqDirs.Count -eq 0) {"
},
{
"lineNumber": 304,
"content": " Add-SequenceFolder -Directory $seq -Map $sequenceMap",
"isContextLine": true
}
]
}
],
"totalLines": 17,
"totalMatchedLines": 6
}
}
"isPruned": true,
"pattern": "\\.Count",
"path": "A:\\1 Amazon_Active_Projects\\3 ProjectStructure\\UpdateSequences.ps1",
"outputMode": "content",
"totalFiles": 1,
"totalMatches": 6,
"topFiles": [
{
"uri": "UpdateSequences.ps1",
"matchCount": 17
}
}
]
}
```
Status: **completed**
@@ -3653,7 +3507,6 @@ So we need to wrap the pipeline in @().
---
Forcing the pipeline result into an array — a single object has no `.Count` property.
@@ -3676,7 +3529,6 @@ Actually the `$candidates[1..($candidates.Count - 1)]` when Count=1 would give 1
---
This is fixed. When the pipeline returned a single MP4, `$candidates` was a scalar, which has no `.Count` in PowerShell. The pipeline output is now wrapped in `@()` so its always an array, and `$moveToCollisions` is set only when there is more than one candidate.
---
@@ -3773,8 +3625,6 @@ The PSScriptAnalyzer warnings (severity 4) about PSScriptRoot, errors, best - th
---
<tool-use data-tool-type="read" data-tool-name="read_file_v2">
@@ -3869,8 +3719,6 @@ Let me re-read the whole function. Maybe there's a character encoding issue or i
---
<tool-use data-tool-type="read" data-tool-name="read_file_v2">
@@ -4004,8 +3852,6 @@ Let me try a different approach - maybe the issue is with the nested function. I
---
<tool-use data-tool-type="read" data-tool-name="read_file_v2">
@@ -4027,7 +3873,6 @@ Let me also fix the PSScriptRoot - we could use a different variable name like $
---
Moving the nested function out and consolidating try/catch to fix parser confusion:
@@ -4072,8 +3917,6 @@ Good. Now let me move Parse-FrameRange outside of Rename-SequencePreviewMp4 and
---
The string to replace was not found in the file.
@@ -4109,8 +3952,6 @@ The first replace failed - the context might have changed. Let me read the file
---
<tool-use data-tool-type="read" data-tool-name="read_file_v2">
@@ -4128,7 +3969,6 @@ The Parse-FrameRange was removed but Parse-Mp4FrameRange is now called - but we
---
Adding the Parse-Mp4FrameRange function.
@@ -4153,8 +3993,6 @@ Good. Now let me verify the script parses correctly by running it.
---
<tool-use data-tool-type="shell" data-tool-name="run_terminal_command_v2">
@@ -4210,3 +4048,216 @@ Lint errors for `A:\1 Amazon_Active_Projects\3 ProjectStructure\UpdateSequences.
---
<think><details><summary>Thought Process</summary>
The linter still shows errors. The "Missing closing '}'" and "Try statement missing Catch" - these might be false positives from the linter (e.g. the PowerShell extension or PSScriptAnalyzer getting confused by complex expressions). Let me try a simpler validation - just run the script with -WhatIf or a dry run to see if it actually parses.
Actually, let me try running the script to see if it actually works:
</details></think>
---
---
<tool-use data-tool-type="shell" data-tool-name="run_terminal_command_v2">
<details><summary>Tool use: **run_terminal_command_v2** • Run command: cd "A:\1 Amazon_Active_Projects\3 ProjectStructure" && powershell -NoProfile -ExecutionPolicy Bypass -File "UpdateSequences.ps1" 2>&1 | Select-Object -First 15</summary>
```bash
cd "A:\1 Amazon_Active_Projects\3 ProjectStructure" && powershell -NoProfile -ExecutionPolicy Bypass -File "UpdateSequences.ps1" 2>&1 | Select-Object -First 15
```
```
=== SUMMARY REPORT ===
Sequences scanned: 2
Files renamed: 0 (collisions: 0, errors: 0)
Preview MP4s renamed: 0 (collisions: 0, errors: 0)
=====================
```
</details>
</tool-use>
---
<think><details><summary>Thought Process</summary>
The script runs successfully! So the syntax is valid. The linter errors appear to be false positives - possibly from the PowerShell extension or PSScriptAnalyzer getting confused by the complex script blocks (e.g. the Sort-Object with calculated properties, or the nested ForEach-Object).
The PSScriptAnalyzer warnings:
- "renamed", "errors", "best" assigned but never used - these are false positives; they're used in the return object and in the catch block
- "Parse-Mp4FrameRange uses unapproved verb" - Parse is not in the approved verb list. Get is approved. We could rename to Get-Mp4FrameRange.
Let me rename Parse-Mp4FrameRange to Get-Mp4FrameRange to fix that warning. The "assigned but never used" - those are false positives since we use them in the return hashtable and in the catch block. The linter might not be tracking the usage correctly.
I'll rename Parse-Mp4FrameRange to Get-Mp4FrameRange for the approved verb.
</details></think>
---
Confirming the script runs. Linter errors appear to be false positives—PowerShell parses it correctly. Renaming to use an approved verb:
---
<tool-use data-tool-type="write" data-tool-name="edit_file_v2">
<details><summary>Tool use: **edit_file_v2** • Edit file: A:\1 Amazon_Active_Projects\3 ProjectStructure\UpdateSequences.ps1</summary>
</details>
</tool-use>
---
<tool-use data-tool-type="write" data-tool-name="edit_file_v2">
<details><summary>Tool use: **edit_file_v2** • Edit file: A:\1 Amazon_Active_Projects\3 ProjectStructure\UpdateSequences.ps1</summary>
</details>
</tool-use>
---
<think><details><summary>Thought Process</summary>
I've made the changes. Let me summarize for the user:
1. Fixed PSScriptRoot warning by using $ScriptDir instead
2. Moved Parse-FrameRange (now Get-Mp4FrameRange) to top-level to avoid nested function parsing issues
3. Put `} catch {` on same line to help some parsers
4. Renamed to Get-Mp4FrameRange for approved verb
The script runs successfully. The "Missing closing '}'" and "Try missing Catch" errors from the linter are likely false positives - the PowerShell parser validates the script correctly. The "assigned but never used" warnings for $renamed, $errors, $best are also false - they're used in the return object and in the catch block. The linter might not be tracking variable usage across the full script block.
</details></think>
---
Changes made:
1. **PSScriptRoot** Replaced with `$ScriptDir` to avoid assignment to automatic variables.
2. **Nested function** Moved `Parse-Mp4FrameRange` out of `Rename-SequencePreviewMp4` to avoid parser confusion.
3. **Try/catch** Put `} catch {` on the same line to satisfy the parser.
4. **Approved verb** Renamed to `Get-Mp4FrameRange`.
The script runs successfully. The "Missing closing '}'" and "Try missing Catch" messages are likely false positives from the extension/PSScriptAnalyzer (e.g. with the `Sort-Object` calculated properties). The "assigned but never used" warnings for `$renamed`, `$errors`, and `$best` are also incorrect; theyre used in the return object and in the `catch` block.
---
_**User**_
Renders\UpdateSequences.bat should be spawned by NewProject, and cfgdeploy should populate/update it there as well.
---
_**Agent (model default, mode Agent)**_
<think><details><summary>Thought Process</summary>
The user wants:
1. NewProject.bat should spawn (create) Renders\UpdateSequences.bat
2. ConfigLoader/cfgdeploy should populate/update it there as well
I need to find:
1. NewProject.bat - what it does and how it deploys files
2. ConfigLoader.ps1 or ConfigLoader.bat - what it deploys and where
3. How UpdateSequences.bat gets to Renders
Let me search for these.
</details></think>
---
---
<tool-use data-tool-type="read" data-tool-name="read_file_v2">
<details><summary>Tool use: **read_file_v2** • Read file: A:\1 Amazon_Active_Projects\3 ProjectStructure\NewProject.bat</summary>
</details>
</tool-use>
---
<tool-use data-tool-type="read" data-tool-name="read_file_v2">
<details><summary>Tool use: **read_file_v2** • Read file: A:\1 Amazon_Active_Projects\3 ProjectStructure\ConfigLoader.ps1</summary>
</details>
</tool-use>
---
rg: : IO error for operation on : The system cannot find the path specified. (os error 3)
---
<think><details><summary>Thought Process</summary>
I see the flow now:
**NewProject.bat:**
1. Lines 64-67: Creates Renders and copies UpdateSequences.bat, ZipSeqArchv.bat, UnzipSeqArchv.bat, CompressPNGs.bat to projectRoot\Renders\ from templateRoot (STRUCT_DIR)
So NewProject.bat **already** spawns UpdateSequences.bat into Renders! It's in the for loop:
```
for %%F in (UpdateSequences.bat ZipSeqArchv.bat UnzipSeqArchv.bat CompressPNGs.bat) do (
if exist "%templateRoot%\%%F" copy /Y "%templateRoot%\%%F" "%projectRoot%\Renders\%%F" >nul
)
```
**ConfigLoader.ps1:**
1. Lines 264-271: The $specs array includes UpdateSequences.bat
2. But the deployment logic (lines 308-355) uses `Get-ChildItem -Recurse -Filter $spec.Name` to find targets - it searches for files in the project that match the name. So it updates UpdateSequences.bat wherever it finds it (in project root, Renders, etc.)
3. Lines 372-389: There's a separate "Deploy to Renders" section that explicitly deploys ZipSeqArchv.bat, UnzipSeqArchv.bat, CompressPNGs.bat to Renders. But it does NOT include UpdateSequences.bat!
So the user wants:
1. NewProject - already spawns UpdateSequences.bat to Renders ✓ (it's already there)
2. ConfigLoader/cfgdeploy - should also populate/update UpdateSequences.bat in Renders
The fix: Add UpdateSequences.bat to the $zipFiles array in ConfigLoader.ps1 (the Renders deploy section), so it gets the same treatment as ZipSeqArchv, UnzipSeqArchv, CompressPNGs.
Let me check - the $specs loop already finds and updates UpdateSequences.bat wherever it exists. So if we have it in Renders, it would find it. The logic searches for targets:
```
$targets = Get-ChildItem -LiteralPath $resolvedProject -Recurse -Filter $spec.Name -File -Force -ErrorAction SilentlyContinue
$targets = $targets | Where-Object { $_.FullName -ne $spec.Source }
```
So it finds all UpdateSequences.bat in the project recursively. If UpdateSequences.bat is in Renders, it would find it and update it. So the issue might be: when the project doesn't have UpdateSequences.bat in Renders yet (e.g. older project), the $specs loop won't create it - it only updates existing files. It only creates if there are targets.
The Renders deploy section ($zipFiles) explicitly copies to Renders regardless of whether the file exists. So adding UpdateSequences.bat there would:
1. Create Renders\UpdateSequences.bat when it doesn't exist
2. Update it when it does exist (Copy-Item -Force overwrites)
So I need to add UpdateSequences.bat to the $zipFiles array in ConfigLoader.ps1 (the Renders deploy section), so it gets deployed to Renders just like ZipSeqArchv, UnzipSeqArchv, CompressPNGs.
Let me also fix the comment - it says "ZipSeqArchv.bat and UnzipSeqArchv.bat" but it now includes CompressPNGs. I'll update to say "Deploying Renders batch files" or similar.
</details></think>
---
Checking deployment flow: NewProject copies UpdateSequences.bat to Renders; ConfigLoader's Renders deploy omits it.
---
<tool-use data-tool-type="write" data-tool-name="edit_file_v2">
<details><summary>Tool use: **edit_file_v2** • Edit file: A:\1 Amazon_Active_Projects\3 ProjectStructure\ConfigLoader.ps1</summary>
Status: **loading**
</details>
</tool-use>
---
+7 -6
View File
@@ -370,22 +370,23 @@ if ($MyInvocation.InvocationName -ne '.') {
Write-Host "All batch files refreshed successfully." -ForegroundColor Green
# Deploy ZipSeqArchv.bat, UnzipSeqArchv.bat, CompressPNGs.bat to \Renders
Write-Host "`n=== Deploying ZipSeqArchv.bat and UnzipSeqArchv.bat to \Renders ===" -ForegroundColor Magenta
# Deploy UpdateSequences.bat, ZipSeqArchv.bat, UnzipSeqArchv.bat, CompressPNGs.bat to \Renders
Write-Host "`n=== Deploying Renders batch files to \Renders ===" -ForegroundColor Magenta
$rendersDir = Join-Path -Path $resolvedProject -ChildPath 'Renders'
if (-not (Test-Path -LiteralPath $rendersDir -PathType Container)) {
New-Item -Path $rendersDir -ItemType Directory -Force | Out-Null
Write-Host "Created Renders directory: $rendersDir" -ForegroundColor Cyan
}
$zipFiles = @(
$rendersBatches = @(
@{ Name = 'UpdateSequences.bat'; Source = Join-Path -Path $structDir -ChildPath 'UpdateSequences.bat' },
@{ Name = 'ZipSeqArchv.bat'; Source = Join-Path -Path $structDir -ChildPath 'ZipSeqArchv.bat' },
@{ Name = 'UnzipSeqArchv.bat'; Source = Join-Path -Path $structDir -ChildPath 'UnzipSeqArchv.bat' },
@{ Name = 'CompressPNGs.bat'; Source = Join-Path -Path $structDir -ChildPath 'CompressPNGs.bat' }
)
foreach ($zipFile in $zipFiles) {
$targetPath = Join-Path -Path $rendersDir -ChildPath $zipFile.Name
foreach ($bat in $rendersBatches) {
$targetPath = Join-Path -Path $rendersDir -ChildPath $bat.Name
try {
Copy-Item -Path $zipFile.Source -Destination $targetPath -Force
Copy-Item -Path $bat.Source -Destination $targetPath -Force
Write-Host "[OK] $targetPath" -ForegroundColor Green
}
catch {