putitoutthere 0.1.43 → 0.1.44

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.
@@ -1,43 +0,0 @@
1
- /**
2
- * Workflow templates emitted by `putitoutthere init`.
3
- *
4
- * Per plan.md §9.2 (immediate), §9.4 (scheduled), §9.5 (PR check).
5
- *
6
- * The `release.yml` templates follow the three-job shape
7
- * (plan → build → publish) so users can drop their build tooling into
8
- * the middle job without forking the orchestrator. Build steps are
9
- * keyed on `matrix.kind` (crates | pypi | npm) and `matrix.build`
10
- * (vanilla | maturin | napi | bundled-cli) so the right builder runs
11
- * per row.
12
- *
13
- * Issue #25. Plan: §9.
14
- */
15
- export type Cadence = 'immediate' | 'scheduled';
16
- /**
17
- * Seed values `tomlSkeleton` can bake into the emitted skeleton.
18
- * Today, the only one is a suggested `tag_format` for repos whose
19
- * existing tag history is `v*` — see `src/init.ts#detectTagFormatSuggestion`.
20
- */
21
- export interface SkeletonSeeds {
22
- tag_format?: string;
23
- /** Human-readable phrase explaining why the suggestion was made. */
24
- tag_format_reason?: string;
25
- }
26
- /**
27
- * Emit the `putitoutthere.toml` skeleton. When `seeds.tag_format` is
28
- * set, prepend a short comment explaining why plus a commented
29
- * `# tag_format = "..."` hint inside the crates example block.
30
- *
31
- * Kept as a function (not a constant) so init can bake in
32
- * per-repo detection results (#204). Callers without seeds get the
33
- * plain skeleton.
34
- */
35
- export declare function tomlSkeleton(seeds?: SkeletonSeeds | null): string;
36
- /** @deprecated use {@link tomlSkeleton}; kept for external consumers of the constant. */
37
- export declare const TOML_SKELETON = "# Put It Out There \u2014 release orchestration config.\n# Docs: https://github.com/thekevinscott/put-it-out-there\n\n[putitoutthere]\nversion = 1\n\n# Declare one [[package]] block per releasable artifact. Examples:\n#\n# [[package]]\n# name = \"my-crate\"\n# kind = \"crates\"\n# path = \"crates/my-crate\" # dir containing Cargo.toml\n# paths = [\"crates/my-crate/**\", \"**/Cargo.toml\", \"**/Cargo.lock\"]\n# first_version = \"0.1.0\"\n# # tag_format defaults to \"{name}-v{version}\". Single-package repos\n# # often want \"v{version}\" to keep the existing v0.1.0-style timeline.\n# # tag_format = \"v{version}\"\n#\n# [[package]]\n# name = \"my-py\"\n# kind = \"pypi\"\n# path = \"py/my-py\" # dir containing pyproject.toml\n# paths = [\"py/my-py/**\"]\n# first_version = \"0.1.0\"\n#\n# [[package]]\n# name = \"my-pkg\"\n# kind = \"npm\"\n# path = \"packages/my-pkg\" # dir containing package.json\n# paths = [\"packages/my-pkg/**\"]\n# first_version = \"0.1.0\"\n";
38
- export declare const AGENTS_MD = "# Release signaling for Put It Out There\n\nWhen you finish a unit of work and are preparing a PR or commit, add a git\ntrailer to the commit message body to signal a release:\n\n release: <patch|minor|major|skip>\n\nRules:\n- Omit the trailer for docs-only, CI-only, or internal-only changes.\n- `patch` for bug fixes or internal refactors that don't change public API.\n- `minor` for new features that are backwards-compatible.\n- `major` for breaking changes.\n- `skip` to suppress release when path filters would otherwise cascade.\n\nThe trailer on the merge commit determines the release. If merging via\n\"Squash and merge,\" include the trailer in the PR description so it ends up\nin the squashed commit body.\n\n## Scoping a release to specific packages\n\nTo release a subset of packages in a polyglot repo, append a bracketed list:\n\n release: minor [my-crate, my-py]\n\nPackages named in the list are bumped with the specified version. Other\npackages cascaded by path filters still get a `patch`. Packages in the\nlist that *aren't* cascaded are force-included.\n";
39
- export declare const RELEASE_YML_IMMEDIATE: string;
40
- export declare const RELEASE_YML_SCHEDULED: string;
41
- export declare const CHECK_YML = "name: Putitoutthere check\n\non:\n pull_request:\n branches: [main]\n\npermissions:\n contents: read\n pull-requests: read\n\njobs:\n dry-run:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v4\n with:\n fetch-depth: 0\n - uses: thekevinscott/put-it-out-there@v0\n with:\n command: plan\n dry_run: true\n fail_on_error: true\n";
42
- export declare function releaseYml(cadence: Cadence): string;
43
- //# sourceMappingURL=templates.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,MAAM,MAAM,OAAO,GAAG,WAAW,GAAG,WAAW,CAAC;AAEhD;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oEAAoE;IACpE,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAmCD;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,KAAK,GAAE,aAAa,GAAG,IAAW,GAAG,MAAM,CAWvE;AAED,yFAAyF;AACzF,eAAO,MAAM,aAAa,ygCAAqB,CAAC;AAEhD,eAAO,MAAM,SAAS,ikCA2BrB,CAAC;AA+LF,eAAO,MAAM,qBAAqB,QAAsE,CAAC;AACzG,eAAO,MAAM,qBAAqB,QAAsE,CAAC;AAEzG,eAAO,MAAM,SAAS,iaAsBrB,CAAC;AAEF,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAGnD"}
package/dist/templates.js DELETED
@@ -1,310 +0,0 @@
1
- /**
2
- * Workflow templates emitted by `putitoutthere init`.
3
- *
4
- * Per plan.md §9.2 (immediate), §9.4 (scheduled), §9.5 (PR check).
5
- *
6
- * The `release.yml` templates follow the three-job shape
7
- * (plan → build → publish) so users can drop their build tooling into
8
- * the middle job without forking the orchestrator. Build steps are
9
- * keyed on `matrix.kind` (crates | pypi | npm) and `matrix.build`
10
- * (vanilla | maturin | napi | bundled-cli) so the right builder runs
11
- * per row.
12
- *
13
- * Issue #25. Plan: §9.
14
- */
15
- const TOML_SKELETON_BODY = `# Put It Out There — release orchestration config.
16
- # Docs: https://github.com/thekevinscott/put-it-out-there
17
-
18
- [putitoutthere]
19
- version = 1
20
-
21
- # Declare one [[package]] block per releasable artifact. Examples:
22
- #
23
- # [[package]]
24
- # name = "my-crate"
25
- # kind = "crates"
26
- # path = "crates/my-crate" # dir containing Cargo.toml
27
- # paths = ["crates/my-crate/**", "**/Cargo.toml", "**/Cargo.lock"]
28
- # first_version = "0.1.0"
29
- # # tag_format defaults to "{name}-v{version}". Single-package repos
30
- # # often want "v{version}" to keep the existing v0.1.0-style timeline.
31
- # # tag_format = "v{version}"
32
- #
33
- # [[package]]
34
- # name = "my-py"
35
- # kind = "pypi"
36
- # path = "py/my-py" # dir containing pyproject.toml
37
- # paths = ["py/my-py/**"]
38
- # first_version = "0.1.0"
39
- #
40
- # [[package]]
41
- # name = "my-pkg"
42
- # kind = "npm"
43
- # path = "packages/my-pkg" # dir containing package.json
44
- # paths = ["packages/my-pkg/**"]
45
- # first_version = "0.1.0"
46
- `;
47
- /**
48
- * Emit the `putitoutthere.toml` skeleton. When `seeds.tag_format` is
49
- * set, prepend a short comment explaining why plus a commented
50
- * `# tag_format = "..."` hint inside the crates example block.
51
- *
52
- * Kept as a function (not a constant) so init can bake in
53
- * per-repo detection results (#204). Callers without seeds get the
54
- * plain skeleton.
55
- */
56
- export function tomlSkeleton(seeds = null) {
57
- if (seeds === null || seeds.tag_format === undefined) {
58
- return TOML_SKELETON_BODY;
59
- }
60
- const reason = seeds.tag_format_reason ?? 'single-package repo';
61
- const banner = `# piot init detected ${reason}; set tag_format = "${seeds.tag_format}" on\n` +
62
- `# each [[package]] block below to keep that timeline, or remove this comment\n` +
63
- `# to use the default "{name}-v{version}".\n` +
64
- `# See https://thekevinscott.github.io/put-it-out-there/guide/configuration\n\n`;
65
- return banner + TOML_SKELETON_BODY;
66
- }
67
- /** @deprecated use {@link tomlSkeleton}; kept for external consumers of the constant. */
68
- export const TOML_SKELETON = TOML_SKELETON_BODY;
69
- export const AGENTS_MD = `# Release signaling for Put It Out There
70
-
71
- When you finish a unit of work and are preparing a PR or commit, add a git
72
- trailer to the commit message body to signal a release:
73
-
74
- release: <patch|minor|major|skip>
75
-
76
- Rules:
77
- - Omit the trailer for docs-only, CI-only, or internal-only changes.
78
- - \`patch\` for bug fixes or internal refactors that don't change public API.
79
- - \`minor\` for new features that are backwards-compatible.
80
- - \`major\` for breaking changes.
81
- - \`skip\` to suppress release when path filters would otherwise cascade.
82
-
83
- The trailer on the merge commit determines the release. If merging via
84
- "Squash and merge," include the trailer in the PR description so it ends up
85
- in the squashed commit body.
86
-
87
- ## Scoping a release to specific packages
88
-
89
- To release a subset of packages in a polyglot repo, append a bracketed list:
90
-
91
- release: minor [my-crate, my-py]
92
-
93
- Packages named in the list are bumped with the specified version. Other
94
- packages cascaded by path filters still get a \`patch\`. Packages in the
95
- list that *aren't* cascaded are force-included.
96
- `;
97
- const BUILD_JOB = ` build:
98
- needs: plan
99
- if: fromJSON(needs.plan.outputs.matrix || '[]')[0] != null
100
- strategy:
101
- fail-fast: false
102
- matrix:
103
- include: \${{ fromJSON(needs.plan.outputs.matrix) }}
104
- runs-on: \${{ matrix.runs_on }}
105
- steps:
106
- - uses: actions/checkout@v4
107
- with:
108
- fetch-depth: 0
109
- - name: Setup Rust (if crates)
110
- if: matrix.kind == 'crates'
111
- uses: dtolnay/rust-toolchain@stable
112
- - name: Build crate
113
- if: matrix.kind == 'crates'
114
- run: cargo package --manifest-path \${{ matrix.path }}/Cargo.toml --target-dir \${{ matrix.path }}/target
115
- - name: Setup Python (if pypi)
116
- if: matrix.kind == 'pypi'
117
- uses: actions/setup-python@v5
118
- with:
119
- python-version: '3.12'
120
- # #217: when [package.bundle_cli] is declared, compile the CLI
121
- # for this target and stage it into the package source tree so
122
- # maturin includes it in the wheel that's built next.
123
- - name: Setup Rust (if pypi bundle_cli)
124
- if: matrix.kind == 'pypi' && matrix.bundle_cli.bin != '' && matrix.target != 'sdist'
125
- uses: dtolnay/rust-toolchain@stable
126
- with:
127
- targets: \${{ matrix.target }}
128
- - name: Build + stage bundled CLI
129
- if: matrix.kind == 'pypi' && matrix.bundle_cli.bin != '' && matrix.target != 'sdist'
130
- shell: bash
131
- run: |
132
- set -euo pipefail
133
- cd "\${{ matrix.bundle_cli.crate_path }}"
134
- cargo build --release --bin "\${{ matrix.bundle_cli.bin }}" --target "\${{ matrix.target }}"
135
- cd "\${{ github.workspace }}"
136
- dest="\${{ matrix.path }}/\${{ matrix.bundle_cli.stage_to }}"
137
- mkdir -p "$dest"
138
- # Windows targets produce .exe; Unix don't. Copy whatever's
139
- # there matching the bin name.
140
- src_dir="\${{ matrix.bundle_cli.crate_path }}/target/\${{ matrix.target }}/release"
141
- if [[ -f "$src_dir/\${{ matrix.bundle_cli.bin }}.exe" ]]; then
142
- cp "$src_dir/\${{ matrix.bundle_cli.bin }}.exe" "$dest/"
143
- elif [[ -f "$src_dir/\${{ matrix.bundle_cli.bin }}" ]]; then
144
- cp "$src_dir/\${{ matrix.bundle_cli.bin }}" "$dest/"
145
- else
146
- echo "bundle_cli: built binary not found at $src_dir/\${{ matrix.bundle_cli.bin }}[.exe]" >&2
147
- exit 1
148
- fi
149
- - name: Build wheel (maturin)
150
- if: matrix.kind == 'pypi' && matrix.build == 'maturin'
151
- uses: PyO3/maturin-action@v1
152
- with:
153
- command: build
154
- args: --release --out \${{ matrix.path }}/dist \${{ matrix.target == 'sdist' && '--sdist' || format('--target {0}', matrix.target) }}
155
- working-directory: \${{ matrix.path }}
156
- - name: Build sdist (setuptools/hatch)
157
- if: matrix.kind == 'pypi' && matrix.build != 'maturin' && matrix.target == 'sdist'
158
- run: |
159
- cd \${{ matrix.path }}
160
- python -m pip install build
161
- python -m build --sdist --outdir dist
162
- - name: Setup Node (if npm)
163
- if: matrix.kind == 'npm'
164
- uses: actions/setup-node@v4
165
- with:
166
- node-version: '24'
167
- - name: Build npm package
168
- if: matrix.kind == 'npm'
169
- run: |
170
- cd \${{ matrix.path }}
171
- npm ci
172
- npm run build --if-present
173
- - uses: actions/upload-artifact@v4
174
- with:
175
- name: \${{ matrix.artifact_name }}
176
- path: \${{ matrix.artifact_path }}
177
- `;
178
- const PUBLISH_JOB = ` publish:
179
- needs: [plan, build]
180
- runs-on: ubuntu-latest
181
- permissions:
182
- contents: write
183
- id-token: write
184
- steps:
185
- - uses: actions/checkout@v4
186
- with:
187
- fetch-depth: 0
188
- - uses: actions/setup-node@v4
189
- with:
190
- node-version: '24'
191
- registry-url: 'https://registry.npmjs.org'
192
- # PyPI publish shells out to \`twine\`. Hosted runners don't ship it;
193
- # install it here so the publish job has twine on PATH regardless of
194
- # whether the config has a pypi package today.
195
- - uses: actions/setup-python@v5
196
- with:
197
- python-version: '3.12'
198
- - name: Install twine
199
- run: pip install twine
200
- # piot cuts an annotated tag per publish (\`git tag -a\`). Hosted
201
- # runners have no committer identity set; configure one before the
202
- # piot step or tag creation fails with "Please tell me who you are."
203
- - name: Configure git identity
204
- run: |
205
- git config --global user.name "github-actions[bot]"
206
- git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com"
207
- - uses: actions/download-artifact@v4
208
- with:
209
- path: artifacts
210
- - uses: thekevinscott/put-it-out-there@v0
211
- with:
212
- command: publish
213
- dry_run: \${{ inputs.dry_run || 'false' }}
214
- env:
215
- # NODE_AUTH_TOKEN (not NPM_TOKEN) matches the .npmrc template that
216
- # actions/setup-node writes when registry-url is set. putitoutthere's
217
- # preflight also accepts NPM_TOKEN as a fallback, but npm itself
218
- # reads this name. Store your npm secret under any name — we map it
219
- # here.
220
- NODE_AUTH_TOKEN: \${{ secrets.NPM_TOKEN }}
221
- CARGO_REGISTRY_TOKEN: \${{ secrets.CARGO_TOKEN }}
222
- PYPI_API_TOKEN: \${{ secrets.PYPI_API_TOKEN }}
223
- `;
224
- const PLAN_JOB = ` plan:
225
- runs-on: ubuntu-latest
226
- outputs:
227
- matrix: \${{ steps.plan.outputs.matrix }}
228
- steps:
229
- - uses: actions/checkout@v4
230
- with:
231
- fetch-depth: 0
232
- - id: plan
233
- uses: thekevinscott/put-it-out-there@v0
234
- with:
235
- command: plan
236
- `;
237
- const IMMEDIATE_HEADER = `name: Release
238
-
239
- on:
240
- push:
241
- branches: [main]
242
- workflow_dispatch:
243
- inputs:
244
- dry_run:
245
- description: 'Dry-run: compute plan, skip publish + tag'
246
- type: boolean
247
- default: false
248
-
249
- concurrency:
250
- group: release
251
- cancel-in-progress: false
252
-
253
- permissions:
254
- contents: read
255
- id-token: write
256
-
257
- jobs:
258
- `;
259
- const SCHEDULED_HEADER = `name: Release (scheduled)
260
-
261
- on:
262
- schedule:
263
- - cron: '0 2 * * *'
264
- workflow_dispatch:
265
- inputs:
266
- dry_run:
267
- description: 'Dry-run: compute plan, skip publish + tag'
268
- type: boolean
269
- default: false
270
-
271
- concurrency:
272
- group: release
273
- cancel-in-progress: false
274
-
275
- permissions:
276
- contents: read
277
- id-token: write
278
-
279
- jobs:
280
- `;
281
- export const RELEASE_YML_IMMEDIATE = IMMEDIATE_HEADER + PLAN_JOB + '\n' + BUILD_JOB + '\n' + PUBLISH_JOB;
282
- export const RELEASE_YML_SCHEDULED = SCHEDULED_HEADER + PLAN_JOB + '\n' + BUILD_JOB + '\n' + PUBLISH_JOB;
283
- export const CHECK_YML = `name: Putitoutthere check
284
-
285
- on:
286
- pull_request:
287
- branches: [main]
288
-
289
- permissions:
290
- contents: read
291
- pull-requests: read
292
-
293
- jobs:
294
- dry-run:
295
- runs-on: ubuntu-latest
296
- steps:
297
- - uses: actions/checkout@v4
298
- with:
299
- fetch-depth: 0
300
- - uses: thekevinscott/put-it-out-there@v0
301
- with:
302
- command: plan
303
- dry_run: true
304
- fail_on_error: true
305
- `;
306
- export function releaseYml(cadence) {
307
- /* v8 ignore next -- exhaustive switch */
308
- return cadence === 'scheduled' ? RELEASE_YML_SCHEDULED : RELEASE_YML_IMMEDIATE;
309
- }
310
- //# sourceMappingURL=templates.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"templates.js","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAeH,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+B1B,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,UAAU,YAAY,CAAC,QAA8B,IAAI;IAC7D,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACrD,OAAO,kBAAkB,CAAC;IAC5B,CAAC;IACD,MAAM,MAAM,GAAG,KAAK,CAAC,iBAAiB,IAAI,qBAAqB,CAAC;IAChE,MAAM,MAAM,GACV,wBAAwB,MAAM,uBAAuB,KAAK,CAAC,UAAU,QAAQ;QAC7E,gFAAgF;QAChF,6CAA6C;QAC7C,gFAAgF,CAAC;IACnF,OAAO,MAAM,GAAG,kBAAkB,CAAC;AACrC,CAAC;AAED,yFAAyF;AACzF,MAAM,CAAC,MAAM,aAAa,GAAG,kBAAkB,CAAC;AAEhD,MAAM,CAAC,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BxB,CAAC;AAEF,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgFjB,CAAC;AAEF,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6CnB,CAAC;AAEF,MAAM,QAAQ,GAAG;;;;;;;;;;;;CAYhB,CAAC;AAEF,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;;;CAqBxB,CAAC;AAEF,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;;;CAqBxB,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,gBAAgB,GAAG,QAAQ,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,GAAG,WAAW,CAAC;AACzG,MAAM,CAAC,MAAM,qBAAqB,GAAG,gBAAgB,GAAG,QAAQ,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,GAAG,WAAW,CAAC;AAEzG,MAAM,CAAC,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;;;;;;CAsBxB,CAAC;AAEF,MAAM,UAAU,UAAU,CAAC,OAAgB;IACzC,yCAAyC;IACzC,OAAO,OAAO,KAAK,WAAW,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,qBAAqB,CAAC;AACjF,CAAC"}