feat: add workspace entity#5
Conversation
|
Caution Review failedFailed to post review comments WalkthroughIntroduces multi-root workspace management system with persistent workspace registration, resolver-based configuration loading, and workspace-aware session management. Splits session workspace identity into WorkspaceID (durable identifier) and WorkspacePath (filesystem root), adds AdditionalDirs support, integrates workspace APIs, CLI commands, and frontend UI with workspace selection and display. Changes
Sequence Diagram(s)sequenceDiagram
participant CLI as CLI/User
participant Daemon as Daemon
participant Resolver as WorkspaceResolver
participant Store as WorkspaceStore
participant Config as ConfigLoader
participant ACP as ACP Session
CLI->>Daemon: Create Session (workspace_id)
Daemon->>Resolver: Resolve(workspace_id)
Resolver->>Store: GetWorkspace(workspace_id)
Store-->>Resolver: Workspace{RootDir, AdditionalDirs, Config}
Resolver->>Config: Load config from RootDir
Config-->>Resolver: aghconfig.Config
Resolver->>Resolver: Load agents/skills across discovery roots
Resolver-->>Daemon: ResolvedWorkspace{Config, Agents, Skills, ...}
Daemon->>ACP: StartOpts{Cwd, AdditionalDirs, McpServers}
ACP-->>Daemon: Session Started
Daemon-->>CLI: Session Created with WorkspaceID
sequenceDiagram
participant Client as Client
participant HTTP as HTTP Server
participant SessionMgr as Session Manager
participant Resolver as WorkspaceResolver
participant Store as WorkspaceStore
Client->>HTTP: POST /api/sessions {workspace: "alpha"}
HTTP->>HTTP: validateCreateSessionRequest()
HTTP->>Resolver: Resolve("alpha")
Resolver->>Store: GetWorkspace/ByName("alpha")
Store-->>Resolver: Workspace{ID, RootDir, ...}
Resolver-->>HTTP: ResolvedWorkspace
HTTP->>SessionMgr: Create{Workspace: id, WorkspacePath: rootDir, ...}
SessionMgr-->>HTTP: Session{WorkspaceID, Workspace}
HTTP-->>Client: {workspace_id, workspace_path, ...}
Estimated code review effort🎯 4 (Complex) | ⏱️ ~75 minutes Possibly related PRs
Poem
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
|
There was a problem hiding this comment.
Actionable comments posted: 52
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (4)
internal/memory/dream_test.go (1)
242-363: 🧹 Nitpick | 🔵 TrivialConsider consolidating the new
Runworkspace cases into a table-driven test.The new cases are valuable, but they share a lot of setup and assertions. A table-driven
t.Runstructure would improve consistency with repository test conventions and reduce maintenance overhead.As per coding guidelines, "Use table-driven tests with subtests (
t.Run) as default in Go tests".🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/memory/dream_test.go` around lines 242 - 363, Combine the three similar tests (TestServiceRunCallsSessionSpawnerWithGoalPromptAndWorkspaceID, TestServiceRunRequiresWorkspaceResolverForExplicitWorkspace, TestServiceRunResolvesWorkspaceRefBeforeSpawn) into a single table-driven test with subtests using t.Run: define a slice of cases each with a name and fields for inputs (e.g., workspaceID/alias, WithGoal, WithWorkspaceResolver or nil, memory dir, stubLock behavior) and expected outcomes (expectedGoal, expectedPrompt, expectedWorkspace, expectErrorContains, expectedLockCalls), then iterate cases and for each create the Service with NewService(...) using the case's options, call service.Run(...) with a spawn func that captures goal/prompt/workspace, assert per-case expectations (errors, captured values, resolver resolveCalls, lock.tryAcquireCalls/releaseCalls/rollbackCalls, and workspace dir existence where applicable). Keep the existing helper types (stubLock, fakeDreamWorkspaceResolver), ConsolidationPrompt(), NewStore, and testContext(t) usage to minimize refactor surface.internal/store/store.go (1)
143-154:⚠️ Potential issue | 🟠 MajorPersist
workspace_paththrough the store layer as well.The new session contract is
workspace_idplus canonicalworkspace_path, but both persisted store structs now retain only the ID. After restart/reconcile, the original root can only be reconstructed by re-resolving the live workspace registry, so moved or deleted workspaces can change or erase the path associated with existing sessions.SessionInfoandSessionMetashould keepworkspace_pathalongsideworkspace_id.Also applies to: 357-383
internal/httpapi/httpapi_integration_test.go (1)
76-83:⚠️ Potential issue | 🟡 MinorAssert
workspace_idbefore using it in the filter request.If
created.Session.WorkspaceIDis empty,/api/sessions?workspace=can still return the only session and this test stays green without proving either the create response contract or the workspace filter. Fail fast on an emptyworkspace_idhere (and ideally assert the returnedworkspace_pathtoo).Also applies to: 103-113
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/httpapi/httpapi_integration_test.go` around lines 76 - 83, The test reads created.Session from the create response but never asserts created.Session.WorkspaceID (or WorkspacePath) before using it in the subsequent filtered GET, so the filter can pass spuriously; update the test around the session creation (the local variable created of type containing sessionPayload and the created.Session references) to assert that created.Session.WorkspaceID is non-empty (fail fast) and also assert the returned created.Session.WorkspacePath (or workspace_path) is as expected before calling /api/sessions?workspace=<...>, then use that WorkspaceID in the filter request to validate the workspace-scoped results; apply the same assertions to the other session-creation/assertion block that follows.internal/observe/observer.go (1)
352-367:⚠️ Potential issue | 🟠 MajorUse the resolver's effective workspace state here.
After
resolver.Resolve(...), this path throws awayresolvedWorkspace.ConfigandresolvedWorkspace.Agentsand rebuilds state fromLoadForHome(...)plusLoadAgentDef(...). That losesAdditionalDirsand workspace-localAGENT.mdoverrides, so permission logs can be wrong or skipped for workspace-scoped agents. Please derive the permission mode from the resolved workspace payload itself, or compute/persist it when the session starts.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/observe/observer.go` around lines 352 - 367, The code currently discards resolvedWorkspace returned by resolver.Resolve and rebuilds state via aghconfig.LoadForHome and LoadAgentDef, which loses resolvedWorkspace.AdditionalDirs and workspace-local AGENT.md overrides; change the flow in observer.go to use the resolved workspace payload (resolvedWorkspace.Config and resolvedWorkspace.Agents) when deriving agent permissions and resolving the agent instead of reloading from home paths — e.g. after resolver.Resolve(ctx, workspaceID) pass resolvedWorkspace.Config into the config resolution or merge it with cfg and use resolvedWorkspace.Agents (or compute/persist the permission mode on session start) so that cfg.ResolveAgent/ResolveAgent calls derive permissions from the effective workspace state rather than the home-only LoadForHome/LoadAgentDef results.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@internal/acp/client_test.go`:
- Around line 351-365: The test
TestStartWithEmptyAdditionalDirsKeepsBaselinePayload only covers a nil
AdditionalDirs scenario; update it to also exercise the explicit-empty slice
case by invoking startHelperProcess with StartOpts{AdditionalDirs: []string{},
Env: helperEnvWithCapture(...)} (or add a separate subtest) so both nil and
[]string{} serialization paths are validated; reference
TestStartWithEmptyAdditionalDirsKeepsBaselinePayload, StartOpts and
startHelperProcess to locate where to add the empty-slice invocation and assert
that params does not contain "additional_dirs".
In `@internal/acp/client.go`:
- Around line 238-242: The construction of newWireRequest (type
wireNewSessionRequest) currently uses append([]string(nil),
normalized.AdditionalDirs...) which always yields an empty slice instead of
preserving a nil value; update the AdditionalDirs assignment so it preserves nil
when normalized.AdditionalDirs is nil and otherwise makes a copy (e.g., if
normalized.AdditionalDirs != nil create a new slice and copy elements into it,
otherwise leave AdditionalDirs as nil) so that newWireRequest.AdditionalDirs
reflects the original nil-vs-empty distinction.
- Around line 217-222: The copy of AdditionalDirs in the construction of
loadWireRequest currently uses append([]string(nil),
normalized.AdditionalDirs...) which turns a nil slice into an empty non-nil
slice; preserve nil semantics by adding a helper (e.g., copyStringSlice) that
returns nil when input is nil and otherwise returns a copied slice, then replace
the append call with copyStringSlice(normalized.AdditionalDirs) when building
the wireLoadSessionRequest (loadWireRequest) so the wire protocol sees true null
vs empty array correctly.
- Around line 439-441: Remove the redundant slice copy: in the code path where
normalizeAdditionalDirs already returns a newly allocated slice, do not re-copy
normalized.AdditionalDirs using append([]string(nil), ...); instead keep the
slice as-is (remove the append-based copy) — locate this in the same function
around normalizeAdditionalDirs and the normalized.AdditionalDirs handling and
delete the additional append copy to avoid unnecessary allocation.
In `@internal/cli/install_test.go`:
- Around line 72-118: Split TestBuildInstallWizardInputAndBundleFormats into two
subtests using t.Run: one subtest named "BuildInstallWizardInput" that calls
buildInstallWizardInput(cfg) and asserts Providers, SelectedProvider and
SuggestedModels; and a second subtest named "InstallBundleFormats" that
constructs the installRecord and calls installBundle(record).human() and .toon()
with the existing assertions. Move t.Parallel into each subtest (or keep at top
and call t.Parallel inside each t.Run) so they run in parallel safely, and
preserve the same setup (aghconfig.Default, cfg modifications) shared between
the subtests but ensure each t.Run uses that prepared cfg/record so failures are
isolated and easier to diagnose; keep references to
TestBuildInstallWizardInputAndBundleFormats, buildInstallWizardInput,
installBundle, human(), and toon().
- Around line 159-182: The test inconsistently ignores the two return values
from model.Update(...) which can hide unexpected commands; update each call to
model.Update(tea.KeyMsg{...}) (including the calls after
model.modelInput.SetValue("") and SetValue("gpt-5.4"), and the two final Enter
calls) to capture both returned model and cmd (e.g., newModel, cmd :=
model.Update(...)) and assert cmd is non-nil or validate its expected
type/behavior consistent with earlier checks so all Update() return values are
handled uniformly in the test.
In `@internal/cli/session.go`:
- Around line 551-568: In resolveSessionCreateWorkspace, reject relative --cwd
values by checking trimmedCWD with filepath.IsAbs (or equivalent) and returning
an error when it's not absolute; specifically, when trimmedCWD != "" validate
filepath.IsAbs(trimmedCWD) and return an error like "cli: --cwd must be an
absolute path" instead of forwarding trimmedCWD, otherwise proceed to return "",
trimmedCWD, nil; keep currentWorkingDirectory usage unchanged for the default
branch.
In `@internal/cli/skill.go`:
- Around line 288-293: The code uses cliResolvedWorkspace to build a
ResolvedWorkspace before calling registry.ForWorkspace, which only inspects the
root's local skills and omits AdditionalDirs/merged config; replace that call
with the shared workspace resolver or workspace API so the ResolvedWorkspace
passed to registry.ForWorkspace includes add_dirs and merged workspace config
(i.e., obtain the ResolvedWorkspace from the shared resolver instead of
cliResolvedWorkspace), and apply the same change for the other occurrences
around the skill list/view/info logic (the block at ~305-345) to ensure
behaviour matches the daemon/API.
In `@internal/config/agent_test.go`:
- Around line 187-221: Add t.Parallel() at the start of
TestLoadWorkspaceAgentDefsAppliesDocumentedPrecedence to allow the test to run
concurrently and avoid interference with other tests; update the
TestLoadWorkspaceAgentDefsAppliesDocumentedPrecedence function (the test that
calls ResolveHomePathsFrom, EnsureHomeLayout, creates temp dirs and calls
LoadWorkspaceAgentDefs) by inserting a t.Parallel() call immediately after the
function begins (before setup) so the test is run in parallel safely.
- Around line 146-185: Add t.Parallel() to the test
TestWorkspaceDiscoveryRootsReturnsWorkspaceAdditionalGlobalOrder to allow it to
run concurrently with other independent tests; call t.Parallel() immediately at
the start of the test (right after the function begins) so the setup using
ResolveHomePathsFrom, TempDir(), and WorkspaceDiscoveryRoots still runs under
the parallel test context.
In `@internal/config/config_test.go`:
- Around line 285-346: The test
TestLoadWithoutWorkspaceRootIgnoresCurrentDirectoryWorkspaceFiles mutates global
process state via os.Chdir, so it must not be run in parallel; add a short
clarifying comment above the test (near the function declaration) explaining
that the test intentionally omits t.Parallel() because it changes the working
directory with os.Chdir and uses t.Cleanup to restore it, which would race with
other tests if run concurrently.
In `@internal/daemon/daemon.go`:
- Around line 1148-1154: The current isPathLikeWorkspaceRef heuristic
misclassifies names like "org/repo" or ".hidden"; update isPathLikeWorkspaceRef
to only treat refs as filesystem paths when they have explicit path indicators:
return true if filepath.IsAbs(trimmedRef) OR strings.HasPrefix(trimmedRef, "./")
OR strings.HasPrefix(trimmedRef, "../") OR strings.HasPrefix(trimmedRef, "~/")
OR (strings.Contains(trimmedRef, string(os.PathSeparator)) &&
filepath.Dir(trimmedRef) != "."); reference the function isPathLikeWorkspaceRef
and adjust the checks to remove the broad strings.HasPrefix(trimmedRef, ".") and
plain contains path-separator checks so normal workspace names containing "/" or
starting with "." are not misclassified.
In `@internal/httpapi/handlers_test.go`:
- Around line 217-218: The test constructs JSON by concatenating temp paths into
a string (see the body variable near performRequest(t, engine, http.MethodPost,
"/api/workspaces")), which breaks on Windows; replace the raw string concat with
marshaling a struct/map using encoding/json (e.g., build a request value with
fields root_dir, name, add_dirs, default_agent and call json.Marshal) before
calling performRequest; apply the same change to the other occurrences flagged
(around lines 347-348 and 404) to keep tests OS-agnostic.
- Around line 191-416: Collapse the six nearly-identical tests
(TestCreateWorkspaceHandlerRegistersWorkspace,
TestListWorkspacesHandlerReturnsRegisteredRows,
TestGetWorkspaceHandlerReturnsDetail,
TestUpdateWorkspaceHandlerUpdatesWorkspace,
TestDeleteWorkspaceHandlerReturnsNoContent,
TestResolveWorkspaceHandlerReturnsWorkspace) into a single table-driven test
that shares the common setup (homePaths := newTestHomePaths, engine :=
newTestRouter(... newTestHandlersWithWorkspace(...)), and helper calls
performRequest/decodeJSONResponse) and runs each case as a subtest via t.Run;
for each table entry provide only the per-case workspace stub behavior, HTTP
method/path/body, and expected status/response assertions, and invoke the
existing helpers (newTestRouter, newTestHandlersWithWorkspace, performRequest,
decodeJSONResponse) inside the shared setup so the variants only supply
case-specific data and assertions.
In `@internal/httpapi/helpers_test.go`:
- Around line 198-203: The stub's ResolveOrRegister currently returns
workspacepkg.ErrWorkspaceNotFound by default which contradicts its purpose to
create/register a workspace; change the default branch in
stubWorkspaceService.ResolveOrRegister to return a newly created
workspacepkg.ResolvedWorkspace for the supplied path (i.e., a ResolvedWorkspace
instance representing the created workspace tied to the path) and nil error
instead of ErrWorkspaceNotFound so tests exercising implicit registration behave
correctly.
- Around line 156-161: The stubWorkspaceService.Register default behavior is
semantically wrong: instead of returning workspacepkg.ErrWorkspaceNotFound when
no registerFn is provided, change Register (method name: Register on type
stubWorkspaceService) to return a zero-value workspace and nil error or a
distinct sentinel error (e.g., errors.New("stubWorkspaceService: Register not
implemented")); update the function body so when s.registerFn == nil it returns
the chosen default (zero workspace with nil or the new sentinel) rather than
workspacepkg.ErrWorkspaceNotFound to reflect that Register creates resources
rather than looking them up.
In `@internal/httpapi/server.go`:
- Around line 473-480: The CORS configuration still advertises only "GET, POST,
PUT, DELETE, OPTIONS" while you added PATCH routes (workspaces.PATCH("/:id",
handlers.updateWorkspace)), so update the cors middleware to include "PATCH" in
the allowed methods; locate the corsMiddleware (or wherever
Access-Control-Allow-Methods / AllowedMethods is declared) and add "PATCH" so
browser preflight requests for handlers.updateWorkspace succeed.
In `@internal/httpapi/workspaces.go`:
- Around line 100-118: The route getWorkspace currently calls
h.workspaces.Resolve directly with c.Param("id") which allows name/path refs and
causes inconsistency with PATCH/DELETE; instead first fetch the workspace record
by its real ID (e.g. call h.workspaces.Get or the repository method that returns
the workspace by ID using c.Param("id")), handle not-found/error as before, and
then call Resolve (or a ResolveDetails-style method) using the known
workspace.ID to populate Agents/Skills/etc; update subsequent uses such as
filterSessionInfosByWorkspaceID(sessions, resolved.ID) to use the confirmed ID
and keep error handling the same.
In `@internal/memory/dream.go`:
- Around line 265-275: In prepareWorkspace, wrap errors returned from
s.workspaceResolver.Resolve(ctx, trimmedRef) and from
s.memStore.ForWorkspace(resolved.RootDir).EnsureDirs() with operation-level
context using fmt.Errorf (e.g., fmt.Errorf("resolve workspace %q: %w",
trimmedRef, err) and fmt.Errorf("ensure workspace dirs for %q: %w",
resolved.RootDir, err)) so callers get precise, wrapped error traces while
keeping the original errors intact.
In `@internal/observe/helpers_test.go`:
- Around line 349-366: The fakeObserveWorkspaceResolver should validate the
incoming workspace reference instead of always returning the same
ResolvedWorkspace: add an expectedRef (or expectedID) field to
fakeObserveWorkspaceResolver and in both Resolve and ResolveOrRegister compare
the passed string argument to that expected value, returning an error (or a
test-friendly mismatch error) if they differ; otherwise return r.resolved and
r.err as before — update tests to set expectedRef when constructing the fake so
calls that pass empty/root refs will fail.
In `@internal/session/manager_stop_integration_test.go`:
- Around line 192-194: The cleanup currently swallows errors from manager.Stop
by assigning to `_`; change the t.Cleanup closure to capture and assert the
returned error (e.g., call t.Fatalf/t.Helper()+t.Fatalf or use require.NoError)
when calling manager.Stop(testContext(t), resumed.ID) so the test fails if Stop
returns an error and avoids leaking the helper process; update the closure that
references manager.Stop, resumed.ID, and testContext to handle and assert the
error instead of ignoring it.
In `@internal/session/query.go`:
- Around line 201-209: Initialize SessionInfo.Workspace from the persisted
metadata path before attempting resolution: in Manager.sessionInfoFromMeta,
after creating info := sessionInfoFromMeta(meta) set info.Workspace =
meta.WorkspacePath (or the stored path field on store.SessionMeta), then call
m.resolveWorkspaceRoot(ctx, meta.WorkspaceID) and only overwrite info.Workspace
when resolveWorkspaceRoot returns a non-empty workspaceRoot (and handle errors
by logging but not clearing the persisted path). Apply the same pattern to the
other affected call sites noted (around the blocks at 217-218 and 245-257) so
stopped sessions retain the stored workspace_path when resolution fails or
returns "".
In `@internal/session/session.go`:
- Around line 227-248: The inactive-state branch in beginPromptSetup currently
returns a plain fmt.Errorf string which prevents callers from matching
ErrSessionNotActive; change the error return in beginPromptSetup (the check
comparing s.State to StateActive) to wrap ErrSessionNotActive using the %w verb
so callers can use errors.Is(err, ErrSessionNotActive) — e.g. produce a
formatted error that includes the session ID and wraps ErrSessionNotActive; keep
the rest of the function flow the same.
In `@internal/session/transcript_test.go`:
- Around line 217-257: Split
TestParseLooseTranscriptEventBuildsToolResultFromLoosePayload into table-driven
subtests using t.Run: create a slice of test cases (name, setup, expected)
covering the main behavior of parseLooseTranscriptEvent (validate ToolCallID,
ToolName, ToolInput, ToolResult.Stdout, ToolError) as one subtest, and separate
subtests for firstNonEmptyRaw and firstNonNil helper assertions; inside each
subtest call t.Parallel() and assert only that case’s expectations, invoking
parseLooseTranscriptEvent, firstNonEmptyRaw, or firstNonNil as needed and
comparing results to expected values so failures are isolated and parallelizable
while keeping the overall test name
TestParseLooseTranscriptEventBuildsToolResultFromLoosePayload.
In `@internal/store/global_db_test.go`:
- Around line 118-120: The test currently assumes os.Symlink(rootDir,
symlinkPath) will succeed; wrap that call to handle platforms without symlink
privileges by attempting the symlink and if it returns a permission/unsupported
error (or any error) call t.Skipf(...) with a message like "skipping test:
symlink not permitted on this platform" or alternatively fall back to a
non-symlink path (e.g., use rootDir directly or copy to a temp dir) so the rest
of the test using symlinkPath proceeds safely; locate the os.Symlink invocation
and the symlinkPath/temp dir setup in the test file (the variables symlinkPath
and rootDir) and implement the skip-or-fallback logic there.
In `@internal/store/global_db.go`:
- Around line 1083-1097: The function mapWorkspaceConstraintError currently uses
fragile string matching on err.Error(); update it to first attempt
type-asserting or errors.As the underlying SQLite error type (e.g.,
sqlite3.Error or the driver-specific error type) and inspect its Code or
ExtendedCode to detect UNIQUE constraint violations on the workspaces table,
mapping those cases to aghworkspace.ErrWorkspacePathTaken and
aghworkspace.ErrWorkspaceNameTaken respectively; keep the existing
strings.Contains fallback for drivers that don't expose codes so
mapWorkspaceConstraintError still returns the same mapped errors when the
specific error codes are not available.
In `@internal/store/meta_test.go`:
- Line 19: Add assertions to validate the WorkspaceID field in both read-back
checks in the meta_test.go tests: after creating the fixture with WorkspaceID:
"ws-meta", assert that the persisted/read-back Meta struct's WorkspaceID equals
"ws-meta" in both places where the test currently checks other fields; ensure
you reference the WorkspaceID field on the returned object (e.g.,
returnedMeta.WorkspaceID or metaReadBack.WorkspaceID) in each assertion so
serialization/deserialization regressions for WorkspaceID are detected.
In `@internal/store/schema.go`:
- Around line 656-670: The uniqueWorkspaceName function can loop indefinitely;
add a safety limit and deterministic fallback: define a maxAttempts constant
(e.g., 1_000_000) and change the for loop to stop when suffix > maxAttempts, and
if no unused candidate is found by then return a fallback composed from baseName
plus a guaranteed-unique token (e.g., timestamp or random uint64) to avoid an
infinite loop; update references in uniqueWorkspaceName accordingly and ensure
any random/timestamp helper used is imported/seeded where needed.
- Around line 443-450: The CREATE TABLE statements for event_summaries_new,
token_stats_new, and permission_log_new incorrectly reference sessions(id) (and
any other old table names) in their FOREIGN KEY clauses; update those REFERENCES
to point to the new migrated tables (e.g., sessions_new(id)) so the foreign-key
definitions match the newly created tables (modify the REFERENCES in
event_summaries_new, token_stats_new, and permission_log_new to sessions_new or
the appropriate *_new table names).
In `@internal/store/store_helpers_test.go`:
- Around line 549-551: The cleanup currently discards errors from db.Close()
(and similarly tx.Rollback() in the other cleanup) which can hide migration/test
failures; update the t.Cleanup handlers that call db.Close() and tx.Rollback()
to check the returned error and call t.Errorf(...) when err != nil, but treat
sql.ErrTxDone as a non-fatal/ignored case (i.e., do not report sql.ErrTxDone
after a successful commit). Locate the cleanup closures using t.Cleanup and the
symbols db.Close and tx.Rollback to implement this error handling.
In `@internal/udsapi/handlers_test.go`:
- Around line 215-216: The test constructs request bodies by concatenating temp
paths into JSON string literals (e.g., building body using rootDir and addDir
before calling performRequest with engine, http.MethodPost, "/api/workspaces"),
which breaks on Windows backslashes; instead create a request struct or map with
fields like RootDir, Name, AddDirs, DefaultAgent, populate it with
rootDir/addDir, then json.Marshal that value and pass the resulting bytes to
performRequest; apply the same change to the other test locations that build
JSON by string concatenation (the similar cases in this file).
- Around line 189-413: The tests duplicate setup; convert the separate
TestCreateWorkspaceHandlerRegistersWorkspace,
TestListWorkspacesHandlerReturnsRows, TestGetWorkspaceHandlerReturnsDetail,
TestUpdateWorkspaceHandlerUpdatesWorkspace,
TestDeleteWorkspaceHandlerReturnsNoContent, and
TestResolveWorkspaceHandlerReturnsWorkspace into a single table-driven test that
t.Run's subtests. For each table entry include a name, a stubWorkspaceService
(using
registerFn/listFn/resolveFn/getFn/updateFn/unregisterFn/resolveOrRegisterFn as
needed), any stubSessionManager behavior, request method/path/body, expected
HTTP status, and response validation (ID, Name, lengths, etc.), then loop over
entries creating the router via newTestRouter(newTestHandlersWithWorkspace(...))
and invoking performRequest/decodeJSONResponse to assert outcomes; ensure each
case uses its own stub instances (not shared mutable state) and keep common
helpers homePaths, newTestRouter, performRequest, and decodeJSONResponse.
In `@internal/udsapi/handlers.go`:
- Around line 87-98: sessionEventPayload's WorkspaceID and WorkspacePath are
never set because sessionEventPayloadFromEvent currently only copies persisted
event fields and streamSession's synthetic "session_stopped" event doesn't
populate them; update sessionEventPayloadFromEvent to copy WorkspaceID and
WorkspacePath from the source event (or its associated session/context) into the
sessionEventPayload struct, and ensure streamSession sets WorkspaceID and
WorkspacePath on the synthetic session_stopped payload using the same
session/context values so SSE and /sessions/:id/events include workspace
context.
In `@internal/udsapi/helpers_test.go`:
- Around line 189-194: The stubWorkspaceService.ResolveOrRegister default
currently returns workspacepkg.ErrWorkspaceNotFound which makes tests unable to
simulate successful registration; modify the default branch in
stubWorkspaceService.ResolveOrRegister (the path where resolveOrRegisterFn ==
nil) to return a constructed workspacepkg.ResolvedWorkspace representing a
newly-registered workspace (e.g., set Path to the incoming path and any minimal
required fields such as ID) and a nil error instead of the ErrWorkspaceNotFound;
keep the resolveOrRegisterFn override behavior unchanged.
- Around line 137-194: The stubWorkspaceService test double is duplicated across
httpapi/helpers_test.go and udsapi/helpers_test.go; extract it into a shared
test helper (e.g., internal/testutil) and update callers to import and use the
shared stub. Move the type stubWorkspaceService and its methods (Register,
Unregister, Update, List, Get, Resolve, ResolveOrRegister) into the new package,
keep the same exported or package-visible names, and update both test files to
reference the centralized stub to remove duplication and keep behavior
consistent.
- Around line 147-152: The stub method Register currently returns
workspacepkg.ErrWorkspaceNotFound by default which is semantically wrong for an
unimplemented stub; change the default return in stubWorkspaceService.Register
to return a clear "not implemented" error (e.g. workspacepkg.ErrNotImplemented)
instead of ErrWorkspaceNotFound, and if that error constant/type doesn't exist
add it to the workspacepkg package; keep the existing behavior of calling
s.registerFn when non-nil.
In `@internal/workspace/options.go`:
- Around line 70-80: resolveOptions currently calls aghconfig.ResolveHomePaths
and sets a default loadConfig before applying Option values, so WithHomePaths
can't override the default; change resolveOptions to first construct
resolverOptions, apply incoming opts (e.g. the WithHomePaths setter) to mutate
resolved, then if resolved.homePaths is nil call aghconfig.ResolveHomePaths and
wrap any error with fmt.Errorf("workspace: %w", err), and if resolved.loadConfig
is nil set it to a loader that uses aghconfig.LoadForHome(resolved.homePaths,
aghconfig.WithWorkspaceRoot(rootDir)) so the injected home paths are honored;
update references to the loadConfig default initialization in resolveOptions
accordingly.
In `@internal/workspace/resolver.go`:
- Around line 473-515: The refreshRootDir and canonicalRoot functions duplicate
symlink evaluation, Abs resolution and directory existence/IsDir checks; extract
that shared logic into a new helper function (e.g.,
validateAndCanonicalizeDir(ctx context.Context, path string) (string, error))
and have refreshRootDir and canonicalRoot call it; ensure the helper returns
ErrWorkspaceRootMissing for non-existent paths and preserves the same wrapped
error messages used by refreshRootDir/canonicalRoot, then update refreshRootDir
to use the returned canonicalDir before cloning/updating the workspace (preserve
use of cloneWorkspace, r.store.UpdateWorkspace, r.now(), and r.Invalidate).
- Around line 1064-1078: The generateID function currently falls back to a
timestamp-only ID when rand.Read fails, which can collide under sustained
failures; modify generateID to (1) log a warning when the crypto fallback path
is taken (use the package logger or log.Printf) and (2) append a process-wide
atomic counter to the timestamp to make IDs unique under concurrency—add a
package-level uint64 (e.g., fallbackSeq) and use atomic.AddUint64(&fallbackSeq,
1) when constructing the fallback ID; also import sync/atomic and log (or the
existing logger) so the code both warns and produces a timestamp_counter-based
ID in the rand.Read error branch.
- Around line 399-422: The retry loop that handles ErrWorkspaceNameTaken in the
block around r.store.InsertWorkspace can spin indefinitely under heavy
collision; add a bounded retry counter (e.g., maxRetries = 100) inside that loop
and increment it each time you regenerate a name via r.nextWorkspaceName; if the
counter exceeds the limit return a clear error (wrap with fmt.Errorf) instead of
continuing, making sure to preserve existing behavior of updating
ws.ID/Name/CreatedAt/UpdatedAt when retrying and still checking
checkContext(ctx) each iteration.
- Around line 447-448: lookupWorkspace currently accepts both "ws_" and "ws-"
but generateID only produces "ws_<hex>" (generateID), so align formats by
restricting lookupWorkspace to the generated format: change the switch in
lookupWorkspace to only check strings.HasPrefix(target, "ws_"), remove the "ws-"
branch, update any affected unit tests and callers that expect "ws-" IDs, and
add a short comment on lookupWorkspace noting that IDs are produced by
generateID and use the "ws_" prefix.
In `@internal/workspace/workspace_test.go`:
- Around line 79-125: Refactor TestWorkspaceZeroValues and
TestResolvedWorkspaceZeroValue into table-driven subtests: create slices of test
cases (name, getter closure or accessor, expected zero value) for
workspace.Workspace fields and for workspace.ResolvedWorkspace fields (including
nested aghconfig.Config and slices like Agents, Skills), then loop over each
case calling t.Run(case.name, func(t *testing.T){ t.Parallel(); if
!reflect.DeepEqual(case.get(), case.expected) { t.Fatalf(...) } }); keep
existing comparisons (string emptiness, IsZero for times, reflect.DeepEqual for
structs/slices) but centralize them into the table-driven pattern and ensure
each subtest runs in parallel.
In `@web/src/routes/_app/-session`.$id.test.tsx:
- Around line 81-94: Test doesn't assert that session.workspace_id maps to
ChatHeader.workspaceName; update the test in -session.$id.test.tsx to render the
route (using the existing render call) and assert the mocked workspace name
("alpha") appears where ChatHeader should show workspaceName (or assert
ChatHeader received the prop) so the useWorkspaces mock is validated; reference
the useWorkspaces mock, session.workspace_id value, the render invocation in
this test, and the ChatHeader component when adding the assertion.
In `@web/src/systems/agent/components/agent-sidebar-group.test.tsx`:
- Around line 102-106: The test for AgentSidebarGroup currently only asserts the
button is disabled; update it to also verify that no callback is invoked by
passing a jest.fn() as onNewSession to the rendered <AgentSidebarGroup
agent={mockAgent} newSessionDisabled={true} onNewSession={onNewSessionMock} />
and then simulate a click on the element with test id "sidebar-group-action"
(e.g., via userEvent.click or fireEvent.click) and assert that onNewSessionMock
was not called; this ensures both presentation and behavior are covered.
In `@web/src/systems/session/adapters/session-api.ts`:
- Around line 15-23: The fetchSessions function treats an empty string workspace
as a valid filter, causing requests to hit /api/sessions?workspace=; modify
fetchSessions so that blank strings are treated as "no filter" by checking
workspace for null/undefined or empty (e.g., workspace == null || workspace ===
"") before building the URL, and only append the ?workspace=... query when
workspace is a non-empty string; update the URL construction logic in
fetchSessions accordingly.
In `@web/src/systems/session/hooks/use-session-actions.ts`:
- Around line 16-21: The cache invalidation currently in the useMutation
onSuccess block should be moved to an onSettled handler: remove
queryClient.invalidateQueries from onSuccess (keep navigate({ to:
"/session/$id", params: { id: session.id } }) in onSuccess to preserve
redirect), add an onSettled callback on the same useMutation (signature like
onSettled: (data, error, variables, context) => { ... }) and call
queryClient.invalidateQueries({ queryKey: sessionKeys.lists() }) there so
TanStack Query cache is always invalidated after createSession regardless of
outcome.
In `@web/src/systems/session/lib/query-keys.ts`:
- Around line 3-4: The cache key sentinel currently uses the string "all" which
can collide with a real workspace named "all"; update the sessionKeys functions
to use null as the unfiltered sentinel instead: modify sessionKeys.list to
return [...sessionKeys.lists(), workspace ?? null] (keeping sessionKeys.lists
and sessionKeys.all hierarchical shape) and ensure any consumers expect null for
the global/unfiltered key so hierarchical query keys in lib/query-keys.ts remain
consistent for granular cache invalidation.
In `@web/src/systems/workspace/adapters/workspace-api.ts`:
- Line 1: The import in workspace-api.ts uses a relative path; update it to use
the project alias mapping (`@/`) instead of a relative path so it follows the
frontend convention — replace the current import that brings in
workspaceResponseSchema, workspacesResponseSchema and WorkspacePayload from
"../types" with an equivalent import via the "@/..." alias (matching the ./src/*
mapping) that points to the same types module; ensure the imported symbol names
remain unchanged.
- Around line 3-35: Create typed adapter errors and throw them instead of raw
Error/ZodError: add two exported classes (e.g., WorkspaceApiHttpError and
WorkspaceApiParseError) and update fetchWorkspaces and resolveWorkspace to catch
non-OK responses and parsing failures, wrapping HTTP failures with
WorkspaceApiHttpError (include status and response text/body) and Zod parse
failures with WorkspaceApiParseError (include original ZodError). Ensure the
functions still return WorkspacePayload(s), preserve existing behavior for
successful responses, and update error throws in workspaceResponseSchema.parse
and workspacesResponseSchema.parse paths to rethrow the wrapped errors so
callers can distinguish HTTP vs. schema issues.
In `@web/src/systems/workspace/components/workspace-selector.tsx`:
- Around line 18-28: The component currently falls back to workspaces[0] which
makes the selector uncontrolled relative to the parent; update the logic around
selectedWorkspace and the NativeSelect value so the component strictly reflects
the passed-in value (keep selectedWorkspace = workspaces.find(w => w.id ===
value) ?? null), remove the fallback to workspaces[0], and ensure NativeSelect
uses selectedWorkspace?.id ?? "" so an explicit empty state is rendered when
value is null/stale; keep onValueChange and disabled behavior unchanged so the
parent must supply the initial selection and orchestration remains outside this
presentational component.
In `@web/src/systems/workspace/hooks/use-workspaces.ts`:
- Around line 14-18: Replace the current onSuccess-only invalidation with an
onSettled handler and add optimistic-update handlers: in the useMutation call
that wraps resolveWorkspace, implement onMutate to take a snapshot of the
current list via queryClient.getQueryData(workspaceKeys.lists()), apply
optimistic changes with queryClient.setQueryData, and return the snapshot as
context; implement onError to rollback by restoring the snapshot returned from
onMutate (using queryClient.setQueryData) when the mutation fails; finally use
onSettled (not onSuccess) to unconditionally call
queryClient.invalidateQueries({ queryKey: workspaceKeys.lists() }) so cache is
refreshed in all cases.
In `@web/src/systems/workspace/lib/query-keys.ts`:
- Around line 3-4: The two keys are identical; change workspaceKeys.lists to
produce a "lists" level (e.g. [...workspaceKeys.all, "lists"]) and make
workspaceKeys.list accept a list id (e.g. list: (id) =>
[...workspaceKeys.lists(), id]) so that list() yields a more specific key for a
single list; keep the "as const" typing and update any callers to pass the id to
workspaceKeys.list.
---
Outside diff comments:
In `@internal/httpapi/httpapi_integration_test.go`:
- Around line 76-83: The test reads created.Session from the create response but
never asserts created.Session.WorkspaceID (or WorkspacePath) before using it in
the subsequent filtered GET, so the filter can pass spuriously; update the test
around the session creation (the local variable created of type containing
sessionPayload and the created.Session references) to assert that
created.Session.WorkspaceID is non-empty (fail fast) and also assert the
returned created.Session.WorkspacePath (or workspace_path) is as expected before
calling /api/sessions?workspace=<...>, then use that WorkspaceID in the filter
request to validate the workspace-scoped results; apply the same assertions to
the other session-creation/assertion block that follows.
In `@internal/memory/dream_test.go`:
- Around line 242-363: Combine the three similar tests
(TestServiceRunCallsSessionSpawnerWithGoalPromptAndWorkspaceID,
TestServiceRunRequiresWorkspaceResolverForExplicitWorkspace,
TestServiceRunResolvesWorkspaceRefBeforeSpawn) into a single table-driven test
with subtests using t.Run: define a slice of cases each with a name and fields
for inputs (e.g., workspaceID/alias, WithGoal, WithWorkspaceResolver or nil,
memory dir, stubLock behavior) and expected outcomes (expectedGoal,
expectedPrompt, expectedWorkspace, expectErrorContains, expectedLockCalls), then
iterate cases and for each create the Service with NewService(...) using the
case's options, call service.Run(...) with a spawn func that captures
goal/prompt/workspace, assert per-case expectations (errors, captured values,
resolver resolveCalls, lock.tryAcquireCalls/releaseCalls/rollbackCalls, and
workspace dir existence where applicable). Keep the existing helper types
(stubLock, fakeDreamWorkspaceResolver), ConsolidationPrompt(), NewStore, and
testContext(t) usage to minimize refactor surface.
In `@internal/observe/observer.go`:
- Around line 352-367: The code currently discards resolvedWorkspace returned by
resolver.Resolve and rebuilds state via aghconfig.LoadForHome and LoadAgentDef,
which loses resolvedWorkspace.AdditionalDirs and workspace-local AGENT.md
overrides; change the flow in observer.go to use the resolved workspace payload
(resolvedWorkspace.Config and resolvedWorkspace.Agents) when deriving agent
permissions and resolving the agent instead of reloading from home paths — e.g.
after resolver.Resolve(ctx, workspaceID) pass resolvedWorkspace.Config into the
config resolution or merge it with cfg and use resolvedWorkspace.Agents (or
compute/persist the permission mode on session start) so that
cfg.ResolveAgent/ResolveAgent calls derive permissions from the effective
workspace state rather than the home-only LoadForHome/LoadAgentDef results.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: ASSERTIVE
Plan: Pro
Run ID: aeb23a36-1458-4395-8b6c-ca04e376fe8c
⛔ Files ignored due to path filters (41)
.compozy/tasks/skills-system/_meta.mdis excluded by!**/*.md.compozy/tasks/workspace-entity/_meta.mdis excluded by!**/*.md.compozy/tasks/workspace-entity/_tasks.mdis excluded by!**/*.md.compozy/tasks/workspace-entity/_techspec.mdis excluded by!**/*.md.compozy/tasks/workspace-entity/adrs/adr-001.mdis excluded by!**/*.md.compozy/tasks/workspace-entity/adrs/adr-002.mdis excluded by!**/*.md.compozy/tasks/workspace-entity/adrs/adr-003.mdis excluded by!**/*.md.compozy/tasks/workspace-entity/adrs/adr-004.mdis excluded by!**/*.md.compozy/tasks/workspace-entity/memory/MEMORY.mdis excluded by!**/*.md.compozy/tasks/workspace-entity/memory/task_01.mdis excluded by!**/*.md.compozy/tasks/workspace-entity/memory/task_02.mdis excluded by!**/*.md.compozy/tasks/workspace-entity/memory/task_03.mdis excluded by!**/*.md.compozy/tasks/workspace-entity/memory/task_04.mdis excluded by!**/*.md.compozy/tasks/workspace-entity/memory/task_05.mdis excluded by!**/*.md.compozy/tasks/workspace-entity/memory/task_06.mdis excluded by!**/*.md.compozy/tasks/workspace-entity/memory/task_07.mdis excluded by!**/*.md.compozy/tasks/workspace-entity/memory/task_08.mdis excluded by!**/*.md.compozy/tasks/workspace-entity/memory/task_09.mdis excluded by!**/*.md.compozy/tasks/workspace-entity/memory/task_10.mdis excluded by!**/*.md.compozy/tasks/workspace-entity/memory/task_11.mdis excluded by!**/*.md.compozy/tasks/workspace-entity/memory/task_12.mdis excluded by!**/*.md.compozy/tasks/workspace-entity/memory/task_13.mdis excluded by!**/*.md.compozy/tasks/workspace-entity/reviews-001/_meta.mdis excluded by!**/*.md.compozy/tasks/workspace-entity/reviews-001/issue_001.mdis excluded by!**/*.md.compozy/tasks/workspace-entity/reviews-001/issue_002.mdis excluded by!**/*.md.compozy/tasks/workspace-entity/reviews-001/issue_003.mdis excluded by!**/*.md.compozy/tasks/workspace-entity/reviews-001/issue_004.mdis excluded by!**/*.md.compozy/tasks/workspace-entity/task_01.mdis excluded by!**/*.md.compozy/tasks/workspace-entity/task_02.mdis excluded by!**/*.md.compozy/tasks/workspace-entity/task_03.mdis excluded by!**/*.md.compozy/tasks/workspace-entity/task_04.mdis excluded by!**/*.md.compozy/tasks/workspace-entity/task_05.mdis excluded by!**/*.md.compozy/tasks/workspace-entity/task_06.mdis excluded by!**/*.md.compozy/tasks/workspace-entity/task_07.mdis excluded by!**/*.md.compozy/tasks/workspace-entity/task_08.mdis excluded by!**/*.md.compozy/tasks/workspace-entity/task_09.mdis excluded by!**/*.md.compozy/tasks/workspace-entity/task_10.mdis excluded by!**/*.md.compozy/tasks/workspace-entity/task_11.mdis excluded by!**/*.md.compozy/tasks/workspace-entity/task_12.mdis excluded by!**/*.md.compozy/tasks/workspace-entity/task_13.mdis excluded by!**/*.mddocs/plans/2026-04-06-workspace-entity-design.mdis excluded by!**/*.md
📒 Files selected for processing (115)
internal/acp/client.gointernal/acp/client_test.gointernal/acp/handlers.gointernal/acp/handlers_test.gointernal/acp/types.gointernal/apisupport/session_workspace.gointernal/cli/cli_integration_test.gointernal/cli/client.gointernal/cli/client_test.gointernal/cli/command_paths_test.gointernal/cli/format_test.gointernal/cli/helpers_test.gointernal/cli/install_test.gointernal/cli/render_test.gointernal/cli/root.gointernal/cli/session.gointernal/cli/session_test.gointernal/cli/skill.gointernal/cli/workspace.gointernal/cli/workspace_test.gointernal/config/agent.gointernal/config/agent_test.gointernal/config/config.gointernal/config/config_test.gointernal/daemon/composed_assembler.gointernal/daemon/composed_assembler_test.gointernal/daemon/daemon.gointernal/daemon/daemon_integration_test.gointernal/daemon/daemon_test.gointernal/httpapi/handlers_error_test.gointernal/httpapi/handlers_test.gointernal/httpapi/helpers_test.gointernal/httpapi/httpapi_integration_test.gointernal/httpapi/server.gointernal/httpapi/server_test.gointernal/httpapi/sessions.gointernal/httpapi/stream.gointernal/httpapi/stream_helpers_test.gointernal/httpapi/workspaces.gointernal/memory/assembler.gointernal/memory/assembler_test.gointernal/memory/dream.gointernal/memory/dream_test.gointernal/observe/helpers_test.gointernal/observe/observer.gointernal/observe/observer_test.gointernal/observe/reconcile_test.gointernal/session/additional_test.gointernal/session/interfaces.gointernal/session/manager.gointernal/session/manager_integration_test.gointernal/session/manager_stop_integration_test.gointernal/session/manager_test.gointernal/session/prompt_provider.gointernal/session/query.gointernal/session/query_test.gointernal/session/session.gointernal/session/transcript_test.gointernal/skills/catalog.gointernal/skills/catalog_test.gointernal/skills/registry.gointernal/skills/registry_test.gointernal/skills/types.gointernal/store/global_db.gointernal/store/global_db_test.gointernal/store/meta_test.gointernal/store/schema.gointernal/store/store.gointernal/store/store_helpers_test.gointernal/udsapi/handlers.gointernal/udsapi/handlers_error_test.gointernal/udsapi/handlers_test.gointernal/udsapi/helpers_test.gointernal/udsapi/routes.gointernal/udsapi/server.gointernal/udsapi/server_test.gointernal/udsapi/udsapi_integration_test.gointernal/udsapi/workspaces.gointernal/workspace/options.gointernal/workspace/resolver.gointernal/workspace/resolver_integration_test.gointernal/workspace/resolver_test.gointernal/workspace/store.gointernal/workspace/workspace.gointernal/workspace/workspace_test.goweb/src/components/app-sidebar.test.tsxweb/src/components/app-sidebar.tsxweb/src/routes/_app/-session.$id.test.tsxweb/src/routes/_app/session.$id.tsxweb/src/systems/agent/components/agent-sidebar-group.test.tsxweb/src/systems/agent/components/agent-sidebar-group.tsxweb/src/systems/session/adapters/session-api.test.tsweb/src/systems/session/adapters/session-api.tsweb/src/systems/session/components/chat-header.test.tsxweb/src/systems/session/components/chat-header.tsxweb/src/systems/session/components/session-sidebar-item.test.tsxweb/src/systems/session/components/session-sidebar-item.tsxweb/src/systems/session/hooks/use-session-actions.tsweb/src/systems/session/hooks/use-sessions.test.tsxweb/src/systems/session/hooks/use-sessions.tsweb/src/systems/session/lib/query-keys.tsweb/src/systems/session/lib/query-options.tsweb/src/systems/session/types.test.tsweb/src/systems/session/types.tsweb/src/systems/workspace/adapters/workspace-api.test.tsweb/src/systems/workspace/adapters/workspace-api.tsweb/src/systems/workspace/components/workspace-selector.test.tsxweb/src/systems/workspace/components/workspace-selector.tsxweb/src/systems/workspace/hooks/use-workspaces.test.tsxweb/src/systems/workspace/hooks/use-workspaces.tsweb/src/systems/workspace/index.tsweb/src/systems/workspace/lib/query-keys.tsweb/src/systems/workspace/lib/query-options.tsweb/src/systems/workspace/types.test.tsweb/src/systems/workspace/types.ts
## Release v0.0.1 This PR prepares the release of version v0.0.1. ### Changelog ## 0.0.1 - 2026-05-26 ### Other Changes - Lessons learned ### ♻️ Refactoring - Project structure (#7) - Kb improvements (#12) - Rename spaces to channels (#17) - Add extensions gaps (#21) - Improve tool calls ui (#22) - Remove web app header - Module improvements (#29) - Memory improvements (#35) - Storybook for web and ui (#38) - Enable AGH network by default for new installs (#57) - Hermes adjustments (#69) - Badges design (#84) - Storybook scenario and logos gallery - Migrate typescript tests (#114) - Internal go packages (#120) - Ui patterns (#127) - Improve e2e tests (#130) - Ui redesign - Workspace isolation across runtime surfaces (#145) - Prod ready applies (#162) - Tool card ui (#164) - Alpha on logo - Prod ready features (#167) - Thread sheet (#202) ### 🎉 Features - Implement config foundation packages - Implement sqlite store package - Add ACP client package - Add session lifecycle manager - Implement observe package - Add daemon composition root - Add uds api server - Implement cli package - Add http api server - Add system design - Add foundation types, schemas, and layout shell for web client - Add daemon health polling and agent sidebar systems for web client - Add session system CRUD, streaming core, and session store for web client - Add chat view, messages, and composer tests for web client - Add tool cards and renderers for web client - Add file-backed memory store core - Scaffold memory session seams - Add memory dream consolidation service - Wire memory assembler into daemon - Add memory api and cli - New skills system (#1) - Add workspace entity (#5) - Add new skill capabilities (#8) - Web ui v2 (#9) - Improve hooks system (#10) - Session resilience (#11) - Add extensability (#13) - Add automation (#16) - Add channels (#14) - Add network implementation (#15) - Add network, bridges and automations web pages (#18) - Ext registry (#20) - Add core tasks (#19) - Bridge adapters (#23) - Add site (#26) - Add ext refac and sandbox (#25) - Settings ui (#37) - Tasks ui (#36) - Harness improvements (#44) - Agent capabilities (#49) - Redesign ui (#48) - Unify capability (#53) - Redesign network workspace (#59) - Add task deletion and split session delete from stop (#58) - Session provider selection (#60) - Production grade adjustments (#66) - Autonomous system (#75) - Add agent session route (#80) - Tools registry (#85) - Agents soul (#88) - Add network threads (#105) - Orchestration improvements (#106) - Memory v2 (#108) - Agent categories (#113) - Providers model (#118) - Add canonical AGH bundled skill (#143) - Onboarding and improvements (#198) - Onboarding and improvements (#201) ### 🐛 Bug Fixes - Review round - Review rounds - Resolve memory extensibility review batch - Embed web into daemon - Defaults agents - Acp integration (#4) - Lint errors - Prd folder - Remove orphan web actions and dead surfaces (#55) - Qa testing and fixes (#73) - New review rounds (#82) - Security audit (#90) - Release qa round (#95) - Add missing tools (#141) - New qa round (#147) - Advanced qa round (#149) - Homebrew tap - Final review round (#151) - Daemon healthy - Reasoning models (#158) - Lint errors (#160) - Review round (#168) - Release adjustments (#171) - Stabilize release ci fixtures - Stabilize release integration gate - Stabilize release verify gates - Stabilize release integration flows - Stabilize release verify gates - Stabilize main verify shutdown - Ignore stale acpmock cancel - Marketplace search focus and filtering (#193) - Website video - Workspace command select ### 📚 Documentation - Update agents.md - Update prd - Update skills - Update compozy tasks - Update compozy - Update compozy - Add new skills - Archive prd - Update prds - Update rfc - Update prds - Update prds - Add automation prd - Channels prd - Update prd - Update prd - New prds - Archive prds - Bridges adapters prd - Sandbox prd - Update - Archive prd - Update - Add new prd - New design - Update prd - Archive prds - Update prds - Tasks-ui prd tasks - Update prd - Update design docs - Agent capabilities prd - Improve site docs - Remove old design references - Udpate - Autonomous prd - Update skills - Blog design - Agent sould prd - Final qa plan - Update - Remove codex ledgers from gitignore - Remove not needed files - Udpate ledger - Update cy-codex-loop skill - Orchestration improves prd - Update prds - Orch improvs prd - Memv2 prd - Providers model prd - Update refacs prd - New design proposal - Update rules - Update skills - New blog posts (#173) - Format docs - Remove old design files - Remove old - Skeeper update ### 📦 Build System - Initial structure - Commitlint - Frontend base structure - Update vscode settings - Add subagents - Coderabbit - Prd and tooling - Bun lock - Lint tooling - Copy.md and tooling adjusts - Add repoclone rc - Upgrade skeeper to v0.2.0 - Update go.mod - Adopt task artifacts into skeeper - Sync codex plans with skeeper - Skeeper lock - Skeeper lock - New skills - Skeeper lock - Skeeper lock - Skeeper lock - Update deps and go - Regenerate daytona sidecar assets for go 1.26.3 - Fix cliff - Ignore docs on fmt - Build web assets before goreleaser - Extend release dry-run timeout ### 🔧 CI/CD - Lint errors - Fint release pr - Fix goreleaser ### 🧪 Testing - Add e2e tests (#27) - Qa rounds (#78) - Improve test suite (#138) - Harden daemon-served restart reloads - Harden daemon-served readiness waits - Stabilize dashboard focus assertion - Stabilize release integration gates - Stabilize release e2e markers - Stabilize release e2e flows Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
## Release v0.0.1 This PR prepares the release of version v0.0.1. ### Changelog ## 0.0.1 - 2026-05-26 ### Other Changes - Lessons learned ### ♻️ Refactoring - Project structure (#7) - Kb improvements (#12) - Rename spaces to channels (#17) - Add extensions gaps (#21) - Improve tool calls ui (#22) - Remove web app header - Module improvements (#29) - Memory improvements (#35) - Storybook for web and ui (#38) - Enable AGH network by default for new installs (#57) - Hermes adjustments (#69) - Badges design (#84) - Storybook scenario and logos gallery - Migrate typescript tests (#114) - Internal go packages (#120) - Ui patterns (#127) - Improve e2e tests (#130) - Ui redesign - Workspace isolation across runtime surfaces (#145) - Prod ready applies (#162) - Tool card ui (#164) - Alpha on logo - Prod ready features (#167) - Thread sheet (#202) ### 🎉 Features - Implement config foundation packages - Implement sqlite store package - Add ACP client package - Add session lifecycle manager - Implement observe package - Add daemon composition root - Add uds api server - Implement cli package - Add http api server - Add system design - Add foundation types, schemas, and layout shell for web client - Add daemon health polling and agent sidebar systems for web client - Add session system CRUD, streaming core, and session store for web client - Add chat view, messages, and composer tests for web client - Add tool cards and renderers for web client - Add file-backed memory store core - Scaffold memory session seams - Add memory dream consolidation service - Wire memory assembler into daemon - Add memory api and cli - New skills system (#1) - Add workspace entity (#5) - Add new skill capabilities (#8) - Web ui v2 (#9) - Improve hooks system (#10) - Session resilience (#11) - Add extensability (#13) - Add automation (#16) - Add channels (#14) - Add network implementation (#15) - Add network, bridges and automations web pages (#18) - Ext registry (#20) - Add core tasks (#19) - Bridge adapters (#23) - Add site (#26) - Add ext refac and sandbox (#25) - Settings ui (#37) - Tasks ui (#36) - Harness improvements (#44) - Agent capabilities (#49) - Redesign ui (#48) - Unify capability (#53) - Redesign network workspace (#59) - Add task deletion and split session delete from stop (#58) - Session provider selection (#60) - Production grade adjustments (#66) - Autonomous system (#75) - Add agent session route (#80) - Tools registry (#85) - Agents soul (#88) - Add network threads (#105) - Orchestration improvements (#106) - Memory v2 (#108) - Agent categories (#113) - Providers model (#118) - Add canonical AGH bundled skill (#143) - Onboarding and improvements (#198) - Onboarding and improvements (#201) ### 🐛 Bug Fixes - Review round - Review rounds - Resolve memory extensibility review batch - Embed web into daemon - Defaults agents - Acp integration (#4) - Lint errors - Prd folder - Remove orphan web actions and dead surfaces (#55) - Qa testing and fixes (#73) - New review rounds (#82) - Security audit (#90) - Release qa round (#95) - Add missing tools (#141) - New qa round (#147) - Advanced qa round (#149) - Homebrew tap - Final review round (#151) - Daemon healthy - Reasoning models (#158) - Lint errors (#160) - Review round (#168) - Release adjustments (#171) - Stabilize release ci fixtures - Stabilize release integration gate - Stabilize release verify gates - Stabilize release integration flows - Stabilize release verify gates - Stabilize main verify shutdown - Ignore stale acpmock cancel - Marketplace search focus and filtering (#193) - Website video - Workspace command select ### 📚 Documentation - Update agents.md - Update prd - Update skills - Update compozy tasks - Update compozy - Update compozy - Add new skills - Archive prd - Update prds - Update rfc - Update prds - Update prds - Add automation prd - Channels prd - Update prd - Update prd - New prds - Archive prds - Bridges adapters prd - Sandbox prd - Update - Archive prd - Update - Add new prd - New design - Update prd - Archive prds - Update prds - Tasks-ui prd tasks - Update prd - Update design docs - Agent capabilities prd - Improve site docs - Remove old design references - Udpate - Autonomous prd - Update skills - Blog design - Agent sould prd - Final qa plan - Update - Remove codex ledgers from gitignore - Remove not needed files - Udpate ledger - Update cy-codex-loop skill - Orchestration improves prd - Update prds - Orch improvs prd - Memv2 prd - Providers model prd - Update refacs prd - New design proposal - Update rules - Update skills - New blog posts (#173) - Format docs - Remove old design files - Remove old - Skeeper update ### 📦 Build System - Initial structure - Commitlint - Frontend base structure - Update vscode settings - Add subagents - Coderabbit - Prd and tooling - Bun lock - Lint tooling - Copy.md and tooling adjusts - Add repoclone rc - Upgrade skeeper to v0.2.0 - Update go.mod - Adopt task artifacts into skeeper - Sync codex plans with skeeper - Skeeper lock - Skeeper lock - New skills - Skeeper lock - Skeeper lock - Skeeper lock - Update deps and go - Regenerate daytona sidecar assets for go 1.26.3 - Fix cliff - Ignore docs on fmt - Build web assets before goreleaser - Extend release dry-run timeout ### 🔧 CI/CD - Lint errors - Fint release pr - Fix goreleaser - Fix release ### 🧪 Testing - Add e2e tests (#27) - Qa rounds (#78) - Improve test suite (#138) - Harden daemon-served restart reloads - Harden daemon-served readiness waits - Stabilize dashboard focus assertion - Stabilize release integration gates - Stabilize release e2e markers - Stabilize release e2e flows Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
## Release v0.0.2 This PR prepares the release of version v0.0.2. ### Changelog ## 0.0.2 - 2026-05-26 ### Other Changes - Lessons learned ### ♻️ Refactoring - Project structure (#7) - Kb improvements (#12) - Rename spaces to channels (#17) - Add extensions gaps (#21) - Improve tool calls ui (#22) - Remove web app header - Module improvements (#29) - Memory improvements (#35) - Storybook for web and ui (#38) - Enable AGH network by default for new installs (#57) - Hermes adjustments (#69) - Badges design (#84) - Storybook scenario and logos gallery - Migrate typescript tests (#114) - Internal go packages (#120) - Ui patterns (#127) - Improve e2e tests (#130) - Ui redesign - Workspace isolation across runtime surfaces (#145) - Prod ready applies (#162) - Tool card ui (#164) - Alpha on logo - Prod ready features (#167) - Thread sheet (#202) ### 🎉 Features - Implement config foundation packages - Implement sqlite store package - Add ACP client package - Add session lifecycle manager - Implement observe package - Add daemon composition root - Add uds api server - Implement cli package - Add http api server - Add system design - Add foundation types, schemas, and layout shell for web client - Add daemon health polling and agent sidebar systems for web client - Add session system CRUD, streaming core, and session store for web client - Add chat view, messages, and composer tests for web client - Add tool cards and renderers for web client - Add file-backed memory store core - Scaffold memory session seams - Add memory dream consolidation service - Wire memory assembler into daemon - Add memory api and cli - New skills system (#1) - Add workspace entity (#5) - Add new skill capabilities (#8) - Web ui v2 (#9) - Improve hooks system (#10) - Session resilience (#11) - Add extensability (#13) - Add automation (#16) - Add channels (#14) - Add network implementation (#15) - Add network, bridges and automations web pages (#18) - Ext registry (#20) - Add core tasks (#19) - Bridge adapters (#23) - Add site (#26) - Add ext refac and sandbox (#25) - Settings ui (#37) - Tasks ui (#36) - Harness improvements (#44) - Agent capabilities (#49) - Redesign ui (#48) - Unify capability (#53) - Redesign network workspace (#59) - Add task deletion and split session delete from stop (#58) - Session provider selection (#60) - Production grade adjustments (#66) - Autonomous system (#75) - Add agent session route (#80) - Tools registry (#85) - Agents soul (#88) - Add network threads (#105) - Orchestration improvements (#106) - Memory v2 (#108) - Agent categories (#113) - Providers model (#118) - Add canonical AGH bundled skill (#143) - Onboarding and improvements (#198) - Onboarding and improvements (#201) ### 🐛 Bug Fixes - Review round - Review rounds - Resolve memory extensibility review batch - Embed web into daemon - Defaults agents - Acp integration (#4) - Lint errors - Prd folder - Remove orphan web actions and dead surfaces (#55) - Qa testing and fixes (#73) - New review rounds (#82) - Security audit (#90) - Release qa round (#95) - Add missing tools (#141) - New qa round (#147) - Advanced qa round (#149) - Homebrew tap - Final review round (#151) - Daemon healthy - Reasoning models (#158) - Lint errors (#160) - Review round (#168) - Release adjustments (#171) - Stabilize release ci fixtures - Stabilize release integration gate - Stabilize release verify gates - Stabilize release integration flows - Stabilize release verify gates - Stabilize main verify shutdown - Ignore stale acpmock cancel - Marketplace search focus and filtering (#193) - Website video - Workspace command select ### 📚 Documentation - Update agents.md - Update prd - Update skills - Update compozy tasks - Update compozy - Update compozy - Add new skills - Archive prd - Update prds - Update rfc - Update prds - Update prds - Add automation prd - Channels prd - Update prd - Update prd - New prds - Archive prds - Bridges adapters prd - Sandbox prd - Update - Archive prd - Update - Add new prd - New design - Update prd - Archive prds - Update prds - Tasks-ui prd tasks - Update prd - Update design docs - Agent capabilities prd - Improve site docs - Remove old design references - Udpate - Autonomous prd - Update skills - Blog design - Agent sould prd - Final qa plan - Update - Remove codex ledgers from gitignore - Remove not needed files - Udpate ledger - Update cy-codex-loop skill - Orchestration improves prd - Update prds - Orch improvs prd - Memv2 prd - Providers model prd - Update refacs prd - New design proposal - Update rules - Update skills - New blog posts (#173) - Format docs - Remove old design files - Remove old - Skeeper update ### 📦 Build System - Initial structure - Commitlint - Frontend base structure - Update vscode settings - Add subagents - Coderabbit - Prd and tooling - Bun lock - Lint tooling - Copy.md and tooling adjusts - Add repoclone rc - Upgrade skeeper to v0.2.0 - Update go.mod - Adopt task artifacts into skeeper - Sync codex plans with skeeper - Skeeper lock - Skeeper lock - New skills - Skeeper lock - Skeeper lock - Skeeper lock - Update deps and go - Regenerate daytona sidecar assets for go 1.26.3 - Fix cliff - Ignore docs on fmt - Build web assets before goreleaser - Extend release dry-run timeout ### 🔧 CI/CD - Lint errors - Fint release pr - Fix goreleaser - Fix release - Fix release process ### 🧪 Testing - Add e2e tests (#27) - Qa rounds (#78) - Improve test suite (#138) - Harden daemon-served restart reloads - Harden daemon-served readiness waits - Stabilize dashboard focus assertion - Stabilize release integration gates - Stabilize release e2e markers - Stabilize release e2e flows - Improve suite speed Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
## Release v0.0.2 This PR prepares the release of version v0.0.2. ### Changelog ## 0.0.2 - 2026-05-26 ### Other Changes - Lessons learned ### ♻️ Refactoring - Project structure (#7) - Kb improvements (#12) - Rename spaces to channels (#17) - Add extensions gaps (#21) - Improve tool calls ui (#22) - Remove web app header - Module improvements (#29) - Memory improvements (#35) - Storybook for web and ui (#38) - Enable AGH network by default for new installs (#57) - Hermes adjustments (#69) - Badges design (#84) - Storybook scenario and logos gallery - Migrate typescript tests (#114) - Internal go packages (#120) - Ui patterns (#127) - Improve e2e tests (#130) - Ui redesign - Workspace isolation across runtime surfaces (#145) - Prod ready applies (#162) - Tool card ui (#164) - Alpha on logo - Prod ready features (#167) - Thread sheet (#202) ### 🎉 Features - Implement config foundation packages - Implement sqlite store package - Add ACP client package - Add session lifecycle manager - Implement observe package - Add daemon composition root - Add uds api server - Implement cli package - Add http api server - Add system design - Add foundation types, schemas, and layout shell for web client - Add daemon health polling and agent sidebar systems for web client - Add session system CRUD, streaming core, and session store for web client - Add chat view, messages, and composer tests for web client - Add tool cards and renderers for web client - Add file-backed memory store core - Scaffold memory session seams - Add memory dream consolidation service - Wire memory assembler into daemon - Add memory api and cli - New skills system (#1) - Add workspace entity (#5) - Add new skill capabilities (#8) - Web ui v2 (#9) - Improve hooks system (#10) - Session resilience (#11) - Add extensability (#13) - Add automation (#16) - Add channels (#14) - Add network implementation (#15) - Add network, bridges and automations web pages (#18) - Ext registry (#20) - Add core tasks (#19) - Bridge adapters (#23) - Add site (#26) - Add ext refac and sandbox (#25) - Settings ui (#37) - Tasks ui (#36) - Harness improvements (#44) - Agent capabilities (#49) - Redesign ui (#48) - Unify capability (#53) - Redesign network workspace (#59) - Add task deletion and split session delete from stop (#58) - Session provider selection (#60) - Production grade adjustments (#66) - Autonomous system (#75) - Add agent session route (#80) - Tools registry (#85) - Agents soul (#88) - Add network threads (#105) - Orchestration improvements (#106) - Memory v2 (#108) - Agent categories (#113) - Providers model (#118) - Add canonical AGH bundled skill (#143) - Onboarding and improvements (#198) - Onboarding and improvements (#201) ### 🐛 Bug Fixes - Review round - Review rounds - Resolve memory extensibility review batch - Embed web into daemon - Defaults agents - Acp integration (#4) - Lint errors - Prd folder - Remove orphan web actions and dead surfaces (#55) - Qa testing and fixes (#73) - New review rounds (#82) - Security audit (#90) - Release qa round (#95) - Add missing tools (#141) - New qa round (#147) - Advanced qa round (#149) - Homebrew tap - Final review round (#151) - Daemon healthy - Reasoning models (#158) - Lint errors (#160) - Review round (#168) - Release adjustments (#171) - Stabilize release ci fixtures - Stabilize release integration gate - Stabilize release verify gates - Stabilize release integration flows - Stabilize release verify gates - Stabilize main verify shutdown - Ignore stale acpmock cancel - Marketplace search focus and filtering (#193) - Website video - Workspace command select ### 📚 Documentation - Update agents.md - Update prd - Update skills - Update compozy tasks - Update compozy - Update compozy - Add new skills - Archive prd - Update prds - Update rfc - Update prds - Update prds - Add automation prd - Channels prd - Update prd - Update prd - New prds - Archive prds - Bridges adapters prd - Sandbox prd - Update - Archive prd - Update - Add new prd - New design - Update prd - Archive prds - Update prds - Tasks-ui prd tasks - Update prd - Update design docs - Agent capabilities prd - Improve site docs - Remove old design references - Udpate - Autonomous prd - Update skills - Blog design - Agent sould prd - Final qa plan - Update - Remove codex ledgers from gitignore - Remove not needed files - Udpate ledger - Update cy-codex-loop skill - Orchestration improves prd - Update prds - Orch improvs prd - Memv2 prd - Providers model prd - Update refacs prd - New design proposal - Update rules - Update skills - New blog posts (#173) - Format docs - Remove old design files - Remove old - Skeeper update ### 📦 Build System - Initial structure - Commitlint - Frontend base structure - Update vscode settings - Add subagents - Coderabbit - Prd and tooling - Bun lock - Lint tooling - Copy.md and tooling adjusts - Add repoclone rc - Upgrade skeeper to v0.2.0 - Update go.mod - Adopt task artifacts into skeeper - Sync codex plans with skeeper - Skeeper lock - Skeeper lock - New skills - Skeeper lock - Skeeper lock - Skeeper lock - Update deps and go - Regenerate daytona sidecar assets for go 1.26.3 - Fix cliff - Ignore docs on fmt - Build web assets before goreleaser - Extend release dry-run timeout ### 🔧 CI/CD - Lint errors - Fint release pr - Fix goreleaser - Fix release - Fix release process - Fix release sync - Decouple release dry-run npm auth - Persist web assets git auth ### 🧪 Testing - Add e2e tests (#27) - Qa rounds (#78) - Improve test suite (#138) - Harden daemon-served restart reloads - Harden daemon-served readiness waits - Stabilize dashboard focus assertion - Stabilize release integration gates - Stabilize release e2e markers - Stabilize release e2e flows - Improve suite speed <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Chores** * Updated web assets dependency to a newer version for improved stability and performance. <!-- review_stack_entry_start --> [](https://app.coderabbit.ai/change-stack/compozy/agh/pull/211?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack) <!-- review_stack_entry_end --> <!-- end of auto-generated comment: release notes by coderabbit.ai --> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
## Release v0.0.2 This PR prepares the release of version v0.0.2. ### Changelog ## 0.0.2 - 2026-05-27 ### Other Changes - Lessons learned ### ♻️ Refactoring - Project structure (#7) - Kb improvements (#12) - Rename spaces to channels (#17) - Add extensions gaps (#21) - Improve tool calls ui (#22) - Remove web app header - Module improvements (#29) - Memory improvements (#35) - Storybook for web and ui (#38) - Enable AGH network by default for new installs (#57) - Hermes adjustments (#69) - Badges design (#84) - Storybook scenario and logos gallery - Migrate typescript tests (#114) - Internal go packages (#120) - Ui patterns (#127) - Improve e2e tests (#130) - Ui redesign - Workspace isolation across runtime surfaces (#145) - Prod ready applies (#162) - Tool card ui (#164) - Alpha on logo - Prod ready features (#167) - Thread sheet (#202) ### 🎉 Features - Implement config foundation packages - Implement sqlite store package - Add ACP client package - Add session lifecycle manager - Implement observe package - Add daemon composition root - Add uds api server - Implement cli package - Add http api server - Add system design - Add foundation types, schemas, and layout shell for web client - Add daemon health polling and agent sidebar systems for web client - Add session system CRUD, streaming core, and session store for web client - Add chat view, messages, and composer tests for web client - Add tool cards and renderers for web client - Add file-backed memory store core - Scaffold memory session seams - Add memory dream consolidation service - Wire memory assembler into daemon - Add memory api and cli - New skills system (#1) - Add workspace entity (#5) - Add new skill capabilities (#8) - Web ui v2 (#9) - Improve hooks system (#10) - Session resilience (#11) - Add extensability (#13) - Add automation (#16) - Add channels (#14) - Add network implementation (#15) - Add network, bridges and automations web pages (#18) - Ext registry (#20) - Add core tasks (#19) - Bridge adapters (#23) - Add site (#26) - Add ext refac and sandbox (#25) - Settings ui (#37) - Tasks ui (#36) - Harness improvements (#44) - Agent capabilities (#49) - Redesign ui (#48) - Unify capability (#53) - Redesign network workspace (#59) - Add task deletion and split session delete from stop (#58) - Session provider selection (#60) - Production grade adjustments (#66) - Autonomous system (#75) - Add agent session route (#80) - Tools registry (#85) - Agents soul (#88) - Add network threads (#105) - Orchestration improvements (#106) - Memory v2 (#108) - Agent categories (#113) - Providers model (#118) - Add canonical AGH bundled skill (#143) - Onboarding and improvements (#198) - Onboarding and improvements (#201) ### 🐛 Bug Fixes - Review round - Review rounds - Resolve memory extensibility review batch - Embed web into daemon - Defaults agents - Acp integration (#4) - Lint errors - Prd folder - Remove orphan web actions and dead surfaces (#55) - Qa testing and fixes (#73) - New review rounds (#82) - Security audit (#90) - Release qa round (#95) - Add missing tools (#141) - New qa round (#147) - Advanced qa round (#149) - Homebrew tap - Final review round (#151) - Daemon healthy - Reasoning models (#158) - Lint errors (#160) - Review round (#168) - Release adjustments (#171) - Stabilize release ci fixtures - Stabilize release integration gate - Stabilize release verify gates - Stabilize release integration flows - Stabilize release verify gates - Stabilize main verify shutdown - Ignore stale acpmock cancel - Marketplace search focus and filtering (#193) - Website video - Workspace command select ### 📚 Documentation - Update agents.md - Update prd - Update skills - Update compozy tasks - Update compozy - Update compozy - Add new skills - Archive prd - Update prds - Update rfc - Update prds - Update prds - Add automation prd - Channels prd - Update prd - Update prd - New prds - Archive prds - Bridges adapters prd - Sandbox prd - Update - Archive prd - Update - Add new prd - New design - Update prd - Archive prds - Update prds - Tasks-ui prd tasks - Update prd - Update design docs - Agent capabilities prd - Improve site docs - Remove old design references - Udpate - Autonomous prd - Update skills - Blog design - Agent sould prd - Final qa plan - Update - Remove codex ledgers from gitignore - Remove not needed files - Udpate ledger - Update cy-codex-loop skill - Orchestration improves prd - Update prds - Orch improvs prd - Memv2 prd - Providers model prd - Update refacs prd - New design proposal - Update rules - Update skills - New blog posts (#173) - Format docs - Remove old design files - Remove old - Skeeper update ### 📦 Build System - Initial structure - Commitlint - Frontend base structure - Update vscode settings - Add subagents - Coderabbit - Prd and tooling - Bun lock - Lint tooling - Copy.md and tooling adjusts - Add repoclone rc - Upgrade skeeper to v0.2.0 - Update go.mod - Adopt task artifacts into skeeper - Sync codex plans with skeeper - Skeeper lock - Skeeper lock - New skills - Skeeper lock - Skeeper lock - Skeeper lock - Update deps and go - Regenerate daytona sidecar assets for go 1.26.3 - Fix cliff - Ignore docs on fmt - Build web assets before goreleaser - Extend release dry-run timeout - Fix release dry-run token contract ### 🔧 CI/CD - Lint errors - Fint release pr - Fix goreleaser - Fix release - Fix release process - Fix release sync - Decouple release dry-run npm auth - Persist web assets git auth - Require npm auth before release merge ### 🧪 Testing - Add e2e tests (#27) - Qa rounds (#78) - Improve test suite (#138) - Harden daemon-served restart reloads - Harden daemon-served readiness waits - Stabilize dashboard focus assertion - Stabilize release integration gates - Stabilize release e2e markers - Stabilize release e2e flows - Improve suite speed <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Chores** * Updated dependencies to latest versions. <!-- review_stack_entry_start --> [](https://app.coderabbit.ai/change-stack/compozy/agh/pull/214?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack) <!-- review_stack_entry_end --> <!-- end of auto-generated comment: release notes by coderabbit.ai --> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Summary by CodeRabbit