[object Object]

← back to Filemaker Mcp

chore: lint (env-path, dedup keep-guard, test readability), v0.2.6 -> v0.3.0 (session close)

a2688ce7ef4a258d7071f66d4dd0444e0c5fd635 · 2026-08-12 09:53:08 -0700 · Steve Abrams

Files touched

Diff

commit a2688ce7ef4a258d7071f66d4dd0444e0c5fd635
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Wed Aug 12 09:53:08 2026 -0700

    chore: lint (env-path, dedup keep-guard, test readability), v0.2.6 -> v0.3.0 (session close)
---
 package.json                 | 2 +-
 scripts/dedup-dwpp-32837.mjs | 7 ++++++-
 scripts/test-dup-ledger.mjs  | 7 +++++--
 3 files changed, 12 insertions(+), 4 deletions(-)

diff --git a/package.json b/package.json
index fe7b4b4..1d9e99a 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "filemaker-mcp",
-  "version": "0.2.6",
+  "version": "0.3.0",
   "private": true,
   "type": "module",
   "description": "MCP server + CLI for reading and (confirmed) updating Designer Wallcoverings' FileMaker Cloud files (Clients, Invoice, WALLPAPER) via the FileMaker Data API.",
diff --git a/scripts/dedup-dwpp-32837.mjs b/scripts/dedup-dwpp-32837.mjs
index 73c5a73..e00fd57 100644
--- a/scripts/dedup-dwpp-32837.mjs
+++ b/scripts/dedup-dwpp-32837.mjs
@@ -4,15 +4,20 @@
 // the blank straggler. Archive-first (restore JSON) per the sanctioned dedup pattern.
 //   node scripts/dedup-dwpp-32837.mjs            # archive + delete
 //   node scripts/dedup-dwpp-32837.mjs --dry-run  # show only
-import { readFileSync, writeFileSync } from 'node:fs';
+import { readFileSync, writeFileSync, mkdirSync } from 'node:fs';
 import { fileURLToPath } from 'node:url'; import { dirname, join } from 'node:path';
 const ROOT = join(dirname(fileURLToPath(import.meta.url)), '..');
+mkdirSync(join(ROOT, 'data'), { recursive: true });
 for (const l of readFileSync(join(ROOT,'.env'),'utf8').split('\n')) { const m=l.match(/^([A-Z0-9_]+)=(.*)$/); if(m&&!process.env[m[1]])process.env[m[1]]=m[2].replace(/^['"]|['"]$/g,''); }
 const DRY = process.argv.includes('--dry-run');
 const { getRecord, deleteRecord } = await import('../src/fm-client.js');
 const DB='WALLPAPER', L='Basic List of Fields', FULL='*List Wallpapers - Full View';
 const DELETE=[{ sku:'DWPP-206897', keep:'539328', drop:'539333' },{ sku:'DWPP-205219', keep:'539329', drop:'539334' }];
 for (const d of DELETE) {
+  // Safety: confirm the KEEP master still exists before deleting the DROP twin — guards
+  // against a keep/drop typo destroying the good record and leaving the stub.
+  const keepRec = await getRecord(DB, FULL, d.keep).catch(e=>({err:e.message}));
+  if (keepRec.err) { console.log(`${d.sku}: keep ${d.keep} not fetchable (${keepRec.err}) — ABORT this pair`); continue; }
   const rec = await getRecord(DB, FULL, d.drop).catch(e=>({err:e.message}));
   if (rec.err) { console.log(`${d.sku}: drop ${d.drop} not fetchable (${rec.err}) — skip`); continue; }
   const arch = join(ROOT,'data',`deleted-record-${d.drop}-restore.json`);
diff --git a/scripts/test-dup-ledger.mjs b/scripts/test-dup-ledger.mjs
index 8917cbf..e75dede 100644
--- a/scripts/test-dup-ledger.mjs
+++ b/scripts/test-dup-ledger.mjs
@@ -4,7 +4,9 @@
 // minting a twin, a concurrent second creator is blocked, and a failed create is retryable.
 //   node scripts/test-dup-ledger.mjs
 import { readFileSync } from 'node:fs';
-for (const l of readFileSync('.env','utf8').split('\n')) { const m=l.match(/^([A-Z0-9_]+)=(.*)$/); if(m&&!process.env[m[1]])process.env[m[1]]=m[2].replace(/^['"]|['"]$/g,''); }
+import { fileURLToPath } from 'node:url'; import { dirname, join } from 'node:path';
+const ROOT = join(dirname(fileURLToPath(import.meta.url)), '..');
+for (const l of readFileSync(join(ROOT, '.env'), 'utf8').split('\n')) { const m=l.match(/^([A-Z0-9_]+)=(.*)$/); if(m&&!process.env[m[1]])process.env[m[1]]=m[2].replace(/^['"]|['"]$/g,''); }
 import { execFileSync } from 'node:child_process';
 const PSQL = process.env.PSQL_BIN || '/opt/homebrew/opt/postgresql@14/bin/psql';
 const { _internals } = await import('../lib/wallpaper.js');
@@ -28,7 +30,8 @@ ok(ledgerClaim(K2,'ZZ','TESTPREVENT002')===true, 'claim K2');
 ledgerRelease(K2);
 ok(ledgerLookup(K2)==='', 'K2 released');
 ok(ledgerClaim(K2,'ZZ','TESTPREVENT002')===true, 'K2 reclaimable after release (failed create can retry)');
-ok(ledgerRelease(K) || ledgerLookup(K)==='999999', 'ledgerRelease is a NO-OP on a recorded key (never drops a real master)');
+ledgerRelease(K);
+ok(ledgerLookup(K)==='999999', 'ledgerRelease is a NO-OP on a recorded key (never drops a real master)');
 clean();
 console.log(`\n=== ${fail? 'FAIL':'ALL PASS'} (${pass} passed, ${fail} failed) ===`);
 process.exit(fail?1:0);

← 7d38b74 wallpaper: prevent duplicate masters via local Postgres idem  ·  back to Filemaker Mcp  ·  auto-data-snapshot: 2026-08-12T09:56:27 (1 data files) — pac c5cc14a →