Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
349 commits
Select commit Hold shift + click to select a range
6c76e86
feat(go): add tasks slice map and domain errors
Oct 24, 2026
55f8eea
feat(go): port tasks core domain models
Oct 24, 2026
78f0405
feat(go): port tasks event, command, graph and worktree domain models
Oct 24, 2026
a6ed1dd
feat(go): port tasks domain ports
Oct 24, 2026
2007593
feat(go): port tasks use cases and lifecycle
Oct 24, 2026
0295f45
test(go): add tasks application tests and fakes
Oct 24, 2026
3b29941
feat(go): add tasks sqlc schema and generated queries
Oct 24, 2026
291de67
feat(go): port tasks repository with optimistic start claims
Oct 24, 2026
839bcdb
feat(go): port tasks sqlite busy retry decorator
Oct 24, 2026
381f004
test(go): add tasks repository, claim race and busy retry integration…
Oct 24, 2026
e24265c
feat(go): add tasks dto and module wiring
Oct 24, 2026
d725832
feat(go): add tasks event subscriber port and get task events use case
Oct 24, 2026
ee5135c
test(go): port remaining tasks slice A application parity tests
Oct 24, 2026
cdca805
test(go): port remaining tasks repository parity tests
Oct 24, 2026
ce268cd
feat(go): add tasks queued agent event sink
Oct 24, 2026
6feeab9
feat(go): add tasks broadcast event bus with bounded subscribers
Oct 24, 2026
2db779b
feat(go): add tasks event dto
Oct 24, 2026
a51e2cb
feat(go): add tasks sse transport with resumable cursors
Oct 24, 2026
a2ee3bc
feat(go): wire tasks event bus and queue with resilience tests
Oct 24, 2026
24fff47
test(go): add tasks sse integration tests
Oct 24, 2026
ed7602e
feat(go): wire project_tree, agent_profiles, code_hosting and termina…
Oct 24, 2026
daab03e
test(e2e): add go server mode and isolated runner for the e2e suite
Oct 24, 2026
87c95e4
feat(go): add tasks attachment and task file use cases
Oct 24, 2026
b8cbf15
feat(go): add tasks attachment storage on os.Root with containment
Oct 24, 2026
a42b0d0
feat(go): add tasks attachment persistence with immediate transactions
Oct 24, 2026
095e0d4
feat(go): add tasks task file adapter with symlink containment
Oct 24, 2026
a029694
feat(go): add tasks attachment and task file dto
Oct 24, 2026
2980bbb
feat(go): add tasks attachment download handler
Oct 24, 2026
ae3f6ce
feat(go): wire tasks attachments and files into the module
Oct 24, 2026
be408fa
fix(dock): reload a pane when replace changes its path
Oct 24, 2026
538d9f5
fix(go): fire the agent_profiles name hint on load so fast input is n…
Oct 24, 2026
6a7bb43
test(go): cover the agent_profiles name hint endpoint for typed values
Oct 24, 2026
53aea9e
feat(go): add tasks git runner with process groups, parsing and commi…
Oct 24, 2026
adfba2d
feat(go): add tasks git worktree adapter with containment, diff and m…
Oct 24, 2026
aca84e6
feat(go): add tasks orphan worktree sweep with conservative keep set
Oct 24, 2026
6f8d1be
test(go): port tasks git worktree adapter tests
Oct 24, 2026
3e13b90
feat(go): add tasks caching worktree decorator with fingerprint recheck
Oct 24, 2026
6805b72
feat(go): add tasks worktree use cases and worktree removal on worksp…
Oct 24, 2026
ad4fb27
feat(go): wire tasks worktrees into the module
Oct 24, 2026
21a1825
fix(go): serialize agent settings read-modify-write changes
Oct 24, 2026
a39ddd1
test(e2e): wait for htmx to settle the agent bar before the restore step
Oct 24, 2026
faea867
test(e2e): per-run logs, smoke worktrees, unit shim and README for th…
Oct 24, 2026
f229651
fix(go): refuse option-like refs and uncontained worktrees in the tas…
Oct 24, 2026
4d4dd50
feat(go): load the .env file from the working folder or its ancestors
Oct 24, 2026
4c277d0
feat(go): log requests at debug level and enable it in the e2e runner
Oct 24, 2026
31934f4
test(go): port the remaining Rust tasks slice A tests and pin the Rus…
Oct 24, 2026
c3f5664
feat(go): add tasks graph domain rules and use cases
Oct 24, 2026
77dd6f7
feat(go): add tasks graph persistence, dto, loop and module wiring
Oct 24, 2026
1643b7e
feat(go): add tasks usage-limit resume use cases
Oct 24, 2026
024b948
feat(go): add tasks resume loop and module wiring
Oct 24, 2026
d76bcf5
feat(go): add agent capabilities tests and windows context tree kill
Oct 24, 2026
b2336a5
feat(go): add tasks agent process lifecycle and runtime router
Oct 24, 2026
211222d
feat(go): add tasks claude stream-json runtime protocol and adapter
Oct 24, 2026
d4e1a9e
feat(go): add tasks cursor ACP protocol
Oct 24, 2026
9db0e65
feat(go): add tasks cursor ACP runtime adapter and fixture
Oct 24, 2026
ed66dba
feat(go): add tasks pi RPC protocol
Oct 24, 2026
1c8e747
feat(go): add tasks pi RPC runtime adapter
Oct 24, 2026
14ac55b
feat(go): add tasks start_task use case with optimistic claim and revert
Oct 25, 2026
4bab89c
feat(go): add tasks send_message, set_agent_mode, abort and reconcile…
Oct 25, 2026
7c1f701
feat(go): add tasks finish, reset and discard use cases
Oct 25, 2026
c014260
fix(go): close review advisories of tasks start, finish and discard
Oct 25, 2026
4c757bb
refactor(go): resume rate-limited tasks through SendMessage like Rust
Oct 25, 2026
9cf977b
feat(go): wire tasks module, loops, boot sweep and shutdown into the app
Oct 25, 2026
453fd87
fix(go): bind before start-up and give every shutdown step its own de…
Oct 25, 2026
61cc6d8
fix(go): derive the global shutdown budget from the step budgets plus…
Oct 25, 2026
467fd24
feat(go): add tasks board state, sidebar logic and board dto
Oct 25, 2026
ec1f244
feat(go): add tasks board templ components, page and handlers
Oct 25, 2026
84bef41
feat(go): mount the tasks board as the home tab with sidebar and e2e
Oct 25, 2026
aeb81fb
feat(go): add tasks create/edit form dto with boundary validation
Oct 25, 2026
6105a2e
feat(go): add CreateLinkedTask use case
Oct 25, 2026
25e25cc
feat(go): add task form state and fix board state advisories
Oct 25, 2026
600b932
feat(go): add task form and edit page templates, fix board markup adv…
Oct 25, 2026
9a9224f
feat(go): add create/edit/start/delete task handlers and wire them
Oct 25, 2026
53a771b
test(go): cover task form handlers and board error states
Oct 25, 2026
ffc9ebb
feat(go): add task form client scripts and tasks_edit e2e
Oct 25, 2026
20ab189
build(go): generate templ per file so make generate leaves no diff
Oct 25, 2026
079844b
fix(go): serialize dock requests, keep menus open on group focus, lab…
Oct 25, 2026
923c047
fix(go): start the select label with no whitespace and render limit u…
Oct 25, 2026
1c3af00
feat(go): translate the task form boundary errors and test a successf…
Oct 25, 2026
9aab0c2
fix(go): give every board and edit tab its own element ids and show f…
Oct 25, 2026
3b75f25
test(go): e2e for pasting images into the task prompt
Oct 25, 2026
03c8a1b
fix(go): give every shutdown step 30s so an agent stop and kill fit i…
Oct 25, 2026
d4af487
fix(go): refuse diff range bounds that git would read as options
Oct 25, 2026
de53d63
fix(go): make the dock request queue unable to wedge
Oct 25, 2026
2cc3b9f
feat(go): open the task detail at /tasks/<id> ahead of the not-migrat…
Oct 25, 2026
b35a3c1
feat(go): show the task header, status badge, branch and backlog acti…
Oct 25, 2026
142756b
feat(go): offer the agent and danger actions with their confirmations…
Oct 25, 2026
ab137c0
fix(go): keep the board list and sidebar listeners in the page
Oct 25, 2026
da88a98
feat(go): map task events to a typed transcript DTO
Oct 25, 2026
d7b0cdb
feat(go): fold task events into the transcript read model
Oct 25, 2026
6c39588
feat(go): add transcript view helpers and texts in five languages
Oct 25, 2026
13aebda
feat(go): fold a task history into the transcript with its stream cursor
Oct 25, 2026
ccf7923
feat(go): render the transcript view and its live panel
Oct 25, 2026
22141db
feat(go): mount the transcript on the task detail page
Oct 25, 2026
ba26dfd
feat(go): follow the bottom of the transcript after each refresh
Oct 25, 2026
3caff85
feat(go): parse the composer message and validate its mode at the ada…
Oct 26, 2026
357a4b1
feat(go): add the composer state and the /plan and /agent mode rule
Oct 26, 2026
47a4496
feat(go): render the composer with its mode switch, menus and texts
Oct 26, 2026
da2d9f5
feat(go): answer the composer message, the mode switch and the file s…
Oct 26, 2026
e61eae6
feat(go): show the composer below the transcript of a live task
Oct 26, 2026
0ceaca3
feat(go): complete commands and @files in the message box
Oct 26, 2026
cebdae4
feat(go): cover the message box of a live task in the browser suite
Oct 26, 2026
c0c1be8
fix(go): answer an invalid task id of the composer in the request lan…
Oct 26, 2026
2a53b65
fix(go): cap the body of the composer mode switch like the message route
Oct 26, 2026
7a2dfd3
fix(go): keep the typed text of a refused composer message
Oct 26, 2026
4920697
fix(go): show the history read error in the composer
Oct 26, 2026
54c362d
fix(go): answer a composer send with its body, not the composer element
Oct 26, 2026
7ebcc42
fix(js): Ctrl+Enter respects the state of the send button
Oct 26, 2026
b245f33
fix(js): ask the server once per @ query and drop stale file answers
Oct 26, 2026
c716ef6
fix(js): connect the message box from the page, not as an import side…
Oct 26, 2026
de143f2
test(go): wait for the page conditions in the composer e2e, not fixed…
Oct 26, 2026
d6ed635
test(go): wait for the agent's turn to settle before the composer e2e…
Oct 26, 2026
11d8a9f
fix(go): mount the composer endpoints from the tasks module
Oct 26, 2026
deb68ff
fix(go): feed the composer @ completion from the project tree search
Oct 26, 2026
22d420e
fix(go): show a localized message when the composer history cannot be…
Oct 26, 2026
9dc55a8
fix(js): show no @ file suggestions when the file request fails
Oct 26, 2026
d438ac7
feat(go): keep the dialog kind in the transcript and parse dialog ans…
Oct 26, 2026
04b86dd
feat(go): draw the pending dialogs of the transcript as answerable co…
Oct 26, 2026
3cdcfd2
feat(go): answer dialogs through POST /tasks/{id}/dialogs/{dialogId}/…
Oct 26, 2026
fb4917a
test(e2e): gate the stale and the answered dialogs of the Go suite
Oct 26, 2026
a6f48e6
fix(go): mount the dialog answer route from the tasks module
Oct 26, 2026
840eb2a
fix(tasks): refuse a dialog value answer that lacks its value field
Oct 26, 2026
3d12902
test(tasks): cover the size cap of a dialog answer
Oct 26, 2026
8a59c4f
test(tasks): refuse a transcript dialog of an unknown kind in the tes…
Oct 26, 2026
9693848
refactor(tasks): name the confirmation reader and the form error asse…
Oct 26, 2026
2c5181e
fix(tasks): refuse a dialog answer of a kind the dialog does not take
Oct 26, 2026
b4de570
fix(tasks): deliver a dialog answer once when two answers race
Oct 26, 2026
dc78be7
fix(tasks): show a dialog its closed turn ended as closed, not answered
Oct 26, 2026
f2a19f3
fix(tasks): report an answer the agent took as answered when recordin…
Oct 26, 2026
cab2e1a
fix(tasks): send one answer per dialog control and announce its notice
Oct 26, 2026
770dda9
fix(e2e): keep a failed stale dialog test's failure when the runtime …
Oct 26, 2026
19d814c
fix(e2e): find the created stale-dialog task by its new link, not its…
Oct 26, 2026
f4bcd9a
fix(e2e): read the negative checks of a stale dialog from its anchore…
Oct 26, 2026
c64fcd6
test(tasks): cover the five languages of the answer mismatch refusal
Oct 26, 2026
c711c9f
fix(tasks): serialize dialog answers per dialog, not globally
Oct 26, 2026
1473430
fix(tasks): derive a dialog's closed-by-turn state from the transcript
Oct 26, 2026
0b403e1
fix(tasks): close the dialogs a run leaves open when the run settles
Oct 26, 2026
2b4cc8d
fix(e2e): check the whole page for an open dialog once it closes
Oct 26, 2026
2c2b8a2
fix(go): settle the claude run before resolving the dialogs it left open
Oct 26, 2026
fe1fb69
test(e2e): run the stale and answered dialog tests on cursor and claude
Oct 26, 2026
5f6c629
feat(go): port the diff patch parser and changed-files tree
Oct 26, 2026
8ada9b2
feat(go): add the task diff DTO and the diff view helpers
Oct 26, 2026
3c7d05d
feat(go): add the diff badges, file card and file tree components
Oct 26, 2026
34a8d84
chore(go): name the diff templ files relative to the root
Oct 26, 2026
8a23a4a
feat(go): add the diff view and its screen state
Oct 26, 2026
b134e23
feat(go): add the diff tab handler and page
Oct 26, 2026
f587b53
feat(go): wire the diff tab and its view into the tasks module
Oct 26, 2026
57c4556
test(go): the diff of a task is its own tab, not a not-migrated path
Oct 26, 2026
ea1e900
feat(go): add the task file endpoints of the diff editor
Oct 26, 2026
3eb3795
feat(go): add the inline file editor to the diff cards
Oct 26, 2026
acc89f1
feat(go): expose the project tree panels to the task views
Oct 26, 2026
f15b45f
feat(go): add the tab state and strip of a task
Oct 26, 2026
3cbd6e8
feat(go): serve the Archivos and Cambios tabs of a task
Oct 26, 2026
ddacc63
feat(go): wire the project tree panels into the Files and Changes tab…
Oct 26, 2026
2e7bf1c
test(go): add the Cambios tab e2e for stage, unstage and commit
Oct 26, 2026
ad651fd
fix(tasks): read quoted paths and real git sides in the diff parser
Oct 26, 2026
527fee2
fix(tasks): send [] for a diff without commits and pin the card fold
Oct 26, 2026
cd5d7e3
fix(tasks): keep the diff controls when the view cannot read the diff
Oct 26, 2026
48ffef0
fix(tasks): answer a failed task read in the tab without its error text
Oct 26, 2026
6b0ca82
fix(tasks): keep CRLF files, the typed text of an oversize save, and …
Oct 26, 2026
a084de8
fix(tasks): keep an open file editor when the diff view reloads
Oct 26, 2026
50fc2eb
test(tasks): pin that the transcript refresh keeps the active tab
Oct 26, 2026
cc78041
fix(tasks): wrap the file request error for the wrapcheck linter
Oct 26, 2026
68e7d0e
feat(tasks): merge a reviewed task from its detail
Oct 27, 2026
3062c6d
feat(tasks): serve the subagents panel of a task
Oct 27, 2026
59f9370
feat(tasks): open the subagents panel from the actions tab
Oct 27, 2026
c7c8b01
test(go): cover task actions finish merge discard reset and subagents
Oct 27, 2026
b63ea43
test(go): assert merge stops being offered once the task is merged
Oct 27, 2026
1866465
feat(tasks): port the printable diff report pure logic and screen state
Oct 27, 2026
8b905bc
feat(tasks): port the printable diff report view and its actions
Oct 27, 2026
bc8fdb8
test(go): open the diff report from a finished task
Oct 27, 2026
61fea5a
feat(tasks): open the task diff from the actions tab
Oct 27, 2026
9ebbd2e
fix(tasks): answer the close of the diff report with the task diff
Oct 27, 2026
b1577c7
fix(tasks): finish and surface the failure of the explained diff report
Oct 28, 2026
5f8daf1
fix(tasks): resolve 8 review advisories in diff report and handlers
Oct 28, 2026
814915e
feat(tasks): port task graph geometry and model state
Oct 28, 2026
885b5bc
feat(tasks): templ components for task graph and loose tasks panel
Oct 28, 2026
3ffbf0e
feat(tasks): graph handlers and endpoints for node positions and depe…
Oct 28, 2026
6737774
feat(tasks): graph client interaction script and browser e2e suite
Oct 28, 2026
b52ea32
docs(odd): complete T18 U7 and record closure of tasks presentation
Oct 28, 2026
b5af61d
docs(odd): record T19 full e2e suite execution and metrics
Oct 28, 2026
06f92b4
feat(code_hosting): wire PR/MR task tab via taskPanels and update e2e
Oct 28, 2026
cc1b3ea
feat(jira): port connection presentation and wire dock route (J1)
Oct 28, 2026
306f179
feat(jira): add presentation state, issue filtering, and formatting (J2)
Oct 28, 2026
3bafc91
feat(jira): add Templ components for lane section, form, filters, and…
Oct 28, 2026
b48e0b0
feat(jira): wire board handlers, lane routes, and add integration and…
Oct 28, 2026
6dacbc5
docs(odd): complete T10 J2 lanes and sync presentation
Oct 28, 2026
2e63c9a
feat(jira): add issue detail and conversion presentation state and DT…
Oct 28, 2026
aaec5dd
feat(jira): add Templ pages for issue detail and conversion (J3)
Oct 28, 2026
23bc602
feat(jira): wire issue handlers, dock routes, and integration tests (J3)
Oct 28, 2026
f614d07
docs(odd): complete T10 J3 issue detail and conversion presentation, …
Oct 28, 2026
a985b92
fix(core): resolve technical debt advisories for file_store, sse, pus…
Oct 28, 2026
f60e58a
feat(tasks): preserve task panes and initial prompt, add live badge, …
Oct 28, 2026
6502899
test(e2e): filter htmx navigation aborts and fix board open synchroni…
Oct 28, 2026
2778a5d
docs(odd): complete quality debt items D9, D11 and H4
Oct 28, 2026
aac8e0f
test(e2e): complete T19 full Go e2e suite alignment and close D1-D5 debt
Oct 28, 2026
d9bad9c
chore: complete T20 migration to Go, remove Rust codebase and promote…
Oct 28, 2026
a85ce2b
ajustes
Oct 28, 2026
e982ee4
feat(tasks): restore interactive dynamic graph board and task workflows
Oct 29, 2026
eca984f
fix
Oct 29, 2026
9625d43
fix
Oct 29, 2026
6d544fb
fix
Oct 29, 2026
c92474b
fix
Oct 29, 2026
cea896b
fix
Oct 29, 2026
3b5ed5c
fix
Oct 29, 2026
1eb45af
fix
Oct 29, 2026
baa244a
pi: Ya no es responsive
Oct 29, 2026
ae2ad7d
fix
Oct 29, 2026
f8df98a
Merge branch 'feat/golang' into pi/ya-no-es-responsive-9e9525cc-d884-…
Oct 29, 2026
3ad5c9d
Merge tarea pi: Ya no es responsive
Oct 29, 2026
6a24cb3
Mejoras terminal
Oct 29, 2026
a0c2eeb
Merge tarea pi: Terminal
Oct 29, 2026
19568b6
mejoras, electron y jira
Oct 29, 2026
5a76718
feat(sidebar): add scroll to navigation menu and direct compact sessi…
Oct 29, 2026
4549186
fix(tasks): prevent loose task drop on hidden canvas and unwanted dra…
Oct 29, 2026
80f4fe0
feat(tasks): allow configuring task-specific agent, model, effort, an…
Oct 29, 2026
d74175a
Merge tarea pi: Permitir usar agente diferente
Oct 29, 2026
b5f4075
Merge tarea pi: Arrastrando las tarjetas de tareas
Oct 29, 2026
19464b5
fix(tasks): scroll transcript to bottom by default on window entry
Oct 29, 2026
3672df9
fix(ui): eliminate screen flicker on refreshes using idiomorph DOM mo…
Oct 29, 2026
a28415b
Merge tarea pi: Las pantallas parpadean
Oct 29, 2026
bb9839e
feat(tasks): support @ file references in task creation and editing f…
Oct 29, 2026
63f16a2
pi: Meter comandos @ como chat
Oct 29, 2026
fb17753
Merge tarea pi: Meter comandos @ como chat
Oct 29, 2026
2424b5f
fix(ui): restore workspace switcher and support IWORKFLOW_ADDR
Oct 29, 2026
ffc5dbf
makefile
Oct 30, 2026
4b35a1f
refactor(ui): remove generic board navigation and workspace select fr…
Oct 30, 2026
4af6ce3
fix(ui): ensure idiomorph innerHTML swaps return an array for HTMX el…
Oct 30, 2026
d2c6af9
chore: empty commit to open the PR/MR
Oct 30, 2026
839d41e
feat(tasks): persist related projects of a task
Oct 30, 2026
fdd7f38
feat(tasks): label related projects in @ references
Oct 30, 2026
4902e74
fix(tasks): keep transcript details open across refreshes
Oct 30, 2026
f857566
Merge tarea pi: Refrescos pantalla
Oct 30, 2026
ce38e3a
feat(tasks): give agents access to related projects
Oct 30, 2026
eacf59e
feat(tasks): related projects list in create and edit task
Oct 30, 2026
2c8b68d
feat(tasks): complete @ files of related projects
Oct 30, 2026
5666c38
docs: document related projects for tasks
Oct 30, 2026
27913e4
style(tasks): add thin light border to task card buttons
Oct 30, 2026
4f3dac2
Merge tarea pi: Estilo botones tarjeta tareas
Oct 30, 2026
13edf51
test(e2e): related projects in create and edit task
Oct 30, 2026
f6859b6
ci(release): build the Go server instead of the Rust one
Oct 30, 2026
1433e9f
Merge tarea pi: Github actions
Oct 30, 2026
aa45336
fix(tasks): deny edits in related project folders for claude
Oct 30, 2026
cb3168a
fix(tasks): make related projects atomic, bounded and well labelled
Oct 30, 2026
1a0b4bd
feat(tasks): open the subagents panel as a mobile-friendly dialog
Oct 30, 2026
0188f4a
Merge tarea pi: Poder referenciar proyectos desde otros proyectos
Oct 30, 2026
ce77777
Merge tarea pi: Ventana de subagentes de tareas en ejecución
Oct 30, 2026
0cf65c1
Fic
Oct 30, 2026
6c13695
Merge tarea pi: Error arrastrando pantalla grafo
Oct 30, 2026
0448ef6
Merge master into feat/golang
Oct 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
83 changes: 60 additions & 23 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,12 @@ permissions:
contents: read

