@simplysf/simply-project 1.2.30 → 1.3.1
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 +78 -1
- package/lib/commands/simply/project/release/roll-forward.d.ts +23 -0
- package/lib/commands/simply/project/release/roll-forward.js +74 -0
- package/lib/commands/simply/project/release/roll-forward.js.map +1 -0
- package/messages/simply.project.release.roll-forward.md +80 -0
- package/oclif.manifest.json +130 -1
- package/package.json +7 -3
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.1/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.
|
|
139
|
+
_See code: [lib/commands/simply/project/update/api-version.js](https://github.com/SimplySF/simply-plugins/blob/@simplysf/simply-project@1.3.1/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
|
package/oclif.manifest.json
CHANGED
|
@@ -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.
|
|
224
|
+
"version": "1.3.1"
|
|
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.
|
|
4
|
+
"version": "1.3.1",
|
|
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,13 +68,14 @@
|
|
|
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": {
|
|
71
75
|
"@oclif/plugin-command-snapshot": "^5.4.0",
|
|
72
76
|
"@salesforce/plugin-command-reference": "^3.1.134",
|
|
73
77
|
"@vitest/coverage-v8": "^4.1.12",
|
|
74
|
-
"vitest": "^4.1.
|
|
78
|
+
"vitest": "^4.1.12"
|
|
75
79
|
},
|
|
76
80
|
"publishConfig": {
|
|
77
81
|
"access": "public"
|
|
@@ -203,5 +207,5 @@
|
|
|
203
207
|
"output": []
|
|
204
208
|
}
|
|
205
209
|
},
|
|
206
|
-
"gitHead": "
|
|
210
|
+
"gitHead": "37a20f64434ed8a208f43503c6bbc6e68d25ca0d"
|
|
207
211
|
}
|