Compare commits
No commits in common. "850378840bd0a358c9ed7b2f375a623b04acf61f" and "f12eb4e0632b04ce1779bebf2e26ba590f22be51" have entirely different histories.
850378840b
...
f12eb4e063
8 changed files with 2537 additions and 2606 deletions
|
|
@ -77,23 +77,14 @@ jobs:
|
||||||
zig build jvm-test --summary all
|
zig build jvm-test --summary all
|
||||||
zig build jvm-test -Doptimize=ReleaseSmall --summary all
|
zig build jvm-test -Doptimize=ReleaseSmall --summary all
|
||||||
- name: Package the CLI and TUI
|
- name: Package the CLI and TUI
|
||||||
# One binary holds both, cross-compiled from here for every desktop target NFR-2
|
# One binary holds both. Static musl on Linux, so it runs on any distribution.
|
||||||
# names. Static musl on Linux, so it runs on any distribution. The Windows build
|
|
||||||
# imports only ntdll.dll and kernel32.dll, so tally.exe is the whole download;
|
|
||||||
# the tally.dll beside it is the C ABI library and the .pdb is debug info.
|
|
||||||
run: |
|
run: |
|
||||||
mkdir -p dist
|
mkdir -p dist
|
||||||
while read -r target built published; do
|
for target in x86_64-linux-musl aarch64-linux-musl aarch64-macos; do
|
||||||
zig build -Dtarget="$target" -Doptimize="$RELEASE_OPTIMIZATION" --prefix "out/$target"
|
zig build -Dtarget="$target" -Doptimize="$RELEASE_OPTIMIZATION" --prefix "out/$target"
|
||||||
cp "out/$target/bin/$built" "dist/$published"
|
name="tally-${target%-musl}"
|
||||||
done <<'EOF'
|
cp "out/$target/bin/tally" "dist/$name"
|
||||||
x86_64-linux-musl tally tally-x86_64-linux
|
done
|
||||||
aarch64-linux-musl tally tally-aarch64-linux
|
|
||||||
aarch64-macos tally tally-aarch64-macos
|
|
||||||
x86_64-macos tally tally-x86_64-macos
|
|
||||||
x86_64-windows-gnu tally.exe tally-x86_64-windows.exe
|
|
||||||
aarch64-windows-gnu tally.exe tally-aarch64-windows.exe
|
|
||||||
EOF
|
|
||||||
ls -la dist
|
ls -la dist
|
||||||
- name: Upload
|
- name: Upload
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v3
|
||||||
|
|
@ -215,21 +206,11 @@ jobs:
|
||||||
public_key: 'https://emil.lerch.org/serverpublic.pem'
|
public_key: 'https://emil.lerch.org/serverpublic.pem'
|
||||||
uhub_control: 'true'
|
uhub_control: 'true'
|
||||||
- name: Transparency log entries
|
- name: Transparency log entries
|
||||||
# One SOURCE_n / URL_n pair per signed file, however many there are: this listed
|
|
||||||
# four by hand, and adding a file would have dropped its log entry silently.
|
|
||||||
# Plain sed over the outputs as JSON, so nothing beyond bash is assumed.
|
|
||||||
env:
|
|
||||||
OUTPUTS: ${{ toJSON(steps.sign.outputs) }}
|
|
||||||
run: |
|
run: |
|
||||||
i=0
|
echo "${{ steps.sign.outputs.SOURCE_0 }}: ${{ steps.sign.outputs.URL_0 }}"
|
||||||
while :; do
|
echo "${{ steps.sign.outputs.SOURCE_1 }}: ${{ steps.sign.outputs.URL_1 }}"
|
||||||
source="$(printf '%s\n' "$OUTPUTS" | sed -n "s/.*\"SOURCE_${i}\": *\"\([^\"]*\)\".*/\1/p")"
|
echo "${{ steps.sign.outputs.SOURCE_2 }}: ${{ steps.sign.outputs.URL_2 }}"
|
||||||
[ -n "$source" ] || break
|
echo "${{ steps.sign.outputs.SOURCE_3 }}: ${{ steps.sign.outputs.URL_3 }}"
|
||||||
url="$(printf '%s\n' "$OUTPUTS" | sed -n "s/.*\"URL_${i}\": *\"\([^\"]*\)\".*/\1/p")"
|
|
||||||
echo "${source}: ${url}"
|
|
||||||
i=$((i + 1))
|
|
||||||
done
|
|
||||||
[ "$i" -gt 0 ] || { echo "no signatures reported" >&2; exit 1; }
|
|
||||||
- name: Upload
|
- name: Upload
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v3
|
||||||
with:
|
with:
|
||||||
|
|
|
||||||
|
|
@ -3,9 +3,6 @@
|
||||||
## References
|
## References
|
||||||
|
|
||||||
- #[[file:.kiro/specs/calculator/requirements.md]]
|
- #[[file:.kiro/specs/calculator/requirements.md]]
|
||||||
- #[[file:.kiro/specs/calculator/tasks.md]] (open work)
|
|
||||||
- #[[file:.kiro/specs/calculator/history.md]] (what was done and why; "Task 5.19" and
|
|
||||||
"open item 10" below refer to entries there)
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
@ -1802,9 +1799,9 @@ and compares the result to the plain output byte for byte. `main` decides which,
|
||||||
`--color`, whether stdout supports escape codes, `NO_COLOR` and `TERM`, through a pure
|
`--color`, whether stdout supports escape codes, `NO_COLOR` and `TERM`, through a pure
|
||||||
`ColorChoice.resolve` that is tested on its own. Three choices behind it:
|
`ColorChoice.resolve` that is tested on its own. Three choices behind it:
|
||||||
|
|
||||||
- **The terminal's palette, not fixed RGB.** The TUI's Molokai triples (tasks.md,
|
- **The terminal's palette, not fixed RGB.** The TUI's Molokai triples (open item 17)
|
||||||
"Themes") ignore the user's theme; SGR 31-36 are whatever the theme says, and a theme
|
ignore the user's theme; SGR 31-36 are whatever the theme says, and a theme is built
|
||||||
is built so its own colors read on its own background.
|
so its own colors read on its own background.
|
||||||
- **No background, ever.** Forcing black was considered as insurance against an
|
- **No background, ever.** Forcing black was considered as insurance against an
|
||||||
unreadable hue and rejected: it would undo the theme on every light terminal to fix a
|
unreadable hue and rejected: it would undo the theme on every light terminal to fix a
|
||||||
problem the theme already solves.
|
problem the theme already solves.
|
||||||
|
|
@ -2007,7 +2004,7 @@ An earlier wireframe in this section showed a bordered "Bit Pattern (63 -> 0)" b
|
||||||
(`w:width s:sign e:endian y:yank`). None of that was built: there are no borders, the
|
(`w:width s:sign e:endian y:yank`). None of that was built: there are no borders, the
|
||||||
prefix appears only in the clipboard form, the width and sign keys are Ctrl-chords
|
prefix appears only in the clipboard form, the width and sign keys are Ctrl-chords
|
||||||
because plain letters are hex digits in an editable field (FR-7.8), and there is no
|
because plain letters are hex digits in an editable field (FR-7.8), and there is no
|
||||||
yank command yet (tasks.md, "Copying a result, and marking one approximate").
|
yank command yet (open item 14).
|
||||||
|
|
||||||
#### 8.2.1 Programmer Mode - Editable Fields (REVISED DESIGN)
|
#### 8.2.1 Programmer Mode - Editable Fields (REVISED DESIGN)
|
||||||
|
|
||||||
|
|
@ -2033,8 +2030,8 @@ Fields (navigable with Up/Down):
|
||||||
|
|
||||||
Field 8 was never built. `ProgField.expression` exists and Up/Down cycles through it,
|
Field 8 was never built. `ProgField.expression` exists and Up/Down cycles through it,
|
||||||
but no row is drawn for it and no key does anything there, so it reads as a keystroke
|
but no row is drawn for it and no key does anything there, so it reads as a keystroke
|
||||||
that did nothing (tasks.md, "Programmer mode's value zone"). The expression language is
|
that did nothing (open item 18). The expression language is reachable from the input
|
||||||
reachable from the input line instead, which is where it has always been.
|
line instead, which is where it has always been.
|
||||||
|
|
||||||
Navigation:
|
Navigation:
|
||||||
- Up/Down moves focus between fields
|
- Up/Down moves focus between fields
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -16,7 +16,7 @@ A calculator application with three frontends (CLI, TUI, Android) sharing a comm
|
||||||
- **FR-1.4**: Support built-in functions: `sin`, `cos`, `tan`, `asin`, `acos`, `atan`, `log` (base-10), `ln` (natural), `sqrt`, `cbrt`, `abs`, `ceil`, `floor`, `round`, `factorial`. An argument outside a function's domain is reported as such, distinct from an unknown name: `asin(2)`, `ln(0)`, `log2(0)` and `factorial(-1)` report a domain error, `sqrt(-1)` reports "square root of a negative number", and only an unrecognized name reports an unknown function.
|
- **FR-1.4**: Support built-in functions: `sin`, `cos`, `tan`, `asin`, `acos`, `atan`, `log` (base-10), `ln` (natural), `sqrt`, `cbrt`, `abs`, `ceil`, `floor`, `round`, `factorial`. An argument outside a function's domain is reported as such, distinct from an unknown name: `asin(2)`, `ln(0)`, `log2(0)` and `factorial(-1)` report a domain error, `sqrt(-1)` reports "square root of a negative number", and only an unrecognized name reports an unknown function.
|
||||||
- **FR-1.5**: Support constants: `pi`, `e`, `tau`. These are fixed values, readable and not assignable.
|
- **FR-1.5**: Support constants: `pi`, `e`, `tau`. These are fixed values, readable and not assignable.
|
||||||
- **FR-1.6**: Support variable storage: any identifier as a named variable. (The original wording restricted this to `A-F, X, Y, Z`; the implementation accepts any name, which is a superset and the better behaviour, so the requirement follows the code.) A constant is not an assignment target: `pi = 3` reports an error rather than accepting the assignment and ignoring it.
|
- **FR-1.6**: Support variable storage: any identifier as a named variable. (The original wording restricted this to `A-F, X, Y, Z`; the implementation accepts any name, which is a superset and the better behaviour, so the requirement follows the code.) A constant is not an assignment target: `pi = 3` reports an error rather than accepting the assignment and ignoring it.
|
||||||
- **FR-1.6.1**: The last answer is a **pseudovariable**, not a constant: `Ans` (also `ans`) reads the result of the previous evaluation, the engine updates it on every successful evaluation, and the user cannot assign to it. It is a distinct concept from FR-1.5's constants, which never change, and from FR-1.6's variables, which only the user writes. The set is exactly one name: the immediately preceding answer. Earlier results are FR-1.7's history, reachable by replay rather than by name. See tasks.md, "`Ans` is a pseudovariable, and the engine models it as a constant": the engine currently folds `Ans` in with the constants and reports `AssignmentToConstant` ("cannot assign to a built-in constant") for `Ans = 5`, which misnames it.
|
- **FR-1.6.1**: The last answer is a **pseudovariable**, not a constant: `Ans` (also `ans`) reads the result of the previous evaluation, the engine updates it on every successful evaluation, and the user cannot assign to it. It is a distinct concept from FR-1.5's constants, which never change, and from FR-1.6's variables, which only the user writes. The set is exactly one name: the immediately preceding answer. Earlier results are FR-1.7's history, reachable by replay rather than by name. See tasks.md open item 16: the engine currently folds `Ans` in with the constants and reports `AssignmentToConstant` ("cannot assign to a built-in constant") for `Ans = 5`, which misnames it.
|
||||||
- **FR-1.7**: Maintain calculation history with replay capability.
|
- **FR-1.7**: Maintain calculation history with replay capability.
|
||||||
- **FR-1.8**: Commas accepted as digit separators in input, but only in thousands groups: a comma must be followed by exactly three digits (`1,000 * 2` is 2000, `1,234,567` is one number). A comma followed by any other number of digits is an argument separator, which is what makes `log(100,10)` two arguments rather than the number 10010. The ambiguous case `max(1,234)` resolves in favour of the grouping and reads as `max(1234)`; write a space to mean two arguments. A malformed group such as `1,00` is an error rather than a silently merged number. Spaces and underscores group hex/octal/binary literals (`0xFF FF`, `0xFF_FF`); commas do not.
|
- **FR-1.8**: Commas accepted as digit separators in input, but only in thousands groups: a comma must be followed by exactly three digits (`1,000 * 2` is 2000, `1,234,567` is one number). A comma followed by any other number of digits is an argument separator, which is what makes `log(100,10)` two arguments rather than the number 10010. The ambiguous case `max(1,234)` resolves in favour of the grouping and reads as `max(1234)`; write a space to mean two arguments. A malformed group such as `1,00` is an error rather than a silently merged number. Spaces and underscores group hex/octal/binary literals (`0xFF FF`, `0xFF_FF`); commas do not.
|
||||||
- **FR-1.9**: When a standard-mode expression contains any non-decimal literal (hex `0x`, octal `0o`, or binary `0b`) and the result is a non-negative integer, enrich the result display with hex/octal/binary representations inline (without leaving standard mode). Uses the smallest standard bit width (8/16/32/64/128) that holds the value. This does not change the evaluation semantics (still f64 arithmetic, `^` is still power); it only augments the display. Fractional or negative results show decimal only.
|
- **FR-1.9**: When a standard-mode expression contains any non-decimal literal (hex `0x`, octal `0o`, or binary `0b`) and the result is a non-negative integer, enrich the result display with hex/octal/binary representations inline (without leaving standard mode). Uses the smallest standard bit width (8/16/32/64/128) that holds the value. This does not change the evaluation semantics (still f64 arithmetic, `^` is still power); it only augments the display. Fractional or negative results show decimal only.
|
||||||
|
|
@ -178,7 +178,7 @@ comes out whole, which is easier while nothing but the CLI depends on it.
|
||||||
- **FR-7.7**: Every action must be reachable from the keyboard alone; the TUI is fully usable without a mouse.
|
- **FR-7.7**: Every action must be reachable from the keyboard alone; the TUI is fully usable without a mouse.
|
||||||
- **FR-7.8**: REMOVED. Quick-switch keys (`d`=dec, `h`=hex, `o`=oct, `b`=bin) to highlight the primary base cannot coexist with editable value fields: in the value zone those letters are hex and binary digits. The requirement predates editable fields, and the fields are the more useful feature. Base selection stays on the arrow keys and the mouse.
|
- **FR-7.8**: REMOVED. Quick-switch keys (`d`=dec, `h`=hex, `o`=oct, `b`=bin) to highlight the primary base cannot coexist with editable value fields: in the value zone those letters are hex and binary digits. The requirement predates editable fields, and the fields are the more useful feature. Base selection stays on the arrow keys and the mouse.
|
||||||
- **FR-7.9**: Support terminal resize gracefully.
|
- **FR-7.9**: Support terminal resize gracefully.
|
||||||
- **FR-7.9.3**: NOT IMPLEMENTED. The colour scheme is selectable rather than fixed. Molokai stays the default, and the requirement is that it is a default: a light theme, a terminal's own 16 colours, and a user's choice are all reachable without editing the source. Today `draw.C` is eleven literal RGB triples read directly by every view, which makes the palette a compile-time fact. Prerequisite is naming the roles the views use (error, focus, selection, accent) instead of the colours they happen to be; tasks.md's "Themes" holds the detail.
|
- **FR-7.9.3**: NOT IMPLEMENTED. The colour scheme is selectable rather than fixed. Molokai stays the default, and the requirement is that it is a default: a light theme, a terminal's own 16 colours, and a user's choice are all reachable without editing the source. Today `draw.C` is eleven literal RGB triples read directly by every view, which makes the palette a compile-time fact. Prerequisite is naming the roles the views use (error, focus, selection, accent) instead of the colours they happen to be; tasks.md open item 17 holds the detail.
|
||||||
- **FR-7.9.1**: Nothing in the TUI's own chrome is cut off mid-word at 60 columns or more. Status lines are lists of key hints, and a line too long for the terminal drops whole hints from the end rather than losing the last one's tail: each mode orders its hints so the keys that leave the current zone (`?:help`, `Tab:mode`, the zone toggle) come first and are the last to go. Status lines also leave the final column clear, which is what lets a rendered frame be checked for clipping at all: any row but the separator reaching the right edge is then a fault, not a maybe. Below 60 columns the notices themselves cannot fit, and shortening them further would leave them saying nothing.
|
- **FR-7.9.1**: Nothing in the TUI's own chrome is cut off mid-word at 60 columns or more. Status lines are lists of key hints, and a line too long for the terminal drops whole hints from the end rather than losing the last one's tail: each mode orders its hints so the keys that leave the current zone (`?:help`, `Tab:mode`, the zone toggle) come first and are the last to go. Status lines also leave the final column clear, which is what lets a rendered frame be checked for clipping at all: any row but the separator reaching the right edge is then a fault, not a maybe. Below 60 columns the notices themselves cannot fit, and shortening them further would leave them saying nothing.
|
||||||
- **FR-7.9.2**: Input is ASCII. A key event carrying non-ASCII text is dropped rather than stored: every column in the TUI is one byte, so an accented character would occupy a cell per UTF-8 byte, drawn as blanks, and then fail to tokenize. Refusing it keeps what is on screen equal to what is in the buffer. A wider fix is a different piece of work: the whole layout counts columns in bytes.
|
- **FR-7.9.2**: Input is ASCII. A key event carrying non-ASCII text is dropped rather than stored: every column in the TUI is one byte, so an accented character would occupy a cell per UTF-8 byte, drawn as blanks, and then fail to tokenize. Refusing it keeps what is on screen equal to what is in the buffer. A wider fix is a different piece of work: the whole layout counts columns in bytes.
|
||||||
- **FR-7.10**: Vi-style and Emacs-style keybinding options for expression input. NOT IMPLEMENTED: the prompt is a plain text field. Deferred, not dropped.
|
- **FR-7.10**: Vi-style and Emacs-style keybinding options for expression input. NOT IMPLEMENTED: the prompt is a plain text field. Deferred, not dropped.
|
||||||
|
|
@ -203,19 +203,20 @@ still required (FR-7.7): the mouse never becomes the only way to do something.
|
||||||
- **FR-7.11.12**: Clickable regions are rebuilt every frame from what was actually drawn, so hit targets can never drift out of sync with the display.
|
- **FR-7.11.12**: Clickable regions are rebuilt every frame from what was actually drawn, so hit targets can never drift out of sync with the display.
|
||||||
- **FR-7.11.13**: In financial mode, clicking a calculation chip selects that calculation and clicking a field row focuses it for editing; the mouse wheel scrolls the amortization schedule. In the help overlay the wheel scrolls and a click returns.
|
- **FR-7.11.13**: In financial mode, clicking a calculation chip selects that calculation and clicking a field row focuses it for editing; the mouse wheel scrolls the amortization schedule. In the help overlay the wheel scrolls and a click returns.
|
||||||
|
|
||||||
### FR-8: Android Frontend - THREE OF FOUR SCREENS BUILT
|
### FR-8: Android Frontend - WALKING SKELETON BUILT, UNVERIFIED ON A DEVICE
|
||||||
|
|
||||||
`android/` is a Compose app over the C ABI with three screens behind a hamburger drawer:
|
`android/` now holds a one-screen Compose app over the C ABI: an expression field, a
|
||||||
the standard calculator (design 9.2), programmer mode (9.3) and the converter (9.6), plus a
|
history, and the multi-base and conversion detail lines. The engine behind it is the
|
||||||
theme setting. Each reopens exactly as it was left. It has run on an Android 15 emulator
|
finished one, so exact arithmetic, units and the financial functions all work in that one
|
||||||
with 16 KiB pages and on a Galaxy S23+ (arm64-v8a, Android 16).
|
field already (FR-4.1, FR-5.7). Nothing in `android/` has been compiled: the machine it
|
||||||
|
was written on has no JDK, Gradle or SDK, by choice, so the version numbers and the
|
||||||
|
instrumented test are the first things to try.
|
||||||
|
|
||||||
Built of the requirements below: FR-8.1 and FR-8.2 (JNI through a hand-written layer with
|
What is built of the requirements below: FR-8.1 (Kotlin and Compose), FR-8.2 (JNI, via a
|
||||||
no NDK, design 6.4), FR-8.4, FR-8.5 and FR-8.8. FR-8.3's bottom bar became the drawer, and
|
hand-written layer with no NDK - design 6.4), and the standard-mode half of FR-8.4.
|
||||||
FR-8.10's Material 3 is there without its dynamic colour, which was tried and dropped
|
FR-8.3's navigation, the programmer and financial and convert screens, and everything from
|
||||||
because it lit the keypad's bands in dark mode (design 9.1). Not built: the financial screen (FR-8.7), the struct sub-screen
|
FR-8.9 down are not started. FR-8.6 needs FR-3's engine, which now exists, and a C ABI
|
||||||
(FR-8.6, which needs a C ABI export of the struct engine), and FR-8.9, FR-8.11 and FR-8.12;
|
export for it, which does not.
|
||||||
`tasks.md` has each.
|
|
||||||
|
|
||||||
- **FR-8.1**: Native Android app using Kotlin and Jetpack Compose.
|
- **FR-8.1**: Native Android app using Kotlin and Jetpack Compose.
|
||||||
- **FR-8.2**: Call into the Zig engine via JNI (C ABI shared library).
|
- **FR-8.2**: Call into the Zig engine via JNI (C ABI shared library).
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
19
README.md
19
README.md
|
|
@ -43,10 +43,9 @@ $ tally -p '0xDEADBEEF and 0xFFFF'
|
||||||
terminal each member's row and bytes share a color. Every profile is checked against
|
terminal each member's row and bytes share a color. Every profile is checked against
|
||||||
clang at build time. Command line only, for now.
|
clang at build time. Command line only, for now.
|
||||||
|
|
||||||
The requirements and design are in [.kiro/specs/calculator](.kiro/specs/calculator),
|
The requirements and design, including what is planned and not built (a struct layout
|
||||||
with the open work in [tasks.md](.kiro/specs/calculator/tasks.md) (among it a struct layout
|
view in the TUI and on Android, a financial screen on Android), are in
|
||||||
view in the TUI and on Android, and a financial screen on Android) and the record of what
|
[.kiro/specs/calculator](.kiro/specs/calculator).
|
||||||
was done, and why, in [history.md](.kiro/specs/calculator/history.md).
|
|
||||||
|
|
||||||
## The three frontends
|
## The three frontends
|
||||||
|
|
||||||
|
|
@ -74,13 +73,10 @@ Builds of `master` are published to the
|
||||||
file with a detached signature:
|
file with a detached signature:
|
||||||
|
|
||||||
| File | What |
|
| File | What |
|
||||||
|-----------------------------|----------------------------------------------|
|
|-----------------------|----------------------------------------------|
|
||||||
| `tally-x86_64-linux` | CLI and TUI, static (musl), any distribution |
|
| `tally-x86_64-linux` | CLI and TUI, static (musl), any distribution |
|
||||||
| `tally-aarch64-linux` | the same for 64-bit ARM |
|
| `tally-aarch64-linux` | the same for 64-bit ARM |
|
||||||
| `tally-aarch64-macos` | Apple silicon |
|
| `tally-aarch64-macos` | Apple silicon |
|
||||||
| `tally-x86_64-macos` | Intel Macs |
|
|
||||||
| `tally-x86_64-windows.exe` | 64-bit Windows, no runtime to install |
|
|
||||||
| `tally-aarch64-windows.exe` | the same for Windows on ARM |
|
|
||||||
| `tally.apk` | the Android app, Android 8.0 and later |
|
| `tally.apk` | the Android app, Android 8.0 and later |
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
@ -91,9 +87,6 @@ chmod +x tally-x86_64-linux
|
||||||
`latest` moves with every push to master. Each build is also published under its short
|
`latest` moves with every push to master. Each build is also published under its short
|
||||||
commit SHA, which never changes.
|
commit SHA, which never changes.
|
||||||
|
|
||||||
The Windows executables carry the same detached signature as everything else, but no
|
|
||||||
Authenticode signature, so SmartScreen may warn the first time one runs.
|
|
||||||
|
|
||||||
### Verifying a download
|
### Verifying a download
|
||||||
|
|
||||||
Every file is signed by a key held in a hardware security module, and every signature is
|
Every file is signed by a key held in a hardware security module, and every signature is
|
||||||
|
|
@ -246,7 +239,7 @@ src/main.zig, src/cli/ the command line
|
||||||
src/tui.zig, src/tui/ the terminal UI (libvaxis)
|
src/tui.zig, src/tui/ the terminal UI (libvaxis)
|
||||||
android/ the Compose app; Kotlin parses no expressions and formats no numbers
|
android/ the Compose app; Kotlin parses no expressions and formats no numbers
|
||||||
build/ coverage (kcov) support for build.zig
|
build/ coverage (kcov) support for build.zig
|
||||||
.kiro/specs/ requirements, design, open tasks, and the history of finished ones
|
.kiro/specs/ requirements, design and task history
|
||||||
```
|
```
|
||||||
|
|
||||||
A few decisions shape everything else, and the design document explains each:
|
A few decisions shape everything else, and the design document explains each:
|
||||||
|
|
@ -293,7 +286,7 @@ punctuation: the source is ASCII.
|
||||||
|
|
||||||
| Job | Runner | What |
|
| Job | Runner | What |
|
||||||
|---------------------|--------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
|---------------------|--------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
| Engine, CLI and TUI | `ubuntu-latest` | `zig fmt --check`, zlint, build, `zig build test` in Debug and each release mode, `zig build jvm-test` in Debug and ReleaseSmall, then release builds for Linux, macOS and Windows |
|
| Engine, CLI and TUI | `ubuntu-latest` | `zig fmt --check`, zlint, build, `zig build test` in Debug and each release mode, `zig build jvm-test` in Debug and ReleaseSmall, then release builds for x86_64 and aarch64 Linux and aarch64 macOS |
|
||||||
| Android | `ubuntu-latest` | `zig build android` (which audits the libraries), the JVM unit tests, debug and unsigned release APKs (with lint's release checks) |
|
| Android | `ubuntu-latest` | `zig build android` (which audits the libraries), the JVM unit tests, debug and unsigned release APKs (with lint's release checks) |
|
||||||
| Sign | `ubuntu-latest-with-hsm` | master only: signs the APK with the HSM, then every release file with a detached signature logged to sigstore |
|
| Sign | `ubuntu-latest-with-hsm` | master only: signs the APK with the HSM, then every release file with a detached signature logged to sigstore |
|
||||||
| Publish | `ubuntu-latest` | master only: uploads the signed files to the generic package registry under the short SHA and `latest` |
|
| Publish | `ubuntu-latest` | master only: uploads the signed files to the generic package registry under the short SHA and `latest` |
|
||||||
|
|
|
||||||
|
|
@ -314,9 +314,8 @@ const testing = std.testing;
|
||||||
///
|
///
|
||||||
/// This was `FormatOptions.plain`, documented as what the clipboard wants, until a
|
/// This was `FormatOptions.plain`, documented as what the clipboard wants, until a
|
||||||
/// look at the callers found all 24 of them in the tests below and none in a
|
/// look at the callers found all 24 of them in the tests below and none in a
|
||||||
/// frontend. The TUI has no yank command yet (tasks.md, "Copying a result, and
|
/// frontend. The TUI has no yank command yet (tasks.md open item 14), so it lives
|
||||||
/// marking one approximate"), so it lives here until something outside the tests
|
/// here until something outside the tests asks for it.
|
||||||
/// asks for it.
|
|
||||||
const canonical: FormatOptions = .{ .separators = false, .prefix = true };
|
const canonical: FormatOptions = .{ .separators = false, .prefix = true };
|
||||||
|
|
||||||
test "BitWidth.mask" {
|
test "BitWidth.mask" {
|
||||||
|
|
|
||||||
|
|
@ -871,7 +871,7 @@ test "a numeric span that is not a number is an invalid number, not an unexpecte
|
||||||
// It used to be recognised in prefix position, so it could appear wherever an
|
// It used to be recognised in prefix position, so it could appear wherever an
|
||||||
// operand could: `1 + x = 2` assigned 2 to `x` and evaluated to 3, and `f(x = 1)`
|
// operand could: `1 + x = 2` assigned 2 to `x` and evaluated to 3, and `f(x = 1)`
|
||||||
// was an argument list with a side effect. Both are the same bug, and both are now
|
// was an argument list with a side effect. Both are the same bug, and both are now
|
||||||
// parse errors (history.md, open item 10).
|
// parse errors (tasks.md open item 10).
|
||||||
|
|
||||||
test "assignment at the top of the input still parses" {
|
test "assignment at the top of the input still parses" {
|
||||||
const expr = try testParse("X = 42");
|
const expr = try testParse("X = 42");
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue