| Commit message (Collapse) | Author | Age |
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
telling frame, and #mode-box draws the box
Each recording on the landing has an anchor (rec-<name>); the "What's
in it" words jump to theirs (Terminals, PDFs, Images, Diff review,
Scripting) and the recording's caption ends in a link to the docs;
Language servers and Themes, with no recording, link to the docs. A
cast's `poster_at` in casts.toml picks the frame it shows until it
plays: live-text at the error, terminals at the copied line, petscii on
the Mandelbrot; the casts wait for the in-view script to play them. A
caption may hold markup: the 9P clip links 9ns to setup. The downloads
give their size, read from project.download, and the footer links the
changes (project.changes).
The guide's annotated pane has alt text, pin 1 beside the workspace tag
rather than on Changelog, and pin 5 on the body's text; pin positions
are written with repr, since str puts a U+2212 minus CSS cannot read.
#mode-box(mark, unsaved:) draws a pane's box as it looks, in print and
HTML.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
| |
B2 then B3 copies, every held button drawn
record_demos.py chords: a small notes file; each chord glides, stops,
presses B1 and keeps it down while B2 or B3 clicks. The pointer wears a
ring per button down and a mouse whose held buttons are lit, named
"left held + middle-click" and the like; B1 is drawn blue. clips.toml
lists it with landing = false, for the guide to embed.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
| |
always on with no graphics, Petscii choosing for when they are there
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
| |
then building from source
`project.download` in style.typ holds the version, the SHA256SUMS link
and a file per program (the static terminal build and the window
build, with what each needs); install.typ shows, for each, the curl,
the sha256sum -c of its own checksum and the move into ~/.local/bin,
then the clone and the build as the alternative.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
opens on an annotated pane
The window shelf drops terminals-are-panes (`landing = false` in
clips.toml; the casts show it) and keeps the PDF, image, make, diff and
9P clips. Captions say what happens: the live-text cast renames a
variable, runs make and lands on the error; the 9P clip is a shell under
9ns where the session is a directory. Casts stack one per row at the
page's width, each showing a frame of itself until it plays. Under the
lead, a row of linked chips names what is in pardes: terminals, PDFs,
images, language servers, diff review, scripting, themes.
Install says how long the first build takes (62 s from a clean cache on
16 cores, measured with the dependencies already fetched), and `project`
in style.typ has a `download` slot (url, sha256, arch) install.typ
shows once a binary exists.
#annotated draws a screenshot with numbered pins and their labels as
text beside it; the guide opens with one of the orchard theme's shot:
the workspace tag, a column's tag, a pane's tag, the box, the body
and the scrollbar, before its glossary.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
| |
art, as it always is with no graphics; Petscii on|off still chooses for when there are
The images and tagbottomimage goldens are re-recorded for the word.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
idle: the glide stops instead of holding frames for ever
glideCursor returned early when no cursor was drawn, so a glide under way
(right-click a PDF from a tag: the cursor sets off for the new pane) was
never stepped again and cursor_glide.moving() kept continuous() true: the
GUI redrew at full rate, every frame, until focus came back to a cursor.
With no cursor drawn the glide is now dropped; the next cursor lands.
A pixel shell's only: the terminal has no cursor glide.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
| |
its tag: text in a document runs as a tag word does
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
| |
no longer reach the player's own <pre>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
| |
The GUI clips are autoplay muted loop playsinline with their controls,
and every terminal cast autoplays and loops. A few lines of script
watch them with an IntersectionObserver, playing each while a quarter
of it is in view and pausing it when it leaves; without the script the
videos still autoplay.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
| |
and the petscii cast opens its pictures on camera from a README
pardes colours four syntax classes (keyword, string, number, comment),
so main.c gains a comment to show the fourth; types and function names
stay plain in any theme. The petscii cast starts on a README naming the
pictures and the manual, right-clicks each open, no longer runs
Petscii, and searches 'bit 21', which first appears on the CPUID page.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
| |
lead show an example first and cut the prose it makes redundant; the reference's 9P tree and REPLs name Look and Exec
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
| |
key, and say where pardes differs
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
shows the Mandelbrot set and a seahorse-valley zoom, no Petscii; the landing lists the PDF and image clips first
record_demos.py: text-is-the-interface starts on README and main.c
alone, and the middle-click on make brings up the output pane before the
right-click puts main.c on line 12. image-pane draws two PNGs, the
classic view and a zoom into the seahorse valley; ls lists them, a
right-click opens the set, Del closes it and a right-click opens the
zoom. clips.toml and CLIPS run pdf-navigation, image-pane, pdf-tint-fit,
then the hero, terminals, scripting and diff-review.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
| |
are written as #word, the window-only ones included, so each links to its glossary entry
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
and images and PDFs in a plain terminal, each a tty pardes that test/record_casts.py drives in a pty of its own as a plain xterm
The script answers only what an xterm answers, so images fall back to
PETSCII glyph art and a PDF to its text layer. It stamps each scripted
step on a virtual clock and writes the cells the step changed, as pyte
saw them, so the same input makes the same file. The petscii cast
generates its Mandelbrot views and reads the Intel SDM (--pdf) through a
symlink.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
the virtual filesystem is drawn as a tree
#word draws a builtin as a chip on the tag's ground over a rule (Look and
Exec in acme's look green and exec red), a <code class="word"> in HTML,
and links it to its entry in a new Builtins chapter wherever that
chapter is in the same output (the book, the site). The chapter is
drawn from docs/typ/builtins-tty.json and builtins-gui.json, which
`zig build builtins-json -Dplatform=tty|gui` writes from the registry
and the Help rows (src/builtins_json.zig, tools/gen_builtins_json.zig;
summaryOf in ninep/ctl.zig is now pub); style.typ merges them, marking
the window-only words. The doc steps refresh their build's file first,
and each build's unit-test fails when its file is stale. Everyday words
first (`everyday` in style.typ), then groups by leader prefix as Help
has them, then settings, the words with no path, debugging and
internals, and last an A-Z index of every word. `zig build book` joins
the doc steps.
#fstree draws a directory tree with its connectors, a description
column and links to the sections that document each file; reference.typ
draws the served tree with it, each pane, pty and column file on its
own line, and a test in config.zig checks it against ninep/tree.zig's
files both ways. The cheatsheet has a two-level version. On the site
the tree reads as `tree` text in w3m and wraps descriptions under the
names on a phone.
The site's tutor draws its B1, B2, B3 and 1-2 chords as mouse glyphs;
the landing credits Plan 9 and acme, as does the book's title page;
install.typ no longer lists the mirrors (the footer does).
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
opens on all three panes; new clips show the PDF and image panes; the Themes gallery has a shot of every theme
record_demos.py: a click glides to its target, stops, and presses and
releases with the pointer still (a ring and the button's name on the
press, a pulse after), pausing before anything moves. The hero's README,
main.c and output pane are all up from its first frame. pdf-navigation
and pdf-tint-fit page the Intel SDM vol. 2 (--pdf, read where it is):
PdfSections to CPUID, a search stepped with n, PdfTint's three looks,
PdfFit both ways and a page address. image-pane opens a Mandelbrot PNG
the script draws, then Petscii. `record_demos.py themes` shoots one
scene in each theme of src/themes, in the Themes order, into
docs/site/media/themes with themes.toml (ready).
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
| |
libjpeg and jbig2dec are built without UBSan, as the rest of MuPDF is
libjpeg calls filter-dct.c's source manager through a function pointer;
with -fsanitize=function on the caller and no type hash on the
uninstrumented callee, the call trapped (Illegal instruction in
jpeg_fill_bit_buffer). The Intel SDM vol. 2 crashed pardes on its first
page.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
plan9port: a one-button trackpad can execute and look
The core decides it at the press (mouse.emulateButton) and keeps it to the
release, whatever keys are let go between. Ctrl-click stays a definition,
and a program tracking the mouse still gets the plain click (Alt as its
meta, Super as nothing). The SDL, macOS and web shells now pass Super; the
macOS and web shells pass Alt on a click too. A terminal's mouse report has
no Super bit, so in a terminal only Alt-click is B2.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
| |
Exec once and then say Look and Exec; the cheatsheet draws every mouse button as its icon; one-button clicks (Alt is B2, Super is B3) are in the guide and cheatsheet; building says how to send patches to the list
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
| |
screen reader or text browser reads each click once
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
| |
9P, and the guide opens on look and execute as the core idea
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
page gets a gallery; install starts at the clone
The landing's own words sit in one `landing` record in site.typ: a lead
on the core idea (any text is live: right-click looks, middle-click
runs), where it runs, and a status line whose version is read from
build.zig.zon. Recordings come in two shelves: "In a terminal", asciicast
players from docs/site/casts/casts.toml (the first autoplays; all loop
and fit the width; data inline, so they play from file://), then "In
its own window", the GUI clips. asciinema-player 3.17.0 is vendored in
docs/site/player with its Apache-2.0 licence, from `npm pack`. The
Themes page shows #theme-gallery() from media/themes/themes.toml, a
thumbnail per theme opening the full picture; on paper it is nothing.
Both shelves and the gallery show placeholders until their files exist.
`project` in style.typ lists the mirrors (sourcehut, git.0x4200.cafe);
install.typ clones from the first and names them all, and the footer
links each. The README clones before it builds. The scripting
interface is a virtual filesystem served over 9P, never just a
filesystem, in the tagline, captions and README.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
install lines fit a phone
clips.toml names the recordings (text-is-the-interface,
terminals-are-panes, scripting-over-9p, diff-review), each ready, its
caption checked against what the clip shows. The first ready clip
plays at the top, full width and on its own (autoplay, muted, looping),
and the grid below shows the others, three across. Videos and posters keep the recordings' 960x700 shape. The footer
links the source at git.0x4200.cafe/pardes and names the ISC license,
from `project` in style.typ. LICENSE holds the ISC text, and the README
names it and says the libraries keep their own (MuPDF, on by default, is
AGPL). The install lines put their comments on lines of their own, and
on a phone a shell line wraps rather than scroll its end away.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
| |
keeps a selection's newline and its tag words once; the reference takes line files, init errors, dumps, dials and Save on +Tutor
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
docs/site/media, recorded from a hidden test window by test/record_demos.py
text-is-the-interface, terminals-are-panes, scripting-over-9p and
diff-review: each a webm (VP9), an mp4 (H.264, faststart) and a poster
PNG at 960 px, with captions.txt. The script drives a PARDES_TEST session
on the virtual clock through stdin mouse events, keys and 9P, keeps the
settled frame after each step, draws the pointer and loops each clip
with a dissolve back to its first frame.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
recordings, one Typst bundle run
docs/site/site.typ writes every page in one bundle compile: the landing
page (the tagline, the recordings listed in media/clips.toml, links to
start from), a page per entry of `chapters` in style.typ, and the tutor.
Every page shares a tag-line header with the chapter words; #doc links
resolve to the right page and anchor; a chapter with four or more
sections gets an "On this page" list. Links are relative and pages flat,
so it reads from file:// or any static server. `zig build site` installs
it to <prefix>/share/doc/pardes/site and fails plainly without typst.
The look is 0x4200.cafe's lapis layout (framed panels, hard shadows, a
tag-line trail, Departure Mono headings over Crimson Pro) in orchard's
greens and amber, forestbones_light when the reader prefers light; both
fonts are OFL and shipped. In HTML a key is one pill with its + and ›,
and a mouse button is an inline SVG in currentColor. The tagline lives
once in style.typ for the sheet, the book and the site, and the single
page html.typ gives way to the site.
The landing leads with one plain sentence (columns of panes, click to
run or open, helix keys, scripts through files), then the tagline and a
line on where it runs; a hero image is the first ready clip's poster;
"Start: the guide" leads the links, "Hands on: the tutor" next, the rest
a plain row; the captions use no undefined words. docs/typ/install.typ
holds the install lines once: setup.typ has an Install section that
includes it, and the landing includes it too. Building says up front it
is for contributors and points at setup to install. In HTML the guide's
glossary is a closed <details> (#glossary, the same heading and table on
paper), each drawn mouse carries hidden text (left-click, hold left,
click middle) for screen readers, w3m and copying, and the footer takes
a source link and a licence from `project` in style.typ once decided.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
| |
exercises on a +Tutor copy, the README builds the GUI and says what a terminal needs, and Shift-Esc says it needs the kitty keyboard protocol
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
| |
commands run and panes go table, scripting's first tag word Fmt and eight traps, setup as the one home of the pager and the servers, a scannable cheatsheet, an honest README, the edge cases moved to the reference, and the pager's colours
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
| |
component over 255 bytes, a path too long) is refused by the write that held it, not at the close (monkey9p's close_runs_only_line_files; follows sswkwwvv)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
| |
where there is a disk (fixes zkmtpmmq)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
| |
+New's does, never writing a file named +Tutor
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
| |
helix's :q
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
| |
passed over in the init file, not failed: one init file serves the window and the terminal
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
| |
under 9ns --mntgen ($NINE_MOUNT/pardes/<name>), unset when it is not known
9ns says --mntgen with NINE_MNTGEN=1 (cloud9). Under `9ns --unix` the
mount is the server it dialled, never this session (its socket does not
exist until it starts), so it stays unset there; scripts fall back to
`9p -a "unix!$PARDES_9P"`. Nothing is statted: the name comes from the
session's socket and the environment. selfmount checks both modes.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
last line is answered at once: the line runs at the editor's next step
A shell's truncating open of exec (or look, ctl, log, pager) sends a
setattr that changes nothing; it waited for the editor to be quiet, and
through a 9ns mount that quiet could never come: 9ns answers nothing else
on the mount while the setattr is out, and the editor's step may be out
reading a pane's file through it. This was the "truncating open of exec
hangs, only in selfmount" mystery. Only a truncate of a pane's file or a
tag waits now.
A close holding a last line with no newline hands it to the editor's step
(tree.runClosedLines, beside fillClosedPagers), as a /pager close does, and
is answered at once; a refusal is the log's err.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
| |
exit 1, instead of drawing a screen of its own in the asker's terminal
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
| |
from there, as a clean file's text is
Every Dump carried each image's and PDF's bytes in base64 (a 900 KB PDF
made a 1.3 MB dump), and a Restore showed that copy however the file had
changed. One on disk now goes by its path alone; one not on disk (no
file behind it) still has its bytes kept.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
| |
written after its directory with ghostty-vt, SGR becomes spans drawn over the plain text, every other escape is dropped, and PagerColor off pages it plain
|
| |
|
|
|
|
|
|
|
|
|
|
| |
commands are not run a second time
A setting changed in the init file took effect only at the next start.
The host's Save now hands a written init file's text back to the core,
which applies its setting lines again (each idempotent), with the same
notice and err for one that fails; a command line in it (`Newcol`)
belongs to the start and is left alone.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
| |
logged with its line number, never silent
A BOM made the first word unknown, a word no builtin has was skipped
without a word, and a setting that refused its value said nothing (the
init file ran with announcing off). Each failing line now leaves a
notice and an `err - init file line N: <why>` record; `#` still starts
a comment only at a line's start, so `#ff0000` stays a value.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
klingon` is invalid (EINVAL), its message citing no doc path
A refused answer quoted the word `answer`, not the choice refused. A
`name` with nothing after it was an unknown control message. A Repl of
no such language failed EIO with a pointer into the reference; it now
says `invalid language` (EINVAL, here and through a mount) and how many
more there are. A builtin's failure that says invalid anywhere is
EINVAL, as 9ns reads it.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
| |
`file:L:C-E`, the range's end too, for the asked-about file as for the others
The asked-about file's rows said `file:L:C` while other files' said
`file:L:C-E`. lsp-rename-files is re-recorded for the one row it shows.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
| |
answered, as any path to no file is
It failed the write with the peer's "file does not exist". A file not
found, here or through a mount, is now said and logged as a miss.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
| |
there says no such socket (ENOENT), and the hint says tcp! takes a numeric address
`Mount peer rel/x.sock` dialled relative to wherever the editor ran;
`Mount peer unix!/nonexistent` said `dial failed: no answer` (EIO); and
the hint offered `tcp!host!port` where only a numeric address is taken.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
| |
line, in the same write or the next, is refused EINVAL
Through a mount `printf 'a\nb\n' > pager` arrives a line a write, so the
second asked for another +Pager on the same open, its answer replacing
the first. An open that asked already refuses another.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
|
| |
question, the running one taking the text, and a done command REPL's tag says no id
Two bound REPLs always asked, an exited one offered and, chosen, sent
nothing. Now an exited one is left out: one still running takes the
text with no question, none running is said (`no program running`),
and nothing runs as a command. A command pane bound as a REPL whose
command is done no longer shows its id in the tag.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
|
|
| |
making any pane: `exec: <dir>: no such directory`, no `exit 127` pane left
A peer's directory (`/n/peer/x`) is no directory on this host, where the
shell starts, so a command there ran in a pane that could only say
`(pwd) exit 127`, and a Tty made a new/del pair. missingDir now counts
such a path missing, as it does a local directory that is not there.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| |
|
|
|
|
|
|
|
| |
disk_hash, an older dump) asks at its first Save, as for a file changed on disk
What its text was read against is unknown, so a Save could write over
a newer file without a word; it now asks once first.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|