master-zapier-plan-draft/research/zapier/verae-zapier-api/scripts/gate-0-structure.mjs
George Lambert b4150c8250 Milestone 0: import zappier billing, Verae middleware, and Zapier research
Compose-ready workspace: packages/zappier (rate card, portal, Stripe),
packages/verae-zapier-middleware (timestamp + NATS), packages/verae-zapier
(CLI app), vendor/zapier-platform, and research/zapier vendor corpus.

Gate 0 structure checks pass. Product code and research are not yet wired.
2026-09-09 02:37:36 -04:00

103 lines
2.8 KiB
JavaScript

#!/usr/bin/env node
/**
* GATE 0 — Repository structure and documentation presence.
* Fails if required plan/docs/source paths are missing or empty.
*/
import { existsSync, statSync, readdirSync } from 'node:fs';
import { resolve, dirname, join } from 'node:path';
import { fileURLToPath } from 'node:url';
const root = resolve(dirname(fileURLToPath(import.meta.url)), '..');
/** @type {string[]} */
const requiredFiles = [
'TODO.md',
'README.md',
'package.json',
'docs/architecture/overview.md',
'docs/architecture/nats-subjects.md',
'docs/developer/debugging.md',
'docs/developer/modules/README.md',
'docs/developer/modules/debug.md',
'docs/developer/modules/function-reference.md',
'docs/plans/phase-gates.md',
'verae-zapier-middleware/package.json',
'verae-zapier-middleware/src/debug/config.js',
'verae-zapier-middleware/src/debug/logger.js',
'verae-zapier-middleware/src/debug/redact.js',
'verae-zapier-middleware/src/debug/trace.js',
'verae-zapier-middleware/src/debug/index.js',
'verae-zapier-middleware/src/config.js',
'verae-zapier-middleware/src/errors.js',
'verae-zapier-middleware/src/app.js',
'verae-zapier-middleware/src/nats/subjects.js',
'verae-zapier-middleware/src/nats/connection.js',
'verae-zapier-middleware/src/nats/publishers.js',
'verae-zapier-middleware/src/workers/jobPollerWorker.js',
'verae-zapier-middleware/src/workers/webhookWorker.js',
'verae-zapier-middleware/test/unit/debug.test.js',
];
/** @type {string[]} */
const requiredDirs = [
'docs/developer/modules',
'verae-zapier-middleware/src/debug',
'verae-zapier-middleware/src/nats',
'verae-zapier-middleware/src/workers',
'verae-zapier',
];
let failed = false;
function fail(msg) {
console.error(`FAIL: ${msg}`);
failed = true;
}
function ok(msg) {
console.log(`OK: ${msg}`);
}
for (const rel of requiredDirs) {
const p = join(root, rel);
if (!existsSync(p) || !statSync(p).isDirectory()) {
fail(`missing directory ${rel}`);
} else {
ok(`dir ${rel}`);
}
}
for (const rel of requiredFiles) {
const p = join(root, rel);
if (!existsSync(p) || !statSync(p).isFile()) {
fail(`missing file ${rel}`);
continue;
}
const size = statSync(p).size;
if (size < 40) {
fail(`file too small (${size}b): ${rel}`);
} else {
ok(`file ${rel} (${size}b)`);
}
}
// TODO.md must mention gates and NATS
const todo = await import('node:fs').then((fs) =>
fs.readFileSync(join(root, 'TODO.md'), 'utf8'),
);
for (const needle of ['GATE 0', 'NATS', 'DEBUG_VERAE', 'gate:all', 'api.veraetime.net']) {
if (!todo.includes(needle)) {
fail(`TODO.md missing required term: ${needle}`);
} else {
ok(`TODO.md contains "${needle}"`);
}
}
if (failed) {
console.error('\nGATE 0 FAILED');
process.exit(1);
}
console.log('\nGATE 0 PASSED');
process.exit(0);