env:
CARGO_TERM_COLOR: always
# Pinned to the versions that produced the committed generated code (go.mod / sqlc headers).
TEMPL_VERSION: v0.3.1070
SQLC_VERSION: v1.31.1
TAILWIND_VERSION: v4.3.3
# The server is pure Go (modernc sqlite): no C toolchain, so binaries are static on every OS.
CGO_ENABLED: "0"

jobs:
build:
Expand All @@ -26,7 +31,9 @@ jobs:
matrix:
include:
- name: linux-x86_64
os: ubuntu-22.04 # oldest hosted runner: keeps the glibc requirement low
os: ubuntu-22.04 # oldest hosted runner: keeps the AppImage (Electron) glibc requirement low
tailwind: tailwindcss-linux-x64
tailwind_sha256: dc61b3ac6b8c9ca874c0cc4c57b2409791a64c5540404ca5f5367360babc313a
bin: iworkflow
archive: tar.gz
installer: AppImage
Expand All @@ -37,43 +44,76 @@ jobs:
archive: zip
installer: exe
update_meta: server-dist/electron/latest.yml
# Statically link the MSVC runtime so no VC++ redistributable is needed.
# Scoped to the host target so the wasm build is unaffected.
rustflags: "-C target-feature=+crt-static"
tailwind: tailwindcss-windows-x64.exe
tailwind_sha256: e0e260ce048014e9268f6237ff18f8ccf02cef521cbd0ae04e82c2cdf7aa3955
- name: macos-arm64
os: macos-latest
tailwind: tailwindcss-macos-arm64
tailwind_sha256: cdf646702987a743464dff4d9c60fd4480d1c1e73dd819a9a67f1078815dce9d
bin: iworkflow
archive: tar.gz
installer: dmg
- name: macos-x86_64
os: macos-15-intel
tailwind: tailwindcss-macos-x64
tailwind_sha256: 7922e0953f2110c05976e3bf58f14e643d90427575e766b7d433f5f80cbee7e1
bin: iworkflow
archive: tar.gz
installer: dmg
env:
CARGO_TARGET_X86_64_PC_WINDOWS_MSVC_RUSTFLAGS: ${{ matrix.rustflags }}
defaults:
run:
shell: bash
steps:
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4

