@echo off setlocal enabledelayedexpansion rem Sync project templates to target project. rem - Copies templates/memory-bank/ -> /memory-bank/ rem - Copies templates/prompts/ -> /docs/prompts/ rem - Copies templates/AGENTS.template.md -> /AGENTS.md rem - Copies templates/AGENT_RULES.template.md -> /AGENT_RULES.md rem Existing targets are NOT overwritten (skip if exists). rem rem Usage: rem sync_templates.bat # sync to current git root rem sync_templates.bat -project-root # sync to specified project rem sync_templates.bat -force # overwrite existing files rem sync_templates.bat -full # append full framework to existing AGENTS.md set "SCRIPT_DIR=%~dp0" for %%I in ("%SCRIPT_DIR%..") do set "SRC=%%~fI" set "FORCE=0" set "FULL=0" set "PROJECT_ROOT=" :parse_args if "%~1"=="" goto args_done if /I "%~1"=="-force" ( set "FORCE=1" shift goto parse_args ) if /I "%~1"=="-full" ( set "FULL=1" shift goto parse_args ) if /I "%~1"=="-project-root" ( if "%~2"=="" ( echo ERROR: -project-root requires a path. exit /b 1 ) set "PROJECT_ROOT=%~2" shift shift goto parse_args ) if /I "%~1"=="-h" goto show_help if /I "%~1"=="-help" goto show_help echo ERROR: positional args are not supported. Use -project-root. exit /b 1 :show_help echo Usage: echo sync_templates.bat [options] echo sync_templates.bat -project-root ^ echo. echo Options: echo -project-root PATH Target project root ^(default: git root^) echo -force Overwrite existing files echo -full Append full framework (规则优先级 + 新会话开始时) to existing AGENTS.md echo -h, -help Show this help exit /b 0 :args_done rem Determine project root if "%PROJECT_ROOT%"=="" ( for /f "delims=" %%R in ('git -C "%SCRIPT_DIR%" rev-parse --show-toplevel 2^>nul') do set "PROJECT_ROOT=%%R" ) if "%PROJECT_ROOT%"=="" set "PROJECT_ROOT=%cd%" for %%I in ("%PROJECT_ROOT%") do set "PROJECT_ROOT=%%~fI" rem Source directories set "TEMPLATES_DIR=%SRC%\templates" set "MEMORY_BANK_SRC=%TEMPLATES_DIR%\memory-bank" set "PROMPTS_SRC=%TEMPLATES_DIR%\prompts" set "AGENTS_SRC=%TEMPLATES_DIR%\AGENTS.template.md" set "AGENT_RULES_SRC=%TEMPLATES_DIR%\AGENT_RULES.template.md" rem Check source exists if not exist "%TEMPLATES_DIR%" ( echo ERROR: Templates directory not found: %TEMPLATES_DIR% exit /b 1 ) rem Skip if source equals destination if /I "%SRC%"=="%PROJECT_ROOT%" ( echo Skip: playbook root equals project root. echo Done. exit /b 0 ) for /f "usebackq delims=" %%D in (`powershell -NoProfile -Command "Get-Date -Format 'yyyy-MM-dd'"`) do set "SYNC_DATE=%%D" if "%SYNC_DATE%"=="" set "SYNC_DATE=%date%" echo Syncing templates to: %PROJECT_ROOT% echo. rem 1. Sync memory-bank/ set "MEMORY_BANK_DST=%PROJECT_ROOT%\memory-bank" if exist "%MEMORY_BANK_SRC%" ( if exist "%MEMORY_BANK_DST%" ( if "%FORCE%"=="0" ( echo memory-bank/ already exists. Skip. Use -force to overwrite. goto sync_prompts ) ) if not exist "%MEMORY_BANK_DST%" mkdir "%MEMORY_BANK_DST%" xcopy "%MEMORY_BANK_SRC%\*" "%MEMORY_BANK_DST%\" /e /i /y >nul 2>nul rem Rename .template.md to .md for %%F in ("%MEMORY_BANK_DST%\*.template.md") do ( set "OLDNAME=%%~nxF" set "NEWNAME=!OLDNAME:.template.md=.md!" ren "%%F" "!NEWNAME!" ) rem Replace {{DATE}} placeholder for %%F in ("%MEMORY_BANK_DST%\*.md") do ( powershell -NoProfile -Command "$f='%%~fF'; $c=Get-Content -Raw $f; $c=$c.Replace('{{DATE}}','%SYNC_DATE%'); Set-Content -Path $f -Value $c -Encoding UTF8 -NoNewline" ) echo Synced: memory-bank/ ) else ( echo Skip: memory-bank/ templates not found ) :sync_prompts rem 2. Sync docs/prompts/ set "PROMPTS_DST=%PROJECT_ROOT%\docs\prompts" if exist "%PROMPTS_SRC%" ( if exist "%PROMPTS_DST%" ( if "%FORCE%"=="0" ( echo docs/prompts/ already exists. Skip. Use -force to overwrite. goto sync_agents ) ) if not exist "%PROJECT_ROOT%\docs" mkdir "%PROJECT_ROOT%\docs" if not exist "%PROMPTS_DST%" mkdir "%PROMPTS_DST%" xcopy "%PROMPTS_SRC%\*" "%PROMPTS_DST%\" /e /i /y >nul 2>nul rem Rename .template.md to .md recursively for /r "%PROMPTS_DST%" %%F in (*.template.md) do ( set "OLDNAME=%%~nxF" set "NEWNAME=!OLDNAME:.template.md=.md!" ren "%%F" "!NEWNAME!" ) rem Replace {{DATE}} placeholder for /r "%PROMPTS_DST%" %%F in (*.md) do ( powershell -NoProfile -Command "$f='%%~fF'; $c=Get-Content -Raw $f; $c=$c.Replace('{{DATE}}','%SYNC_DATE%'); Set-Content -Path $f -Value $c -Encoding UTF8 -NoNewline" ) echo Synced: docs/prompts/ ) else ( echo Skip: prompts/ templates not found ) :sync_agents rem 3. Sync AGENTS.md set "AGENTS_DST=%PROJECT_ROOT%\AGENTS.md" rem Choose markers based on -full flag if "%FULL%"=="1" ( set "MARKER_START=" set "MARKER_END=" set "SECTION_NAME=framework" ) else ( set "MARKER_START=" set "MARKER_END=" set "SECTION_NAME=templates" ) if exist "%AGENTS_SRC%" ( if not exist "%AGENTS_DST%" ( rem AGENTS.md doesn't exist: create from full template copy /y "%AGENTS_SRC%" "%AGENTS_DST%" >nul powershell -NoProfile -Command "$f='%AGENTS_DST%'; $c=Get-Content -Raw $f; $c=$c.Replace('{{DATE}}','%SYNC_DATE%'); Set-Content -Path $f -Value $c -Encoding UTF8 -NoNewline" echo Created: AGENTS.md ) else ( rem AGENTS.md exists: update or append section (extract from template) powershell -NoProfile -Command ^ "$src='%AGENTS_SRC%'; $dst='%AGENTS_DST%'; $date='%SYNC_DATE%'; " ^ "$markerStart='!MARKER_START!'; $markerEnd='!MARKER_END!'; $sectionName='!SECTION_NAME!'; " ^ "$templateContent = Get-Content -Raw $src; " ^ "$extractPattern = '(?s)(' + [regex]::Escape($markerStart) + '.*?' + [regex]::Escape($markerEnd) + ')'; " ^ "if ($templateContent -match $extractPattern) { " ^ " $snippetContent = $Matches[1]; " ^ " $content = Get-Content -Raw $dst; " ^ " if ($content -match [regex]::Escape($markerStart)) { " ^ " $replacePattern = '(?s)' + [regex]::Escape($markerStart) + '.*?' + [regex]::Escape($markerEnd); " ^ " $newContent = $content -replace $replacePattern, $snippetContent; " ^ " $newContent = $newContent.Replace('{{DATE}}', $date); " ^ " Set-Content -Path $dst -Value $newContent -Encoding UTF8 -NoNewline; " ^ " Write-Host \"Updated: AGENTS.md ($sectionName section)\"; " ^ " } else { " ^ " $newContent = $content.TrimEnd() + \"`n`n\" + $snippetContent; " ^ " $newContent = $newContent.Replace('{{DATE}}', $date); " ^ " Set-Content -Path $dst -Value $newContent -Encoding UTF8 -NoNewline; " ^ " Write-Host \"Appended: AGENTS.md ($sectionName section)\"; " ^ " } " ^ "} else { " ^ " Write-Host 'Skip: markers not found in template'; " ^ "}" ) ) else ( echo Skip: AGENTS.template.md not found ) :sync_agent_rules rem 4. Sync AGENT_RULES.md set "AGENT_RULES_DST=%PROJECT_ROOT%\AGENT_RULES.md" if exist "%AGENT_RULES_SRC%" ( if exist "%AGENT_RULES_DST%" ( if "%FORCE%"=="0" ( echo AGENT_RULES.md already exists. Skip. Use -force to overwrite. goto sync_done ) ) copy /y "%AGENT_RULES_SRC%" "%AGENT_RULES_DST%" >nul powershell -NoProfile -Command "$f='%AGENT_RULES_DST%'; $c=Get-Content -Raw $f; $c=$c.Replace('{{DATE}}','%SYNC_DATE%'); Set-Content -Path $f -Value $c -Encoding UTF8 -NoNewline" echo Synced: AGENT_RULES.md ) else ( echo Skip: AGENT_RULES.template.md not found ) :sync_done echo. echo Done. echo. echo Next steps: echo 1. Edit memory-bank\*.md to fill in project-specific content echo 2. Replace remaining {{PLACEHOLDER}} values echo 3. Run sync_standards.bat to sync .agents\ rules endlocal