Parse a small flag set without adding a runtime dependency to the memory harness.
(argv: string[])
| 68 | |
| 69 | /** Parse a small flag set without adding a runtime dependency to the memory harness. */ |
| 70 | function parseArgs(argv: string[]): CliOptions { |
| 71 | const options = { ...defaultOptions }; |
| 72 | |
| 73 | for (let index = 0; index < argv.length; index += 1) { |
| 74 | const arg = argv[index]!; |
| 75 | if (arg === "--help" || arg === "-h") { |
| 76 | console.log( |
| 77 | `Usage: bun run scripts/daemon-memory-check.ts [options]\n\nOptions:\n --cycles <n> Register/use/unregister cycles (default ${defaultOptions.cycles})\n --warmup-cycles <n> Cycles ignored for trend analysis (default ${defaultOptions.warmupCycles})\n --sessions-per-cycle <n> Fake websocket sessions per cycle (default ${defaultOptions.sessionsPerCycle})\n --files-per-session <n> Review files stored per fake session (default ${defaultOptions.filesPerSession})\n --hunks-per-file <n> Hunks per review file (default ${defaultOptions.hunksPerFile})\n --lines-per-hunk <n> Diff lines per hunk side (default ${defaultOptions.linesPerHunk})\n --api-requests-per-cycle <n> list/context/review requests while sessions are live (default ${defaultOptions.apiRequestsPerCycle})\n --snapshot-updates-per-cycle <n> Snapshot update messages per session per cycle (default ${defaultOptions.snapshotUpdatesPerCycle})\n --settle-ms <n> Delay before post-cleanup sampling (default ${defaultOptions.settleMs})\n --max-rss-growth-mb <n> Fail if post-warmup RSS grows beyond this (default ${defaultOptions.maxRssGrowthMb})\n --max-rss-slope-kb <n> Fail if post-warmup RSS slope exceeds this per cycle (default ${defaultOptions.maxRssSlopeKb})\n --json-out <path> Write full sample summary JSON\n`, |
| 78 | ); |
| 79 | process.exit(0); |
| 80 | } |
| 81 | |
| 82 | const next = () => argv[++index]; |
| 83 | switch (arg) { |
| 84 | case "--cycles": |
| 85 | options.cycles = parseNumberOption(arg, next()); |
| 86 | break; |
| 87 | case "--warmup-cycles": |
| 88 | options.warmupCycles = parseNumberOption(arg, next()); |
| 89 | break; |
| 90 | case "--sessions-per-cycle": |
| 91 | options.sessionsPerCycle = parseNumberOption(arg, next()); |
| 92 | break; |
| 93 | case "--files-per-session": |
| 94 | options.filesPerSession = parseNumberOption(arg, next()); |
| 95 | break; |
| 96 | case "--hunks-per-file": |
| 97 | options.hunksPerFile = parseNumberOption(arg, next()); |
| 98 | break; |
| 99 | case "--lines-per-hunk": |
| 100 | options.linesPerHunk = parseNumberOption(arg, next()); |
| 101 | break; |
| 102 | case "--api-requests-per-cycle": |
| 103 | options.apiRequestsPerCycle = parseNumberOption(arg, next()); |
| 104 | break; |
| 105 | case "--snapshot-updates-per-cycle": |
| 106 | options.snapshotUpdatesPerCycle = parseNumberOption(arg, next()); |
| 107 | break; |
| 108 | case "--settle-ms": |
| 109 | options.settleMs = parseNumberOption(arg, next()); |
| 110 | break; |
| 111 | case "--max-rss-growth-mb": |
| 112 | options.maxRssGrowthMb = parseNumberOption(arg, next()); |
| 113 | break; |
| 114 | case "--max-rss-slope-kb": |
| 115 | options.maxRssSlopeKb = parseNumberOption(arg, next()); |
| 116 | break; |
| 117 | case "--json-out": |
| 118 | options.jsonOut = next(); |
| 119 | if (!options.jsonOut) { |
| 120 | throw new Error("Missing value for --json-out."); |
| 121 | } |
| 122 | break; |
| 123 | default: |
| 124 | throw new Error(`Unknown option: ${arg}`); |
| 125 | } |
| 126 | } |
| 127 |
no test coverage detected