feat(detmir): add rust-first operations tooling
This commit is contained in:
@@ -0,0 +1,172 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||
cd "$ROOT"
|
||||
|
||||
OUT_DIR="${METAGPT_AW_OUT_DIR:-$ROOT/.ai/metagpt}"
|
||||
METAGPT_BIN="${METAGPT_BIN:-/home/igor/bin/metagpt-lab}"
|
||||
METAGPT_AW_INVESTMENT="${METAGPT_AW_INVESTMENT:-0.1}"
|
||||
METAGPT_AW_N_ROUND="${METAGPT_AW_N_ROUND:-2}"
|
||||
METAGPT_AW_TIMEOUT="${METAGPT_AW_TIMEOUT:-90}"
|
||||
METAGPT_AW_ENGINE="${METAGPT_AW_ENGINE:-direct}"
|
||||
METAGPT_CONFIG="${METAGPT_CONFIG:-/home/igor/.metagpt/config2.yaml}"
|
||||
|
||||
usage() {
|
||||
cat <<'USAGE'
|
||||
Usage:
|
||||
scripts/metagpt-aw-scout.sh <preset|free task text>
|
||||
|
||||
Presets:
|
||||
qa-rollback QA checklist and rollback plan for Windows collectors
|
||||
smoke End-to-end smoke-test plan for AW server, RDP collectors, Grafana, Influx exporters
|
||||
grafana Management-facing Grafana dashboard review plan
|
||||
install-kit Install-kit rebuild and validation checklist
|
||||
windows-i18n Windows localized Administrator / Cyrillic collector checks
|
||||
|
||||
Examples:
|
||||
scripts/metagpt-aw-scout.sh qa-rollback
|
||||
scripts/metagpt-aw-scout.sh "Review risk of changing aw-worktime-ui-bridge foreground cache"
|
||||
USAGE
|
||||
}
|
||||
|
||||
if [[ "${1:-}" == "-h" || "${1:-}" == "--help" || $# -eq 0 ]]; then
|
||||
usage
|
||||
exit 0
|
||||
fi
|
||||
|
||||
case "$1" in
|
||||
qa-rollback)
|
||||
TASK="Prepare a practical QA checklist and rollback plan for ActivityWatch-Russian Windows collectors after changes in PowerShell collectors, process events, localized Administrator task names, and recovery hardening."
|
||||
;;
|
||||
smoke)
|
||||
TASK="Prepare a minimal but complete end-to-end smoke-test plan for ActivityWatch-Russian: AW server buckets, worktime API, RDP/WinRM collectors, Windows SSH access, Grafana dashboards, Influx worktime exporter, DLP exporter, and install-kit sanity."
|
||||
;;
|
||||
grafana)
|
||||
TASK="Review the management-facing Grafana dashboards for ActivityWatch-Russian. Identify confusing technical labels, panels that should be hidden or renamed, and checks needed to prove 'true user work' by application."
|
||||
;;
|
||||
install-kit)
|
||||
TASK="Prepare a rebuild and validation checklist for install-kit-awindows, including rebuild_install_kit.sh, check_install_kit_vs_repo.sh, validate_install_kit.sh, and optional InnoSetup exe rebuild."
|
||||
;;
|
||||
windows-i18n)
|
||||
TASK="Prepare a validation checklist for Windows localized account names and Cyrillic handling: CP866 query.exe decoding, SHARKON2025_Администратор scheduled task, WinRM output, SSH checks, and ActivityWatch Launch fallback rules."
|
||||
;;
|
||||
*)
|
||||
TASK="$*"
|
||||
;;
|
||||
esac
|
||||
|
||||
if [[ ! -x "$METAGPT_BIN" ]]; then
|
||||
echo "MetaGPT wrapper not found or not executable: $METAGPT_BIN" >&2
|
||||
exit 2
|
||||
fi
|
||||
|
||||
mkdir -p "$OUT_DIR"
|
||||
STAMP="$(date +%Y%m%d-%H%M%S)"
|
||||
SLUG="$(printf '%s' "$TASK" | tr '[:upper:]' '[:lower:]' | tr -cs '[:alnum:]' '-' | sed 's/^-//; s/-$//; s/--*/-/g; s/^$/task/' | cut -c1-80)"
|
||||
OUT="$OUT_DIR/$STAMP-$SLUG.md"
|
||||
|
||||
PROMPT="$(cat <<PROMPT_EOF
|
||||
You are a technical scout for the ActivityWatch-Russian project.
|
||||
|
||||
Repository:
|
||||
- Path: /mnt/usb_hdd2/Projects/ActivityWatch-Russian
|
||||
- Purpose: enterprise ActivityWatch deployment with RU WebUI patching, Windows PowerShell collectors, Ansible automation, Grafana/Prometheus/Influx monitoring, 1C/DLP integrations, and install-kit-awindows packaging.
|
||||
|
||||
Hard constraints:
|
||||
- Answer in Russian.
|
||||
- Be concise, practical, and implementation-ready.
|
||||
- Do not browse the web.
|
||||
- Do not use Browser, Editor, Terminal, Search, or file-writing tools.
|
||||
- Do not create project files inside MetaGPT workspace.
|
||||
- Do not delegate to other agents; return the final answer directly.
|
||||
- Do not invent secrets, credentials, or unverified production facts.
|
||||
- Prefer checklists, exact commands, file paths, rollback points, and validation evidence.
|
||||
- Assume Groq/free-tier constraints: keep the response compact.
|
||||
|
||||
Known operational facts:
|
||||
- AW server: http://10.10.10.13:5600
|
||||
- Worktime API: http://10.10.10.13:5610
|
||||
- Grafana: http://10.10.10.11:3000
|
||||
- RDP host: 192.168.100.18 / SHARKON2025
|
||||
- Ansible inventory: ansible/inventory.ini
|
||||
- Windows deploy root: C:\\Program Files\\AWatch-rus
|
||||
- Windows state root: C:\\ProgramData\\AWatch-rus
|
||||
- Localized built-in Administrator launch task: ActivityWatch Launch [SHARKON2025_Администратор]
|
||||
- For localized Windows console output, prefer query.exe user via CP866 decoding and emit UTF-8.
|
||||
|
||||
Task:
|
||||
$TASK
|
||||
|
||||
Required output:
|
||||
1. Цель проверки или изменения.
|
||||
2. Минимальный план действий.
|
||||
3. Команды/файлы, которые надо использовать.
|
||||
4. Критерии успеха.
|
||||
5. Rollback or recovery path.
|
||||
6. Risks and gaps that must be verified locally by Codex/operator.
|
||||
PROMPT_EOF
|
||||
)"
|
||||
|
||||
{
|
||||
echo "# MetaGPT AW Scout"
|
||||
echo
|
||||
echo "- Date: $(date -Is)"
|
||||
echo "- Task: $TASK"
|
||||
echo "- Engine: $METAGPT_AW_ENGINE"
|
||||
echo "- Command: direct LLM via $METAGPT_CONFIG"
|
||||
echo
|
||||
echo "## Output"
|
||||
echo
|
||||
} > "$OUT"
|
||||
|
||||
set +e
|
||||
if [[ "$METAGPT_AW_ENGINE" == "team" ]]; then
|
||||
timeout "$METAGPT_AW_TIMEOUT" "$METAGPT_BIN" --investment "$METAGPT_AW_INVESTMENT" --n-round "$METAGPT_AW_N_ROUND" --no-implement --project-name "aw-scout-$STAMP" "$PROMPT" 2>&1 | tee -a "$OUT"
|
||||
else
|
||||
/home/igor/labs/metagpt-lab/.venv/bin/python - "$METAGPT_CONFIG" "$PROMPT" <<'PY' 2>&1 | tee -a "$OUT"
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
import yaml
|
||||
from openai import OpenAI
|
||||
|
||||
config_path = Path(sys.argv[1])
|
||||
prompt = sys.argv[2]
|
||||
cfg = yaml.safe_load(config_path.read_text(encoding="utf-8"))["llm"]
|
||||
client = OpenAI(
|
||||
api_key=cfg["api_key"],
|
||||
base_url=(cfg.get("base_url") or "https://api.openai.com/v1").rstrip("/"),
|
||||
)
|
||||
response = client.chat.completions.create(
|
||||
model=cfg.get("model") or "gpt-4.1-mini",
|
||||
messages=[
|
||||
{
|
||||
"role": "system",
|
||||
"content": (
|
||||
"Ты практичный технический ревьюер ActivityWatch-Russian. "
|
||||
"Отвечай по-русски, кратко, с командами и критериями проверки. "
|
||||
"Не выдумывай факты, помечай непроверенное как гипотезу."
|
||||
),
|
||||
},
|
||||
{"role": "user", "content": prompt},
|
||||
],
|
||||
temperature=0.2,
|
||||
max_tokens=1800,
|
||||
)
|
||||
print(response.choices[0].message.content.strip())
|
||||
PY
|
||||
fi
|
||||
status=${PIPESTATUS[0]}
|
||||
set -e
|
||||
|
||||
{
|
||||
echo
|
||||
echo "## Exit Status"
|
||||
echo
|
||||
echo "$status"
|
||||
} >> "$OUT"
|
||||
|
||||
echo
|
||||
echo "Saved: $OUT"
|
||||
exit "$status"
|
||||
Reference in New Issue
Block a user