xiaoju
5cedc6a33d
release: v0.2.0 — core, daemon, cli
2026-04-23 10:58:49 +00:00
xiaomo
5be14d0d8b
docs: add comprehensive README for root and all packages
2026-04-23 10:53:45 +00:00
xiaoju
1b5a52ea4d
build: migrate from tsup to rslib
...
Replace tsup (esbuild-based) with rslib (rspack-based) across all packages.
tsup's built-in nodeProtocolPlugin strips the 'node:' prefix from all
Node.js builtins. Unlike node:fs etc., node:sqlite has no unprefixed
form, causing ERR_MODULE_NOT_FOUND at runtime. rslib handles node:
imports correctly without any workarounds.
Changes:
- Replace tsup.config.ts with rslib.config.ts in core, daemon, cli
- Swap tsup → @rslib/core in devDependencies
- Fix log-store.ts params type (Record<string, unknown> → Record<string, string | number>)
- Fix logStream.fd type cast in start.ts
- Exclude __tests__ from CLI tsconfig to avoid DTS errors
- All 356 tests pass, nerve init works correctly
Closes #70
小橘 🍊 (NEKO Team)
2026-04-23 09:48:45 +00:00
xiaoju
7f780f0642
chore: walkthrough cleanup — engines, types, mock fixes
...
- Add engines >= 22.5.0 to root and cli package.json (node:sqlite requirement)
- Remove unused @types/better-sqlite3 from cli devDeps (leftover from sql.js migration)
- Add files/publishConfig to core package.json (parity with other packages)
- Fix daemon test type errors: add getAllWorkflowRuns to mock LogStore,
fix array destructuring on mock.calls, fix sense-runtime callback signatures
All 356 tests pass across all packages.
小橘 🍊 (NEKO Team)
2026-04-23 09:08:24 +00:00
xiaoju
119b1f3722
chore: enforce pnpm publish for all packages unconditionally
...
小橘 <xiaoju@shazhou.work >
2026-04-23 00:49:39 +00:00
xiaoju
a62a993a82
fix(cli): remove duplicate shebang in daemon-bootstrap causing crash on nerve start -d
...
小橘 <xiaoju@shazhou.work >
2026-04-23 00:43:18 +00:00
xiaoju
3f22eb4664
release: @uncaged/nerve-core@0.1.3, @uncaged/nerve-daemon@0.1.4, @uncaged/nerve-cli@0.1.5
...
小橘 <xiaoju@shazhou.work >
2026-04-23 00:35:40 +00:00
xiaoju
8763440436
fix: address review issues #46-#49
...
#46 — EPIPE handler: only silence EPIPE, log other child errors
#47 — lastSignalTs: query sense/signal instead of reflex/run_complete
#48 — SenseInfo: deduplicate to @uncaged/nerve-core, add expectTypeOf test
#49 — IPC client: extract sendAndReceive<T> to eliminate duplication
小橘 <xiaoju@shazhou.work >
2026-04-23 00:22:55 +00:00
xiaoju
2be11ac81a
chore: release core@0.1.2 daemon@0.1.2 cli@0.1.3
...
小橘 <xiaoju@shazhou.work >
2026-04-22 23:12:29 +00:00
xiaoju
01f54d14c5
chore: bump to 0.1.1 for npm publish fix
...
小橘 <xiaoju@shazhou.work >
2026-04-22 15:37:30 +00:00
xiaoju
1b2ff37097
chore: publish @uncaged/nerve-core@0.0.1 to npm — closes #28
...
Removed 'private: true' to allow npm publish. Package is now available
at https://www.npmjs.com/package/@uncaged/nerve-core
小橘 <xiaoju@shazhou.work >
2026-04-22 14:37:07 +00:00
xiaoju
a68338c4e9
feat: implement Workflow Engine Phase 1 ( #16 )
...
- Core types: WorkflowDefinition, ThreadState, CommandEvent, ModerateResult, etc.
- IPC: StartThreadMessage, ResumeThreadMessage, ThreadEventMessage, WorkflowErrorMessage
- WorkflowManager: concurrency control (drop/queue overflow), worker lifecycle
- Workflow worker: moderate→execute loop, user code loading
- LogStore: workflow_runs materialized table, appendWithWorkflowUpdate
- 131 tests passing
RFC-002 Phase 1 complete.
小橘 <xiaoju@shazhou.work >
2026-04-22 11:49:50 +00:00
xiaoju
ad2b40dd4f
feat: implement Phase 5 CLI & User Workspace
...
- Restructure CLI with citty multi-command framework
- nerve init: create workspace skeleton at ~/.uncaged-nerve/
- nerve start: foreground + daemon (-d) modes with graceful shutdown
- nerve stop: SIGTERM → 10s wait → SIGKILL, PID file cleanup
- nerve status: show pid, uptime, senses, workers
- nerve validate: parse nerve.yaml with error reporting
- workspace.ts: shared utilities (PID file, paths, isRunning)
- Example cpu-usage sense with realistic os.cpus() compute
小橘 🍊 (NEKO Team)
2026-04-22 10:16:41 +00:00
xiaoju
9443406703
fix(daemon): address all 12 PR #10 review items
...
🔴 Critical:
1. parseWorkerMessage() in ipc.ts — validates worker→parent IPC messages
2. signalIdCounter moved inside createKernel closure
3. throttle deferred trigger — pending trigger fires after window ends
⚠️ Warnings:
4. worker respawn on crash with backoff
5. stop() awaits worker exit with SIGKILL fallback
6. signal-bus handler errors caught, no re-throw
7. removed unnecessary as SenseReflexConfig cast
8. config validates sense reflex has at least one trigger
💡 Suggestions:
9. signal ID documented as process-scoped (solved by #2 )
10. +3 throttle-pending tests
11. +6 kernel unit tests (mock fork, message routing)
12. example imports verified correct
54 tests (was 45), all green. biome check passes.
小橘 🍊 (NEKO Team)
2026-04-22 09:34:13 +00:00
xiaoju
a38986acdb
feat(daemon): sense runtime — worker, IPC, migrations, peer isolation
...
Implements the Sense observation engine runtime per RFC-001:
- IPC types: discriminated union for parent↔worker messages
- sense-runtime: openSenseDb (WAL), openPeerDb (readonly), runMigrations,
loadComputeFn, executeCompute with Result<T> error handling
- sense-worker: CLI bootstrap, reads nerve.yaml, inits per-sense DB,
builds peer map, enters IPC event loop
- examples/cpu-usage: sample sense with Drizzle schema + migration
- 15 unit tests covering migrations, DB ops, compute, peer isolation
小橘 🍊 (NEKO Team)
2026-04-22 08:45:19 +00:00
xiaoju
636b00c0a3
fix(core): address PR #8 review — gracePeriod, maxQueue default, drop+maxQueue guard, workflow name validation
...
- SenseConfig: add gracePeriod field (RFC §5.3 two-tier timeout)
- WorkflowConfig: discriminated union (DropOverflowConfig | QueueOverflowConfig)
- overflow: queue defaults maxQueue to 100
- overflow: drop + max_queue now returns validation error
- Cross-validate workflow reflex references against defined workflows
- Update tests: 21 cases covering all new behaviors
小橘 <xiaoju@shazhou.work >
2026-04-22 07:55:23 +00:00
xiaoju
8784a4edc4
refactor: duration fields → number|null (milliseconds)
...
- throttle, timeout, interval: string|null → number|null
- parseDurationField now returns parsed ms (5s→5000, 10m→600000, 1h→3600000)
- biome.json: ignore dist/** from checks
小橘 <xiaoju@shazhou.work >
2026-04-22 07:41:22 +00:00
xiaoju
1949007c99
refactor: ban optional properties, use T|null + discriminated unions
...
- Add coding convention: no '?:', use explicit 'T | null'
- ReflexConfig → discriminated union (SenseReflexConfig | WorkflowReflexConfig)
- All optional fields → explicit null (throttle, timeout, interval, on, maxQueue, workflows)
- Add exactOptionalPropertyTypes to tsconfig
- Add lib: ES2022 to tsconfig
- Refactor validateReflexConfig to reduce cognitive complexity
小橘 <xiaoju@shazhou.work >
2026-04-22 07:33:14 +00:00
xiaoju
3159d3713d
feat(core): add autoincrement id to Signal type
...
Timestamp alone can't guarantee strict total ordering (multiple signals
in the same millisecond). An autoincrement id provides a reliable
sequence for ordering and cursor-based pagination.
小橘 <xiaoju@shazhou.work >
2026-04-22 07:22:10 +00:00
xiaoju
3eba156b6b
feat(core): Phase 1 — core types & config parsing
...
- Define Signal, SenseConfig, ReflexConfig, WorkflowConfig, NerveConfig types
- Implement Result<T,E> with ok()/err() helpers
- Implement parseNerveConfig() with full YAML validation
- 14 unit tests covering normal and error paths
- pnpm run check passes with 0 errors
Closes #2
小橘 <xiaoju@shazhou.work >
2026-04-22 07:16:49 +00:00
xiaoju
d643ccf5af
fix: rename packages to @uncaged/nerve-{core,cli,daemon}
2026-04-22 06:29:08 +00:00
xiaoju
a7126c453f
chore: monorepo scaffolding — pnpm workspaces, biome, tsup, coding conventions
...
- packages/core, packages/cli, packages/daemon
- biome: noDefaultExport, useNodejsImportProtocol, noStaticOnlyClass
- docs/coding-conventions.md: 函数式优先,type over interface
2026-04-22 06:05:21 +00:00