@iodes/releasekit 0.1.6 → 0.2.0

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.
Files changed (76) hide show
  1. package/README.md +74 -8
  2. package/dist/assets.d.ts +4 -3
  3. package/dist/assets.js +4 -2
  4. package/dist/cli.js +116 -27
  5. package/dist/content.d.ts +7 -5
  6. package/dist/content.js +3 -1
  7. package/dist/export.d.ts +1 -0
  8. package/dist/export.js +33 -17
  9. package/dist/files.js +7 -2
  10. package/dist/images.d.ts +5 -3
  11. package/dist/images.js +3 -1
  12. package/dist/install.d.ts +20 -3
  13. package/dist/install.js +28 -5
  14. package/dist/model.d.ts +69 -7
  15. package/dist/model.js +32 -9
  16. package/dist/move.d.ts +24 -0
  17. package/dist/move.js +292 -0
  18. package/dist/project.d.ts +12 -5
  19. package/dist/project.js +180 -29
  20. package/dist/prompts.js +18 -16
  21. package/dist/refs.d.ts +6 -0
  22. package/dist/refs.js +29 -0
  23. package/dist/setup.d.ts +7 -0
  24. package/dist/setup.js +64 -0
  25. package/dist/status.d.ts +31 -0
  26. package/dist/status.js +52 -0
  27. package/dist/validate.d.ts +5 -2
  28. package/dist/validate.js +31 -17
  29. package/examples/README.md +4 -4
  30. package/examples/backup-encryption/dark.prompt.md +15 -6
  31. package/examples/backup-encryption/light.prompt.md +15 -6
  32. package/examples/connected-route/dark.prompt.md +13 -4
  33. package/examples/connected-route/light.prompt.md +13 -4
  34. package/examples/location-preferences/README.md +6 -4
  35. package/examples/location-preferences/dark-refined.png +0 -0
  36. package/examples/location-preferences/dark-refinement.prompt.md +70 -0
  37. package/examples/location-preferences/dark-size-correction.prompt.md +5 -0
  38. package/examples/location-preferences/dark-weight-correction.prompt.md +5 -0
  39. package/examples/location-preferences/dark.prompt.md +15 -13
  40. package/examples/location-preferences/light-refined.png +0 -0
  41. package/examples/location-preferences/light-refinement.prompt.md +70 -0
  42. package/examples/location-preferences/light.prompt.md +15 -14
  43. package/examples/location-preferences/pair-review.md +17 -10
  44. package/examples/location-preferences/scene.yaml +16 -9
  45. package/examples/queue-action/README.md +3 -3
  46. package/examples/queue-action/dark-accent-edit.prompt.md +5 -0
  47. package/examples/queue-action/dark-accent.png +0 -0
  48. package/examples/queue-action/dark-refined.png +0 -0
  49. package/examples/queue-action/dark-refinement.prompt.md +74 -0
  50. package/examples/queue-action/dark-size-correction.prompt.md +5 -0
  51. package/examples/queue-action/dark.prompt.md +15 -13
  52. package/examples/queue-action/light-accent-edit.prompt.md +5 -0
  53. package/examples/queue-action/light-accent.png +0 -0
  54. package/examples/queue-action/light-refined.png +0 -0
  55. package/examples/queue-action/light-refinement.prompt.md +74 -0
  56. package/examples/queue-action/light.prompt.md +14 -13
  57. package/examples/queue-action/pair-review.md +11 -5
  58. package/examples/queue-action/scene.yaml +13 -9
  59. package/examples/storage-breakdown/dark.prompt.md +15 -6
  60. package/examples/storage-breakdown/light.prompt.md +15 -6
  61. package/examples/tablet-reading/dark.prompt.md +14 -5
  62. package/examples/tablet-reading/light.prompt.md +14 -5
  63. package/kit/references/adoption.md +3 -1
  64. package/kit/references/channels.md +88 -0
  65. package/kit/references/composition-recipes.md +5 -5
  66. package/kit/references/format.md +16 -6
  67. package/kit/references/theme-pairing.md +6 -6
  68. package/kit/references/visual-language.md +17 -17
  69. package/kit/references/workflow.md +4 -4
  70. package/kit/skills/releasekit-draft/SKILL.md +3 -1
  71. package/kit/skills/releasekit-finalize/SKILL.md +4 -2
  72. package/kit/skills/releasekit-image/SKILL.md +4 -2
  73. package/package.json +1 -1
  74. package/schemas/bundle.schema.json +54 -5
  75. package/schemas/config.schema.json +133 -17
  76. package/schemas/release.schema.json +54 -13
