瀏覽代碼

[#1] Fix PDF corruption via renormalization and add Uninstall Guide for WSL and Windows

Lange François 2 周之前
父節點
當前提交
60960e76fc
共有 100 個文件被更改,包括 246 次插入74 次删除
  1. 1 1
      .agents/workflows/pre_flight_check.md
  2. 1 1
      .agents/workflows/taiga-commit.md
  3. 11 4
      .gitattributes
  4. 1 1
      .gitignore
  5. 1 1
      PROJECT_CONTEXT.md
  6. 二進制
      Project.pdf
  7. 二進制
      Retro Planning.pdf
  8. 1 1
      add_logging.py
  9. 1 1
      alembic/env.py
  10. 1 1
      alembic/versions/701a919f4025_initial_schema.py
  11. 1 1
      check_users.py
  12. 2 2
      configure_zabbix_alerts.py
  13. 1 1
      configure_zabbix_email.py
  14. 1 1
      dags/openfoodfacts_ingestion.py
  15. 1 1
      data_sync.sh
  16. 二進制
      delivery.zip
  17. 1 1
      deploy.sh
  18. 1 1
      docker-compose-wsl.yml
  19. 1 1
      docker-compose.yml
  20. 1 1
      docker-compose_skip.yml
  21. 1 1
      docker/app/Dockerfile
  22. 1 1
      docker/ingest/Dockerfile
  23. 1 1
      docker/mysql/Dockerfile
  24. 1 1
      docker/zabbix/docker-compose.yml
  25. 二進制
      docs/Backup_Procedure.pdf
  26. 二進制
      docs/Data_Ingestion.pdf
  27. 二進制
      docs/Final_Report.pdf
  28. 二進制
      docs/Installation_Guide.pdf
  29. 二進制
      docs/Operator_Installation_Guide.pdf
  30. 二進制
      docs/Scrum_Artifacts.pdf
  31. 二進制
      docs/Scrum_Daily.pdf
  32. 二進制
      docs/Scrum_Plan.pdf
  33. 二進制
      docs/Scrum_Retro.pdf
  34. 二進制
      docs/Scrum_Review.pdf
  35. 3 0
      docs/Scrum_Wiki.md
  36. 二進制
      docs/Scrum_Wiki.pdf
  37. 二進制
      docs/Start_Stop_Procedures.pdf
  38. 二進制
      docs/Technical_Document.pdf
  39. 二進制
      docs/Test_Cases_Sprint8.pdf
  40. 二進制
      docs/URL_Formats.pdf
  41. 79 0
      docs/Uninstall_Guide.md
  42. 二進制
      docs/Uninstall_Guide.pdf
  43. 二進制
      docs/User_Description.pdf
  44. 二進制
      docs/User_Guide.pdf
  45. 二進制
      docs/WSL_Deployment.pdf
  46. 二進制
      docs/Wiki_Home.pdf
  47. 二進制
      docs/architecture.pdf
  48. 1 1
      docs/disaster_recovery_plan.md
  49. 二進制
      docs/disaster_recovery_plan.pdf
  50. 1 1
      docs/distributed_deployment.md
  51. 二進制
      docs/distributed_deployment.pdf
  52. 1 1
      docs/docker_connection.md
  53. 二進制
      docs/docker_connection.pdf
  54. 二進制
      docs/fonts/Roboto-Bold.ttf
  55. 二進制
      docs/fonts/Roboto-Regular.ttf
  56. 二進制
      docs/fonts/RobotoMono-Regular.ttf
  57. 二進制
      docs/project_report.pdf
  58. 1 1
      docs/retro_planning.md
  59. 二進制
      docs/retro_planning.pdf
  60. 1 1
      docs/taiga_audit_report.md
  61. 二進制
      docs/taiga_audit_report.pdf
  62. 1 1
      docs/zabbix_monitoring.md
  63. 二進制
      docs/zabbix_monitoring.pdf
  64. 1 1
      download_csv.sh
  65. 二進制
      e9fa96c9-18ae-4afb-861a-68faea1fde08.png
  66. 83 0
      generate_docs.py
  67. 1 1
      ingest_csv.py
  68. 1 1
      init.sql
  69. 1 1
      local_tools/apply_port_offset.py
  70. 1 1
      local_tools/archive_scratch.py
  71. 1 1
      local_tools/close_and_export_taiga.py
  72. 1 1
      local_tools/setup_filters.bat
  73. 1 1
      local_tools/setup_filters.sh
  74. 1 1
      master_trigger.sh
  75. 1 1
      myloginpath.py
  76. 1 1
      proper_reset.sh
  77. 1 1
      requirements.txt
  78. 1 1
      reset.sh
  79. 1 1
      rotate_passwords.py
  80. 1 1
      scratch/test_dr.sh
  81. 1 1
      scratch/test_filter.py
  82. 3 3
      scratch/test_new_regex.py
  83. 5 5
      scratch/test_regex.py
  84. 1 1
      scratch/test_regex_2.py
  85. 1 1
      scripts/create_delivery_zip.py
  86. 1 1
      scripts/deploy_to_server.py
  87. 1 1
      scripts/manage_models.sh
  88. 1 1
      scripts/setup_deploy.py
  89. 2 2
      scripts/taiga_sync_final.py
  90. 1 1
      scripts/zip_project.py
  91. 1 1
      searxng/settings.yml
  92. 1 1
      setup_app.sh
  93. 1 1
      skills/code-review/SKILL.md
  94. 1 1
      skills/doc-writer/SKILL.md
  95. 1 1
      skills/expert-coach/SKILL.md
  96. 1 1
      skills/git-commit/SKILL.md
  97. 1 1
      skills/refactor-coach/SKILL.md
  98. 1 1
      skills/sql-optimizer/SKILL.md
  99. 1 1
      skills/test-generator/SKILL.md
  100. 2 2
      snmp_notifier.py

+ 1 - 1
.agents/workflows/pre_flight_check.md

@@ -1,4 +1,4 @@
-The current version is #ident "@(#)$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+The current version is #ident "@(#)$Format:LocalFoodAI_lanfr144:pre_flight_check.md:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
 
 ---
 description: Hardware limits pre-flight check before builds

+ 1 - 1
.agents/workflows/taiga-commit.md

@@ -1,4 +1,4 @@
-The current version is #ident "@(#)$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+The current version is #ident "@(#)$Format:LocalFoodAI_lanfr144:taiga-commit.md:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
 
 # Taiga Commit Workflow
 Description: Garantit que chaque commit contient l'ID Taiga pour la mise à jour automatique.

+ 11 - 4
.gitattributes

@@ -1,4 +1,4 @@
-#ident "@(#)$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+#ident "@(#)$Format:LocalFoodAI_lanfr144:.gitattributes:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
 * text=auto
 # # 1. Forcer le format de date requis YYYY/MM/DD HH:MM:SS
 # git config log.date "format:%Y/%m/%d %H:%M:%S"
@@ -7,14 +7,14 @@
 # git config filter.ident-dynamic.smudge '
 #   proj=$(basename "$(git rev-parse --show-toplevel)");
 #   file="%f";
-#   perl -pe "s|\\\$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$|\\\$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$proj:\$file:\$1\\\$|g" | \
+#   perl -pe "s|\\\$Format:LocalFoodAI_lanfr144:.gitattributes:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$|\\\$Format:LocalFoodAI_lanfr144:.gitattributes:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$proj:\$file:\$1\\\$|g" | \
 #   git archive --subst-vars | cat
 # '
 # 
 # # 3. Configurer le filtre "Clean" (Nettoyage avant le commit pour éviter les conflits)
 # # The LEFT PART OF THE PIPE MUST BE "$Format:PROJECT_NAME:FILE_NAME"
 # git config filter.ident-dynamic.clean '
-#   perl -pe "s|\\\$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$|\\\$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$1\\\$|g"
+#   perl -pe "s|\\\$Format:LocalFoodAI_lanfr144:.gitattributes:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$|\\\$Format:LocalFoodAI_lanfr144:.gitattributes:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$1\\\$|g"
 # '
 # 
 # 1. Protection du script de filtre pour Unix/WSL
@@ -36,4 +36,11 @@ local_tools/git-ident-filter.py filter=ident-dynamic eol=lf
 .env.example filter=ident-dynamic
 *.sql filter=ident-dynamic
 .gitignore filter=ident-dynamic
-Dockerfile filter=ident-dynamic
+Dockerfile filter=ident-dynamic
+
+# Binary files definition (prevents line ending normalization and text corruption)
+*.pdf binary
+*.zip binary
+*.png binary
+*.docx binary
+*.ttf binary

+ 1 - 1
.gitignore

@@ -1,4 +1,4 @@
-#ident "@(#)$Format:DEVOP1:.gitignore:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+#ident "@(#)$Format:LocalFoodAI_lanfr144:.gitignore:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
 *.agent-backup
 *.csv
 *.db

+ 1 - 1
PROJECT_CONTEXT.md

@@ -1,4 +1,4 @@
-The current version is #ident "@(#)$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+The current version is #ident "@(#)$Format:LocalFoodAI_lanfr144:PROJECT_CONTEXT.md:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
 
 # Project Context: Local Food AI
 

二進制
Project.pdf


二進制
Retro Planning.pdf


+ 1 - 1
add_logging.py

@@ -1,4 +1,4 @@
-#ident "@(#)$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+#ident "@(#)$Format:LocalFoodAI_lanfr144:add_logging.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
 import os
 
 files_to_update = ['scripts/setup_deploy.py', 'docker-compose.yml', 'docker/zabbix/docker-compose.yml']

+ 1 - 1
alembic/env.py

@@ -1,4 +1,4 @@
-#ident "@(#)$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+#ident "@(#)$Format:LocalFoodAI_lanfr144:env.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
 from logging.config import fileConfig
 
 from sqlalchemy import engine_from_config

+ 1 - 1
alembic/versions/701a919f4025_initial_schema.py

@@ -1,4 +1,4 @@
-#ident "@(#)$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+#ident "@(#)$Format:LocalFoodAI_lanfr144:701a919f4025_initial_schema.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
 """initial_schema
 
 Revision ID: 701a919f4025

+ 1 - 1
check_users.py

@@ -1,4 +1,4 @@
-#ident "@(#)$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+#ident "@(#)$Format:LocalFoodAI_lanfr144:check_users.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
 import myloginpath
 import pymysql
 import bcrypt

+ 2 - 2
configure_zabbix_alerts.py

@@ -1,6 +1,6 @@
-#ident "@(#)$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+#ident "@(#)$Format:LocalFoodAI_lanfr144:configure_zabbix_alerts.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
 import json
-#ident "@(#)$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+#ident "@(#)$Format:LocalFoodAI_lanfr144:configure_zabbix_alerts.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
 import urllib.request
 import os
 

+ 1 - 1
configure_zabbix_email.py

@@ -1 +1 @@
-#ident "@(#)$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+#ident "@(#)$Format:LocalFoodAI_lanfr144:configure_zabbix_email.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"

+ 1 - 1
dags/openfoodfacts_ingestion.py

@@ -1,4 +1,4 @@
-#ident "@(#)$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+#ident "@(#)$Format:LocalFoodAI_lanfr144:openfoodfacts_ingestion.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
 from airflow import DAG
 from airflow.operators.python import PythonOperator
 from airflow.providers.docker.operators.docker import DockerOperator

+ 1 - 1
data_sync.sh

@@ -1,5 +1,5 @@
 #!/bin/bash
-#ident "@(#)$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+#ident "@(#)$Format:LocalFoodAI_lanfr144:data_sync.sh:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
 # data_sync.sh - Automated Data Freshness Pipeline
 
 LOG_DIR="./logs"

二進制
delivery.zip


+ 1 - 1
deploy.sh

@@ -1,5 +1,5 @@
 #!/bin/bash
-#ident "@(#)$Format:LocalFoodAI:deploy.sh:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+#ident "@(#)$Format:LocalFoodAI_lanfr144:deploy.sh:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
 # -----------------------------------------------------------------------------
 # Naked Environment Deployment Script for Ubuntu 24.04
 # Run this script to seamlessly fully provision the server for the AI Web App.

+ 1 - 1
docker-compose-wsl.yml

@@ -1,4 +1,4 @@
-#ident "@(#)$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+#ident "@(#)$Format:LocalFoodAI_lanfr144:docker-compose-wsl.yml:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
 services:
   mysql:
     build:

+ 1 - 1
docker-compose.yml

@@ -1,4 +1,4 @@
-#ident "@(#)$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+#ident "@(#)$Format:LocalFoodAI_lanfr144:docker-compose.yml:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
 services:
   mysql:
     build:

+ 1 - 1
docker-compose_skip.yml

@@ -1,4 +1,4 @@
-#ident "@(#)$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+#ident "@(#)$Format:LocalFoodAI_lanfr144:docker-compose_skip.yml:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
 services:
   mysql:
     build:

+ 1 - 1
docker/app/Dockerfile

@@ -1,4 +1,4 @@
-#ident "@(#)$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+#ident "@(#)$Format:LocalFoodAI_lanfr144:Dockerfile:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
 # Dockerfile for Streamlit UI
 FROM python:3.11-slim
 

+ 1 - 1
docker/ingest/Dockerfile

@@ -1,4 +1,4 @@
-#ident "@(#)$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+#ident "@(#)$Format:LocalFoodAI_lanfr144:Dockerfile:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
 # Dockerfile for ingestion service
 FROM python:3.11-slim
 

+ 1 - 1
docker/mysql/Dockerfile

@@ -1,4 +1,4 @@
-#ident "@(#)$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+#ident "@(#)$Format:LocalFoodAI_lanfr144:Dockerfile:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
 FROM mysql:8.0
 
 # Minimal MySQL Dockerfile – no custom config or init scripts

+ 1 - 1
docker/zabbix/docker-compose.yml

@@ -1,4 +1,4 @@
-#ident "@(#)$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+#ident "@(#)$Format:LocalFoodAI_lanfr144:docker-compose.yml:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
 version: '3.5'
 services:
   zabbix-server:

二進制
docs/Backup_Procedure.pdf


二進制
docs/Data_Ingestion.pdf


二進制
docs/Final_Report.pdf


二進制
docs/Installation_Guide.pdf


二進制
docs/Operator_Installation_Guide.pdf


二進制
docs/Scrum_Artifacts.pdf


二進制
docs/Scrum_Daily.pdf


二進制
docs/Scrum_Plan.pdf


二進制
docs/Scrum_Retro.pdf


二進制
docs/Scrum_Review.pdf


+ 3 - 0
docs/Scrum_Wiki.md

@@ -31,6 +31,9 @@ Welcome to the static Scrum documentation portal. This master wiki aggregates an
 ### 6. [Sprint 8 Test Cases (Test_Cases_Sprint8.md)](Test_Cases_Sprint8.pdf)
 *Legacy acceptance test logs covering core NLP chat, portion converters, and initial search validations.*
 
+### 7. [Uninstallation Guide (Uninstall_Guide.md)](Uninstall_Guide.pdf)
+*Provides structured procedures to completely remove and tear down all system components from Windows and Linux/WSL environments.*
+
 ---
 
 > [!NOTE]

二進制
docs/Scrum_Wiki.pdf


二進制
docs/Start_Stop_Procedures.pdf


二進制
docs/Technical_Document.pdf


二進制
docs/Test_Cases_Sprint8.pdf


二進制
docs/URL_Formats.pdf


+ 79 - 0
docs/Uninstall_Guide.md

@@ -0,0 +1,79 @@
+The current version is #ident "@(#)$Format:LocalFoodAI_lanfr144:Uninstall_Guide.md:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+
+
+# Local Food AI - Uninstallation & Teardown Guide
+
+This document outlines the standard uninstallation procedures to completely remove the **Local Food AI** stack components from both Windows hosts and Linux/WSL deployment environments.
+
+---
+
+## 1. Linux & WSL Client Uninstallation
+
+To cleanly purge the containerized services, databases, virtual environments, and log files:
+
+### Step 1.1: Stop & Remove Docker Containers & Volumes
+Bring down the Docker Compose stack and permanently delete all associated network interfaces and database volumes:
+```bash
+# Navigate to the project directory
+cd /dossier/du/projet/Food
+
+# Stop services and remove containers, networks, and volumes
+./manage_services.sh stop
+docker compose down -v
+```
+*Note: The `-v` flag is critical as it completely purges the MySQL persistent data directories.*
+
+### Step 1.2: Remove Local Project Docker Images
+Clean up the built application images from the local Docker cache:
+```bash
+docker rmi food-app food-ingest
+```
+
+### Step 1.3: Clean Up Virtual Environments, Logs & Backups
+Delete local administrator logs, backup directories, and Python virtual environment libraries:
+```bash
+rm -rf .venv/
+rm -rf backups/
+rm -rf logs/
+rm -rf data/
+```
+
+### Step 1.4: Purge Docker CE (Optional)
+If you wish to completely uninstall Docker CE from the Ubuntu/WSL environment:
+```bash
+sudo apt-get purge -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras
+sudo rm -rf /var/lib/docker
+sudo rm -rf /var/lib/containerd
+```
+
+---
+
+## 2. Windows Host Uninstallation
+
+To remove all hypervisor and subsystem configurations from the Windows client:
+
+### Step 2.1: Unregister and Delete the WSL Subsystem Environment
+To completely wipe the WSL2 Ubuntu environment and its entire virtual hard disk (VHD):
+1. Open a PowerShell terminal as Administrator.
+2. Execute the unregister command:
+```powershell
+wsl --unregister Dopro1
+```
+*Warning: This action is irreversible. All configurations, tools, and code inside the WSL `Dopro1` container will be permanently deleted.*
+
+### Step 2.2: Remove VirtualBox Virtual Machines (if applicable)
+If you deployed Ollama or Zabbix nodes on dedicated VirtualBox VMs:
+1. Open PowerShell or Command Prompt.
+2. Run the VBoxManage tool to remove the VMs:
+```cmd
+VBoxManage unregistervm "Ollama_Server" --delete
+VBoxManage unregistervm "Zabbix_Server" --delete
+```
+
+### Step 2.3: Disable Windows Virtualization Features (Optional)
+To disable WSL and Virtual Machine Platform features on the Windows host:
+```powershell
+Disable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
+Disable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform
+```
+*Note: A system reboot is required to complete this step.*

二進制
docs/Uninstall_Guide.pdf


二進制
docs/User_Description.pdf


二進制
docs/User_Guide.pdf


二進制
docs/WSL_Deployment.pdf


二進制
docs/Wiki_Home.pdf


二進制
docs/architecture.pdf


+ 1 - 1
docs/disaster_recovery_plan.md

@@ -1,4 +1,4 @@
-The current version is #ident "@(#)$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+The current version is #ident "@(#)$Format:LocalFoodAI_lanfr144:disaster_recovery_plan.md:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
 
 # Disaster Recovery & Backup Plan
 

二進制
docs/disaster_recovery_plan.pdf


+ 1 - 1
docs/distributed_deployment.md

@@ -1,4 +1,4 @@
-The current version is #ident "@(#)$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+The current version is #ident "@(#)$Format:LocalFoodAI_lanfr144:distributed_deployment.md:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
 
 # Distributed Deployment Guide
 

二進制
docs/distributed_deployment.pdf


+ 1 - 1
docs/docker_connection.md

@@ -1,5 +1,5 @@
 # Docker Connection & Health Check Guide
-The current version is #ident "@(#)$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+The current version is #ident "@(#)$Format:LocalFoodAI_lanfr144:docker_connection.md:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
 
 This document explains how to interact with the various Docker containers that power the Local Food AI system.
 

二進制
docs/docker_connection.pdf


二進制
docs/fonts/Roboto-Bold.ttf


二進制
docs/fonts/Roboto-Regular.ttf


二進制
docs/fonts/RobotoMono-Regular.ttf


二進制
docs/project_report.pdf


+ 1 - 1
docs/retro_planning.md

@@ -1,4 +1,4 @@
-The current version is #ident "@(#)$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+The current version is #ident "@(#)$Format:LocalFoodAI_lanfr144:retro_planning.md:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
 
 # Local Food AI: Retro Planning
 

二進制
docs/retro_planning.pdf


+ 1 - 1
docs/taiga_audit_report.md

@@ -1,4 +1,4 @@
-The current version is #ident "@(#)$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+The current version is #ident "@(#)$Format:LocalFoodAI_lanfr144:taiga_audit_report.md:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
 
 # Taiga Agile Audit Report
 

二進制
docs/taiga_audit_report.pdf


+ 1 - 1
docs/zabbix_monitoring.md

@@ -1,4 +1,4 @@
-The current version is #ident "@(#)$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+The current version is #ident "@(#)$Format:LocalFoodAI_lanfr144:zabbix_monitoring.md:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
 
 # Zabbix Telemetry & Monitoring Guide
 

二進制
docs/zabbix_monitoring.pdf


+ 1 - 1
download_csv.sh

@@ -1,5 +1,5 @@
 #!/bin/bash
-#ident "@(#)$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+#ident "@(#)$Format:LocalFoodAI_lanfr144:download_csv.sh:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
 # download latest OpenFoodFacts CSVs if not present or if newer version exists
 DATA_DIR="$(dirname "$0")/data"
 mkdir -p "$DATA_DIR"

二進制
e9fa96c9-18ae-4afb-861a-68faea1fde08.png


+ 83 - 0
generate_docs.py

@@ -635,6 +635,9 @@ Welcome to the static Scrum documentation portal. This master wiki aggregates an
 ### 6. [Sprint 8 Test Cases (Test_Cases_Sprint8.md)](Test_Cases_Sprint8.pdf)
 *Legacy acceptance test logs covering core NLP chat, portion converters, and initial search validations.*
 
+### 7. [Uninstallation Guide (Uninstall_Guide.md)](Uninstall_Guide.pdf)
+*Provides structured procedures to completely remove and tear down all system components from Windows and Linux/WSL environments.*
+
 ---
 
 > [!NOTE]
@@ -1008,6 +1011,86 @@ Run these test cases to verify the installation:
 | **TC-OP-03** | Ask Chat: 'Can I eat sushi?' | llama3.2:3b retrieves database context and flags raw fish as forbidden for pregnancy. | `[ ]` |
 | **TC-OP-04** | Trigger manual db backup | Timestamped compressed .sql.gz created inside backups/ folder. | `[ ]` |
 | **TC-OP-05** | Terminate Ollama Container | Zabbix PROBLEM active alert generated on dashboard in < 30 seconds. | `[ ]` |
+""",
+    "Uninstall_Guide.md": """The current version is #ident "@(#)$Format:LocalFoodAI_lanfr144:generate_docs.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+
+
+# Local Food AI - Uninstallation & Teardown Guide
+
+This document outlines the standard uninstallation procedures to completely remove the **Local Food AI** stack components from both Windows hosts and Linux/WSL deployment environments.
+
+---
+
+## 1. Linux & WSL Client Uninstallation
+
+To cleanly purge the containerized services, databases, virtual environments, and log files:
+
+### Step 1.1: Stop & Remove Docker Containers & Volumes
+Bring down the Docker Compose stack and permanently delete all associated network interfaces and database volumes:
+```bash
+# Navigate to the project directory
+cd /dossier/du/projet/Food
+
+# Stop services and remove containers, networks, and volumes
+./manage_services.sh stop
+docker compose down -v
+```
+*Note: The `-v` flag is critical as it completely purges the MySQL persistent data directories.*
+
+### Step 1.2: Remove Local Project Docker Images
+Clean up the built application images from the local Docker cache:
+```bash
+docker rmi food-app food-ingest
+```
+
+### Step 1.3: Clean Up Virtual Environments, Logs & Backups
+Delete local administrator logs, backup directories, and Python virtual environment libraries:
+```bash
+rm -rf .venv/
+rm -rf backups/
+rm -rf logs/
+rm -rf data/
+```
+
+### Step 1.4: Purge Docker CE (Optional)
+If you wish to completely uninstall Docker CE from the Ubuntu/WSL environment:
+```bash
+sudo apt-get purge -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras
+sudo rm -rf /var/lib/docker
+sudo rm -rf /var/lib/containerd
+```
+
+---
+
+## 2. Windows Host Uninstallation
+
+To remove all hypervisor and subsystem configurations from the Windows client:
+
+### Step 2.1: Unregister and Delete the WSL Subsystem Environment
+To completely wipe the WSL2 Ubuntu environment and its entire virtual hard disk (VHD):
+1. Open a PowerShell terminal as Administrator.
+2. Execute the unregister command:
+```powershell
+wsl --unregister Dopro1
+```
+*Warning: This action is irreversible. All configurations, tools, and code inside the WSL `Dopro1` container will be permanently deleted.*
+
+### Step 2.2: Remove VirtualBox Virtual Machines (if applicable)
+If you deployed Ollama or Zabbix nodes on dedicated VirtualBox VMs:
+1. Open PowerShell or Command Prompt.
+2. Run the VBoxManage tool to remove the VMs:
+```cmd
+VBoxManage unregistervm "Ollama_Server" --delete
+VBoxManage unregistervm "Zabbix_Server" --delete
+```
+
+### Step 2.3: Disable Windows Virtualization Features (Optional)
+To disable WSL and Virtual Machine Platform features on the Windows host:
+```powershell
+Disable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
+Disable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform
+```
+*Note: A system reboot is required to complete this step.*
 """
 }
 

