@alejandrochaves/devflow-cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,2 @@
1
+ export declare function branchCommand(): Promise<void>;
2
+ //# sourceMappingURL=branch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branch.d.ts","sourceRoot":"","sources":["../../src/commands/branch.ts"],"names":[],"mappings":"AAIA,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAiDnD"}
@@ -0,0 +1,47 @@
1
+ import { select, input, confirm } from "@inquirer/prompts";
2
+ import { execSync } from "child_process";
3
+ import { loadConfig } from "../config.js";
4
+ export async function branchCommand() {
5
+ try {
6
+ const config = loadConfig();
7
+ const type = await select({
8
+ message: "Select branch type:",
9
+ choices: config.branchTypes.map((t) => ({ value: t, name: t })),
10
+ });
11
+ const ticket = await input({
12
+ message: "Ticket number (leave blank for UNTRACKED):",
13
+ });
14
+ const description = await input({
15
+ message: "Short description:",
16
+ validate: (val) => val.trim().length > 0 || "Description is required",
17
+ });
18
+ const ticketPart = ticket.trim() || "UNTRACKED";
19
+ const kebab = description
20
+ .trim()
21
+ .toLowerCase()
22
+ .replace(/[^a-z0-9]+/g, "-")
23
+ .replace(/^-|-$/g, "");
24
+ const branchName = `${type}/${ticketPart}_${kebab}`;
25
+ console.log(`\n--- Branch Preview ---`);
26
+ console.log(branchName);
27
+ console.log(`---------------------\n`);
28
+ const confirmed = await confirm({
29
+ message: "Create this branch?",
30
+ default: true,
31
+ });
32
+ if (!confirmed) {
33
+ console.log("Aborted.");
34
+ process.exit(0);
35
+ }
36
+ execSync(`git checkout -b ${branchName}`, { stdio: "inherit" });
37
+ console.log(`Branch created and checked out: ${branchName}`);
38
+ }
39
+ catch (error) {
40
+ if (error.name === "ExitPromptError") {
41
+ console.log("\nCancelled.");
42
+ process.exit(0);
43
+ }
44
+ process.exit(1);
45
+ }
46
+ }
47
+ //# sourceMappingURL=branch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branch.js","sourceRoot":"","sources":["../../src/commands/branch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAE5B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC;YACxB,OAAO,EAAE,qBAAqB;YAC9B,OAAO,EAAE,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;SAChE,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC;YACzB,OAAO,EAAE,4CAA4C;SACtD,CAAC,CAAC;QAEH,MAAM,WAAW,GAAG,MAAM,KAAK,CAAC;YAC9B,OAAO,EAAE,oBAAoB;YAC7B,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,yBAAyB;SACtE,CAAC,CAAC;QAEH,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,EAAE,IAAI,WAAW,CAAC;QAChD,MAAM,KAAK,GAAG,WAAW;aACtB,IAAI,EAAE;aACN,WAAW,EAAE;aACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;aAC3B,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACzB,MAAM,UAAU,GAAG,GAAG,IAAI,IAAI,UAAU,IAAI,KAAK,EAAE,CAAC;QAEpD,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;QAEvC,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC;YAC9B,OAAO,EAAE,qBAAqB;YAC9B,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;QAEH,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,QAAQ,CAAC,mBAAmB,UAAU,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,mCAAmC,UAAU,EAAE,CAAC,CAAC;IAC/D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAAe,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YAC5B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function commitCommand(): Promise<void>;
2
+ //# sourceMappingURL=commit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit.d.ts","sourceRoot":"","sources":["../../src/commands/commit.ts"],"names":[],"mappings":"AAKA,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAuInD"}
@@ -0,0 +1,126 @@
1
+ import { select, search, confirm, input, checkbox } from "@inquirer/prompts";
2
+ import { execSync } from "child_process";
3
+ import { loadConfig } from "../config.js";
4
+ import { inferTicket, inferScope } from "../git.js";
5
+ export async function commitCommand() {
6
+ try {
7
+ const config = loadConfig();
8
+ // Check for staged files
9
+ const staged = execSync("git diff --cached --name-only", { encoding: "utf-8" }).trim();
10
+ const unstaged = execSync("git diff --name-only", { encoding: "utf-8" }).trim();
11
+ const untracked = execSync("git ls-files --others --exclude-standard", { encoding: "utf-8" }).trim();
12
+ const allChanges = [
13
+ ...unstaged.split("\n").filter(Boolean).map((f) => ({ file: f, label: `M ${f}` })),
14
+ ...untracked.split("\n").filter(Boolean).map((f) => ({ file: f, label: `? ${f}` })),
15
+ ];
16
+ if (!staged && allChanges.length === 0) {
17
+ console.log("Nothing to commit — working tree clean.");
18
+ process.exit(0);
19
+ }
20
+ if (!staged) {
21
+ if (allChanges.length === 1) {
22
+ const stageIt = await confirm({
23
+ message: `Stage ${allChanges[0].file}?`,
24
+ default: true,
25
+ });
26
+ if (!stageIt) {
27
+ console.log("No files staged. Aborting.");
28
+ process.exit(0);
29
+ }
30
+ execSync(`git add ${JSON.stringify(allChanges[0].file)}`);
31
+ }
32
+ else {
33
+ const filesToStage = await checkbox({
34
+ message: "Select files to stage:",
35
+ choices: [
36
+ { value: "__ALL__", name: "Stage all" },
37
+ ...allChanges.map((c) => ({ value: c.file, name: c.label })),
38
+ ],
39
+ required: true,
40
+ });
41
+ if (filesToStage.includes("__ALL__")) {
42
+ execSync("git add -A");
43
+ }
44
+ else {
45
+ for (const file of filesToStage) {
46
+ execSync(`git add ${JSON.stringify(file)}`);
47
+ }
48
+ }
49
+ }
50
+ }
51
+ else {
52
+ console.log("Staged files:");
53
+ staged.split("\n").forEach((f) => console.log(` ${f}`));
54
+ console.log("");
55
+ }
56
+ const type = await select({
57
+ message: "Select commit type:",
58
+ choices: config.commitTypes.map((t) => ({ value: t.value, name: t.label })),
59
+ });
60
+ let finalScope;
61
+ if (config.scopes.length > 0) {
62
+ const inferredScope = inferScope();
63
+ finalScope = await search({
64
+ message: inferredScope
65
+ ? `Select scope (inferred: ${inferredScope}):`
66
+ : "Select scope (type to filter):",
67
+ source: (term) => {
68
+ const filtered = config.scopes.filter((s) => !term ||
69
+ s.value.includes(term.toLowerCase()) ||
70
+ s.description.toLowerCase().includes(term.toLowerCase()));
71
+ if (inferredScope) {
72
+ filtered.sort((a, b) => a.value === inferredScope ? -1 : b.value === inferredScope ? 1 : 0);
73
+ }
74
+ return filtered.map((s) => ({
75
+ value: s.value,
76
+ name: `${s.value} — ${s.description}`,
77
+ }));
78
+ },
79
+ });
80
+ }
81
+ else {
82
+ const inferredScope = inferScope();
83
+ finalScope = await input({
84
+ message: inferredScope
85
+ ? `Enter scope (default: ${inferredScope}):`
86
+ : "Enter scope (optional):",
87
+ default: inferredScope,
88
+ });
89
+ }
90
+ const message = await input({
91
+ message: "Enter commit message:",
92
+ validate: (val) => val.trim().length > 0 || "Commit message is required",
93
+ });
94
+ const isBreaking = await confirm({
95
+ message: "Is this a breaking change?",
96
+ default: false,
97
+ });
98
+ const ticket = inferTicket();
99
+ const breaking = isBreaking ? "!" : "";
100
+ const scopePart = finalScope ? `(${finalScope})` : "";
101
+ const fullMessage = `${type}[${ticket}]${breaking}${scopePart}: ${message.trim()}`;
102
+ console.log("\n--- Commit Preview ---");
103
+ console.log(fullMessage);
104
+ console.log("----------------------\n");
105
+ const confirmed = await confirm({
106
+ message: "Create this commit?",
107
+ default: true,
108
+ });
109
+ if (!confirmed) {
110
+ console.log("Commit aborted.");
111
+ process.exit(0);
112
+ }
113
+ execSync(`git commit -m ${JSON.stringify(fullMessage)}`, {
114
+ stdio: "inherit",
115
+ });
116
+ console.log("Commit created successfully.");
117
+ }
118
+ catch (error) {
119
+ if (error.name === "ExitPromptError") {
120
+ console.log("\nCancelled.");
121
+ process.exit(0);
122
+ }
123
+ process.exit(1);
124
+ }
125
+ }
126
+ //# sourceMappingURL=commit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit.js","sourceRoot":"","sources":["../../src/commands/commit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function initCommand(): Promise<void>;
2
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAqBA,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAkCjD"}
@@ -0,0 +1,52 @@
1
+ import { existsSync, writeFileSync } from "fs";
2
+ import { resolve } from "path";
3
+ import { confirm, input } from "@inquirer/prompts";
4
+ const TEMPLATE = {
5
+ ticketBaseUrl: "",
6
+ scopes: [
7
+ { value: "core", description: "Core functionality" },
8
+ { value: "ui", description: "UI components" },
9
+ { value: "api", description: "API layer" },
10
+ { value: "config", description: "Configuration" },
11
+ { value: "deps", description: "Dependencies" },
12
+ { value: "ci", description: "CI/CD" },
13
+ ],
14
+ checklist: [
15
+ "Code follows project conventions",
16
+ "Self-reviewed the changes",
17
+ "No new warnings or errors introduced",
18
+ ],
19
+ };
20
+ export async function initCommand() {
21
+ try {
22
+ const configPath = resolve(process.cwd(), ".devflow.json");
23
+ if (existsSync(configPath)) {
24
+ const overwrite = await confirm({
25
+ message: ".devflow.json already exists. Overwrite?",
26
+ default: false,
27
+ });
28
+ if (!overwrite) {
29
+ console.log("Aborted.");
30
+ process.exit(0);
31
+ }
32
+ }
33
+ const ticketBaseUrl = await input({
34
+ message: "Ticket base URL (e.g., https://github.com/org/repo/issues):",
35
+ });
36
+ const config = {
37
+ ...TEMPLATE,
38
+ ticketBaseUrl: ticketBaseUrl.trim() || undefined,
39
+ };
40
+ writeFileSync(configPath, JSON.stringify(config, null, 2) + "\n");
41
+ console.log("Created .devflow.json");
42
+ console.log("Edit this file to customize scopes, checklist items, and more.");
43
+ }
44
+ catch (error) {
45
+ if (error.name === "ExitPromptError") {
46
+ console.log("\nCancelled.");
47
+ process.exit(0);
48
+ }
49
+ process.exit(1);
50
+ }
51
+ }
52
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,QAAQ,GAAG;IACf,aAAa,EAAE,EAAE;IACjB,MAAM,EAAE;QACN,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,oBAAoB,EAAE;QACpD,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,eAAe,EAAE;QAC7C,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE;QAC1C,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,eAAe,EAAE;QACjD,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE;QAC9C,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE;KACtC;IACD,SAAS,EAAE;QACT,kCAAkC;QAClC,2BAA2B;QAC3B,sCAAsC;KACvC;CACF,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,eAAe,CAAC,CAAC;QAE3D,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3B,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC;gBAC9B,OAAO,EAAE,0CAA0C;gBACnD,OAAO,EAAE,KAAK;aACf,CAAC,CAAC;YACH,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;gBACxB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAED,MAAM,aAAa,GAAG,MAAM,KAAK,CAAC;YAChC,OAAO,EAAE,6DAA6D;SACvE,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG;YACb,GAAG,QAAQ;YACX,aAAa,EAAE,aAAa,CAAC,IAAI,EAAE,IAAI,SAAS;SACjD,CAAC;QAEF,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QAClE,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;IAChF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAAe,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YAC5B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function prCommand(): Promise<void>;
2
+ //# sourceMappingURL=pr.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pr.d.ts","sourceRoot":"","sources":["../../src/commands/pr.ts"],"names":[],"mappings":"AAmFA,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAsJ/C"}
@@ -0,0 +1,203 @@
1
+ import { input, confirm } from "@inquirer/prompts";
2
+ import { execSync } from "child_process";
3
+ import { loadConfig } from "../config.js";
4
+ import { getBranch, parseBranch, getCommits, getScopesFromCommits, getDefaultBase, checkGhInstalled, } from "../git.js";
5
+ const TYPE_LABELS = {
6
+ feat: "Feature (new functionality)",
7
+ fix: "Bug fix (non-breaking fix)",
8
+ refactor: "Refactor (no functional changes)",
9
+ hotfix: "Bug fix (non-breaking fix)",
10
+ chore: "Chore (deps, CI, configs, docs)",
11
+ docs: "Chore (deps, CI, configs, docs)",
12
+ test: "Chore (deps, CI, configs, docs)",
13
+ release: "Chore (deps, CI, configs, docs)",
14
+ };
15
+ const BRANCH_TYPE_TO_LABEL = {
16
+ feat: { name: "feature", color: "0E8A16" },
17
+ fix: { name: "bug", color: "D73A4A" },
18
+ hotfix: { name: "bug", color: "D73A4A" },
19
+ refactor: { name: "refactor", color: "1D76DB" },
20
+ chore: { name: "chore", color: "FEF2C0" },
21
+ docs: { name: "documentation", color: "0075CA" },
22
+ test: { name: "test", color: "BFD4F2" },
23
+ release: { name: "release", color: "6F42C1" },
24
+ };
25
+ function formatTicket(ticket, ticketBaseUrl) {
26
+ if (ticket === "UNTRACKED")
27
+ return "UNTRACKED";
28
+ if (!ticketBaseUrl)
29
+ return ticket;
30
+ return `[${ticket}](${ticketBaseUrl}/${ticket})`;
31
+ }
32
+ function ensureLabel(label) {
33
+ try {
34
+ execSync(`gh label create ${JSON.stringify(label.name)} --color ${label.color} --force`, { stdio: "ignore" });
35
+ }
36
+ catch {
37
+ // Label might already exist
38
+ }
39
+ }
40
+ function getExistingPr() {
41
+ try {
42
+ const result = execSync("gh pr view --json url,number", {
43
+ encoding: "utf-8",
44
+ stdio: ["pipe", "pipe", "ignore"],
45
+ }).trim();
46
+ return JSON.parse(result);
47
+ }
48
+ catch {
49
+ return undefined;
50
+ }
51
+ }
52
+ function buildChecklist(items) {
53
+ return items.map((c) => `- [ ] ${c}`).join("\n");
54
+ }
55
+ function buildTypeCheckboxes(type) {
56
+ const types = [
57
+ { key: "feat", label: "Feature (new functionality)" },
58
+ { key: "fix", label: "Bug fix (non-breaking fix)" },
59
+ { key: "refactor", label: "Refactor (no functional changes)" },
60
+ { key: "breaking", label: "Breaking change (fix or feature that would cause existing functionality to change)" },
61
+ { key: "chore", label: "Chore (deps, CI, configs, docs)" },
62
+ ];
63
+ return types
64
+ .map((t) => {
65
+ const checked = TYPE_LABELS[type || ""] === t.label ? "x" : " ";
66
+ return `- [${checked}] ${t.label}`;
67
+ })
68
+ .join("\n");
69
+ }
70
+ export async function prCommand() {
71
+ try {
72
+ const config = loadConfig();
73
+ checkGhInstalled();
74
+ const branch = getBranch();
75
+ const { type, ticket, description } = parseBranch(branch);
76
+ const existingPr = getExistingPr();
77
+ if (existingPr) {
78
+ console.log(`\nPR #${existingPr.number} already exists: ${existingPr.url}`);
79
+ const shouldUpdate = await confirm({
80
+ message: "Update this PR?",
81
+ default: true,
82
+ });
83
+ if (!shouldUpdate) {
84
+ process.exit(0);
85
+ }
86
+ }
87
+ const defaultBase = getDefaultBase(branch);
88
+ const base = await input({
89
+ message: "Base branch:",
90
+ default: defaultBase,
91
+ validate: (val) => val.trim().length > 0 || "Base branch is required",
92
+ });
93
+ const commits = getCommits(base.trim());
94
+ const commitList = commits.length > 0
95
+ ? commits.map((c) => `- ${c}`).join("\n")
96
+ : "";
97
+ const title = await input({
98
+ message: "PR title:",
99
+ default: `${description.charAt(0).toUpperCase() + description.slice(1)}`,
100
+ validate: (val) => val.trim().length > 0 || "Title is required",
101
+ });
102
+ const summaryInput = await input({
103
+ message: "PR summary (optional, leave blank to use commits only):",
104
+ });
105
+ const summary = [summaryInput.trim(), commitList]
106
+ .filter(Boolean)
107
+ .join("\n\n");
108
+ const body = `## Summary
109
+
110
+ ${summary || "<!-- Brief description of what this PR does and why -->"}
111
+
112
+ ## Ticket
113
+
114
+ ${formatTicket(ticket, config.ticketBaseUrl)}
115
+
116
+ ## Type of Change
117
+
118
+ ${buildTypeCheckboxes(type)}
119
+
120
+ ## Screenshots
121
+
122
+ <!-- Add before/after screenshots for UI changes, or remove this section if not applicable -->
123
+
124
+ | Before | After |
125
+ |--------|-------|
126
+ | | |
127
+
128
+ ## Test Plan
129
+
130
+ - [ ]
131
+
132
+ ## Checklist
133
+
134
+ ${buildChecklist(config.checklist)}`;
135
+ // Build preview labels
136
+ const previewLabels = [];
137
+ if (type && BRANCH_TYPE_TO_LABEL[type])
138
+ previewLabels.push(BRANCH_TYPE_TO_LABEL[type].name);
139
+ const previewScopes = getScopesFromCommits(commits);
140
+ previewLabels.push(...previewScopes);
141
+ const uniquePreviewLabels = [...new Set(previewLabels)];
142
+ console.log("\n--- PR Preview ---");
143
+ if (existingPr) {
144
+ console.log(`(Updating existing PR #${existingPr.number})`);
145
+ }
146
+ console.log(`Title: ${title}`);
147
+ console.log(`Branch: ${branch} → ${base.trim()}`);
148
+ console.log(`Labels: ${uniquePreviewLabels.length > 0 ? uniquePreviewLabels.join(", ") : "none"}`);
149
+ console.log(`Assignee: @me`);
150
+ console.log("");
151
+ console.log(body);
152
+ console.log("------------------\n");
153
+ const confirmed = await confirm({
154
+ message: existingPr
155
+ ? `Update PR #${existingPr.number}?`
156
+ : "Create this PR?",
157
+ default: true,
158
+ });
159
+ if (!confirmed) {
160
+ console.log("Aborted.");
161
+ process.exit(0);
162
+ }
163
+ // Push branch if needed
164
+ try {
165
+ execSync(`git push -u origin ${branch}`, { stdio: "inherit" });
166
+ }
167
+ catch {
168
+ // Already pushed or push failed
169
+ }
170
+ // Collect all labels
171
+ const labels = [];
172
+ const labelInfo = type ? BRANCH_TYPE_TO_LABEL[type] : undefined;
173
+ if (labelInfo) {
174
+ ensureLabel(labelInfo);
175
+ labels.push(labelInfo.name);
176
+ }
177
+ const scopes = getScopesFromCommits(commits);
178
+ for (const scope of scopes) {
179
+ ensureLabel({ name: scope, color: "EDEDED" });
180
+ labels.push(scope);
181
+ }
182
+ const uniqueLabels = [...new Set(labels)];
183
+ const labelFlag = uniqueLabels.length > 0
184
+ ? uniqueLabels.map((l) => JSON.stringify(l)).join(",")
185
+ : "";
186
+ if (existingPr) {
187
+ execSync(`gh pr edit ${existingPr.number} --title ${JSON.stringify(title)} --body-file -${labelFlag ? ` --add-label ${labelFlag}` : ""}`, { input: body, stdio: ["pipe", "inherit", "inherit"] });
188
+ console.log(`PR #${existingPr.number} updated: ${existingPr.url}`);
189
+ }
190
+ else {
191
+ execSync(`gh pr create --draft --title ${JSON.stringify(title)} --body-file - --base ${base.trim()} --head ${branch} --assignee @me${labelFlag ? ` --label ${labelFlag}` : ""}`, { input: body, stdio: ["pipe", "inherit", "inherit"] });
192
+ console.log("PR created successfully.");
193
+ }
194
+ }
195
+ catch (error) {
196
+ if (error.name === "ExitPromptError") {
197
+ console.log("\nCancelled.");
198
+ process.exit(0);
199
+ }
200
+ process.exit(1);
201
+ }
202
+ }
203
+ //# sourceMappingURL=pr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pr.js","sourceRoot":"","sources":["../../src/commands/pr.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export interface Scope {
2
+ value: string;
3
+ description: string;
4
+ }
5
+ export interface DevflowConfig {
6
+ ticketBaseUrl?: string;
7
+ scopes: Scope[];
8
+ branchTypes: string[];
9
+ commitTypes: Array<{
10
+ value: string;
11
+ label: string;
12
+ }>;
13
+ checklist: string[];
14
+ }
15
+ export declare function loadConfig(cwd?: string): DevflowConfig;
16
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,KAAK;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrD,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAwBD,wBAAgB,UAAU,CAAC,GAAG,GAAE,MAAsB,GAAG,aAAa,CAoBrE"}
package/dist/config.js ADDED
@@ -0,0 +1,44 @@
1
+ import { readFileSync, existsSync } from "fs";
2
+ import { resolve } from "path";
3
+ const DEFAULT_CONFIG = {
4
+ scopes: [],
5
+ branchTypes: ["feat", "fix", "chore", "refactor", "docs", "test", "release", "hotfix"],
6
+ commitTypes: [
7
+ { value: "feat", label: "feat: A new feature" },
8
+ { value: "fix", label: "fix: A bug fix" },
9
+ { value: "chore", label: "chore: Maintenance tasks" },
10
+ { value: "refactor", label: "refactor: Code restructuring" },
11
+ { value: "docs", label: "docs: Documentation changes" },
12
+ { value: "test", label: "test: Adding or updating tests" },
13
+ { value: "style", label: "style: Code style changes" },
14
+ { value: "ci", label: "ci: CI/CD changes" },
15
+ { value: "perf", label: "perf: Performance improvements" },
16
+ { value: "build", label: "build: Build system changes" },
17
+ ],
18
+ checklist: [
19
+ "Code follows project conventions",
20
+ "Self-reviewed the changes",
21
+ "No new warnings or errors introduced",
22
+ ],
23
+ };
24
+ export function loadConfig(cwd = process.cwd()) {
25
+ const configPath = resolve(cwd, ".devflow.json");
26
+ if (!existsSync(configPath)) {
27
+ return DEFAULT_CONFIG;
28
+ }
29
+ try {
30
+ const raw = JSON.parse(readFileSync(configPath, "utf-8"));
31
+ return {
32
+ ticketBaseUrl: raw.ticketBaseUrl ?? DEFAULT_CONFIG.ticketBaseUrl,
33
+ scopes: raw.scopes ?? DEFAULT_CONFIG.scopes,
34
+ branchTypes: raw.branchTypes ?? DEFAULT_CONFIG.branchTypes,
35
+ commitTypes: raw.commitTypes ?? DEFAULT_CONFIG.commitTypes,
36
+ checklist: raw.checklist ?? DEFAULT_CONFIG.checklist,
37
+ };
38
+ }
39
+ catch {
40
+ console.error("Warning: Failed to parse .devflow.json, using defaults.");
41
+ return DEFAULT_CONFIG;
42
+ }
43
+ }
44
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAe/B,MAAM,cAAc,GAAkB;IACpC,MAAM,EAAE,EAAE;IACV,WAAW,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC;IACtF,WAAW,EAAE;QACX,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,yBAAyB,EAAE;QACnD,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,qBAAqB,EAAE;QAC9C,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,6BAA6B,EAAE;QACxD,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,8BAA8B,EAAE;QAC5D,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,iCAAiC,EAAE;QAC3D,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,oCAAoC,EAAE;QAC9D,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,8BAA8B,EAAE;QACzD,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,yBAAyB,EAAE;QACjD,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,oCAAoC,EAAE;QAC9D,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,gCAAgC,EAAE;KAC5D;IACD,SAAS,EAAE;QACT,kCAAkC;QAClC,2BAA2B;QAC3B,sCAAsC;KACvC;CACF,CAAC;AAEF,MAAM,UAAU,UAAU,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IACpD,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;IAEjD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;QAC1D,OAAO;YACL,aAAa,EAAE,GAAG,CAAC,aAAa,IAAI,cAAc,CAAC,aAAa;YAChE,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,cAAc,CAAC,MAAM;YAC3C,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,cAAc,CAAC,WAAW;YAC1D,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,cAAc,CAAC,WAAW;YAC1D,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,cAAc,CAAC,SAAS;SACrD,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,yDAAyD,CAAC,CAAC;QACzE,OAAO,cAAc,CAAC;IACxB,CAAC;AACH,CAAC"}
package/dist/git.d.ts ADDED
@@ -0,0 +1,17 @@
1
+ export declare function getBranch(): string;
2
+ export declare function parseBranch(branch: string): {
3
+ type: undefined;
4
+ ticket: string;
5
+ description: string;
6
+ } | {
7
+ type: string;
8
+ ticket: string;
9
+ description: string;
10
+ };
11
+ export declare function inferTicket(): string;
12
+ export declare function inferScope(): string | undefined;
13
+ export declare function getCommits(base: string): string[];
14
+ export declare function getScopesFromCommits(commits: string[]): string[];
15
+ export declare function getDefaultBase(currentBranch: string): string;
16
+ export declare function checkGhInstalled(): void;
17
+ //# sourceMappingURL=git.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"AAEA,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM;;;;;;;;EAIzC;AAED,wBAAgB,WAAW,IAAI,MAAM,CASpC;AAED,wBAAgB,UAAU,IAAI,MAAM,GAAG,SAAS,CAe/C;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAOjD;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAOhE;AAED,wBAAgB,cAAc,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAiC5D;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CASvC"}
package/dist/git.js ADDED
@@ -0,0 +1,104 @@
1
+ import { execSync } from "child_process";
2
+ export function getBranch() {
3
+ return execSync("git branch --show-current", { encoding: "utf-8" }).trim();
4
+ }
5
+ export function parseBranch(branch) {
6
+ const match = branch.match(/^([^/]+)\/([^_]+)_(.+)$/);
7
+ if (!match)
8
+ return { type: undefined, ticket: "UNTRACKED", description: branch };
9
+ return { type: match[1], ticket: match[2], description: match[3].replace(/-/g, " ") };
10
+ }
11
+ export function inferTicket() {
12
+ try {
13
+ const branch = getBranch();
14
+ const match = branch.match(/^[^/]+\/([^_]+)_/);
15
+ if (match)
16
+ return match[1];
17
+ }
18
+ catch {
19
+ // Not on a branch
20
+ }
21
+ return "UNTRACKED";
22
+ }
23
+ export function inferScope() {
24
+ try {
25
+ const log = execSync("git log main..HEAD --format=%s", {
26
+ encoding: "utf-8",
27
+ }).trim();
28
+ if (!log)
29
+ return undefined;
30
+ const lines = log.split("\n");
31
+ for (const line of lines) {
32
+ const match = line.match(/^\w+\[.*?\]!?\(([^)]+)\)/);
33
+ if (match)
34
+ return match[1];
35
+ }
36
+ }
37
+ catch {
38
+ // No commits on branch or main doesn't exist
39
+ }
40
+ return undefined;
41
+ }
42
+ export function getCommits(base) {
43
+ try {
44
+ const log = execSync(`git log ${base}..HEAD --format=%s`, { encoding: "utf-8" }).trim();
45
+ return log ? log.split("\n") : [];
46
+ }
47
+ catch {
48
+ return [];
49
+ }
50
+ }
51
+ export function getScopesFromCommits(commits) {
52
+ const scopes = new Set();
53
+ for (const commit of commits) {
54
+ const match = commit.match(/\(([^)]+)\)/);
55
+ if (match)
56
+ scopes.add(match[1]);
57
+ }
58
+ return [...scopes];
59
+ }
60
+ export function getDefaultBase(currentBranch) {
61
+ try {
62
+ const remoteBranches = execSync("git branch -r", { encoding: "utf-8" })
63
+ .trim()
64
+ .split("\n")
65
+ .map((b) => b.trim())
66
+ .filter((b) => b && !b.includes("HEAD") && !b.endsWith(`/${currentBranch}`));
67
+ let closest = "main";
68
+ let minAhead = Infinity;
69
+ for (const remote of remoteBranches) {
70
+ try {
71
+ const mergeBase = execSync(`git merge-base HEAD ${remote}`, {
72
+ encoding: "utf-8",
73
+ }).trim();
74
+ const ahead = execSync(`git rev-list --count ${mergeBase}..HEAD`, {
75
+ encoding: "utf-8",
76
+ }).trim();
77
+ const count = parseInt(ahead, 10);
78
+ if (count < minAhead) {
79
+ minAhead = count;
80
+ closest = remote.replace(/^origin\//, "");
81
+ }
82
+ }
83
+ catch {
84
+ // Skip branches that can't be compared
85
+ }
86
+ }
87
+ return closest;
88
+ }
89
+ catch {
90
+ return "main";
91
+ }
92
+ }
93
+ export function checkGhInstalled() {
94
+ try {
95
+ execSync("gh --version", { stdio: "ignore" });
96
+ }
97
+ catch {
98
+ console.error("Error: GitHub CLI (gh) is not installed.");
99
+ console.error("Install it with: brew install gh");
100
+ console.error("Then authenticate: gh auth login");
101
+ process.exit(1);
102
+ }
103
+ }
104
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from "commander";
3
+ import { branchCommand } from "./commands/branch.js";
4
+ import { commitCommand } from "./commands/commit.js";
5
+ import { prCommand } from "./commands/pr.js";
6
+ import { initCommand } from "./commands/init.js";
7
+ const program = new Command();
8
+ program
9
+ .name("devflow")
10
+ .description("Interactive CLI for branch creation, conventional commits, and PR management")
11
+ .version("0.1.0");
12
+ program
13
+ .command("branch")
14
+ .description("Create a new branch with type/ticket/description format")
15
+ .action(branchCommand);
16
+ program
17
+ .command("commit")
18
+ .description("Create a conventional commit with guided prompts")
19
+ .action(commitCommand);
20
+ program
21
+ .command("pr")
22
+ .description("Create or update a pull request with auto-filled template")
23
+ .action(prCommand);
24
+ program
25
+ .command("init")
26
+ .description("Initialize a .devflow.json config file in the current project")
27
+ .action(initCommand);
28
+ program.parse();
29
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,SAAS,CAAC;KACf,WAAW,CAAC,8EAA8E,CAAC;KAC3F,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,yDAAyD,CAAC;KACtE,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,kDAAkD,CAAC;KAC/D,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,OAAO;KACJ,OAAO,CAAC,IAAI,CAAC;KACb,WAAW,CAAC,2DAA2D,CAAC;KACxE,MAAM,CAAC,SAAS,CAAC,CAAC;AAErB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,+DAA+D,CAAC;KAC5E,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,OAAO,CAAC,KAAK,EAAE,CAAC"}
package/package.json ADDED
@@ -0,0 +1,29 @@
1
+ {
2
+ "name": "@alejandrochaves/devflow-cli",
3
+ "version": "0.1.0",
4
+ "description": "Interactive CLI for branch creation, conventional commits, and PR management",
5
+ "type": "module",
6
+ "bin": {
7
+ "devflow": "./dist/index.js"
8
+ },
9
+ "scripts": {
10
+ "build": "tsc",
11
+ "dev": "tsc --watch",
12
+ "publish:public": "npm publish --access=public",
13
+ "prepublishOnly": "npm run build"
14
+ },
15
+ "keywords": ["cli", "git", "commits", "conventional-commits", "branch", "pull-request"],
16
+ "license": "MIT",
17
+ "files": ["dist"],
18
+ "engines": {
19
+ "node": ">=18"
20
+ },
21
+ "dependencies": {
22
+ "@inquirer/prompts": "^8.2.0",
23
+ "commander": "^13.1.0"
24
+ },
25
+ "devDependencies": {
26
+ "@types/node": "^22.0.0",
27
+ "typescript": "~5.9.2"
28
+ }
29
+ }