@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.
- package/dist/commands/branch.d.ts +2 -0
- package/dist/commands/branch.d.ts.map +1 -0
- package/dist/commands/branch.js +47 -0
- package/dist/commands/branch.js.map +1 -0
- package/dist/commands/commit.d.ts +2 -0
- package/dist/commands/commit.d.ts.map +1 -0
- package/dist/commands/commit.js +126 -0
- package/dist/commands/commit.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +52 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/pr.d.ts +2 -0
- package/dist/commands/pr.d.ts.map +1 -0
- package/dist/commands/pr.js +203 -0
- package/dist/commands/pr.js.map +1 -0
- package/dist/config.d.ts +16 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +44 -0
- package/dist/config.js.map +1 -0
- package/dist/git.d.ts +17 -0
- package/dist/git.d.ts.map +1 -0
- package/dist/git.js +104 -0
- package/dist/git.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -0
- package/package.json +29 -0
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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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"}
|
package/dist/config.d.ts
ADDED
|
@@ -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
|
package/dist/git.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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
|
+
}
|