All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
-
codebase:
validate-server-loc— generic per-directory LOC ceiling validator. Configurable viadirectory(required),maxLines,excludeSuffix,extension. Replacesscripts/noskills-server-loc-check.ts; now wired into precommit onpkg/ajan/noskillsserverfx. -
codebase:
validate-error-coverage— generic error-struct field-coverage validator. Configurable viafile(required),errorObjects,requiredFields. Replacesscripts/noskills-error-coverage.ts; now wired into precommit onpkg/ajan/noskillsserverfx/errors.go. -
kit:
kit clonewhole-repo mode — repos withoutrecipe.json(or with an empty one) now copy the entire tree via tarball fetch instead of failing. -
kit:
--interactive/-iflag and TTY auto-detect — prompts for missing variables when stdin is a terminal, with regex retry onpattern. -
kit:
--no-post-installflag — skips post-install commands. -
kit: GitHub subpath specifier
gh:owner/repo/sub/path[#ref]. -
kit: stub providers for
npm:andjsr:— parse accepted,fetchthrows "not yet implemented" with a tracking URL. -
kit: "Variables applied:" pretty-print to stderr before writing files.
-
kit: positional target dir —
eser kit clone <specifier> [target-dir]. -
kit: binary file detection in whole-repo mode (33-extension blocklist) to avoid mangling PNGs, ZIPs, fonts, etc.
-
kit:
{{.var}}substitution now applies to file and directory names in addition to file contents.
-
kit:
Recipeschema fieldsname,description,language,scale,filesare now optional in standalonerecipe.json(lenient clone path). Registry entries still require them viaisRegistryRecipe. -
acp: the
eser-acpbinary is gone.pkg/ajan/acpfx/shimis Go code linked into the same binary as its callers, so reaching it through a subprocess meantaifxandnoskillsserverfxserialising JSON down a pipe to a struct they already had in memory — and paying for a second executable to be built, shipped, installed, put on PATH, probed for, and explained when absent.acpfx.InProcesslinks the two over an in-memory pipe instead; the protocol, handshake and capability negotiation are unchanged.acpfx.Spawnremains for agents that genuinely are other programs (gemini --acp,claude-agent-acp), selectable withNOSKILLS_ACP_COMMAND.Removed with it: the goreleaser build and brew install line,
ShimCommandandShimMissingHint, theshimIsAvailable()PATH probe and ACP provider gating inajan-bridge.ts, the shim half of both installers, and theeser-acpsteps in the Windows CI job.binPathon an ACP provider now names the vendor CLI (claude, kiro, opencode) rather than the shim.The rewritten tests also corrected a claim the old ones only appeared to prove: tool-call surfacing was asserted against the
opencodebackend, but passed only because the fake replaced the whole shim.mapOpenCodeEventclassifies text, done and error and has no tool-call path, so opencode cannot surface one. That test now runs againstclaude-code, which does. -
repo: the top-level
scripts/directory is gone; its four files moved intoetc/scripts/, which already held the repo's tooling. The twoinstall.shfiles that resulted are named for what they install:install.sh(theeserCLI) andinstall-noskills.sh(noskills-server, noskills, eser-acp), plusinstall-noskills.ps1for Windows. The public install URL changed —main/scripts/install.shis nowmain/etc/scripts/install-noskills.sh. That URL has never completed a successful install (see the GoReleaser P0), so no working setup breaks. -
codebase:
WalkSourceFilesnow enumerates untracked-but-not-ignored files viagit ls-files --others --exclude-standard. It previously listed only files already in the index, so every validator built on it — runtime-API portability, licence headers, filenames, secrets — silently skipped files that had been created but never committed. New code is the code most likely to be wrong, and it was the only code exempt. The function's own doc comment had always claimed untracked files were included. -
standards:
FileInfo.modeandRuntimeProcess.isAlive(pid)added to the cross-runtime surface. Both existed only as runtime-specific globals before, which meant callers either reached forDeno.*(breaking under Node) or could not express the check at all. -
ai: the
claude-codeadapter honoursproperties.cwd, and omits--modelwhen the configured model is empty. It previously ignored cwd — so the same config rooted the agent at the project on the ACP path and at the caller's directory on the TypeScript one — and pushed a dangling--modelflag that the CLI rejects. -
noskills:
noskills rundrives each iteration through the ai package'sclaude-codeprovider instead of a rawclaude -pshell-out, and records the iteration itself. Previously it discarded the agent's output entirely and learned what happened only by re-readingstate.json, which Claude Code's Stop hook was expected to have written — with nothing verifying that it had. If the hook was absent or misconfigured, state never moved, the same prompt was rebuilt and re-sent, and the loop burned every one of--max-iterationsbefore reporting "Max iterations reached" rather than the real fault. The loop now also surfaces the turn'sstopReason, soend_turn,max_tokens,refusalandcancelledare no longer indistinguishable.execution.drivermarks which writer owns the turn so the Stop hook stands down while the loop is driving; the two used to be capable of racing read-modify-writes on one file. Iteration recording is now a single shared implementation (state/iteration.ts) with both callers routed through it. Provider selection is unchanged in effect whereeser-acpis absent: the pure-TypeScript adapter runs the same vendor binary in the same mode. -
ai:
ai askdefault models refreshed across every provider whose default had gone stale:anthropicandclaude-codetoclaude-sonnet-5(from the dated snapshotclaude-sonnet-4-20250514),openaitogpt-5.6-terra(fromgpt-4o, whose2024-05-13snapshot has an announced shutdown), andgeminiandvertexaitogemini-3.6-flash(fromgemini-2.0-flash, already past its shutdown date — Google names 3.6 Flash as its replacement). Two rules now govern the table: aliased IDs rather than dated snapshots, so a default tracks its tier instead of freezing on the day it was typed; and the balanced tier rather than the flagship, since this is what a bareai askgets. Pass--modelor setConfigTarget.Modelfor a flagship or a pinned snapshot. Note Gemini 3.6 Flash silently ignorestemperature/topP; the Google adapters send only those two, so no request breaks, but they have no effect. -
ajan: the six
@eserstack/ajan-*platformoptionalDependencies(and the generated@eserstack/ajandependency of the published CLI) widened to admit^5.0.0alongside their existing floor. Resolution is unchanged today — no resolved version inpnpm-lock.yamlmoved — but the ranges no longer have to be edited during the v5.0.0 bump, which is the step whose omission would be silent: anoptionalDependencymatching nothing is dropped by pnpm rather than erroring, leaving a stale native binary against a new ABI.codebase/ajan-ranges.test.tsnow enforces that every declared range admits the rootVERSION.
- codebase:
eser codebase scaffoldingcommand — useeser kit clone <specifier>instead. - codebase:
eser codebase initalias for scaffolding — removed without shim; useeser kit clone. - codebase:
@eserstack/codebase/scaffoldingJSR export — replaced by@eserstack/kit/recipes. - noskills-client:
DeltaEvent,ToolStartEventandToolResultEventremoved from theDaemonEventunion. Breaking. Nothing has ever emitted them — the daemon's only translation point (noskillsserverfx/fanout.go) has no case fordelta,tool_startortool_result, and neither worker sends them. A client narrowing on those variants was matching on dead branches. Assistant text and tool calls arrive insideSdkEvent(sdk_event), which the same release adds to the union for the first time.
-
eser codebase scaffolding gh:owner/repo→eser kit clone gh:owner/repo -
eser codebase init→eser kit clone <specifier> -
--var key=valueand--interactivework identically -
--skip-post-installis now--no-post-install -
YAML
.eser/manifest.ymlis no longer read; userecipe.json(variables,postInstall,ignore) instead -
noskills: AskUserQuestion confirmation tokens — mechanical enforcement that agents asked the user before submitting discovery answers. Per-question STATED/INFERRED marking via PostToolUse hook (
noskills invoke-hook post-ask-user-question) and next.ts validation. -
noskills: merged listen-first + mode selection entry menu with recursive context-sharing.
-
noskills: automatic spec classification from discovery text, with REFINEMENT confirmation.
-
noskills: userContext migration from
string→readonly string[]with backward-compat shim in persistence.normalizeStateShape.
- noskills: behavioral platforms (Cursor, Windsurf, Copilot) now default discovery answers to INFERRED since they lack PostToolUse hook support. REFINEMENT will surface all answers for confirmation on these platforms.
- ajan: lazy-load FFI backends with async open
- noskills: rename REVIEW→REFINEMENT, DRAFT→PROPOSAL phases
- noskills: update phase names, add Jidoka enforcement and review dimensions
- noskills,codebase: add Jidoka enforcement, review dimensions, ajan version sync
- noskills,shell: add learnings, diagrams, follow-ups, xterm vterm
- shell,noskills: add TUI widget system and spec delegation workflow
- ajan,cli: use .wasm.bin variant to bypass deno compile wasm validation
- noskills,shell: add learnings, diagrams, follow-ups, xterm vterm
- shell,noskills: add TUI widget system and spec delegation workflow
- noskills-web: sanitize error responses and add missing dependency
- noskills: add web dashboard, event system, and TUI tab bar
- noskills: add project root discovery and two-tier rule delivery
- noskills: add multi-user identity, discovery modes, and plan-based specs
- noskills: remove FREE phase, make IDLE default permissive state and auto-generate spec slugs
- codebase: validate all path parts upfront and fix nested object traversal in setPropertyByPath
- ai: pipe prompts via stdin to avoid E2BIG on large inputs
- shell: suppress pty tcgetattr noise and skip type-check on compile
- noskills: add multi-user identity, discovery modes, and plan-based specs
- noskills: remove FREE phase, make IDLE default permissive state and auto-generate spec slugs
- codebase: validate all path parts upfront and fix nested object traversal in setPropertyByPath
- ai: pipe prompts via stdin to avoid E2BIG on large inputs
- shell: suppress pty tcgetattr noise and skip type-check on compile
- noskills: add multi-user identity, discovery modes, and plan-based specs
- noskills: add pack management system and consolidate ajan build targets
- noskills: add pack management system and consolidate ajan build targets
- ajan,noskills,shell: add ajan Go bridge, noskills manager, and shell TUI primitives
- ajan: replace node:ffi with koffi for Node.js FFI backend
- ajan: simplify FFI env vars and remove per-runtime backend selection
- *: broaden Go version regex, use relative imports, and normalize YAML formatting
- *: harden regex patterns against ReDoS and patch prototype pollution
- ajan: update error messages to recommend package install over local build
- ajan,noskills,shell: add ajan Go bridge, noskills manager, and shell TUI primitives
- ajan: replace node:ffi with koffi for Node.js FFI backend
- ajan: simplify FFI env vars and remove per-runtime backend selection
- *: harden regex patterns against ReDoS and patch prototype pollution
- ajan: update error messages to recommend package install over local build
- ajan,noskills,shell: add ajan Go bridge, noskills manager, and shell TUI primitives
- ajan: replace node:ffi with koffi for Node.js FFI backend
- ajan: simplify FFI env vars and remove per-runtime backend selection
- noskills: add spec splitting, git write-bypass detection, and batch task completion
- noskills: add FREE mode, OpenCode/Codex/Copilot CLI adapters, and live state machine coaching
- noskills: add per-tool interaction hints and require explicit --spec flag
- noskills: add adapter pattern for sync engine with full Kiro integration
- noskills: update Twitter handle typo
- noskills: discovery review phase, verifier agent, --spec flag
- noskills: deep discovery, ID-based debt, sub-agent delegation
- noskills: discovery review phase, verifier agent, --spec flag
- noskills: deep discovery, ID-based debt, sub-agent delegation
- noskills: make discovery phase probe deeper instead of relaying verbatim
- noskills: batch concern add, phase-aware options, one-at-a-time discovery flow
- noskills: use PATH-based CLI detection and update setup docs
- codebase: harden regex patterns and prototype pollution guards
- noskills: replace availableActions with interactiveOptions for native tool UX
- noskills: add agent detection, session-start hook, and IDLE actions
Maintenance release.
- noskills: replace filesystem concern loading with static imports
- standards: add TTY detection and raw mode to cross-runtime process
- noskills: add execution engine, hooks, TUI prompts, and output formatting
- *: consolidate all config under .eser/ directory
- codebase: emit maintenance release section instead of throwing on chore-only changelogs
- standards: rename runtime to cross-runtime, registry to collections
- codebase: add group aliases in help, fix semver version check
- cli: add "." alias for codebase submodule
- laroux: split server/CLI into laroux-server and slim down laroux to shared types
- noskills: introducing noskills.
- workflows: circular dependency issues is fixed by removing codebase dependency.
- stream: circular dependency issues is fixed by removing encode/decode exports.
- ai: introducing @eserstack/ai
- shell: scalable module system.
- codebase: prompt was incorrectly placed.
- streams: introducing @eserstack/streams
- streams: introducing @eserstack/streams.
- ci: allow homebrew/nix update jobs to fail when app credentials missing.
- ci: skip homebrew/nix jobs when app credentials not configured.
- ci: add checkout step to upload-assets job.
- deps: bump google.golang.org/grpc from 1.79.2 to 1.79.3 in /apps/services
- codebase: convert validate-licenses to createFileTool factory
- codebase: fixed changelog generation scripts
- codebase: fixed changelog generation scripts.
- codebase: gh sub-commands
- codebase: release, rerelease and unrelease commands.
- *: updated documentations.
- codebase: categorized codebase tools.
- codebase: updated validate-commit-msg tool to support multiple and asterisk scope.
- codebase: categorized codebase tools.
- codebase: updated validate-commit-msg tool to support multiple and asterisk scope.
- codebase: resolved some security issues
- standards: walk and colors features for various runtimes.
- functions: context-aware tasks, and adapters.
- bundler: add Deno module resolution fallback for npm packages
- bundler: add projectRoot configuration for module resolution
- bundler: enhance Deno bundler output mapping for entry keys
- bundler: enhance server action handling with client stubs and reference symbols
- bundler: implement server action transformation and manifest generation
- bundler: add server externals plugin to bundler configuration
- bundler: enhance server and client bundling with externals support
- bundler: implement policy for external import specifiers in bundling process
- add support for imports, dependencies, and devDependencies in package loader
- laroux: laroux packages are introduced.
- bundler: introduce new testing framework and enhance CSS processing capabilities
- added formatting utilities in @eserstack/standards for better number, size, duration, and percentage representation.
- introduced new utilities in the @eserstack/standards package, including date and time formatting, internationalization, and string interpolation functions.
- fp: introduced new utility functions, including chunk, get, groupBy, keyBy, and memoize, along with their respective tests and benchmarks.
- added @eserstack/primitives package to provide utility functions and promises.
- CLI and documentation enhancements
- *: add FakeServer and temp directory utilities for testing
- @eserstack/cs: minor changes to ready shipping.
- *: bump all versions feature
- laroux: update project structure and configuration for laroux-app
- laroux: enhance regex patterns to prevent ReDoS vulnerabilities
- laroux: enhance global type definitions for Laroux runtime
- laroux: add return types to various functions for improved type safety
- bundler: streamline module and chunk manifest generation
- standards: simplify runtime entry points by consolidating to a single default path.
- @eserstack/cs: remove builders and config files; update CLI and generate functionality
- bumped to deno version 2.x
- codebase: resolved some security issues
- codebase: check-licenses pwd fix.
- shebang consideration.
- bundler: update import map resolver for object property access.
- bundler: enhance import map resolver
- bundler: prevent import path rewriting for action modules
- bundler: include server action files in server bundling process
- laroux: mark action-registry as external in the bundler configuration to ensure bundled actions share the server's registry.
- laroux: update dynamic import paths in middleware and route dispatchers to comply with Deno's publishing requirements by using file:// protocol.
- laroux: mark action-registry as external in the bundler configuration to prevent inlining of a local copy, ensuring shared usage of the server's registry.
- laroux: ensure dynamic imports of server actions are assigned to a variable to comply with Deno's publishing requirements, improving import handling.
- laroux: improved server action loading logic in main.ts to check for the existence of the actions file before attempting to import it, providing better error handling.
- excluded templates from deno tooling.
- added .npmrc files to templates.
- laroux: npm publishing fix.
- laroux: improve handling of undefined values in logging and JSR resolver plugin
- laroux: improve handling of undefined values in various functions
- laroux: improve error handling and path management in various functions
- bundler: update main entrypoint handling to support null values and custom entry names
- bundler: update Tailwind CSS plugin reference in deno.json to use tailwind-plugin.ts.
- bundler: enhance chunk extraction logic to locate component exports when proxy files are absent.
- bundler: enhance map decoding logic to handle null values more effectively.
- bundler: improve buffer decoding to handle null/undefined inputs safely.
- bundler: the referenceFile is calculated as a relative path from the CSS module's directory.
- logging: specify FormatterFn type for default text and ANSI color formatters for improved type safety.
- bundler: ensure stop method returns a promise for consistent behavior.
- updated validation commands in package.json to use the new validation structure for licenses.
- @eserstack/cli: --help identifier fix.
- jsr package name resolution bug.
- ensure output writer lock is released on write failure
- scripts: version bump script
- scripts: deno.jsonc -> deno.json