Skip to content
Merged

Loom #48

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
a5922bb
feat: add workflow module with declarative builder and task management
kattsushi Mar 29, 2026
76edfe6
feat(nx): add skills for managing Nx plugins, running tasks, and work…
kattsushi Mar 29, 2026
df01eb2
feat(hatchet): add events client demo slice
kattsushi Apr 10, 2026
c79d209
chore(hatchet): upgrade sdk to 1.21.0
kattsushi Apr 10, 2026
877aed2
test(react-router-example): add browser harness
kattsushi Apr 10, 2026
5865298
feat(hatchet): add schedules client demo slice
kattsushi Apr 10, 2026
c80598c
feat(hatchet): add crons client demo slice
kattsushi Apr 11, 2026
ec7bc6b
feat(hatchet): add observability demo slice
kattsushi Apr 11, 2026
bbfd06f
feat(hatchet): add webhooks client demo slice
kattsushi Apr 12, 2026
52244ae
test(tooling): enable vitest coverage reporting
kattsushi Apr 12, 2026
8c1680a
refactor(hatchet): align errors and ratelimit duration
kattsushi Apr 12, 2026
da95b33
feat(hatchet): add filters client demo slice
kattsushi Apr 13, 2026
1605538
feat(hatchet): add workflow management demo slice
kattsushi Apr 13, 2026
de64135
test(hatchet): harden infrastructure coverage
kattsushi Apr 13, 2026
528c67c
ci: trigger pr checks for hatchet branch
kattsushi Apr 13, 2026
c38fbf9
chore: remove outdated documentation and skills related to nx plugins…
kattsushi Apr 13, 2026
93e9ed3
fix(ci): restore workspace package resolution
kattsushi Apr 13, 2026
af3a53e
fix(ci): remove prisma prepare build hook
kattsushi Apr 13, 2026
6d5770a
test(example): isolate hatchet demo render runtime
kattsushi Apr 13, 2026
0feadbd
refactor(example): split hatchet demo routes
kattsushi Apr 13, 2026
34966e1
refactor(hatchet): reduce shadow client types
kattsushi Apr 14, 2026
0ad6048
refactor(example): clean up runtime layer composition
kattsushi Apr 14, 2026
fa9028e
test(example): reorganize react-router test layout
kattsushi Apr 14, 2026
f173ce9
test(example): add cypress e2e harness and stabilize app shell
kattsushi Apr 15, 2026
e10d796
test(example): stabilize build and cypress contracts
kattsushi Apr 16, 2026
3c429b5
fix(example): align local auth and sqlite setup
kattsushi Apr 17, 2026
0e24fdc
fix(example): stabilize local hatchet demo workflow
kattsushi Apr 24, 2026
daf6feb
chore: update lockfile
kattsushi Apr 24, 2026
0e1d56f
feat(loom): add initial web runtime foundation
kattsushi Apr 18, 2026
db0e832
feat(loom): add live runtime hydration support
kattsushi Apr 18, 2026
1fc9012
feat(loom): add web integration adapters
kattsushi Apr 19, 2026
7d69bf5
feat(loom): add resumability contract support
kattsushi Apr 19, 2026
19c53cc
feat(loom): add router runtime foundation
kattsushi Apr 19, 2026
59ad940
feat(loom): add runtime diagnostics model
kattsushi Apr 19, 2026
5302d09
feat(loom): add router navigation layer
kattsushi Apr 19, 2026
c7381ff
feat(loom): add typed router href generation
kattsushi Apr 19, 2026
3b06621
feat(loom): add example app
kattsushi Apr 20, 2026
c3d545f
feat(loom): add vnext component authoring surface
kattsushi Apr 20, 2026
c0d2c37
chore(loom): remove generated coverage artifacts
kattsushi Apr 20, 2026
da519ab
feat(loom): promote vnext API surface
kattsushi Apr 20, 2026
c5dfdff
feat(loom): add fine-grained vnext rendering
kattsushi Apr 20, 2026
f71c64a
feat(loom): polish vnext example app runtime
kattsushi Apr 20, 2026
7df8589
feat(loom): improve composition ergonomics
kattsushi Apr 21, 2026
d97c01b
feat(loom): add fine-grained attribute updates
kattsushi Apr 21, 2026
82bcafb
feat(loom): refine state and text semantics
kattsushi Apr 21, 2026
03646b2
feat(loom): add control flow primitives
kattsushi Apr 21, 2026
6dad32d
feat(loom): add input primitives
kattsushi Apr 21, 2026
55dae74
feat(loom): add router loaders and actions
kattsushi Apr 22, 2026
55d6bc3
feat(loom): reset authoring DX surface
kattsushi Apr 22, 2026
8a25c04
sync engram memories
kattsushi Apr 22, 2026
4ba0891
fix(ci): fixed build pnpm
kattsushi Apr 26, 2026
7ae11da
fix(hatchet): remove duplicated rebase conflict blocks
kattsushi Apr 26, 2026
f9d12ab
fix(ci): pin effect platform node shared
kattsushi Apr 26, 2026
d5da572
fix(loom): widen typecheck root dir
kattsushi Apr 26, 2026
55af298
fix(ci): exclude remix example from nx vite plugin
kattsushi Apr 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added .engram/chunks/5f70b832.jsonl.gz
Binary file not shown.
8 changes: 8 additions & 0 deletions .engram/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,14 @@
"sessions": 0,
"memories": 5,
"prompts": 1
},
{
"id": "5f70b832",
"created_by": "andres",
"created_at": "2026-04-22T19:29:00Z",
"sessions": 194,
"memories": 618,
"prompts": 264
}
]
}
11 changes: 11 additions & 0 deletions apps/loom-example-app/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Loom Example App</title>
</head>
<body>
<div id="loom-root"></div>
</body>
</html>
20 changes: 20 additions & 0 deletions apps/loom-example-app/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
"name": "@effectify/loom-example-app",
"private": true,
"type": "module",
"dependencies": {
"@effectify/loom": "workspace:*",
"@effectify/loom-nitro": "workspace:*",
"@effectify/loom-router": "workspace:*",
"@effectify/loom-vite": "workspace:*",
"@picocss/pico": "catalog:",
"effect": "catalog:"
},
"devDependencies": {
"@nx/vite": "catalog:",
"jsdom": "catalog:",
"typescript": "catalog:",
"vite": "catalog:",
"vitest": "catalog:"
}
}
30 changes: 30 additions & 0 deletions apps/loom-example-app/project.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
{
"name": "@effectify/loom-example-app",
"$schema": "../../node_modules/nx/schemas/project-schema.json",
"sourceRoot": "apps/loom-example-app/src",
"projectType": "application",
"tags": ["loom", "example", "app"],
"targets": {
"lint": {
"executor": "nx-oxlint:lint",
"outputs": ["{options.outputFile}"],
"options": {
"lintFilePatterns": ["apps/loom-example-app/**/*.{ts,tsx,js,jsx,mts,cts}"]
}
},
"test": {
"executor": "nx:run-commands",
"options": {
"command": "../../node_modules/.bin/vitest run --config vite.config.mts",
"cwd": "apps/loom-example-app"
}
},
"typecheck": {
"executor": "nx:run-commands",
"options": {
"command": "../../node_modules/.bin/tsc --noEmit -p tsconfig.app.json && ../../node_modules/.bin/tsc --noEmit -p tsconfig.spec.json",
"cwd": "apps/loom-example-app"
}
}
}
}
4 changes: 4 additions & 0 deletions apps/loom-example-app/src/app-config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
export const appRootId = "loom-root"
export const appBuildId = "loom-example-app"
export const appPayloadElementId = "__loom_payload__"
export const counterInitialCount = 2
302 changes: 302 additions & 0 deletions apps/loom-example-app/src/app.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,302 @@
@import "@picocss/pico/css/pico.min.css";