- uses: dtolnay/rust-toolchain@b725eda525362e7cf34af9a7243cac1e3f01a7ec # stable
- uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
with:
targets: wasm32-unknown-unknown
go-version-file: go.mod
cache-dependency-path: go.sum

- uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2
with:
key: ${{ matrix.name }}
- name: Install code generators
run: |
set -euo pipefail
go install "github.com/a-h/templ/cmd/templ@${TEMPL_VERSION}"
go install "github.com/sqlc-dev/sqlc/cmd/sqlc@${SQLC_VERSION}"
# Tailwind standalone CLI (no Node needed for the CSS build), exposed as `tailwindcss`.
# The expected SHA-256 is pinned per asset in the matrix; bump both with TAILWIND_VERSION.
BIN_DIR="$HOME/.local/bin"
GO_BIN_DIR="$(go env GOPATH)/bin"
mkdir -p "$BIN_DIR"
EXT=""
if [ "${{ runner.os }}" = "Windows" ]; then EXT=".exe"; fi
curl -fsSL -o "$BIN_DIR/tailwindcss$EXT" \
"https://github.com/tailwindlabs/tailwindcss/releases/download/${TAILWIND_VERSION}/${{ matrix.tailwind }}"
if command -v sha256sum >/dev/null; then
ACTUAL="$(sha256sum "$BIN_DIR/tailwindcss$EXT" | cut -d' ' -f1)"
else
ACTUAL="$(shasum -a 256 "$BIN_DIR/tailwindcss$EXT" | cut -d' ' -f1)"
fi
if [ "$ACTUAL" != "${{ matrix.tailwind_sha256 }}" ]; then
echo "Tailwind checksum mismatch for ${{ matrix.tailwind }}: got $ACTUAL" >&2
exit 1
fi
chmod +x "$BIN_DIR/tailwindcss$EXT"
# $GITHUB_PATH takes native paths: Git Bash POSIX paths (/c/Users/...) would not resolve on Windows.
if [ "${{ runner.os }}" = "Windows" ]; then
BIN_DIR="$(cygpath -w "$BIN_DIR")"
GO_BIN_DIR="$(cygpath -w "$GO_BIN_DIR")"
fi
echo "$BIN_DIR" >> "$GITHUB_PATH"
echo "$GO_BIN_DIR" >> "$GITHUB_PATH"

