isotone 0.4.1 → 1.0.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.
package/dist/serve.js CHANGED
@@ -11,7 +11,7 @@ import {
11
11
  import {
12
12
  UPDATE_ENDPOINT,
13
13
  startUpdateCheck
14
- } from "./chunk-UMVPMPVE.js";
14
+ } from "./chunk-BJ4UI73I.js";
15
15
  import {
16
16
  NOTES_ENDPOINT,
17
17
  ensureFileIgnored,
package/dist/server.js CHANGED
@@ -10,10 +10,10 @@ import {
10
10
  readActive,
11
11
  variantsResponse,
12
12
  writeActive
13
- } from "./chunk-ZBULKB3S.js";
13
+ } from "./chunk-DD6BKC3R.js";
14
14
  import {
15
15
  VARIANTS_ENDPOINT
16
- } from "./chunk-SNGBNVH2.js";
16
+ } from "./chunk-OSETWKGE.js";
17
17
  import {
18
18
  NOTES_ENDPOINT,
19
19
  PAYLOAD_MAX,
@@ -15,14 +15,14 @@ import {
15
15
  resolveOverride,
16
16
  variantsDir,
17
17
  variantsResponse
18
- } from "./chunk-ZBULKB3S.js";
18
+ } from "./chunk-DD6BKC3R.js";
19
19
  import {
20
20
  VARIANTS_ENDPOINT
21
- } from "./chunk-SNGBNVH2.js";
21
+ } from "./chunk-OSETWKGE.js";
22
22
  import {
23
23
  UPDATE_ENDPOINT,
24
24
  startUpdateCheck
25
- } from "./chunk-UMVPMPVE.js";
25
+ } from "./chunk-BJ4UI73I.js";
26
26
  import {
27
27
  NOTES_ENDPOINT,
28
28
  ensureDirIgnored,
package/docs/migration.md CHANGED
@@ -12,8 +12,10 @@ its coding agent. The package and CLI are now `isotone`; the exported API names,
12
12
  CLI commands, standalone script URLs (`/isotone.js`), environment variables
13
13
  (`ISOTONE_UPDATE_CHECK` and `ISOTONE_VARIANT`), and agent instructions.
14
14
  Keep API names such as `iteration`, `IterationPanel`, and `mountIteration`.
15
- 4. If the project has local variants, move `.iso-iterate/variants/` to
16
- `.isotone/variants/` and update ignore rules. Check each variant preview
15
+ 4. Move the entire `.iso-iterate/` directory to `.isotone/`, including
16
+ `knobs.json`, `active.json`, and any local variants. Update ignore rules,
17
+ including a `.git/info/exclude` entry for `.isotone/active.json` if the
18
+ old active file was ignored there. Check each variant preview
17
19
  before promotion: a stored base snapshot containing the old package import
18
20
  can appear stale after the rename. Recreate or sync that variant against the
19
21
  renamed source rather than promoting it blindly. Leave
@@ -26,6 +28,6 @@ On the same browser origin, Isotone carries forward the previous default
26
28
  storage keys for offline notes, drafts, and knob selections. A different host,
27
29
  port, or browser profile has separate storage. Custom keys stay unchanged.
28
30
 
29
- The published `isotone@0.4.0` includes a one-time `migrate` command. Later
30
- versions use this guide; there is no migration command to maintain. Existing
31
- `iso-iterate` versions remain installable.
31
+ Use `isotone@0.4.1` or newer. The older 0.4.0 package includes a one-time
32
+ `migrate` command but also has note-saving bugs fixed in 0.4.1; use this guide
33
+ for the work repositories. Existing `iso-iterate` versions remain installable.
package/docs/updates.md CHANGED
@@ -35,9 +35,9 @@ The suggested command pins the specific version you just checked, rather than a
35
35
  `latest` tag that could move before installation. For example:
36
36
 
37
37
  ```sh
38
- npm install -D --save-exact isotone@0.4.1
39
- pnpm add -D --exact isotone@0.4.1
40
- yarn add -D --exact isotone@0.4.1
38
+ npm install -D --save-exact isotone@1.0.0
39
+ pnpm add -D --exact isotone@1.0.0
40
+ yarn add -D --exact isotone@1.0.0
41
41
  ```
42
42
 
43
43
  These examples illustrate the syntax; use the version reported by your check.
@@ -86,8 +86,9 @@ A lockfile records the selected dependency tree. `npm ci` installs that tree
86
86
  without updating the manifest or lockfile; publishing another version does not
87
87
  change it. [npm ci](https://docs.npmjs.com/cli/v11/commands/npm-ci/)
88
88
 
89
- `npm update` respects the declared range. Before 1.0, `^0.3.4` accepts patch
90
- releases below `0.4.0`; it does not adopt `0.4.0`. `^0.0.4` stays below `0.0.5`.
89
+ `npm update` respects the declared range. `^1.0.0` accepts compatible minor
90
+ and patch releases below `2.0.0`. Older `^0.3.4` installs stay below `0.4.0`;
91
+ they do not adopt `1.0.0`. `^0.0.4` stays below `0.0.5`.
91
92
  An explicit install of a new version deliberately changes that choice.
92
93
  [npm's range examples](https://docs.npmjs.com/cli/v11/commands/npm-update/)
93
94
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "isotone",
3
- "version": "0.4.1",
3
+ "version": "1.0.0",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "description": "Local feedback and design variants for your running web app. Pin elements, leave notes, and give your coding agent the context to make the change.",
@@ -35,7 +35,12 @@
35
35
  },
36
36
  "files": [
37
37
  "dist",
38
- "docs",
38
+ "docs/assets/preview.jpg",
39
+ "docs/integrations.md",
40
+ "docs/migration.md",
41
+ "docs/updates.md",
42
+ "docs/variants.md",
43
+ "docs/third-party-notices.md",
39
44
  "AGENTS.md",
40
45
  "CHANGELOG.md"
41
46
  ],
package/docs/design.md DELETED
@@ -1,213 +0,0 @@
1
- # Instrument design
2
-
3
- Instrument is the single design for Isotone: a horizontal pill with feedback
4
- and variant panels above it. Light and dark mode share components, geometry,
5
- typography, interaction states and motion. Only their paint tokens differ.
6
-
7
- The panel should feel like a small physical control placed on the host page.
8
- Depth explains function; decoration should not compete with the app being
9
- reviewed.
10
-
11
- ## Materials and states
12
-
13
- | Role | Light | Dark |
14
- | --- | --- | --- |
15
- | Panel surface | White with a light edge and crisp contact shadow | Dark neutral surface with a quiet edge and shadow |
16
- | Recessed field or selector slot | Gray fill and one crisp inset border | Deeper background with a restrained inset shadow |
17
- | Raised action or persistent selection | White face, gray border and unblurred gray bottom shadow | Lighter face, edge highlight and contact shadow |
18
- | Hover | Stronger text or edge within the existing material | Stronger text or a subtle lighter face |
19
-
20
- Gray means recessed in light mode. In the default design, selection means raised. Saved notes being
21
- edited, selected segments and thumbnails, the element picker toggle and open
22
- pill buttons indicate persistent selection. Segments, thumbnails and the picker
23
- use the shared selection recipe; pill buttons use Clean Highlight's simpler
24
- face, fine border and crisp contact shadow. A selected colour swatch
25
- keeps its represented colour inside that raised frame.
26
-
27
- Save as defaults, Send and other raised actions share their normal and hover
28
- recipes. Do not create a special Save button material, stack several inset
29
- borders, or use a brightness filter that also washes out the border. Hover must
30
- remain less prominent than a persistent selection.
31
-
32
- Idle pill icons and the count badge use the same muted visual hierarchy. The
33
- badge is part of the control, not a contrasting notification bubble. All icons
34
- come through the shared `Icon` component.
35
-
36
- Keyboard focus uses the common visible outline. The text field is an intentional
37
- exception: focusing it reveals the caret without changing the field's border,
38
- fill or bottom edge. Clicking any noninteractive area of the composer focuses
39
- the textarea. Its buttons retain their own actions. Disabled controls keep their
40
- shape and material, reduce opacity and do not receive hover treatment.
41
-
42
- ## Geometry and content
43
-
44
- The layout constants live in `styles.ts`. Current anchors are:
45
-
46
- | Measure | Value |
47
- | --- | --- |
48
- | Panel inset and regular section spacing | 12px |
49
- | Space between panels and between panel and pill | 8px |
50
- | Composer inset | 10px, derived from the panel inset |
51
- | Composer controls | 24px faces, 14px icons, 28px hit areas |
52
- | Collapsed pill | 44 × 44px |
53
- | Expanded pill with two tools | 76 × 44px |
54
- | Tool faces | 28px, with 4px between faces and around them |
55
- | Saved note padding | 6px vertically, 11px horizontally; background extends 1px past the composer on each side |
56
-
57
- The expanded pill is the same material stretched horizontally. Preserve its
58
- lower surrounding rim, inset and proportions. Panels stay anchored above it;
59
- opening one must not move the pill or scale the text in another. Save as defaults
60
- sits at the bottom left of the variants panel and appears only when needed.
61
-
62
- Slider label spacing accounts for the thumb's inset within its hit area, so its
63
- visible edge has the same 6px gap below the header as other controls. Range
64
- inputs use block layout to avoid extra inline baseline space.
65
-
66
- Selector labels and their action-dialog titles share one font rule. Opening a
67
- dialog must not make the same label heavier. Selected and unselected options
68
- use the same font weight; their material and text colour indicate selection. The host's `--font-sans` may provide
69
- the typeface; component weights and sizing stay in the shared stylesheet.
70
-
71
- Saved feedback uses one row with inline references and no extra gap between rows.
72
- Note text sits 3px outside the composer text inset. References use at most 42%
73
- of the row, leaving the note the remaining width. The delete action floats over
74
- the top-right corner with a 24px hit target; it reserves no column. Show it on
75
- hover, keyboard focus or selection, and always on touch devices.
76
- References name the pinned element or selector rather than displaying a route
77
- and pin count. Defaults and feedback references use the same compact tag shape,
78
- typeface, border and shadow. A single tag may use all available width; multiple
79
- tags receive compact width limits. Preserve the full accessible text when
80
- clipping it visually.
81
-
82
- Composer tags share a horizontal strip. At rest their first and last edges align
83
- with the field's inset. While scrolling they can reach the field edges; there is
84
- no permanent side padding or dark fade in front of them. Editing and selector
85
- reference tags follow this same rule.
86
-
87
- Selector action dialogs show feedback first, then individual choices without
88
- an “Options” heading, followed by Reset to default, Keep default only, and
89
- removal last.
90
-
91
- Selector action dialogs have a 260px minimum height and reserve 360px in their
92
- parent panel when space allows, even for a selector with only one action. The viewport remains the upper
93
- bound; short screens scroll instead of pushing controls off-screen.
94
-
95
- Removal actions create readable, editable requests for the coding agent. They do
96
- not hide or mutate selectors, options or dependent controls. Cancel a pending
97
- request from its feedback note; selectors do not add a status or Undo row. Pending actions are
98
- disabled in the menu to avoid duplicate requests. Cancelling a pending request
99
- leaves the preview unchanged. Once an agent applies a source change, deleting the
100
- request does not undo that change.
101
-
102
- Native tooltips are reserved for brief icon-only hints and labels that actually
103
- overflow. Do not put full feedback notes, readable labels or internal selectors
104
- in `title` attributes. Check label overflow on pointer entry, without observing
105
- or measuring every row during render. Accessible labels retain the full text.
106
-
107
- ## Scrolling
108
-
109
- Keep native scrolling, wheel/trackpad input and keyboard focus reveal. Hide
110
- scrollbar chrome without disabling overflow.
111
-
112
- Content passing under a fixed area fades into the actual surface. This applies
113
- to the Save footer, selector action-dialog header, conditional error footer and
114
- both edges of the saved-note list and the top of scrolled composer text. List
115
- padding lets its first and last rows scroll fully clear of the fades. The textarea top
116
- mask appears only after scrolling, preserving its first line at rest. Without
117
- reference tags, the textarea extends through the field's top inset: that space
118
- scrolls away with the content, and the fade reaches the field edge. With tags,
119
- the gap below the reference strip also belongs to the scrolling text area;
120
- scrolled text fades directly beneath the strip. Use the shared surface token or a mask so the
121
- fade also works over dark gradients. Do not create a hard clipping edge inside
122
- an otherwise empty inset. The first and last item must remain fully reachable;
123
- reserve scroll padding for fixed controls and keyboard outlines.
124
-
125
- ## Theme configuration
126
-
127
- `theme` accepts four values on the React panel, mount and integrations:
128
-
129
- | Value | Meaning |
130
- | --- | --- |
131
- | `auto` (default) | Follow the actual page background near the dock |
132
- | `system` | Follow the OS colour preference, independent of the host page |
133
- | `light` | Always use the light palette |
134
- | `dark` | Always use the dark palette |
135
-
136
- Automatic detection ignores the overlay itself, composites transparent page
137
- backgrounds and follows page changes without polling. An unpainted canvas uses
138
- CSS `color-scheme`, or white when no dark canvas is declared. Open shadow roots
139
- at the sample point are included where the browser exposes them.
140
-
141
- Image and gradient backgrounds, closed shadow roots and CSSOM-only changes
142
- without a DOM or browser event cannot be reliably inferred. Those hosts should
143
- pass an explicit theme or use `system`. Keep detection in `theme.ts`; do not add
144
- component-level checks of page classes, media queries or background colour.
145
-
146
- ## Motion
147
-
148
- Motion explains opening, closing and layout changes. Keyboard-initiated actions
149
- are immediate. Reduced motion removes spatial movement. Pointer hover stays
150
- brief. The launcher expands on mouse or hovering-pen entry, including on hybrid
151
- devices whose primary pointer reports as coarse. Touch still opens it by tap.
152
- The pill has a continuous hit surface across its rim and the gap between icons.
153
-
154
- `motion.ts` owns the shared timings: 200ms entry, 125ms exit and 180ms list reflow,
155
- with `cubic-bezier(.23,1,.32,1)`. Reuse these values instead of adding timing
156
- literals. There is no stagger across a queue of controls.
157
-
158
- Panel and list movement uses transforms and opacity through the Web Animations
159
- API. Text, corners and hit targets retain their natural size. Read positions
160
- before writing styles, retarget interrupted movement, and cancel animations on
161
- cleanup. The small pill width transition is bounded to the dock itself; do not
162
- extend width or height animation to long content lists.
163
-
164
- Lists above `MAX_ANIMATED_ITEMS` (40) update immediately. Large panels also skip
165
- cloned exit snapshots. Hidden lists do not measure every render, and typing in
166
- the composer must not remeasure unchanged selectors or notes.
167
-
168
- ## Where changes belong
169
-
170
- | File | Responsibility |
171
- | --- | --- |
172
- | `src/react/appearance.ts` | Complete light/dark palettes and the shared material recipe |
173
- | `src/react/styles.ts` | Geometry, typography, shared control classes and state selectors |
174
- | `src/react/feedback-layout.ts`, `pill-active.ts` | Small material/layout recipes that can be independently previewed as overlays |
175
- | `src/react/UpdateNotice.tsx` | Quiet local update snapshot and explicit upgrade instructions |
176
- | `src/react/icons.tsx` | Icon choices, optical size and stroke |
177
- | `src/react/NoteSummary.tsx` | Saved feedback/defaults summaries and their shared tag rendering |
178
- | `src/react/IterationPanel.tsx` | Dock, composer, feedback and element-picking behavior |
179
- | `src/react/VariantsView.tsx` | Selectors, action dialogs and Save as defaults |
180
- | `src/react/theme.ts` | Theme resolution, observation and cleanup |
181
- | `src/react/motion.ts` | Motion timing and work limits |
182
- | `src/react/useDockMotion.ts`, `useLayoutMotion.ts` | Measured movement and interruption handling |
183
-
184
- To add a control, choose its semantic role first: surface, well, raised action or
185
- selection. Reuse that recipe and an existing control class where possible.
186
- Add any new state selector once in `styles.ts`. A new paint token must exist in
187
- both palettes; a spacing or behavior change never belongs in a theme branch.
188
- Extract repeated markup when it has shared behavior or content rules, as with
189
- summary tags, rather than copying a component for another theme.
190
-
191
- ## Verification
192
-
193
- Inspect the same content in both themes: collapsed and expanded pill, empty and
194
- saved feedback, editing, pinned references, selectors, action dialogs, hover,
195
- keyboard focus, disabled actions and scrolling edges. Include a narrow viewport,
196
- long unbroken labels, many notes and many selector options. Exercise rapid
197
- open/close, keyboard shortcuts and reduced motion.
198
-
199
- The style tests reject theme-specific component/state rules and missing or
200
- circular paint tokens. React tests cover shared interactions, theme changes and
201
- async state preservation. Run `pnpm check` before a release. For screenshots,
202
- use synthetic demo content; never include local feedback files, personal notes
203
- or a real project's private interface.
204
-
205
- ## Accepted design choices
206
-
207
- Inline references is the feedback layout. Clean Highlight is the active-pill
208
- material: a slightly lighter solid face, fine border and crisp 1px contact
209
- shadow. Both themes use the same recipe in `pill-active.ts`.
210
-
211
- Earlier list alternatives and the default, ring, dot, recessed and inset pill
212
- experiments have been removed. New alternatives should start from this baseline
213
- and remain separate until explicitly chosen.
@@ -1,86 +0,0 @@
1
- # Development
2
-
3
- The runtime is TypeScript throughout. The expensive work is DOM traversal, disk
4
- access, and redundant updates; avoiding that work matters more here than adding
5
- a second language or runtime.
6
-
7
- ## Boundaries
8
-
9
- | Layer | Responsibility |
10
- | --- | --- |
11
- | `src/core` | Note descriptors, browser persistence, variant sources and selection rules. No React or Vite. |
12
- | `src/react` | Shadow-root panel, shared materials, controls, themes and motion. |
13
- | `src/store.ts`, `src/file-store.ts` | Validated note storage, atomic writes and serialized updates. |
14
- | `src/variants-store.ts` | Manifests, file alternatives, path guards, activation and promotion. |
15
- | `src/server` | Request adapters, bounded bodies and origin checks. |
16
- | `src/vite`, `src/serve` | Development-server integration and self-contained panel delivery. |
17
- | `src/cli` | Setup, feedback and variant commands over the same stores. |
18
- | `src/standalone` | Private bundled React runtime for hosts without React. |
19
-
20
- Public entry points are `react`, `core`, `server`, `serve`, `vite`, and `cli`.
21
- Keep browser code out of server entries and keep React/Vite optional for CLI and
22
- standalone consumers. The build bundles only the icons used by the panel.
23
-
24
- ## Local workflow
25
-
26
- `pnpm dev` starts the fictional demo at `http://127.0.0.1:4173`. Its top bar
27
- provides the theme settings:
28
-
29
- | Control | What it changes |
30
- | --- | --- |
31
- | Page | The mock app's actual light or dark background |
32
- | Panel | Automatic page detection, system preference, or an explicit theme |
33
-
34
- The sample app's Spacing, Accent colour, Card radius and Card padding selectors
35
- remain inside the panel. Clean Highlight is the product default; there is no
36
- active-pill design switcher.
37
-
38
- `/preview.html` composes real components in both themes for the README image.
39
- Demo feedback uses seeded files in a temporary
40
- directory, separate from project notes; the server removes them when it closes.
41
- Open `/?stress=1` for 500 selectors and 500 notes, including long labels and large
42
- feedback.
43
-
44
- `pnpm check` runs types, lint, build, and the test suite. `pnpm check:package`
45
- exercises the packed artifact in a clean consumer. Tests focus on observable
46
- behaviour, transport/store failures, lifecycle cleanup, and design boundaries.
47
- Use small regression cases for bugs; avoid tests that merely duplicate code.
48
-
49
- ## Performance
50
-
51
- Selector dependencies are walked iteratively in linear time; long chains do not
52
- consume the JavaScript call stack. DOM descriptors read sibling metadata only
53
- where a selector needs it. Variant status uses an in-process Git-compatible blob
54
- hash rather than launching a process per file.
55
-
56
- Theme events and picker geometry are coalesced per frame. Note and selector layout
57
- animation runs only when the collection changes; collections above 40 items skip
58
- per-item motion. Reads precede writes, interrupted animations start from the
59
- visible position, and reduced-motion or keyboard actions remove movement.
60
-
61
- Do not add virtualization or a new runtime without a measured bottleneck and a
62
- clear benefit. Preserve native scrolling and keyboard access. Before changing
63
- performance-sensitive code, include large collections and failure/retry paths in
64
- validation; a fast happy path is insufficient.
65
-
66
- ## UI changes
67
-
68
- Follow [the design language](design.md). Use shared semantic materials and
69
- components rather than selector-specific theme overrides. Check both themes,
70
- selected/hover/focus/disabled states, long labels, empty and populated feedback,
71
- sticky fades, narrow viewports, and reduced motion. Context must remain accessible
72
- even when a label is visually truncated.
73
-
74
- `src/react/feedback-layout.ts` holds the accepted inline-reference layout.
75
- `src/react/pill-active.ts` holds the accepted Clean Highlight recipe. Future
76
- review alternatives belong under `.isotone/variants/`.
77
- Edit the copied recipe when developing an alternative; keep shared geometry,
78
- theme tokens and unrelated controls in the main stylesheet.
79
-
80
- The panel's auto theme samples rendered background colours, not pixels from
81
- images. A host can pass `light` or `dark` when those samples do not represent the
82
- page. `system` deliberately ignores the host theme.
83
-
84
- For notice layout checks, `/?review=1&update-preview=1` supplies a fictional
85
- update result. It does not contact npm or install anything. `/?review=1` keeps
86
- feedback open across variant reloads.
package/docs/releasing.md DELETED
@@ -1,87 +0,0 @@
1
- # Releasing
2
-
3
- A push runs CI; it does not publish. Publishing a stable GitHub Release starts
4
- `.github/workflows/publish.yml`. Its tag must be exactly `v` followed by the
5
- version in `package.json`. Prereleases are skipped.
6
-
7
- ## Before making the repository public
8
-
9
- Review the tracked tree and Git history, including deleted files, for private
10
- notes, credentials, internal URLs, screenshots and personal machine paths.
11
- Check the actual npm archive too: source maps contain source text. Keep demo
12
- content fictional and keep local feedback and scratch files out of Git and npm.
13
- A clean current tree does not prove that old commits are suitable for publication.
14
-
15
- Keep the MIT copyright notice and [third-party license notices](third-party-notices.md). Public author
16
- attribution and the intended repository/package links are deliberate; do not
17
- remove them as part of privacy cleanup. If history needs cleanup, agree on that
18
- separately before changing it or opening the repository.
19
-
20
- ## Prepare a release
21
-
22
- 1. Update the package version and changelog. Preserve the lockfile's resolved
23
- versions unless the release intentionally changes dependencies.
24
- 2. Run `pnpm install --frozen-lockfile`, `pnpm check`, and `pnpm check:package`.
25
- Inspect both themes in the demo and confirm a production Vite build contains
26
- no panel. Manual integrations must also guard their endpoints in production.
27
- 3. Inspect `npm pack --dry-run --json`. Expect the built entries, declarations,
28
- source maps, documentation and licenses. Check that the README preview image
29
- exists and uses fictional content.
30
- 4. After approval to release, commit the reviewed changes and publish a GitHub
31
- Release at `v<version>`. Do not reuse a version already published to npm.
32
-
33
- The release check job rebuilds and tests the tagged checkout, then creates an
34
- archive. A separate job downloads that archive and publishes it with provenance.
35
- Only that job has OIDC permission; it does not install dependencies or run project
36
- scripts. CI also checks the packed runtime on Node 20 and full development checks
37
- on Node 22 and 24.
38
-
39
- ## npm setup outside the repository
40
-
41
- In the package's npm settings, verify the trusted publisher names the intended
42
- GitHub owner, repository and **`publish.yml`**. Allow direct `npm publish`; new
43
- configurations can default to staged publishing only. This workflow has no GitHub
44
- environment name, so the configured publisher must not require one. An existing
45
- working publisher does not need replacing. A new configuration must complete its
46
- first publish within two days. The workflow uses GitHub-hosted runners, Node 24,
47
- and checks for npm 11.5.1 or newer. No long-lived publish token is needed.
48
- See [npm's trusted publishing guide](https://docs.npmjs.com/trusted-publishers/).
49
-
50
- The intended repository and package must be public for provenance, and
51
- `package.json`'s repository URL must match the publishing repository. Opening the
52
- repository and changing npm settings are separate maintainer actions. The local
53
- checks do not verify account-side configuration or prove that publication will
54
- succeed. See [npm's provenance requirements](https://docs.npmjs.com/generating-provenance-statements/).
55
-
56
- After publishing, verify the new version, README image, exports and provenance
57
- on npm, then try the documented quick start in a clean project.
58
-
59
- ## First release under the Isotone name
60
-
61
- Renaming the GitHub repository does not rename an npm package or change existing
62
- installs. npm requires publishing under the new name. Keep `iso-iterate`
63
- available so its existing lockfiles remain installable; deprecate it only after
64
- the new package and migration have been verified. See npm's
65
- [rename guidance](https://docs.npmjs.com/unpublishing-packages-from-the-registry/)
66
- and [deprecation guidance](https://docs.npmjs.com/deprecating-and-undeprecating-packages-or-package-versions/).
67
-
68
- Before tagging the first release, confirm that the publishing account can use
69
- `isotone`. A registry 404 or an unpublished-package record does not establish
70
- ownership or permission to publish. A successful local build establishes neither.
71
- If npm does not offer settings for the new package yet, establish it using an
72
- authenticated, maintainer-approved first publication before relying on its
73
- trusted publisher. Do not create a release tag on the assumption that the old
74
- package's publisher configuration applies to the new name.
75
-
76
- Configure the new package's publisher for `aaroi/isotone` and `publish.yml`, and
77
- verify its repository metadata. Then test both a clean install and the
78
- [migration](migration.md) in a copy of an existing project. Only after those pass,
79
- an authorized maintainer can set the old package's deprecation message:
80
-
81
- ```sh
82
- npm deprecate iso-iterate "Renamed to isotone. Migration: https://github.com/aaroi/isotone/blob/main/docs/migration.md"
83
- ```
84
-
85
- Deprecation displays guidance during installation; it does not migrate files,
86
- change dependencies, or remove existing installations. Do not unpublish the old
87
- package as part of the rename.