R2: git = source de vérité — src/nodes/ + build/extract intégrés au push

- src/nodes/*.js (6 nodes + template snapshot) = source de vérité unique.
- n8n-push.mjs reconstruit le JSON depuis src/ avant syntaxe+golden+PUT
  (src gagne toujours; n8n-extract.mjs pour resynchroniser si édition UI).
- n8n-build.mjs --check pour vérifier la synchro.
- Copies historiques déplacées dans archive/ (mortes, dérivées de la prod).
- .gitignore: backups locaux de rollback.
- AGENTS.md: règle R2 pour toutes les futures sessions (dont Qwen local).
- Validé: idempotence, mutation/restauration, pipeline push complet en réel.
This commit is contained in:
Tallagrand Thierry
2026-08-07 21:03:52 +02:00
parent b10c90c74f
commit 1ae8129658
78 changed files with 5132 additions and 0 deletions

99
archive/build.js Normal file
View File

@@ -0,0 +1,99 @@
const root = $input.first().json || {};
const decision = root.decision || {};
const calls = root.ha_service_calls || {};
const actions = [];
function pushAction(action, call) {
if (!call) return;
actions.push({
json: {
action,
...call
}
});
}
// Helpers toujours mis à jour
pushAction('helper_state', calls.helper_state);
pushAction('helper_current_decision', calls.helper_current_decision);
pushAction('helper_reason', calls.helper_reason);
pushAction('helper_operating_mode', calls.helper_operating_mode);
pushAction('helper_target_current', calls.helper_target_current);
pushAction('helper_budget_remaining', calls.helper_budget_remaining);
pushAction('helper_projected_soc', calls.helper_projected_soc);
pushAction('helper_cloud_debt', calls.helper_cloud_debt);
pushAction('helper_dynamic_ok', calls.helper_dynamic_ok);
pushAction('helper_must_stop', calls.helper_must_stop);
// Helpers V1.4 additionnels
if (decision.set_cloud_debt_started_at) {
pushAction('helper_cloud_debt_started_at', calls.helper_cloud_debt_started_at);
}
if (decision.set_block_reason) {
pushAction('helper_block_reason', calls.helper_block_reason);
}
if (decision.set_blocked_until) {
pushAction('helper_blocked_until', calls.helper_blocked_until);
}
if (decision.set_probe_started_at) {
pushAction('helper_probe_started_at', calls.helper_probe_started_at);
}
// Forcer Auto Start OFF si besoin
if (decision.auto_start_action !== 'none') {
pushAction('evcs_auto_start_off', calls.evcs_auto_start_off);
}
// Si on arrête : charging OFF d'abord
if (decision.charging_action === 'turn_off') {
pushAction('evcs_charging', calls.evcs_charging);
}
// Permission / latch
if (decision.permission_action !== 'none') {
pushAction('helper_permission', calls.helper_permission);
}
if (decision.latch_action !== 'none') {
pushAction('helper_latch', calls.helper_latch);
}
// Courant si nécessaire
if (decision.current_action === 'set') {
pushAction('evcs_set_current', calls.evcs_set_current);
if (decision.set_last_current_change_at) {
pushAction('helper_last_current_change_at', calls.helper_last_current_change_at);
}
}
// Si on démarre : charging ON à la fin
if (decision.charging_action === 'turn_on') {
pushAction('evcs_charging', calls.evcs_charging);
}
// Timestamps start / stop
if (decision.set_last_start_at) {
pushAction('helper_last_start_at', calls.helper_last_start_at);
}
if (decision.set_last_stop_at) {
pushAction('helper_last_stop_at', calls.helper_last_stop_at);
}
// Signature + logbook si changement
if (decision.signature_changed) {
pushAction('helper_signature', calls.helper_signature);
pushAction('logbook', calls.logbook);
}
// Notifications
if (decision.should_notify) {
pushAction('mobile_notification', calls.mobile_notification);
}
return actions;