diff --git a/.claude/skills/web-info/SKILL.md b/.claude/skills/web-info/SKILL.md index 56599d83..e8b13d98 100644 --- a/.claude/skills/web-info/SKILL.md +++ b/.claude/skills/web-info/SKILL.md @@ -1,6 +1,6 @@ --- name: web-info -description: Статус веб-публикации 1С — Apache, опубликованные базы, ошибки. Используй когда пользователь спрашивает про статус веб-сервера, опубликованные базы, работает ли Apache +description: Статус Apache и веб-публикаций 1С — запущен ли сервер, какие базы опубликованы, ошибки. Используй когда пользователь спрашивает про статус веб-сервера, опубликованные базы, работает ли Apache argument-hint: "" allowed-tools: - Bash diff --git a/.claude/skills/web-publish/SKILL.md b/.claude/skills/web-publish/SKILL.md index c9ee3cc1..fdea6696 100644 --- a/.claude/skills/web-publish/SKILL.md +++ b/.claude/skills/web-publish/SKILL.md @@ -24,14 +24,19 @@ allowed-tools: ## Параметры подключения -Прочитай `.v8-project.json` из корня проекта. Возьми `v8path` (путь к платформе) и разреши базу: +Прочитай `.v8-project.json` из корня проекта и разреши базу: 1. Если пользователь указал параметры подключения (путь, сервер) — используй напрямую 2. Если указал базу по имени — ищи по id / alias / name в `.v8-project.json` 3. Если не указал — сопоставь текущую ветку Git с `databases[].branches` 4. Если ветка не совпала — используй `default` -Если `v8path` не задан — автоопределение. -Если в `.v8-project.json` задан `webPath` — используй как `-ApachePath`. -Если файла нет — предложи `/db-list add`. + +**ОБЯЗАТЕЛЬНО передавай все найденные параметры:** +- **`-V8Path`** — из `v8path` в `.v8-project.json`. Если не передать, скрипт автоопределит версию платформы, что может выбрать не ту версию +- **`-UserName`** — из поля `user` найденной записи базы (если есть) +- **`-Password`** — из поля `password` найденной записи базы (если есть) +- **`-ApachePath`** — из `webPath` в `.v8-project.json` (если есть) + +Если файла `.v8-project.json` нет — предложи `/db-list add`. ## Команда diff --git a/.claude/skills/web-publish/scripts/web-publish.ps1 b/.claude/skills/web-publish/scripts/web-publish.ps1 index 7658088f..b4cd6143 100644 --- a/.claude/skills/web-publish/scripts/web-publish.ps1 +++ b/.claude/skills/web-publish/scripts/web-publish.ps1 @@ -34,7 +34,7 @@ Корень Apache (по умолчанию tools\apache24) .PARAMETER Port - Порт (по умолчанию 8080) + Порт (по умолчанию 8081) .PARAMETER Manual Не скачивать Apache — только проверить и дать инструкцию diff --git a/.claude/skills/web-stop/scripts/web-stop.ps1 b/.claude/skills/web-stop/scripts/web-stop.ps1 index 949b0789..43b77b64 100644 --- a/.claude/skills/web-stop/scripts/web-stop.ps1 +++ b/.claude/skills/web-stop/scripts/web-stop.ps1 @@ -70,6 +70,7 @@ while ($elapsed -lt $maxWait) { $check = Get-OurHttpd if (-not $check) { Write-Host "Apache остановлен" -ForegroundColor Green + Write-Host "Публикации сохранены. Для удаления: /web-unpublish <имя> или /web-unpublish --all" -ForegroundColor Gray exit 0 } } @@ -88,3 +89,4 @@ if ($remaining) { } Write-Host "Apache остановлен" -ForegroundColor Green +Write-Host "Публикации сохранены. Для удаления: /web-unpublish <имя> или /web-unpublish --all" -ForegroundColor Gray diff --git a/.claude/skills/web-unpublish/SKILL.md b/.claude/skills/web-unpublish/SKILL.md index 677ad0fb..89aebdbe 100644 --- a/.claude/skills/web-unpublish/SKILL.md +++ b/.claude/skills/web-unpublish/SKILL.md @@ -1,7 +1,7 @@ --- name: web-unpublish -description: Удаление веб-публикации 1С. Используй когда пользователь просит убрать публикацию, удалить веб-доступ к базе -argument-hint: "" +description: Удаление веб-публикации 1С из Apache. Используй когда пользователь просит убрать публикацию, удалить веб-доступ к базе +argument-hint: "" allowed-tools: - Bash - Read @@ -9,15 +9,18 @@ allowed-tools: - AskUserQuestion --- -# /web-unpublish — Удаление публикации 1С +# /web-unpublish — Удаление веб-публикации 1С из Apache -Удаляет публикацию из httpd.conf и каталог `publish/{appname}`. Если других публикаций не осталось — удаляет глобальный блок 1C и останавливает Apache. +Удаляет блок публикации из `httpd.conf` и каталог `publish/{appname}` внутри Apache. Если других публикаций не осталось — удаляет глобальный блок 1C и останавливает Apache. С флагом `--all` удаляет все публикации разом. + +> **Внимание:** этот навык управляет только веб-публикациями в Apache (блоки в `httpd.conf` + каталог `publish/`). Он **НЕ** удаляет каталоги проекта, `upload/`, базы данных или исходники. ## Usage ``` /web-unpublish /web-unpublish bpdemo +/web-unpublish --all ``` ## Параметры подключения @@ -25,7 +28,9 @@ allowed-tools: Прочитай `.v8-project.json` из корня проекта. Если задан `webPath` — используй как `-ApachePath`. По умолчанию `tools/apache24` от корня проекта. -Если пользователь не указал `appname`, выполни `/web-info` чтобы показать список публикаций и спроси какую удалить. +Если пользователь не указал `appname` и не указал `--all`, выполни `/web-info` чтобы показать список публикаций и спроси какую удалить. + +Если пользователь просит удалить **все** публикации — используй `-All`. ## Команда @@ -37,15 +42,21 @@ powershell.exe -NoProfile -File .claude/skills/web-unpublish/scripts/web-unpubli | Параметр | Обязательный | Описание | |----------|:------------:|----------| -| `-AppName <имя>` | да | Имя публикации | +| `-AppName <имя>` | * | Имя публикации | +| `-All` | * | Удалить все публикации | | `-ApachePath <путь>` | нет | Корень Apache (по умолчанию `tools/apache24`) | +> `*` — нужен либо `-AppName`, либо `-All` + ## Примеры ```powershell -# Удалить публикацию +# Удалить одну публикацию powershell.exe -NoProfile -File .claude/skills/web-unpublish/scripts/web-unpublish.ps1 -AppName "bpdemo" +# Удалить все публикации +powershell.exe -NoProfile -File .claude/skills/web-unpublish/scripts/web-unpublish.ps1 -All + # С указанием пути powershell.exe -NoProfile -File .claude/skills/web-unpublish/scripts/web-unpublish.ps1 -AppName "mydb" -ApachePath "C:\tools\apache24" ``` diff --git a/.claude/skills/web-unpublish/scripts/web-unpublish.ps1 b/.claude/skills/web-unpublish/scripts/web-unpublish.ps1 index d07651d9..479ec642 100644 --- a/.claude/skills/web-unpublish/scripts/web-unpublish.ps1 +++ b/.claude/skills/web-unpublish/scripts/web-unpublish.ps1 @@ -2,32 +2,42 @@ # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills <# .SYNOPSIS - Удаление публикации 1С из Apache + Удаление веб-публикации 1С из Apache .DESCRIPTION Удаляет маркерный блок из httpd.conf и каталог публикации. Если Apache запущен — перезапускает для применения. + С флагом -All удаляет все публикации и останавливает Apache. .PARAMETER AppName - Имя публикации (обязательный) + Имя публикации (обязательный, если не указан -All) .PARAMETER ApachePath Корень Apache (по умолчанию tools\apache24) +.PARAMETER All + Удалить все публикации + .EXAMPLE .\web-unpublish.ps1 -AppName "mydb" +.EXAMPLE + .\web-unpublish.ps1 -All + .EXAMPLE .\web-unpublish.ps1 -AppName "bpdemo" -ApachePath "C:\tools\apache24" #> [CmdletBinding()] param( - [Parameter(Mandatory=$true)] + [Parameter(Mandatory=$false)] [string]$AppName, [Parameter(Mandatory=$false)] - [string]$ApachePath + [string]$ApachePath, + + [Parameter(Mandatory=$false)] + [switch]$All ) $OutputEncoding = [System.Text.Encoding]::UTF8 @@ -39,7 +49,13 @@ if (-not $ApachePath) { $ApachePath = Join-Path $projectRoot "tools\apache24" } -# --- Remove marker block from httpd.conf --- +# --- Validate params --- +if (-not $All -and -not $AppName) { + Write-Host "Error: укажите -AppName или -All" -ForegroundColor Red + exit 1 +} + +# --- Read httpd.conf --- $confFile = Join-Path (Join-Path $ApachePath "conf") "httpd.conf" if (-not (Test-Path $confFile)) { Write-Host "Error: httpd.conf не найден: $confFile" -ForegroundColor Red @@ -47,16 +63,43 @@ if (-not (Test-Path $confFile)) { } $confContent = [System.IO.File]::ReadAllText($confFile) -$pubMarkerStart = "# --- 1C Publication: $AppName ---" -$pubMarkerEnd = "# --- End: $AppName ---" -if ($confContent -match [regex]::Escape($pubMarkerStart)) { - $pattern = '\r?\n?' + [regex]::Escape($pubMarkerStart) + '[\s\S]*?' + [regex]::Escape($pubMarkerEnd) + '\r?\n?' - $confContent = [regex]::Replace($confContent, $pattern, "`n") - [System.IO.File]::WriteAllText($confFile, $confContent) - Write-Host "httpd.conf: блок публикации '$AppName' удалён" -ForegroundColor Green +# --- Helper: our httpd process --- +$httpdExe = Join-Path (Join-Path $ApachePath "bin") "httpd.exe" +$httpdExeNorm = (Resolve-Path $httpdExe -ErrorAction SilentlyContinue).Path +function Get-OurHttpd { + Get-Process httpd -ErrorAction SilentlyContinue | Where-Object { + try { $_.Path -eq $httpdExeNorm } catch { $false } + } +} + +# --- Collect app names to remove --- +if ($All) { + $pubPattern = '# --- 1C Publication: (.+?) ---' + $pubMatches = [regex]::Matches($confContent, $pubPattern) + if ($pubMatches.Count -eq 0) { + Write-Host "Нет публикаций для удаления" -ForegroundColor Yellow + exit 0 + } + $appNames = @() + foreach ($m in $pubMatches) { $appNames += $m.Groups[1].Value } + Write-Host "Удаление всех публикаций: $($appNames -join ', ')" -ForegroundColor Cyan } else { - Write-Host "Публикация '$AppName' не найдена в httpd.conf" -ForegroundColor Yellow + $appNames = @($AppName) +} + +# --- Remove marker blocks --- +foreach ($name in $appNames) { + $pubMarkerStart = "# --- 1C Publication: $name ---" + $pubMarkerEnd = "# --- End: $name ---" + + if ($confContent -match [regex]::Escape($pubMarkerStart)) { + $pattern = '\r?\n?' + [regex]::Escape($pubMarkerStart) + '[\s\S]*?' + [regex]::Escape($pubMarkerEnd) + '\r?\n?' + $confContent = [regex]::Replace($confContent, $pattern, "`n") + Write-Host "httpd.conf: блок публикации '$name' удалён" -ForegroundColor Green + } else { + Write-Host "Публикация '$name' не найдена в httpd.conf" -ForegroundColor Yellow + } } # --- Check if any publications remain; if not, remove global block --- @@ -67,38 +110,33 @@ if ($remainingPubs.Count -eq 0) { if ($confContent -match [regex]::Escape($globalMarkerStart)) { $globalPattern = '\r?\n?' + [regex]::Escape($globalMarkerStart) + '[\s\S]*?' + [regex]::Escape($globalMarkerEnd) + '\r?\n?' $confContent = [regex]::Replace($confContent, $globalPattern, "`n") - [System.IO.File]::WriteAllText($confFile, $confContent) Write-Host "httpd.conf: глобальный блок 1C удалён (нет публикаций)" -ForegroundColor Green } } -# --- Remove publish directory --- -$publishDir = Join-Path (Join-Path $ApachePath "publish") $AppName -if (Test-Path $publishDir) { - Remove-Item $publishDir -Recurse -Force - Write-Host "Каталог удалён: $publishDir" -ForegroundColor Green -} else { - Write-Host "Каталог не найден: $publishDir" -ForegroundColor Yellow +[System.IO.File]::WriteAllText($confFile, $confContent) + +# --- Remove publish directories --- +foreach ($name in $appNames) { + $publishDir = Join-Path (Join-Path $ApachePath "publish") $name + if (Test-Path $publishDir) { + Remove-Item $publishDir -Recurse -Force + Write-Host "Каталог удалён: $publishDir" -ForegroundColor Green + } else { + Write-Host "Каталог не найден: $publishDir" -ForegroundColor Yellow + } } -# --- Restart Apache if running (only our instance) --- -$httpdExe = Join-Path (Join-Path $ApachePath "bin") "httpd.exe" -$httpdExeNorm = (Resolve-Path $httpdExe -ErrorAction SilentlyContinue).Path -$httpdProc = Get-Process httpd -ErrorAction SilentlyContinue | Where-Object { - try { $_.Path -eq $httpdExeNorm } catch { $false } -} +# --- Restart/Stop Apache if running (only our instance) --- +$httpdProc = Get-OurHttpd if ($httpdProc) { - Write-Host "Перезапуск Apache..." - $httpdProc | Stop-Process -Force -ErrorAction SilentlyContinue - Start-Sleep -Seconds 1 - - # Only restart if there are remaining publications if ($remainingPubs.Count -gt 0) { + Write-Host "Перезапуск Apache..." + $httpdProc | Stop-Process -Force -ErrorAction SilentlyContinue + Start-Sleep -Seconds 1 Start-Process -FilePath $httpdExe -WorkingDirectory $ApachePath -WindowStyle Hidden Start-Sleep -Seconds 2 - $check = Get-Process httpd -ErrorAction SilentlyContinue | Where-Object { - try { $_.Path -eq $httpdExeNorm } catch { $false } - } + $check = Get-OurHttpd if ($check) { Write-Host "Apache перезапущен" -ForegroundColor Green } else { @@ -106,9 +144,16 @@ if ($httpdProc) { exit 1 } } else { - Write-Host "Публикаций не осталось — Apache остановлен" -ForegroundColor Green + Write-Host "Публикаций не осталось — останавливаю Apache..." + $httpdProc | Stop-Process -Force -ErrorAction SilentlyContinue + Start-Sleep -Seconds 1 + Write-Host "Apache остановлен" -ForegroundColor Green } } Write-Host "" -Write-Host "Публикация '$AppName' удалена" -ForegroundColor Green +if ($All) { + Write-Host "Все публикации удалены ($($appNames.Count) шт.)" -ForegroundColor Green +} else { + Write-Host "Публикация '$AppName' удалена" -ForegroundColor Green +} diff --git a/docs/web-guide.md b/docs/web-guide.md index b840d115..002ba4cf 100644 --- a/docs/web-guide.md +++ b/docs/web-guide.md @@ -9,7 +9,7 @@ | `/web-publish` | `.ps1` | Публикация базы (VRD + httpd.conf + запуск Apache) | | `/web-info` | `.ps1` | Статус Apache и список публикаций | | `/web-stop` | `.ps1` | Остановка Apache | -| `/web-unpublish` | `.ps1` | Удаление публикации | +| `/web-unpublish` | `.ps1` | Удаление публикации (одной или всех `--all`) | ## Рабочий цикл @@ -98,6 +98,14 @@ Claude вызовет `/web-stop`. Claude вызовет `/web-unpublish bpdemo` → удалит блок из httpd.conf → удалит каталог → перезапустит Apache (если есть другие публикации). +### Удалить все публикации + +``` +> Удали все веб-публикации +``` + +Claude вызовет `/web-unpublish --all` → удалит все блоки из httpd.conf → удалит все каталоги → остановит Apache. + ## Ручная установка Apache Если автоматическая загрузка невозможна (прокси, firewall), используйте флаг `--manual`: