@simplysf/simply-project 1.2.30 → 1.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/README.md CHANGED
@@ -20,8 +20,85 @@ This package is part of the [`@simplysf/simply`](https://github.com/SimplySF/sim
20
20
 
21
21
  <!-- commands -->
22
22
 
23
+ - [`sf simply project release roll-forward`](#sf-simply-project-release-roll-forward)
23
24
  - [`sf simply project update api-version`](#sf-simply-project-update-api-version)
24
25
 
26
+ ## `sf simply project release roll-forward`
27
+
28
+ Merge each release branch into the next higher one, keeping version tags in the target's history.
29
+
30
+ ```
31
+ USAGE
32
+ $ sf simply project release roll-forward [--json] [--flags-dir <value>] [--source <value>] [--target <value>]
33
+ [--package-release-branch-prefix <value>] [--remote <value>] [--message <value>] [--dry-run] [--no-push]
34
+ [--no-prompt]
35
+
36
+ FLAGS
37
+ --dry-run Print the planned merges and the tags each would bring in, without changing
38
+ anything.
39
+ --message=<value> Commit message template, with optional {SOURCE} and {TARGET} placeholders.
40
+ Defaults to "Merge branch '{SOURCE}' into {TARGET}".
41
+ --no-prompt Don't ask for confirmation before pushing.
42
+ --no-push Stop after the first merge, leaving it on the roll-forward branch for a merge
43
+ request. Merge that request with a merge commit, because a squash or rebase
44
+ loses the tag history.
45
+ --package-release-branch-prefix=<value> [default: release/] Prefix identifying release branches. Branch names must
46
+ then be `[v]MAJOR.MINOR[.PATCH]`; other branches are ignored.
47
+ --remote=<value> [default: origin] Remote holding the release branches.
48
+ --source=<value> Oldest release branch to roll from. Defaults to the lowest branch with work
49
+ to roll.
50
+ --target=<value> Newest release branch to roll into. Defaults to the highest release branch.
51
+
52
+ GLOBAL FLAGS
53
+ --flags-dir=<value> Import flag values from a directory.
54
+ --json Format output as json.
55
+
56
+ DESCRIPTION
57
+ Merge each release branch into the next higher one, keeping version tags in the target's history.
58
+
59
+ Run this from a local clone. Release branches are read from the remote and sorted numerically, and each is merged into
60
+ the next higher one with a real merge commit, so a tag like `v1.1.0.13` stays reachable from `release/v1.2.0` and `git
61
+ tag --merged` shows when that version arrived. With no flags, the whole chain is rolled, starting from the lowest
62
+ branch with work to roll.
63
+
64
+ The target keeps its own `versionNumber`, `versionName`, `ancestorVersion`, and `ancestorId` in `sfdx-project.json`,
65
+ and `packageAliases` becomes the union of both sides. Any other conflict stops the command with the merge in progress
66
+ on a `roll-forward/<source>-to-<target>` branch. Resolve it and run `git commit`, then run this command again, or run
67
+ `git merge --abort` to give up on it. Later branches are left alone until then.
68
+
69
+ Your repository's commit hooks always run. The default commit message is git's own merge wording, which commitlint's
70
+ default rules ignore; use `--message` if your rules need something else, such as a ticket number. If a hook rejects
71
+ the commit, the merge stays in progress: run `git commit` with an accepted message, then run this command again.
72
+
73
+ The command never force-pushes or pushes tags. Each branch it pushes triggers a normal release-branch build, which can
74
+ create a package version. If a push is rejected because the target moved, run the command again.
75
+
76
+ A release that was abandoned without being merged looks like work to roll, so delete or rename its branch first.
77
+
78
+ EXAMPLES
79
+ Roll every release branch forward:
80
+
81
+ $ sf simply project release roll-forward
82
+
83
+ See what would be rolled, without changing anything:
84
+
85
+ $ sf simply project release roll-forward --dry-run
86
+
87
+ Roll a single release into the next one:
88
+
89
+ $ sf simply project release roll-forward --source release/v1.1.0 --target release/v1.2.0
90
+
91
+ Use a commit message your repository's rules accept:
92
+
93
+ $ sf simply project release roll-forward --message "chore: PROJ-123 roll {SOURCE} into {TARGET}"
94
+
95
+ Prepare the merge for a merge request instead of pushing it:
96
+
97
+ $ sf simply project release roll-forward --no-push
98
+ ```
99
+
100
+ _See code: [lib/commands/simply/project/release/roll-forward.js](https://github.com/SimplySF/simply-plugins/blob/@simplysf/simply-project@1.3.0/packages/simply-project/lib/commands/simply/project/release/roll-forward.js)_
101
+
25
102
  ## `sf simply project update api-version`
26
103
 
27
104
  Update the Salesforce API version across a project's metadata.
@@ -59,7 +136,7 @@ FLAG DESCRIPTIONS
59
136
  The path to the Salesforce project directory to scan for metadata files.
60
137
  ```
61
138
 
62
- _See code: [lib/commands/simply/project/update/api-version.js](https://github.com/SimplySF/simply-plugins/blob/@simplysf/simply-project@1.2.30/packages/simply-project/lib/commands/simply/project/update/api-version.js)_
139
+ _See code: [lib/commands/simply/project/update/api-version.js](https://github.com/SimplySF/simply-plugins/blob/@simplysf/simply-project@1.3.0/packages/simply-project/lib/commands/simply/project/update/api-version.js)_
63
140
  <!-- commandsstop -->
64
141
 
65
142
  ## License
@@ -0,0 +1,23 @@
1
+ import { SfCommand } from '@salesforce/sf-plugins-core';
2
+ import { type RollForwardResult } from '@simplysf/simply-project-core';
3
+ export type ProjectReleaseRollForwardResult = RollForwardResult;
4
+ /** Merges each release branch into the next higher one, keeping version tags in the target's history. */
5
+ export default class ProjectReleaseRollForward extends SfCommand<ProjectReleaseRollForwardResult> {
6
+ static readonly summary: string;
7
+ static readonly description: string;
8
+ static readonly examples: string[];
9
+ static readonly enableJsonFlag = true;
10
+ static readonly flags: {
11
+ source: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
+ target: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
13
+ 'package-release-branch-prefix': import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
14
+ remote: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
15
+ message: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
16
+ 'dry-run': import("@oclif/core/interfaces").BooleanFlag<boolean>;
17
+ 'no-push': import("@oclif/core/interfaces").BooleanFlag<boolean>;
18
+ 'no-prompt': import("@oclif/core/interfaces").BooleanFlag<boolean>;
19
+ 'flags-dir': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
20
+ };
21
+ run(): Promise<ProjectReleaseRollForwardResult>;
22
+ private confirmPush;
23
+ }
@@ -0,0 +1,74 @@
1
+ /*
2
+ * Copyright (c) 2026, SimplySF.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ import { Messages } from '@salesforce/core';
17
+ import { Flags, SfCommand } from '@salesforce/sf-plugins-core';
18
+ import { rollForward } from '@simplysf/simply-project-core';
19
+ Messages.importMessagesDirectoryFromMetaUrl(import.meta.url);
20
+ const messages = Messages.loadMessages('@simplysf/simply-project', 'simply.project.release.roll-forward');
21
+ /** Merges each release branch into the next higher one, keeping version tags in the target's history. */
22
+ export default class ProjectReleaseRollForward extends SfCommand {
23
+ static summary = messages.getMessage('summary');
24
+ static description = messages.getMessage('description');
25
+ static examples = messages.getMessages('examples');
26
+ static enableJsonFlag = true;
27
+ static flags = {
28
+ ...SfCommand.baseFlags,
29
+ source: Flags.string({ summary: messages.getMessage('flags.source.summary') }),
30
+ target: Flags.string({ summary: messages.getMessage('flags.target.summary') }),
31
+ 'package-release-branch-prefix': Flags.string({
32
+ summary: messages.getMessage('flags.package-release-branch-prefix.summary'),
33
+ default: 'release/',
34
+ }),
35
+ remote: Flags.string({ summary: messages.getMessage('flags.remote.summary'), default: 'origin' }),
36
+ message: Flags.string({ summary: messages.getMessage('flags.message.summary') }),
37
+ 'dry-run': Flags.boolean({ summary: messages.getMessage('flags.dry-run.summary'), default: false }),
38
+ 'no-push': Flags.boolean({ summary: messages.getMessage('flags.no-push.summary'), default: false }),
39
+ 'no-prompt': Flags.boolean({ summary: messages.getMessage('flags.no-prompt.summary'), default: false }),
40
+ };
41
+ async run() {
42
+ const { flags } = await this.parse(ProjectReleaseRollForward);
43
+ const prompt = !flags['no-prompt'] && !flags['no-push'] && !this.jsonEnabled();
44
+ const result = await rollForward({
45
+ source: flags.source,
46
+ target: flags.target,
47
+ packageReleaseBranchPrefix: flags['package-release-branch-prefix'],
48
+ remote: flags.remote,
49
+ message: flags.message,
50
+ dryRun: flags['dry-run'],
51
+ noPush: flags['no-push'],
52
+ confirm: prompt ? (hops) => this.confirmPush(hops) : undefined,
53
+ });
54
+ this.table({
55
+ title: messages.getMessage('tableTitle'),
56
+ data: result.hops.map((hop) => ({
57
+ source: hop.source,
58
+ target: hop.target,
59
+ status: hop.status,
60
+ mergeCommit: hop.mergeCommit ?? '',
61
+ tags: hop.tags.join(', '),
62
+ })),
63
+ });
64
+ if (result.hops.some((hop) => hop.status === 'Conflict' || hop.status === 'Commit rejected')) {
65
+ process.exitCode = 1;
66
+ }
67
+ return result;
68
+ }
69
+ async confirmPush(hops) {
70
+ const route = hops.map((hop) => `${hop.source} -> ${hop.target}`).join('\n');
71
+ return this.confirm({ message: messages.getMessage('confirm', [route, hops.length]) });
72
+ }
73
+ }
74
+ //# sourceMappingURL=roll-forward.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roll-forward.js","sourceRoot":"","sources":["../../../../../src/commands/simply/project/release/roll-forward.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ # summary
2
+
3
+ Merge each release branch into the next higher one, keeping version tags in the target's history.
4
+
5
+ # description
6
+
7
+ Run this from a local clone. Release branches are read from the remote and sorted numerically, and each is merged into the next higher one with a real merge commit, so a tag like `v1.1.0.13` stays reachable from `release/v1.2.0` and `git tag --merged` shows when that version arrived. With no flags, the whole chain is rolled, starting from the lowest branch with work to roll.
8
+
9
+ The target keeps its own `versionNumber`, `versionName`, `ancestorVersion`, and `ancestorId` in `sfdx-project.json`, and `packageAliases` becomes the union of both sides. Any other conflict stops the command with the merge in progress on a `roll-forward/<source>-to-<target>` branch. Resolve it and run `git commit`, then run this command again, or run `git merge --abort` to give up on it. Later branches are left alone until then.
10
+
11
+ Your repository's commit hooks always run. The default commit message is git's own merge wording, which commitlint's default rules ignore; use `--message` if your rules need something else, such as a ticket number. If a hook rejects the commit, the merge stays in progress: run `git commit` with an accepted message, then run this command again.
12
+
13
+ The command never force-pushes or pushes tags. Each branch it pushes triggers a normal release-branch build, which can create a package version. If a push is rejected because the target moved, run the command again.
14
+
15
+ A release that was abandoned without being merged looks like work to roll, so delete or rename its branch first.
16
+
17
+ # flags.source.summary
18
+
19
+ Oldest release branch to roll from. Defaults to the lowest branch with work to roll.
20
+
21
+ # flags.target.summary
22
+
23
+ Newest release branch to roll into. Defaults to the highest release branch.
24
+
25
+ # flags.package-release-branch-prefix.summary
26
+
27
+ Prefix identifying release branches. Branch names must then be `[v]MAJOR.MINOR[.PATCH]`; other branches are ignored.
28
+
29
+ # flags.remote.summary
30
+
31
+ Remote holding the release branches.
32
+
33
+ # flags.message.summary
34
+
35
+ Commit message template, with optional {SOURCE} and {TARGET} placeholders. Defaults to "Merge branch '{SOURCE}' into {TARGET}".
36
+
37
+ # flags.dry-run.summary
38
+
39
+ Print the planned merges and the tags each would bring in, without changing anything.
40
+
41
+ # flags.no-push.summary
42
+
43
+ Stop after the first merge, leaving it on the roll-forward branch for a merge request. Merge that request with a merge commit, because a squash or rebase loses the tag history.
44
+
45
+ # flags.no-prompt.summary
46
+
47
+ Don't ask for confirmation before pushing.
48
+
49
+ # confirm
50
+
51
+ This rolls:
52
+ %s
53
+
54
+ Up to %s release branches will be pushed, and each push can create a package version. Continue?
55
+
56
+ # tableTitle
57
+
58
+ Release roll-forward
59
+
60
+ # examples
61
+
62
+ - Roll every release branch forward:
63
+
64
+ <%= config.bin %> <%= command.id %>
65
+
66
+ - See what would be rolled, without changing anything:
67
+
68
+ <%= config.bin %> <%= command.id %> --dry-run
69
+
70
+ - Roll a single release into the next one:
71
+
72
+ <%= config.bin %> <%= command.id %> --source release/v1.1.0 --target release/v1.2.0
73
+
74
+ - Use a commit message your repository's rules accept:
75
+
76
+ <%= config.bin %> <%= command.id %> --message "chore: PROJ-123 roll {SOURCE} into {TARGET}"
77
+
78
+ - Prepare the merge for a merge request instead of pushing it:
79
+
80
+ <%= config.bin %> <%= command.id %> --no-push
@@ -1,5 +1,134 @@
1
1
  {
2
2
  "commands": {
3
+ "simply:project:release:roll-forward": {
4
+ "aliases": [],
5
+ "args": {},
6
+ "description": "Run this from a local clone. Release branches are read from the remote and sorted numerically, and each is merged into the next higher one with a real merge commit, so a tag like `v1.1.0.13` stays reachable from `release/v1.2.0` and `git tag --merged` shows when that version arrived. With no flags, the whole chain is rolled, starting from the lowest branch with work to roll.\n\nThe target keeps its own `versionNumber`, `versionName`, `ancestorVersion`, and `ancestorId` in `sfdx-project.json`, and `packageAliases` becomes the union of both sides. Any other conflict stops the command with the merge in progress on a `roll-forward/<source>-to-<target>` branch. Resolve it and run `git commit`, then run this command again, or run `git merge --abort` to give up on it. Later branches are left alone until then.\n\nYour repository's commit hooks always run. The default commit message is git's own merge wording, which commitlint's default rules ignore; use `--message` if your rules need something else, such as a ticket number. If a hook rejects the commit, the merge stays in progress: run `git commit` with an accepted message, then run this command again.\n\nThe command never force-pushes or pushes tags. Each branch it pushes triggers a normal release-branch build, which can create a package version. If a push is rejected because the target moved, run the command again.\n\nA release that was abandoned without being merged looks like work to roll, so delete or rename its branch first.",
7
+ "examples": [
8
+ "Roll every release branch forward:\n<%= config.bin %> <%= command.id %>",
9
+ "See what would be rolled, without changing anything:\n<%= config.bin %> <%= command.id %> --dry-run",
10
+ "Roll a single release into the next one:\n<%= config.bin %> <%= command.id %> --source release/v1.1.0 --target release/v1.2.0",
11
+ "Use a commit message your repository's rules accept:\n<%= config.bin %> <%= command.id %> --message \"chore: PROJ-123 roll {SOURCE} into {TARGET}\"",
12
+ "Prepare the merge for a merge request instead of pushing it:\n<%= config.bin %> <%= command.id %> --no-push"
13
+ ],
14
+ "flags": {
15
+ "json": {
16
+ "description": "Format output as json.",
17
+ "helpGroup": "GLOBAL",
18
+ "name": "json",
19
+ "allowNo": false,
20
+ "type": "boolean"
21
+ },
22
+ "flags-dir": {
23
+ "helpGroup": "GLOBAL",
24
+ "name": "flags-dir",
25
+ "summary": "Import flag values from a directory.",
26
+ "hasDynamicHelp": false,
27
+ "multiple": false,
28
+ "type": "option"
29
+ },
30
+ "source": {
31
+ "name": "source",
32
+ "summary": "Oldest release branch to roll from. Defaults to the lowest branch with work to roll.",
33
+ "hasDynamicHelp": false,
34
+ "multiple": false,
35
+ "type": "option"
36
+ },
37
+ "target": {
38
+ "name": "target",
39
+ "summary": "Newest release branch to roll into. Defaults to the highest release branch.",
40
+ "hasDynamicHelp": false,
41
+ "multiple": false,
42
+ "type": "option"
43
+ },
44
+ "package-release-branch-prefix": {
45
+ "name": "package-release-branch-prefix",
46
+ "summary": "Prefix identifying release branches. Branch names must then be `[v]MAJOR.MINOR[.PATCH]`; other branches are ignored.",
47
+ "default": "release/",
48
+ "hasDynamicHelp": false,
49
+ "multiple": false,
50
+ "type": "option"
51
+ },
52
+ "remote": {
53
+ "name": "remote",
54
+ "summary": "Remote holding the release branches.",
55
+ "default": "origin",
56
+ "hasDynamicHelp": false,
57
+ "multiple": false,
58
+ "type": "option"
59
+ },
60
+ "message": {
61
+ "name": "message",
62
+ "summary": "Commit message template, with optional {SOURCE} and {TARGET} placeholders. Defaults to \"Merge branch '{SOURCE}' into {TARGET}\".",
63
+ "hasDynamicHelp": false,
64
+ "multiple": false,
65
+ "type": "option"
66
+ },
67
+ "dry-run": {
68
+ "name": "dry-run",
69
+ "summary": "Print the planned merges and the tags each would bring in, without changing anything.",
70
+ "allowNo": false,
71
+ "type": "boolean"
72
+ },
73
+ "no-push": {
74
+ "name": "no-push",
75
+ "summary": "Stop after the first merge, leaving it on the roll-forward branch for a merge request. Merge that request with a merge commit, because a squash or rebase loses the tag history.",
76
+ "allowNo": false,
77
+ "type": "boolean"
78
+ },
79
+ "no-prompt": {
80
+ "name": "no-prompt",
81
+ "summary": "Don't ask for confirmation before pushing.",
82
+ "allowNo": false,
83
+ "type": "boolean"
84
+ }
85
+ },
86
+ "hasDynamicHelp": false,
87
+ "hiddenAliases": [],
88
+ "id": "simply:project:release:roll-forward",
89
+ "pluginAlias": "@simplysf/simply-project",
90
+ "pluginName": "@simplysf/simply-project",
91
+ "pluginType": "core",
92
+ "strict": true,
93
+ "summary": "Merge each release branch into the next higher one, keeping version tags in the target's history.",
94
+ "enableJsonFlag": true,
95
+ "isESM": true,
96
+ "relativePath": [
97
+ "lib",
98
+ "commands",
99
+ "simply",
100
+ "project",
101
+ "release",
102
+ "roll-forward.js"
103
+ ],
104
+ "aliasPermutations": [],
105
+ "permutations": [
106
+ "simply:project:release:roll-forward",
107
+ "project:simply:release:roll-forward",
108
+ "project:release:simply:roll-forward",
109
+ "project:release:roll-forward:simply",
110
+ "simply:release:project:roll-forward",
111
+ "release:simply:project:roll-forward",
112
+ "release:project:simply:roll-forward",
113
+ "release:project:roll-forward:simply",
114
+ "simply:release:roll-forward:project",
115
+ "release:simply:roll-forward:project",
116
+ "release:roll-forward:simply:project",
117
+ "release:roll-forward:project:simply",
118
+ "simply:project:roll-forward:release",
119
+ "project:simply:roll-forward:release",
120
+ "project:roll-forward:simply:release",
121
+ "project:roll-forward:release:simply",
122
+ "simply:roll-forward:project:release",
123
+ "roll-forward:simply:project:release",
124
+ "roll-forward:project:simply:release",
125
+ "roll-forward:project:release:simply",
126
+ "simply:roll-forward:release:project",
127
+ "roll-forward:simply:release:project",
128
+ "roll-forward:release:simply:project",
129
+ "roll-forward:release:project:simply"
130
+ ]
131
+ },
3
132
  "simply:project:update:api-version": {
4
133
  "aliases": [],
5
134
  "args": {},
@@ -92,5 +221,5 @@
92
221
  ]
93
222
  }
94
223
  },
95
- "version": "1.2.30"
224
+ "version": "1.3.0"
96
225
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@simplysf/simply-project",
3
3
  "description": "Utilities for working with Salesforce projects",
4
- "version": "1.2.30",
4
+ "version": "1.3.0",
5
5
  "author": "@ClayChipps",
6
6
  "homepage": "https://github.com/SimplySF/simply-plugins",
7
7
  "bugs": "https://github.com/SimplySF/simply-plugins/issues",
@@ -50,6 +50,9 @@
50
50
  "project": {
51
51
  "description": "Commands for working with Salesforce projects",
52
52
  "subtopics": {
53
+ "release": {
54
+ "description": "Commands for maintaining release branches"
55
+ },
53
56
  "update": {
54
57
  "description": "Commands for updating Salesforce project settings"
55
58
  }
@@ -65,6 +68,7 @@
65
68
  "@salesforce/core": "^8.30.0",
66
69
  "@salesforce/kit": "^3.2.6",
67
70
  "@salesforce/sf-plugins-core": "^12.2.16",
71
+ "@simplysf/simply-project-core": "^0.2.0",
68
72
  "glob": "^13.0.6"
69
73
  },
70
74
  "devDependencies": {
@@ -203,5 +207,5 @@
203
207
  "output": []
204
208
  }
205
209
  },
206
- "gitHead": "f5bb418eb45ca8bdc40ecbfc3ce9cd12dc61c433"
210
+ "gitHead": "4c645e4f581dc9dda52593f4d42556675897953d"
207
211
  }