@iodes/releasekit 0.1.3 → 0.1.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/README.md +49 -21
- package/dist/assets.d.ts +10 -0
- package/dist/assets.js +61 -0
- package/dist/cli.js +10 -7
- package/dist/content.d.ts +7 -0
- package/dist/content.js +104 -13
- package/dist/export.d.ts +2 -2
- package/dist/export.js +41 -27
- package/dist/images.d.ts +4 -1
- package/dist/images.js +37 -14
- package/dist/project.d.ts +1 -0
- package/dist/project.js +13 -0
- package/dist/prompts.js +8 -8
- package/examples/README.md +3 -1
- package/examples/location-preferences/README.md +5 -2
- package/examples/location-preferences/dark-neutral.png +0 -0
- package/examples/location-preferences/dark.prompt.md +10 -8
- package/examples/location-preferences/light-neutral.png +0 -0
- package/examples/location-preferences/light.prompt.md +10 -8
- package/examples/location-preferences/neutral-edit-requests.md +21 -0
- package/examples/location-preferences/pair-review.md +9 -8
- package/examples/location-preferences/scene.yaml +9 -6
- package/kit/references/common-images.md +56 -0
- package/kit/references/composition-recipes.md +3 -3
- package/kit/references/format.md +18 -2
- package/kit/references/media-sources.md +5 -3
- package/kit/references/theme-pairing.md +41 -4
- package/kit/references/visual-language.md +12 -6
- package/kit/references/workflow.md +47 -21
- package/kit/references/writing.md +101 -9
- package/kit/skills/releasekit-draft/SKILL.md +9 -3
- package/kit/skills/releasekit-finalize/SKILL.md +8 -2
- package/kit/skills/releasekit-image/SKILL.md +13 -7
- package/package.json +1 -1
package/kit/references/format.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Content contract
|
|
2
2
|
|
|
3
|
-
Project configuration is `releasekit/config.yaml`. Releases live under `releasekit/releases/<version>/`. Version IDs are filesystem-safe strings, not necessarily semantic versions. A release stores its configured locales and visual policy so future project-default changes do not rewrite past releases. New projects default to English originals (`sourceLocale: en-US`, `locales: [en-US]`).
|
|
3
|
+
Project configuration is `releasekit/config.yaml`. Releases live under `releasekit/releases/<version>/`. Version IDs are filesystem-safe strings, not necessarily semantic versions. A release stores its configured locales and visual policy so future project-default changes do not rewrite past releases. New projects default to English originals (`sourceLocale: en-US`, `locales: [en-US]`). On first use, the agent asks about optional translations only when language choices remain unresolved, then saves the selected source and translations in `releasekit/config.yaml` before preparation. Each new release copies the current project `sourceLocale`, `locales`, and visual policy. Later drafts use those configured languages without asking again, including a single-language choice. Previous releases' language selections do not override config. Explicit release-only language changes are saved in the affected `release.yaml`, preserving project defaults and other releases.
|
|
4
4
|
|
|
5
5
|
Optional `history.start` in the project config records first-use setup: `ref` is the original commit/tag label, `sha` is its immutable commit, `past` is `summary`, `history`, or `skip`, and `version` is the baseline release ID for summary/history or null for skip. `releasekit start` saves this once before any release exists. It creates no content. Existing configs without this field retain the explicit-range workflow. See [first-use setup](adoption.md).
|
|
6
6
|
|
|
@@ -14,6 +14,16 @@ Within one release:
|
|
|
14
14
|
| `prompts/<id>.<theme>.md` | Generation requests for pending generated variants; supplied images have no generation request |
|
|
15
15
|
| `assets/` | Selected raster files with content-derived names |
|
|
16
16
|
|
|
17
|
+
`visuals.accent` makes a project color available for generated images; it does not require that color in every image. In the shared scene's `composition`, record no accent or the exact colored element and its supported state, action, or information meaning. Keep that assignment in `preserve`; neutral scenes remain neutral in both themes.
|
|
18
|
+
|
|
19
|
+
Each `(version, note.id, variant)` has one selected image. Importing replaces the selected slot and then removes unused managed images belonging to this note, including obsolete shared or themed imports. Files referenced by any visual variant or scene in the project are retained, as are other notes' files and source originals outside the note's managed assets. Reimporting identical content reuses its file. Keep existing variant entries until the replacement import succeeds.
|
|
20
|
+
|
|
21
|
+
Importing `--theme shared` replaces the note's dark/light entries with one shared entry. Importing `--theme dark` or `light` replaces a shared entry and keeps compatible themed entries. Optional `--source generated|provided` updates `scene.source` in the same save as the imported selection; omission preserves the current source. Shared imports require supplied media, and supplied-only subjects still reject generated media. The CLI validates the file before saving, so decoding or metadata-save failure preserves the previous source and selections. A missing configured counterpart stays pending after the first themed import and blocks finalization. See [image transitions](theme-pairing.md#switch-between-shared-and-themed-images).
|
|
22
|
+
|
|
23
|
+
`releasekit note remove <version> <id>` is available only for drafts. It removes the ordered metadata entry, `notes/<id>/` with all locale files, `visuals/<id>.yaml`, `prompts/<id>.<variant>.md`, and unused managed raster imports associated with the note, including older variants. Managed imports use `assets/<id>.<variant>.<12-character-hash>.(png|jpg|webp)` names. Files still referenced by any remaining visual are retained; manually named assets and external source originals are preserved. References to the note's text, brief, or prompts must be resolved before removal. The CLI reports removed paths and retained assets. A failed metadata save restores the removed files; any subsequent cleanup failure is reported with the recovery directory rather than as a successful cleanup.
|
|
24
|
+
|
|
25
|
+
Adding a note creates the release's saved locale files and clears `emptyReason`. Notes are image-enabled by default; `--no-image` records an explicit text-only choice. The agent keeps this default for all notes rather than selecting an illustrated subset. Removing the last note does not invent an empty-release reason: the draft needs another note or a factual `emptyReason` before finalization. Ready releases must be reopened before either operation.
|
|
26
|
+
|
|
17
27
|
Preparation writes only `release.yaml`: `source` records the immutable Git boundaries, and each note later records its relevant commits or paths. No full patch or separate changed-file index is stored. Draft validation checks note references against the pinned Git range or the baseline snapshot for a summary; finalization fingerprints the metadata, note text, and visual briefs. Ready content can be validated and exported without Git history.
|
|
18
28
|
|
|
19
29
|
Optional `initialContent` in a baseline release snapshots the selected `summary` or `history` mode. Either mode requires `source.fromRef: null`, `source.fromSha: null`, and `previous: null`. A summary describes the product at `source.toSha`; its evidence may reference only that SHA or tracked paths in that snapshot. History mode analyzes the full history through that SHA with normal range evidence. This distinction is preserved in the content fingerprint but excluded from consumer JSON. An absent field keeps the existing range semantics, including full history when `fromSha` is null; loading old files adds no defaults or changes to their fingerprints.
|
|
@@ -22,12 +32,18 @@ The next release begins after the baseline SHA and links to its version with `pr
|
|
|
22
32
|
|
|
23
33
|
Notes are ordered by their entries in `release.yaml`. Note IDs are unique within a version and shared across locales. Their consumer identity is the pair `(version, note.id)`; never deduplicate different releases by note ID or title alone.
|
|
24
34
|
|
|
35
|
+
A grouped minor-change note uses the same contract: one note ID, category `fix` or `improvement`, a localized summary title, and an unordered Markdown list in the body. Its metadata carries the evidence paths or commits covering all bullets. Bullets have no separate note records or images; the group uses the normal image and translation policy and exports as one note with its list in `bodyMarkdown`. See [grouping guidance](writing.md#group-minor-changes) for selection and titles.
|
|
36
|
+
|
|
37
|
+
Optional `releasekit/common-images/minor-fixes/` and `releasekit/common-images/minor-improvements/` hold reviewed project originals under [the common-image convention](common-images.md). Each contains a `visual.yaml` source record, a `policy.yaml` copy of the original visual policy, and its selected raster files. Common asset paths are relative to that source directory; the agent imports their files into each release and keeps selected release asset paths local. The CLI does not automatically discover these source records, and the existing release and bundle schemas stay the same.
|
|
38
|
+
|
|
25
39
|
Frontmatter fields are `title`, `alt`, and `sourceHash`. The source locale normally uses `sourceHash: null`. Translation marking records a fingerprint of the source title, alt text, and body. An image-free note can use empty alt text. An image-enabled note requires a complete visual brief and its active image assets before finalization. Its scaffold leaves `archetype` and `source` unselected; the authoring agent chooses both from the note and product evidence.
|
|
26
40
|
|
|
27
41
|
`scene.source` is `generated` or `provided`. Legacy briefs may omit it: `object-detail` and `editorial-scene` use supplied media; other categories default to generated graphics. Those two supplied-only categories reject an explicit `generated` choice. For generated media, `variants` contains the configured dark/light pair or single theme. Supplied media can contain just `shared`, or distinct dark/light entries following project policy. Do not mix shared and themed entries. The shared slot retains native dimensions and bytes, does not depend on presentation palettes, and exports as one asset with `fallbackTheme: shared`. Missing supplied inputs remain pending. See [media sources](media-sources.md).
|
|
28
42
|
|
|
29
43
|
The `releasekit-finalize` skill reviews the release and runs `releasekit finalize`. This CLI command checks references and content, then records `status: ready` and a content fingerprint. A later edit invalidates that fingerprint. Reopen the draft before changing content; publishing is a separate user-controlled workflow.
|
|
30
44
|
|
|
31
|
-
The generated JSON schemas shipped with the package are the structural source of truth. `releasekit export
|
|
45
|
+
The generated JSON schemas shipped with the package are the structural source of truth. `releasekit export --out <directory>` produces one `release-notes.<locale>.json` per locale saved in the current release, with shared relative image assets in `assets/`. `--locale <locale>` selects one language and keeps the same filename pattern. Each JSON file uses the existing bundle schema and includes only display fields, configured image variants, its locale, and explicit version groups. Source patches, prompts, internal paths, and Git evidence are not included. Consumers should safely render `bodyMarkdown` and use image `variants[theme]` or `variants[fallbackTheme]` without recoloring the raster.
|
|
46
|
+
|
|
47
|
+
Only `--out` is required. Without `--current`, export selects the unique release that no other saved release names as `previous`, regardless of version spelling, date, or directory order. No releases or cyclic links prevent automatic selection; multiple endpoints require `--current`. A draft endpoint must be finalized before export. Without `--limit`, export uses project `history.limit` (initially 3), following `previous` links. The locales saved in the current release determine the default language set, independently of later project configuration changes. Every selected release must contain each requested locale; missing or stale translations fail the whole export before creating output. The command result contains a `files` array of JSON paths, a `releases` count of version groups, and an `assets` count of image files copied once across locales.
|
|
32
48
|
|
|
33
49
|
An export destination must not already exist. This avoids overwriting content or mixing assets from separate builds. Validation completes before the destination is created.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Choosing the image source
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Choose a truthful source for each note's image before composition and rendering: a supported generated explanation or approved supplied media. When a real capture or approved artwork is required but unavailable, request it and keep the image pending. Follow [image coverage](theme-pairing.md#coverage-and-repeat-runs); omit images only for the user's explicit text-only choices.
|
|
4
4
|
|
|
5
5
|
| Source | Appropriate use | Agent action |
|
|
6
6
|
| --- | --- | --- |
|
|
@@ -13,6 +13,8 @@ Use `provided` for another category whenever a real capture explains it better.
|
|
|
13
13
|
|
|
14
14
|
For a map, distinguish an illustrative spatial explanation from an actual place, computed route, or coverage claim. Exact geography and routing need an approved map capture or verified source. Request a supplied image when that evidence is missing. Generated fictional geography is suitable only when explicitly identified as illustrative; visual plausibility does not establish geographic accuracy.
|
|
15
15
|
|
|
16
|
+
Grouped minor notes should first follow [common-image reuse](common-images.md). An already generated and reviewed original can be imported again with its generated source and matching theme policy; it does not need another generation or a change to `provided` merely because it is reused.
|
|
17
|
+
|
|
16
18
|
## Missing input
|
|
17
19
|
|
|
18
20
|
`releasekit image plan <version>` returns `action: provide` with `promptFile: null` when supplied media is needed. The instruction identifies the subject and import slot. Reuse available approved project files first. Otherwise ask the user for the specific capture, photograph, or content image. Continue independent copy and translation work while the asset is pending. Do not treat a missing capture as permission to synthesize its content.
|
|
@@ -27,8 +29,8 @@ A native photo, content image, or screenshot often has one authentic appearance.
|
|
|
27
29
|
releasekit image import 1.4.0 product-detail --theme shared --file ./approved-capture.png
|
|
28
30
|
```
|
|
29
31
|
|
|
30
|
-
This requires `source: provided
|
|
32
|
+
This requires `source: provided`; pass `--source provided` with the import to change the source and selected image together. The CLI copies the selected bytes unchanged. `variants.shared` stores one asset; the public bundle exports one file with `fallbackTheme: shared`. The normal consumer lookup, `variants[theme] ?? variants[fallbackTheme]`, displays that file in either viewer theme. A shared slot is not a fabricated pair and does not require a second generation or duplicate file. Its original dimensions and colors are retained.
|
|
31
33
|
|
|
32
|
-
If the product actually supplies distinct dark/light captures, import those with `--theme dark` and `--theme light`. Once one themed capture is imported, the plan requests the remaining configured capture.
|
|
34
|
+
If the product actually supplies distinct dark/light captures, import those with `--theme dark` and `--theme light`. Once one themed capture is imported, the plan requests the remaining configured capture. The CLI switches between shared and themed selections during import; keep the previous entries until it succeeds. See [image transitions](theme-pairing.md#switch-between-shared-and-themed-images). A missing theme is never generated as a substitute for an authentic capture.
|
|
33
35
|
|
|
34
36
|
Inspect the content and crop before import. Keep the original source while preparing any user-authorized crop or presentation adjustment. Theme changes must not alter product content. File validation checks bytes and metadata; the agent's review establishes whether the selected media is the appropriate approved source.
|
|
@@ -10,9 +10,19 @@ This generation policy does not require inventing a second appearance for suppli
|
|
|
10
10
|
|
|
11
11
|
Policy is captured in each release when it is prepared. Editing the project default affects new releases. To apply the current project policy to an existing draft, run `releasekit image plan <version> --sync-config`. Previously selected files are retained; themes disabled by the new policy are not exported. Ready releases must be reopened before their policy changes.
|
|
12
12
|
|
|
13
|
+
## Coverage and repeat runs
|
|
14
|
+
|
|
15
|
+
The default image scope is every note in the saved release, including grouped minor fixes and improvements. A grouped note has one visual brief and the configured image variants; its bullets do not become separate notes or image requests. Use [common images](common-images.md) to reuse the appropriate original across releases before planning new generation. Review the current `release.yaml` each time so newly added notes are included. A plain `releasekit-image` invocation uses this full scope without asking the user to pick important notes. Honor an explicitly limited request and the user's explicit text-only choices. If earlier agent prioritization disabled a note's image without such a choice, restore `image: true` and create or complete its visual brief in place, preserving its text, translations, and existing assets. Do not recreate the note. Missing supplied media stays pending instead of making the note text-only.
|
|
16
|
+
|
|
17
|
+
Before planning, complete missing or unfinished briefs for the image-enabled notes. Preserve existing scene specifications and the release's captured theme policy when they have not been changed by the user's request. Import compatible common originals first, then run `releasekit image plan <version>` from the current saved state and handle the remaining requests across all notes. Respect `action: generate` versus `action: provide` and the configured dark/light or shared variants.
|
|
18
|
+
|
|
19
|
+
On repeat runs, generate or import only missing images and missing required variants. Reuse existing valid imports and their completed reviews; do not regenerate an accepted image merely because the skill was invoked again. This includes a run after the user adds notes: complete those notes' missing images while retaining earlier ones. If everything is already current, generate nothing and provide the image-review and finalization guidance.
|
|
20
|
+
|
|
21
|
+
An existing image reported as stale or invalid is unresolved, even though its file exists. Name the affected note and the reason, preserve the current selection, and offer a targeted correction; a missing-images request alone does not authorize replacing it. An explicit request to edit, regenerate, or replace an image applies to that target even when the plan considers it current; follow [replacement handling](#replace-or-regenerate-an-image). Keep other accepted images intact and check affected theme counterparts when the scene changes. Do not claim complete coverage or recommend finalization while required assets remain unresolved.
|
|
22
|
+
|
|
13
23
|
## One scene, two presentation treatments
|
|
14
24
|
|
|
15
|
-
Both outputs share the same scene brief. Lock subject identity, geometry, object count, positions, scale, crop, camera, UI topology, action state, chart values, and any allowed literal labels. Change presentation surfaces, neutral values, lighting, shadows, and necessary edge separation. Preserve meaningful status colors and natural photographic or material colors.
|
|
25
|
+
Both outputs share the same scene brief. Lock subject identity, geometry, object count, positions, scale, crop, camera, UI topology, action state, chart values, and any allowed literal labels. Change presentation surfaces, neutral values, lighting, shadows, and necessary edge separation. Preserve meaningful status colors and natural photographic or material colors. Lock the absence of accent for a neutral scene; when accent is justified, keep it on the same meaningful elements in both variants. A theme change does not introduce an accent.
|
|
16
26
|
|
|
17
27
|
| Role | Dark treatment | Light treatment |
|
|
18
28
|
| --- | --- | --- |
|
|
@@ -21,7 +31,7 @@ Both outputs share the same scene brief. Lock subject identity, geometry, object
|
|
|
21
31
|
| Primary neutral symbol | Legible mid-light neutral | Legible mid-dark neutral |
|
|
22
32
|
| Secondary detail | Subdued, still distinguishable | Subdued, still distinguishable |
|
|
23
33
|
| Contact shadow | Soft, with enough local separation | Light, restrained, never muddy |
|
|
24
|
-
|
|
|
34
|
+
| Optional interaction or status color | Preserve assignment and semantic hue, or keep absent | Preserve assignment and semantic hue, or keep absent |
|
|
25
35
|
| Photo or product material | Preserve authentic appearance | Preserve authentic appearance |
|
|
26
36
|
|
|
27
37
|
Do not invert pixels or shift brightness globally. A black lens remains a black lens on a light canvas. A warning remains the same warning color. If the underlying application has only one authentic UI theme, retain that UI and adapt the surrounding presentation rather than claiming an unsupported application theme.
|
|
@@ -29,13 +39,40 @@ Do not invert pixels or shift brightness globally. A black lens remains a black
|
|
|
29
39
|
## Generation sequence
|
|
30
40
|
|
|
31
41
|
1. Complete the shared brief and inspect its product references.
|
|
32
|
-
2. Read the image plan and the project's requested themes. Reuse existing current assets. The following rendering steps apply to `action: generate`; handle `action: provide` through the supplied-image workflow.
|
|
42
|
+
2. Read the current image plan and the project's requested themes. Reuse existing current assets and import any suitable [common originals](common-images.md), then refresh the plan. The following rendering steps apply to `action: generate`; handle `action: provide` through the supplied-image workflow.
|
|
33
43
|
3. Generate one requested variant using its prompt. Select and inspect the result.
|
|
34
44
|
4. Import it. Re-run the image plan; a valid approved counterpart is now offered as a composition reference for the other theme.
|
|
35
45
|
5. When the available tool supports image references or edits, use the counterpart for a constrained theme edit. Otherwise repeat the exact scene contract and inspect for layout drift. Never claim pixel-identical geometry from independent stochastic generations.
|
|
36
46
|
6. Compare the pair. Both files should have the same pixel dimensions. Verify pose, crop, UI state, values, and semantic colors by sight, then import the selected counterpart.
|
|
37
47
|
|
|
38
|
-
Use one file per theme, not a split canvas or a two-panel comparison image. Keep
|
|
48
|
+
Use one file per theme, not a split canvas or a two-panel comparison image. Keep the current selection until a reviewed replacement is imported into the same slot. Do not restart the entire release when one small defect can be corrected locally.
|
|
49
|
+
|
|
50
|
+
## Replace or regenerate an image
|
|
51
|
+
|
|
52
|
+
Treat replacement and regeneration as an edit to the existing release, note ID, and affected theme. Reopen a ready release as a draft before editing it. Reuse its scene brief and current assets as needed for the requested correction. A request to regenerate an image still needs work even if the unchanged asset is reported as current by the plan; report the requested replacement as pending until it has been generated, reviewed, and imported.
|
|
53
|
+
|
|
54
|
+
Keep the existing variant metadata while preparing the candidate, then run `releasekit image import <version> <note> --theme <theme> --file <selected-file>` for the same slot. Import validates the candidate and saves the new selection before removing unused managed images for this note, including older imports and obsolete shared/themed files. Reimporting identical bytes reuses the same file. Other selected variants, notes, releases, declared image references, and original source files outside the note's managed assets are preserved. If decoding or saving fails, the previous source and selection remain intact; report the replacement as pending.
|
|
55
|
+
|
|
56
|
+
Keep temporary generation candidates outside the release's `assets/` directory and remove task-created discarded candidates when the replacement is complete. Do not add a new note or clear the old variant entry to make a replacement request. A replacement that remains one shared supplied image stays in the `shared` slot. Use [the transition flow](#switch-between-shared-and-themed-images) when the requested replacement changes between shared and themed usage.
|
|
57
|
+
|
|
58
|
+
### Switch between shared and themed images
|
|
59
|
+
|
|
60
|
+
Keep the current variant entries while preparing and reviewing the replacement. Import with the requested target `--theme`; the CLI replaces incompatible shared or themed entries automatically and cleans unused managed images after saving. When the requested media source also changes, pass `--source provided` or `--source generated` so that source and selection are saved together. Do not pre-clear variants or separately change `scene.source` merely to perform this transition.
|
|
61
|
+
|
|
62
|
+
For example, replace generated dark/light illustrations with one approved capture:
|
|
63
|
+
|
|
64
|
+
```sh
|
|
65
|
+
releasekit image import 1.4.0 queue-action --theme shared --source provided --file ./approved-capture.png
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
To replace that shared image with distinct approved theme captures:
|
|
69
|
+
|
|
70
|
+
```sh
|
|
71
|
+
releasekit image import 1.4.0 queue-action --theme dark --file ./approved-dark.png
|
|
72
|
+
releasekit image import 1.4.0 queue-action --theme light --file ./approved-light.png
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
The source remains supplied when `--source` is omitted. For a requested generated explanation instead, use `--source generated` on the first themed import; supplied-only subjects still require real media. Use only the release's configured themes. The first themed import replaces the shared selection, while any required counterpart remains pending until imported. Never synthesize or duplicate a supplied counterpart or describe a partial pair as complete. A source or scene change can also make an existing themed counterpart stale; review and refresh that affected image before finalization.
|
|
39
76
|
|
|
40
77
|
## External generation handoff
|
|
41
78
|
|
|
@@ -10,7 +10,7 @@ Select the simplest useful archetype in [composition-recipes.md](composition-rec
|
|
|
10
10
|
|
|
11
11
|
Choose [generated or supplied media](media-sources.md) before rendering. Generate restrained flat explanations; use actual captures, photographs, or approved artwork when the appearance itself is the subject. Physical details and content previews require supplied images. A missing source stays pending; a fictional written scene is not a replacement for an actual product or content capture.
|
|
12
12
|
|
|
13
|
-
For each note, derive the scene from that feature independently. Describe the relevant state and relationships: a control's state, two capabilities' association, a physical assembly, spatial connections, data proportions, or the announced content. Record supported facts and limits in `context`; write concrete correctness constraints in `composition`, `preserve`, and `avoid`. Those constraints are local to the note. A worked example supplies a reasoning pattern, not a layout to apply to other features. The agent chooses the representation and reviews its meaning; the CLI compiles the chosen brief and validates files.
|
|
13
|
+
For each standalone note, derive the scene from that feature independently. Grouped minor notes follow [common-image reuse](common-images.md), keeping one generic scene per kind across releases and languages instead of deriving a new scene from each bullet list. Describe the relevant state and relationships: a control's state, two capabilities' association, a physical assembly, spatial connections, data proportions, or the announced content. Record supported facts and limits in `context`; write concrete correctness constraints in `composition`, `preserve`, and `avoid`. Those constraints are local to the note. A worked example supplies a reasoning pattern, not a layout to apply to other features. The agent chooses the representation and reviews its meaning; the CLI compiles the chosen brief and validates files.
|
|
14
14
|
|
|
15
15
|
## Composition grammar
|
|
16
16
|
|
|
@@ -31,15 +31,21 @@ Separate the canvas, base surface, raised surface, primary symbol, secondary det
|
|
|
31
31
|
|
|
32
32
|
On dark backgrounds, distinguish charcoal layers and use mid-light neutral symbols. Do not crush a dark object into the canvas or turn every small glyph pure white. On light backgrounds, use near-white space, subtle gray separation, and darker neutral symbols. A dark device or natural photo may stay dark in a light presentation.
|
|
33
33
|
|
|
34
|
-
For icons, use a compact flat rounded-square tile with a monochrome filled glyph and clear negative space. A typical tile occupies 20–24% of the canvas width, with the glyph around 50–65% of the tile width. Keep broad margins, uniform background fills, and related corner radii. Use color only when the feature gives it a functional meaning. Do not default to a colored badge, physical object, or modeled icon.
|
|
34
|
+
For icons, use a compact flat rounded-square tile with a neutral monochrome filled glyph and clear negative space. A typical tile occupies 20–24% of the canvas width, with the glyph around 50–65% of the tile width. Keep broad margins, uniform background fills, and related corner radii. Use color only when the feature gives it a functional meaning. Do not default to a colored badge, physical object, or modeled icon.
|
|
35
35
|
|
|
36
36
|
Flat icons and symbol pairs have no perspective, extrusion, material texture, gradients, lighting, or shadows. Simplified interfaces may use restrained layer separation where it explains the actual control hierarchy. Preserve shading already present in supplied media. Do not add sculpted objects, decorative 3D, studio lighting, glass, glow, or bevels to generated release illustrations.
|
|
37
37
|
|
|
38
38
|
## Color has a job
|
|
39
39
|
|
|
40
|
-
|
|
40
|
+
Start with a fully neutral composition. Establish the focal point through placement, scale, shape, spacing, and value contrast. An image can be complete without any accent, and a release can contain many entirely neutral images. A new feature, an important capability, or the main subject does not by itself represent an active or selected state.
|
|
41
41
|
|
|
42
|
-
|
|
42
|
+
Treat the project accent as an available color, not an instruction to use it. Add it only when a specific supported state, action, or information distinction needs color to explain the change: for example, an enabled switch, a selected item, a revealed action, or an active route. Even an interaction can remain neutral when its geometry and value contrast already make it clear. Keep the colored area confined to that meaningful element; leave unrelated glyphs, tiles, and supporting surfaces neutral.
|
|
43
|
+
|
|
44
|
+
In the shared scene's `composition`, explicitly state either that no accent is used or which element uses it and what it communicates. Preserve that assignment, including the absence of accent, in both themes. Do not invent a selection, badge, status dot, or secondary marker to justify color. For `icon-tile`, ordinary capability and maintenance symbols stay neutral. For `symbol-pair`, a simple association uses the same neutral treatment for both symbols.
|
|
45
|
+
|
|
46
|
+
Preserve established meanings such as warnings, completed states, traffic or map semantics, chart categories, and authentic content colors between themes. These colors belong to supported information; a generic improvement or security note is not itself a success or protection status.
|
|
47
|
+
|
|
48
|
+
Functional color remains available for colorful features. A supplied capture of a creative tool can retain its colorful output. A spatial view can require several functional colors. Actual content artwork retains its original appearance. The color should belong to the feature, rather than decorate a routine release card.
|
|
43
49
|
|
|
44
50
|
## Language independence
|
|
45
51
|
|
|
@@ -68,6 +74,6 @@ Make the brief concrete enough that another model can render the same scene. “
|
|
|
68
74
|
|
|
69
75
|
## Review the actual output
|
|
70
76
|
|
|
71
|
-
Inspect the selected image at full resolution and at roughly 350 pixels wide. First compare the image with the release note, product evidence, and scene-specific constraints; use the chosen recipe's correctness checks. Then assess whether the changed capability reads in a moment, the focal object remains distinct, incidental detail stays subordinate, and every explicit label and crop is correct. Attractive styling and theme similarity do not establish factual or structural correctness.
|
|
77
|
+
Inspect the selected image at full resolution and at roughly 350 pixels wide. First compare the image with the release note, product evidence, and scene-specific constraints; use the chosen recipe's correctness checks. Then assess whether the changed capability reads in a moment, the focal object remains distinct, incidental detail stays subordinate, and every explicit label and crop is correct. For each accent, identify the supported meaning that would become less clear without it; if there is none, remove it. Review the release images together for repeated decorative accents. Do not give every note one colored point or enforce a fixed quota of colored images. Attractive styling and theme similarity do not establish factual or structural correctness.
|
|
72
78
|
|
|
73
|
-
For a pair, compare both outputs side by side using [theme-pairing.md](theme-pairing.md). Automated checks establish file integrity, dimensions, configured variants, and scene freshness; they do not prove visual correspondence or truthfulness. Correct a specific defect with a targeted edit instead of randomly regenerating every asset. Preserve accepted
|
|
79
|
+
For a pair, compare both outputs side by side using [theme-pairing.md](theme-pairing.md). Automated checks establish file integrity, dimensions, configured variants, and scene freshness; they do not prove visual correspondence or truthfulness. Correct a specific defect with a targeted edit instead of randomly regenerating every asset. Preserve unrelated accepted assets. Import a reviewed replacement into the same note and theme slot so unused older managed files are removed; keep the previous selection until that import succeeds.
|
|
@@ -4,19 +4,30 @@ Use the installed `releasekit` CLI, or the repository's compiled CLI when develo
|
|
|
4
4
|
|
|
5
5
|
## Create or continue
|
|
6
6
|
|
|
7
|
-
The normal skill flow is `releasekit-draft` (source and selected translations), `releasekit-image` (required assets), then `releasekit-finalize` (review, validation, and local confirmation). Translation-only edits also belong to `releasekit-draft`. Skip image work for a text-only
|
|
7
|
+
The normal skill flow is `releasekit-draft` (source and selected translations), `releasekit-image` (required assets), then `releasekit-finalize` (review, validation, and local confirmation). Translation-only edits also belong to `releasekit-draft`. Skip image work for a release the user explicitly chose to keep text-only; export follows finalization only when requested.
|
|
8
8
|
|
|
9
|
-
1. Read `releasekit/config.yaml` and any existing `release.yaml`. [
|
|
9
|
+
1. Read `releasekit/config.yaml` and any existing `release.yaml`. [Resolve languages](#choose-languages) from current project settings for a new draft or the saved selection for an existing draft. Ask only when a first-use choice or requested language change remains unresolved. Save the first-use selection in project config before preparation. Honor the theme policy and product context.
|
|
10
10
|
2. For a new release, [resolve the version and Git boundaries from the repository](#resolve-release-scope-from-the-repository). Reuse explicit choices and saved boundaries, inspect the relevant release line, and supply the CLI arguments yourself. Briefly state the selected scope and continue when the evidence is clear. For first-use requests with unresolved earlier-history scope, follow [the adoption guide](adoption.md) to summarize, analyze, or skip the period through the baseline.
|
|
11
11
|
3. Run `releasekit prepare`. It creates only `release.yaml`, including the pinned comparison start and end SHAs. Inspect the pinned Git evidence as described below: baseline summaries read the snapshot; other drafts read history, changed paths, and relevant diffs. Do not save a full patch or a separate changed-file index.
|
|
12
|
-
4. Save the selected `sourceLocale` and `locales` in this release before adding notes with `releasekit note add <version> <id>`. Fill the source Markdown and attach evidence paths or commit SHAs to `release.yaml`, using snapshot evidence for a baseline summary.
|
|
12
|
+
4. Save the selected `sourceLocale` and `locales` in this release. Use [Group minor changes](writing.md#group-minor-changes) to select standalone notes and separate minor-fix and minor-improvement groups before adding notes with `releasekit note add <version> <id>`. Give each group the corresponding `--category fix` or `--category improvement`; its bullet items do not get separate notes. Fill the source Markdown and attach evidence paths or commit SHAs to `release.yaml`, using snapshot evidence for a baseline summary. Keep every note image-enabled by default; use `--no-image` only for the user's explicit text-only choice, never to select just the important notes.
|
|
13
13
|
5. As part of `releasekit-draft`, [translate the selected locales](#translate-selected-locales) and mark reviewed translations current. Finish the source and selected translations before recommending image work, unless the user explicitly limited the draft scope.
|
|
14
|
-
6. Use `releasekit-image` to
|
|
14
|
+
6. Use `releasekit-image` to cover all current drafted notes, including later additions, under [the coverage policy](theme-pairing.md#coverage-and-repeat-runs). For minor groups, [reuse common originals](common-images.md) before generating new images. Choose generated or supplied media and complete each missing visual brief, reusing existing valid images on repeat runs. Run `releasekit image plan`, then handle each request by its action: generate configured variants for `generate`, or find/request an approved capture/image for `provide`. Review and import selected files, using one shared supplied asset when appropriate. Preserve unrelated accepted images and manual edits. For a replacement or regeneration, import into the same note with the intended theme; follow [image transitions](theme-pairing.md#switch-between-shared-and-themed-images) when changing shared/themed usage. Unused managed files are removed after the new selection is saved.
|
|
15
15
|
7. Use `releasekit-finalize` to review factual and visual accuracy, run `releasekit validate <version>`, resolve errors and review warnings, then run `releasekit finalize <version>`. Confirm `status: ready` and a recorded content fingerprint. Review is part of finalization; a validation report alone does not complete this step.
|
|
16
|
-
8. If requested, export
|
|
16
|
+
8. If requested, run `releasekit export --out <directory>` to export recent history to a new output directory. Omit `--current` to use the unique release with no successor in the saved `previous` links; pass an explicitly requested version or resolve multiple release endpoints with `--current <version>`. Omit `--limit` to use project `history.limit` (initially 3). Omit `--locale` to export all locales saved in the current release as separate `release-notes.<locale>.json` files sharing one `assets/` directory; pass it only when the user requests a specific output language. Every selected version must contain those locales. A finalized release is a complete local result even without an export. Finalization does not tag, commit, push, deploy, or publish anything.
|
|
17
17
|
|
|
18
18
|
For an existing draft, read and edit the existing content. `prepare` never overwrites a release. Do not recreate a folder as a shortcut for refreshing one note. Reopen a ready release by setting `status: draft` and `contentHash: null`, then make the targeted change and finalize again.
|
|
19
19
|
|
|
20
|
+
## Revise draft notes
|
|
21
|
+
|
|
22
|
+
Use the user's requested feature or wording to identify the affected notes in the saved release. Keep its pinned Git boundaries and other releases unchanged. The user can ask for copy changes, exclude a feature, or include a feature that the draft missed without invoking a skill manually.
|
|
23
|
+
|
|
24
|
+
- For wording changes, edit the existing source and refresh affected translations. If only part of a note is excluded, revise that note and its visual brief as needed.
|
|
25
|
+
- To consolidate minor notes, follow [the grouping guidance](writing.md#group-minor-changes). Reuse the release's existing group or add one with `--category fix` or `--category improvement`. Save the supported content, manual edits, and combined evidence in the group, and preserve coverage in every selected locale before removing the superseded notes with the CLI as described below. Refresh affected translations and fingerprints, and review the group's visual brief and alt text if its scope changed. A change only to the minor bullet list preserves the generic common scene and current images; follow [common-image reuse](common-images.md). Leave unrelated notes and other releases intact.
|
|
26
|
+
- To include an omitted feature, verify it against the pinned evidence. For a minor change, reuse its group or create one with the appropriate `--category fix` or `--category improvement`. For a change that warrants individual attention, extend a related standalone note or run `releasekit note add <version> <id>`. Write or update the affected source, selected translations, and evidence. New notes are image-enabled by default; use `--no-image` only when the user explicitly asks for text-only content. Keep required images pending so the next `releasekit-image` run picks up the new note. Explain a requested feature outside the saved scope instead of silently expanding the Git range.
|
|
27
|
+
- To exclude an entire note, run `releasekit note remove <version> <id>`. Let the CLI remove its metadata entry, complete note folder, visual brief, generated prompts, and unused managed images. Removing only the `release.yaml` entry leaves files behind. The command preserves assets referenced by remaining visuals, including other releases, and source originals outside managed assets; report any retained shared assets. If another scene references the note's text, brief, or prompts, resolve that dependency before removal.
|
|
28
|
+
|
|
29
|
+
After additions or removals, validate the release and report outstanding copy, translation, or image work. The CLI clears a previous `emptyReason` when adding a note. Removing the last note leaves an editable empty draft; add another note or write a factual `emptyReason` before finalization. Do not invent a reason to hide an unfinished draft. A failed metadata save restores removed files or rolls back newly added note files.
|
|
30
|
+
|
|
20
31
|
## Resolve release scope from the repository
|
|
21
32
|
|
|
22
33
|
Treat versions, tags, commit SHAs, and CLI arguments as repository discovery work. Missing flags in the user's request are not by themselves a reason to open the question UI. Read the request, saved releases, applicable history-start settings, local tags, and release metadata before deciding that scope is missing.
|
|
@@ -32,17 +43,17 @@ Ask only when inspection leaves materially different scopes, such as competing p
|
|
|
32
43
|
|
|
33
44
|
## Choose languages
|
|
34
45
|
|
|
35
|
-
|
|
46
|
+
For every new draft, use the current `sourceLocale` and complete ordered `locales` list from `releasekit/config.yaml`. Once the project has saved releases, proceed without a language picker, alternative language suggestions, or confirmation, including when config selects only one language. Previous releases supply history boundaries; their language lists do not override current project settings. The conversation language does not change configured languages. For an existing draft, reuse its saved selection unless the user explicitly requests a change.
|
|
36
47
|
|
|
37
|
-
|
|
48
|
+
Only on first use with no saved releases, honor explicit language choices and intentional project settings first. If translations remain unchosen, ask one concise question in the user's language using the [native question UI](#ask-with-the-native-question-ui) when available. Use English (`en-US`) as the default original and ask which additional translations, if any, to include. Suggest the user's current language first, using an explicit language preference when available and otherwise the current conversation; it does not change the original language. Do not detect or persist translation languages from the CLI host's operating-system locale.
|
|
38
49
|
|
|
39
|
-
For a Korean-speaking user, recommend English original with Korean translation, and offer English only as an alternative. Explicitly invite the user to enter additional languages, for example Korean, Japanese, and German together, using the tool's built-in free-text input. Accept language names or locale codes and keep that input available; do not duplicate a built-in Other option or assume multi-select support. Each option should describe a complete translation set. If the user's language is the same as the source, recommend the source alone and invite other translations without proposing a duplicate; regional variants require an explicit request. If the current language cannot be inferred, ask for optional translation languages without inventing a recommendation.
|
|
50
|
+
For that first-use question with a Korean-speaking user and the default English source, recommend English original with Korean translation, and offer English only as an alternative. Explicitly invite the user to enter additional languages, for example Korean, Japanese, and German together, using the tool's built-in free-text input. Accept language names or locale codes and keep that input available; do not duplicate a built-in Other option or assume multi-select support. Each option should describe a complete translation set. If the user's language is the same as the source, recommend the source alone and invite other translations without proposing a duplicate; regional variants require an explicit request. If the current language cannot be inferred, ask for optional translation languages without inventing a recommendation.
|
|
40
51
|
|
|
41
|
-
Reuse choices already specified for this release, including an explicit request to use configured languages or no translations. A language list supplied in answer to the translation question adds translation targets while retaining the source; do not ask which is the original merely because several languages were entered. An explicit request to write only in one language sets that source with no translations, and an explicit source-language change takes precedence over the English default. Ask only for an unresolved choice. While a necessary translation answer is pending, follow [the answer-waiting procedure](#wait-for-the-users-answer) before preparing the release, scaffolding notes, or writing copy; independent Git inspection may continue. A preselected option or an unanswered prompt does not confirm translations.
|
|
52
|
+
An explicit language-change request takes precedence over the configured or saved selection. Reuse choices already specified for this release, including an explicit request to use configured languages or no translations. A language list supplied in answer to the translation question adds translation targets while retaining the source; do not ask which is the original merely because several languages were entered. An explicit request to write only in one language sets that source with no translations, and an explicit source-language change takes precedence over the English default. Ask only for an unresolved choice. While a necessary translation answer is pending, follow [the answer-waiting procedure](#wait-for-the-users-answer) before preparing the release, scaffolding notes, or writing copy; independent Git inspection may continue. A preselected option or an unanswered prompt does not confirm translations.
|
|
42
53
|
|
|
43
|
-
Use locale codes such as `en-US`, `ko-KR`, and `ja-JP` in the files. New project configuration starts with `sourceLocale: en-US` and `locales: [en-US]`; translation suggestions are not enabled until selected.
|
|
54
|
+
Use locale codes such as `en-US`, `ko-KR`, and `ja-JP` in the files. New project configuration starts with `sourceLocale: en-US` and `locales: [en-US]`; translation suggestions are not enabled until selected. Save the first-use choice directly in `releasekit/config.yaml`: set `sourceLocale` to the original language and `locales` to the unique list containing that source first plus all selected translations. A single-language choice saves only its source in `locales`. Preserve unrelated config fields. This choice establishes project defaults without another confirmation; write it before `prepare`, which copies the current project languages into `releasekit/releases/<version>/release.yaml`. If the first draft already exists, save the choice in both config and that draft before `note add`. Later new drafts follow current config automatically, including after a requested project language change. Save an explicitly release-only override in the affected `release.yaml` before scaffolding notes, preserving project defaults.
|
|
44
55
|
|
|
45
|
-
For an existing draft, apply a changed selection in place. Create missing `notes/<id>/<locale>.md` files for each existing note using the [content contract](format.md), preserving existing copy and files for deselected languages. If the source language changes, review the new source and all selected translations, then mark reviewed translations against the new source. Keep the change scoped to this release.
|
|
56
|
+
For an existing draft, apply a changed selection in place. Create missing `notes/<id>/<locale>.md` files for each existing note using the [content contract](format.md), preserving existing copy and files for deselected languages. If the source language changes, review the new source and all selected translations, then mark reviewed translations against the new source. Keep the change scoped to this release unless the user also requests a project language change.
|
|
46
57
|
|
|
47
58
|
## Translate selected locales
|
|
48
59
|
|
|
@@ -56,9 +67,11 @@ Review each affected translation against the current source, then run `releaseki
|
|
|
56
67
|
|
|
57
68
|
Apply this guidance throughout all three ReleaseKit skills, including questions within a step and choices about what to do next. Read the request, conversation, saved release, and relevant evidence before asking. Reuse established choices and resolve routine editorial or implementation details with judgment. Ask when missing information or a user preference materially affects the result and cannot be resolved from that context. Resolve technical parameters such as Git ranges through [repository inspection](#resolve-release-scope-from-the-repository); the picker is for consequential user choices. Draft language selection follows [Choose languages](#choose-languages).
|
|
58
69
|
|
|
70
|
+
Keep at most one unanswered question request in the conversation across all skills, releases, and question tools. Before every question-tool call, check for a pending request, including one opened before this skill began. If any question in it remains unanswered, do not call `request_user_input`, `request_user_input_async`, or another question tool, even for a different topic. Keep newly discovered questions queued in conversation context until the current request is resolved. Do not replace, refresh, or expand an open picker by issuing another request, and never run question calls in parallel.
|
|
71
|
+
|
|
59
72
|
For a decision needed before proceeding, prefer a native question tool that waits for the answer when exposed and permitted. In Codex, use `request_user_input` only when its mode restrictions and tool instructions allow the question. Otherwise, `request_user_input_async` requires the explicit [answer-waiting procedure](#wait-for-the-users-answer). In another agent, use its available equivalent. If no supported question tool can preserve that wait, ask in chat and yield for a reply. Follow the tool's current schema; do not change modes or install anything solely to display a picker.
|
|
60
73
|
|
|
61
|
-
|
|
74
|
+
When no request is pending, bundle related missing decisions into one tool call within its question limit. Queue any remaining decisions for later calls, after this request is resolved. Use the user's language and identify the affected release or notes. When there are meaningful alternatives, offer a few distinct, actionable choices and put the recommended one first, explaining its effect briefly. Keep built-in free-text input available; do not duplicate a built-in Other option or assume multi-select support. For open-ended text such as a path or terminology, use the tool's free-text question when supported instead of inventing arbitrary choices.
|
|
62
75
|
|
|
63
76
|
Use structured questions for text decisions and existing file paths. Request uploads, screenshots, or photographs through the conversation's supported attachment flow, not through a text-only question tool. Reuse suitable approved files already available before requesting new input.
|
|
64
77
|
|
|
@@ -68,7 +81,7 @@ Questions should address an actual unresolved decision, for example:
|
|
|
68
81
|
|
|
69
82
|
| Skill | Ask when needed | Reuse or decide without another question |
|
|
70
83
|
| --- | --- | --- |
|
|
71
|
-
| `releasekit-draft` | Unchosen translation languages, unresolved translation scope or product terminology,
|
|
84
|
+
| `releasekit-draft` | Unchosen first-use translation languages, an ambiguous requested language change, unresolved translation scope or product terminology, earlier-history treatment for first use, or materially different release scopes that repository inspection cannot resolve. | Current project languages for new drafts, saved selections for existing drafts, including a single-language choice; intentional first-use language settings; established terminology, current translations, saved boundaries, and versions or Git ranges resolved from release metadata, tags, and ancestry. |
|
|
72
85
|
| `releasekit-image` | Ambiguous target notes or a meaningful choice among suitable approved reference images. | Captured theme policy, selected assets, and media-source requirements. Required supplied media must stay supplied; do not offer generation as an alternative. |
|
|
73
86
|
| `releasekit-finalize` | Ambiguous target release or requested export choices that neither the request nor established settings resolves. | Requested fixes and local finalization, completed review when content is unchanged, valid export defaults, and already requested export. |
|
|
74
87
|
|
|
@@ -80,13 +93,13 @@ A successful question-tool return may only acknowledge that the question was dis
|
|
|
80
93
|
|
|
81
94
|
After an asynchronous question:
|
|
82
95
|
|
|
83
|
-
1. Continue only authorized work that does not depend on the unanswered choice. Keep dependent preparation, settings writes, copy, image work, finalization, export, or the proposed next step pending as applicable.
|
|
96
|
+
1. Retain the pending request identifier when supplied, its unanswered questions, and queued questions in conversation context. Continue only authorized work that does not depend on the unanswered choice; discovering another missing decision queues it without opening a new picker or asking a competing question in chat. Keep dependent preparation, settings writes, copy, image work, finalization, export, or the proposed next step pending as applicable.
|
|
84
97
|
2. When no independent work remains, use an input-aware wait tool, such as `clock.sleep` when exposed, in calls of at most 60 seconds. Check for a submitted reply after each wait and keep waiting if none arrived. An elapsed wait is not permission to choose a default. Do not simulate waiting with shell sleeps, dummy commands, or unrelated tool calls.
|
|
85
|
-
3. Keep the question open while waiting. Do not send a final response just to say that you are waiting or announce completion while its answer is pending; ending the turn can clear the unanswered picker. A skill transition
|
|
98
|
+
3. Keep the question open while waiting. Do not send a final response just to say that you are waiting or announce completion while its answer is pending; ending the turn can clear the unanswered picker. A skill transition or resumed context must retain the pending request and queue; neither allows a new picker or dependent work to proceed. A short progress update belongs in commentary and must not claim a selection.
|
|
86
99
|
|
|
87
|
-
Check that an input-aware wait is available before opening a nonblocking picker. If it is unavailable, ask the question in chat and yield for the user's reply. If an opened picker
|
|
100
|
+
Check that an input-aware wait is available before opening a nonblocking picker. If it is unavailable, ask the question in chat and yield for the user's reply. If the environment confirms an opened picker was cleared without an answer or cannot remain open, preserve its unresolved questions, state that no answer was received, and ask only those questions once in chat instead. Keep that fallback pending before asking queued questions. Lack of a reply or visibility alone does not establish that a picker closed; continue waiting when its state is uncertain. Do not duplicate a still-open usable picker or treat a cleanup notification or fallback as an answer.
|
|
88
101
|
|
|
89
|
-
After a submitted answer, apply that choice and resume the work it unblocks.
|
|
102
|
+
After a submitted answer, apply that choice and resume the work it unblocks. A partial reply leaves the other questions in that request pending. Only after every question in the current request is answered or explicitly stopped, deferred, or delegated to the agent may another request be opened. Recheck queued questions against the new answers and completed work, discard those already resolved or no longer needed, and ask only the remaining necessary questions. Reuse resolved choices across skill transitions. An explicit stop or deferral pauses the affected work without selecting an option. Continue already requested work that needs no new choice without introducing another confirmation.
|
|
90
103
|
|
|
91
104
|
## Continue to the next step
|
|
92
105
|
|
|
@@ -98,17 +111,30 @@ Choose the next action from the actual state, with priority for useful work that
|
|
|
98
111
|
| --- | --- |
|
|
99
112
|
| Source copy or evidence is incomplete, or the user wants revisions | Continue `releasekit-draft` for the affected notes, including selected translations. |
|
|
100
113
|
| Selected translations are missing or stale | Continue `releasekit-draft` for the affected languages and notes using [Translate selected locales](#translate-selected-locales). |
|
|
101
|
-
| Source and translations are complete; required briefs or
|
|
114
|
+
| Source and translations are complete; required briefs or images are missing | Recommend `releasekit-image` to fill missing images across all current notes under [the coverage policy](theme-pairing.md#coverage-and-repeat-runs). Reuse valid images from previous runs. |
|
|
115
|
+
| Existing images are stale or invalid | Identify the affected notes and offer a targeted image correction or replacement. Preserve their selections until replacements succeed. |
|
|
102
116
|
| A supplied image or generation tool is unavailable | Name the exact missing input and keep assets pending. Offer unfinished draft or translation work only when it can usefully proceed. |
|
|
103
117
|
| Copy, translations, and required images are complete; the release is a draft | Recommend `releasekit-finalize` to review, resolve validation findings, and mark the release ready in one step. Reuse completed review when content is unchanged. |
|
|
104
118
|
| The release is ready and a requested export remains | Continue with the selected locale, version window, and a new output directory; collect only missing export choices. |
|
|
105
119
|
| The release is ready and no export was requested, or the requested export is delivered | Deliver the result links and finish. |
|
|
106
120
|
|
|
107
|
-
Resolve validation failures before finalization or export. Skip image work for text-only
|
|
121
|
+
Resolve validation failures before finalization or export. Skip image work for notes the user explicitly chose to keep text-only and translation work for a single-language release or current translations. An intentionally empty release with a factual `emptyReason` can proceed directly to `releasekit-finalize`. Do not recommend completed work again merely to follow a fixed sequence.
|
|
122
|
+
|
|
123
|
+
Continue steps already included in the user's request in the same conversation, using the corresponding installed skill or its shared references and CLI. Announce the next action without asking for another confirmation. If the release still needs work beyond the completed request, first check for any pending question request. Queue the next-step choice while one remains pending; a completed stage does not allow another picker. Otherwise, use the [native question UI](#ask-with-the-native-question-ui) to offer the recommended next action first, one useful alternative when available, and a choice to finish the current stage. At the end of a completed drafting step, use [Finish drafting](#complete-drafting-and-invite-revisions); for other stages or incomplete drafting, use Stop for now. Keep choices concise and describe the work in ordinary language so the user does not need to know a skill name or CLI command. Preserve free-text input for another direction, then follow [the answer-waiting procedure](#wait-for-the-users-answer). Keep the picker open until the user answers; an unanswered or preselected option does not start additional work.
|
|
124
|
+
|
|
125
|
+
Carry out the selected step without making the user invoke another skill manually. Reuse the release version, pinned range, language choices, and accepted assets. After that step completes or encounters a blocker, return to this state check and recommend the next useful action. Honor an explicit request to stop, pause, or do only the current step without follow-up questions. Do not open any new question request while an earlier request is still pending, even if it concerns another step or release. Once the release is finalized and any requested export is delivered, finish with the result links; publishing is not an automatic next stage.
|
|
126
|
+
|
|
127
|
+
### Complete drafting and invite revisions
|
|
128
|
+
|
|
129
|
+
Once the requested source-copy and translation work is complete, label the stage-completion choice **Finish drafting** (in Korean, **초안 작성 완료**). Its description should explain that the draft is saved and the user can ask the agent for revisions after reading it. Avoid labels such as "finish in draft status" or "초안 상태로 마무리", which suggest permanently ending the release work. Keep incomplete copy or translations visible; do not offer this completion choice while requested drafting work remains.
|
|
130
|
+
|
|
131
|
+
When the user selects this choice, or the requested drafting-only work is complete, report what was drafted, link the written notes and translations, and state any deferred translations, pending images, or finalization work. Invite the user to request changes in the same conversation, for example, "Rewrite this feature description," "Leave this feature out of the release notes," or "Add the feature that was missed." Explain that the agent will revise the saved draft and refresh affected translations. The user does not need to edit files or invoke a skill manually. Keep the release in draft status and finish this response without opening another next-step picker or starting image work or finalization. Resume the saved release when the user requests revisions or a later stage.
|
|
132
|
+
|
|
133
|
+
### Review images and continue
|
|
108
134
|
|
|
109
|
-
|
|
135
|
+
After completing image work, show previews or useful links to the accepted images and report coverage against the release's current notes and theme policy. Invite the user to ask the agent to revise an image or replace it with another approved image, for example, "Simplify the queue feature image" or "Replace this feature image with this screenshot." The agent handles the existing note and affected image slots; the user does not need to edit files or invoke another skill manually.
|
|
110
136
|
|
|
111
|
-
|
|
137
|
+
When required images, copy, and translations are complete, explain that the user can ask for `releasekit-finalize` to review and confirm this release if no image changes are needed. When offering next steps, use **Finalize release** as the recommended action and **Request image changes or replacement** as the useful alternative, retaining the option to stop for now. Continue finalization without another confirmation when it was already requested. For an image-only request, deliver the images with this guidance and keep the release as a draft. If a repeat run finds no missing images, reuse the same guidance without generating new ones. Name any missing, stale, or invalid assets and their next action before offering completion; unresolved images still block finalization.
|
|
112
138
|
|
|
113
139
|
## Inspect the pinned changes
|
|
114
140
|
|
|
@@ -1,31 +1,123 @@
|
|
|
1
1
|
# Writing product release notes
|
|
2
2
|
|
|
3
|
-
Write for the person using the product, using its actual terminology and the configured language.
|
|
3
|
+
Write for the person using the product, using its actual terminology and the configured language. Use a concise title naming the capability, action, or changed result, followed by body copy explaining what the user can do or what now happens. A clear description can be complete on its own. Add usage guidance only when readers need it to understand or use this specific change.
|
|
4
4
|
|
|
5
|
-
Group commits into user-visible changes. Let the final diff and target revision establish what shipped. A merged commit can have been reverted; a feature can have been renamed; internal maintenance can have no useful user-facing announcement. Do not translate each commit subject into a separate card.
|
|
5
|
+
Group commits into user-visible changes. Let the final diff and target revision establish what shipped. A merged commit can have been reverted; a feature can have been renamed; internal maintenance can have no useful user-facing announcement. Do not translate each commit subject into a separate card. Decide which changes warrant standalone notes and which belong in [minor-change groups](#group-minor-changes) before scaffolding notes.
|
|
6
6
|
|
|
7
7
|
For a first-use product introduction (`initialContent: summary`), describe the product and useful capabilities present at the pinned baseline. Read supporting snapshot files without reconstructing the historical commit sequence. Avoid “new,” “now available,” or “initial launch” unless that timing is established by the user or product evidence. Use [the adoption guide](adoption.md) for the selected scope and evidence rules.
|
|
8
8
|
|
|
9
9
|
Keep source evidence with each note. Do not invent performance percentages, privacy claims, security guarantees, supported platforms, eligibility, enabled-by-default behavior, or menu locations. If evidence is incomplete, explain the uncertainty to the author and keep the affected statement out of finalized copy until resolved.
|
|
10
10
|
|
|
11
|
-
Avoid hype, congratulations, “we are excited,” vague “various enhancements,” engineering implementation details with no user consequence, and repeated starts that make every note sound the same. Use active statements about the product's behavior. A small fix can be one precise
|
|
11
|
+
Avoid hype, congratulations, “we are excited,” vague “various enhancements,” engineering implementation details with no user consequence, and repeated starts that make every note sound the same. Use active statements about the product's behavior. A small fix can be one precise bullet in a grouped note.
|
|
12
|
+
|
|
13
|
+
## Group minor changes
|
|
14
|
+
|
|
15
|
+
Choose note size by user impact. Keep major new capabilities, meaningful workflow changes, and fixes with substantial consequences as standalone notes. Group small user-visible corrections and incremental conveniences, including small additions to existing features, instead of giving every change its own title and note. Patch size, commit count, and a `feature` or `fix` label do not determine importance: a short fix that prevents data loss or restores a core workflow can warrant a standalone note. Omit internal maintenance with no useful user-facing consequence, and respect the author's explicit inclusion, exclusion, or emphasis.
|
|
16
|
+
|
|
17
|
+
Within each release, collect minor changes into these separate notes using the existing categories. Use natural equivalents in other selected locales.
|
|
18
|
+
|
|
19
|
+
| Kind | Category | Korean title | English title |
|
|
20
|
+
| --- | --- | --- | --- |
|
|
21
|
+
| Minor bug fixes | `fix` | 사소한 오류 수정 | Minor Fixes |
|
|
22
|
+
| Minor improvements and conveniences | `improvement` | 사소한 기능 향상 | Minor Improvements |
|
|
23
|
+
|
|
24
|
+
Reuse an existing group; otherwise create one note per nonempty kind, normally after the standalone notes. A group may contain only one bullet; do not promote it to a standalone note or invent more items just to fill the group. Omit empty groups. Grouping stays within the release's pinned scope, even when another version has the same group title or note ID. A baseline introduction still follows the snapshot rules above and does not invent a history of minor changes.
|
|
25
|
+
|
|
26
|
+
Start the body directly with an unordered Markdown list. Write one short, concrete change per `-` bullet, without an introductory paragraph, per-item titles, or nested explanations. Combine commits that produce the same outcome. Different product areas can share a minor group; each bullet retains its own meaning. State what changed instead of a vague assurance that bugs were fixed. Add a usage path or condition only when essential under [the body guidance](#body-copy). Include each change once, either in a standalone note or in a minor group.
|
|
27
|
+
|
|
28
|
+
Attach the relevant paths or commits for every bullet to the group note's evidence metadata. Preserve the same grouping, bullet coverage, and order across locales. When consolidating an existing draft, move its supported content, manual edits, and evidence before removing superseded notes; follow [Revise draft notes](workflow.md#revise-draft-notes). A group is one note with the normal image policy; its bullets are not separate notes or image requests. Use [a reusable common image](common-images.md) for each kind, keeping its generic scene independent of the release's text and bullet list.
|
|
29
|
+
|
|
30
|
+
These fictional examples assume that all listed changes are established and minor in their product context:
|
|
31
|
+
|
|
32
|
+
Title: 사소한 오류 수정
|
|
33
|
+
|
|
34
|
+
- 긴 항목 이름이 도구 설명에서 잘리던 문제를 수정했습니다.
|
|
35
|
+
- 설정 설명의 오탈자를 수정했습니다.
|
|
36
|
+
|
|
37
|
+
Title: 사소한 기능 향상
|
|
38
|
+
|
|
39
|
+
- 최근 사용한 정렬 방식을 기억합니다.
|
|
40
|
+
- 대기열 목록에 항목 수를 표시합니다.
|
|
41
|
+
|
|
42
|
+
## Body copy
|
|
43
|
+
|
|
44
|
+
For a standalone note, lead with the concrete capability or changed behavior. For an action, say what the user can do and how when the gesture or control is central. For automatic behavior, say when it happens and what the product does. For an improvement, identify the aspect that changed; for a fix, name the affected action or condition and the corrected problem. An opening that only says a feature was added, updated, or improved gives the reader too little information.
|
|
45
|
+
|
|
46
|
+
Usually stop once the changed behavior is clear. Menu paths, setup steps, and usage conditions are optional context, not a checklist for every note. Include them only when their omission would leave a non-obvious feature difficult to find or use, or materially misrepresent its availability or behavior. Automatic improvements, bug fixes, and changes to familiar controls generally need no separate usage instructions. Omit obvious navigation, routine prerequisites, and conditions already clear from the copy. Keep any necessary details concise and grounded in product evidence. Benefits and reassuring statements about unchanged behavior also need evidence and a reason to be included.
|
|
47
|
+
|
|
48
|
+
Let the content determine length. One sentence can fully explain a small change. Add paragraphs only when there is more useful information to convey; use bullets when several related changes, choices, or necessary steps are easier to scan. Keep standalone notes focused on a coherent user task. Collect remaining minor changes using [the grouping guidance](#group-minor-changes), preserving their specifics in the bullets. Do not pad a short note with a repeated title, a stock closing sentence, unrelated maintenance, or future work presented as shipped functionality.
|
|
49
|
+
|
|
50
|
+
## Newly supported capabilities
|
|
51
|
+
|
|
52
|
+
When the pinned before-and-after evidence shows that an action was unsupported before this release and is supported at the target revision, prefer “이제 ~할 수 있습니다.” in Korean or a natural equivalent such as “You can now …” in English when first-time availability is the main news. A direct action or behavior statement can be clearer when the interaction itself is the news. State the newly possible action; include a condition only when it materially limits the claim and is not already clear from the wording. If support was added only for a format, platform, or mode, name that scope instead of implying the whole feature is new. A `feature` category or the current implementation alone does not establish prior lack of support.
|
|
53
|
+
|
|
54
|
+
Use this construction selectively where the transition matters most. Read the notes together in release order for each locale, and avoid repeating “이제,” “~할 수 있습니다,” or “You can now” in consecutive openings or throughout the release. When several notes qualify, prioritize this opening where it best highlights a newly possible action; vary other openings with the action or automatic result itself, or direct statements such as “~을 지원합니다,” preserving the meaning and scope. Describe what the product does instead of cycling through generic added, supported, and improved formulas. Merely replacing “이제” with “새롭게” or “드디어” does not resolve a repetitive sentence pattern. Use editorial judgment rather than a fixed count or quota.
|
|
55
|
+
|
|
56
|
+
Describe improvements to existing support, performance changes, and bug fixes directly without implying first-time support. If earlier support is uncertain, describe only the verified behavior without claiming it is newly available. The first-use introduction evidence rule above still applies. These fictional examples assume the change in the left column is established:
|
|
57
|
+
|
|
58
|
+
| Established change | Suitable Korean body wording |
|
|
59
|
+
| --- | --- |
|
|
60
|
+
| Batch renaming was unsupported and is now supported | 이제 여러 파일의 이름을 한 번에 변경할 수 있습니다. |
|
|
61
|
+
| A new right-swipe gesture adds a saved item to the queue | 저장한 항목을 오른쪽으로 스와이프하면 대기열에 추가됩니다. |
|
|
62
|
+
| SVG export was added, and a nearby note already uses the same opening | SVG 형식 내보내기를 지원합니다. |
|
|
63
|
+
| Existing batch renaming became faster | 여러 파일의 이름을 변경할 때 처리 속도를 개선했습니다. |
|
|
64
|
+
| An existing save action could crash | 저장 중 앱이 종료되던 문제를 수정했습니다. |
|
|
65
|
+
|
|
66
|
+
## Titles
|
|
67
|
+
|
|
68
|
+
These rules apply to standalone notes. Grouped minor notes use [the summary headings above](#group-minor-changes), with each specific change stated in a bullet.
|
|
69
|
+
|
|
70
|
+
Name the capability, action, or changed result the reader should notice. Keep the product's established terminology and the scope that makes the change recognizable, such as a gesture, affected interaction, mode, or condition. The title helps the reader identify the change; the body explains its behavior and use.
|
|
71
|
+
|
|
72
|
+
A major new capability can use its feature name alone when that name clearly communicates what is being introduced. An addition within an existing feature needs its added scope in the title, but a concrete action such as `스와이프로 대기열 추가` already names that scope. It does not need an extra availability label. A `feature` category alone does not establish that the whole capability is new. For a first-use product introduction, feature names can describe the baseline capabilities without claiming a change or launch.
|
|
73
|
+
|
|
74
|
+
For improvements, fixes, and other changes to existing functionality, retain the actual change. Use a specific outcome such as `더 빠른 파일 검색`, or an affected area with a meaningful qualifier such as `대화 삭제 동작 개선` or `저장 중 앱 종료 문제 수정`. An outcome can already express the improvement; a bare area such as `대화 삭제` does not explain an interaction improvement. Choose the most specific wording established by the evidence.
|
|
75
|
+
|
|
76
|
+
Keep titles as compact, natural phrases, including concise action phrases. English action titles such as `Add to Queue with a Swipe` are valid; Korean can use `스와이프로 대기열 추가` without a sentence-like `~하기` ending. When needed, put complete instructions, menu paths, and longer explanations in the body. Established operation names such as `되돌리기` are valid; do not mechanically strip endings or enforce a fixed character limit.
|
|
77
|
+
|
|
78
|
+
Use words such as `지원`, `추가`, `개선`, `수정`, `업데이트`, and their locale equivalents only when they contribute meaning. Remove a redundant announcement suffix when the action or result is already clear: `스와이프로 대기열 추가 지원` becomes `스와이프로 대기열 추가`. Keep `추가` here because adding to the queue is the user action. Keep compatibility wording when it distinguishes support for an existing tool from introducing that tool, as in `화면 읽기 프로그램 지원`. Neither appending nor deleting the same suffix from every title is an editorial rule.
|
|
79
|
+
|
|
80
|
+
These fictional examples assume the change in the first column is established:
|
|
81
|
+
|
|
82
|
+
| Established change | Too vague or padded | Suitable title |
|
|
83
|
+
| --- | --- | --- |
|
|
84
|
+
| A swipe gesture was added for queueing saved items | 스와이프로 대기열 추가 지원 | 스와이프로 대기열 추가 |
|
|
85
|
+
| Existing conversation deletion interaction was improved | 대화 삭제 | 대화 삭제 동작 개선 |
|
|
86
|
+
| An existing save action could crash | 저장 | 저장 중 앱 종료 문제 수정 |
|
|
87
|
+
| Existing batch renaming became faster | Batch renaming improvements | Faster batch renaming |
|
|
88
|
+
| Batch deletion was added to existing conversation deletion | 대화 일괄 삭제 기능 지원 | 대화 일괄 삭제 |
|
|
89
|
+
| The default notification time changed | 알림 | 기본 알림 시간 변경 |
|
|
90
|
+
| Compatibility with screen readers was added | 화면 읽기 프로그램 | 화면 읽기 프로그램 지원 |
|
|
91
|
+
| Autosave was introduced as a major new capability | Save your changes automatically while you work | Autosave |
|
|
92
|
+
|
|
93
|
+
During drafting and final review, read each standalone title alone to check that the capability or actual change is identifiable. Remove redundant announcement wording, and restore missing change meaning for improvements and fixes. Then read the title and body together: the opening should add concrete behavior, with every claim and qualifier grounded in the pinned evidence.
|
|
12
94
|
|
|
13
95
|
## Examples from a fictional product
|
|
14
96
|
|
|
15
|
-
|
|
97
|
+
These standalone examples assume the described changes are established by product evidence and warrant individual attention. Similar changes with minor impact belong in the groups above.
|
|
98
|
+
|
|
99
|
+
Title: Add to Queue with a Swipe
|
|
100
|
+
|
|
101
|
+
Swipe a saved item to the right to add it to the queue.
|
|
102
|
+
|
|
103
|
+
Title: 스와이프로 대기열 추가
|
|
104
|
+
|
|
105
|
+
저장한 항목을 오른쪽으로 스와이프하면 대기열에 추가됩니다.
|
|
106
|
+
|
|
107
|
+
Title: 대화 삭제 동작 개선
|
|
16
108
|
|
|
17
|
-
|
|
109
|
+
대화를 삭제한 뒤에도 목록의 스크롤 위치가 유지되어, 보던 위치에서 계속 탐색할 수 있습니다.
|
|
18
110
|
|
|
19
|
-
Title:
|
|
111
|
+
Title: 저장 중 앱 종료 문제 수정
|
|
20
112
|
|
|
21
|
-
|
|
113
|
+
파일 이름에 특수 문자가 포함된 경우 저장 중 앱이 종료되던 문제를 수정했습니다.
|
|
22
114
|
|
|
23
|
-
|
|
115
|
+
The action example uses a direct instruction or result; a newly available action can also use the opening described above when that transition matters. The improvement example explains the observable behavior, and the fix identifies the triggering condition. Do not infer these fictional details for a real product. Add setup, requirements, or limitations only when established and needed to understand or use that specific change; a complete one-sentence note needs no filler.
|
|
24
116
|
|
|
25
117
|
## Translation
|
|
26
118
|
|
|
27
119
|
Selected translations are part of `releasekit-draft`. Use that skill for translation-only additions or refreshes as well; follow [the translation workflow](workflow.md#translate-selected-locales) for language scope and source fingerprints.
|
|
28
120
|
|
|
29
|
-
Use the same note ID in every configured locale. Translate user meaning, not word order. Keep product names supplied by the user, supported menu paths, requirements, and numbers consistent. Raster illustrations are shared; localize their alt text separately. Alt text describes the feature-bearing visual rather than the style or color palette.
|
|
121
|
+
Use the same note ID in every configured locale. For grouped minor notes, translate the group title and every bullet while preserving their order and meaning; do not split translated bullets into separate notes. Translate user meaning, not word order. Preserve whether an action is newly supported or an existing capability changed, and apply the new-capability and repetition guidance across each locale rather than copying every opening mechanically. Keep translated titles concise while preserving the source capability, action, or changed result. Apply the title guidance in every locale: retain meaningful improvement, fix, and compatibility distinctions, but do not add `지원` or another announcement suffix simply because the capability is new. Translate a short English action title into a natural local title instead of forcing identical grammar or suffixes. Preserve the body's concrete behavior and any action paths or conditions it includes, without mechanically copying its opening pattern or adding usage guidance to fill a recurring template. Keep product names supplied by the user, supported menu paths, requirements, and numbers consistent. Raster illustrations are shared; localize their alt text separately. Alt text describes the feature-bearing visual rather than the style or color palette.
|
|
30
122
|
|
|
31
123
|
After reviewing a translation against the current source, use `releasekit translation mark <version> <note> --locale <locale>`. This records a source fingerprint; it does not prove translation quality. If the original title, alt text, or body changes, review and refresh affected translations before marking them current again.
|