Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
234 commits
Select commit Hold shift + click to select a range
a0d6216
chore(deps): bump google.golang.org/grpc in /apps/services
dependabot[bot] Mar 19, 2026
3c08ffa
Merge pull request #88 from eser/dependabot/go_modules/apps/services/…
eser Mar 19, 2026
933af2e
chore(codebase): release v4.1.10
eser Mar 19, 2026
67f3bba
fix(ci): add checkout step to upload-assets job.
eser Mar 19, 2026
6c45084
chore(codebase): release v4.1.11
eser Mar 19, 2026
3f76631
fix(ci): skip homebrew/nix jobs when app credentials not configured.
eser Mar 19, 2026
2750d31
fix(ci): allow homebrew/nix update jobs to fail when app credentials …
eser Mar 19, 2026
2f81e30
chore(codebase): release v4.1.12
eser Mar 19, 2026
9832c95
feat(streams): introducing @eser/streams.
eser Mar 25, 2026
88ead0c
chore(codebase): release v4.1.13
eser Mar 25, 2026
d9caca5
feat(streams): introducing @eser/streams (take II).
eser Mar 26, 2026
37ebb79
chore(deps): bump denoland/deno from 2.7.5 to 2.7.7 (#89)
dependabot[bot] Mar 26, 2026
7b0c160
ci(deps): bump actions/create-github-app-token in the actions group (…
dependabot[bot] Mar 26, 2026
d2097af
chore(deps): bump the go-deps group in /apps/services with 4 updates …
dependabot[bot] Mar 26, 2026
882dbf4
feat(streams): introducing @eser/streams (take III).
eser Mar 26, 2026
4ba21cf
chore(codebase): release v4.1.14
eser Mar 26, 2026
81dc15a
fix(codebase): prompt was incorrectly placed.
eser Mar 26, 2026
68688c4
feat(shell): scalable module system.
eser Mar 26, 2026
4a1fc34
chore(codebase): release v4.1.15
eser Mar 26, 2026
3406e76
feat(ai): introducing @eser/ai.
eser Mar 26, 2026
87ce4ea
feat(ai): introducing @eser/ai (take II).
eser Mar 26, 2026
f5d4cb8
chore(codebase): release v4.1.16
eser Mar 26, 2026
869e8f4
fix(stream): circular dependency issues is fixed by removing encode/d…
eser Mar 26, 2026
fdf6782
chore(codebase): release v4.1.17
eser Mar 26, 2026
4771a84
fix(workflows): circular dependency issues is fixed by removing codeb…
eser Mar 26, 2026
7dc440a
chore(codebase): release v4.1.18
eser Mar 26, 2026
8acd223
feat(noskills): introducing noskills.
eser Mar 26, 2026
d9f9693
chore(codebase): release v4.1.19
eser Mar 26, 2026
9857742
refactor(laroux): split server/CLI into laroux-server and slim down l…
eser Mar 26, 2026
a687c4e
chore(codebase): release v4.1.20
eser Mar 26, 2026
8b42bca
ci(laroux-server): update build/publish paths from laroux to laroux-s…
eser Mar 27, 2026
5017103
chore(codebase): release v4.1.21
eser Mar 27, 2026
616dae1
ci(build): add path for npm-bundle artifact download in publish step
eser Mar 27, 2026
574f95f
ci(build): split npm-bundle artifact into per-package uploads and dow…
eser Mar 27, 2026
3246ab4
feat(cli): add "." alias for codebase submodule
eser Mar 27, 2026
f6c076b
chore(codebase): release v4.1.22
eser Mar 27, 2026
ecfa91c
chore(codebase): release v4.1.23
eser Mar 27, 2026
d469168
ci(build): switch to ubicloud ARM runners, add caching, harden regexes
eser Mar 27, 2026
ee75000
feat(codebase): add group aliases in help, fix semver version check
eser Mar 27, 2026
9bc1f27
chore(codebase): release v4.1.24
eser Mar 27, 2026
8793792
refactor(standards): rename runtime to cross-runtime, registry to col…
eser Mar 27, 2026
ab2b7d0
refactor(standards): rename runtime to cross-runtime, registry to col…
eser Mar 27, 2026
63434f6
chore(codebase): release v4.1.25
eser Mar 27, 2026
efc5cfd
ci(build): migrate CI runners from ubicloud to ubuntu-latest-arm
eser Mar 27, 2026
525eeaa
ci(build): migrate CI runners from ubicloud to ubuntu-latest-arm (tak…
eser Mar 27, 2026
8bd4147
chore(codebase): release v4.1.26
eser Mar 27, 2026
50446cc
fix(codebase): emit maintenance release section instead of throwing o…
eser Mar 27, 2026
e895dd7
chore(codebase): release v4.1.27
eser Mar 27, 2026
395271f
refactor(*): consolidate all config under .eser/ directory
eser Mar 27, 2026
3bb7f84
chore(codebase): release v4.1.28
eser Mar 27, 2026
a1c2698
feat(noskills): add execution engine, hooks, TUI prompts, and output …
eser Mar 28, 2026
5651998
chore(codebase): release v4.1.29
eser Mar 28, 2026
9ccf9a9
feat(standards): add TTY detection and raw mode to cross-runtime process
eser Mar 28, 2026
71855e1
chore(codebase): release v4.1.30
eser Mar 28, 2026
277f8ce
feat(noskills): replace filesystem concern loading with static imports
eser Mar 28, 2026
4685b4b
chore(codebase): release v4.1.31
eser Mar 28, 2026
2944ba5
ci(build): switch compile and upload jobs to GitHub-hosted ARM runners
eser Mar 28, 2026
9eecc91
chore(codebase): release v4.1.32
eser Mar 28, 2026
a1b3c53
feat(noskills): add agent detection, session-start hook, and IDLE act…
eser Mar 28, 2026
eda4d6f
chore(codebase): release v4.1.33
eser Mar 28, 2026
0d0b59f
chore(nix): update binary hashes for v4.1.33
github-actions[bot] Mar 28, 2026
d4b5ea3
feat(noskills): replace availableActions with interactiveOptions for …
eser Mar 28, 2026
4305af9
chore(codebase): release v4.1.34
eser Mar 28, 2026
a9fe51f
chore(nix): update binary hashes for v4.1.34
github-actions[bot] Mar 28, 2026
f4d1c09
feat(noskills): use PATH-based CLI detection and update setup docs
eser Mar 28, 2026
c7435cd
fix(codebase): harden regex patterns and prototype pollution guards
eser Mar 28, 2026
b6185cc
chore(codebase): release v4.1.35
eser Mar 28, 2026
e65971b
chore(nix): update binary hashes for v4.1.35
github-actions[bot] Mar 28, 2026
4c49106
feat(noskills): batch concern add, phase-aware options, one-at-a-time…
eser Mar 28, 2026
706bc31
chore(codebase): release v4.1.36
eser Mar 28, 2026
7eef7ed
chore(nix): update binary hashes for v4.1.36
github-actions[bot] Mar 28, 2026
1c7bfb0
feat(noskills): make discovery phase probe deeper instead of relaying…
eser Mar 28, 2026
0db0330
chore(codebase): release v4.1.37
eser Mar 28, 2026
5cef544
chore(nix): update binary hashes for v4.1.37
github-actions[bot] Mar 28, 2026
1d007ba
feat(noskills): deep discovery, ID-based debt, sub-agent delegation
eser Mar 29, 2026
2a32931
feat(noskills): discovery review phase, verifier agent, --spec flag
eser Mar 29, 2026
9ae13ae
chore(deps): bump denoland/deno from 2.7.7 to 2.7.9 (#92)
dependabot[bot] Mar 29, 2026
92b9480
ci(deps): bump the actions group with 2 updates (#93)
dependabot[bot] Mar 29, 2026
cc76946
chore(deps-dev): bump the npm-deps group with 3 updates (#94)
dependabot[bot] Mar 29, 2026
a5471c6
chore(deps): bump the go-deps group in /apps/services with 3 updates …
dependabot[bot] Mar 29, 2026
2e4f64e
chore(deps): update deno.lock
eser Mar 29, 2026
e822df7
chore(codebase): release v4.1.38
eser Mar 29, 2026
246b73f
test(noskills): disable op/resource sanitizers in purge agent tests
eser Mar 29, 2026
62c4ff5
chore(codebase): release v4.1.39
eser Mar 29, 2026
9d379c0
chore(nix): update binary hashes for v4.1.39
github-actions[bot] Mar 29, 2026
1a1bda6
docs(noskills): update Twitter handle typo
eser Mar 29, 2026
4c92923
chore(codebase): release v4.1.40
eser Mar 29, 2026
6fa4b0b
chore(nix): update binary hashes for v4.1.40
github-actions[bot] Mar 29, 2026
eb9697f
feat(noskills): add adapter pattern for sync engine with full Kiro in…
eser Mar 29, 2026
07469bc
chore(codebase): release v4.1.41
eser Mar 29, 2026
26b5479
chore(nix): update binary hashes for v4.1.41
github-actions[bot] Mar 29, 2026
0393c37
feat(noskills): add per-tool interaction hints and require explicit -…
eser Mar 30, 2026
75f27c1
chore(codebase): release v4.1.42
eser Mar 30, 2026
714df4c
chore(nix): update binary hashes for v4.1.42
github-actions[bot] Mar 30, 2026
d3c3f22
feat(noskills): add FREE mode, OpenCode/Codex/Copilot CLI adapters, a…
eser Mar 30, 2026
c024188
chore(codebase): release v4.1.43
eser Mar 30, 2026
aece214
chore(nix): update binary hashes for v4.1.43
github-actions[bot] Mar 30, 2026
10b18e6
feat(noskills): add spec splitting, git write-bypass detection, and b…
eser Mar 30, 2026
80a35d3
chore(codebase): release v4.1.44
eser Mar 30, 2026
4599d8f
chore(nix): update binary hashes for v4.1.44
github-actions[bot] Mar 30, 2026
8ca913e
feat(ajan,noskills,shell): add ajan Go bridge, noskills manager, and …
eser Apr 1, 2026
f016db7
ci(build): rename go subcommand to ajan in workflow smoke tests
eser Apr 1, 2026
02edeee
refactor(ajan): simplify FFI env vars and remove per-runtime backend …
eser Apr 1, 2026
eed0194
refactor(ajan): replace node:ffi with koffi for Node.js FFI backend
eser Apr 1, 2026
9c59b2d
chore(codebase): release v4.1.45
eser Apr 1, 2026
3383b44
fix(ajan): update error messages to recommend package install over lo…
eser Apr 1, 2026
d6954f9
fix(*): harden regex patterns against ReDoS and patch prototype pollu…
eser Apr 1, 2026
a1f328d
chore(codebase): release v4.1.46
eser Apr 1, 2026
4e9a252
fix(*): broaden Go version regex, use relative imports, and normalize…
eser Apr 1, 2026
1dbda34
chore(codebase): release v4.1.47
eser Apr 1, 2026
0af41d6
chore(nix): update binary hashes for v4.1.47
github-actions[bot] Apr 1, 2026
268873c
feat(noskills): add pack management system and consolidate ajan build…
eser Apr 1, 2026
310a654
chore(codebase): release v4.1.48
eser Apr 1, 2026
bb10150
feat(noskills): add multi-user identity, discovery modes, and plan-ba…
eser Apr 1, 2026
74b4881
chore(codebase): release v4.1.49
eser Apr 1, 2026
4490b18
chore(deps-dev): bump @anthropic-ai/sdk (#96)
dependabot[bot] Apr 1, 2026
116e358
fix(shell): suppress pty tcgetattr noise and skip type-check on compile
eser Apr 2, 2026
b1aa2d9
fix(ai): pipe prompts via stdin to avoid E2BIG on large inputs
eser Apr 2, 2026
a403390
fix(codebase): validate all path parts upfront and fix nested object …
eser Apr 2, 2026
3e36cfb
refactor(noskills): remove FREE phase, make IDLE default permissive s…
eser Apr 2, 2026
2b19fd0
chore(codebase): release v4.1.50
eser Apr 2, 2026
50d17d2
feat(noskills): add project root discovery and two-tier rule delivery
eser Apr 2, 2026
0317fc1
feat(noskills): add web dashboard, event system, and TUI tab bar
eser Apr 2, 2026
6a3d74e
chore(codebase): release v4.1.51
eser Apr 2, 2026
944f722
fix(noskills-web): sanitize error responses and add missing dependency
eser Apr 2, 2026
8607c71
chore(codebase): release v4.1.52
eser Apr 2, 2026
a8f3f62
feat(shell,noskills): add TUI widget system and spec delegation workflow
eser Apr 3, 2026
cefe5e9
feat(noskills,shell): add learnings, diagrams, follow-ups, xterm vterm
eser Apr 4, 2026
1ac1dea
chore(codebase): release v4.1.53
eser Apr 4, 2026
b5f00a7
fix(ajan,cli): use .wasm.bin variant to bypass deno compile wasm vali…
eser Apr 4, 2026
96b8ad6
chore(codebase): release v4.1.54
eser Apr 4, 2026
8d17083
chore(nix): update binary hashes for v4.1.54
github-actions[bot] Apr 4, 2026
31664fe
feat(noskills,codebase): add Jidoka enforcement, review dimensions, a…
eser Apr 4, 2026
b0ac626
chore(codebase): release v4.1.55
eser Apr 5, 2026
4e676bf
chore(nix): update binary hashes for v4.1.55
github-actions[bot] Apr 5, 2026
9178a32
docs(noskills): update phase names, add Jidoka enforcement and review…
eser Apr 5, 2026
d063a36
refactor(noskills): rename REVIEW→REFINEMENT, DRAFT→PROPOSAL phases
eser Apr 6, 2026
109f95a
refactor(ajan): lazy-load FFI backends with async open
eser Apr 6, 2026
f5ea80d
chore(codebase): release v4.1.56
eser Apr 6, 2026
125c79c
chore(nix): update binary hashes for v4.1.56
github-actions[bot] Apr 6, 2026
068c85b
feat(noskills): unified state layout
eser Apr 6, 2026
20056c5
feat(noskills): update command structure and enhance documentation
eser Apr 15, 2026
bdc716f
chore(deps): bump vite (#101)
dependabot[bot] Apr 15, 2026
ae175fa
chore(deps): bump go.opentelemetry.io/otel/exporters/otlp/otlptrace/o…
dependabot[bot] Apr 15, 2026
93bb41d
ci(deps): bump pnpm/action-setup from 5 to 6 in the actions group (#114)
dependabot[bot] Apr 15, 2026
b7ff0a0
chore(deps): bump the npm-deps group across 1 directory with 5 update…
dependabot[bot] Apr 15, 2026
57a0236
chore(deps): bump the go-deps group across 1 directory with 11 update…
dependabot[bot] Apr 15, 2026
7a9b459
chore(deps): bump go.opentelemetry.io/otel/exporters/otlp/otlplog/otl…
dependabot[bot] Apr 15, 2026
f65faaa
chore(*): replace deno.lock with pnpm-lock.yaml and update related co…
eser Apr 15, 2026
32cd74e
chore(deps): bump go.opentelemetry.io/otel/exporters/otlp/otlpmetric/…
dependabot[bot] Apr 15, 2026
ddd7246
chore(deps): bump go.opentelemetry.io/otel/exporters/otlp/otlptrace/o…
dependabot[bot] Apr 15, 2026
a709992
chore(deps): bump go.opentelemetry.io/otel/sdk in /apps/services (#105)
dependabot[bot] Apr 15, 2026
ae8a203
chore(deps): bump the go-deps group across 1 directory with 18 update…
dependabot[bot] Apr 15, 2026
90101e1
chore(config): switch nodeModulesDir from auto to manual for pnpm
eser Apr 15, 2026
f540509
ci(build): add pnpm install to workflow jobs
eser Apr 15, 2026
9a44d09
feat: @eser -> @eserstack :(
eser May 3, 2026
2b7e12b
feat(@eserstack): @eser -> @eserstack rename and cross-platform support
eser Jun 7, 2026
8f65ffe
feat(noskills): add decision-ledger instrumentation and read APIs
eser Jun 7, 2026
d09fa16
feat(noskills): add measurement-draft ledger projection and CI pnpm s…
eser Jun 7, 2026
c0ed308
feat(workflowfx): handle non-unix/windows targets in setupCancelKill
eser Jun 7, 2026
2440198
feat(workflowfx): handle non-unix/windows targets in setupCancelKill …
eser Jun 7, 2026
7eae1b8
feat(workflowfx): handle non-unix/windows targets in setupCancelKill …
eser Jun 7, 2026
f92bf49
chore(release): bump to 4.1.57
eser Jun 7, 2026
bddc8fd
feat(workflowfx): handle non-unix/windows targets in setupCancelKill …
eser Jun 7, 2026
2cd4825
feat(mux): add frontend-neutral terminal multiplexer with native PTY
eser Jun 19, 2026
fb72f36
feat(build): generate JSR manifests and fix P0 audit findings
Jul 31, 2026
0d5c9cb
fix(build): unpin ajan platform deps to unblock frozen-lockfile
eser Aug 1, 2026
2c98fbd
fix(build): make JSR manifest generator dependency-free
eser Aug 1, 2026
4b57fb7
fix(cli): restore ajan command dropped in the @eserstack rename
eser Aug 1, 2026
abbd612
fix(cli): mark @eserstack/ajan external in the npm bundle
eser Aug 1, 2026
eb8de4c
fix(cli): declare @eserstack/ajan dependency for the ajan command
eser Aug 2, 2026
961c444
chore(deps): bump github.com/jackc/pgx/v5 from 5.9.1 to 5.9.2
dependabot[bot] Apr 23, 2026
b177218
chore(deps-dev): bump @anthropic-ai/sdk from 0.89.0 to 0.91.1 (#124)
dependabot[bot] Aug 2, 2026
540652a
fix(opencode): generate valid tools object and MCP command array for …
salihdev0 Aug 2, 2026
3c6c079
chore(deps): bump github.com/quic-go/quic-go from 0.59.0 to 0.59.1 (#…
dependabot[bot] Aug 2, 2026
deaee1c
chore(deps): bump github.com/quic-go/quic-go (#135)
dependabot[bot] Aug 2, 2026
802aca2
chore(deps): bump esbuild from 0.24.2 to 0.28.1 (#138)
dependabot[bot] Aug 2, 2026
a230ffa
chore(deps): bump the npm_and_yarn group across 2 directories with 2 …
dependabot[bot] Aug 2, 2026
29d1721
chore(deps): bump @anthropic-ai/sdk (#141)
dependabot[bot] Aug 2, 2026
a7fa07f
chore(deps): bump the go-deps group across 1 directory with 24 update…
dependabot[bot] Aug 2, 2026
b1d4f27
ci(deps): bump the actions group across 1 directory with 6 updates (#…
dependabot[bot] Aug 2, 2026
1f01d58
chore(deps): bump golang.org/x/net from 0.53.0 to 0.55.0 (#144)
dependabot[bot] Aug 2, 2026
b7b425d
chore(deps): bump the npm-deps group with 20 updates (#145)
dependabot[bot] Aug 2, 2026
b55ac1f
chore(deps): bump golang.org/x/crypto from 0.51.0 to 0.52.0 (#146)
dependabot[bot] Aug 2, 2026
94c527e
chore(deps): bump github.com/getkin/kin-openapi from 0.140.0 to 0.144…
dependabot[bot] Aug 2, 2026
71b1ea3
chore(deps): bump google.golang.org/grpc from 1.80.0 to 1.82.1 (#149)
dependabot[bot] Aug 2, 2026
1c24505
chore(deps): bump github.com/quic-go/webtransport-go (#150)
dependabot[bot] Aug 2, 2026
2508aa1
chore(deps): bump sharp from 0.33.5 to 0.35.0 (#151)
dependabot[bot] Aug 2, 2026
92f0814
chore(deps): updated dependencies.
eser Aug 2, 2026
77b4b59
chore: removed redundant go.work.
eser Aug 2, 2026
f3062f1
feat(acp): migrate agent spawning to the Agent Client Protocol
eser Aug 5, 2026
9630555
fix(shellfx): wait for the stderr drain before closing the read end
eser Aug 5, 2026
11c809d
chore(deps): bump hono from 4.12.33 to 4.13.0 (#152)
dependabot[bot] Aug 5, 2026
116ef60
fix(ci): use stable Go in release.yml
eser Aug 5, 2026
3882eb2
refactor(acp): run the shim in-process and delete the eser-acp binary
eser Aug 5, 2026
0fc23fd
chore(release): drop stale shim comment from the brew formula
eser Aug 6, 2026
c58e6bc
refactor(cli): ship noskills and laroux as deno-compiled binaries
eser Aug 6, 2026
168a99f
refactor(cli): make system handlers app-aware, share PATH lookup
eser Aug 6, 2026
35889e5
refactor: docs structure.
eser Aug 7, 2026
77cdebf
fix(codebase): report correct target version in dry-run release
eser Aug 7, 2026
20b5c71
fix(codebase): stage only tracked pathspecs during release
eser Aug 8, 2026
4b3853e
chore(codebase): release v4.3.0
eser Aug 8, 2026
1e3ddb3
fix(build): mark FFI packages external in all npm builds
eser Aug 8, 2026
5077c27
chore(codebase): correct changelog heading for v4.3.0 release
eser Aug 8, 2026
75aa92e
chore(codebase): make tag push the release trigger
eser Aug 8, 2026
68c94b6
fix(cli): make the ajan load error usable without Deno
eser Aug 8, 2026
ec9256c
fix(ci): install the npm smoke-test binary as a consumer dependency
eser Aug 8, 2026
4a03973
chore(deps): bump the go-deps group with 15 updates (#153)
dependabot[bot] Aug 9, 2026
52a8645
chore(deps): bump the npm-deps group with 2 updates (#154)
dependabot[bot] Aug 9, 2026
d78ce57
ci(deps): bump the actions group with 3 updates (#155)
dependabot[bot] Aug 9, 2026
b4ffb79
fix(security): harden path, TLS pinning, and regex guards
eser Aug 9, 2026
c06b36c
fix(security): pin on resumed sessions, compare DataDir by identity
eser Aug 9, 2026
fc183ca
chore(codebase): release v4.3.1
eser Aug 9, 2026
b2f019c
fix(ajan): harden FFI bridge, config parsing and HTTP security
eser Sep 12, 2026
fd3e4d2
build(go): pin CI Go to go.mod and bump golangci-lint to v2.13.2
eser Sep 12, 2026
13b9228
chore(codebase): release v4.4.0
eser Sep 12, 2026
7e24ef7
build(go): pin toolchain, tidy ajan deps and check go.mod drift in make
eser Sep 12, 2026
3f4fb69
chore(codebase): release v4.5.0
eser Sep 12, 2026
ed6c441
build(npm): bundle @eserstack/ajan instead of marking it external
eser Sep 13, 2026
b6f059b
feat(codebase): add validate-self-imports check for JSR publish safety
eser Sep 13, 2026
869c90c
fix(codebase): surface gh stderr on release failures, skip published npm
eser Sep 13, 2026
670b8c8
chore(codebase): release v4.5.1
eser Sep 13, 2026
0810882
ci(release): make the release chain resumable and prove it on main be…
eser Sep 16, 2026
2511184
ci(release): let post-gate jobs run on a post-publish resume
eser Sep 17, 2026
01063c9
fix(ajan): pin platform packages to the exact CLI version and publish…
eser Sep 17, 2026
fa912d7
ci(build): run the Node and Bun cross-runtime checks from a packed in…
eser Sep 17, 2026
88bd8be
fix(codebase): align Go secrets validator with TypeScript and speed i…
eser Sep 17, 2026
0af9b58
chore(deps): update all npm and Go dependencies to latest
eser Sep 17, 2026
0c089fb
refactor: make the platform packages workspace members linked with wo…
eser Sep 17, 2026
8b46c2d
chore(codebase): release v4.5.2
eser Sep 17, 2026
f739495
fix: disable Deno's dependency-age gate and compile for the host in p…
eser Sep 17, 2026
53c8840
fix: apply audit fixes and restructure agent skills
eser Sep 25, 2026
64939e6
fix: quote skill descriptions and flag unquoted YAML values
eser Sep 25, 2026
6c0285b
chore(deps): bump fast-uri from 3.1.8 to 3.1.9
dependabot[bot] 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
  •  
  •  
  •  
File renamed without changes.
70 changes: 70 additions & 0 deletions .agents/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
{
"permissions": {
"allow": [
"Bash(cat:*)",
"Bash(deno bench:*)",
"Bash(deno check:*)",
"Bash(deno fmt:*)",
"Bash(deno lint:*)",
"Bash(deno run:*)",
"Bash(deno task:*)",
"Bash(deno test:*)",
"Bash(docker:*)",
"Bash(docker compose:*)",
"Bash(find:*)",
"Bash(gh:*)",
"Bash(head:*)",
"Bash(git diff:*)",
"Bash(git log:*)",
"Bash(git show:*)",
"Bash(git status:*)",
"Bash(grep:*)",
"Bash(ls:*)",
"Bash(make:*)",
"Bash(sort:*)",
"Bash(tail:*)",
"Bash(test:*)",
"Bash(tree:*)",
"Bash(uniq:*)",
"Bash(wc:*)",
"mcp__plugin_context7_context7__get-library-docs",
"mcp__plugin_context7_context7__query-docs",
"mcp__plugin_context7_context7__resolve-library-id",
"Skill(architecture-guidelines)",
"Skill(coding-practices)",
"Skill(design-principles)",
"Skill(enrichment)",
"Skill(eser-rules-manager)",
"Skill(go-practices)",
"Skill(javascript-practices)",
"Skill(release-and-ci)",
"Skill(security-practices)",
"Skill(tooling-standards)",
"Skill(workflow-practices)",
"WebFetch(domain:api.github.com)",
"WebFetch(domain:github.com)",
"WebFetch(domain:raw.githubusercontent.com)",
"WebSearch"
],
"deny": [
"Bash(git add:*)",
"Bash(git branch:*)",
"Bash(git checkout:*)",
"Bash(git commit:*)",
"Bash(git fetch:*)",
"Bash(git merge:*)",
"Bash(git pull:*)",
"Bash(git push:*)",
"Bash(git rebase:*)",
"Bash(git reset:*)",
"Bash(git revert:*)",
"Bash(git stash:*)",
"Bash(git tag:*)"
]
},
"enabledPlugins": {
"context7@claude-plugins-official": true,
"frontend-design@claude-plugins-official": true
},
"alwaysThinkingEnabled": true
}
35 changes: 35 additions & 0 deletions .agents/skills/architecture-guidelines/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
---
name: architecture-guidelines
description: "System design in eserstack: double-layered hexagonal architecture, explicit adapter composition, public API and CLI surface, request metadata, testing strategy, ADRs. Use when designing a package or service, adding options or flags, planning tests or writing an ADR. Not for file naming (use tooling-standards)."
---

# Architecture Guidelines

How packages and services are structured, composed, tested and documented as
decisions.

## Always

- Domain logic and its port types live together in `domain/`; adapters live in
`adapters/`. No `ports/` directory.
- Callers import adapters explicitly and pass them in. No string-selected
adapters, no convenience factories, no dynamic imports inside a package.
- Library code reaches the runtime through `@eserstack/standards/cross-runtime`,
never `Deno.*`.
- Every option has a safe default; add an option only for a named case; no
positional booleans.
- Request ids and trace state travel in the request context, never as extra
parameters.
- Unit tests with fakes for logic, integration tests for adapters; failure paths
tested; coverage never drops.
- Validator and codebase-tool design lives in
`pkg/@eserstack/codebase/AGENTS.md`
- A lasting architectural decision gets an ADR in `docs/adr/`.

## References

| File | Read when |
| ----------------------------------------------------------------- | --------------------------------------------------------------------------- |
| [hexagonal-architecture.md](references/hexagonal-architecture.md) | Structuring a package, adding an adapter, adding options, flags or env vars |
| [testing.md](references/testing.md) | Deciding what and how to test, choosing the runner, coverage |
| [adrs.md](references/adrs.md) | Recording an architectural decision |
62 changes: 62 additions & 0 deletions .agents/skills/architecture-guidelines/evals/triggers.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
[
{
"query": "design a new package for background jobs, where do ports and adapters go",
"should_trigger": true
},
{
"query": "should this CLI flag be public or hidden",
"should_trigger": true
},
{
"query": "write an ADR for switching the bundler",
"should_trigger": true
},
{
"query": "what should we unit test vs integration test for the http package",
"should_trigger": true
},
{
"query": "how do request ids travel between the noskills server and worker",
"should_trigger": true
},
{
"query": "yeni bir servis tasarlıyorum, katmanları nasıl ayırayım",
"should_trigger": true
},
{
"query": "we're adding an option to the public API of @eserstack/config, is that ok",
"should_trigger": true
},
{
"query": "the Go tests fail with a data race",
"should_trigger": false
},
{
"query": "use namespace import here",
"should_trigger": false
},
{
"query": "bump all packages to the next minor",
"should_trigger": false
},
{
"query": "write a README for laroux",
"should_trigger": false
},
{
"query": "set the GitHub workflow timeout",
"should_trigger": false
},
{
"query": "should this function take a pointer or a value",
"should_trigger": false
},
{
"query": "secret key is in the logs, fix it",
"should_trigger": false
},
{
"query": "commit and push",
"should_trigger": false
}
]
29 changes: 29 additions & 0 deletions .agents/skills/architecture-guidelines/references/adrs.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# Architectural Decision Records

When to write an ADR and what it contains.

---

## Architectural Decision Records

Scope: Decisions that change a package's architecture, a public contract, a
dependency with lasting cost, or a product target

Rule: Record the decision in `docs/adr/NNNN-kebab-title.md`, numbered after the
highest existing file (`0001-http3-and-webtransport.md` through
`0004-bundler-external-import-specifiers.md` exist). An ADR is written before or
with the change, not after. It states:

- `## Status`: Proposed, Accepted, or Superseded by a named ADR.
- `## Context and Problem Statement`: the forces and the question being decided.
- `## Decision Drivers`: what the decision optimizes for.
- `## Considered Options`, with the trade-offs of each.
- `## Decision Outcome`: the choice and why it beat the others.
- `## Consequences`: what becomes easier and what becomes harder.
- `## Links` and related files, when there are any.

An accepted ADR is not rewritten to match a later decision. A new ADR supersedes
it, and the old one's status names the new one.

**Why:** the reasoning behind a structure is what a later change needs, and it
is the part the code cannot show.
Original file line number Diff line number Diff line change
@@ -0,0 +1,175 @@
# Hexagonal Architecture and Public Surface

How packages separate domain logic from adapters, how callers compose them, and
how public APIs and request metadata are shaped.

## Contents

- Hexagonal Architecture (Double-Layered)
- Runtime Access Through cross-runtime
- Public API and CLI Surface
- Request-Scoped Metadata Across Boundaries

---

## Hexagonal Architecture (Double-Layered)

Scope: Packages with external dependencies (TypeScript; the Go form is in
go-practices)

Rule: The domain layer holds business logic and its port types together; there
is no separate `ports/` directory. Adapters implement the domain types and live
in `adapters/`. The caller composes by importing the adapters it wants and
passing them in as parameters. No string-based adapter selection, no convenience
factories that pick adapters for the caller, no dynamic imports inside the
package.

```
package/
├── domain/ # Business logic + port types
│ ├── mod.ts
│ ├── bundler.ts # Bundler type + BundleData
│ ├── framework-plugin.ts # FrameworkPlugin type + noopPlugin
│ └── build-cache.ts # BuildCache type + implementation
├── adapters/
│ ├── react/ # implements FrameworkPlugin
│ ├── tailwindcss/ # implements CssPlugin
│ └── prebuilt-bundler/ # implements Bundler
└── mod.ts
```

Correct:

```typescript
import * as bundler from "@eserstack/laroux-bundler";
import * as react from "@eserstack/laroux-bundler/adapters/react";
import * as tailwind from "@eserstack/laroux-bundler/adapters/tailwindcss";
import * as prebuilt from "@eserstack/laroux-bundler/adapters/prebuilt-bundler";

await bundler.bundle(config, {
framework: react.reactPlugin,
css: tailwind.tailwindPlugin,
bundler: new prebuilt.PrebuiltBundler(bundlerConfig),
});
```

Incorrect:

```typescript
await bundle({ framework: "react", css: "tailwindcss" }); // dynamic imports inside

const plugins = await createReactTailwindPlugins(); // hides which adapters load

import type { Plugin } from "./ports/plugin.ts"; // ports split from the domain
```

A domain type ships with a noop implementation for callers that do not need the
capability:

```typescript
// domain/framework-plugin.ts
export type FrameworkPlugin = {
name: string;
analyzeClientComponents?: (srcDir: string) => Promise<ClientComponent[]>;
};

export const noopPlugin: FrameworkPlugin = {
name: "noop",
analyzeClientComponents: () => Promise.resolve([]),
};
```

**Why:** explicit imports keep the dependency graph visible and tree-shakable,
and let a caller swap one adapter without touching the others.

---

## Runtime Access Through cross-runtime

Scope: All `@eserstack/*` library code

Rule: Filesystem, process, exec and environment access goes through
`@eserstack/standards/cross-runtime`, never `Deno.*` directly. The runtime is an
adapter like any other, so the same code runs on Deno, Node and Bun and can be
tested with a fake. CLI-only code may call `Deno.*` when cross-runtime does not
expose the API it needs (for example `Deno.makeTempDir()`).

Correct:

```typescript
import { runtime } from "@eserstack/standards/cross-runtime";

const content = await runtime.fs.readTextFile(path);
```

Incorrect:

```typescript
const content = await Deno.readTextFile(path); // ties the library to Deno
```

---

## Public API and CLI Surface

Scope: Exported functions and types, CLI commands and flags, config keys,
environment variables

Rule:

- The common case works with no configuration. Every option has a default that
is safe and correct for production.
- A fixed policy value a caller may need to change (a timeout, a size limit, a
path, a retry count) is a parameter, flag or environment variable with that
default, not a hardcoded constant.
- Do not add options for hypothetical needs. Each new option names the case that
requires it; an edge case gets documentation, not a required setting.
- No positional boolean parameters. Use an options object or a string union.
- Defaults come from parameter defaults and noop adapters, not from convenience
factories.

Correct:

```typescript
export function connect(url: string, options: { timeoutMs?: number } = {}) {
const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
}

render(tree, { mode: "stream" });
```

Incorrect:

```typescript
export function connect(url: string) {
const timeoutMs = 5000; // caller cannot change it
}

render(tree, true, false); // what are true and false?
```

---

## Request-Scoped Metadata Across Boundaries

Scope: HTTP and RPC servers and clients, the noskills daemon, services that call
each other

Rule: Metadata that identifies a request (trace and span ids, a request or
correlation id, the authenticated principal) travels with the request's context
(`context.Context` in Go, the request or an explicit context object in
TypeScript), not as extra function parameters. Business inputs and dependencies
never travel that way: inputs are parameters, dependencies come from the
composition root.

- At an entry point, middleware reads incoming metadata or creates it, and
stores it in the context.
- On every outbound call, the client writes it back out, so logs and traces on
both sides join up.
- Trace state uses OpenTelemetry propagation (the `traceparent` header), not
hand-written headers. Other ids use typed accessors owned by one package.
- Logs include these ids (coding-practices: Structured Logging).

**Why:** a request that loses its ids at one hop cannot be followed across the
system, and a dependency hidden in a context is invisible in every signature
that needs it.
Loading
Loading