dsh-plugin-infj-pet 0.0.0-stage → 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/ASSETS-LICENSE.md +42 -0
- package/CHANGELOG.md +70 -0
- package/LICENSE +28 -0
- package/PROVENANCE.md +44 -0
- package/README.md +255 -2
- package/assets/icon.png +0 -0
- package/assets/preview.png +0 -0
- package/assets/provenance/sage-README.md +18 -0
- package/assets/provenance/sage-base-prompt.md +7 -0
- package/assets/provenance/sage-pet-record.json +16 -0
- package/assets/provenance/sage-validation.json +810 -0
- package/assets/sage-index.json +543 -0
- package/assets/sage.png +0 -0
- package/cordis.patch.yml +4 -0
- package/lib/client.js +1536 -0
- package/lib/index.js +182 -0
- package/locale/en.json +6 -0
- package/locale/zh.json +6 -0
- package/package.json +71 -4
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Asset license
|
|
2
|
+
|
|
3
|
+
## Artwork
|
|
4
|
+
|
|
5
|
+
The character is **Sage**, a pixel-art INFJ sage generated with a built-in image
|
|
6
|
+
generator from the INFJ Advocate reference card supplied by the project owner.
|
|
7
|
+
The sources, prompts and quality reports are kept in `Sage/`; `Sage/README.md`
|
|
8
|
+
records the pet's stable id and provenance.
|
|
9
|
+
|
|
10
|
+
`assets/sage.png` is the sprite sheet, copied unmodified from
|
|
11
|
+
`Sage/final/spritesheet-extended.png` (SHA-256
|
|
12
|
+
`58deaf03132eee98634d101661682c1faf45906186bea30e7aa0f951f32631d1`, as recorded
|
|
13
|
+
in `Sage/pet-record.json`). Everything else in `assets/` is derived from it:
|
|
14
|
+
|
|
15
|
+
| File | Derived how |
|
|
16
|
+
|---|---|
|
|
17
|
+
| `sage-index.json` | frame rectangles and gaze cells measured from the sheet |
|
|
18
|
+
| `sage.png.b64` | the same bytes, base64, for embedding in the bundle |
|
|
19
|
+
| `icon.png` | head crop of the resting frame, 3× nearest-neighbour |
|
|
20
|
+
| `preview.png` | one frame per animation, on a flat backdrop |
|
|
21
|
+
|
|
22
|
+
**The artwork is not covered by the MIT code license.** It is released under
|
|
23
|
+
[CC BY-NC-SA 4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/): share and
|
|
24
|
+
adapt it for non-commercial use with attribution, under the same license.
|
|
25
|
+
Commercial use needs the copyright holder's permission.
|
|
26
|
+
|
|
27
|
+
Attribution form:
|
|
28
|
+
|
|
29
|
+
> Sage artwork — dsh-plugin-infj-pet — CC BY-NC-SA 4.0
|
|
30
|
+
|
|
31
|
+
## Fonts
|
|
32
|
+
|
|
33
|
+
No font is bundled. Every text surface uses the operating system's UI font stack
|
|
34
|
+
(`system-ui` and the platform CJK faces), so nothing is downloaded at runtime and
|
|
35
|
+
no font license travels with this package.
|
|
36
|
+
|
|
37
|
+
## Personality-type notice
|
|
38
|
+
|
|
39
|
+
INFJ and the Advocate / Counselor labels are popular-psychology vocabulary, not a
|
|
40
|
+
clinical instrument. This plugin is a decorative companion inspired by the
|
|
41
|
+
described traits; it does not assess, score, or diagnose anyone, and it is not
|
|
42
|
+
affiliated with or endorsed by any personality-assessment publisher.
|
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this plugin are documented here. This project follows
|
|
4
|
+
[Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
5
|
+
|
|
6
|
+
## Unreleased
|
|
7
|
+
|
|
8
|
+
**Artwork replaced**
|
|
9
|
+
|
|
10
|
+
- The character is now **Sage**, the pixel-art INFJ pet produced with the
|
|
11
|
+
built-in image generator (`Sage/`). The hand-drawn SVG sage is gone.
|
|
12
|
+
- Nine animations and sixteen head poses come from one 1536×2288 sprite sheet,
|
|
13
|
+
embedded in the bundle so the plugin makes no network request at all.
|
|
14
|
+
- The sheet's SHA-256 is checked against the value recorded in its validation
|
|
15
|
+
report, so the plugin cannot ship artwork that differs from what was validated.
|
|
16
|
+
|
|
17
|
+
**New behaviour**
|
|
18
|
+
|
|
19
|
+
- **Keeps pace** — after twenty seconds of uninterrupted work the sage switches
|
|
20
|
+
from thinking to a walking loop, then celebrates or slumps when the run ends.
|
|
21
|
+
- **Idle glances** — while resting, it looks around using the drawn head poses.
|
|
22
|
+
- Display sizes are now exact integer multiples of the sprite pixels (1×, 2×, 3×),
|
|
23
|
+
which is what keeps pixel art crisp; the old fractional sizes are gone.
|
|
24
|
+
|
|
25
|
+
**Build**
|
|
26
|
+
|
|
27
|
+
- `lib/client.js` is generated from readable regions in `lib/src/`, so gaps
|
|
28
|
+
between source and bundle show up in review rather than in a diff of a 2 MB
|
|
29
|
+
file.
|
|
30
|
+
- `tools/png.mjs` decodes the sheet without any dependency, and the broken
|
|
31
|
+
`--sprite` build path was removed.
|
|
32
|
+
- `npm run check` now verifies the sheet hash, the frame boundaries, the gaze
|
|
33
|
+
coverage, the generated icon, and that the bundle matches its sources.
|
|
34
|
+
- `npm run build` regenerates the index, icon, contact sheet, bundle and offline
|
|
35
|
+
preview in one pass.
|
|
36
|
+
|
|
37
|
+
## 1.0.0
|
|
38
|
+
|
|
39
|
+
First release of the plugin.
|
|
40
|
+
|
|
41
|
+
**The companion**
|
|
42
|
+
|
|
43
|
+
- Six semantic states — 静观 resting, 洞察 working, 共情 waiting, 笃定
|
|
44
|
+
celebrating, 充电 sleeping, 受挫 error — each mapped to one facet of the INFJ
|
|
45
|
+
description on the reference card.
|
|
46
|
+
- Per-pose animation, disabled by `prefers-reduced-motion` or by the motion
|
|
47
|
+
setting.
|
|
48
|
+
|
|
49
|
+
**Interaction**
|
|
50
|
+
|
|
51
|
+
- Click to hear a line in character; drag to reposition with edge snapping and a
|
|
52
|
+
remembered position.
|
|
53
|
+
- Right-click settings: session scope, size, nap delay, palette, motion,
|
|
54
|
+
auto-tips, reset position, tuck away, and a trait explainer.
|
|
55
|
+
- Bilingual (English / 简体中文), following the DSH language until you choose one.
|
|
56
|
+
- Tuck away collapses the sage to a corner restore button.
|
|
57
|
+
|
|
58
|
+
**Behaviour guarantees**
|
|
59
|
+
|
|
60
|
+
- Celebration requires an observed rising edge of work, so an idle Host, a
|
|
61
|
+
reconnect, or a vanished session never produces a false win.
|
|
62
|
+
- Subagent sessions are counted separately and never inflate your own workload.
|
|
63
|
+
- A missing slot registry or store hook degrades to a static companion instead of
|
|
64
|
+
throwing into the session.
|
|
65
|
+
|
|
66
|
+
**Packaging**
|
|
67
|
+
|
|
68
|
+
- Zero runtime dependencies; the client bundle is committed, so a Git install
|
|
69
|
+
needs no build step.
|
|
70
|
+
- Structural checks and a behavioural test suite ship with the package.
|
package/LICENSE
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 CN-Mg
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
The MIT license above covers the source code in this repository.
|
|
26
|
+
|
|
27
|
+
The artwork in `assets/` and the character geometry in `lib/art.js` are licensed
|
|
28
|
+
separately under CC BY-NC-SA 4.0. See ASSETS-LICENSE.md.
|
package/PROVENANCE.md
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# Sage
|
|
2
|
+
|
|
3
|
+
Created and verified in Pets. Stable ID: pet_6ac7958fa51c8191bc6827eb0881645b.
|
|
4
|
+
|
|
5
|
+
User request: create an animated pet based on the attached INFJ Advocate cartoon reference. The name Sage was inferred. The original angular green-robed elder identity, swept white hair, long white beard and dot eyes were preserved. Thin wand omitted for readable animation.
|
|
6
|
+
|
|
7
|
+
Final transparent v2 sheet: `final/spritesheet-extended.png`, 1536x2288, 73 populated frames. Nine animation states and sixteen gaze directions. The pet has been added to the collection and can be selected in Pets.
|
|
8
|
+
|
|
9
|
+
Artwork generated with built-in imagegen. Production prompts and revisions are in `prompts/`, inputs and identity references in `references/`, source strips in `decoded/`, and checks plus motion previews in `qa/`. Artifacts are stored locally because ChatGPT Library tools were unavailable. No temporary upload sessions or expiring download links are persisted as pet identity.
|
|
10
|
+
|
|
11
|
+
The bundled structural and quality gates, Pets preflight, three isolated cardinal reviews and independent final visual review pass. Subtle intermediate tilts and minor wrap head-pose differences remain documented warnings; repaired torso widths and ground registration are steady. Jump peak lift is 44px and landing differs from idle baseline by 1px.
|
|
12
|
+
|
|
13
|
+
Final byte SHA256: `58deaf03132eee98634d101661682c1faf45906186bea30e7aa0f951f32631d1`.
|
|
14
|
+
|
|
15
|
+
- [x] Getting Sage ready.
|
|
16
|
+
- [x] Imagining Sage's main look.
|
|
17
|
+
- [x] Picturing Sage's poses.
|
|
18
|
+
- [x] Hatching Sage.
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## What is published, and what is not
|
|
23
|
+
|
|
24
|
+
The full generation workspace that produced this sheet is about 130 MB: source
|
|
25
|
+
strips, per-frame decodes, QA renders, motion previews, and a vendored ffmpeg
|
|
26
|
+
used by the preview tooling. None of that is needed to build or run the plugin,
|
|
27
|
+
so it is not published here.
|
|
28
|
+
|
|
29
|
+
Checked in instead, under ssets/provenance/:
|
|
30
|
+
|
|
31
|
+
| File | Why it is kept |
|
|
32
|
+
|---|---|
|
|
33
|
+
| `sage-validation.json` | the sheet's structural report: grid, per-cell pixel counts, SHA-256 |
|
|
34
|
+
| `sage-pet-record.json` | the pet's stable id, description and declared sheet hash |
|
|
35
|
+
| `sage-README.md` | the generation summary as originally written |
|
|
36
|
+
| `sage-base-prompt.md` | the production prompt for the character's main look |
|
|
37
|
+
|
|
38
|
+
`tools/build-sage-index.mjs` reads that report and refuses to build when
|
|
39
|
+
`assets/sage.png` does not hash to the value recorded in it, so the published
|
|
40
|
+
artwork is provably the artwork that was validated.
|
|
41
|
+
|
|
42
|
+
The workspace itself stays on the machine that generated it. If you need to
|
|
43
|
+
reproduce it, the prompts under the original `Sage/prompts/` are the starting
|
|
44
|
+
point; they are not part of this repository.
|
package/README.md
CHANGED
|
@@ -1,3 +1,256 @@
|
|
|
1
|
-
#
|
|
1
|
+
# INFJ Sage · 贤者桌宠
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
**A pixel-art INFJ companion that lives inside your DeepSeek Harness window.**
|
|
4
|
+
|
|
5
|
+
一只住在 DSH 窗口里的 INFJ 贤者:陪你专注、等你决定,也陪你安静地打个盹。
|
|
6
|
+
|
|
7
|
+
<p align="center">
|
|
8
|
+
<img src="assets/icon.png" width="120" alt="INFJ Sage icon">
|
|
9
|
+
</p>
|
|
10
|
+
|
|
11
|
+
<p align="center">
|
|
12
|
+
<img src="assets/preview.png" width="820" alt="Every animation: idle, run-right, run-left, wave, jump, failed, waiting, working, pondering">
|
|
13
|
+
</p>
|
|
14
|
+
|
|
15
|
+
The sage is not a progress bar. It reads what your agents are already doing —
|
|
16
|
+
working, waiting on you, resting — and answers with a small, quiet reaction in
|
|
17
|
+
character. Six semantic states, drawn from a nine-animation sprite sheet where
|
|
18
|
+
each pose expresses a different facet of the INFJ description on the reference
|
|
19
|
+
card.
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## What it does
|
|
24
|
+
|
|
25
|
+
| Pose | When it appears | Trait it expresses |
|
|
26
|
+
|---|---|---|
|
|
27
|
+
| 静观 Observing | Nothing is running | 独处即充电 — recharged alone |
|
|
28
|
+
| 洞察 Insight | At least one session is working | 先看模式,再看任务 — patterns before tasks |
|
|
29
|
+
| 陪伴 Keeping pace | Work has run for 20s without a break | 理想主义的续航 — idealist stamina |
|
|
30
|
+
| 共情 Empathy | A session is waiting on your answer | 先接住情绪 — feelings first |
|
|
31
|
+
| 笃定 Resolve | A turn the sage watched just finished | 低调地笃定 — quiet conviction |
|
|
32
|
+
| 充电 Recharging | Idle past the nap delay | 独处即充电 — the quiet half |
|
|
33
|
+
| 受挫 Setback | A turn ended in an error | 过载时向内自责 — overload turns inward |
|
|
34
|
+
|
|
35
|
+
Around that core:
|
|
36
|
+
|
|
37
|
+
- **Click** the sage and it says something in character.
|
|
38
|
+
- **Drag** it anywhere; it snaps to the edge and remembers where you left it.
|
|
39
|
+
- **Right-click** for settings: session scope, size, nap delay, palette, motion,
|
|
40
|
+
idle glances, auto-tips, position reset, tuck away, and a trait panel.
|
|
41
|
+
- **Idle glances** — while resting, the sage looks around using the sheet's
|
|
42
|
+
sixteen drawn head poses.
|
|
43
|
+
- **Keeps pace** — after twenty seconds of uninterrupted work it starts walking,
|
|
44
|
+
then celebrates or slumps when the run ends.
|
|
45
|
+
- Follows DSH's language, light/dark theme, and reduce-motion preference.
|
|
46
|
+
- No build step to install, no runtime dependencies, no network calls, no model
|
|
47
|
+
calls.
|
|
48
|
+
|
|
49
|
+
This is an **in-window** companion, not an operating-system desktop overlay.
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## Install
|
|
54
|
+
|
|
55
|
+
### 1. From npm
|
|
56
|
+
|
|
57
|
+
```
|
|
58
|
+
dsh-plugin-infj-pet
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Enter that name in DSH's plugin installation page (sidebar → **Plugins**). To
|
|
62
|
+
pin this release, use `dsh-plugin-infj-pet@1.0.0`.
|
|
63
|
+
|
|
64
|
+
### 2. From GitHub
|
|
65
|
+
|
|
66
|
+
```
|
|
67
|
+
github:CN-Mg/dsh_infj_pet
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Or with a pinned tag:
|
|
71
|
+
|
|
72
|
+
```
|
|
73
|
+
github:CN-Mg/dsh_infj_pet#v1.0.0
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
The committed source already contains the built client bundle, so a Git install
|
|
77
|
+
needs no build step.
|
|
78
|
+
|
|
79
|
+
### 3. From a local folder
|
|
80
|
+
|
|
81
|
+
Point the installer at the absolute path of this directory, or pack it first:
|
|
82
|
+
|
|
83
|
+
```sh
|
|
84
|
+
npm pack --ignore-scripts --pack-destination artifacts
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
After enabling the plugin, **fully quit DSH and reopen it**. Closing the window
|
|
88
|
+
may not quit the application, and the browser bundle is only picked up on boot.
|
|
89
|
+
|
|
90
|
+
To remove it: disable the row on the Plugins page, then uninstall the package.
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## Using it
|
|
95
|
+
|
|
96
|
+
- **Click** — a line of dialogue, different each time.
|
|
97
|
+
- **Drag** — reposition; release near a side and it snaps to that edge.
|
|
98
|
+
- **Right-click** — settings and pose preview.
|
|
99
|
+
- **Keyboard** — `Tab` to the sage, `Enter`/`Space` to poke, `Esc` to close.
|
|
100
|
+
- **Session scope** — *All sessions* counts ordinary sessions on the current
|
|
101
|
+
Host; *This session* follows only the one you are looking at. Child (subagent)
|
|
102
|
+
sessions are never counted as your sessions, so a delegated burst does not look
|
|
103
|
+
like your own work.
|
|
104
|
+
- **Nap delay** — how long the sage stays quiet before it dozes off.
|
|
105
|
+
- **Size** — 1×, 2×, or 3× the sprite's own pixels. Every size is a whole-number
|
|
106
|
+
multiple, because pixel art resampled at a fractional scale turns to mush.
|
|
107
|
+
|
|
108
|
+
### Completion is never guessed
|
|
109
|
+
|
|
110
|
+
The celebratory leap fires only on a **falling edge of work the sage actually
|
|
111
|
+
watched running**. A page that loads into an already-idle Host, a dropped
|
|
112
|
+
connection, or a session that simply disappears never produces a celebration.
|
|
113
|
+
Cancelled and failed turns are not successes.
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## Privacy and runtime boundaries
|
|
118
|
+
|
|
119
|
+
- Reads session **identity and status** only — never message content, tool
|
|
120
|
+
arguments, or transcripts.
|
|
121
|
+
- Makes **no model calls**, opens **no ports**, sends **no telemetry**, and
|
|
122
|
+
answers **no approvals** on your behalf.
|
|
123
|
+
- Uses DSH's existing authenticated connection.
|
|
124
|
+
- The sprite sheet is embedded in the bundle, so the plugin issues **no network
|
|
125
|
+
request at all**.
|
|
126
|
+
- Preferences live in `localStorage` under `dsh-plugin-infj-pet:v1`.
|
|
127
|
+
- Writes only to its own DOM nodes and to one `<style>` element it owns.
|
|
128
|
+
- Does not modify DSH itself, and replaces no official component.
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
## Compatibility
|
|
133
|
+
|
|
134
|
+
Developed against **DSH Desktop 0.2.x** using the documented client plugin
|
|
135
|
+
contract:
|
|
136
|
+
|
|
137
|
+
- client bundle registered through `window.__ModuleLoader__.load({ id, factory })`
|
|
138
|
+
- one `shell.overlay` slot occupant (`id: infj-pet`, `order: 92`)
|
|
139
|
+
- injected shares: `slots`, `sessions`, `connection`, `locale`
|
|
140
|
+
- only `react` and `react-dom/client` are required from the platform module table
|
|
141
|
+
|
|
142
|
+
The Host half declares no required service and registers one optional listener,
|
|
143
|
+
so a Host-side change degrades the companion rather than failing the plugin.
|
|
144
|
+
|
|
145
|
+
DSH is evolving quickly. If a future release changes the slot or store contract,
|
|
146
|
+
the sage is written to fail quietly: it falls back to a non-reactive pose rather
|
|
147
|
+
than throwing into your session.
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## Development
|
|
152
|
+
|
|
153
|
+
Requires Node.js 20 or newer. There are no dependencies to install.
|
|
154
|
+
|
|
155
|
+
```sh
|
|
156
|
+
npm run verify # structural checks plus 43 tests
|
|
157
|
+
npm test # the test suite alone
|
|
158
|
+
npm run check # manifest, sheet, icon, bundle-drift and locale checks
|
|
159
|
+
npm run build # regenerate the index, icons, bundle and offline preview
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### How the artwork is wired
|
|
163
|
+
|
|
164
|
+
The character is one PNG sprite sheet: `assets/sage.png`, 1536×2288, an 8×11
|
|
165
|
+
grid of 192×208 cells. Rows 0–8 are animations, rows 9–10 are sixteen head poses
|
|
166
|
+
for gaze. Nothing about that layout is written down twice:
|
|
167
|
+
|
|
168
|
+
```
|
|
169
|
+
assets/provenance/sage-validation.json the sheet's own validation report
|
|
170
|
+
│
|
|
171
|
+
├─ tools/build-sage-index.mjs ─→ assets/sage-index.json frames + gaze cells
|
|
172
|
+
│ assets/sage.png.b64 payload for the bundle
|
|
173
|
+
├─ tools/build-icons.mjs ─→ assets/icon.png plugin-manager icon
|
|
174
|
+
│ assets/preview.png the contact sheet above
|
|
175
|
+
└─ tools/build-bundle.mjs ─→ lib/client.js the shipped bundle
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
`tools/build-sage-index.mjs` measures the sheet with `tools/png.mjs` — a
|
|
179
|
+
dependency-free PNG reader — and refuses to run if the file's SHA-256 does not
|
|
180
|
+
match the hash recorded in the validation report. That is how the plugin proves
|
|
181
|
+
it is shipping the artwork that was actually validated. The 130 MB generation
|
|
182
|
+
workspace is not published; [PROVENANCE.md](PROVENANCE.md) says what is kept
|
|
183
|
+
instead and why.
|
|
184
|
+
|
|
185
|
+
### The bundle is generated
|
|
186
|
+
|
|
187
|
+
`lib/client.js` cannot use ES imports at runtime; the browser module loader
|
|
188
|
+
expects one self-contained lazy-CJS factory. So the bundle is assembled from
|
|
189
|
+
plain-text regions in `lib/src/`:
|
|
190
|
+
|
|
191
|
+
```
|
|
192
|
+
lib/src/order.json the concatenation order
|
|
193
|
+
lib/src/header.mjs bundle header and loader registration
|
|
194
|
+
lib/src/constants.mjs sizes, traits, dialogue, UI strings
|
|
195
|
+
lib/src/helpers.mjs clamp/pick/locale/store/viewport utilities
|
|
196
|
+
lib/src/statePlan.mjs semantic state -> sprite animation, and the timings
|
|
197
|
+
lib/src/artwork.mjs sheet lookup, gaze maths, frame geometry (templated)
|
|
198
|
+
lib/src/sprite.mjs motion policy and the frame ticker
|
|
199
|
+
lib/src/behaviour.mjs pure projection and the transition machine
|
|
200
|
+
lib/src/styles.mjs the stylesheet and generated keyframes
|
|
201
|
+
lib/src/fallback.mjs direct-mount path when the slot registry is absent
|
|
202
|
+
lib/src/preferences.mjs persisted preference reader
|
|
203
|
+
lib/src/componentHeader.mjs, companionHead.mjs, companionBody.mjs, panel.mjs
|
|
204
|
+
lib/src/plugin.mjs the Cordis plugin export
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
Edit those, then run `npm run bundle`. `tests/bundle.test.mjs` rebuilds the
|
|
208
|
+
bundle and fails when `lib/client.js` disagrees with its sources, so the
|
|
209
|
+
committed file can never drift.
|
|
210
|
+
|
|
211
|
+
### Other layout
|
|
212
|
+
|
|
213
|
+
```
|
|
214
|
+
lib/index.js Host half: read-only turn-boundary listener
|
|
215
|
+
cordis.patch.yml inserts exactly one plugin row
|
|
216
|
+
locale/ plugin-manager title and description
|
|
217
|
+
assets/ the sheet, its index, the icon, the contact sheet
|
|
218
|
+
assets/provenance/ the validation report the build checks the sheet against
|
|
219
|
+
PROVENANCE.md what artwork provenance is published, and what is not
|
|
220
|
+
tools/ generators, checker, preview builder, PNG reader
|
|
221
|
+
tests/ Node test-runner suite with a small React harness
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
`tools/sage_contact.py` and `tools/sage_measure.py` rasterise the sheet for
|
|
225
|
+
review outside DSH; they need Pillow and are development aids only.
|
|
226
|
+
|
|
227
|
+
### Design notes
|
|
228
|
+
|
|
229
|
+
- **Fail soft.** A missing slot registry falls back to a direct DOM mount; a
|
|
230
|
+
store hook that throws leaves a static but present companion.
|
|
231
|
+
- **Never invent success.** The machine requires an observed rising edge before a
|
|
232
|
+
falling edge can celebrate.
|
|
233
|
+
- **One artwork source.** Frames, gaze cells, the icon and the bundle are all
|
|
234
|
+
derived from the sheet, and every derivation is re-checked in CI.
|
|
235
|
+
- **Integer pixels only.** Every frame offset and scale factor is a whole number,
|
|
236
|
+
asserted by a test, because that is what keeps the drawing crisp.
|
|
237
|
+
- **Own your nodes.** No global mutation beyond the plugin's own style element
|
|
238
|
+
and its namespaced storage key.
|
|
239
|
+
|
|
240
|
+
---
|
|
241
|
+
|
|
242
|
+
## Credits and licenses
|
|
243
|
+
|
|
244
|
+
- **Code:** [MIT](LICENSE).
|
|
245
|
+
- **Artwork:** [CC BY-NC-SA 4.0](ASSETS-LICENSE.md) — share and adapt
|
|
246
|
+
non-commercially with attribution; separate from the code license.
|
|
247
|
+
- The character was generated with a built-in image generator from the supplied
|
|
248
|
+
INFJ reference card; `Sage/README.md` records the pet's provenance and stable
|
|
249
|
+
id, and `Sage/prompts/` holds the production prompts.
|
|
250
|
+
- No fonts are bundled; all text uses the platform UI font stack.
|
|
251
|
+
- INFJ and *Advocate* / *Counselor* are popular-psychology vocabulary, not a
|
|
252
|
+
clinical instrument. This plugin is decorative, assesses no one, and is
|
|
253
|
+
affiliated with no personality-assessment publisher.
|
|
254
|
+
|
|
255
|
+
This is a personal project, not an official DeepSeek product. It does not
|
|
256
|
+
represent DeepSeek's views or endorsement.
|
package/assets/icon.png
ADDED
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# Sage
|
|
2
|
+
|
|
3
|
+
Created and verified in Pets. Stable ID: pet_6ac7958fa51c8191bc6827eb0881645b.
|
|
4
|
+
|
|
5
|
+
User request: create an animated pet based on the attached INFJ Advocate cartoon reference. The name Sage was inferred. The original angular green-robed elder identity, swept white hair, long white beard and dot eyes were preserved. Thin wand omitted for readable animation.
|
|
6
|
+
|
|
7
|
+
Final transparent v2 sheet: `final/spritesheet-extended.png`, 1536x2288, 73 populated frames. Nine animation states and sixteen gaze directions. The pet has been added to the collection and can be selected in Pets.
|
|
8
|
+
|
|
9
|
+
Artwork generated with built-in imagegen. Production prompts and revisions are in `prompts/`, inputs and identity references in `references/`, source strips in `decoded/`, and checks plus motion previews in `qa/`. Artifacts are stored locally because ChatGPT Library tools were unavailable. No temporary upload sessions or expiring download links are persisted as pet identity.
|
|
10
|
+
|
|
11
|
+
The bundled structural and quality gates, Pets preflight, three isolated cardinal reviews and independent final visual review pass. Subtle intermediate tilts and minor wrap head-pose differences remain documented warnings; repaired torso widths and ground registration are steady. Jump peak lift is 44px and landing differs from idle baseline by 1px.
|
|
12
|
+
|
|
13
|
+
Final byte SHA256: `58deaf03132eee98634d101661682c1faf45906186bea30e7aa0f951f32631d1`.
|
|
14
|
+
|
|
15
|
+
- [x] Getting Sage ready.
|
|
16
|
+
- [x] Imagining Sage's main look.
|
|
17
|
+
- [x] Picturing Sage's poses.
|
|
18
|
+
- [x] Hatching Sage.
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
Create one clean full-body reference sprite for ChatGPT pet Sage.
|
|
2
|
+
|
|
3
|
+
Pet identity: INFJ Advocate elder from user reference. Compact angular polygon cartoon; warm peach face, short swept white hair, long white beard, olive and light green robes, teal lapel trim, teal boots. Gentle thoughtful expressions, visible dark green dot eyes and angular nose. Keep robe symmetrical and omit thin wand for readable uncluttered animation. Head and beard naturally lead gaze with torso and feet anchored..
|
|
4
|
+
Style: Pet-safe sprite: compact full-body mascot, readable in a 192x208 cell, clear silhouette, simple face, stable palette/materials, and crisp edges for chroma-key extraction. Style `flat-vector`: Flat vector-style mascot with simple geometric forms, crisp color areas, clean outline, and minimal shading.
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
Place a single centered pose on a perfectly flat pure user-selected #FF00FF chroma-key background. Keep the full pet visible, compact, readable at 192x208, and easy to animate. Preserve approved reference identity cues. No scenery, text, borders, checkerboard transparency, shadows, glows, detached effects, or extra props. Keep #FF00FF and close colors out of the pet, props, highlights, and effects.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"pet_id": "pet_6ac7958fa51c8191bc6827eb0881645b",
|
|
3
|
+
"name": "Sage",
|
|
4
|
+
"description": "A gentle INFJ sage in green robes, with a white beard and a thoughtful heart.",
|
|
5
|
+
"is_custom": true,
|
|
6
|
+
"is_active": false,
|
|
7
|
+
"active_pet_id": "default",
|
|
8
|
+
"verified_in_pets": true,
|
|
9
|
+
"spritesheet": "assets/sage.png",
|
|
10
|
+
"sha256": "58deaf03132eee98634d101661682c1faf45906186bea30e7aa0f951f32631d1",
|
|
11
|
+
"artifact_storage": "local workspace; ChatGPT Library tools unavailable",
|
|
12
|
+
"generation": "built-in imagegen",
|
|
13
|
+
"quality_report": "assets/provenance/sage-validation.json",
|
|
14
|
+
"visual_review": "qa/final-visual-review.json",
|
|
15
|
+
"note": "Provenance copy. The full generation workspace (prompts, frames, QA renders) is not published; see assets/provenance/sage-README.md."
|
|
16
|
+
}
|