automata-cli 0.2.0-develop.40 → 0.2.0-develop.47

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 (2) hide show
  1. package/dist/index.js +136 -1
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -471,6 +471,62 @@ function getPrComments(branch) {
471
471
  }
472
472
  return getPrCommentsGh(branch);
473
473
  }
474
+ var SEMVER_RE = /^v?(\d+)\.(\d+)\.(\d+)$/;
475
+ function getLatestTagOnMaster() {
476
+ const { stdout, status } = run2("git", [
477
+ "describe",
478
+ "--tags",
479
+ "--abbrev=0",
480
+ "--match",
481
+ "[0-9]*.[0-9]*.[0-9]*",
482
+ "--match",
483
+ "v[0-9]*.[0-9]*.[0-9]*",
484
+ "master"
485
+ ]);
486
+ if (status !== 0) return null;
487
+ const tag = stdout.trim();
488
+ const m = SEMVER_RE.exec(tag);
489
+ if (!m) return null;
490
+ return `${m[1]}.${m[2]}.${m[3]}`;
491
+ }
492
+ function bumpMinorVersion(version2) {
493
+ const m = SEMVER_RE.exec(version2);
494
+ if (!m) throw new Error(`Invalid semver: ${version2}`);
495
+ return `${m[1]}.${String(Number(m[2]) + 1)}.0`;
496
+ }
497
+ function tagExists(version2) {
498
+ const { stdout, status, stderr } = run2("git", ["tag", "-l", version2]);
499
+ if (status !== 0) {
500
+ throw new Error(`Command failed: git tag -l ${version2}
501
+ ${stderr.trim()}`);
502
+ }
503
+ return stdout.trim().length > 0;
504
+ }
505
+ function publishRelease(version2, dryRun) {
506
+ const releaseBranch = `release/${version2}`;
507
+ const steps = [
508
+ { args: ["checkout", "-b", releaseBranch], desc: `git checkout -b ${releaseBranch}` },
509
+ { args: ["checkout", "master"], desc: `git checkout master` },
510
+ { args: ["merge", "--no-ff", releaseBranch], desc: `git merge --no-ff ${releaseBranch}` },
511
+ { args: ["tag", version2], desc: `git tag ${version2}` },
512
+ { args: ["checkout", "develop"], desc: `git checkout develop` },
513
+ { args: ["merge", "--no-ff", releaseBranch], desc: `git merge --no-ff ${releaseBranch}` },
514
+ { args: ["branch", "-d", releaseBranch], desc: `git branch -d ${releaseBranch}` },
515
+ { args: ["push", "origin", "develop", "master", version2], desc: `git push origin develop master ${version2}` }
516
+ ];
517
+ for (const step of steps) {
518
+ if (dryRun) {
519
+ process.stdout.write(`[dry-run] ${step.desc}
520
+ `);
521
+ continue;
522
+ }
523
+ const { status, stderr } = run2("git", step.args);
524
+ if (status !== 0) {
525
+ throw new Error(`Command failed: ${step.desc}
526
+ ${stderr.trim()}`);
527
+ }
528
+ }
529
+ }
474
530
 
475
531
  // src/commands/git.ts
476
532
  var FAIL_CONCLUSIONS = /* @__PURE__ */ new Set(["FAILURE", "TIMED_OUT", "ACTION_REQUIRED", "CANCELLED"]);
@@ -737,7 +793,86 @@ var finishFeatureCmd = new Command2("finish-feature").description("Clean up a me
737
793
  process.exit(1);
738
794
  }
739
795
  });
