#!/usr/bin/env node // Search Linear issues by text query // Usage: linear-search.js [-n ] [--team ] [--state ] import { getClient, formatDate, truncate } from "./lib.js"; const args = process.argv.slice(2); let numResults = 10; const nIdx = args.indexOf("-n"); if (nIdx !== -1 && args[nIdx + 1]) { numResults = parseInt(args[nIdx + 1], 10); args.splice(nIdx, 2); } let teamFilter = null; const teamIdx = args.indexOf("--team"); if (teamIdx !== -1 && args[teamIdx + 1]) { teamFilter = args[teamIdx + 1]; args.splice(teamIdx, 2); } let stateFilter = null; const stateIdx = args.indexOf("--state"); if (stateIdx !== -1 && args[stateIdx + 1]) { stateFilter = args[stateIdx + 1]; args.splice(stateIdx, 2); } const query = args.join(" "); if (!query) { console.log("Usage: linear-search.js [-n ] [--team ] [--state ]"); console.log("\nOptions:"); console.log(" -n Number of results (default: 10)"); console.log(" --team Filter by team key (e.g. ENG)"); console.log(" --state Filter by state name (e.g. 'In Progress')"); process.exit(1); } const client = getClient(); const results = await client.searchIssues(query, { first: numResults }); for (const issue of results.nodes) { const state = await issue.state; const team = await issue.team; const assignee = await issue.assignee; if (teamFilter && team?.key?.toLowerCase() !== teamFilter.toLowerCase()) continue; if (stateFilter && state?.name?.toLowerCase() !== stateFilter.toLowerCase()) continue; console.log(`--- ${issue.identifier} ---`); console.log(`Title: ${issue.title}`); console.log(`State: ${state?.name || "Unknown"}`); console.log(`Priority: ${issue.priorityLabel}`); console.log(`Team: ${team?.key || "?"} | Assignee: ${assignee?.name || "Unassigned"}`); console.log(`Created: ${formatDate(issue.createdAt)} | Updated: ${formatDate(issue.updatedAt)}`); if (issue.description) console.log(`Description: ${truncate(issue.description, 200)}`); console.log(`URL: ${issue.url}`); console.log(""); } if (results.nodes.length === 0) { console.log("No results found."); }