@ferrflow/darwin-arm64 2.13.1 → 2.15.5
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/LICENSE +21 -0
- package/README.md +381 -0
- package/bin/ferrflow +0 -0
- package/package.json +2 -2
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright 2024-present FerrFlow Contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,381 @@
|
|
|
1
|
+
# FerrFlow
|
|
2
|
+
|
|
3
|
+
[](https://github.com/FerrFlow-Org/FerrFlow/actions/workflows/ci.yml)
|
|
4
|
+
[](https://github.com/FerrFlow-Org/FerrFlow/actions/workflows/release.yml)
|
|
5
|
+
[](https://github.com/FerrFlow-Org/FerrFlow/releases/latest)
|
|
6
|
+
[](https://codecov.io/gh/FerrFlow-Org/FerrFlow)
|
|
7
|
+
[](LICENSE)
|
|
8
|
+
[](https://badge.socket.dev/npm/package/ferrflow/latest)
|
|
9
|
+
[](https://snyk.io/test/npm/ferrflow)
|
|
10
|
+
|
|
11
|
+
Universal semantic versioning for monorepos and classic repos.
|
|
12
|
+
|
|
13
|
+
FerrFlow reads your commit history, determines the right version bump, updates your version files, generates a changelog, and creates a tagged release — for any language, any repo layout.
|
|
14
|
+
|
|
15
|
+
## Why FerrFlow?
|
|
16
|
+
|
|
17
|
+
Most versioning tools are tied to a specific ecosystem (semantic-release for JS, cargo-release for Rust) or require a Node.js runtime. FerrFlow is a single compiled binary with no runtime dependencies.
|
|
18
|
+
|
|
19
|
+
| Tool | Monorepo | Multi-language | Runtime |
|
|
20
|
+
|------|----------|---------------|---------|
|
|
21
|
+
| semantic-release | plugins | JS only | Node.js |
|
|
22
|
+
| changesets | manual | JS only | Node.js |
|
|
23
|
+
| knope | limited | partial | none |
|
|
24
|
+
| FerrFlow | native | yes | none |
|
|
25
|
+
|
|
26
|
+
## Supported version files
|
|
27
|
+
|
|
28
|
+
| Format | File | Ecosystem |
|
|
29
|
+
|--------|------|-----------|
|
|
30
|
+
| TOML | `Cargo.toml` | Rust |
|
|
31
|
+
| TOML | `pyproject.toml` | Python |
|
|
32
|
+
| JSON | `package.json` | Node.js |
|
|
33
|
+
| XML | `pom.xml` | Java / Maven |
|
|
34
|
+
|
|
35
|
+
## Installation
|
|
36
|
+
|
|
37
|
+
**Cargo**
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
cargo install ferrflow
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
**npm**
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
npm install -D ferrflow
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
**Docker**
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
docker run ghcr.io/ferrflow/ferrflow:latest check
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
**Pre-built binaries**
|
|
56
|
+
|
|
57
|
+
Download from [Releases](https://github.com/FerrFlow-Org/FerrFlow/releases).
|
|
58
|
+
|
|
59
|
+
## Usage
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
# Preview what would be bumped
|
|
63
|
+
ferrflow check
|
|
64
|
+
|
|
65
|
+
# Run a release
|
|
66
|
+
ferrflow release
|
|
67
|
+
|
|
68
|
+
# Dry run
|
|
69
|
+
ferrflow release --dry-run
|
|
70
|
+
|
|
71
|
+
# Pre-release
|
|
72
|
+
ferrflow release --channel beta
|
|
73
|
+
|
|
74
|
+
# Scaffold a config file
|
|
75
|
+
ferrflow init
|
|
76
|
+
|
|
77
|
+
# Scaffold a config file in a specific format
|
|
78
|
+
ferrflow init --format json5
|
|
79
|
+
|
|
80
|
+
# Use a specific config file
|
|
81
|
+
ferrflow check --config path/to/ferrflow.toml
|
|
82
|
+
|
|
83
|
+
# Or set via environment variable
|
|
84
|
+
FERRFLOW_CONFIG=path/to/ferrflow.toml ferrflow check
|
|
85
|
+
|
|
86
|
+
# Print current version
|
|
87
|
+
ferrflow version # single repo
|
|
88
|
+
ferrflow version api # monorepo, specific package
|
|
89
|
+
|
|
90
|
+
# Print last release tag
|
|
91
|
+
ferrflow tag
|
|
92
|
+
ferrflow tag api
|
|
93
|
+
|
|
94
|
+
# JSON output (for scripting)
|
|
95
|
+
ferrflow version --json
|
|
96
|
+
ferrflow tag --json
|
|
97
|
+
|
|
98
|
+
# Shell completions
|
|
99
|
+
ferrflow completions bash >> ~/.bash_completion
|
|
100
|
+
ferrflow completions zsh > ~/.zfunc/_ferrflow
|
|
101
|
+
ferrflow completions fish > ~/.config/fish/completions/ferrflow.fish
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
Pre-generated completion scripts are also available as `ferrflow-completions.tar.gz` in each [GitHub release](https://github.com/FerrFlow-Org/FerrFlow/releases).
|
|
105
|
+
|
|
106
|
+
## Configuration
|
|
107
|
+
|
|
108
|
+
FerrFlow looks for a config file at the root of your repository, in this order:
|
|
109
|
+
|
|
110
|
+
1. `ferrflow.json`
|
|
111
|
+
2. `ferrflow.json5`
|
|
112
|
+
3. `ferrflow.toml`
|
|
113
|
+
4. `.ferrflow` (dotfile, JSON format)
|
|
114
|
+
|
|
115
|
+
If multiple config files exist, FerrFlow exits with an error listing the conflicting files. Use `--config <path>` (or `FERRFLOW_CONFIG` env var) to specify which one to use. If no config file is found, FerrFlow auto-detects common version files in the current directory.
|
|
116
|
+
|
|
117
|
+
Run `ferrflow init` to scaffold a config file interactively. Use `--format` to skip the format prompt:
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
ferrflow init # asks which format (default: json)
|
|
121
|
+
ferrflow init --format json5
|
|
122
|
+
ferrflow init --format toml
|
|
123
|
+
ferrflow init --format dotfile # generates .ferrflow
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### JSON Schema
|
|
127
|
+
|
|
128
|
+
Add `$schema` to get autocompletion and validation in VS Code, WebStorm, and any JSON-aware editor:
|
|
129
|
+
|
|
130
|
+
```json
|
|
131
|
+
{
|
|
132
|
+
"$schema": "https://ferrflow.com/schema/ferrflow.json"
|
|
133
|
+
}
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### JSON (default)
|
|
137
|
+
|
|
138
|
+
```json
|
|
139
|
+
{
|
|
140
|
+
"$schema": "https://ferrflow.com/schema/ferrflow.json",
|
|
141
|
+
"workspace": {
|
|
142
|
+
"remote": "origin",
|
|
143
|
+
"branch": "main"
|
|
144
|
+
},
|
|
145
|
+
"package": [
|
|
146
|
+
{
|
|
147
|
+
"name": "my-app",
|
|
148
|
+
"path": ".",
|
|
149
|
+
"changelog": "CHANGELOG.md",
|
|
150
|
+
"versioned_files": [
|
|
151
|
+
{ "path": "package.json", "format": "json" }
|
|
152
|
+
]
|
|
153
|
+
}
|
|
154
|
+
]
|
|
155
|
+
}
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
### JSON5
|
|
159
|
+
|
|
160
|
+
```json5
|
|
161
|
+
{
|
|
162
|
+
workspace: {
|
|
163
|
+
remote: "origin",
|
|
164
|
+
branch: "main",
|
|
165
|
+
},
|
|
166
|
+
package: [
|
|
167
|
+
{
|
|
168
|
+
name: "my-app",
|
|
169
|
+
path: ".",
|
|
170
|
+
changelog: "CHANGELOG.md",
|
|
171
|
+
versioned_files: [
|
|
172
|
+
{ path: "package.json", format: "json" },
|
|
173
|
+
],
|
|
174
|
+
},
|
|
175
|
+
],
|
|
176
|
+
}
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### TOML
|
|
180
|
+
|
|
181
|
+
```toml
|
|
182
|
+
[workspace]
|
|
183
|
+
remote = "origin"
|
|
184
|
+
branch = "main"
|
|
185
|
+
|
|
186
|
+
[[package]]
|
|
187
|
+
name = "my-app"
|
|
188
|
+
path = "."
|
|
189
|
+
changelog = "CHANGELOG.md"
|
|
190
|
+
|
|
191
|
+
[[package.versioned_files]]
|
|
192
|
+
path = "Cargo.toml"
|
|
193
|
+
format = "toml"
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
### Monorepo
|
|
197
|
+
|
|
198
|
+
<details>
|
|
199
|
+
<summary>JSON</summary>
|
|
200
|
+
|
|
201
|
+
```json
|
|
202
|
+
{
|
|
203
|
+
"package": [
|
|
204
|
+
{
|
|
205
|
+
"name": "api",
|
|
206
|
+
"path": "services/api",
|
|
207
|
+
"changelog": "services/api/CHANGELOG.md",
|
|
208
|
+
"shared_paths": ["services/shared/"],
|
|
209
|
+
"versioned_files": [
|
|
210
|
+
{ "path": "services/api/Cargo.toml", "format": "toml" }
|
|
211
|
+
]
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
"name": "frontend",
|
|
215
|
+
"path": "frontend",
|
|
216
|
+
"changelog": "frontend/CHANGELOG.md",
|
|
217
|
+
"versioned_files": [
|
|
218
|
+
{ "path": "frontend/package.json", "format": "json" }
|
|
219
|
+
]
|
|
220
|
+
}
|
|
221
|
+
]
|
|
222
|
+
}
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
</details>
|
|
226
|
+
|
|
227
|
+
<details>
|
|
228
|
+
<summary>TOML</summary>
|
|
229
|
+
|
|
230
|
+
```toml
|
|
231
|
+
[[package]]
|
|
232
|
+
name = "api"
|
|
233
|
+
path = "services/api"
|
|
234
|
+
changelog = "services/api/CHANGELOG.md"
|
|
235
|
+
shared_paths = ["services/shared/"]
|
|
236
|
+
|
|
237
|
+
[[package.versioned_files]]
|
|
238
|
+
path = "services/api/Cargo.toml"
|
|
239
|
+
format = "toml"
|
|
240
|
+
|
|
241
|
+
[[package]]
|
|
242
|
+
name = "frontend"
|
|
243
|
+
path = "frontend"
|
|
244
|
+
changelog = "frontend/CHANGELOG.md"
|
|
245
|
+
|
|
246
|
+
[[package.versioned_files]]
|
|
247
|
+
path = "frontend/package.json"
|
|
248
|
+
format = "json"
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
</details>
|
|
252
|
+
|
|
253
|
+
## Versioning Strategies
|
|
254
|
+
|
|
255
|
+
Each package can use its own versioning strategy. Set a default at the workspace level and override per package:
|
|
256
|
+
|
|
257
|
+
```toml
|
|
258
|
+
[workspace]
|
|
259
|
+
versioning = "semver" # default for all packages
|
|
260
|
+
|
|
261
|
+
[[package]]
|
|
262
|
+
name = "api"
|
|
263
|
+
path = "packages/api"
|
|
264
|
+
# inherits semver from workspace
|
|
265
|
+
|
|
266
|
+
[[package]]
|
|
267
|
+
name = "site"
|
|
268
|
+
path = "packages/site"
|
|
269
|
+
versioning = "calver" # override: date-based
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
| Strategy | Format | Example | Description |
|
|
273
|
+
|----------|--------|---------|-------------|
|
|
274
|
+
| `semver` | `MAJOR.MINOR.PATCH` | `1.4.2` | Default, driven by conventional commits |
|
|
275
|
+
| `calver` | `YYYY.M.D` | `2025.3.28` | Date-based, ignores commit types |
|
|
276
|
+
| `calver-short` | `YY.M.D` | `25.3.28` | Compact date-based |
|
|
277
|
+
| `calver-seq` | `YYYY.M.SEQ` | `2025.3.3` | Date + daily sequence counter |
|
|
278
|
+
| `sequential` | `N` | `42` | Simple incrementing build number |
|
|
279
|
+
| `zerover` | `0.MINOR.PATCH` | `0.15.2` | Permanently unstable, never hits 1.0 |
|
|
280
|
+
|
|
281
|
+
## Tag Template
|
|
282
|
+
|
|
283
|
+
By default, FerrFlow tags single-repo releases as `v1.2.3` and monorepo releases as `api@v1.2.3`. Customize with `tag_template` at the workspace or package level using `{name}` and `{version}` placeholders.
|
|
284
|
+
|
|
285
|
+
```toml
|
|
286
|
+
[workspace]
|
|
287
|
+
tag_template = "v{version}" # all packages: v1.2.3
|
|
288
|
+
|
|
289
|
+
[[package]]
|
|
290
|
+
name = "api"
|
|
291
|
+
path = "packages/api"
|
|
292
|
+
tag_template = "{name}/v{version}" # override: api/v1.2.3
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
| Layout | Default template | Example tag |
|
|
296
|
+
|--------|-----------------|-------------|
|
|
297
|
+
| Single repo | `v{version}` | `v1.2.3` |
|
|
298
|
+
| Monorepo | `{name}@v{version}` | `api@v1.2.3` |
|
|
299
|
+
| Custom | `release-{version}` | `release-1.2.3` |
|
|
300
|
+
|
|
301
|
+
## Pre-release Channels
|
|
302
|
+
|
|
303
|
+
Publish pre-release versions (alpha, beta, rc, dev) using the `--channel` flag or branch-based configuration. Pre-release versions follow the format `MAJOR.MINOR.PATCH-CHANNEL.IDENTIFIER`.
|
|
304
|
+
|
|
305
|
+
### CLI flag
|
|
306
|
+
|
|
307
|
+
```bash
|
|
308
|
+
ferrflow release --channel beta # 2.0.0-beta.1
|
|
309
|
+
ferrflow check --channel rc # preview pre-release version
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
### Branch-based configuration
|
|
313
|
+
|
|
314
|
+
Map branches to channels automatically:
|
|
315
|
+
|
|
316
|
+
```json
|
|
317
|
+
{
|
|
318
|
+
"workspace": {
|
|
319
|
+
"branches": [
|
|
320
|
+
{ "name": "main", "channel": false },
|
|
321
|
+
{ "name": "develop", "channel": "dev", "prereleaseIdentifier": "timestamp" },
|
|
322
|
+
{ "name": "release/*", "channel": "rc" }
|
|
323
|
+
]
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
Branch names support glob patterns. The first match wins.
|
|
329
|
+
|
|
330
|
+
### Identifier strategies
|
|
331
|
+
|
|
332
|
+
| Strategy | Example | Description |
|
|
333
|
+
|----------|---------|-------------|
|
|
334
|
+
| `increment` | `-beta.3` | Auto-incrementing counter (default) |
|
|
335
|
+
| `timestamp` | `-dev.20250402T1430` | UTC timestamp |
|
|
336
|
+
| `short-hash` | `-dev.a1b2c3d` | Git short hash |
|
|
337
|
+
| `timestamp-hash` | `-dev.20250402T1430-a1b2c3d` | Timestamp + hash |
|
|
338
|
+
|
|
339
|
+
### Behavior
|
|
340
|
+
|
|
341
|
+
- Floating tags (e.g. `v1`, `v1.2`) are never moved by pre-release versions
|
|
342
|
+
- GitHub Releases are marked as pre-release
|
|
343
|
+
- Stable releases include all commits since the last stable tag (skipping pre-release tags)
|
|
344
|
+
- Hook environment includes `FERRFLOW_CHANNEL` and `FERRFLOW_IS_PRERELEASE`
|
|
345
|
+
|
|
346
|
+
## Conventional Commits
|
|
347
|
+
|
|
348
|
+
FerrFlow follows the [Conventional Commits](https://www.conventionalcommits.org/) spec.
|
|
349
|
+
|
|
350
|
+
| Prefix | Bump |
|
|
351
|
+
|--------|------|
|
|
352
|
+
| `fix:`, `perf:`, `refactor:` | patch |
|
|
353
|
+
| `feat:` | minor |
|
|
354
|
+
| `feat!:`, `BREAKING CHANGE` | major |
|
|
355
|
+
| `chore:`, `docs:`, `ci:` | none |
|
|
356
|
+
|
|
357
|
+
## CI usage
|
|
358
|
+
|
|
359
|
+
**GitLab CI**
|
|
360
|
+
|
|
361
|
+
```yaml
|
|
362
|
+
release:
|
|
363
|
+
image: ghcr.io/ferrflow/ferrflow:latest
|
|
364
|
+
script:
|
|
365
|
+
- ferrflow release
|
|
366
|
+
rules:
|
|
367
|
+
- if: '$CI_COMMIT_BRANCH == "main"'
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
**GitHub Actions**
|
|
371
|
+
|
|
372
|
+
```yaml
|
|
373
|
+
- name: Release
|
|
374
|
+
run: ferrflow release
|
|
375
|
+
env:
|
|
376
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
377
|
+
```
|
|
378
|
+
|
|
379
|
+
## License
|
|
380
|
+
|
|
381
|
+
MIT
|
package/bin/ferrflow
CHANGED
|
Binary file
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"arm64"
|
|
4
4
|
],
|
|
5
5
|
"description": "FerrFlow macOS arm64 binary",
|
|
6
|
-
"license": "
|
|
6
|
+
"license": "MIT",
|
|
7
7
|
"name": "@ferrflow/darwin-arm64",
|
|
8
8
|
"os": [
|
|
9
9
|
"darwin"
|
|
@@ -12,5 +12,5 @@
|
|
|
12
12
|
"type": "git",
|
|
13
13
|
"url": "git+https://github.com/FerrFlow-Org/FerrFlow.git"
|
|
14
14
|
},
|
|
15
|
-
"version": "2.
|
|
15
|
+
"version": "2.15.5"
|
|
16
16
|
}
|