:root {
--loom-example-surface: rgba(255, 255, 255, 0.82);
--loom-example-shadow: 0 18px 40px rgba(15, 23, 42, 0.12);
}

body {
min-height: 100vh;
background:
radial-gradient(circle at top, rgba(16, 185, 129, 0.12), transparent 30%),
linear-gradient(180deg, #f8fafc 0%, #eef2ff 100%);
}

[data-app-shell="loom-example-app"] {
padding-block: clamp(2rem, 4vw, 4rem);
}

.loom-example-layout {
display: grid;
gap: 1.5rem;
}

.loom-example-hero {
display: grid;
gap: 0.75rem;
}

.loom-example-eyebrow {
margin: 0;
color: var(--pico-primary);
font-size: 0.85rem;
font-weight: 700;
letter-spacing: 0.08em;
text-transform: uppercase;
}

.counter-title,
.todo-title,
.loom-example-not-found-title {
margin: 0;
}

.counter-copy,
.todo-copy,
.loom-example-copy,
.counter-debug-note,
.dev-mode-note,
.compat-seam-note {
margin: 0;
color: var(--pico-muted-color);
}

.loom-example-card,
.loom-example-note-stack {
display: grid;
gap: 1rem;
padding: clamp(1.25rem, 3vw, 2rem);
border: 1px solid rgba(15, 23, 42, 0.08);
border-radius: 1.25rem;
background: var(--loom-example-surface);
box-shadow: var(--loom-example-shadow);
backdrop-filter: blur(10px);
}

.counter-value-card {
display: inline-grid;
gap: 0.35rem;
}

.counter-cue-row {
display: inline-flex;
align-items: center;
gap: 0.75rem;
flex-wrap: wrap;
}

.counter-cue-label {
color: var(--pico-muted-color);
font-size: 0.9rem;
font-weight: 500;
}

.counter-value-label {
font-size: 0.85rem;
font-weight: 600;
letter-spacing: 0.04em;
text-transform: uppercase;
color: var(--pico-muted-color);
}

.counter-value {
display: inline-flex;
align-items: center;
gap: 0.5rem;
font-size: 2rem;
font-weight: 700;
}

.counter-value-prefix {
color: var(--pico-muted-color);
font-size: 1rem;
font-weight: 500;
}

.counter-dynamic-value {
display: inline-flex;
min-width: 2.5ch;
justify-content: center;
padding: 0.2rem 0.55rem;
border-radius: 999px;
background-color: rgba(15, 23, 42, 0.05);
}

.counter-reactive-cue {
display: inline-flex;
align-items: center;
min-height: 2rem;
padding: 0.3rem 0.7rem;
border-radius: 999px;
color: #0f172a;
font-size: 0.85rem;
font-weight: 600;
letter-spacing: 0.01em;
transition: background-color 120ms ease, box-shadow 120ms ease, transform 120ms ease;
}

.counter-reactive-cue--baseline {
color: #1d4ed8;
}

.counter-reactive-cue--rising {
color: #047857;
}

.counter-reactive-cue--falling {
color: #c2410c;
}

.counter-actions {
display: flex;
flex-wrap: wrap;
gap: 0.75rem;
margin: 0;
}

.counter-actions > button {
margin: 0;
}

.todo-top-row {
display: grid;
gap: 1rem;
}

@media (min-width: 900px) {
.todo-top-row {
grid-template-columns: minmax(0, 1fr) minmax(0, 1.2fr);
align-items: start;
}
}

.todo-kpi-row,
.todo-stat-grid,
.todo-composer-row,
.todo-composer-meta,
.todo-list-header {
display: flex;
flex-wrap: wrap;
gap: 0.9rem;
align-items: center;
}

.todo-kpi,
.todo-stat {
display: grid;
gap: 0.2rem;
min-width: 9rem;
padding: 0.9rem 1rem;
border-radius: 1rem;
background: rgba(15, 23, 42, 0.04);
}

.todo-kpi-label,
.todo-stat-label,
.todo-section-title,
.todo-item-status,
.todo-session-count {
margin: 0;
}

.todo-kpi-label,
.todo-stat-label,
.todo-item-status {
color: var(--pico-muted-color);
font-size: 0.85rem;
}

.todo-kpi-value,
.todo-stat-value,
.todo-title,
.todo-section-title,
.todo-item-title {
margin: 0;
}

.todo-kpi-value,
.todo-stat-value {
font-size: 1.5rem;
font-weight: 700;
}

.todo-panel {
gap: 1rem;
}

.todo-section-title {
font-size: 1.25rem;
}

.todo-input {
flex: 1 1 18rem;
min-width: 15rem;
margin: 0;
}

.todo-composer-row > button,
.todo-list-header > button,
.todo-item > button,
.todo-link {
margin: 0;
}

.todo-composer-meta {
justify-content: space-between;
}

.todo-session-count {
display: inline-flex;
align-items: center;
padding: 0.25rem 0.65rem;
border-radius: 999px;
background: rgba(37, 99, 235, 0.1);
color: #1d4ed8;
font-size: 0.85rem;
font-weight: 600;
}

.todo-item-list {
display: grid;
gap: 0.85rem;
margin: 0;
padding: 0;
list-style: none;
}

.todo-item {
display: grid;
grid-template-columns: auto minmax(0, 1fr) auto;
gap: 0.85rem;
align-items: center;
padding: 0.95rem 1rem;
border: 1px solid rgba(15, 23, 42, 0.08);
border-radius: 1rem;
background: rgba(255, 255, 255, 0.72);
}

.todo-item--completed {
background: rgba(16, 185, 129, 0.08);
}

.todo-item-copy {
display: grid;
gap: 0.25rem;
}

.todo-item-title {
font-size: 1rem;
font-weight: 600;
}

.todo-item-title--completed {
text-decoration: line-through;
color: var(--pico-muted-color);
}

.todo-empty-state {
margin: 0;
padding: 1rem;
border-radius: 1rem;
background: rgba(15, 23, 42, 0.04);
color: var(--pico-muted-color);
}

.loom-example-note-stack {
gap: 0.85rem;
}

.loom-example-not-found {
display: grid;
gap: 1rem;
}
Loading
Loading