@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.
Files changed (57) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +114 -7
  3. package/dist/commands/branch.d.ts.map +1 -1
  4. package/dist/commands/branch.js +27 -0
  5. package/dist/commands/branch.js.map +1 -1
  6. package/dist/commands/cleanup.d.ts.map +1 -1
  7. package/dist/commands/cleanup.js +3 -0
  8. package/dist/commands/cleanup.js.map +1 -1
  9. package/dist/commands/commit.d.ts +10 -0
  10. package/dist/commands/commit.d.ts.map +1 -1
  11. package/dist/commands/commit.js +25 -10
  12. package/dist/commands/commit.js.map +1 -1
  13. package/dist/commands/doctor.js +2 -2
  14. package/dist/commands/fixup.d.ts +4 -0
  15. package/dist/commands/fixup.d.ts.map +1 -0
  16. package/dist/commands/fixup.js +100 -0
  17. package/dist/commands/fixup.js.map +1 -0
  18. package/dist/commands/init.d.ts.map +1 -1
  19. package/dist/commands/init.js +12 -0
  20. package/dist/commands/init.js.map +1 -1
  21. package/dist/commands/merge.d.ts +4 -0
  22. package/dist/commands/merge.d.ts.map +1 -0
  23. package/dist/commands/merge.js +84 -0
  24. package/dist/commands/merge.js.map +1 -0
  25. package/dist/commands/pr.d.ts.map +1 -1
  26. package/dist/commands/pr.js +10 -2
  27. package/dist/commands/pr.js.map +1 -1
  28. package/dist/commands/test-plan.d.ts +2 -0
  29. package/dist/commands/test-plan.d.ts.map +1 -0
  30. package/dist/commands/test-plan.js +92 -0
  31. package/dist/commands/test-plan.js.map +1 -0
  32. package/dist/commands/undo.d.ts +4 -0
  33. package/dist/commands/undo.d.ts.map +1 -0
  34. package/dist/commands/undo.js +46 -0
  35. package/dist/commands/undo.js.map +1 -0
  36. package/dist/config.d.ts.map +1 -1
  37. package/dist/config.js +49 -3
  38. package/dist/config.js.map +1 -1
  39. package/dist/git.d.ts +1 -0
  40. package/dist/git.d.ts.map +1 -1
  41. package/dist/git.js +5 -0
  42. package/dist/git.js.map +1 -1
  43. package/dist/index.js +63 -21
  44. package/dist/index.js.map +1 -1
  45. package/dist/monorepo.d.ts +13 -0
  46. package/dist/monorepo.d.ts.map +1 -0
  47. package/dist/monorepo.js +191 -0
  48. package/dist/monorepo.js.map +1 -0
  49. package/dist/test-plan.d.ts +5 -0
  50. package/dist/test-plan.d.ts.map +1 -0
  51. package/dist/test-plan.js +48 -0
  52. package/dist/test-plan.js.map +1 -0
  53. package/dist/update-notifier.d.ts +2 -0
  54. package/dist/update-notifier.d.ts.map +1 -0
  55. package/dist/update-notifier.js +96 -0
  56. package/dist/update-notifier.js.map +1 -0
  57. 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.2.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("init")
34
- .description("Initialize a .devflow.json config and project setup")
35
- .action(initCommand);
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("amend")
42
- .description("Amend the last commit with guided prompts")
43
- .option("--dry-run", "Preview without executing git commands")
44
- .action((opts) => amendCommand(opts));
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("changelog")
52
- .description("Generate a changelog from conventional commits since last tag")
53
- .option("--dry-run", "Preview without writing to file")
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 init status amend cleanup changelog doctor completions"
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 with type/ticket/description format'
94
- 'commit:Create a conventional commit with guided prompts'
95
- 'pr:Create or update a pull request'
96
- 'init:Initialize devflow config and project setup'
97
- 'status:Show current branch, ticket, commits, and PR info'
98
- 'amend:Amend the last commit with guided prompts'
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
- 'changelog:Generate changelog from conventional commits'
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":"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"}
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"}
@@ -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,2 @@
1
+ export declare function checkForUpdates(): void;
2
+ //# sourceMappingURL=update-notifier.d.ts.map
@@ -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.2.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": ">=18"
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
  }