← 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
M package.jsonM scripts/dedup-dwpp-32837.mjsM scripts/test-dup-ledger.mjs
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 →