- name: Install cargo-leptos
uses: taiki-e/install-action@8cca0918f8471c33515202b73f56ab27f2bed283 # v2
with:
tool: cargo-leptos
# scripts/prod.sh drives `make generate`; the Windows runner may not ship GNU make.
- name: Ensure make
run: command -v make >/dev/null || choco install make -y --no-progress

# Same steps as `scripts/prod.sh build`.
# Same steps as `scripts/prod.sh build`: templ + sqlc + tailwind, then go build into $DIST_DIR/site.
- name: Build (release)
run: cargo leptos build --release
run: DIST_DIR="$PWD/server-dist" ./scripts/prod.sh build

# The packaged server must at least start and exit 0; --help does not bind a port or touch the DB.
- name: Smoke test binary
run: ./server-dist/${{ matrix.bin }} --help

- name: Package
id: package
Expand All @@ -84,8 +124,8 @@ jobs:
set -euo pipefail
NAME="iworkflow-${REF_LABEL}-${{ matrix.name }}"
mkdir -p "dist/$NAME"
cp "target/release/${{ matrix.bin }}" "dist/$NAME/"
cp -r target/site "dist/$NAME/site"
cp "server-dist/${{ matrix.bin }}" "dist/$NAME/"
cp -r server-dist/site "dist/$NAME/site"
cd dist
if [ "${{ matrix.archive }}" = "zip" ]; then
7z a -tzip "$NAME.zip" "$NAME" > /dev/null
Expand Down Expand Up @@ -116,9 +156,6 @@ jobs:
id: installer
run: |
set -euo pipefail
mkdir -p server-dist
cp "target/release/${{ matrix.bin }}" server-dist/
cp -r target/site server-dist/site
DIST_DIR="$PWD/server-dist" SKIP_SERVER_BUILD=1 ./scripts/electron.sh build
echo "glob=server-dist/electron/iworkflow-*.${{ matrix.installer }}*" >> "$GITHUB_OUTPUT"

