@alejandrochaves/devflow-cli 0.1.1 → 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 (80) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +217 -15
  3. package/dist/colors.d.ts +9 -0
  4. package/dist/colors.d.ts.map +1 -0
  5. package/dist/colors.js +13 -0
  6. package/dist/colors.js.map +1 -0
  7. package/dist/commands/amend.d.ts +4 -0
  8. package/dist/commands/amend.d.ts.map +1 -0
  9. package/dist/commands/amend.js +138 -0
  10. package/dist/commands/amend.js.map +1 -0
  11. package/dist/commands/branch.d.ts +3 -1
  12. package/dist/commands/branch.d.ts.map +1 -1
  13. package/dist/commands/branch.js +37 -5
  14. package/dist/commands/branch.js.map +1 -1
  15. package/dist/commands/changelog.d.ts +4 -0
  16. package/dist/commands/changelog.d.ts.map +1 -0
  17. package/dist/commands/changelog.js +204 -0
  18. package/dist/commands/changelog.js.map +1 -0
  19. package/dist/commands/cleanup.d.ts +4 -0
  20. package/dist/commands/cleanup.d.ts.map +1 -0
  21. package/dist/commands/cleanup.js +124 -0
  22. package/dist/commands/cleanup.js.map +1 -0
  23. package/dist/commands/commit.d.ts +13 -1
  24. package/dist/commands/commit.d.ts.map +1 -1
  25. package/dist/commands/commit.js +107 -25
  26. package/dist/commands/commit.js.map +1 -1
  27. package/dist/commands/doctor.d.ts +2 -0
  28. package/dist/commands/doctor.d.ts.map +1 -0
  29. package/dist/commands/doctor.js +122 -0
  30. package/dist/commands/doctor.js.map +1 -0
  31. package/dist/commands/fixup.d.ts +4 -0
  32. package/dist/commands/fixup.d.ts.map +1 -0
  33. package/dist/commands/fixup.js +100 -0
  34. package/dist/commands/fixup.js.map +1 -0
  35. package/dist/commands/init.d.ts.map +1 -1
  36. package/dist/commands/init.js +260 -22
  37. package/dist/commands/init.js.map +1 -1
  38. package/dist/commands/merge.d.ts +4 -0
  39. package/dist/commands/merge.d.ts.map +1 -0
  40. package/dist/commands/merge.js +84 -0
  41. package/dist/commands/merge.js.map +1 -0
  42. package/dist/commands/pr.d.ts +3 -1
  43. package/dist/commands/pr.d.ts.map +1 -1
  44. package/dist/commands/pr.js +49 -40
  45. package/dist/commands/pr.js.map +1 -1
  46. package/dist/commands/status.d.ts +2 -0
  47. package/dist/commands/status.d.ts.map +1 -0
  48. package/dist/commands/status.js +83 -0
  49. package/dist/commands/status.js.map +1 -0
  50. package/dist/commands/test-plan.d.ts +2 -0
  51. package/dist/commands/test-plan.d.ts.map +1 -0
  52. package/dist/commands/test-plan.js +92 -0
  53. package/dist/commands/test-plan.js.map +1 -0
  54. package/dist/commands/undo.d.ts +4 -0
  55. package/dist/commands/undo.d.ts.map +1 -0
  56. package/dist/commands/undo.js +46 -0
  57. package/dist/commands/undo.js.map +1 -0
  58. package/dist/config.d.ts +13 -0
  59. package/dist/config.d.ts.map +1 -1
  60. package/dist/config.js +100 -3
  61. package/dist/config.js.map +1 -1
  62. package/dist/git.d.ts +1 -0
  63. package/dist/git.d.ts.map +1 -1
  64. package/dist/git.js +5 -0
  65. package/dist/git.js.map +1 -1
  66. package/dist/index.js +145 -5
  67. package/dist/index.js.map +1 -1
  68. package/dist/monorepo.d.ts +13 -0
  69. package/dist/monorepo.d.ts.map +1 -0
  70. package/dist/monorepo.js +191 -0
  71. package/dist/monorepo.js.map +1 -0
  72. package/dist/test-plan.d.ts +5 -0
  73. package/dist/test-plan.d.ts.map +1 -0
  74. package/dist/test-plan.js +48 -0
  75. package/dist/test-plan.js.map +1 -0
  76. package/dist/update-notifier.d.ts +2 -0
  77. package/dist/update-notifier.d.ts.map +1 -0
  78. package/dist/update-notifier.js +96 -0
  79. package/dist/update-notifier.js.map +1 -0
  80. package/package.json +14 -3
