@sacho/sacho-aarch64-pc-windows-msvc 0.1.0-dev.0 → 0.1.0-dev.10
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 +674 -674
- package/README.md +227 -245
- package/package.json +1 -1
- package/sacho.exe +0 -0
package/README.md
CHANGED
|
@@ -1,245 +1,227 @@
|
|
|
1
|
-
Sacho: an opinionated changelog manager
|
|
2
|
-
=======================================
|
|
3
|
-
|
|
4
|
-
Motivation
|
|
5
|
-
----------
|
|
6
|
-
|
|
7
|
-
Changelogs are not commit messages. A commit message explains why a change was
|
|
8
|
-
made and addresses collaborators; a changelog tells users what changed and what
|
|
9
|
-
they should or can do when they upgrade. Most changelog tooling ignores this
|
|
10
|
-
distinction. Tools like git-cliff, conventional-changelog, and semantic-release
|
|
11
|
-
generate changelogs *from* commit messages, which produces documents written
|
|
12
|
-
for the wrong audience in the wrong voice. Sacho rejects generation outright:
|
|
13
|
-
every changelog entry is prose written by a human, for users, at the time the
|
|
14
|
-
change is made.
|
|
15
|
-
|
|
16
|
-
The remaining tools that share this stance are tied to language ecosystems.
|
|
17
|
-
towncrier assumes Python; changesets assumes an npm monorepo. Sacho is a single
|
|
18
|
-
static binary with no runtime dependencies, usable in any repository regardless
|
|
19
|
-
of language, and it does not even assume Git.
|
|
20
|
-
|
|
21
|
-
[Sacho is opinionated
|
|
22
|
-
one output style, and one set of invariants. Configuration exists to describe
|
|
23
|
-
your repository, not to customize the philosophy.
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
Installation
|
|
27
|
-
------------
|
|
28
|
-
|
|
29
|
-
The recommended way to install Sacho is with [mise]'s GitHub backend:
|
|
30
|
-
|
|
31
|
-
~~~~ sh
|
|
32
|
-
mise use -g github:dahlia/sacho
|
|
33
|
-
~~~~
|
|
34
|
-
|
|
35
|
-
This selects the release archive for the current platform and puts *sacho* on
|
|
36
|
-
your `PATH`. npm installs the same prebuilt binary:
|
|
37
|
-
|
|
38
|
-
~~~~ sh
|
|
39
|
-
npm install -g @sacho/sacho
|
|
40
|
-
~~~~
|
|
41
|
-
|
|
42
|
-
Development builds are available as `@sacho/sacho@canary`.
|
|
43
|
-
|
|
44
|
-
Cargo can build and install the published crate from crates.io instead:
|
|
45
|
-
|
|
46
|
-
~~~~ sh
|
|
47
|
-
cargo install sacho
|
|
48
|
-
~~~~
|
|
49
|
-
|
|
50
|
-
Without mise, npm, or Cargo, download the archive for your platform from
|
|
51
|
-
[GitHub Releases], then extract
|
|
52
|
-
*sacho* (*sacho.exe* on Windows) into a directory on your `PATH`.
|
|
53
|
-
|
|
54
|
-
[mise]: https://mise.jdx.dev/
|
|
55
|
-
[GitHub Releases]: https://github.com/dahlia/sacho/releases
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
the
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
~~~~ sh
|
|
144
|
-
sacho
|
|
145
|
-
~~~~
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
~~~~ sh
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
[
|
|
228
|
-
Historiographers wrote sacho independently, event by event, as things happened.
|
|
229
|
-
Only after a king's death did the Office for Annals Compilation collect the
|
|
230
|
-
sacho and compile them into the Veritable Records (sillok, 實錄). Once
|
|
231
|
-
compiled, the annals were sealed in archives and could not be revised; not even
|
|
232
|
-
the king was permitted to read the sacho or to interfere with their
|
|
233
|
-
compilation. The drafts themselves were then washed of their ink so the paper
|
|
234
|
-
could be reused, a step with its own name: secho (洗草).
|
|
235
|
-
|
|
236
|
-
The correspondence to this tool is close enough that the name doubles as a
|
|
237
|
-
design summary. Fragments are sacho: independent records written when the
|
|
238
|
-
change happens. A release is the compilation of the annals: fragments are
|
|
239
|
-
gathered into a permanent document. Released sections are sealed: Sacho never
|
|
240
|
-
rewrites them. Deleting consumed fragments after a release is secho. The
|
|
241
|
-
institutional insistence that drafts, not recollection, are the source of truth
|
|
242
|
-
is the same insistence this tool makes against generating changelogs from
|
|
243
|
-
commit messages after the fact.
|
|
244
|
-
|
|
245
|
-
[1]: https://en.wikipedia.org/wiki/Veritable_Records_of_the_Joseon_Dynasty#Compilation_process
|
|
1
|
+
Sacho: an opinionated changelog manager
|
|
2
|
+
=======================================
|
|
3
|
+
|
|
4
|
+
Motivation
|
|
5
|
+
----------
|
|
6
|
+
|
|
7
|
+
Changelogs are not commit messages. A commit message explains why a change was
|
|
8
|
+
made and addresses collaborators; a changelog tells users what changed and what
|
|
9
|
+
they should or can do when they upgrade. Most changelog tooling ignores this
|
|
10
|
+
distinction. Tools like git-cliff, conventional-changelog, and semantic-release
|
|
11
|
+
generate changelogs *from* commit messages, which produces documents written
|
|
12
|
+
for the wrong audience in the wrong voice. Sacho rejects generation outright:
|
|
13
|
+
every changelog entry is prose written by a human, for users, at the time the
|
|
14
|
+
change is made.
|
|
15
|
+
|
|
16
|
+
The remaining tools that share this stance are tied to language ecosystems.
|
|
17
|
+
towncrier assumes Python; changesets assumes an npm monorepo. Sacho is a single
|
|
18
|
+
static binary with no runtime dependencies, usable in any repository regardless
|
|
19
|
+
of language, and it does not even assume Git.
|
|
20
|
+
|
|
21
|
+
[*Sacho is opinionated.*](./PHILOSOPHY.md) It enforces one fragment format,
|
|
22
|
+
one output style, and one set of invariants. Configuration exists to describe
|
|
23
|
+
your repository, not to customize the philosophy.
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
Installation
|
|
27
|
+
------------
|
|
28
|
+
|
|
29
|
+
The recommended way to install Sacho is with [mise]'s GitHub backend:
|
|
30
|
+
|
|
31
|
+
~~~~ sh
|
|
32
|
+
mise use -g github:dahlia/sacho
|
|
33
|
+
~~~~
|
|
34
|
+
|
|
35
|
+
This selects the release archive for the current platform and puts *sacho* on
|
|
36
|
+
your `PATH`. npm installs the same prebuilt binary:
|
|
37
|
+
|
|
38
|
+
~~~~ sh
|
|
39
|
+
npm install -g @sacho/sacho
|
|
40
|
+
~~~~
|
|
41
|
+
|
|
42
|
+
Development builds are available as `@sacho/sacho@canary`.
|
|
43
|
+
|
|
44
|
+
Cargo can build and install the published crate from crates.io instead:
|
|
45
|
+
|
|
46
|
+
~~~~ sh
|
|
47
|
+
cargo install sacho
|
|
48
|
+
~~~~
|
|
49
|
+
|
|
50
|
+
Without mise, npm, or Cargo, download the archive for your platform from
|
|
51
|
+
[GitHub Releases], then extract
|
|
52
|
+
*sacho* (*sacho.exe* on Windows) into a directory on your `PATH`.
|
|
53
|
+
|
|
54
|
+
[mise]: https://mise.jdx.dev/
|
|
55
|
+
[GitHub Releases]: https://github.com/dahlia/sacho/releases
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
Documentation
|
|
59
|
+
-------------
|
|
60
|
+
|
|
61
|
+
The [*Sacho documentation*] walks through adoption, everyday use, releases,
|
|
62
|
+
CI, and version-control integration. It also explains Sacho's core concepts and
|
|
63
|
+
provides complete command and configuration references.
|
|
64
|
+
|
|
65
|
+
[*Sacho documentation*]: https://sacho.dev/guide/getting-started
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
How it works
|
|
69
|
+
------------
|
|
70
|
+
|
|
71
|
+
Each user-visible change lives in a small Markdown file under *changes.d/*.
|
|
72
|
+
These files are called fragments. They are the source of truth for the next
|
|
73
|
+
release; the unreleased section in *CHANGES.md* is generated output. Sacho
|
|
74
|
+
sorts and formats the fragments, then turns them into a dated version section
|
|
75
|
+
when you release. The consumed fragment files are deleted, while the released
|
|
76
|
+
section is left untouched.
|
|
77
|
+
|
|
78
|
+
A fragment contains exactly one top-level unordered list. One item is usual,
|
|
79
|
+
but related changes may share a fragment:
|
|
80
|
+
|
|
81
|
+
~~~~ markdown
|
|
82
|
+
- Added `clear()` to remove every entry at once.
|
|
83
|
+
- Added `is_empty()` for checking whether a collection has entries.
|
|
84
|
+
~~~~
|
|
85
|
+
|
|
86
|
+
Name fragments after the change itself, such as *clear-function.md*, rather
|
|
87
|
+
than after an issue or pull request number. A later change to the same feature
|
|
88
|
+
can then update the existing fragment instead of documenting an intermediate
|
|
89
|
+
state that never shipped.
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
Basic workflow
|
|
93
|
+
--------------
|
|
94
|
+
|
|
95
|
+
With `sacho` on your `PATH`, initialize it at the repository root and choose
|
|
96
|
+
the version you are preparing:
|
|
97
|
+
|
|
98
|
+
~~~~ sh
|
|
99
|
+
sacho init
|
|
100
|
+
sacho next 1.2.0
|
|
101
|
+
~~~~
|
|
102
|
+
|
|
103
|
+
Initialization creates *sacho.toml*, *changes.d/*, and *CHANGES.md*. It also
|
|
104
|
+
sets up the merge integration supported by the detected version-control
|
|
105
|
+
system. The interactive setup can infer an issue-link template from the
|
|
106
|
+
repository URL and offer to install a Git pre-commit hook. Repository
|
|
107
|
+
integrations use the executable that ran `init`; pass
|
|
108
|
+
`--integration-executable PATH` to use another executable.
|
|
109
|
+
|
|
110
|
+
Create one fragment for each user-visible change, then edit the path printed by
|
|
111
|
+
the command:
|
|
112
|
+
|
|
113
|
+
~~~~ sh
|
|
114
|
+
sacho add clear-function
|
|
115
|
+
~~~~
|
|
116
|
+
|
|
117
|
+
Repositories configured with sections, such as packages in a monorepo, select
|
|
118
|
+
the section by its configured id:
|
|
119
|
+
|
|
120
|
+
~~~~ sh
|
|
121
|
+
sacho add --section core clear-function
|
|
122
|
+
~~~~
|
|
123
|
+
|
|
124
|
+
Format the fragments, inspect the compiled release, and check the repository
|
|
125
|
+
before committing:
|
|
126
|
+
|
|
127
|
+
~~~~ sh
|
|
128
|
+
sacho fmt
|
|
129
|
+
sacho preview
|
|
130
|
+
sacho check
|
|
131
|
+
~~~~
|
|
132
|
+
|
|
133
|
+
`sacho fmt` also refreshes the materialized unreleased section. Do not edit
|
|
134
|
+
that section in *CHANGES.md* by hand; edit its fragments and run `sacho sync`
|
|
135
|
+
if the generated copy falls out of date. To enforce fragment coverage for
|
|
136
|
+
source changes, configure `[check].paths` and use `sacho check --staged` for
|
|
137
|
+
staged Git changes or `sacho check --base <revision>` in CI.
|
|
138
|
+
|
|
139
|
+
When the version is ready, compile and consume its fragments. This command
|
|
140
|
+
releases the version stored by `sacho next`, uses the current local date, and
|
|
141
|
+
starts the next version:
|
|
142
|
+
|
|
143
|
+
~~~~ sh
|
|
144
|
+
sacho release --next 1.3.0
|
|
145
|
+
~~~~
|
|
146
|
+
|
|
147
|
+
If no next version has been set, pass the release version explicitly, for
|
|
148
|
+
example `sacho release 1.2.0`. Use `--date YYYY-MM-DD` when the release date
|
|
149
|
+
must be supplied rather than taken from the local clock.
|
|
150
|
+
|
|
151
|
+
After committing a release, print its frozen Markdown section with `show`:
|
|
152
|
+
|
|
153
|
+
~~~~ sh
|
|
154
|
+
sacho show 1.2.0
|
|
155
|
+
~~~~
|
|
156
|
+
|
|
157
|
+
The output starts at the version heading and ends before the next released
|
|
158
|
+
version heading. It is written to standard output unless `-o PATH` or
|
|
159
|
+
`--output-file PATH` is supplied. Pass `-H` or `--skip-heading` to omit the
|
|
160
|
+
version heading. For example, a GitHub Actions job triggered by a `v1.2.0` tag
|
|
161
|
+
can run:
|
|
162
|
+
|
|
163
|
+
~~~~ sh
|
|
164
|
+
version="${GITHUB_REF_NAME#v}"
|
|
165
|
+
sacho show "$version" --skip-heading --output-file release-notes.md
|
|
166
|
+
gh release create "$GITHUB_REF_NAME" --notes-file release-notes.md
|
|
167
|
+
~~~~
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
Version-control integration
|
|
171
|
+
---------------------------
|
|
172
|
+
|
|
173
|
+
Sacho can enforce that commits changing configured source paths also carry a
|
|
174
|
+
changelog fragment. Select the repository's VCS and the paths to check in
|
|
175
|
+
*sacho.toml*:
|
|
176
|
+
|
|
177
|
+
~~~~ toml
|
|
178
|
+
[vcs]
|
|
179
|
+
preset = "git" # "jj", "hg", or "none"
|
|
180
|
+
|
|
181
|
+
[check]
|
|
182
|
+
paths = ["src/**"]
|
|
183
|
+
~~~~
|
|
184
|
+
|
|
185
|
+
Then check commits after a base revision with `sacho check --base <revision>`.
|
|
186
|
+
Git also supports `sacho check --staged`. The `none` preset explicitly skips
|
|
187
|
+
VCS-backed checks while leaving fragment validation and changelog consistency
|
|
188
|
+
checks enabled.
|
|
189
|
+
|
|
190
|
+
`sacho init` installs Git merge attributes and drivers in Git repositories. In
|
|
191
|
+
Mercurial repositories it installs an idempotent block in *.hg/hgrc* containing
|
|
192
|
+
a successful-merge update hook and, when changelog materialization is enabled,
|
|
193
|
+
the changelog merge driver. These integrations invoke the executable that ran
|
|
194
|
+
`init` unless `--integration-executable` selects another one. Jujutsu has no
|
|
195
|
+
per-path merge-driver hook; after resolving a concurrent fragment merge, run
|
|
196
|
+
`sacho sync --force`.
|
|
197
|
+
|
|
198
|
+
See [*CI and hooks*] for fragment coverage and [*Version control*] for preset,
|
|
199
|
+
merge-driver, and custom-query details.
|
|
200
|
+
|
|
201
|
+
[*CI and hooks*]: https://sacho.dev/guide/ci-and-hooks
|
|
202
|
+
[*Version control*]: https://sacho.dev/guide/version-control
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
Etymology
|
|
206
|
+
---------
|
|
207
|
+
|
|
208
|
+
Sacho (史草) names the
|
|
209
|
+
[draft records kept by official historians of Joseon Korea.][1]
|
|
210
|
+
Historiographers wrote sacho independently, event by event, as things happened.
|
|
211
|
+
Only after a king's death did the Office for Annals Compilation collect the
|
|
212
|
+
sacho and compile them into the Veritable Records (sillok, 實錄). Once
|
|
213
|
+
compiled, the annals were sealed in archives and could not be revised; not even
|
|
214
|
+
the king was permitted to read the sacho or to interfere with their
|
|
215
|
+
compilation. The drafts themselves were then washed of their ink so the paper
|
|
216
|
+
could be reused, a step with its own name: secho (洗草).
|
|
217
|
+
|
|
218
|
+
The correspondence to this tool is close enough that the name doubles as a
|
|
219
|
+
design summary. Fragments are sacho: independent records written when the
|
|
220
|
+
change happens. A release is the compilation of the annals: fragments are
|
|
221
|
+
gathered into a permanent document. Released sections are sealed: Sacho never
|
|
222
|
+
rewrites them. Deleting consumed fragments after a release is secho. The
|
|
223
|
+
institutional insistence that drafts, not recollection, are the source of truth
|
|
224
|
+
is the same insistence this tool makes against generating changelogs from
|
|
225
|
+
commit messages after the fact.
|
|
226
|
+
|
|
227
|
+
[1]: https://en.wikipedia.org/wiki/Veritable_Records_of_the_Joseon_Dynasty#Compilation_process
|
package/package.json
CHANGED
package/sacho.exe
CHANGED
|
Binary file
|