Expand Down
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,8 @@ end2end/test-results

# Internal ODD working notes (kept locally, not published)
/odd/

# Go
/bin
/web/static/app.css
/iworkflow
47 changes: 47 additions & 0 deletions .golangci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
version: "2"
run:
go: "1.27"
linters:
default: standard
enable:
- depguard
- errorlint
- wrapcheck
- bodyclose
- contextcheck
- noctx
settings:
depguard:
rules:
domain:
files: ["**/internal/modules/*/domain/**"]
deny:
- {pkg: database/sql, desc: domain must stay free of infrastructure}
- {pkg: net/http, desc: domain must stay free of infrastructure}
- {pkg: github.com/go-chi/chi, desc: domain must stay free of infrastructure}
- {pkg: github.com/a-h/templ, desc: domain must stay free of presentation}
- {pkg: /infrastructure, desc: domain must not import infrastructure}
- {pkg: /presentation, desc: domain must not import presentation}
- {pkg: /application, desc: domain must not import application}
application:
files: ["**/internal/modules/*/application/**"]
deny:
- {pkg: database/sql, desc: use cases depend on ports, not on SQL}
- {pkg: net/http, desc: use cases depend on ports, not on HTTP}
- {pkg: github.com/go-chi/chi, desc: use cases depend on ports, not on chi}
- {pkg: github.com/a-h/templ, desc: use cases know nothing of presentation}
- {pkg: /infrastructure, desc: use cases must not import infrastructure}
- {pkg: /presentation, desc: use cases must not import presentation}
core:
files: ["**/internal/core/**"]
deny:
- {pkg: iworkflow/internal/modules, desc: core must not import modules}
wrapcheck:
ignore-sig-regexps:
- \.Render\(
exclusions:
rules:
- path: _test\.go
linters: [wrapcheck, noctx]
- path: _templ\.go
linters: [wrapcheck, errorlint, depguard]
Loading
Loading