+ 1 - 1
ingest_csv.py

@@ -1,5 +1,5 @@
 #!/usr/bin/env python3
-#ident "@(#)$Format:LocalFoodAI:ingest_csv.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+#ident "@(#)$Format:LocalFoodAI_lanfr144:ingest_csv.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
 import pandas as pd
 import myloginpath
 import urllib.parse

+ 1 - 1
init.sql

@@ -1,4 +1,4 @@
---ident "@(#)$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+--ident "@(#)$Format:LocalFoodAI_lanfr144:init.sql:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
 -- Create databases
 CREATE DATABASE IF NOT EXISTS food_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
 CREATE DATABASE IF NOT EXISTS zabbix CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;

+ 1 - 1
local_tools/apply_port_offset.py

@@ -1,5 +1,5 @@
 #!/usr/bin/env python
-#ident "@(#)$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+#ident "@(#)$Format:LocalFoodAI_lanfr144:apply_port_offset.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
 import os
 import socket
 import sys

+ 1 - 1
local_tools/archive_scratch.py

@@ -1,5 +1,5 @@
 #!/usr/bin/env python
-#ident "@(#)$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+#ident "@(#)$Format:LocalFoodAI_lanfr144:archive_scratch.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
 import os
 import shutil
 

+ 1 - 1
local_tools/close_and_export_taiga.py

@@ -1,5 +1,5 @@
 #!/usr/bin/env python
-#ident "@(#)$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+#ident "@(#)$Format:LocalFoodAI_lanfr144:close_and_export_taiga.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
 import os
 import requests
 import json

+ 1 - 1
local_tools/setup_filters.bat

@@ -1,4 +1,4 @@
-::ident "@(#)$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+::ident "@(#)$Format:LocalFoodAI_lanfr144:setup_filters.bat:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
 @echo off
 :: Configuration des filtres avec des chemins relatifs portables (Git s'execute toujours a la racine du depot)
 @git config filter.ident-dynamic.clean "python local_tools/git-ident-filter.py clean"

+ 1 - 1
local_tools/setup_filters.sh

@@ -1,5 +1,5 @@
 #!/bin/sh
-#ident "@(#)$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+#ident "@(#)$Format:LocalFoodAI_lanfr144:setup_filters.sh:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
 git config filter.ident-dynamic.clean "python3 local_tools/git-ident-filter.py clean"
 git config filter.ident-dynamic.smudge "python3 local_tools/git-ident-filter.py smudge %f"
 git config log.date "format:%Y/%m/%d %H:%M:%S"

+ 1 - 1
master_trigger.sh

@@ -1,5 +1,5 @@
 #!/bin/bash
-#ident "@(#)$Format:LocalFoodAI:master_trigger.sh:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+#ident "@(#)$Format:LocalFoodAI_lanfr144:master_trigger.sh:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
 # Natively reload all database logic without interactive blocks
 echo "Executing autonomous WSL reload..."
 pip3 install --break-system-packages pymysql pandas sqlalchemy sqlalchemy-utils cryptography openpyxl

+ 1 - 1
myloginpath.py

@@ -1,4 +1,4 @@
-#ident "@(#)$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+#ident "@(#)$Format:LocalFoodAI_lanfr144:myloginpath.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
 import os
 
 def parse(login_path: str):

+ 1 - 1
proper_reset.sh

@@ -1,2 +1,2 @@
-#ident "@(#)$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+#ident "@(#)$Format:LocalFoodAI_lanfr144:proper_reset.sh:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
 mysql -e "SET GLOBAL log_bin_trust_function_creators = 1; DROP DATABASE IF EXISTS zabbix; CREATE DATABASE zabbix character set utf8mb4 collate utf8mb4_bin; GRANT ALL PRIVILEGES ON zabbix.* TO 'zabbix'@'%'; FLUSH PRIVILEGES;"

+ 1 - 1
requirements.txt

@@ -1,4 +1,4 @@
-#ident "@(#)$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+#ident "@(#)$Format:LocalFoodAI_lanfr144:requirements.txt:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
 pandas
 pymysql
 myloginpath

+ 1 - 1
reset.sh

@@ -1,5 +1,5 @@
 #!/bin/bash
-#ident "@(#)$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+#ident "@(#)$Format:LocalFoodAI_lanfr144:reset.sh:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
 cd /home/francois/food_project
 docker-compose stop mysql
 docker run -d --name mysql_temp_reset -v food_project_mysql_data:/var/lib/mysql mysql:8.0 --skip-grant-tables

+ 1 - 1
rotate_passwords.py

@@ -1 +1 @@
-#ident "@(#)$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+#ident "@(#)$Format:LocalFoodAI_lanfr144:rotate_passwords.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"

+ 1 - 1
scratch/test_dr.sh

@@ -1,5 +1,5 @@
 #!/bin/bash
-#ident "@(#)$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+#ident "@(#)$Format:LocalFoodAI_lanfr144:test_dr.sh:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
 # test_dr.sh - Automated Disaster Recovery validation script
 
 # 1. Find the latest backup

+ 1 - 1
scratch/test_filter.py

@@ -1,6 +1,6 @@
 import subprocess
 
-test_input = '#ident "@(#)$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"\n'
+test_input = '#ident "@(#)$Format:LocalFoodAI_lanfr144:test_filter.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"\n'
 
 # Test smudge
 p = subprocess.Popen(

+ 3 - 3
scratch/test_new_regex.py

@@ -4,12 +4,12 @@ import re
 clean_pattern = r'\$Format' + r':([^%:\r\n]+):([^%:\r\n]+):[^\r\n$]*?\$'
 
 def clean_content(content):
-    return re.sub(clean_pattern, r'$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$', content)
+    return re.sub(clean_pattern, r'$Format:LocalFoodAI_lanfr144:test_new_regex.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$', content)
 
 # Test cases
 test_app_py_lines = """
-#ident "@(#)LocalFoodAI:app.py:$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
-#ident "@(#)$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+#ident "@(#)LocalFoodAI:app.py:$Format:LocalFoodAI_lanfr144:test_new_regex.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+#ident "@(#)$Format:LocalFoodAI_lanfr144:test_new_regex.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
 """
 
 print("1. Testing clean on smudged headers:")

+ 5 - 5
scratch/test_regex.py

@@ -1,8 +1,8 @@
 import re
 
-pattern = r'\$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$)?[^$]*?\$'
-repl = r'$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$'
-content = '#ident "@(#)$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"\n'
+pattern = r'\$Format:LocalFoodAI_lanfr144:test_regex.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$)?[^$]*?\$'
+repl = r'$Format:LocalFoodAI_lanfr144:test_regex.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$'
+content = '#ident "@(#)$Format:LocalFoodAI_lanfr144:test_regex.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"\n'
 
 print("Testing clean pattern...")
 try:
@@ -11,8 +11,8 @@ try:
 except Exception as e:
     print("Clean pattern failed:", e)
 
-smudge_pattern = r'\$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$'
-replacement = "$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+smudge_pattern = r'\$Format:LocalFoodAI_lanfr144:test_regex.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$'
+replacement = "$Format:LocalFoodAI_lanfr144:test_regex.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
 print("Testing smudge pattern...")
 try:
     res = re.sub(smudge_pattern, replacement, content)

+ 1 - 1
scratch/test_regex_2.py

@@ -2,7 +2,7 @@ import re
 
 pattern = r'\$Format' + r':[^:]+:[^:]+:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N\$'
 repl = 'REPLACED'
-content = 'test $Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$ test'
+content = 'test $Format:LocalFoodAI_lanfr144:test_regex_2.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$ test'
 
 print("Pattern:", pattern)
 print("Content:", content)

+ 1 - 1
scripts/create_delivery_zip.py

@@ -1,5 +1,5 @@
 #!/usr/bin/env python3
-#ident "@(#)$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+#ident "@(#)$Format:LocalFoodAI_lanfr144:create_delivery_zip.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
 import os
 import zipfile
 import pathspec

+ 1 - 1
scripts/deploy_to_server.py

@@ -1,5 +1,5 @@
 #!/usr/bin/env python3
-#ident "@(#)$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+#ident "@(#)$Format:LocalFoodAI_lanfr144:deploy_to_server.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
 import os
 import sys
 import paramiko

+ 1 - 1
scripts/manage_models.sh

@@ -1,5 +1,5 @@
 #!/bin/bash
-#ident "@(#)$Format:LocalFoodAI:manage_models.sh:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+#ident "@(#)$Format:LocalFoodAI_lanfr144:manage_models.sh:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
 
 # Load LLM_MODEL from .env
 ENV_FILE=".env"

+ 1 - 1
scripts/setup_deploy.py

@@ -1,4 +1,4 @@
-#ident "@(#)$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+#ident "@(#)$Format:LocalFoodAI_lanfr144:setup_deploy.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
 import os
 import sys
 import getpass

+ 2 - 2
scripts/taiga_sync_final.py

@@ -1,6 +1,6 @@
-#ident "@(#)$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+#ident "@(#)$Format:LocalFoodAI_lanfr144:taiga_sync_final.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
 import requests
-#ident "@(#)$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+#ident "@(#)$Format:LocalFoodAI_lanfr144:taiga_sync_final.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
 import urllib3
 import os
 import re

+ 1 - 1
scripts/zip_project.py

@@ -1,5 +1,5 @@
 #!/usr/bin/env python3
-#ident "@(#)$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+#ident "@(#)$Format:LocalFoodAI_lanfr144:zip_project.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
 # Alias for create_delivery_zip.py
 import os
 import sys

+ 1 - 1
searxng/settings.yml

@@ -1,4 +1,4 @@
-#ident "@(#)$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+#ident "@(#)$Format:LocalFoodAI_lanfr144:settings.yml:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
 use_default_settings: true
 
 search:

+ 1 - 1
setup_app.sh

@@ -1,5 +1,5 @@
 #!/bin/bash
-#ident "@(#)$Format:LocalFoodAI:setup_app.sh:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$""
+#ident "@(#)$Format:LocalFoodAI_lanfr144:setup_app.sh:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$""
 # ==============================================================================
 # Local Food AI - WSL Application Setup Script
 # Run inside the WSL Ubuntu environment

+ 1 - 1
skills/code-review/SKILL.md

@@ -1,4 +1,4 @@
-The current version is #ident "@(#)$Format:DEVOP1:skills/code-review/SKILL.md:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+The current version is #ident "@(#)$Format:LocalFoodAI_lanfr144:SKILL.md:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
 
 ---
 name: code-review

+ 1 - 1
skills/doc-writer/SKILL.md

@@ -1,4 +1,4 @@
-The current version is #ident "@(#)$Format:DEVOP1:skills/doc-writer/SKILL.md:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+The current version is #ident "@(#)$Format:LocalFoodAI_lanfr144:SKILL.md:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
 
 ---
 name: doc-writer

+ 1 - 1
skills/expert-coach/SKILL.md

@@ -1,4 +1,4 @@
-The current version is #ident "@(#)$Format:DEVOP1:skills/expert-coach/SKILL.md:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+The current version is #ident "@(#)$Format:LocalFoodAI_lanfr144:SKILL.md:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
 
 ---
 name: expert-coach

+ 1 - 1
skills/git-commit/SKILL.md

@@ -1,4 +1,4 @@
-The current version is #ident "@(#)$Format:DEVOP1:skills/git-commit/SKILL.md:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+The current version is #ident "@(#)$Format:LocalFoodAI_lanfr144:SKILL.md:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
 
 ---
 name: git-commit

+ 1 - 1
skills/refactor-coach/SKILL.md

@@ -1,4 +1,4 @@
-The current version is #ident "@(#)$Format:DEVOP1:skills/refactor-coach/SKILL.md:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+The current version is #ident "@(#)$Format:LocalFoodAI_lanfr144:SKILL.md:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
 
 ---
 name: refactor-coach

+ 1 - 1
skills/sql-optimizer/SKILL.md

@@ -1,4 +1,4 @@
-The current version is #ident "@(#)$Format:DEVOP1:skills/sql-optimizer/SKILL.md:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+The current version is #ident "@(#)$Format:LocalFoodAI_lanfr144:SKILL.md:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
 
 ---
 name: sql-optimizer

+ 1 - 1
skills/test-generator/SKILL.md

@@ -1,4 +1,4 @@
-The current version is #ident "@(#)$Format:DEVOP1:skills/test-generator/SKILL.md:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+The current version is #ident "@(#)$Format:LocalFoodAI_lanfr144:SKILL.md:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
 
 ---
 name: test-generator

+ 2 - 2
snmp_notifier.py

@@ -1,7 +1,7 @@
-#ident "@(#)$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+#ident "@(#)$Format:LocalFoodAI_lanfr144:snmp_notifier.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
 import os
 import socket
-#ident "@(#)$Format:LocalFoodAI:app.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
+#ident "@(#)$Format:LocalFoodAI_lanfr144:snmp_notifier.py:%an:%ae:%ad:%cn:%ce:%cd:%H:%D:%N$"
 import socket
 
 class SNMPNotifier:

Some files were not shown because too many files changed in this diff