@@ -6,8 +6,8 @@ The rules below are conditional on the selected subject. Choose the [media sourc
6
6
 
7
7
  | Archetype | Use when | Starting composition | Common failure |
8
8
  | --- | --- | --- | --- |
9
- | `icon-tile` | A capability or status is recognizable through one symbol | Flat tile about 20–24% of canvas width; neutral monochrome filled glyph about 50–65% of tile width | A sculpted 3D object, colored decorative badge, or oversized glyph |
10
- | `symbol-pair` | Two capabilities are connected | Two equally weighted neutral symbols, a short subtle divider, broad empty space | Coloring one symbol merely for emphasis, unequal weights, or an unsupported direction |
9
+ | `icon-tile` | A capability or status is recognizable through one symbol | Flat tile about 20–24% of canvas width; compact filled glyph about 50–65% of tile width, normally neutral with accent available for a supported action or state | A sculpted 3D object, colored decorative badge, or oversized glyph |
10
+ | `symbol-pair` | Two capabilities are connected | Compact neutral glyphs, each longest dimension around 8–11% of canvas width; generous spacing and a short subtle divider | Coloring one symbol merely for emphasis, unequal weights, or an unsupported direction |
11
11
  | `ui-detail` | A specific interaction or setting changed | One enlarged fragment occupying about 55–85% of width | A complete invented dashboard with the useful control too small |
12
12
  | `device-view` | The device or cross-device context matters | One unobtrusive front-facing display, around 28–48% of width | Decorative device mockups unrelated to the workflow |
13
13
  | `object-detail` | A real physical part explains the feature | Supplied photograph or capture, with a useful crop | Inventing a physical product or generating a 3D substitute |
@@ -46,15 +46,15 @@ Message: a saved item can be added to a queue with one swipe.
46
46
 
47
47
  Choose `ui-detail`. Three broad horizontal list rows extend slightly past the right crop. Define the resting list left boundary as `L` and the exposed action width as `D`. The top and bottom row backgrounds and the middle row's action backplate all start at `L`. For this rightward swipe, only the middle foreground row starts at `L + D`; its thumbnail and label bars move with it and retain their original padding. The action occupies the space revealed inside the original row bounds. Its left edge must not protrude outside the resting list. Do not shift the entire list or compress the active row to make room.
48
48
 
49
- Represent incidental text as two or three neutral bars with consistent padding. Assign these bars to `secondary`, base rows to `surface`, and abstract thumbnails to `raised`. Keep repeated roles consistent; vary tone only for a hierarchy supported by the scene. Keep the action icon recognizable and the entire interaction inside the safe margin. This is a horizontal reveal gesture, not a vertical reorder drag: the rows keep their order and vertical positions. Keep one interaction. The exposed action may use accent if color helps distinguish it; neutral value contrast is also valid. Do not add a floating hand, arrow trail, extra feature, or surrounding app navigation.
49
+ Represent incidental text as two or three neutral bars with consistent padding. Assign roles according to the scene's hierarchy: incidental bars and thumbnails can share `secondary`, with foreground rows in `raised` over the canvas. Use `surface` for a base or recessed panel when present. A feature-relevant title or value can use `primary` if its hierarchy matters. Keep equivalent roles consistent across the release and both themes. Keep the action icon recognizable and the entire interaction inside the safe margin. This is a horizontal reveal gesture, not a vertical reorder drag: the rows keep their order and vertical positions. Keep one interaction. Prefer the project accent on the exposed action so readers can locate the available operation quickly, even when the swipe geometry also reads in grayscale. Keep the supporting rows neutral; honor an explicit monochrome brief or authentic product color scheme. Do not add a floating hand, arrow trail, extra feature, or surrounding app navigation.
50
50
 
51
- Before pairing, check that the resting rows and action backplate share a left boundary, the foreground displacement equals the revealed action width, and its contents moved as one unit. For the theme pair, lock row dimensions, offset, action width, bars, crop, and selected state. Change only canvas and surface roles, neutral label values, and local shadows. A second view that selects another row is a failed pair. Two matching images can still share the same interaction error, so correspondence alone is insufficient.
51
+ Before pairing, check that the resting rows and action backplate share a left boundary, the foreground displacement equals the revealed action width, and its contents moved as one unit. For the theme pair, lock row dimensions, offset, action width, bars, crop, and selected state. Change only neutral presentation values and necessary surface separation within the recipe. A second view that selects another row is a failed pair. Two matching images can still share the same interaction error, so correspondence alone is insufficient.
52
52
 
53
53
  ## Worked brief: a saved-location preference
54
54
 
55
55
  Message: a setting can be saved for a selected location.
56
56
 
57
- Choose `symbol-pair` if the association itself is sufficient: a simple adjustment glyph and a location pin, balanced around a narrow neutral divider. Choose `ui-detail` if users need to discover the new menu action. Do not add a device just to fill the empty space. A location pin is a metaphor; it must not imply geofencing or automatic behavior absent from the evidence.
57
+ Choose `symbol-pair` if the association itself is sufficient: a compact adjustment glyph and a location pin, balanced around a short neutral divider. Compare filled ink weight rather than forcing equal widths; a solid pin may need a narrower silhouette than a sparse adjustment glyph. Leave generous space between symbols. Establish this geometry once in the shared scene and retain it in both themes. Choose `ui-detail` if users need to discover the new menu action. Do not add a device just to fill the empty space. A location pin is a metaphor; it must not imply geofencing or automatic behavior absent from the evidence.
58
58
 
59
59
  ## Worked brief: activity information
60
60
 
@@ -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]`). 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.
3
+ Project configuration is `releasekit/config.yaml`. Channel-free releases live under `releasekit/releases/<version>/`; channel releases use `releasekit/releases/<channel>/<version>/`. See [channels](channels.md) for optional config, qualified identities, and cross-channel display links. 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,11 +14,11 @@ 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.dark` and `visuals.light` assign six neutral roles: `canvas` for the background, `surface` for base panels, `raised` for tiles and abstract thumbnails, `primary` for main glyphs, `secondary` for incidental bars and detail, and `divider` for thin boundaries. See the [role table](visual-language.md#assign-neutral-colors-by-role). Values are fixed per role within the captured theme policy; do not derive a separate palette for each note. Updating the toolkit does not overwrite existing project colors or release snapshots. To adopt new defaults in an existing project, edit `releasekit/config.yaml`; use `image plan --sync-config` to apply that project policy to a draft.
17
+ `visuals.dark` and `visuals.light` assign six neutral roles: `canvas` for the background, `surface` for base or recessed panels, `raised` for foreground panels and controls, `primary` for main glyphs and focal marks, `secondary` for supporting glyphs, bars, and abstract content, and `divider` for thin boundaries. The scene maps elements by hierarchy rather than fixing one role to every instance of an object type. See the [role table](visual-language.md#assign-neutral-colors-by-role). Values are fixed per role within the captured theme policy; do not derive a separate palette for each note. Updating the toolkit does not overwrite existing project colors or release snapshots. To adopt new defaults in an existing project, edit `releasekit/config.yaml`; use `image plan --sync-config` to apply that project policy to a draft.
18
18
 
19
19
  `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.
20
20
 
21
- 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.
21
+ Each `(channel?, 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.
22
22
 
23
23
  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).
24
24
 
@@ -28,11 +28,11 @@ Adding a note creates the release's saved locale files and clears `emptyReason`.
28
28
 
29
29
  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.
30
30
 
31
- 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.
31
+ Optional `initialContent` in a baseline release snapshots the selected `summary` or `history` mode. Either mode requires `source.fromRef: null` and `source.fromSha: null` (a root Git range). Display predecessors are independent and may change during a whole-release move. 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.
32
32
 
33
33
  The next release begins after the baseline SHA and links to its version with `previous`. A skipped past creates no baseline release: the first regular draft uses the saved start, and later drafts use explicit boundaries or previous links. Baseline entries count toward the export limit just like other releases.
34
34
 
35
- 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.
35
+ Notes are ordered by their entries in `release.yaml`. Note IDs are unique within a version and shared across locales. Their consumer identity is `(channel?, version, note.id)`; never deduplicate different releases by note ID or title alone.
36
36
 
37
37
  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.
38
38
 
@@ -46,6 +46,16 @@ The `releasekit-finalize` skill reviews the release and runs `releasekit finaliz
46
46
 
47
47
  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.
48
48
 
49
- 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.
49
+ For unchanneled exports, 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 follows the entire `previous` chain. `--limit N` accepts any positive safe integer; there is no fixed 100-release cap. Remove obsolete `history.limit` settings and pass an export option instead. 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.
50
50
 
51
51
  An export destination must not already exist. This avoids overwriting content or mixing assets from separate builds. Validation completes before the destination is created.
52
+
53
+ ## Optional channel fields and timestamps
54
+
55
+ `channels` is absent before the first choice, `false` for explicit non-use, or a nonempty map of channel names to `{ include, history? }`. Each include list is nonempty, unique, and references configured names directly. Channel names use lowercase letters, digits, and hyphens, beginning with a letter; filesystem-reserved names are rejected. `history` is optional and contains only `start`; `history.limit` is no longer supported.
56
+
57
+ Release `channel` is optional. A channel release has `previous: { channel, version }` or null; an unchanneled release retains a version string or null. The global channel chain must contain every channel release exactly once. Unchanneled releases are not members of that chain. New channel drafts link to its latest member; their Git comparison start instead comes from explicit `--from`, the most recent release of the same channel, or that channel's saved start. Existing schemaVersion values and absent fields are preserved.
58
+
59
+ Channel export adds `viewChannel` and `currentChannel` at the top level and `channel` on every release entry. `currentVersion`/`currentChannel` identify the first displayed entry. Exported channel `previous` points to the next entry included in the output, ending with null; the source links remain unchanged. Images use `assets/<channel>/<version>/...`. Channel-free output retains its existing fields and paths.
60
+
61
+ `releasedAt` accepts a valid `YYYY-MM-DD` date or an ISO timestamp with seconds, optional one-to-three fractional digits, and `Z` or an explicit UTC offset. Timezone-less times are rejected. Preparation defaults to `new Date().toISOString()`; explicit input strings and existing date-only values are preserved. The display chain, not timestamps or semantic version comparison, determines order.
@@ -10,7 +10,7 @@ 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
- For a requested palette correction, change the relevant saved theme roles at the requested project or release scope before generating replacements. A project change belongs in `releasekit/config.yaml`; sync that policy into the target draft with `releasekit image plan <version> --sync-config`. A release-only change belongs in that draft's captured visual policy. Do not work around a saved dark glyph value by adding a one-off lighter color to a prompt. Regenerate and review the affected requested variants; preserve unchanged accepted counterparts. Palette changes are authoring policy changes, not a global filter over supplied images.
13
+ For a requested palette correction, change the relevant saved theme roles at the requested project or release scope before generating replacements. A project change belongs in `releasekit/config.yaml`; sync that policy into the target draft with `releasekit image plan <version> --sync-config`. A release-only change belongs in that draft's captured visual policy. Do not work around a saved dark glyph value by adding a one-off lighter color to a prompt. Regenerate and review the affected requested variants; preserve unchanged accepted counterparts. A light-only palette correction does not request dark regeneration. If the shared geometry needs correction, update the scene and review both affected variants, keeping each theme's palette. Palette changes are authoring policy changes, not a global filter over supplied images.
14
14
 
15
15
  ## Coverage and repeat runs
16
16
 
@@ -24,13 +24,13 @@ An existing image reported as stale or invalid is unresolved, even though its fi
24
24
 
25
25
  ## One scene, two presentation treatments
26
26
 
27
- 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.
27
+ 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 neutral presentation values and necessary surface separation within the selected recipe. Match geometry, not apparent brightness or contrast: use each theme's independent treatment. 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.
28
28
 
29
29
  | Role | Dark treatment | Light treatment |
30
30
  | --- | --- | --- |
31
31
  | Canvas | Quiet charcoal | Quiet near-white |
32
- | Interface surface | Separate adjacent dark values | Separate white and pale-gray values |
33
- | Primary neutral symbol | Legible mid-light neutral | Medium gray from `primary`, without default charcoal fills |
32
+ | Interface surface | Distinguish base and foreground charcoal layers | Separate white and pale-gray values |
33
+ | Primary neutral symbol | Compact mid-light neutral; no oversized bright glyph | Medium gray from `primary`, without default charcoal fills |
34
34
  | Secondary detail | Subdued, still distinguishable | Lighter `secondary` for incidental bars and supporting detail |
35
35
  | Surface separation | Preserve only feature-relevant layers | Use surface roles and thin dividers; do not invent shadows |
36
36
  | Optional interaction or status color | Preserve assignment and semantic hue, or keep absent | Preserve assignment and semantic hue, or keep absent |
@@ -45,13 +45,13 @@ Do not invert pixels or shift brightness globally. A black lens remains a black
45
45
  3. Generate one requested variant using its prompt. Select and inspect the result.
46
46
  4. Import it. Re-run the image plan; a valid approved counterpart is now offered as a composition reference for the other theme.
47
47
  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.
48
- 6. Compare the pair and the other accepted images in the same theme. Check equivalent glyphs, label bars, and surfaces against the same configured color roles, without making light images as dark or contrast-heavy as dark-theme subjects. Both files should have the same pixel dimensions. Verify pose, crop, UI state, values, and semantic colors by sight, then import the selected counterpart.
48
+ 6. Review dark images together and light images together at equal display widths, then compare the pair. Check glyph ink size, supporting detail, and charcoal layer separation in dark; check medium-gray neutral symbols and soft supporting values in light. Check equivalent elements against their configured roles without forcing equal apparent contrast between themes. Both files should have the same pixel dimensions. Verify pose, crop, UI state, values, and semantic colors by sight, then import the selected counterpart.
49
49
 
50
50
  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.
51
51
 
52
52
  ## Replace or regenerate an image
53
53
 
54
- 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.
54
+ Treat replacement and regeneration as an edit to the existing release, note ID, and affected theme. A requested accent-use correction updates the shared scene's color assignment; regenerate the affected variants while preserving unrelated geometry and theme palettes. 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.
55
55
 
56
56
  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.
57
57
 
@@ -29,38 +29,38 @@ For each standalone note, derive the scene from that feature independently. Grou
29
29
 
30
30
  Separate the canvas, base surface, raised surface, primary symbol, secondary detail, and divider. These are semantic roles, not a global color filter. The project defines their dark and light values.
31
31
 
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 medium-gray symbols with lighter supporting details. Do not use charcoal glyphs or dark placeholder bars by default. A dark device or natural photo may stay dark in a light presentation.
32
+ Judge each theme at the same display width using its own saved palette. On dark backgrounds, retain distinct charcoal layers and compact mid-light neutral symbols; keep supporting UI quieter than the focal control. Avoid oversized bright glyphs, thick label bars, and milky overlays. On light backgrounds, use near-white space, subtle gray separation, and medium-gray neutral symbols with lighter supporting details. Do not use charcoal glyphs or dark placeholder bars by default. A dark device or natural photo may stay dark in a light presentation. Equal geometry does not require equal apparent brightness or contrast. A light-only palette correction leaves the accepted dark treatment intact.
33
33
 
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.
34
+ For generic capability 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
  ## Assign neutral colors by role
39
39
 
40
- Use the release's captured palette as the source of truth. The default light palette deliberately uses a narrow neutral hierarchy:
40
+ Use the release's captured palette as the source of truth. The default palettes give the themes independent value hierarchies:
41
41
 
42
- | Role | Default light value | Assignment |
43
- | --- | --- | --- |
44
- | `canvas` | `#F8F8F8` | Uniform background |
45
- | `surface` | `#FFFFFF` | Base panels and resting rows |
46
- | `raised` | `#ECECEC` | Quiet tiles, inset areas, and abstract thumbnails |
47
- | `primary` | `#999999` | Main glyphs and feature-defining marks |
48
- | `secondary` | `#B8B8B8` | Incidental label bars and supporting detail |
49
- | `divider` | `#D9D9D9` | Thin separators and necessary boundaries |
42
+ | Role | Default dark value | Default light value | Assignment |
43
+ | --- | --- | --- | --- |
44
+ | `canvas` | `#242527` | `#F8F8F8` | Uniform background |
45
+ | `surface` | `#18191B` | `#FFFFFF` | Base or recessed panels |
46
+ | `raised` | `#343638` | `#ECECEC` | Foreground panels, controls, and quiet tile fills |
47
+ | `primary` | `#B9BBBE` | `#999999` | Main glyphs, focal controls, and feature-defining marks |
48
+ | `secondary` | `#777B80` | `#B8B8B8` | Supporting glyphs, incidental bars, and abstract content |
49
+ | `divider` | `#46494D` | `#D9D9D9` | Thin separators and necessary boundaries |
50
50
 
51
- Map visible schematic groups to these roles in `composition`; do not choose a fresh gray for each object or each image. Equivalent label bars share `secondary`; a second tone needs an actual hierarchy in the feature. Use the configured values, including explicit project overrides, instead of copying hex values from a worked example. Keep uniform flat fills without arbitrary warm or cool casts, opacity washes, gradients, or invented shading. Antialiased edges can contain intermediate pixels.
51
+ Map visible schematic groups to these roles by hierarchy in `composition`; do not choose a fresh gray for each object or each image. Object type alone does not fix its role: a foreground row can use `raised`, and a subordinate thumbnail can share `secondary` with incidental bars. A feature-relevant title, value, or control may use `primary` when the scene calls for that distinction. Preserve that hierarchy across themes and equivalent scenes; do not brighten every label bar or flatten genuinely different levels into one tone. Use the configured values, including explicit project overrides, instead of copying hex values from a worked example. Keep uniform flat fills without arbitrary warm or cool casts, opacity washes, gradients, or invented shading. Antialiased edges can contain intermediate pixels.
52
52
 
53
53
  Light illustrations explain shapes and relationships without the contrast of a text document. If something is unclear at card size, improve silhouette, spacing, stroke width, scale, or crop first. Do not globally darken glyphs and placeholder bars or introduce shadows to make every element sharper. Preserve authentic dark hardware, supplied UI, content colors, and justified semantic colors; the neutral role map applies to generated schematic elements.
54
54
 
55
- Review same-role objects across the release's light images together, not only each dark/light pair. A successful decode and matching dimensions do not validate the palette or visual weight.
55
+ Review same-role objects across the release's dark images together, and separately across its light images. Use equal display widths, not differently sized website cards. In dark images inspect glyph footprint and charcoal layer separation; in light images inspect soft neutral weight. A successful decode and matching dimensions do not validate the palette or visual weight.
56
56
 
57
57
  ## Color has a job
58
58
 
59
- 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.
59
+ Use neutral surroundings and a clear hierarchy, then choose focal color from the feature. Prefer the project accent for the primary action, a selected or enabled control, an active route, or a defined information distinction when it helps readers find what matters. Color can guide attention even when the shape or interaction also reads in grayscale; it does not have to be indispensable.
60
60
 
61
- 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.
61
+ Keep the accent on the meaningful control, state, or feature-defining component; supporting glyphs, label bars, tiles, and surfaces remain neutral. Preserve an established functional accent instead of replacing it with gray merely for restraint. Use the neutral palette roles for neutral elements, not to recolor the chosen accent target. Honor explicit monochrome choices and authentic product colors.
62
62
 
63
- 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.
63
+ In the shared scene's `composition`, name the accent target and what it communicates, or choose a neutral treatment when appropriate. Generic capability and maintenance symbols, and simple associations between symbols, normally stay neutral. A specific action or state within those archetypes may receive accent. Do not invent a selection, badge, or status just to use color. Preserve the chosen assignment across themes; revise it in the shared scene when the user requests a change in accent use.
64
64
 
65
65
  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.
66
66
 
@@ -93,6 +93,6 @@ Make the brief concrete enough that another model can render the same scene. “
93
93
 
94
94
  ## Review the actual output
95
95
 
96
- 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.
96
+ 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. Review accent in both directions: remove decorative spread into unrelated elements, and restore the intended functional accent if it has been suppressed into gray. A useful attention cue remains valid even when the image is understandable without color. Review the release together for both overuse and habitual avoidance; do not impose a minimum, maximum, or one-colored-point-per-note quota. Attractive styling and theme similarity do not establish factual or structural correctness.
97
97
 
98
98
  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.
@@ -6,14 +6,14 @@ Use the installed `releasekit` CLI, or the repository's compiled CLI when develo
6
6
 
7
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`. [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.
9
+ 1. Read `releasekit/config.yaml` and any existing `release.yaml`. [Choose channels](channels.md#first-draft-and-later-drafts) before preparing a new draft, alongside unresolved language choices. Keep the resolved channel in every subsequent command. [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
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
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, 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.
16
+ 8. If requested, run `releasekit export --out <directory>` to export recent history to a new output directory. For unchanneled history, 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 export all matching releases; specify it only for a requested count limit. 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. For channel output, pass the requested `--channel`; the global channel chain is filtered to ready entries in its include list. Do not choose channel-specific endpoints or sort by timestamps. 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
 
@@ -30,7 +30,7 @@ After additions or removals, validate the release and report outstanding copy, t
30
30
 
31
31
  ## Resolve release scope from the repository
32
32
 
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.
33
+ For channel drafts, resolve the target channel through [the channel workflow](channels.md#first-draft-and-later-drafts). Its `previous` is the latest entry across channels and is independent from the same-channel Git comparison boundary; use [channel Git boundaries](channels.md#git-boundaries). The following predecessor-based rules otherwise describe unchanneled history. 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.
34
34
 
35
35
  - Reuse the user's explicit version and refs. For an existing draft, keep its pinned `source.fromSha` and `source.toSha` and edit in place; a moved tag does not change that draft's scope.
36
36
  - Identify the target on the requested product and release line. For a named released version, use its matching tag according to the repository's naming convention. For current unreleased work, use `HEAD`. For the latest released version, inspect the relevant release tags. Infer an omitted version only from an unambiguous tag or release metadata at the selected target; do not invent a version increment.
@@ -81,7 +81,7 @@ Questions should address an actual unresolved decision, for example:
81
81
 
82
82
  | Skill | Ask when needed | Reuse or decide without another question |
83
83
  | --- | --- | --- |
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. |
84
+ | `releasekit-draft` | Unchosen first-use channel use or translation languages, an unspecified new-draft channel when several are configured, 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. |
85
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. |
86
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. |
87
87
 
@@ -1,10 +1,12 @@
1
1
  ---
2
2
  name: releasekit-draft
3
- description: Create or revise ReleaseKit release notes and their selected translations, including translation-only refreshes. Resolve release scope from the repository and guide first-use setup for an existing product. Use for release copy, not general code implementation.
3
+ description: Create or revise ReleaseKit release notes and their selected translations, including translation-only refreshes and moving whole releases between channels. Resolve release scope from the repository and guide first-use setup for an existing product. Use for release copy, not general code implementation.
4
4
  ---
5
5
 
6
6
  Before asking anything, check for an unanswered question request already in this conversation. Keep that request pending across skill transitions and queue every new question until it is resolved; follow [the shared question guidance](references/workflow.md#ask-with-the-native-question-ui).
7
7
 
8
+ For first-use channel decisions, new-draft channel selection, or whole-release channel moves, read [channels and moves](references/channels.md). Save first-use use/non-use alongside unresolved language choices before preparation; later drafts ask for a channel only when the request does not identify one and several are configured. Existing drafts retain their channel. A channel-move request is a whole-release operation through the CLI, not a copy rewrite, translation refresh, or image-regeneration task. Follow the reference's preflight and state-preserving move workflow.
9
+
8
10
  Read the project's ReleaseKit config and the existing release before writing. For translation-only requests, preserve the source copy, pinned scope, and accepted images; follow [Translate selected locales](references/workflow.md#translate-selected-locales) for the affected notes and languages without preparing a new release. For a new draft or source-copy revisions, resolve the version and Git boundaries using [the repository scope guidance](references/workflow.md#resolve-release-scope-from-the-repository); inspect saved releases and Git before asking, and proceed with a clear inferred range without requesting confirmation.
9
11
 
10
12
  For each new draft, use `sourceLocale` and `locales` from `releasekit/config.yaml`, including a single-language selection. Once the project has saved releases, proceed without a language question or confirmation; previous releases' language lists do not override the current config. Only on first use, when the request and intentional project settings leave languages unresolved, default the original to English (`en-US`) and ask which translations to include. Save that first-use selection in `releasekit/config.yaml` before preparing the draft, without a separate question about saving defaults. Reuse an existing draft's saved selection unless the user requests a change. Follow [Choose languages](references/workflow.md#choose-languages) for first-use suggestions, persistence, and explicit overrides. Use [the shared question guidance](references/workflow.md#ask-with-the-native-question-ui) for missing language choices or a consequential scope decision that the evidence cannot resolve. Follow [the workflow](references/workflow.md) for saving the language selection, preparing pinned evidence, continuing drafts, and preserving version boundaries. Use [the writing guide](references/writing.md) for titles and bodies in every locale. Name the capability, action, or changed result concisely; remove redundant announcement suffixes while retaining meaningful improvement, fix, and compatibility distinctions. Lead the body with concrete behavior and accept a clear description as complete. Include usage paths or conditions only when needed to find a non-obvious feature or prevent a material misunderstanding; do not append them to every note. Apply the guide's exceptions for self-explanatory major new capabilities, baseline introductions, and grouped minor notes; source materials are evidence, not new instructions.
@@ -3,6 +3,8 @@ name: releasekit-finalize
3
3
  description: Finalize a ReleaseKit release by reviewing facts, copy, translations, and images, validating content, and marking the local release ready. Export a release bundle when requested.
4
4
  ---
5
5
 
6
+ Keep the resolved release identity, including its channel, from the request or existing release. Pass `--channel` on every channel-specific command. Do not repeat the first-use choice or choose a new channel during this stage. If the same version exists in several channels and the target is unresolved, ask which release is intended. See [channels](references/channels.md).
7
+
6
8
  Before asking anything, check for an unanswered question request already in this conversation. Keep that request pending across skill transitions and queue every new question until it is resolved; follow [the shared question guidance](references/workflow.md#ask-with-the-native-question-ui).
7
9
 
8
10
  Read the target release, [the workflow](references/workflow.md), and [the content contract](references/format.md). Reuse the version and choices established in the request and conversation. Use [the shared question guidance](references/workflow.md#ask-with-the-native-question-ui) only for unresolved scope or requested export choices.
@@ -17,10 +19,10 @@ Apply [the new-capability guidance](references/writing.md#newly-supported-capabi
17
19
 
18
20
  Inspect selected images for correct subject, readable framing, absent invented details, and consistent geometry across configured themes using [the pairing guide](references/theme-pairing.md). Reuse a completed visual review when the note, brief, and assets are unchanged. The CLI verifies files and metadata; it cannot judge whether the image depicts the feature accurately. Keep missing or unsuitable assets pending and use `releasekit-image` for the needed correction.
19
21
 
20
- Run `releasekit validate <version>`, resolve errors, and assess warnings. Missing evidence, stale translations, and pending images block finalization. If a linked predecessor is still a draft, complete it first when it is included in the user's scope; otherwise report that prerequisite. Do not mark an unresolved release ready or stop at a review report when finalization was requested and the release can be completed.
22
+ Run `releasekit validate <version>`, resolve errors, and assess warnings. Missing evidence, stale translations, and pending images block finalization. For unchanneled history, if a linked predecessor is still a draft, complete it first when it is included in the user's scope; otherwise report that prerequisite. Channel display predecessors may remain drafts; they do not block this release's finalization. Do not mark an unresolved release ready or stop at a review report when finalization was requested and the release can be completed.
21
23
 
22
24
  For a draft that passes review and validation, run `releasekit finalize <version>` and verify that `release.yaml` contains `status: ready` and a nonempty `contentHash`. The command validates again and records the fingerprint; do not set ready status manually. For an already ready release, validate and reuse it without calling finalize again. If requested corrections require changes, reopen it with `status: draft` and `contentHash: null`, apply the corrections, and finalize again.
23
25
 
24
- If export was requested, run `releasekit export --out <directory>`, using [the workflow](references/workflow.md) for defaults. Add `--current`, `--limit`, or `--locale` only for requested overrides or to resolve multiple release endpoints. With no language override, export all locales saved in the current release to separate JSON files that share image assets. Preserve individual release boundaries and configured fallback themes. A successful finalization is a complete local result even when no export was requested. Finalization does not commit, tag, push, deploy, or publish.
26
+ If export was requested, run `releasekit export --out <directory>`, using [the workflow](references/workflow.md) for defaults. For channel output, pass the requested `--channel`; it uses the global chain and skips excluded channels and drafts. `--current` is only for unchanneled output. Add `--limit` or `--locale` only for requested overrides; no limit means all matching releases. With no language override, export all locales saved in the current release to separate JSON files that share image assets. Preserve individual release boundaries and configured fallback themes. A successful finalization is a complete local result even when no export was requested. Finalization does not commit, tag, push, deploy, or publish.
25
27
 
26
28
  When finalized, report the version and link to its release file, adding bundle links only for a completed requested export. If blocked, state the remaining work and the actual saved status. Follow [the next-step workflow](references/workflow.md#continue-to-the-next-step) without introducing a separate review stage.
@@ -3,6 +3,8 @@ name: releasekit-image
3
3
  description: Create, revise, or import ReleaseKit release illustrations with consistent composition and project-configured dark and light variants. Use for visual release-note assets and generation prompts, not general UI implementation or arbitrary image work.
4
4
  ---
5
5
 
6
+ Keep the resolved release identity, including its channel, from the request or existing release. Pass `--channel` on every channel-specific command. Do not repeat the first-use choice or choose a new channel during this stage. If the same version exists in several channels and the target is unresolved, ask which release is intended. See [channels](references/channels.md).
7
+
6
8
  Before asking anything, check for an unanswered question request already in this conversation. Keep that request pending across skill transitions and queue every new question until it is resolved; follow [the shared question guidance](references/workflow.md#ask-with-the-native-question-ui).
7
9
 
8
10
  Read the saved release's complete current note list and captured visual policy on every invocation. Default to covering every drafted note, including notes added since earlier image work; honor only the user's explicit text-only choices or explicitly limited request. Follow [coverage and repeat runs](references/theme-pairing.md#coverage-and-repeat-runs) to reuse accepted images and fill missing ones. For grouped minor fixes and improvements, follow [common images](references/common-images.md) first: reuse reviewed project originals before generating anything, and create only missing originals or themes. Choose the [media source](references/media-sources.md), then read [the visual language](references/visual-language.md) and applicable [composition recipe](references/composition-recipes.md). Use [the pairing guide](references/theme-pairing.md) for configured themes, cost-aware reuse, and importing images. Consult [the file contract](references/format.md) when editing a brief.
@@ -11,7 +13,7 @@ When a user decision is needed during image work, such as an ambiguous target fo
11
13
 
12
14
  For standalone notes, derive one visual message from the release note and its Git/product evidence. Minor groups use the common kind's generic scene, independent of their current bullet list. Choose an archetype and `source`; the scaffold leaves both unselected. Generate flat explanatory graphics when an abstraction is sufficient. `object-detail` and `editorial-scene` require supplied media, and any other type can use an actual capture when fidelity matters. Search existing approved assets or use the user's capture; if absent, ask for the specific image and keep it pending. Do not invent a physical product, content artwork, or decorative 3D scene. Examples illustrate individual features, not default layouts.
13
15
 
14
- Start each generated scene in neutral values and establish its focal point through composition, scale, and contrast. Map visible schematic groups to the captured palette roles in `composition`, using the [neutral role assignments](references/visual-language.md#assign-neutral-colors-by-role). Light glyphs use `primary`; incidental bars use the lighter `secondary`. Do not introduce new gray tones, tint, opacity, gradients, or shading per image. Improve geometry and spacing before darkening the palette for clarity, and preserve explicit project color overrides. In `composition`, record either no accent or the exact element and supported meaning that needs color. The configured accent is optional; a newly announced capability or a simple relationship between symbols does not justify coloring an icon. Keep generic capability and minor-group icons neutral. Preserve meaningful status, map, chart, and supplied-content colors.
16
+ Establish a clear hierarchy with neutral supporting elements and purposeful focal color. Map visible schematic groups to the captured palette roles in `composition`, using the [neutral role assignments](references/visual-language.md#assign-neutral-colors-by-role). Assign roles by hierarchy, not object type alone, and preserve explicit project color overrides. Follow the [independent theme treatments](references/theme-pairing.md#one-scene-two-presentation-treatments): dark images retain compact mid-light neutral glyphs and necessary charcoal layers; light images use medium-gray neutral glyphs and softer supporting values. Keep flat fills consistent. Correct glyph weight and spacing in the shared scene for both themes; a light-only palette correction leaves accepted dark assets intact. In `composition`, identify the accent target and its meaning, or choose a neutral treatment when appropriate. Prefer accent for the primary action, selected/enabled state, active path, or focal information when it helps readers find the feature; it need not be indispensable in grayscale. Keep generic information and minor-group icons normally neutral. Respect explicit monochrome choices. For a requested accent revision, update the affected scene assignment instead of treating an earlier neutral choice as permanent. Preserve meaningful status, map, chart, and supplied-content colors.
15
17
 
16
18
  Complete each missing or unfinished scene brief before planning the release. Preserve the briefs of unchanged accepted images. Each note has one shared scene brief for its configured variants. Keep common minor-group scenes independent of release-specific text and evidence. For standalone scenes, encode product facts and uncertainties in `context`, the relevant state and relationships in `composition`, and the feature-specific correctness constraints in `preserve` and `avoid`. Keep reference identities and attributed style names out of prompts and assets. Inspect product references as evidence. Do not invent a concrete UI or physical design to fill missing evidence; use a supported abstraction or leave the unresolved detail in the brief.
17
19
 
@@ -21,7 +23,7 @@ For an image replacement or regeneration request, reuse the existing release and
21
23
 
22
24
  If no image generator is available, preserve the generated prompt files and report the pending assets. Continue independent editorial work. Do not silently call a paid API, install a provider, or replace requested raster illustrations with placeholders. Import user-supplied PNG, JPEG, or WebP files when they become available.
23
25
 
24
- Inspect selected images at full resolution and small-card size. First compare the image with the note, product evidence, and scene-specific constraints using the selected recipe's review criteria. Then check visual clarity and theme correspondence, including whether accent is absent or stays confined to its justified elements. Review the release images together for repeated decorative accents; do not assign one colored point to every note or impose a fixed color quota. The CLI checks files and metadata; it does not decide whether an image truthfully depicts the feature. Two matching variants can share the same factual or structural mistake. Correct a defect in its own scene or applicable recipe; promote it into common guidance only when the principle applies across features.
26
+ Inspect selected images at full resolution and equal small-card widths. Review dark images together for compact glyph weight and charcoal hierarchy, then light images together for soft neutral values. First compare the image with the note, product evidence, and scene-specific constraints using the selected recipe's review criteria. Then check visual clarity and theme correspondence: an assigned functional accent must remain visible and confined to its intended elements. Review the release for both decorative overuse and suppressed functional accents; grayscale readability alone is not a reason to remove color. Do not impose a fixed color quota. The CLI checks files and metadata; it does not decide whether an image truthfully depicts the feature. Two matching variants can share the same factual or structural mistake. Correct a defect in its own scene or applicable recipe; promote it into common guidance only when the principle applies across features.
25
27
 
26
28
  If the accepted image requires an alt-text correction, update the source and affected translations using [Translate selected locales](references/workflow.md#translate-selected-locales), reviewing them before recording new source fingerprints.
27
29
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@iodes/releasekit",
3
- "version": "0.1.6",
3
+ "version": "0.2.0",
4
4
  "description": "Git-based visual release notes and portable agent skills",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -14,6 +14,14 @@
14
14
  "type": "string",
15
15
  "pattern": "^[a-z]{2,3}(?:-[A-Za-z0-9]{2,8})*$"
16
16
  },
17
+ "viewChannel": {
18
+ "type": "string",
19
+ "pattern": "^(?!(?:con|prn|aux|nul|com[1-9]|lpt[1-9])$)[a-z][a-z0-9-]{0,62}$"
20
+ },
21
+ "currentChannel": {
22
+ "type": "string",
23
+ "pattern": "^(?!(?:con|prn|aux|nul|com[1-9]|lpt[1-9])$)[a-z][a-z0-9-]{0,62}$"
24
+ },
17
25
  "releases": {
18
26
  "type": "array",
19
27
  "items": {
@@ -23,16 +31,57 @@
23
31
  "type": "string",
24
32
  "pattern": "^[a-zA-Z0-9][a-zA-Z0-9._+-]{0,95}$"
25
33
  },
26
- "releasedAt": {
34
+ "channel": {
27
35
  "type": "string",
28
- "format": "date",
29
- "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
36
+ "pattern": "^(?!(?:con|prn|aux|nul|com[1-9]|lpt[1-9])$)[a-z][a-z0-9-]{0,62}$"
30
37
  },
31
- "previous": {
38
+ "releasedAt": {
32
39
  "anyOf": [
33
40
  {
34
41
  "type": "string",
35
- "pattern": "^[a-zA-Z0-9][a-zA-Z0-9._+-]{0,95}$"
42
+ "format": "date",
43
+ "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
44
+ },
45
+ {
46
+ "type": "string",
47
+ "allOf": [
48
+ {
49
+ "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
50
+ },
51
+ {
52
+ "pattern": "T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,3})?(?:Z|[+-]\\d{2}:\\d{2})$"
53
+ }
54
+ ]
55
+ }
56
+ ]
57
+ },
58
+ "previous": {
59
+ "anyOf": [
60
+ {
61
+ "anyOf": [
62
+ {
63
+ "type": "string",
64
+ "pattern": "^[a-zA-Z0-9][a-zA-Z0-9._+-]{0,95}$"
65
+ },
66
+ {
67
+ "type": "object",
68
+ "properties": {
69
+ "channel": {
70
+ "type": "string",
71
+ "pattern": "^(?!(?:con|prn|aux|nul|com[1-9]|lpt[1-9])$)[a-z][a-z0-9-]{0,62}$"
72
+ },
73
+ "version": {
74
+ "type": "string",
75
+ "pattern": "^[a-zA-Z0-9][a-zA-Z0-9._+-]{0,95}$"
76
+ }
77
+ },
78
+ "required": [
79
+ "channel",
80
+ "version"
81
+ ],
82
+ "additionalProperties": false
83
+ }
84
+ ]
36
85
  },
37
86
  {
38
87
  "type": "null"