package/dist/config.js CHANGED
@@ -1,5 +1,12 @@
1
1
  import { readFileSync, existsSync } from "fs";
2
2
  import { resolve } from "path";
3
+ import { createRequire } from "module";
4
+ import { yellow } from "./colors.js";
5
+ import { detectMonorepo, workspacesToScopes } from "./monorepo.js";
6
+ const DEFAULT_PR_TEMPLATE = {
7
+ sections: ["summary", "ticket", "type", "screenshots", "testPlan", "checklist"],
8
+ screenshotsTable: true,
9
+ };
3
10
  const DEFAULT_CONFIG = {
4
11
  scopes: [],
5
12
  branchTypes: ["feat", "fix", "chore", "refactor", "docs", "test", "release", "hotfix"],
@@ -20,24 +27,114 @@ const DEFAULT_CONFIG = {
20
27
  "Self-reviewed the changes",
21
28
  "No new warnings or errors introduced",
22
29
  ],
30
+ commitFormat: "{type}[{ticket}]{breaking}({scope}): {message}",
31
+ prTemplate: DEFAULT_PR_TEMPLATE,
23
32
  };
33
+ export function validateConfig(raw) {
34
+ const warnings = [];
35
+ const validFields = [
36
+ "extends", "ticketBaseUrl", "scopes", "branchTypes", "commitTypes",
37
+ "checklist", "commitFormat", "prTemplate", "prReviewers",
38
+ ];
39
+ for (const key of Object.keys(raw)) {
40
+ if (!validFields.includes(key)) {
41
+ warnings.push({ field: key, message: `Unknown field "${key}" will be ignored` });
42
+ }
43
+ }
44
+ if (raw.scopes && Array.isArray(raw.scopes)) {
45
+ for (let i = 0; i < raw.scopes.length; i++) {
46
+ const scope = raw.scopes[i];
47
+ if (!scope.value) {
48
+ warnings.push({ field: `scopes[${i}]`, message: "Scope is missing required field \"value\"" });
49
+ }
50
+ }
51
+ }
52
+ if (raw.commitFormat && typeof raw.commitFormat === "string") {
53
+ const format = raw.commitFormat;
54
+ if (!format.includes("{type}") || !format.includes("{message}")) {
55
+ warnings.push({ field: "commitFormat", message: "Format should include at least {type} and {message} placeholders" });
56
+ }
57
+ }
58
+ if (raw.commitTypes && Array.isArray(raw.commitTypes)) {
59
+ for (let i = 0; i < raw.commitTypes.length; i++) {
60
+ const ct = raw.commitTypes[i];
61
+ if (!ct.value || !ct.label) {
62
+ warnings.push({ field: `commitTypes[${i}]`, message: "Commit type is missing \"value\" or \"label\"" });
63
+ }
64
+ }
65
+ }
66
+ return warnings;
67
+ }
68
+ function resolveExtends(extendsPath, cwd) {
69
+ try {
70
+ // Try as npm package first
71
+ const require = createRequire(resolve(cwd, "package.json"));
72
+ const resolved = require.resolve(extendsPath);
73
+ return JSON.parse(readFileSync(resolved, "utf-8"));
74
+ }
75
+ catch {
76
+ // Try as relative path
77
+ const absPath = resolve(cwd, extendsPath);
78
+ if (existsSync(absPath)) {
79
+ return JSON.parse(readFileSync(absPath, "utf-8"));
80
+ }
81
+ }
82
+ console.error(yellow(`⚠ Could not resolve extends: "${extendsPath}"`));
83
+ return {};
84
+ }
85
+ function mergeConfigs(base, override) {
86
+ const result = { ...base };
87
+ for (const [key, value] of Object.entries(override)) {
88
+ if (key === "extends")
89
+ continue;
90
+ result[key] = value;
91
+ }
92
+ return result;
93
+ }
24
94
  export function loadConfig(cwd = process.cwd()) {
25
95
  const configPath = resolve(cwd, ".devflow.json");
26
96
  if (!existsSync(configPath)) {
97
+ // Even without config, detect monorepo workspaces as scopes
98
+ const mono = detectMonorepo(cwd);
99
+ if (mono) {
100
+ return { ...DEFAULT_CONFIG, scopes: workspacesToScopes(mono) };
101
+ }
27
102
  return DEFAULT_CONFIG;
28
103
  }
29
104
  try {
30
- const raw = JSON.parse(readFileSync(configPath, "utf-8"));
105
+ let raw = JSON.parse(readFileSync(configPath, "utf-8"));
106
+ // Handle extends
107
+ if (raw.extends) {
108
+ const base = resolveExtends(raw.extends, cwd);
109
+ raw = mergeConfigs(base, raw);
110
+ }
111
+ const warnings = validateConfig(raw);
112
+ if (warnings.length > 0) {
113
+ for (const w of warnings) {
114
+ console.error(yellow(`⚠ .devflow.json: ${w.message}`));
115
+ }
116
+ }
117
+ // Auto-discover scopes from monorepo workspaces if none configured
118
+ let scopes = raw.scopes ?? DEFAULT_CONFIG.scopes;
119
+ if ((!scopes || scopes.length === 0) && !raw.scopes) {
120
+ const mono = detectMonorepo(cwd);
121
+ if (mono) {
122
+ scopes = workspacesToScopes(mono);
123
+ }
124
+ }
31
125
  return {
32
126
  ticketBaseUrl: raw.ticketBaseUrl ?? DEFAULT_CONFIG.ticketBaseUrl,
33
- scopes: raw.scopes ?? DEFAULT_CONFIG.scopes,
127
+ scopes,
34
128
  branchTypes: raw.branchTypes ?? DEFAULT_CONFIG.branchTypes,
35
129
  commitTypes: raw.commitTypes ?? DEFAULT_CONFIG.commitTypes,
36
130
  checklist: raw.checklist ?? DEFAULT_CONFIG.checklist,
131
+ commitFormat: raw.commitFormat ?? DEFAULT_CONFIG.commitFormat,
132
+ prTemplate: raw.prTemplate ?? DEFAULT_CONFIG.prTemplate,
133
+ prReviewers: raw.prReviewers,
37
134
  };
38
135
  }
39
136
  catch {
40
- console.error("Warning: Failed to parse .devflow.json, using defaults.");
137
+ console.error(yellow(" Failed to parse .devflow.json, using defaults."));
41
138
  return DEFAULT_CONFIG;
42
139
  }
43
140
  }
