Remove the in_namespace edge relation. A node now belongs to a namespace if that
namespace has has_ownership on it. This simplifies the model: namespace membership
is determined by the ownership chain rather than a separate relation type.
Changes:
- Remove RelInNamespace constant
- Add Namespace fields to AddInput, UpdateInput, and ListFilter
- Update Add() to resolve namespace from input and assign it as owner
- Update List() to filter by namespace ownership instead of in_namespace edges
- Update() can now transfer nodes between namespaces via ownership transfer
- Remove in_namespace self-references from ensureNamespace/ensureGlobalNamespace
The ownership chain now fully describes both permissions and namespace membership,
reducing redundancy. All tests pass with the new model.
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
When a node is created in a namespace, the namespace now owns it rather than the creator. This allows namespaces to manage content ownership. Namespace nodes themselves remain owned by their creator. Users retain transitive ownership through their default namespace: user→has_ownership→namespace→has_ownership→node.
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Create a special _global namespace that every new user automatically
gets can_create_rel access to (inclusive of can_read). This provides
a shared space where all users can see and interact with published nodes.
- ensureGlobalNamespace creates _global on first use with self-ownership
- ensureUser grants can_create_rel to each new user on the global namespace
- User visibility still relies on existing post-BFS global readability
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
- --due: show only nodes with a due date set
- --due-within N: show only nodes due within N days (includes overdue)
Implemented in service layer with post-fetch filtering, threaded through
API client and server, and exposed via CLI flags.
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Sort nodes by: status → priority → due date (soonest first).
Nodes without due dates sort last.
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
- List view: show relative due date (+12d, -3d, today) after namespace
- Show view: colorize full due date based on urgency
- Color scheme: red (overdue), yellow (due within 3 days), green (4+ days)
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Add QEMU setup and platforms configuration to build Docker images
for both linux/amd64 and linux/arm64 architectures.
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Go binaries are statically linked and don't need dependency scanning.
Also works around newer apk CLI breaking --who-owns flag.
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Go binaries are already stripped via ldflags, and disable the check
warning since there's no test suite.
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Move checkout before setup-go in Arch workflow so src/go.mod exists,
and remove unsupported --platform container option from Alpine workflow.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The Gitea runner is ARM64 and archlinux:latest has no ARM64 image.
Drop the container entirely and build .pkg.tar.zst manually:
cross-compile with Go and assemble the package archive directly,
so no makepkg or Arch Linux toolchain is needed.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Uses a matrix strategy with Go cross-compilation (GOARCH + CARCH)
so both architectures build in the same amd64 container.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Uses a matrix strategy with Go cross-compilation (GOARCH + CARCH)
so both architectures build in the same amd64 container.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The condition was backwards — it exited with "database already exists"
when the file was found, and tried to open it when it did not exist.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace InitNodeService/GetNodeService/GetNodeServiceForUser with thin
NewLocalNodeService/NewRemoteNodeService constructors; move wiring logic
into cmd/root.go (getNodeService helper) and an inline closure in serve.go.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>