← back to AbramsOS
savings: nightly advisor runner + launchd plist (draft, Steve bootstraps)
0256450b278da24e5dd91ce18448690f52aa94a5 · 2026-07-13 00:23:59 -0700 · Steve
- scripts/run-savings-advisor.js: dotenv-loaded, dedup-safe regen (local, $0)
- deploy/com.steve.abramsos-savings.plist: daily 6:05am, RunAtLoad off; bootstrap surfaced in header comment
Files touched
A deploy/com.steve.abramsos-savings.plistA scripts/run-savings-advisor.js
Diff
commit 0256450b278da24e5dd91ce18448690f52aa94a5
Author: Steve <steve@designerwallcoverings.com>
Date: Mon Jul 13 00:23:59 2026 -0700
savings: nightly advisor runner + launchd plist (draft, Steve bootstraps)
- scripts/run-savings-advisor.js: dotenv-loaded, dedup-safe regen (local, $0)
- deploy/com.steve.abramsos-savings.plist: daily 6:05am, RunAtLoad off; bootstrap surfaced in header comment
---
deploy/com.steve.abramsos-savings.plist | 36 +++++++++++++++++++++++++++++++++
scripts/run-savings-advisor.js | 27 +++++++++++++++++++++++++
2 files changed, 63 insertions(+)
diff --git a/deploy/com.steve.abramsos-savings.plist b/deploy/com.steve.abramsos-savings.plist
new file mode 100644
index 0000000..49e03d0
--- /dev/null
+++ b/deploy/com.steve.abramsos-savings.plist
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<!--
+ AbramsOS nightly savings-advisor. Regenerates grounded money-saving suggestions
+ from reorder_item data (local Ollama, $0). Runs daily at 6:05 AM.
+
+ Install (Steve pastes — launchd bootstrap is classifier-gated):
+ launchctl bootstrap gui/$(id -u) ~/Projects/AbramsOS/deploy/com.steve.abramsos-savings.plist
+ launchctl kickstart -k gui/$(id -u)/com.steve.abramsos-savings # run once now
+ Remove:
+ launchctl bootout gui/$(id -u)/com.steve.abramsos-savings
+-->
+<plist version="1.0">
+<dict>
+ <key>Label</key>
+ <string>com.steve.abramsos-savings</string>
+ <key>ProgramArguments</key>
+ <array>
+ <string>/opt/homebrew/bin/node</string>
+ <string>/Users/macstudio3/Projects/AbramsOS/scripts/run-savings-advisor.js</string>
+ </array>
+ <key>WorkingDirectory</key>
+ <string>/Users/macstudio3/Projects/AbramsOS</string>
+ <key>StartCalendarInterval</key>
+ <dict>
+ <key>Hour</key><integer>6</integer>
+ <key>Minute</key><integer>5</integer>
+ </dict>
+ <key>StandardOutPath</key>
+ <string>/Users/macstudio3/Projects/AbramsOS/logs/savings-advisor.log</string>
+ <key>StandardErrorPath</key>
+ <string>/Users/macstudio3/Projects/AbramsOS/logs/savings-advisor.log</string>
+ <key>RunAtLoad</key>
+ <false/>
+</dict>
+</plist>
diff --git a/scripts/run-savings-advisor.js b/scripts/run-savings-advisor.js
new file mode 100644
index 0000000..9ab544c
--- /dev/null
+++ b/scripts/run-savings-advisor.js
@@ -0,0 +1,27 @@
+#!/usr/bin/env node
+// Nightly savings-advisor run. Reads .env, regenerates grounded savings suggestions
+// for every active reorder item (local Ollama, $0). Safe to run repeatedly — the
+// advisor dedupes by item+strategy, so it only adds genuinely new ideas.
+//
+// Wire it up (Steve pastes — launchd bootstrap is classifier-gated):
+// launchctl bootstrap gui/$(id -u) ~/Projects/AbramsOS/deploy/com.steve.abramsos-savings.plist
+// Manual run:
+// node ~/Projects/AbramsOS/scripts/run-savings-advisor.js
+
+require('dotenv').config({ path: require('path').join(__dirname, '..', '.env') });
+const advisor = require('../lib/savings-advisor');
+
+const USER_ID = process.env.SAVINGS_USER_ID || 'user_steve';
+
+(async () => {
+ const started = new Date().toISOString();
+ try {
+ const out = await advisor.generateSuggestions(USER_ID, { limit: 100, timeoutMs: 90_000 });
+ console.log(`[savings-advisor ${started}] scanned=${out.scanned} created=${out.created} skipped=${out.skipped} errors=${out.errors.length}`);
+ if (out.errors.length) console.log(' errors:', out.errors.map((e) => `${e.item}: ${e.error}`).join('; '));
+ process.exit(0);
+ } catch (err) {
+ console.error(`[savings-advisor ${started}] FAILED: ${err.message}`);
+ process.exit(1);
+ }
+})();
← 3e9efe5 docs: life-optimizer roadmap (overnight)
·
back to AbramsOS
·
health: Vitals module — BP history + Apple Watch/device read 2d8848c →