@@ -1 +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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
package/dist/git.d.ts CHANGED
@@ -14,4 +14,5 @@ export declare function getCommits(base: string): string[];
14
14
  export declare function getScopesFromCommits(commits: string[]): string[];
15
15
  export declare function getDefaultBase(currentBranch: string): string;
16
16
  export declare function checkGhInstalled(): void;
17
+ export declare function isProtectedBranch(branch?: string): boolean;
17
18
  //# sourceMappingURL=git.d.ts.map
package/dist/git.d.ts.map CHANGED
@@ -1 +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"}
1
+ {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"AAIA,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;AAED,wBAAgB,iBAAiB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAG1D"}
package/dist/git.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { execSync } from "child_process";
2
+ const PROTECTED_BRANCHES = ["main", "master", "develop", "production"];
2
3
  export function getBranch() {
3
4
  return execSync("git branch --show-current", { encoding: "utf-8" }).trim();
4
5
  }
@@ -101,4 +102,8 @@ export function checkGhInstalled() {
101
102
  process.exit(1);
102
103
  }
103
104
  }
105
+ export function isProtectedBranch(branch) {
106
+ const current = branch || getBranch();
107
+ return PROTECTED_BRANCHES.includes(current);
108
+ }
104
109
  //# sourceMappingURL=git.js.map
package/dist/git.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"git.js","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -4,26 +4,166 @@ import { branchCommand } from "./commands/branch.js";
4
4
  import { commitCommand } from "./commands/commit.js";
5
5
  import { prCommand } from "./commands/pr.js";
6
6
  import { initCommand } from "./commands/init.js";
7
+ import { statusCommand } from "./commands/status.js";
8
+ import { amendCommand } from "./commands/amend.js";
9
+ import { cleanupCommand } from "./commands/cleanup.js";
10
+ import { changelogCommand } from "./commands/changelog.js";
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();
7
19
  const program = new Command();
8
20
  program
9
21
  .name("devflow")
10
22
  .description("Interactive CLI for branch creation, conventional commits, and PR management")
