@penpair/web 0.3.1 → 0.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,57 +0,0 @@
1
- # PR draft
2
-
3
- Target: `main` ← `codex/penpair-improvements`
4
-
5
- Title: **Add guarded design workflows and reviewed whole-family releases**
6
-
7
- ## Description
8
-
9
- Penpot operations now pin the target file, stop ambiguous write retries, require
10
- positive readback evidence and record recovery progress. Structured inspection,
11
- token ownership/reconciliation, explicit design cases, approvals, snapshots and
12
- implementation handoffs make design-to-code work reproducible and reviewable.
13
-
14
- The branch also adds project MCP tools, reusable build recipes, focused agent
15
- skills, private credential references, advisory audits and clearer documentation.
16
- The neutral core and one-way package dependency rules remain enforced.
17
-
18
- Releases now use Changesets to collect notes into one **Release Penpair** PR. All
19
- six packages receive the same bump, including unchanged packages. Merging that
20
- reviewed version PR can trigger the existing guarded whole-family publisher using
21
- npm OIDC. Feature merges only collect notes. The owner-approved temporary
22
- `PENPAIR_RELEASE_EXCLUDE_PENPAIR=true` repository variable can omit only the
23
- blocked short-name wrapper from publishing, with explicit logs/summary and all
24
- other packages still required. All six repository versions continue together. A separate GitHub PR token is needed
25
- for automatic version-PR checks. Both automation paths remain disabled until
26
- owner activation; no package version is changed by this PR. The pending note
27
- proposes 0.2.0 in the separate generated version PR.
28
-
29
- ## Validation
30
-
31
- - `pnpm check`: build, typecheck, 583 tests and lockstep/config checks.
32
- - `pnpm smoke:package`: all six tarballs install and run in clean consumers.
33
- - Real Changesets CLI tests verify unchanged-package bumps, highest-level
34
- selection, changelogs, note consumption and exact workspace dependencies.
35
- - A disposable full version-wrapper rehearsal moves every package, changelog and
36
- the source constant to 0.2.0; this branch remains at 0.1.3.
37
- - All three workflows pass actionlint 1.7.12 and parsed permission/gate checks.
38
- - Gate tests cover ordinary pushes, exact merged version PRs, manual confirmation,
39
- pending notes, malformed auth evidence and workflow permission separation.
40
- - Detached-checkout regression runs the exact CI Changesets command against the
41
- base SHA and verifies consumed-note version PRs through their dedicated path.
42
- Version-PR creation also supports a main-only manual trigger.
43
-
44
- ## Open acceptance and activation
45
-
46
- - Hosted export/import restore proof (G3), two-person live trials (I12), and
47
- real component measurement/override proof (C1) remain unchecked by request.
48
- Native component generation remains gated.
49
- - Configure GitHub main/environment protection, the PR token and trusted
50
- publishers for every npm package before enabling release automation. Verify
51
- the previously refused short name and any unpublished package bootstrap.
52
- - npm publication is sequential; partial failures require explicit recovery.
53
- - No remote policy, live Penpot mutation, consumer edit, upstream message,
54
- release, tag or deployment was performed.
55
-
56
- Review details: [branch review](branch-review.md), [living checklist and
57
- reports](improvements.md), [release activation](releasing.md#one-time-owner-activation).
@@ -1,77 +0,0 @@
1
- # Tradient adoption proposal — owner review required
2
-
3
- This is a scoped handoff, not an applied consumer change. Read-only inspection on 2026-10-21 found local `main` at `3aa7a1c` in `/Users/niklaswestman/Documents/tradient/CODE/tradient`. The pre-existing untracked `penpot-poc/` folder remains untouched. No consumer files, commits, configuration, Penpot data or deployment state were changed.
4
-
5
- ## Evidence and corrections
6
-
7
- - Root dev dependencies pin `@penpair/web` and `@penpair/marwes-ui` to `0.1.3`; the primary UI uses `@marwes-ui/react` `^1.11.0`.
8
- - Root package scripts contain no `design:*` entries. `.env.example` has no `PENPAIR_MCP_URL` entry; no personal key file was read.
9
- - `penpair.config.json` names `Tradient`, the `packages/frontend-evolved` app, `tradientLight`/`tradientDark` from its `src/theme.ts`, and `design/marwes-tokens.snapshot.json`. It has neither a file pin nor baselines.
10
- - The committed snapshot is schema 1 with the generated Core/Dark and Tradient Light/Dark sets. It declares no project extra set or ownership map.
11
- - `packages/frontend-evolved/src/components/organisms/sidebar-nav.tsx` already exports `SidebarNav`. Reuse and assess that component before proposing another sidebar. A missing upstream-library primitive does not mean the consumer lacks one.
12
- - The existing API workflow uses Node 20, pnpm 10.12.1 and a frozen lockfile install. Its legacy-frontend typecheck is a separate migration concern; this design-token proposal does not change that job's unrelated behavior.
13
-
14
- The new commands in this improvement branch are unreleased. A `0.1.3` version string alone does not prove the installed tarball contains these changes. First use an owner-reviewed release or an isolated packed-branch trial; do not edit the consumer to depend on unreviewed branch behavior.
15
-
16
- ## Proposed small adoption change
17
-
18
- - [ ] Owner authorizes a separate consumer branch and confirms the target checkout/worktree. Preserve `penpot-poc/` and every unrelated change.
19
- - [ ] Add these entries to the existing root `scripts` object:
20
-
21
- ```json
22
- {
23
- "design:doctor": "penpair doctor",
24
- "design:tokens:check": "penpair marwes tokens check"
25
- }
26
- ```
27
-
28
- - [ ] After the existing frozen install in the PR validation workflow, add this offline step:
29
-
30
- ```yaml
31
- - name: Check design token snapshot
32
- run: pnpm run design:tokens:check
33
- ```
34
-
35
- No Penpot key, browser or design-server connection belongs in this CI check. The initial adoption must regenerate the snapshot with the reviewed tool version before enabling a gate that would fail on the old expectation.
36
-
37
- - [ ] Add only this empty documentation entry to `.env.example`, with a comment that each person creates their own key and stores it locally:
38
-
39
- ```dotenv
40
- # Personal MCP endpoint; keep its value in ignored local configuration.
41
- PENPAIR_MCP_URL=
42
- ```
43
-
44
- - [ ] After installing the reviewed file-guard build, run `penpair connect --pin-file` while the owner independently confirms the intended open file. Commit the public file ID in `penpair.config.json`; keep personal keys out of the proposal, chat, diff and logs. Check `doctor --json` and exercise a wrong-file refusal on scratch files.
45
- - [ ] Reconcile the installed skill path and project-facts reference with the chosen agent client. Use the owned instruction integration rather than replacing unrelated `AGENTS.md` text. Keep file identity in the typed config; facts may point to it.
46
- - [ ] Declare the project-owned page/radius tokens under `marwes.extras` after reviewing their formulas or C1 measurements. Do not silently promote the field-note constants to authoritative component measurements.
47
- - [ ] Regenerate the schema-2 token snapshot, review ownership and value changes, then run `design:tokens:check`. Inspect `tokens push` before any separately authorized Penpot mutation. Differing designer values require an explicit adopt/overwrite decision; prune is not a cleanup shortcut.
48
-
49
- ## Baseline and implementation follow-up
50
-
51
- - [ ] Owner approves the intended `Dashboard / Desktop` frame and confirms its exact page, route and identity. No approval was inferred from the original brief.
52
- - [ ] Add a baseline block only after that decision. The shape below is a merge template; replace the route with the application's actual route key:
53
-
54
- ```json
55
- {
56
- "baselines": {
57
- "page": "Dashboard",
58
- "root": "design/baselines",
59
- "frames": [
60
- { "frame": "Dashboard / Desktop", "id": "dashboard-desktop", "route": "OWNER_CONFIRMED_ROUTE" }
61
- ]
62
- }
63
- }
64
- ```
65
-
66
- - [ ] Inspect `baselines`, explicitly authorize the first `--apply`, export/look twice, and commit only the reviewed reference generation. Add rich case metadata and required coverage once state/theme/fixture setup is specified. Rich cases remain pending implementation-provider mappings until those hooks exist.
67
- - [ ] Establish one working implementation comparison through the existing baseline route before expanding the consumer handoff. Capture stable fonts/data and show desktop/mobile plus one non-happy state. Browser interaction and accessibility checks remain separate.
68
- - [ ] Review the primary/border-brand/link/focus theme family with C4 lint and actual light/dark screenshots. Confirm supported theme-input fields before editing `src/theme.ts`; keep intentional blue accents when the owner chooses them. Regenerate/review the snapshot after any change.
69
- - [ ] Compare the app's Marwes 1.11.0 appearance against an isolated 1.4.1 reference when an owner-approved old fixture is available. Do not downgrade or alter the current consumer just to obtain that comparison.
70
- - [ ] Implement new UI only in `packages/frontend-evolved`, reusing its existing SidebarNav and library primitives. Follow its structure/styling/data patterns and preserve its product semantics. D1 supplies explicit behavior/component metadata; a visual frame alone cannot make this implementation mechanical.
71
- - [ ] Migrate useful build bodies into reviewed files or registered operations. Split pure helpers, inspection, idempotent mutation and independent readback. Use `@kit` and explicit adapter recipes, stable owned identities and full source hashes; do not copy the throwaway runner's path or name-based deletion shortcuts.
72
-
73
- ## Validation for that future consumer branch
74
-
75
- Run the new offline design check, the primary app's matching tests/typecheck/build, whitespace checks and a browser review for UI changes. Follow the consumer's own pre-push review instruction before a later authorized push or PR. No deployment, AWS write, publishing or external message is part of this handoff.
76
-
77
- Owner decisions still needed: which reviewed Penpair build to adopt, the confirmed Penpot file, initial frame approval/route, project-extra constants, intentional theme accents and scope of Dashboard implementation. This proposal keeps those decisions reviewable without applying them.
@@ -1,76 +0,0 @@
1
- {
2
- "schemaVersion": 1,
3
- "kind": "human-trial",
4
- "status": "not-run",
5
- "commit": null,
6
- "artifacts": [],
7
- "participants": [],
8
- "environment": {
9
- "os": null,
10
- "node": null,
11
- "packageManager": null,
12
- "agentClient": null,
13
- "skillPath": null,
14
- "penpotDeployment": null,
15
- "apiVersion": null
16
- },
17
- "target": {
18
- "ownerAuthorized": false,
19
- "fileIds": [],
20
- "pageIds": []
21
- },
22
- "metrics": {
23
- "timeToDoctorGreenMs": null,
24
- "interventions": null,
25
- "understandableFailures": null,
26
- "eligibleTokens": null,
27
- "boundTokens": null,
28
- "inspectionComplete": null,
29
- "verifiedOutcomes": null
30
- },
31
- "exercises": {
32
- "onboarding": {
33
- "status": "not-run",
34
- "evidence": [],
35
- "findings": null
36
- },
37
- "skillDiscovery": {
38
- "status": "not-run",
39
- "evidence": [],
40
- "findings": null
41
- },
42
- "smallBuild": {
43
- "status": "not-run",
44
- "evidence": [],
45
- "findings": null
46
- },
47
- "wrongFile": {
48
- "status": "not-run",
49
- "evidence": [],
50
- "findings": null
51
- },
52
- "writerConflict": {
53
- "status": "not-run",
54
- "evidence": [],
55
- "findings": null
56
- },
57
- "recovery": {
58
- "status": "not-run",
59
- "evidence": [],
60
- "findings": null
61
- },
62
- "implementationRoute": {
63
- "status": "not-run",
64
- "evidence": [],
65
- "findings": null
66
- },
67
- "cleanup": {
68
- "status": "not-run",
69
- "evidence": [],
70
- "findings": null
71
- }
72
- },
73
- "blockers": [],
74
- "backlogChanges": [],
75
- "ownerReviewed": false
76
- }
package/docs/trials.md DELETED
@@ -1,41 +0,0 @@
1
- # Human trial runbook (I12)
2
-
3
- Status: prepared, **not run**. Niklas asked to finish branch code and leave live trials pending (2026-10-21). Offline fixtures exercise control flow, not people, real servers, visual parity or adoption. Keep I12 unchecked until two actual people complete the exercises and review one real design-to-code route.
4
-
5
- ## Preparation
6
-
7
- Use two consenting people with separate fresh project folders, personal connections and independently owned credentials. The owner must explicitly authorize two disposable Penpot files and identify their public file/page IDs. Never infer authorization from a file name. Keep the editor visible. No telemetry runs in the background.
8
-
9
- Record commit, tarball SHA-256 hashes, package versions, OS, Node/package manager, actual agent client, Penpot deployment and observed API version in [report-template.json](trials/report-template.json). This branch still reports 0.1.3: the version alone cannot distinguish it from the registry release. Use a reviewed release or pack the complete branch package set. When installing command/adapter tarballs, override `@penpair/core` to the matching local core tarball, as `scripts/smoke-package.mjs` does. Installing only the web tarball may silently resolve an older registry core.
10
-
11
- Start the clock before setup. Each person enters their own secret through the documented hidden connection flow; never collect the key in a report, shell transcript or screenshot. Run onboarding and `doctor --json`, then configure the owner-confirmed file pin. Record interventions and exact understandable or confusing failures, with credentials redacted.
12
-
13
- Preview `penpair skills install --dry-run` before installation. Test discovery separately in each actual agent client. Codex scans repository `.agents/skills` from the current folder to the repository root and supports symlinked skill folders; check the skill selector and invoke the skill explicitly before assessing automatic discovery. See [official skill documentation](https://learn.chatgpt.com/docs/build-skills). Record the actual installed path, client version and observed discovery; do not generalize one client's result to another.
14
-
15
- ## Exercises
16
-
17
- 1. Build a small card using the [reviewed Hello-card example](../examples/hello-card/README.md), or use `probe --deep --kit --write` on an authorized scratch file with active typed tokens and an available font. Inspect the private preview. Record eligible/bound token counts with the inspected population and whether traversal was complete. The probe removes its temporary root; any persistent example needs an explicit owner-reviewed cleanup.
18
- 2. Pin file A, open disposable file B, and run `examples/trials/wrong-file-read.js` through `run-file` without a page argument. Expect a file-guard refusal before the body. Basic `pages` inspection only warns by design, so it is not the hard-block exercise. Restore A afterward.
19
- 3. Use a dedicated empty page in A. Copy `examples/trials` into each scratch project. Person A runs the holder below with a fresh marker. Person B attempts the same operation from their own project/key with a different fresh marker while A is writing. Record refusal during the lease, server serialization, overlap, unsupported API or unknown, and timings. Same-checkout tests only prove a local lock; they do not prove cross-client atomic exclusion. A busy attempt can have an uncertain journal even before applying: inspect the recorded steps and retain the actual diagnostic.
20
- 4. Run the recovery example below with `failAfterWrite=true`. It deliberately throws after creating a small owned frame. Record the uncertain run ID and frame ID. Use **the same files and parameters** with explicit `--resume RUN_ID`; independent readback must reconcile the existing frame without a duplicate. Export twice, look at the image, and record the result. A fresh run is not recovery. A renamed/duplicated marker or changed source requires inspection rather than an automatic retry.
21
- 5. Exercise one real implementation route through existing baselines and the Reflection handoff. Obtain explicit frame approval; hold fonts and fixture data stable. Record actual browser comparison and adoption findings. Rich coverage cases require the D4 hooks and cannot be represented as successful default-state checks. Human adoption remains a gate before declaring the C1/D1/E1 expansion accepted.
22
-
23
- ```sh
24
- penpair run-file examples/trials/hold-writer.js \
25
- --inspect examples/trials/hold-inspect.js --readback examples/trials/hold-readback.js \
26
- --param fileId=OWNER_CONFIRMED_FILE --param pageId=OWNER_CONFIRMED_EMPTY_PAGE \
27
- --param marker=FRESH_PERSON_A_MARKER --param holdMs=30000 \
28
- --apply --timeout-ms 45000
29
-
30
- penpair run-file examples/trials/recovery-build.js \
31
- --inspect examples/trials/recovery-inspect.js --readback examples/trials/recovery-readback.js \
32
- --param fileId=OWNER_CONFIRMED_FILE --param pageId=OWNER_CONFIRMED_PAGE \
33
- --param name=RecoveryTrial --param marker=FRESH_RECOVERY_MARKER \
34
- --param failAfterWrite=true --apply
35
- ```
36
-
37
- The holder intentionally waits to create a contention window; it is not layout settling. It creates no design nodes but records a `penpair/trial-hold-MARKER` file metadata record with holding/complete state. A partial marker is evidence requiring inspection. A completed marker makes the same operation a verified no-op; use a fresh marker for each new contention exercise. The recovery example leaves an owned frame intentionally. Remove only explicitly confirmed owned IDs/markers with a reviewed operation, or let the owner discard the dedicated scratch files.
38
-
39
- ## Evidence and completion
40
-
41
- Copy the template under ignored `.penpair/trials/`. Unobserved metrics remain null, not zero. Record time to doctor-green, human interventions, failure comprehension, binding coverage, independent verified outcomes, visual review, blockers and resulting backlog changes. Capture screenshots only after closing secret-entry panels. Commit only owner-reviewed redacted summaries, never keys, raw connection transcripts or private journals. There is no completed human report yet.
@@ -1,15 +0,0 @@
1
- {
2
- "schemaVersion": 1,
3
- "kind": "upstream-request-evidence",
4
- "observedAt": "2026-10-21",
5
- "method": "read-only installed package declarations and source maps",
6
- "liveMeasurements": false,
7
- "artifacts": [
8
- {"package":"@marwes-ui/react","version":"1.11.0","artifact":"dist/index.js.map","sha256":"5e8dfda3f704a98c07dbb0dba288fd4df8fd0adb8fda07a2507bfa09b9e73791","sources":["../src/components/stat-tile/stat-tile.tsx","../src/components/card/card.tsx"]},
9
- {"package":"@marwes-ui/core","version":"1.11.0","artifact":"dist/index.js.map","sha256":"29fd794b744da873b63222bc3827870e7031753d3137cc28415aa14acf3e581d","sources":["../src/components/atoms/stat-tile/stat-tile-recipe.ts","../src/components/atoms/stat-tile/stat-tile-a11y.ts","../src/components/atoms/card/card-recipe.ts","../src/theme/theme-vars.ts"]}
10
- ],
11
- "facts": ["StatTile trendValue and trendDirection are optional", "StatTile omits arbitrary children", "StatCardProps aliases CardProps", "CardProps accepts children", "No Sidebar or SidebarNav in the inspected React export list"],
12
- "candidateEdgeCases": ["Numeric zero trend is subject to a truthiness condition", "Only string trendValue is passed to the core accessible-label recipe"],
13
- "notEstablished": ["Latest upstream feature state", "Rendered numerical component values", "Browser/accessibility behavior", "Native Penpot override preservation"],
14
- "sent": false
15
- }
@@ -1,35 +0,0 @@
1
- # Marwes requests for owner review — 2026-10-21
2
-
3
- Status: **draft, unsent**. This document does not authorize an email, issue, package change or consumer edit. Review against the maintainer's current version before sending. Evidence is the installed 1.11.0 React/core package source and Claude's dated original trial notes; no new live component measurements were taken.
4
-
5
- ## Correct the starting assumptions
6
-
7
- - `StatTileProps.trendValue` and `trendDirection` are already optional in React 1.11.0. The source conditionally omits the trend region. Drop the request to add optional trend support. A missing trend in a Penpot helper is an adapter/composition issue until proven otherwise.
8
- - `StatTile` omits arbitrary `children`, but `StatCardProps` already aliases `CardProps`, which accepts children. Ask whether composing a sparkline in StatCard is the intended route before requesting another slot/API.
9
- - The installed React export list has no Sidebar/SidebarNav symbol. The consumer already implements its own `SidebarNav`; a new consumer sidebar is unnecessary. An upstream navigation primitive is an optional library discussion, not a blocker for that implementation.
10
- - Card/StatTile radii and typography values in the original brief are historical observations in one project theme/viewport/state. They are not newly verified universal library constants. The C1 measurement pilot still needs a real fixture and native instance-override proof.
11
-
12
- ## Prioritized requests
13
-
14
- | Priority | Draft request | Evidence and acceptance |
15
- | --- | --- | --- |
16
- | P1 | Expose stable component anatomy/measurement metadata and fixture selectors. | Core 1.11.0 recipes expose data-component/slot class names, but those are not a complete versioned measurement contract. Start with Button/Card/StatTile across explicit light/dark/state/viewport fixtures. Ask for documented stable selectors and supported measurements; preserve actual semantic token names instead of inverse-matching equal colors/radii. |
17
- | P1 | Document or expose component-derived radius and typography roles. | The source theme variable inventory includes general radius/radiusButton and typography scales. Claude reported Card radius 8, StatTile radius 24 and StatTile value 28/600/-0.84 in its trial context. Ask for the relationship to theme inputs and supported semantic roles; let new measurements establish values before proposing named tokens or formulas. Acceptance includes theme changes and explicit fallback constants. |
18
- | P2 | Clarify the supported StatTile/StatCard composition route for charts. | StatTile has a fixed typed body; StatCard accepts normal Card children. Ask for a documented chart composition recipe first. Add a new slot only if the existing composition cannot preserve intended layout, keyboard behavior and semantics. |
19
- | P2 | Discuss an upstream sidebar/navigation primitive if several consumers need the same contract. | No export in the inspected 1.11.0 React declarations; the consumer's existing SidebarNav already supplies its local implementation. Acceptance should cover active state, keyboard/focus semantics, responsive collapse and theme roles. Collect a reusable requirement before proposing upstream code. |
20
- | P3 | Check numeric-zero trend rendering and trend accessible-label input. | React source accepts ReactNode, renders trend with a truthiness check, and passes only string values to the core trend-label recipe. Ask for a focused test of `trendValue={0}` and numeric content. This is a source-based candidate edge case, not an observed browser/accessibility failure. |
21
-
22
- ## Review/send checklist
23
-
24
- - [ ] Owner selects which requests are useful and approves exact wording.
25
- - [ ] Maintainer/current-version check confirms the requested capability is still absent or undocumented.
26
- - [ ] C1 fixture captures exact theme, viewport, state, fonts and source version for numerical claims.
27
- - [ ] Attach only owner-reviewed, non-private evidence and a minimal reproduction.
28
- - [ ] Owner decides whether to send; no message or issue has been created here.
29
- - [ ] Record maintainer response and resulting backlog changes after an authorized exchange.
30
-
31
- ## Reproduction evidence
32
-
33
- Read [the source inventory](marwes-1.11.0-evidence.json). It records package versions and source-map hashes, with source paths within those maps. It contains no consumer designs, credentials or private project source. Reproduce with the same package artifacts and inspect the named source entries; rendered behavior still needs a real fixture.
34
-
35
- These corrections strengthen Claude's brief: the useful requests are about reproducible anatomy and explicit semantic contracts. Existing optional props and consumer components should be reused before asking for duplicate capabilities. Equal measured values alone cannot establish token semantics or make design-to-code behavior mechanical.