Bundles several in-progress efforts that were sitting uncommitted: - User queue-preferences (migration 087, API route, popover component) - QBO invoice soft-delete (migration 088) and AR diagnostics route - Dashboard/mobile engagement route and page adjustments - Docker Compose log-rotation config - One-off ticket/RMM investigation scripts (scripts/) - Planning docs: phase verification/pattern notes, mobile shell design spec - .gitignore: exclude local scratch financial/inventory data and Claude Code worktree/local-settings runtime state (never meant for version control) Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01W6RuWdiUiXrPK6FLBHjtpY
22 lines
666 B
TypeScript
22 lines
666 B
TypeScript
import { config } from 'dotenv';
|
|
import { resolve } from 'path';
|
|
config({ path: resolve('/opt/stacks/pulse/.env.local') });
|
|
|
|
import { getDattoRMMClient } from '../lib/services/datto-rmm-factory';
|
|
|
|
async function main() {
|
|
const client = getDattoRMMClient();
|
|
const sites = await client.getSites();
|
|
|
|
console.log(`Found ${sites.length} sites\n`);
|
|
console.log('NAME\tUID\tDEVICES\tON-DEMAND');
|
|
for (const s of sites.sort((a, b) => a.name.localeCompare(b.name))) {
|
|
const devs = s.devicesStatus?.numberOfDevices ?? '';
|
|
console.log(`${s.name}\t${s.uid}\t${devs}\t${s.onDemand}`);
|
|
}
|
|
}
|
|
|
|
main().catch((err) => {
|
|
console.error(err);
|
|
process.exit(1);
|
|
});
|