function buildSteps(node, ancestors = []) {
		// Enter phase
		steps.push({
			kind: STEP_KIND_VISIT,
			target: node,
			phase: 1, // enter phase
		});

		// Visit children
		const keys = vk.getKeys(node);
		if (keys) {
			for (const key of keys) {
				if (keysToSkip.has(key)) {
					continue; // Skip keys that should not be traversed
				}

				const child = node[key];
				if (Array.isArray(child)) {
					for (const item of child) {
						if (item && typeof item === "object") {
							buildSteps(item, [node, ...ancestors]);
						}
					}
				} else if (child && typeof child === "object") {
					buildSteps(child, [node, ...ancestors]);
				}
			}
		}

		// Exit phase
		steps.push({
			kind: STEP_KIND_VISIT,
			target: node,
			phase: 2, // exit phase
		});
	}
Recursively builds traversal steps for the AST
@param {Object} node The current AST node
@param {Object[]} ancestors The ancestry of the current node
@returns {void}