@turri-dev/cli 0.1.24 → 0.1.25-next.d0c7575
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/extension.d.ts +11 -0
- package/dist/extension.js +9 -4
- package/dist/jellyfish.d.ts +5 -0
- package/dist/jellyfish.js +5 -0
- package/docs/using.md +1 -1
- package/package.json +1 -1
package/dist/extension.d.ts
CHANGED
|
@@ -153,3 +153,14 @@ export declare function chatRulesBlock(rules?: {
|
|
|
153
153
|
name: string;
|
|
154
154
|
content: string;
|
|
155
155
|
}[]): string;
|
|
156
|
+
/** The frame the jellyfish is on: the one its sequence has at this point. */
|
|
157
|
+
export declare const shownFrame: () => number;
|
|
158
|
+
/**
|
|
159
|
+
* Moves the jellyfish on a frame every JELLYFISH_FRAME_MS while the banner is on the screen. An entry's
|
|
160
|
+
* renderer is given no TUI to redraw, so an empty widget below the editor - which pi gives no
|
|
161
|
+
* spacer - hands it over. Once the conversation is taller than the screen the banner has scrolled off,
|
|
162
|
+
* and a line changing up there would have pi-tui clear and redraw everything, frame after frame: the
|
|
163
|
+
* jellyfish stops for the rest of the session - swimming, whole, drawn once more if it was not, rather than on whatever
|
|
164
|
+
* frame it was at, a polyp half grown.
|
|
165
|
+
*/
|
|
166
|
+
export declare function animateJellyfish(ctx: ExtensionContext): void;
|
package/dist/extension.js
CHANGED
|
@@ -32,7 +32,7 @@ import { checkPlainFile, checkPlainTargets, formatCheckResults } from "./plain/c
|
|
|
32
32
|
import { whyFailed } from "./regenerate/diagnose-job.js";
|
|
33
33
|
import { createWorkLoop, describeModules, isUpToDate, previewJobs } from "./regenerate/loop.js";
|
|
34
34
|
import { brandNeon, brandPink, plainPaint } from "./regenerate/plain-palette.js";
|
|
35
|
-
import { halfBlocks, JELLYFISH_FRAME_MS, JELLYFISH_SEQUENCE, JELLYFISH_TEXT_FRAMES } from "./jellyfish.js";
|
|
35
|
+
import { halfBlocks, JELLYFISH_FRAME_MS, JELLYFISH_REST, JELLYFISH_SEQUENCE, JELLYFISH_TEXT_FRAMES } from "./jellyfish.js";
|
|
36
36
|
import { createJobPanel, didNotPass, keyPressed, PANEL_KEY, spinner } from "./regenerate/job-panel.js";
|
|
37
37
|
import { clickToFocus, dockedWidth, narrowChat, shade, shadeChat } from "./regenerate/panel-dock.js";
|
|
38
38
|
import { overPictureRow, PICTURE_AT } from "./picture-row.js";
|
|
@@ -2807,16 +2807,17 @@ const JELLYFISH_ROWS = 14;
|
|
|
2807
2807
|
/** How far along its sequence the jellyfish every banner shows is, moved on by `animateJellyfish`. */
|
|
2808
2808
|
let jellyfishFrame = 0;
|
|
2809
2809
|
/** The frame the jellyfish is on: the one its sequence has at this point. */
|
|
2810
|
-
const shownFrame = () => JELLYFISH_SEQUENCE[jellyfishFrame % JELLYFISH_SEQUENCE.length];
|
|
2810
|
+
export const shownFrame = () => JELLYFISH_SEQUENCE[jellyfishFrame % JELLYFISH_SEQUENCE.length];
|
|
2811
2811
|
let jellyfishTimer;
|
|
2812
2812
|
/**
|
|
2813
2813
|
* Moves the jellyfish on a frame every JELLYFISH_FRAME_MS while the banner is on the screen. An entry's
|
|
2814
2814
|
* renderer is given no TUI to redraw, so an empty widget below the editor - which pi gives no
|
|
2815
2815
|
* spacer - hands it over. Once the conversation is taller than the screen the banner has scrolled off,
|
|
2816
2816
|
* and a line changing up there would have pi-tui clear and redraw everything, frame after frame: the
|
|
2817
|
-
* jellyfish stops
|
|
2817
|
+
* jellyfish stops for the rest of the session - swimming, whole, drawn once more if it was not, rather than on whatever
|
|
2818
|
+
* frame it was at, a polyp half grown.
|
|
2818
2819
|
*/
|
|
2819
|
-
function animateJellyfish(ctx) {
|
|
2820
|
+
export function animateJellyfish(ctx) {
|
|
2820
2821
|
if (jellyfishTimer !== undefined)
|
|
2821
2822
|
clearInterval(jellyfishTimer);
|
|
2822
2823
|
jellyfishTimer = undefined;
|
|
@@ -2825,6 +2826,10 @@ function animateJellyfish(ctx) {
|
|
|
2825
2826
|
const timer = setInterval(() => {
|
|
2826
2827
|
if (tui.render(tui.terminal.columns).length > tui.terminal.rows) {
|
|
2827
2828
|
clearInterval(timer);
|
|
2829
|
+
if (shownFrame() !== JELLYFISH_SEQUENCE[JELLYFISH_REST]) {
|
|
2830
|
+
jellyfishFrame = JELLYFISH_REST;
|
|
2831
|
+
tui.requestRender();
|
|
2832
|
+
}
|
|
2828
2833
|
return;
|
|
2829
2834
|
}
|
|
2830
2835
|
jellyfishFrame++;
|
package/dist/jellyfish.d.ts
CHANGED
|
@@ -23,6 +23,11 @@ export declare const JELLYFISH_HEIGHT: number;
|
|
|
23
23
|
* seconds - a stroke every five frames - then sinking, and the polyp growing back.
|
|
24
24
|
*/
|
|
25
25
|
export declare const JELLYFISH_SEQUENCE: number[];
|
|
26
|
+
/**
|
|
27
|
+
* Where in its sequence the jellyfish comes to rest once it can no longer move: swimming, whole - never stopped on a
|
|
28
|
+
* polyp half grown or a bell half sunk.
|
|
29
|
+
*/
|
|
30
|
+
export declare const JELLYFISH_REST: number;
|
|
26
31
|
/** How long each frame shows. */
|
|
27
32
|
export declare const JELLYFISH_FRAME_MS = 150;
|
|
28
33
|
/** The frames as a terminal without images draws them, in half blocks: the same order, a third of the size. */
|
package/dist/jellyfish.js
CHANGED
|
@@ -207,6 +207,11 @@ export const JELLYFISH_SEQUENCE = [
|
|
|
207
207
|
...Array.from({ length: 27 }, (_, f) => SWIM + (Math.floor(f / 5) % 2)),
|
|
208
208
|
...Array.from({ length: 19 }, (_, f) => 20 + f),
|
|
209
209
|
];
|
|
210
|
+
/**
|
|
211
|
+
* Where in its sequence the jellyfish comes to rest once it can no longer move: swimming, whole - never stopped on a
|
|
212
|
+
* polyp half grown or a bell half sunk.
|
|
213
|
+
*/
|
|
214
|
+
export const JELLYFISH_REST = JELLYFISH_SEQUENCE.indexOf(SWIM);
|
|
210
215
|
/** How long each frame shows. */
|
|
211
216
|
export const JELLYFISH_FRAME_MS = 150;
|
|
212
217
|
/** How much smaller the frames are drawn in half blocks: a cell is a block of SHRINK pixels square. */
|
package/docs/using.md
CHANGED
|
@@ -7,7 +7,7 @@ cd ~/my-project
|
|
|
7
7
|
turri
|
|
8
8
|
```
|
|
9
9
|
|
|
10
|
-
That is [pi](https://pi.dev), with turri's tools, skills and themes loaded - `turri` alone, or with [pi](https://pi.dev)'s options (`turri -c`, `turri --harness-model <m>`). It holds several chats side by side, each working while another is shown: `/chat new` or `alt+n` opens one, `alt+1` … `alt+9` switch, and `turri -c` opens them all again - see [chats](chats.md). It opens with turri's own banner - the jellyfish it is named after, regenerating until the conversation fills the screen: a pixel polyp on the sea floor grows into the jellyfish - a bell from pink down to indigo, an orange gut, neon tentacles - which swims a while, sinks back to the floor, and the polyp grows again, round and round: a picture in a terminal that shows images (Kitty, Ghostty, WezTerm, Warp, iTerm2), and drawn at a third of the size in half blocks in any other, tmux included (`src/jellyfish.ts` draws it, ported from the design system's pixel kit, `scripts/jellyfish-frames.mjs` writes the pictures) - turri's version (and, run from a clone, the commit it is on, and whether the clone has changes) and where its settings are changed - and only when something is wrong, skills that failed to load or agents' commands less fenced than they should be - rather than [pi](https://pi.dev)'s startup header and resource list; `turri --verbose` shows those too. [pi](https://pi.dev)'s "Update Available" notice is left out - turri's [pi](https://pi.dev) is a pinned dependency `pi update` never touches - and the terminal's tab reads `🪼 turri - <folder>`, not [pi](https://pi.dev)'s `π`. Talk to it: ask it to add a feature to \*\*\*plain, regenerate a module, fix a module's \*\*\*plain. It decides which skill or tool applies - but not *how* a skill runs: `cultivate` hands the work to the gated runner, which owns the steps, the gates and the judges (see [skills and gates](skills-and-gates.md)).
|
|
10
|
+
That is [pi](https://pi.dev), with turri's tools, skills and themes loaded - `turri` alone, or with [pi](https://pi.dev)'s options (`turri -c`, `turri --harness-model <m>`). It holds several chats side by side, each working while another is shown: `/chat new` or `alt+n` opens one, `alt+1` … `alt+9` switch, and `turri -c` opens them all again - see [chats](chats.md). It opens with turri's own banner - the jellyfish it is named after, regenerating until the conversation fills the screen: a pixel polyp on the sea floor grows into the jellyfish - a bell from pink down to indigo, an orange gut, neon tentacles - which swims a while, sinks back to the floor, and the polyp grows again, round and round - and once the conversation fills the screen, comes to rest swimming, whole: a picture in a terminal that shows images (Kitty, Ghostty, WezTerm, Warp, iTerm2), and drawn at a third of the size in half blocks in any other, tmux included (`src/jellyfish.ts` draws it, ported from the design system's pixel kit, `scripts/jellyfish-frames.mjs` writes the pictures) - turri's version (and, run from a clone, the commit it is on, and whether the clone has changes) and where its settings are changed - and only when something is wrong, skills that failed to load or agents' commands less fenced than they should be - rather than [pi](https://pi.dev)'s startup header and resource list; `turri --verbose` shows those too. [pi](https://pi.dev)'s "Update Available" notice is left out - turri's [pi](https://pi.dev) is a pinned dependency `pi update` never touches - and the terminal's tab reads `🪼 turri - <folder>`, not [pi](https://pi.dev)'s `π`. Talk to it: ask it to add a feature to \*\*\*plain, regenerate a module, fix a module's \*\*\*plain. It decides which skill or tool applies - but not *how* a skill runs: `cultivate` hands the work to the gated runner, which owns the steps, the gates and the judges (see [skills and gates](skills-and-gates.md)).
|
|
11
11
|
|
|
12
12
|
To start a project, just say what you want - `create a small server in Java Spring Boot` - and turri asks how to start it, with three choices: `/brood`, the interview; `/spawn`, the quick start; or `Just do it`, no skill. A skill picked there starts at once, with what you asked for as its context - nothing to type again; saying so in your message - `just build it`, or the command itself - skips the question. Just do it starts the project in the conversation: turri takes the stack you named, or chooses one this machine can build, and says it in a line; writes the module importing the stack from the standard library, `config.turri.yaml` (conformance tests off unless you ask for them) and the unit testing script (with `implement-unit-testing-script`, unless there is one); then the smallest thing that runs, regenerated at once, and while it regenerates the main thing you described and at most one more, on their happy path - nothing you did not describe. You say `go on`, or what to change, and every change after is \*\*\*plain it writes and regenerates (`src/new-project.ts`).
|
|
13
13
|
|