740
- var gitCommand = new Command2("git").description("Git workflow commands (requires gh CLI)").addCommand(getPrInfoCmd).addCommand(getPrCommentsCmd).addCommand(finishFeatureCmd);
796
+ var SEMVER_ARG_RE = /^\d+\.\d+\.\d+$/;
797
+ var publishReleaseCmd = new Command2("publish-release").description("Execute the full GitFlow release sequence and push to origin").argument("[version]", "Release version in X.Y.Z format (auto-detected from master tag if omitted)").option("--dry-run", "Print git commands without executing them").addHelpText(
798
+ "after",
799
+ `
800
+ Release sequence:
801
+ 1. git checkout -b release/<version>
802
+ 2. git checkout master && git merge --no-ff release/<version>
803
+ 3. git tag <version>
804
+ 4. git checkout develop && git merge --no-ff release/<version>
805
+ 5. git branch -d release/<version>
806
+ 6. git push origin develop master <version>
807
+
808
+ When [version] is omitted the latest semver tag on master is detected and the
809
+ minor segment is incremented (e.g. 1.2.0 \u2192 1.3.0).`
810
+ ).action((version2, options) => {
811
+ const dryRun = options.dryRun ?? false;
812
+ let branch;
813
+ try {
814
+ branch = getCurrentBranch();
815
+ } catch (err) {
816
+ process.stderr.write(`Error: ${err.message}
817
+ `);
818
+ process.exit(1);
819
+ }
820
+ if (branch !== "develop") {
821
+ process.stderr.write(
822
+ `Error: publish-release must be run from the 'develop' branch (currently on '${branch}').
823
+ `
824
+ );
825
+ process.exit(1);
826
+ }
827
+ if (hasUncommittedChanges()) {
828
+ process.stderr.write("Error: You have uncommitted changes. Commit or stash them before publishing a release.\n");
829
+ process.exit(1);
830
+ }
831
+ let resolvedVersion;
832
+ if (version2 !== void 0) {
833
+ if (!SEMVER_ARG_RE.test(version2)) {
834
+ process.stderr.write(`Error: Version '${version2}' is not valid semver. Use X.Y.Z format (e.g. 1.2.0).
835
+ `);
836
+ process.exit(1);
837
+ }
838
+ resolvedVersion = version2;
839
+ } else {
840
+ const latest = getLatestTagOnMaster();
841
+ if (latest === null) {
842
+ process.stderr.write(
843
+ "Error: No semver tag found on master. Pass a version explicitly: automata git publish-release <X.Y.Z>\n"
844
+ );
845
+ process.exit(1);
846
+ }
847
+ resolvedVersion = bumpMinorVersion(latest);
848
+ process.stdout.write(`Auto-detected version: ${latest} \u2192 ${resolvedVersion}
849
+ `);
850
+ }
851
+ if (tagExists(resolvedVersion)) {
852
+ process.stderr.write(`Error: Tag '${resolvedVersion}' already exists.
853
+ `);
854
+ process.exit(1);
855
+ }
856
+ if (dryRun) {
857
+ process.stdout.write(`Dry-run: release ${resolvedVersion}
858
+ `);
859
+ } else {
860
+ process.stdout.write(`Publishing release ${resolvedVersion}...
861
+ `);
862
+ }
863
+ try {
864
+ publishRelease(resolvedVersion, dryRun);
865
+ } catch (err) {
866
+ process.stderr.write(`Error: ${err.message}
867
+ `);
868
+ process.exit(1);
869
+ }
870
+ if (!dryRun) {
871
+ process.stdout.write(`Release ${resolvedVersion} published successfully.
872
+ `);
873
+ }
874
+ });
875
+ var gitCommand = new Command2("git").description("Git workflow commands (some require gh CLI)").addCommand(getPrInfoCmd).addCommand(getPrCommentsCmd).addCommand(finishFeatureCmd).addCommand(publishReleaseCmd);
741
876
 
742
877
  // src/commands/getReady.ts
743
878
  import { Command as Command3 } from "commander";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "automata-cli",
3
- "version": "0.2.0-develop.40",
3
+ "version": "0.2.0-develop.47",
4
4
  "description": "Automata CLI tool",
5
5
  "type": "module",
6
6
  "bin": {