11
- .version("0.1.0");
23
+ .version("0.3.0");
24
+ // --- Core commands ---
12
25
  program
13
26
  .command("branch")
27
+ .alias("b")
14
28
  .description("Create a new branch with type/ticket/description format")
15
- .action(branchCommand);
29
+ .option("--dry-run", "Preview without executing git commands")
30
+ .action((opts) => branchCommand(opts));
16
31
  program
17
32
  .command("commit")
33
+ .alias("c")
18
34
  .description("Create a conventional commit with guided prompts")
19
- .action(commitCommand);
35
+ .option("--dry-run", "Preview without executing git commands")
36
+ .action((opts) => commitCommand(opts));
20
37
  program
21
38
  .command("pr")
39
+ .alias("p")
22
40
  .description("Create or update a pull request with auto-filled template")
23
- .action(prCommand);
41
+ .option("--dry-run", "Preview without executing git commands")
42
+ .action((opts) => prCommand(opts));
43
+ program
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 ---
68
+ program
69
+ .command("status")
70
+ .alias("s")
71
+ .description("Show current branch, ticket, commits, and PR info")
72
+ .action(statusCommand);
73
+ program
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));
83
+ program
84
+ .command("cleanup")
85
+ .description("Delete local branches that have been merged or whose remote is gone")
86
+ .option("--dry-run", "Preview without deleting branches")
87
+ .action((opts) => cleanupCommand(opts));
88
+ // --- Setup commands ---
24
89
  program
25
90
  .command("init")
26
- .description("Initialize a .devflow.json config file in the current project")
91
+ .description("Initialize a .devflow.json config and project setup")
27
92
  .action(initCommand);
93
+ program
94
+ .command("doctor")
95
+ .description("Check that all devflow dependencies are properly configured")
96
+ .action(doctorCommand);
97
+ program
98
+ .command("completions")
99
+ .description("Output shell completion script")
100
+ .option("--shell <shell>", "Shell type (bash or zsh)", "zsh")
101
+ .action((opts) => {
102
+ if (opts.shell === "bash") {
103
+ console.log(generateBashCompletions());
104
+ }
105
+ else {
106
+ console.log(generateZshCompletions());
107
+ }
108
+ });
28
109
  program.parse();
110
+ function generateBashCompletions() {
111
+ return `# devflow bash completions
112
+ # Add to ~/.bashrc: eval "$(devflow completions --shell bash)"
113
+ _devflow_completions() {
114
+ local cur="\${COMP_WORDS[COMP_CWORD]}"
115
+ local commands="branch commit pr amend undo fixup merge status test-plan changelog cleanup init doctor completions"
116
+
117
+ if [ "\${COMP_CWORD}" -eq 1 ]; then
118
+ COMPREPLY=($(compgen -W "\${commands}" -- "\${cur}"))
119
+ elif [ "\${COMP_CWORD}" -eq 2 ]; then
120
+ COMPREPLY=($(compgen -W "--dry-run --help" -- "\${cur}"))
121
+ fi
122
+ }
123
+ complete -F _devflow_completions devflow`;
124
+ }
125
+ function generateZshCompletions() {
126
+ return `# devflow zsh completions
127
+ # Add to ~/.zshrc: eval "$(devflow completions --shell zsh)"
128
+ _devflow() {
129
+ local -a commands
130
+ commands=(
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'
141
+ 'cleanup:Delete merged local branches'
142
+ 'init:Initialize devflow config'
143
+ 'doctor:Check devflow dependencies'
144
+ 'completions:Output shell completion script'
145
+ )
146
+
147
+ _arguments -C \\
148
+ '1: :->command' \\
149
+ '*::arg:->args'
150
+
151
+ case "\$state" in
152
+ command)
153
+ _describe 'command' commands
154
+ ;;
155
+ args)
156
+ case "\${words[1]}" in
157
+ branch|commit|pr|amend|undo|fixup|merge|cleanup|changelog)
158
+ _arguments '--dry-run[Preview without executing]'
159
+ ;;
160
+ completions)
161
+ _arguments '--shell[Shell type]:shell:(bash zsh)'
162
+ ;;
163
+ esac
164
+ ;;
165
+ esac
166
+ }
167
+ compdef _devflow devflow`;
168
+ }
29
169
  //# sourceMappingURL=index.js.map
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;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"}
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"}