@alejandrochaves/devflow-cli 0.2.0 → 0.3.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/LICENSE +21 -0
- package/README.md +114 -7
- package/dist/commands/branch.d.ts.map +1 -1
- package/dist/commands/branch.js +27 -0
- package/dist/commands/branch.js.map +1 -1
- package/dist/commands/cleanup.d.ts.map +1 -1
- package/dist/commands/cleanup.js +3 -0
- package/dist/commands/cleanup.js.map +1 -1
- package/dist/commands/commit.d.ts +10 -0
- package/dist/commands/commit.d.ts.map +1 -1
- package/dist/commands/commit.js +25 -10
- package/dist/commands/commit.js.map +1 -1
- package/dist/commands/doctor.js +2 -2
- package/dist/commands/fixup.d.ts +4 -0
- package/dist/commands/fixup.d.ts.map +1 -0
- package/dist/commands/fixup.js +100 -0
- package/dist/commands/fixup.js.map +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +12 -0
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/merge.d.ts +4 -0
- package/dist/commands/merge.d.ts.map +1 -0
- package/dist/commands/merge.js +84 -0
- package/dist/commands/merge.js.map +1 -0
- package/dist/commands/pr.d.ts.map +1 -1
- package/dist/commands/pr.js +10 -2
- package/dist/commands/pr.js.map +1 -1
- package/dist/commands/test-plan.d.ts +2 -0
- package/dist/commands/test-plan.d.ts.map +1 -0
- package/dist/commands/test-plan.js +92 -0
- package/dist/commands/test-plan.js.map +1 -0
- package/dist/commands/undo.d.ts +4 -0
- package/dist/commands/undo.d.ts.map +1 -0
- package/dist/commands/undo.js +46 -0
- package/dist/commands/undo.js.map +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +49 -3
- package/dist/config.js.map +1 -1
- package/dist/git.d.ts +1 -0
- package/dist/git.d.ts.map +1 -1
- package/dist/git.js +5 -0
- package/dist/git.js.map +1 -1
- package/dist/index.js +63 -21
- package/dist/index.js.map +1 -1
- package/dist/monorepo.d.ts +13 -0
- package/dist/monorepo.d.ts.map +1 -0
- package/dist/monorepo.js +191 -0
- package/dist/monorepo.js.map +1 -0
- package/dist/test-plan.d.ts +5 -0
- package/dist/test-plan.d.ts.map +1 -0
- package/dist/test-plan.js +48 -0
- package/dist/test-plan.js.map +1 -0
- package/dist/update-notifier.d.ts +2 -0
- package/dist/update-notifier.d.ts.map +1 -0
- package/dist/update-notifier.js +96 -0
- package/dist/update-notifier.js.map +1 -0
- package/package.json +14 -3
package/dist/index.js
CHANGED
|
@@ -9,49 +9,87 @@ import { amendCommand } from "./commands/amend.js";
|
|
|
9
9
|
import { cleanupCommand } from "./commands/cleanup.js";
|
|
10
10
|
import { changelogCommand } from "./commands/changelog.js";
|
|
11
11
|
import { doctorCommand } from "./commands/doctor.js";
|
|
12
|
+
import { undoCommand } from "./commands/undo.js";
|
|
13
|
+
import { mergeCommand } from "./commands/merge.js";
|
|
14
|
+
import { fixupCommand } from "./commands/fixup.js";
|
|
15
|
+
import { testPlanCommand } from "./commands/test-plan.js";
|
|
16
|
+
import { checkForUpdates } from "./update-notifier.js";
|
|
17
|
+
// Check for updates (non-blocking, cached)
|
|
18
|
+
checkForUpdates();
|
|
12
19
|
const program = new Command();
|
|
13
20
|
program
|
|
14
21
|
.name("devflow")
|
|
15
22
|
.description("Interactive CLI for branch creation, conventional commits, and PR management")
|
|
16
|
-
.version("0.
|
|
23
|
+
.version("0.3.0");
|
|
24
|
+
// --- Core commands ---
|
|
17
25
|
program
|
|
18
26
|
.command("branch")
|
|
27
|
+
.alias("b")
|
|
19
28
|
.description("Create a new branch with type/ticket/description format")
|
|
20
29
|
.option("--dry-run", "Preview without executing git commands")
|
|
21
30
|
.action((opts) => branchCommand(opts));
|
|
22
31
|
program
|
|
23
32
|
.command("commit")
|
|
33
|
+
.alias("c")
|
|
24
34
|
.description("Create a conventional commit with guided prompts")
|
|
25
35
|
.option("--dry-run", "Preview without executing git commands")
|
|
26
36
|
.action((opts) => commitCommand(opts));
|
|
27
37
|
program
|
|
28
38
|
.command("pr")
|
|
39
|
+
.alias("p")
|
|
29
40
|
.description("Create or update a pull request with auto-filled template")
|
|
30
41
|
.option("--dry-run", "Preview without executing git commands")
|
|
31
42
|
.action((opts) => prCommand(opts));
|
|
32
43
|
program
|
|
33
|
-
.command("
|
|
34
|
-
.
|
|
35
|
-
.
|
|
44
|
+
.command("amend")
|
|
45
|
+
.alias("a")
|
|
46
|
+
.description("Amend the last commit with guided prompts")
|
|
47
|
+
.option("--dry-run", "Preview without executing git commands")
|
|
48
|
+
.action((opts) => amendCommand(opts));
|
|
49
|
+
program
|
|
50
|
+
.command("undo")
|
|
51
|
+
.alias("u")
|
|
52
|
+
.description("Undo the last commit (keeps changes staged)")
|
|
53
|
+
.option("--dry-run", "Preview without executing git commands")
|
|
54
|
+
.action((opts) => undoCommand(opts));
|
|
55
|
+
program
|
|
56
|
+
.command("fixup")
|
|
57
|
+
.alias("f")
|
|
58
|
+
.description("Create a fixup commit targeting a previous commit")
|
|
59
|
+
.option("--dry-run", "Preview without executing git commands")
|
|
60
|
+
.action((opts) => fixupCommand(opts));
|
|
61
|
+
program
|
|
62
|
+
.command("merge")
|
|
63
|
+
.alias("m")
|
|
64
|
+
.description("Merge the current branch PR with squash/merge/rebase")
|
|
65
|
+
.option("--dry-run", "Preview without executing git commands")
|
|
66
|
+
.action((opts) => mergeCommand(opts));
|
|
67
|
+
// --- Info commands ---
|
|
36
68
|
program
|
|
37
69
|
.command("status")
|
|
70
|
+
.alias("s")
|
|
38
71
|
.description("Show current branch, ticket, commits, and PR info")
|
|
39
72
|
.action(statusCommand);
|
|
40
73
|
program
|
|
41
|
-
.command("
|
|
42
|
-
.
|
|
43
|
-
.
|
|
44
|
-
.action(
|
|
74
|
+
.command("test-plan")
|
|
75
|
+
.alias("tp")
|
|
76
|
+
.description("View or edit the test plan for the current branch")
|
|
77
|
+
.action(testPlanCommand);
|
|
78
|
+
program
|
|
79
|
+
.command("changelog")
|
|
80
|
+
.description("Generate a changelog from conventional commits since last tag")
|
|
81
|
+
.option("--dry-run", "Preview without writing to file")
|
|
82
|
+
.action((opts) => changelogCommand(opts));
|
|
45
83
|
program
|
|
46
84
|
.command("cleanup")
|
|
47
85
|
.description("Delete local branches that have been merged or whose remote is gone")
|
|
48
86
|
.option("--dry-run", "Preview without deleting branches")
|
|
49
87
|
.action((opts) => cleanupCommand(opts));
|
|
88
|
+
// --- Setup commands ---
|
|
50
89
|
program
|
|
51
|
-
.command("
|
|
52
|
-
.description("
|
|
53
|
-
.
|
|
54
|
-
.action((opts) => changelogCommand(opts));
|
|
90
|
+
.command("init")
|
|
91
|
+
.description("Initialize a .devflow.json config and project setup")
|
|
92
|
+
.action(initCommand);
|
|
55
93
|
program
|
|
56
94
|
.command("doctor")
|
|
57
95
|
.description("Check that all devflow dependencies are properly configured")
|
|
@@ -74,7 +112,7 @@ function generateBashCompletions() {
|
|
|
74
112
|
# Add to ~/.bashrc: eval "$(devflow completions --shell bash)"
|
|
75
113
|
_devflow_completions() {
|
|
76
114
|
local cur="\${COMP_WORDS[COMP_CWORD]}"
|
|
77
|
-
local commands="branch commit pr
|
|
115
|
+
local commands="branch commit pr amend undo fixup merge status test-plan changelog cleanup init doctor completions"
|
|
78
116
|
|
|
79
117
|
if [ "\${COMP_CWORD}" -eq 1 ]; then
|
|
80
118
|
COMPREPLY=($(compgen -W "\${commands}" -- "\${cur}"))
|
|
@@ -90,14 +128,18 @@ function generateZshCompletions() {
|
|
|
90
128
|
_devflow() {
|
|
91
129
|
local -a commands
|
|
92
130
|
commands=(
|
|
93
|
-
'branch:Create a new branch
|
|
94
|
-
'commit:Create a conventional commit
|
|
95
|
-
'pr:Create or update a pull request'
|
|
96
|
-
'
|
|
97
|
-
'
|
|
98
|
-
'
|
|
131
|
+
'branch:Create a new branch (alias: b)'
|
|
132
|
+
'commit:Create a conventional commit (alias: c)'
|
|
133
|
+
'pr:Create or update a pull request (alias: p)'
|
|
134
|
+
'amend:Amend the last commit (alias: a)'
|
|
135
|
+
'undo:Undo the last commit (alias: u)'
|
|
136
|
+
'fixup:Create a fixup commit (alias: f)'
|
|
137
|
+
'merge:Merge the current PR (alias: m)'
|
|
138
|
+
'status:Show branch and PR info (alias: s)'
|
|
139
|
+
'test-plan:View or edit test plan (alias: tp)'
|
|
140
|
+
'changelog:Generate changelog from commits'
|
|
99
141
|
'cleanup:Delete merged local branches'
|
|
100
|
-
'
|
|
142
|
+
'init:Initialize devflow config'
|
|
101
143
|
'doctor:Check devflow dependencies'
|
|
102
144
|
'completions:Output shell completion script'
|
|
103
145
|
)
|
|
@@ -112,7 +154,7 @@ _devflow() {
|
|
|
112
154
|
;;
|
|
113
155
|
args)
|
|
114
156
|
case "\${words[1]}" in
|
|
115
|
-
branch|commit|pr|amend|cleanup|changelog)
|
|
157
|
+
branch|commit|pr|amend|undo|fixup|merge|cleanup|changelog)
|
|
116
158
|
_arguments '--dry-run[Preview without executing]'
|
|
117
159
|
;;
|
|
118
160
|
completions)
|
package/dist/index.js.map
CHANGED
|
@@ -1 +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;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Scope } from "./config.js";
|
|
2
|
+
interface WorkspaceInfo {
|
|
3
|
+
type: "npm" | "pnpm" | "lerna" | "nx" | "turborepo";
|
|
4
|
+
packages: WorkspacePackage[];
|
|
5
|
+
}
|
|
6
|
+
interface WorkspacePackage {
|
|
7
|
+
name: string;
|
|
8
|
+
path: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function detectMonorepo(cwd?: string): WorkspaceInfo | undefined;
|
|
11
|
+
export declare function workspacesToScopes(info: WorkspaceInfo): Scope[];
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=monorepo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"monorepo.d.ts","sourceRoot":"","sources":["../src/monorepo.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,UAAU,aAAa;IACrB,IAAI,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,WAAW,CAAC;IACpD,QAAQ,EAAE,gBAAgB,EAAE,CAAC;CAC9B;AAED,UAAU,gBAAgB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,cAAc,CAAC,GAAG,GAAE,MAAsB,GAAG,aAAa,GAAG,SAAS,CA6ErF;AAwGD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,aAAa,GAAG,KAAK,EAAE,CAU/D"}
|
package/dist/monorepo.js
ADDED
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { existsSync, readFileSync, readdirSync, statSync } from "fs";
|
|
2
|
+
import { resolve, basename, relative } from "path";
|
|
3
|
+
export function detectMonorepo(cwd = process.cwd()) {
|
|
4
|
+
// Check pnpm workspaces
|
|
5
|
+
const pnpmWorkspace = resolve(cwd, "pnpm-workspace.yaml");
|
|
6
|
+
if (existsSync(pnpmWorkspace)) {
|
|
7
|
+
const packages = parsePnpmWorkspaces(cwd, pnpmWorkspace);
|
|
8
|
+
if (packages.length > 0) {
|
|
9
|
+
return { type: "pnpm", packages };
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
// Check npm/yarn workspaces in package.json
|
|
13
|
+
const pkgPath = resolve(cwd, "package.json");
|
|
14
|
+
if (existsSync(pkgPath)) {
|
|
15
|
+
try {
|
|
16
|
+
const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
|
|
17
|
+
if (pkg.workspaces) {
|
|
18
|
+
const patterns = Array.isArray(pkg.workspaces)
|
|
19
|
+
? pkg.workspaces
|
|
20
|
+
: pkg.workspaces.packages || [];
|
|
21
|
+
const packages = resolveWorkspacePatterns(cwd, patterns);
|
|
22
|
+
if (packages.length > 0) {
|
|
23
|
+
return { type: "npm", packages };
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
// ignore
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
// Check lerna.json
|
|
32
|
+
const lernaPath = resolve(cwd, "lerna.json");
|
|
33
|
+
if (existsSync(lernaPath)) {
|
|
34
|
+
try {
|
|
35
|
+
const lerna = JSON.parse(readFileSync(lernaPath, "utf-8"));
|
|
36
|
+
const patterns = lerna.packages || ["packages/*"];
|
|
37
|
+
const packages = resolveWorkspacePatterns(cwd, patterns);
|
|
38
|
+
if (packages.length > 0) {
|
|
39
|
+
return { type: "lerna", packages };
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
// ignore
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// Check nx.json (Nx uses project.json in each package or nx.json at root)
|
|
47
|
+
const nxPath = resolve(cwd, "nx.json");
|
|
48
|
+
if (existsSync(nxPath)) {
|
|
49
|
+
const packages = discoverNxProjects(cwd);
|
|
50
|
+
if (packages.length > 0) {
|
|
51
|
+
return { type: "nx", packages };
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// Check turbo.json
|
|
55
|
+
const turboPath = resolve(cwd, "turbo.json");
|
|
56
|
+
if (existsSync(turboPath)) {
|
|
57
|
+
// Turborepo uses npm/pnpm/yarn workspaces, so check package.json workspaces
|
|
58
|
+
const pkgPath2 = resolve(cwd, "package.json");
|
|
59
|
+
if (existsSync(pkgPath2)) {
|
|
60
|
+
try {
|
|
61
|
+
const pkg = JSON.parse(readFileSync(pkgPath2, "utf-8"));
|
|
62
|
+
if (pkg.workspaces) {
|
|
63
|
+
const patterns = Array.isArray(pkg.workspaces)
|
|
64
|
+
? pkg.workspaces
|
|
65
|
+
: pkg.workspaces.packages || [];
|
|
66
|
+
const packages = resolveWorkspacePatterns(cwd, patterns);
|
|
67
|
+
if (packages.length > 0) {
|
|
68
|
+
return { type: "turborepo", packages };
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
// ignore
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return undefined;
|
|
78
|
+
}
|
|
79
|
+
function parsePnpmWorkspaces(cwd, filePath) {
|
|
80
|
+
try {
|
|
81
|
+
const content = readFileSync(filePath, "utf-8");
|
|
82
|
+
// Simple YAML parsing for packages list
|
|
83
|
+
const patterns = [];
|
|
84
|
+
let inPackages = false;
|
|
85
|
+
for (const line of content.split("\n")) {
|
|
86
|
+
if (line.match(/^packages\s*:/)) {
|
|
87
|
+
inPackages = true;
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
if (inPackages) {
|
|
91
|
+
const match = line.match(/^\s+-\s+['"]?(.+?)['"]?\s*$/);
|
|
92
|
+
if (match) {
|
|
93
|
+
patterns.push(match[1]);
|
|
94
|
+
}
|
|
95
|
+
else if (line.match(/^\S/) && line.trim()) {
|
|
96
|
+
break; // New top-level key
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return resolveWorkspacePatterns(cwd, patterns);
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
return [];
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
function resolveWorkspacePatterns(cwd, patterns) {
|
|
107
|
+
const packages = [];
|
|
108
|
+
for (const pattern of patterns) {
|
|
109
|
+
if (pattern.includes("*")) {
|
|
110
|
+
// Glob pattern like "packages/*" or "apps/*"
|
|
111
|
+
const parts = pattern.split("*");
|
|
112
|
+
const baseDir = resolve(cwd, parts[0]);
|
|
113
|
+
if (existsSync(baseDir) && statSync(baseDir).isDirectory()) {
|
|
114
|
+
for (const entry of readdirSync(baseDir)) {
|
|
115
|
+
const entryPath = resolve(baseDir, entry);
|
|
116
|
+
if (statSync(entryPath).isDirectory()) {
|
|
117
|
+
const pkgJsonPath = resolve(entryPath, "package.json");
|
|
118
|
+
if (existsSync(pkgJsonPath)) {
|
|
119
|
+
try {
|
|
120
|
+
const pkg = JSON.parse(readFileSync(pkgJsonPath, "utf-8"));
|
|
121
|
+
packages.push({
|
|
122
|
+
name: pkg.name || entry,
|
|
123
|
+
path: relative(cwd, entryPath),
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
packages.push({ name: entry, path: relative(cwd, entryPath) });
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
packages.push({ name: entry, path: relative(cwd, entryPath) });
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
// Direct path
|
|
139
|
+
const dirPath = resolve(cwd, pattern);
|
|
140
|
+
if (existsSync(dirPath) && statSync(dirPath).isDirectory()) {
|
|
141
|
+
const pkgJsonPath = resolve(dirPath, "package.json");
|
|
142
|
+
const name = existsSync(pkgJsonPath)
|
|
143
|
+
? JSON.parse(readFileSync(pkgJsonPath, "utf-8")).name || basename(pattern)
|
|
144
|
+
: basename(pattern);
|
|
145
|
+
packages.push({ name, path: pattern });
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return packages;
|
|
150
|
+
}
|
|
151
|
+
function discoverNxProjects(cwd) {
|
|
152
|
+
const packages = [];
|
|
153
|
+
// Look for project.json files in common locations
|
|
154
|
+
const searchDirs = ["packages", "apps", "libs"];
|
|
155
|
+
for (const dir of searchDirs) {
|
|
156
|
+
const dirPath = resolve(cwd, dir);
|
|
157
|
+
if (existsSync(dirPath) && statSync(dirPath).isDirectory()) {
|
|
158
|
+
for (const entry of readdirSync(dirPath)) {
|
|
159
|
+
const entryPath = resolve(dirPath, entry);
|
|
160
|
+
if (statSync(entryPath).isDirectory()) {
|
|
161
|
+
const projectJson = resolve(entryPath, "project.json");
|
|
162
|
+
if (existsSync(projectJson)) {
|
|
163
|
+
try {
|
|
164
|
+
const project = JSON.parse(readFileSync(projectJson, "utf-8"));
|
|
165
|
+
packages.push({
|
|
166
|
+
name: project.name || entry,
|
|
167
|
+
path: relative(cwd, entryPath),
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
packages.push({ name: entry, path: relative(cwd, entryPath) });
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return packages;
|
|
179
|
+
}
|
|
180
|
+
export function workspacesToScopes(info) {
|
|
181
|
+
return info.packages.map((pkg) => {
|
|
182
|
+
// Use the short package name (strip scope)
|
|
183
|
+
const shortName = pkg.name.replace(/^@[^/]+\//, "");
|
|
184
|
+
return {
|
|
185
|
+
value: shortName,
|
|
186
|
+
description: `Workspace: ${pkg.name}`,
|
|
187
|
+
paths: [`${pkg.path}/**`],
|
|
188
|
+
};
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=monorepo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"monorepo.js","sourceRoot":"","sources":["../src/monorepo.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare function getTestPlan(branch: string, cwd?: string): string[];
|
|
2
|
+
export declare function setTestPlan(branch: string, steps: string[], cwd?: string): void;
|
|
3
|
+
export declare function deleteTestPlan(branch: string, cwd?: string): void;
|
|
4
|
+
export declare function listTestPlans(cwd?: string): Record<string, string[]>;
|
|
5
|
+
//# sourceMappingURL=test-plan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-plan.d.ts","sourceRoot":"","sources":["../src/test-plan.ts"],"names":[],"mappings":"AAgCA,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAGlE;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAQ/E;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAIjE;AAED,wBAAgB,aAAa,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAEpE"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from "fs";
|
|
2
|
+
import { resolve } from "path";
|
|
3
|
+
function getStorePath(cwd = process.cwd()) {
|
|
4
|
+
const dir = resolve(cwd, ".devflow");
|
|
5
|
+
if (!existsSync(dir)) {
|
|
6
|
+
mkdirSync(dir, { recursive: true });
|
|
7
|
+
}
|
|
8
|
+
return resolve(dir, "test-plans.json");
|
|
9
|
+
}
|
|
10
|
+
function readStore(cwd) {
|
|
11
|
+
try {
|
|
12
|
+
const path = getStorePath(cwd);
|
|
13
|
+
if (existsSync(path)) {
|
|
14
|
+
return JSON.parse(readFileSync(path, "utf-8"));
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
// ignore
|
|
19
|
+
}
|
|
20
|
+
return {};
|
|
21
|
+
}
|
|
22
|
+
function writeStore(store, cwd) {
|
|
23
|
+
const path = getStorePath(cwd);
|
|
24
|
+
writeFileSync(path, JSON.stringify(store, null, 2) + "\n");
|
|
25
|
+
}
|
|
26
|
+
export function getTestPlan(branch, cwd) {
|
|
27
|
+
const store = readStore(cwd);
|
|
28
|
+
return store[branch] || [];
|
|
29
|
+
}
|
|
30
|
+
export function setTestPlan(branch, steps, cwd) {
|
|
31
|
+
const store = readStore(cwd);
|
|
32
|
+
if (steps.length === 0) {
|
|
33
|
+
delete store[branch];
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
store[branch] = steps;
|
|
37
|
+
}
|
|
38
|
+
writeStore(store, cwd);
|
|
39
|
+
}
|
|
40
|
+
export function deleteTestPlan(branch, cwd) {
|
|
41
|
+
const store = readStore(cwd);
|
|
42
|
+
delete store[branch];
|
|
43
|
+
writeStore(store, cwd);
|
|
44
|
+
}
|
|
45
|
+
export function listTestPlans(cwd) {
|
|
46
|
+
return readStore(cwd);
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=test-plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-plan.js","sourceRoot":"","sources":["../src/test-plan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAM/B,SAAS,YAAY,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IACrC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,OAAO,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,SAAS,CAAC,GAAY;IAC7B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,SAAS;IACX,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,UAAU,CAAC,KAAoB,EAAE,GAAY;IACpD,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAC/B,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAc,EAAE,GAAY;IACtD,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;IAC7B,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAc,EAAE,KAAe,EAAE,GAAY;IACvE,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC;IACvB,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC;IACxB,CAAC;IACD,UAAU,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAc,EAAE,GAAY;IACzD,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;IAC7B,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC;IACrB,UAAU,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAY;IACxC,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;AACxB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-notifier.d.ts","sourceRoot":"","sources":["../src/update-notifier.ts"],"names":[],"mappings":"AA2EA,wBAAgB,eAAe,IAAI,IAAI,CAoBtC"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { execSync } from "child_process";
|
|
2
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
|
|
3
|
+
import { resolve } from "path";
|
|
4
|
+
import { homedir } from "os";
|
|
5
|
+
import { yellow, dim, cyan } from "./colors.js";
|
|
6
|
+
const PACKAGE_NAME = "@alejandrochaves/devflow-cli";
|
|
7
|
+
const CHECK_INTERVAL = 24 * 60 * 60 * 1000; // 24 hours
|
|
8
|
+
function getCachePath() {
|
|
9
|
+
const dir = resolve(homedir(), ".devflow");
|
|
10
|
+
if (!existsSync(dir)) {
|
|
11
|
+
mkdirSync(dir, { recursive: true });
|
|
12
|
+
}
|
|
13
|
+
return resolve(dir, "update-cache.json");
|
|
14
|
+
}
|
|
15
|
+
function readCache() {
|
|
16
|
+
try {
|
|
17
|
+
const cachePath = getCachePath();
|
|
18
|
+
if (existsSync(cachePath)) {
|
|
19
|
+
return JSON.parse(readFileSync(cachePath, "utf-8"));
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
// Ignore
|
|
24
|
+
}
|
|
25
|
+
return { lastCheck: 0 };
|
|
26
|
+
}
|
|
27
|
+
function writeCache(cache) {
|
|
28
|
+
try {
|
|
29
|
+
writeFileSync(getCachePath(), JSON.stringify(cache));
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
// Ignore
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
function getCurrentVersion() {
|
|
36
|
+
try {
|
|
37
|
+
const pkgPath = new URL("../package.json", import.meta.url);
|
|
38
|
+
const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
|
|
39
|
+
return pkg.version;
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return "0.0.0";
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function fetchLatestVersion() {
|
|
46
|
+
try {
|
|
47
|
+
const result = execSync(`npm view ${PACKAGE_NAME} version`, {
|
|
48
|
+
encoding: "utf-8",
|
|
49
|
+
timeout: 5000,
|
|
50
|
+
stdio: ["pipe", "pipe", "ignore"],
|
|
51
|
+
}).trim();
|
|
52
|
+
return result;
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function isNewer(latest, current) {
|
|
59
|
+
const l = latest.split(".").map(Number);
|
|
60
|
+
const c = current.split(".").map(Number);
|
|
61
|
+
for (let i = 0; i < 3; i++) {
|
|
62
|
+
if ((l[i] || 0) > (c[i] || 0))
|
|
63
|
+
return true;
|
|
64
|
+
if ((l[i] || 0) < (c[i] || 0))
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
export function checkForUpdates() {
|
|
70
|
+
const cache = readCache();
|
|
71
|
+
const now = Date.now();
|
|
72
|
+
if (now - cache.lastCheck < CHECK_INTERVAL) {
|
|
73
|
+
// Show cached notification if available
|
|
74
|
+
if (cache.latestVersion && isNewer(cache.latestVersion, getCurrentVersion())) {
|
|
75
|
+
showNotification(cache.latestVersion);
|
|
76
|
+
}
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
// Check in background (non-blocking)
|
|
80
|
+
const latest = fetchLatestVersion();
|
|
81
|
+
const newCache = { lastCheck: now, latestVersion: latest };
|
|
82
|
+
writeCache(newCache);
|
|
83
|
+
if (latest && isNewer(latest, getCurrentVersion())) {
|
|
84
|
+
showNotification(latest);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
function showNotification(latest) {
|
|
88
|
+
const current = getCurrentVersion();
|
|
89
|
+
console.log(dim("─") + " " +
|
|
90
|
+
yellow("Update available:") + " " +
|
|
91
|
+
dim(current) + " → " + cyan(latest) + " " +
|
|
92
|
+
dim(`(npm update ${PACKAGE_NAME})`) + " " +
|
|
93
|
+
dim("─"));
|
|
94
|
+
console.log("");
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=update-notifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-notifier.js","sourceRoot":"","sources":["../src/update-notifier.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@alejandrochaves/devflow-cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Interactive CLI for branch creation, conventional commits, and PR management",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -9,6 +9,8 @@
|
|
|
9
9
|
"scripts": {
|
|
10
10
|
"build": "tsc",
|
|
11
11
|
"dev": "tsc --watch",
|
|
12
|
+
"test": "vitest run",
|
|
13
|
+
"test:watch": "vitest",
|
|
12
14
|
"publish:public": "npm publish --access=public",
|
|
13
15
|
"prepublishOnly": "npm run build"
|
|
14
16
|
},
|
|
@@ -21,11 +23,19 @@
|
|
|
21
23
|
"pull-request"
|
|
22
24
|
],
|
|
23
25
|
"license": "MIT",
|
|
26
|
+
"repository": {
|
|
27
|
+
"type": "git",
|
|
28
|
+
"url": "git+https://github.com/alejandrochvs/devflow-cli.git"
|
|
29
|
+
},
|
|
30
|
+
"bugs": {
|
|
31
|
+
"url": "https://github.com/alejandrochvs/devflow-cli/issues"
|
|
32
|
+
},
|
|
33
|
+
"homepage": "https://github.com/alejandrochvs/devflow-cli#readme",
|
|
24
34
|
"files": [
|
|
25
35
|
"dist"
|
|
26
36
|
],
|
|
27
37
|
"engines": {
|
|
28
|
-
"node": ">=
|
|
38
|
+
"node": ">=20.12.0"
|
|
29
39
|
},
|
|
30
40
|
"dependencies": {
|
|
31
41
|
"@inquirer/prompts": "^8.2.0",
|
|
@@ -33,6 +43,7 @@
|
|
|
33
43
|
},
|
|
34
44
|
"devDependencies": {
|
|
35
45
|
"@types/node": "^22.0.0",
|
|
36
|
-
"typescript": "~5.9.2"
|
|
46
|
+
"typescript": "~5.9.2",
|
|
47
|
+
"vitest": "^4.0.18"
|
|
37
48
|
}
|
|
38
49
|
}
|