playbook/scripts/vendor_playbook.bat

261 lines
8.3 KiB
Batchfile
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

@echo off
setlocal enabledelayedexpansion
rem Vendor a trimmed Playbook snapshot into a target project (offline copy),
rem then run sync_standards to materialize .agents\<lang>\ and .gitattributes in
rem the target project root.
rem
rem Usage:
rem scripts\vendor_playbook.bat <project-root> (default: tsl)
rem scripts\vendor_playbook.bat <project-root> tsl cpp
rem scripts\vendor_playbook.bat <project-root> --langs tsl,cpp
rem
rem Notes:
rem - Snapshot is written to: <project-root>\docs\standards\playbook\
rem - Existing snapshot is backed up before overwrite.
if "%~1"=="" goto Usage
if "%~1"=="-h" goto Usage
if "%~1"=="--help" goto Usage
set "DEST_ROOT=%~1"
shift
set "LANGS="
if "%~1"=="--langs" (
set "LANGS=%~2"
shift
shift
) else (
set "LANGS=%*"
)
if "%LANGS%"=="" set "LANGS=tsl"
set "LANGS=%LANGS:,= %"
set "SCRIPT_DIR=%~dp0"
for %%I in ("%SCRIPT_DIR%..") do set "SRC=%%~fI"
if not exist "%DEST_ROOT%" mkdir "%DEST_ROOT%"
for %%I in ("%DEST_ROOT%") do set "DEST_ROOT_ABS=%%~fI"
set "STANDARDS_DIR=%DEST_ROOT_ABS%\\docs\\standards"
set "DEST_PREFIX=%STANDARDS_DIR%\\playbook"
if not exist "%STANDARDS_DIR%" mkdir "%STANDARDS_DIR%"
if exist "%DEST_PREFIX%" (
set "RAND=%RANDOM%"
pushd "%STANDARDS_DIR%"
ren "playbook" "playbook.bak.!RAND!"
popd
echo Backed up existing snapshot -^> docs\\standards\\playbook.bak.!RAND!
)
if not exist "%DEST_PREFIX%" mkdir "%DEST_PREFIX%"
copy /y "%SRC%\\.gitattributes" "%DEST_PREFIX%\\.gitattributes" >nul
copy /y "%SRC%\\SKILLS.md" "%DEST_PREFIX%\\SKILLS.md" >nul
xcopy "%SRC%\\scripts\\*" "%DEST_PREFIX%\\scripts\\" /e /i /y >nul
if errorlevel 1 (
echo ERROR: failed to copy scripts
exit /b 1
)
xcopy "%SRC%\\codex\\*" "%DEST_PREFIX%\\codex\\" /e /i /y >nul
if errorlevel 1 (
echo ERROR: failed to copy codex
exit /b 1
)
xcopy "%SRC%\\docs\\common\\*" "%DEST_PREFIX%\\docs\\common\\" /e /i /y >nul
if errorlevel 1 (
echo ERROR: failed to copy docs\\common
exit /b 1
)
if not exist "%DEST_PREFIX%\\.agents" mkdir "%DEST_PREFIX%\\.agents"
copy /y "%SRC%\\.agents\\index.md" "%DEST_PREFIX%\\.agents\\index.md" >nul
if not exist "%DEST_PREFIX%\\templates" mkdir "%DEST_PREFIX%\\templates"
if exist "%SRC%\\templates\\ci" (
xcopy "%SRC%\\templates\\ci\\*" "%DEST_PREFIX%\\templates\\ci\\" /e /i /y >nul
if errorlevel 1 (
echo ERROR: failed to copy templates\\ci
exit /b 1
)
)
set "LANGS_CSV="
for %%L in (%LANGS%) do (
echo %%~L| findstr /r "[\\/]" >nul && (
echo ERROR: invalid lang=%%~L
exit /b 1
)
echo %%~L| findstr /c:".." >nul && (
echo ERROR: invalid lang=%%~L
exit /b 1
)
if not exist "%SRC%\\docs\\%%~L" (
echo ERROR: docs not found for lang=%%~L "%SRC%\\docs\\%%~L"
exit /b 1
)
if not exist "%SRC%\\.agents\\%%~L" (
echo ERROR: agents ruleset not found for lang=%%~L "%SRC%\\.agents\\%%~L"
exit /b 1
)
xcopy "%SRC%\\docs\\%%~L\\*" "%DEST_PREFIX%\\docs\\%%~L\\" /e /i /y >nul
if errorlevel 1 (
echo ERROR: failed to copy docs for lang=%%~L
exit /b 1
)
xcopy "%SRC%\\.agents\\%%~L\\*" "%DEST_PREFIX%\\.agents\\%%~L\\" /e /i /y >nul
if errorlevel 1 (
echo ERROR: failed to copy agents for lang=%%~L
exit /b 1
)
if exist "%SRC%\\templates\\%%~L" (
xcopy "%SRC%\\templates\\%%~L\\*" "%DEST_PREFIX%\\templates\\%%~L\\" /e /i /y >nul
if errorlevel 1 (
echo ERROR: failed to copy templates for lang=%%~L
exit /b 1
)
)
if "!LANGS_CSV!"=="" (
set "LANGS_CSV=%%~L"
) else (
set "LANGS_CSV=!LANGS_CSV!,%%~L"
)
)
set "DOC_INDEX=%DEST_PREFIX%\\docs\\index.md"
> "%DOC_INDEX%" echo # 文档导航Docs Index
>> "%DOC_INDEX%" echo.
>> "%DOC_INDEX%" echo 本快照为裁剪版 Playbooklangs: %LANGS_CSV%)。
>> "%DOC_INDEX%" echo.
>> "%DOC_INDEX%" echo ## 跨语言common
>> "%DOC_INDEX%" echo.
>> "%DOC_INDEX%" echo - 提交信息与版本号:`common/commit_message.md`
for %%L in (%LANGS%) do call :AppendDocsSection "%%~L"
set "COMMIT="
for /f "delims=" %%H in ('git -C "%SRC%" rev-parse HEAD 2^>nul') do set "COMMIT=%%H"
if "%COMMIT%"=="" set "COMMIT=N/A"
set "README=%DEST_PREFIX%\\README.md"
> "%README%" echo # Playbook裁剪快照
>> "%README%" echo.
>> "%README%" echo 本目录为从 Playbook vendoring 的裁剪快照langs: %LANGS_CSV%)。
>> "%README%" echo.
>> "%README%" echo ## 使用
>> "%README%" echo.
>> "%README%" echo 在目标项目根目录执行(多语言一次同步):
>> "%README%" echo.
>> "%README%" echo ```sh
>> "%README%" echo sh docs/standards/playbook/scripts/sync_standards.sh %LANGS_CSV%
>> "%README%" echo ```
>> "%README%" echo.
>> "%README%" echo 查看规范入口:
>> "%README%" echo.
>> "%README%" echo - `docs/standards/playbook/docs/index.md`
>> "%README%" echo - `.agents/index.md`
>> "%README%" echo.
>> "%README%" echo ## Codex skills可选
>> "%README%" echo.
>> "%README%" echo 安装到本机(需要先在 `~/.codex/config.toml` 启用 skills见 `docs/standards/playbook/SKILLS.md`
>> "%README%" echo.
>> "%README%" echo ```sh
>> "%README%" echo sh docs/standards/playbook/scripts/install_codex_skills.sh
>> "%README%" echo ```
set "SOURCE=%DEST_PREFIX%\\SOURCE.md"
> "%SOURCE%" echo # SOURCE
>> "%SOURCE%" echo.
>> "%SOURCE%" echo - Source: %SRC%
>> "%SOURCE%" echo - Commit: %COMMIT%
>> "%SOURCE%" echo - Date: %DATE% %TIME%
>> "%SOURCE%" echo - Langs: %LANGS_CSV%
>> "%SOURCE%" echo - Generated-by: scripts/vendor_playbook.bat
echo Vendored snapshot -^> %DEST_PREFIX%
set "PROJECT_AGENTS_ROOT=%DEST_ROOT_ABS%\\.agents"
set "PROJECT_AGENTS_INDEX=%PROJECT_AGENTS_ROOT%\\index.md"
if not exist "%PROJECT_AGENTS_ROOT%" mkdir "%PROJECT_AGENTS_ROOT%"
if not exist "%PROJECT_AGENTS_INDEX%" (
> "%PROJECT_AGENTS_INDEX%" echo # .agents多语言
>> "%PROJECT_AGENTS_INDEX%" echo.
>> "%PROJECT_AGENTS_INDEX%" echo 本目录用于存放仓库级/语言级的代理规则集。
>> "%PROJECT_AGENTS_INDEX%" echo.
>> "%PROJECT_AGENTS_INDEX%" echo 本项目已启用的规则集:
for %%L in (%LANGS%) do (
if /I "%%~L"=="tsl" >> "%PROJECT_AGENTS_INDEX%" echo - .agents/tsl/TSL 相关规则集(适用于 .tsl/.tsf
if /I "%%~L"=="cpp" >> "%PROJECT_AGENTS_INDEX%" echo - .agents/cpp/C++ 相关规则集C++23含 Modules
if /I "%%~L"=="python" >> "%PROJECT_AGENTS_INDEX%" echo - .agents/python/Python 相关规则集
)
>> "%PROJECT_AGENTS_INDEX%" echo.
>> "%PROJECT_AGENTS_INDEX%" echo 入口建议从:
for %%L in (%LANGS%) do >> "%PROJECT_AGENTS_INDEX%" echo - .agents/%%~L/index.md
>> "%PROJECT_AGENTS_INDEX%" echo.
>> "%PROJECT_AGENTS_INDEX%" echo 标准快照文档入口:
>> "%PROJECT_AGENTS_INDEX%" echo.
>> "%PROJECT_AGENTS_INDEX%" echo - docs/standards/playbook/docs/index.md
)
set "OLD_SYNC_ROOT=%SYNC_ROOT%"
set "SYNC_ROOT=%DEST_ROOT_ABS%"
pushd "%DEST_ROOT_ABS%"
call "%DEST_PREFIX%\\scripts\\sync_standards.bat" %LANGS%
popd
set "SYNC_ROOT=%OLD_SYNC_ROOT%"
echo Done.
endlocal
exit /b 0
:AppendDocsSection
set "LANG=%~1"
if /I "%LANG%"=="tsl" (
>> "%DOC_INDEX%" echo.
>> "%DOC_INDEX%" echo ## TSLtsl
>> "%DOC_INDEX%" echo.
>> "%DOC_INDEX%" echo - 代码风格:`tsl/code_style.md`
>> "%DOC_INDEX%" echo - 命名规范:`tsl/naming.md`
>> "%DOC_INDEX%" echo - 语法手册:`tsl/syntax_book/index.md`
>> "%DOC_INDEX%" echo - 工具链与验证命令(模板):`tsl/toolchain.md`
)
if /I "%LANG%"=="cpp" (
>> "%DOC_INDEX%" echo.
>> "%DOC_INDEX%" echo ## C++cpp
>> "%DOC_INDEX%" echo.
>> "%DOC_INDEX%" echo - 代码风格:`cpp/code_style.md`
>> "%DOC_INDEX%" echo - 命名规范:`cpp/naming.md`
>> "%DOC_INDEX%" echo - 工具链与验证命令(模板):`cpp/toolchain.md`
>> "%DOC_INDEX%" echo - 第三方依赖Conan`cpp/dependencies_conan.md`
>> "%DOC_INDEX%" echo - clangd 配置:`cpp/clangd.md`
)
if /I "%LANG%"=="python" (
>> "%DOC_INDEX%" echo.
>> "%DOC_INDEX%" echo ## Pythonpython
>> "%DOC_INDEX%" echo.
>> "%DOC_INDEX%" echo - 代码风格:`python/style_guide.md`
>> "%DOC_INDEX%" echo - 工具链:`python/tooling.md`
>> "%DOC_INDEX%" echo - 配置清单:`python/configuration.md`
)
exit /b 0
:Usage
echo Usage:
echo scripts\vendor_playbook.bat ^<project-root^> ^(default: tsl^)
echo scripts\vendor_playbook.bat ^<project-root^> tsl cpp
echo scripts\vendor_playbook.bat ^<project-root^> --langs tsl,cpp
exit /b 1