---
type: note
tags: [ia, process, OpenCode]
univers: PRO
nature: documentation
status: active
title: "VPS-IA_Historique-Projet-Sessions-OpenCode"
description: "Génère un journal d'améliorations jour par jour depuis la base SQLite des sessions OpenCode."
projects:
  - [[03_PROJETS/VPS-IA]]
---

# Génération d'historique projet à partir des sessions OpenCode

## Objectif

Produire un log des améliorations réalisées sur les projets VPS-IA et VPS-OVH-PERSO à partir des sessions OpenCode, jour par jour, avec tags de type pour filtrage.

## Format

* [[01_JOURNAL/2026/2026-MM-DD]] - #TAG : évolution réalisée -> [[liens vers sources, documentation]]

## Tags (nomenclature)

| Tag | Usage |
|---|---|
| #VPS-Securisation | SSH, fail2ban, audit, secrets, ntfy |
| #VPS-MCP | serveurs MCP (Silverbullet, Excalidraw…) |
| #VPS-Skill | création / mise à jour de skills |
| #VPS-Agent | création / mise à jour d'agents |
| #VPS-OpenCode | config OpenCode, contexte global, mémoire |
| #VPS-Script | scripts (costs, sync, consolidation…) |
| #VPS-Infra | système : mises à jour, upload, logrotate |
| #VPS-PKM | organisation PKM, réunions, journal |

Règle : 1 tag principal par ligne (parfois 2 si pertinent) pour des requêtes simples.

## Méthode

1. Lister les sessions depuis la base SQLite OpenCode (tables session_v2 / session_message) :

    sqlite3 ~/.local/share/opencode/opencode.db \
      "SELECT id, title, agent, date(time_created/1000,'unixepoch','localtime') AS jour \
       FROM session_v2 WHERE time_created >= strftime('%s','2026-10-07 00:00:00') \
       ORDER BY time_created;"

2. Extraire le fil de chaque session (messages user + assistant) depuis session_message (colonne data JSON, champ text / content[].text), en datant chaque échange via time.created des messages user.

3. Identifier les améliorations, les regrouper par jour, rédiger au format log avec 1 tag principal par ligne.

4. Insérer dans la section "## Suivie et améliorations" des pages projets (03_PROJETS/VPS-IA, 03_PROJETS/VPS-OVH-PERSO).

5. Ajouter la table unique des évolutions (les tags sur lignes de liste sont indexés et requêtables via index.items()) :

```lua
${query[[
  from t = index.items()
  where t.page == _CTX.currentPage.name
    and string.startsWith(t.text, "[[01_JOURNAL/2026/")
  order by t.text desc
  select {
    REF = "[[" .. t.ref .. "]]",
    DATE = "[[01_JOURNAL/2026/" .. string.match(t.text, "(%d%d%d%d%-%d%d%-%d%d)") .. "]]",
    TAGS = table.concat(t.tags, ", "),
    TEXT = t.text
  }
]]}
```


## Points d'attention

- Mise à jour incrémentale : ajouter une ligne datée au fil de l'eau, pas besoin de reclasser.
- Le lien date pointe vers le journal (contexte du jour) ; les jours sans page créent un lien rouge cliquable.
- La table unique permet de filtrer/trier par tag, date ou texte ; le log reste la source de vérité chronologique.
