linearcreate
Advanced tools
+3
-10
| { | ||
| "name": "linearcreate", | ||
| "version": "1.0.12", | ||
| "version": "1.0.13", | ||
| "description": "A CLI tool to create Linear issues and generate branch names", | ||
@@ -11,5 +11,3 @@ "main": "dist/lc.js", | ||
| "build": "tsc", | ||
| "prepare": "npm run build", | ||
| "start": "ts-node src/lc.ts", | ||
| "prepublishOnly": "npm run build" | ||
| "prepare": "npm run build" | ||
| }, | ||
@@ -26,8 +24,3 @@ "dependencies": { | ||
| "@types/yargs": "^17.0.33", | ||
| "ts-node": "^10.9.1", | ||
| "typescript": "^5.2.2", | ||
| "eslint": "^8.57.0", | ||
| "eslint-config-prettier": "^9.1.0", | ||
| "eslint-plugin-prettier": "^5.1.3", | ||
| "prettier": "^3.0.0" | ||
| "typescript": "^5.2.2" | ||
| }, | ||
@@ -34,0 +27,0 @@ "files": [ |
-104
| #!/usr/bin/env node | ||
| "use strict"; | ||
| var __importDefault = (this && this.__importDefault) || function (mod) { | ||
| return (mod && mod.__esModule) ? mod : { "default": mod }; | ||
| }; | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| const sdk_1 = require("@linear/sdk"); | ||
| const clipboardy_1 = __importDefault(require("clipboardy")); | ||
| const dotenv_1 = __importDefault(require("dotenv")); | ||
| const open_1 = __importDefault(require("open")); | ||
| const yargs_1 = __importDefault(require("yargs")); | ||
| const helpers_1 = require("yargs/helpers"); | ||
| const path_1 = __importDefault(require("path")); | ||
| // Load environment variables | ||
| dotenv_1.default.config({ path: path_1.default.join(__dirname, '..', '.env') }); | ||
| if (!process.env.LINEAR_API_KEY || !process.env.USER_ID || !process.env.DEFAULT_TEAM_STUB) { | ||
| console.error("Error: LINEAR_API_KEY, USER_ID, or DEFAULT_TEAM_STUB is not set in your environment variables."); | ||
| process.exit(1); | ||
| } | ||
| const linearClient = new sdk_1.LinearClient({ apiKey: process.env.LINEAR_API_KEY }); | ||
| async function createIssueWithBranch(title, teamStub) { | ||
| try { | ||
| // Fetch the organization | ||
| const organization = await linearClient.organization; | ||
| // Fetch the teams | ||
| const teams = await organization.teams(); | ||
| const team = teams.nodes.find((t) => t.key.toLowerCase() === teamStub.toLowerCase()); | ||
| if (!team) { | ||
| throw new Error(`No team found with stub: ${teamStub}`); | ||
| } | ||
| // Create the issue | ||
| const issuePayload = await linearClient.createIssue({ | ||
| title, | ||
| teamId: team.id, | ||
| assigneeId: process.env.USER_ID, | ||
| }); | ||
| if (!issuePayload.success || !issuePayload.issue) { | ||
| throw new Error("Failed to create issue"); | ||
| } | ||
| const issue = await issuePayload.issue; | ||
| // Generate the branch name | ||
| const sanitizedTitle = title | ||
| .toLowerCase() | ||
| .replace(/[^a-z0-9]+/g, "-") | ||
| .replace(/^-+|-+$/g, "") | ||
| .substring(0, 50); // Limit length to 50 characters | ||
| // Fetch the user | ||
| if (!process.env.USER_ID) { | ||
| throw new Error("USER_ID is not set in your environment variables."); | ||
| } | ||
| const user = await linearClient.user(process.env.USER_ID); | ||
| if (!user) { | ||
| throw new Error("Failed to fetch user"); | ||
| } | ||
| const branchName = `${user.name.toLowerCase().replace(/\s+/g, '')}/${issue.identifier.toLowerCase()}-${sanitizedTitle}`; | ||
| return { issue, branchName }; | ||
| } | ||
| catch (error) { | ||
| throw error; | ||
| } | ||
| } | ||
| async function main() { | ||
| const argv = await (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv)) | ||
| .command("$0 <ticketName>", "Create a new Linear issue and generate a branch name", (yargs) => { | ||
| return yargs | ||
| .positional("ticketName", { | ||
| describe: "Name of the ticket", | ||
| type: "string", | ||
| demandOption: true, | ||
| }) | ||
| .option("teamstub", { | ||
| alias: "t", | ||
| type: "string", | ||
| description: "Team stub (e.g., bknd, frtd)", | ||
| default: process.env.DEFAULT_TEAM_STUB, | ||
| }) | ||
| .option("open", { | ||
| alias: "o", | ||
| type: "boolean", | ||
| description: "Open the ticket in Linear", | ||
| default: false, | ||
| }); | ||
| }) | ||
| .help() | ||
| .parse(); | ||
| try { | ||
| const { issue, branchName } = await createIssueWithBranch(argv.ticketName, argv.teamstub); | ||
| if (argv.open) { | ||
| console.log(`Opening issue in Linear: ${issue.url}`); | ||
| await (0, open_1.default)(issue.url); | ||
| } | ||
| else { | ||
| await clipboardy_1.default.write(branchName); | ||
| console.log(`Branch name copied to clipboard: ${branchName}`); | ||
| } | ||
| console.log(`Issue created: ${issue.title} (${issue.identifier})`); | ||
| } | ||
| catch (error) { | ||
| console.error("Error:", error); | ||
| process.exit(1); | ||
| } | ||
| } | ||
| main(); | ||
| //# sourceMappingURL=lco.js.map |
| {"version":3,"file":"lco.js","sourceRoot":"","sources":["../src/lco.ts"],"names":[],"mappings":"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"} |
Network access
Supply chain riskThis module accesses the network.
Found 1 instance in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 3 instances in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
Network access
Supply chain riskThis module accesses the network.
Found 1 instance in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 3 instances in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
3
-62.5%4
-66.67%1
-50%13558
-35.86%6
-25%147
-41.2%