Repository navigation
fix: advanced qa round - #149
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
Caution Review failedThe pull request is closed. ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (5)
WalkthroughAdds backend API, CLI, and web support for agent creation and a skill marketplace; enforces permission decision compatibility; enhances memory recall/modtimes; adds review-router recovery and workspace-aware task identity; many route, test, and UI updates. ChangesAgent authoring (API, CLI, UI)
Skill marketplace service, endpoints, CLI, and UI
Permissions, memory, review routing, identity, automation, and assorted UI
Estimated code review effort Possibly related issues
Possibly related PRs
✨ Finishing Touches📝 Generate docstrings
|
There was a problem hiding this comment.
Actionable comments posted: 18
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
internal/cli/skill_commands.go (1)
461-492: 🛠️ Refactor suggestion | 🟠 Major | ⚡ Quick winGuard
--versionwith explicit flag-presence checks.Line 483 passes
versionunconditionally; this reads the value without checking whether the flag was explicitly provided.🔧 Proposed fix
func newSkillInstallCommand(deps commandDeps) *cobra.Command { version := "" cmd := &cobra.Command{ Use: "install <slug>", Short: "Install a marketplace skill", @@ RunE: func(cmd *cobra.Command, args []string) (err error) { slug, err := normalizeSkillSlug(args[0]) if err != nil { return err } + selectedVersion := "" + if cmd.Flags().Changed("version") { + selectedVersion = strings.TrimSpace(version) + if selectedVersion == "" { + return errors.New("cli: --version cannot be blank") + } + } @@ - item, err := installMarketplaceSkill(cmd.Context(), runtime, registry, slug, version, "", deps.now) + item, err := installMarketplaceSkill( + cmd.Context(), + runtime, + registry, + slug, + selectedVersion, + "", + deps.now, + ) if err != nil { return err }As per coding guidelines, "Always detect CLI flag presence with explicit flag checking before reading values — do not assume flag presence."
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@internal/cli/skill_commands.go` around lines 461 - 492, The command currently reads and forwards the version variable unconditionally; instead check explicit flag presence with cmd.Flags().Changed("version") inside newSkillInstallCommand's RunE, compute a local versionArg (e.g., empty string unless Changed("version") is true then set to version) and pass versionArg to installMarketplaceSkill; keep the existing cmd.Flags().StringVar registration for "version" but change the install call in newSkillInstallCommand to use the guarded versionArg so the code distinguishes between the flag being omitted vs provided.
🧹 Nitpick comments (5)
web/src/systems/workspace/lib/query-options.ts (1)
6-6: ⚡ Quick winExternalize the workspace polling interval instead of hardcoding it.
Line 6 hardcodes
10_000, which makes polling behavior non-configurable across environments.Suggested change
-export const WORKSPACE_REFETCH_INTERVAL = 10_000; +const workspaceRefetchIntervalMs = Number(import.meta.env.VITE_WORKSPACE_REFETCH_INTERVAL_MS); +export const WORKSPACE_REFETCH_INTERVAL = + Number.isFinite(workspaceRefetchIntervalMs) && workspaceRefetchIntervalMs > 0 + ? workspaceRefetchIntervalMs + : 10_000;As per coding guidelines, "Use environment variables for configuration instead of hardcoded values".
Also applies to: 13-13, 22-22
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@web/src/systems/workspace/lib/query-options.ts` at line 6, Replace hardcoded numeric polling intervals in this module (e.g., WORKSPACE_REFETCH_INTERVAL and any other time constants in the same file) with values read from environment configuration: read a named env var (e.g., REACT_APP_WORKSPACE_REFETCH_INTERVAL or similar), parse/validate it as an integer, and fall back to the previous constant (10_000) when the env var is missing or invalid; update the constant definitions (WORKSPACE_REFETCH_INTERVAL and the other interval constants referenced in this file) to use that parsed value so polling becomes configurable across environments.web/src/systems/agent/components/__tests__/agent-create-dialog.test.tsx (1)
101-107: ⚡ Quick winAvoid brittle CSS-literal assertions in this test.
The width-token check is hard-coded to utility class strings. Prefer a stable semantic hook or behavior-focused assertion to reduce churn from styling refactors.
As per coding guidelines "web/**/*.test.{ts,tsx}: Do not add CSS literal, snapshot, generated-output, or prose-string tests unless that artifact is the product contract and no stronger gate exists".
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@web/src/systems/agent/components/__tests__/agent-create-dialog.test.tsx` around lines 101 - 107, The test currently asserts brittle CSS utility literals on the dialog's className; instead remove the className string assertions in the "Should anchor the dialog..." test and replace them with a stable, behavior-focused check: either (A) assert a semantic hook such as a data attribute on the element (add/read data-width-token="modal-lg" from the element returned by renderDialog via screen.getByTestId("agent-create-dialog")), or (B) assert the rendered dialog's computed maxWidth/width using window.getComputedStyle(dialog).maxWidth to match the intended modal token value; update the test to use renderDialog and screen.getByTestId("agent-create-dialog") and assert the data attribute or computed style rather than literal class names.internal/api/core/settings_test.go (1)
892-918: ⚡ Quick winWrap this new test in a
t.Run("Should...")subtest.Please align this case with the test pattern used for enforceable test standards so future scenario expansion stays consistent.
♻️ Proposed adjustment
func TestUpdateSettingsMemoryRejectsUnavailableProvider(t *testing.T) { t.Parallel() - - service := &stubSettingsService{} - fixture := newSettingsHandlerFixture(t, "api-core-http", service, nil) - fixture.Handlers.MemoryProviders = unavailableSettingsMemoryProviderService{ - err: errors.New("provider not registered"), - } - - memoryPayload := validSettingsMemoryConfigPayload() - memoryPayload.Provider.Name = "qa-missing-provider" - body := contract.UpdateSettingsMemoryRequest{Config: memoryPayload} - - resp := performRequest(t, fixture.Engine, http.MethodPatch, "/api/settings/memory", mustJSON(t, body)) - if got, want := resp.Code, http.StatusBadRequest; got != want { - t.Fatalf("status = %d, want %d; body=%s", got, want, resp.Body.String()) - } - if service.UpdateSectionCalls != 0 { - t.Fatalf("UpdateSectionCalls = %d, want 0", service.UpdateSectionCalls) - } - - var payload contract.ErrorPayload - decodeJSON(t, resp.Body.Bytes(), &payload) - if !strings.Contains(payload.Error, "qa-missing-provider") { - t.Fatalf("payload.Error = %q, want provider name", payload.Error) - } + t.Run("Should reject unavailable memory provider", func(t *testing.T) { + service := &stubSettingsService{} + fixture := newSettingsHandlerFixture(t, "api-core-http", service, nil) + fixture.Handlers.MemoryProviders = unavailableSettingsMemoryProviderService{ + err: errors.New("provider not registered"), + } + + memoryPayload := validSettingsMemoryConfigPayload() + memoryPayload.Provider.Name = "qa-missing-provider" + body := contract.UpdateSettingsMemoryRequest{Config: memoryPayload} + + resp := performRequest(t, fixture.Engine, http.MethodPatch, "/api/settings/memory", mustJSON(t, body)) + if got, want := resp.Code, http.StatusBadRequest; got != want { + t.Fatalf("status = %d, want %d; body=%s", got, want, resp.Body.String()) + } + if service.UpdateSectionCalls != 0 { + t.Fatalf("UpdateSectionCalls = %d, want 0", service.UpdateSectionCalls) + } + + var payload contract.ErrorPayload + decodeJSON(t, resp.Body.Bytes(), &payload) + if !strings.Contains(payload.Error, "qa-missing-provider") { + t.Fatalf("payload.Error = %q, want provider name", payload.Error) + } + }) }As per coding guidelines,
**/*_test.go: MUST uset.Run("Should...")pattern for ALL test cases.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@internal/api/core/settings_test.go` around lines 892 - 918, Wrap the existing TestUpdateSettingsMemoryRejectsUnavailableProvider body in a t.Run subtest (e.g., t.Run("Should reject unavailable provider when updating memory settings", func(t *testing.T) { ... })) and move the test logic inside that closure; ensure t.Parallel() is called inside the subtest (not only at the top-level) so it follows the project's test pattern; keep the original assertions and references to fixture, service, performRequest, and payload decoding unchanged.internal/daemon/review_router.go (1)
428-461: ⚡ Quick winConsider unifying
requesterIdentitywithoriginalWorkerIdentity.
requesterIdentityduplicates the session-lookup and identity-extraction logic fromoriginalWorkerIdentity. Both functions iterater.sessions.ListAll, find a matching session ID, and extractagentName/peerID. The only difference is the source of the initialsessionID(fromrunvsactor).A single helper accepting the initial session ID would reduce duplication and maintenance burden.
♻️ Proposed refactor to unify identity resolution
+func (r *reviewRouter) resolveSessionIdentity( + ctx context.Context, + workspaceID string, + sessionID string, +) originalWorkerIdentity { + identity := originalWorkerIdentity{sessionID: strings.TrimSpace(sessionID)} + if identity.sessionID == "" { + return identity + } + infos, err := r.sessions.ListAll(ctx) + if err != nil { + r.logger.Warn( + "daemon: review router could not list sessions for identity resolution", + "session_id", identity.sessionID, + "error", err, + ) + return identity + } + for _, info := range infos { + if info == nil || strings.TrimSpace(info.ID) != identity.sessionID { + continue + } + if workspaceID != "" && strings.TrimSpace(info.WorkspaceID) != strings.TrimSpace(workspaceID) { + continue + } + identity.agentName = strings.TrimSpace(info.AgentName) + identity.peerID = reviewRouterPeerID(info) + return identity + } + return identity +} func (r *reviewRouter) originalWorkerIdentity( ctx context.Context, workspaceID string, run taskpkg.Run, ) originalWorkerIdentity { - identity := originalWorkerIdentity{sessionID: strings.TrimSpace(run.SessionID)} - if identity.sessionID == "" && run.ClaimedBy != nil && + sessionID := strings.TrimSpace(run.SessionID) + if sessionID == "" && run.ClaimedBy != nil && run.ClaimedBy.Kind.Normalize() == taskpkg.ActorKindAgentSession { - identity.sessionID = strings.TrimSpace(run.ClaimedBy.Ref) + sessionID = strings.TrimSpace(run.ClaimedBy.Ref) } - // ... rest of lookup logic + return r.resolveSessionIdentity(ctx, workspaceID, sessionID) } func (r *reviewRouter) requesterIdentity( ctx context.Context, workspaceID string, actor taskpkg.ActorContext, ) originalWorkerIdentity { if actor.Actor.Kind.Normalize() != taskpkg.ActorKindAgentSession { return originalWorkerIdentity{} } - // ... rest of lookup logic + return r.resolveSessionIdentity(ctx, workspaceID, strings.TrimSpace(actor.Actor.Ref)) }🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@internal/daemon/review_router.go` around lines 428 - 461, Create a single helper function (e.g., resolveOriginalWorkerIdentity or similar) that accepts ctx, workspaceID and an initial sessionID string and returns originalWorkerIdentity by running the shared logic currently duplicated in requesterIdentity and originalWorkerIdentity: call r.sessions.ListAll, find the matching session by ID, check workspaceID match, set agentName and peerID via reviewRouterPeerID, and return the identity; then refactor requesterIdentity and originalWorkerIdentity to derive their initial sessionID (from actor.Ref or run context) and delegate to this new helper, keeping r.sessions.ListAll and reviewRouterPeerID usage unchanged.internal/skills/marketplace/service.go (1)
894-910: 💤 Low valueFragile string matching for error classification.
The
classifyRegistryLookupfunction uses substring matching (strings.Contains(message, " not found")) to classify errors. This is brittle and could misclassify errors or miss legitimate "not found" cases with different phrasing.Consider defining structured error types in the registry package that can be checked with
errors.Is.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@internal/skills/marketplace/service.go` around lines 894 - 910, The classifyRegistryLookup function currently uses brittle substring matching on err.Error(); replace this with structured error checks by introducing (or using existing) exported sentinel/typed errors from the registry package (e.g., registry.ErrNotFound or a typed registry.NotFoundError) and use errors.Is(err, registry.ErrNotFound) (or type assertion) instead of strings.Contains; update registry lookup functions to return those sentinel/typed errors when a package/resource is missing, and then in classifyRegistryLookup return &Error{Kind: ErrNotFound, Message: err.Error(), Cause: err} when errors.Is(err, registry.ErrNotFound) (keeping the existing early-return cases for ErrValidation, ErrNotFound, ErrNotMarketplace, ErrNotConfigured).
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@internal/acp/handlers_test.go`:
- Around line 509-538: Wrap the new test body in
TestResolvePermissionRejectsUnsupportedPersistentDecision inside a t.Run("Should
...") subtest: move or call t.Parallel() and the existing logic (proc :=
newDirectProcess(...), registerPendingPermission, t.Cleanup, the
ResolvePermission assertion and pending checks) into a t.Run block with a
descriptive name (e.g., "Should reject unsupported persistent decision"); ensure
t.Parallel() is invoked inside the subtest so it still runs in parallel and keep
the existing references to proc.registerPendingPermission,
proc.ResolvePermission, pending.response, and proc.pendingPermissions unchanged.
In `@internal/api/core/handlers.go`:
- Around line 851-854: The check that returns a generic fmt.Errorf when
resolved.RootDir is empty should instead return the workspace-specific error
type so statusForCreateAgentError maps to a client-actionable workspace error
(not a 500). Replace the generic error return in the block using
rootDir/resolved.RootDir (and the similar block at the other occurrence around
lines 958-975) with the project’s workspace error constructor/enum (the same
error kind used for other workspace root errors) so statusForCreateAgentError
recognizes it; keep the existing context (include h.transportName() or similar
message) and update both locations that validate root_dir to return that
workspace-root error instead of fmt.Errorf.
In `@internal/api/core/memory.go`:
- Around line 261-283: The code assigns result.Workspace (which can be a
filesystem path) to the MemoryEntrySummaryPayload.WorkspaceID, risking leaking
local paths; change memorySearchResultPayloadsFromSearchResults to populate
WorkspaceID from a canonical workspace identifier field (e.g.,
result.WorkspaceID) instead of result.Workspace, and if that identifier is empty
ensure you set WorkspaceID to an empty string (or another safe sentinel) rather
than passing the raw path; update the assignment in the loop that builds
contract.MemoryEntrySummaryPayload to use result.WorkspaceID (with a fallback to
""), so filesystem paths from selector.Workspace are never exposed as
workspace_id.
In `@internal/api/core/settings.go`:
- Around line 677-680: The memory provider lookup in the
h.MemoryProviders.Get(...) call incorrectly wraps every error as
NewSettingsValidationError; change it so only a true "provider not found" error
is converted to a validation error and all other errors are returned (or wrapped
as internal/server errors). Concretely, after calling h.MemoryProviders.Get(ctx,
req.WorkspaceID, name) inspect the error with errors.Is(...) or your provider's
sentinel (e.g. memory.ErrNotFound or provider.ErrNotFound) or a ProviderNotFound
helper; if it is the not-found sentinel return NewSettingsValidationError(...),
otherwise return the original error (or wrap it as an internal error) so
infrastructure/unavailable failures are propagated as 5xx. Ensure to reference
h.MemoryProviders.Get and NewSettingsValidationError in the changed branch.
In `@internal/api/core/skills_test.go`:
- Around line 281-292: The subtest names in the table-driven tests in
internal/api/core/skills_test.go should follow the repo convention and be
renamed to start with "Should ..."; update the entries in the tests slice (e.g.,
the cases currently labeled "nil returns 200", "validation returns 400", "not
found returns 404", "not marketplace returns 422", "not configured returns 503",
"unknown error returns 500") to descriptive names like "Should return 200 for
nil error", "Should return 400 for validation error", etc., and likewise rename
the cases in the second table block around lines 295-307 so that the t.Run calls
use the "Should ..." phrasing; keep the same err and wantStatus values and only
change the name strings used for t.Run.
In `@internal/api/core/skills.go`:
- Around line 315-330: The RemoveSkillMarketplace handler does not validate the
trimmed name param; add an empty-input check at the start of
RemoveSkillMarketplace (after name := strings.TrimSpace(c.Param("name"))) and if
name == "" respond with h.respondError(c, http.StatusBadRequest,
errors.New("name is required")) (or equivalent error used by GetSkill) and
return, before calling h.skillMarketplaceService().Remove or
refreshSkillsAfterMarketplaceMutation; this mirrors the validation used by
GetSkill and prevents passing an empty name into Remove and
SkillMarketplaceRemovePayloadFromResult.
- Around line 245-256: In GetSkillMarketplaceInfo, validate the trimmed slug
before calling h.skillMarketplaceService().Info: if slug == "" return a 400 Bad
Request using the same error response pattern (call h.respondError with
http.StatusBadRequest or StatusForSkillMarketplaceError-equivalent and a
descriptive error about the missing slug) so empty query values are rejected
consistently with other handlers (see validation at the skill name check and use
the existing respondError/StatusForSkillMarketplaceError helpers).
In `@internal/automation/manager_integration_test.go`:
- Around line 274-361: Wrap the existing test body of
TestManagerIntegrationManualTriggerSurvivesCallerCancellation in a subtest using
t.Run("Should survive caller cancellation when manually triggered", func(t
*testing.T) { ... }), move the t.Parallel() call into that subtest (so it calls
the subtest's t), and ensure all t.* calls (t.Fatalf, t.Cleanup, etc.) and local
setup (newManagerHarness, h.newManager, manager.Start, CreateJob, trigger
goroutine, selects) remain inside the subtest closure so they operate on the
subtest's t; keep unique references like
TestManagerIntegrationManualTriggerSurvivesCallerCancellation,
manager.TriggerJob, promptStarted, promptRelease, and Run assertions unchanged.
In `@internal/automation/manager.go`:
- Around line 746-749: The call to m.dispatcher.Dispatch uses
context.WithoutCancel(ctx) which removes any deadline; re-attach the original
deadline (if present) before calling Dispatch so the operation isn't unbounded:
inspect ctx.Deadline() and if a deadline exists create a new context via
context.WithDeadline (or WithTimeout) based on that deadline but without cancel
propagation, then pass that context to m.dispatcher.Dispatch(…,
DispatchRequest{Kind: DispatchKindManual, Job: &job}); keep using
DispatchRequest/DispatchKindManual/job as-is and ensure you cancel the derived
context when appropriate to avoid leaks.
In `@internal/config/agent_create.go`:
- Around line 36-54: CreateAgentDefFile currently writes the trimmed path
(normalizedPath) directly which can allow traversal/symlink-escape; before
calling ensureAgentDefinitionWritable and writePersistedFile, run the caller
path through the package path-security helpers: first
sanitizePathKey(normalizedPath) then resolve using realpathDeepestExisting on
the sanitized value, use that resolved path for ensureAgentDefinitionWritable
and writePersistedFile, and set agent.SourcePath to the cleaned resolved path
(instead of filepath.Clean(normalizedPath)); apply the same sanitizePathKey +
realpathDeepestExisting pattern for the other write path usage around the
CreateAgentDefFile area (the block at lines ~105-118) to ensure all persisted
agent paths use the secured real path.
In `@internal/session/manager_test.go`:
- Around line 2509-2561: Wrap the existing top-level test body in
TestProcessExitDuringActivePromptPersistsAgentCrashedStopReason inside a t.Run
subtest named like "Should persist AgentCrashed stop reason when process exits
during active prompt"; move the t.Parallel() call into that subtest, and keep
the rest of the logic intact (references to newHarness, createSession,
promptStarted, h.driver.promptHook, h.manager.Prompt, waitForCondition,
readMeta, readStoredEvents, etc.) so the test uses the required
t.Run("Should...") pattern while preserving behavior.
In `@internal/skills/marketplace/service.go`:
- Around line 802-822: PathInsideRoot currently uses filepath.Abs and
filepath.Rel but does not resolve symlinks, allowing symlink escapes; update
PathInsideRoot to call filepath.EvalSymlinks (and filepath.Abs) on both the root
and the target, then perform a strict path-prefix check against the resolved
root (e.g., compare cleanedResolvedTarget and cleanedResolvedRoot with a
separator-aware HasPrefix using resolvedRoot+string(filepath.Separator) and also
allow exact equality), and return errors on any EvalSymlinks failures so that
any symlink pointing outside the approved root is rejected.
In `@web/e2e/__tests__/skills.spec.ts`:
- Around line 344-362: After the poll confirms the marketplace view is ready,
assert the searched skill row is present and shows the installed indicator: use
skillsUI.marketplaceGrid to locate the row containing the text
"browser-marketplace-skill" (e.g., skillsUI.marketplaceGrid.locator(...) or a
helper like skillsUI.marketplaceRow("browser-marketplace-skill")) and await
expect(...).toBeVisible(), then within that same row assert the installed Pill
is visible (e.g., locate the pill element or text "Installed" inside the row via
skillsUI.marketplaceGrid or a dedicated skillsUI.marketplaceInstalledPill
locator) and await expect(...).toBeVisible().
In `@web/src/systems/agent/lib/agent-create-draft.ts`:
- Around line 204-226: buildCreateAgentParams can produce a workspace-scoped
payload without a workspace ID because it only conditionally adds the workspace
field; add an explicit guard at the start of the function to return null when
draft.scope === "workspace" and workspaceId is null/undefined/empty so we never
build an agent with scope "workspace" but no workspace field, i.e., check
draft.scope and workspaceId before trimming fields and constructing the return
object (referencing buildCreateAgentParams, draft.scope, and workspaceId).
In `@web/src/systems/runtime/components/provider-command-select.tsx`:
- Around line 126-127: The displayed harness label uses a nullish fallback
(selected.harness ?? "acp") but doesn't normalize blank/whitespace values;
update the render to use a normalized value (e.g., selected.harness?.trim() ||
'acp') so empty or whitespace harnesses show the fallback, and apply the same
change to the other occurrence noted (the second Eyebrow/render at lines
~167-168); optionally factor the logic into a small helper
(normalizeHarnessLabel) and use it in both places to keep behavior consistent.
In `@web/src/systems/session/components/permission-prompt.tsx`:
- Around line 62-69: The function permissionDecisionOptions can return an empty
array when permission.supportedDecisions is present but contains only unknown
values, causing no action buttons to render; modify permissionDecisionOptions so
that after filtering FALLBACK_PERMISSION_DECISIONS by
permission.supportedDecisions it checks if the resulting array is empty and, if
so, returns FALLBACK_PERMISSION_DECISIONS as a safe fallback (i.e., ensure the
filtered result is used only when non-empty) to guarantee at least the default
decisions are presented.
In `@web/src/systems/skill/lib/query-options.ts`:
- Around line 50-56: Trim the incoming slug and use the trimmed value for the
enabled check, queryKey and queryFn call so whitespace-only slugs don't enable
the query; inside skillMarketplaceInfoOptions create a trimmedSlug (e.g. const
trimmedSlug = slug?.trim() ?? '') then use
skillKeys.marketplaceInfo(trimmedSlug), getSkillMarketplaceInfo(trimmedSlug,
signal) and set enabled: enabled && !!trimmedSlug.
In `@web/src/systems/skill/mocks/handlers.ts`:
- Around line 55-59: The handler registered with
http.post("/api/skills/marketplace/install") currently uses await
request.json().catch(...) which violates the async/await-only rule; refactor the
JSON parsing into an explicit try/catch inside that async handler (surround
await request.json() with try and on error set body = {}), keep the same typed
shape ({ slug?: string; version?: string }), and ensure any error path still
returns a safe default body before proceeding with the rest of the install
handler logic.
---
Outside diff comments:
In `@internal/cli/skill_commands.go`:
- Around line 461-492: The command currently reads and forwards the version
variable unconditionally; instead check explicit flag presence with
cmd.Flags().Changed("version") inside newSkillInstallCommand's RunE, compute a
local versionArg (e.g., empty string unless Changed("version") is true then set
to version) and pass versionArg to installMarketplaceSkill; keep the existing
cmd.Flags().StringVar registration for "version" but change the install call in
newSkillInstallCommand to use the guarded versionArg so the code distinguishes
between the flag being omitted vs provided.
---
Nitpick comments:
In `@internal/api/core/settings_test.go`:
- Around line 892-918: Wrap the existing
TestUpdateSettingsMemoryRejectsUnavailableProvider body in a t.Run subtest
(e.g., t.Run("Should reject unavailable provider when updating memory settings",
func(t *testing.T) { ... })) and move the test logic inside that closure; ensure
t.Parallel() is called inside the subtest (not only at the top-level) so it
follows the project's test pattern; keep the original assertions and references
to fixture, service, performRequest, and payload decoding unchanged.
In `@internal/daemon/review_router.go`:
- Around line 428-461: Create a single helper function (e.g.,
resolveOriginalWorkerIdentity or similar) that accepts ctx, workspaceID and an
initial sessionID string and returns originalWorkerIdentity by running the
shared logic currently duplicated in requesterIdentity and
originalWorkerIdentity: call r.sessions.ListAll, find the matching session by
ID, check workspaceID match, set agentName and peerID via reviewRouterPeerID,
and return the identity; then refactor requesterIdentity and
originalWorkerIdentity to derive their initial sessionID (from actor.Ref or run
context) and delegate to this new helper, keeping r.sessions.ListAll and
reviewRouterPeerID usage unchanged.
In `@internal/skills/marketplace/service.go`:
- Around line 894-910: The classifyRegistryLookup function currently uses
brittle substring matching on err.Error(); replace this with structured error
checks by introducing (or using existing) exported sentinel/typed errors from
the registry package (e.g., registry.ErrNotFound or a typed
registry.NotFoundError) and use errors.Is(err, registry.ErrNotFound) (or type
assertion) instead of strings.Contains; update registry lookup functions to
return those sentinel/typed errors when a package/resource is missing, and then
in classifyRegistryLookup return &Error{Kind: ErrNotFound, Message: err.Error(),
Cause: err} when errors.Is(err, registry.ErrNotFound) (keeping the existing
early-return cases for ErrValidation, ErrNotFound, ErrNotMarketplace,
ErrNotConfigured).
In `@web/src/systems/agent/components/__tests__/agent-create-dialog.test.tsx`:
- Around line 101-107: The test currently asserts brittle CSS utility literals
on the dialog's className; instead remove the className string assertions in the
"Should anchor the dialog..." test and replace them with a stable,
behavior-focused check: either (A) assert a semantic hook such as a data
attribute on the element (add/read data-width-token="modal-lg" from the element
returned by renderDialog via screen.getByTestId("agent-create-dialog")), or (B)
assert the rendered dialog's computed maxWidth/width using
window.getComputedStyle(dialog).maxWidth to match the intended modal token
value; update the test to use renderDialog and
screen.getByTestId("agent-create-dialog") and assert the data attribute or
computed style rather than literal class names.
In `@web/src/systems/workspace/lib/query-options.ts`:
- Line 6: Replace hardcoded numeric polling intervals in this module (e.g.,
WORKSPACE_REFETCH_INTERVAL and any other time constants in the same file) with
values read from environment configuration: read a named env var (e.g.,
REACT_APP_WORKSPACE_REFETCH_INTERVAL or similar), parse/validate it as an
integer, and fall back to the previous constant (10_000) when the env var is
missing or invalid; update the constant definitions (WORKSPACE_REFETCH_INTERVAL
and the other interval constants referenced in this file) to use that parsed
value so polling becomes configurable across environments.
🪄 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: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: d8a3352e-de1c-4045-93e7-14bb03b4f0e6
⛔ Files ignored due to path filters (6)
openapi/agh.jsonis excluded by!**/*.jsonpackages/site/content/runtime/core/skills/marketplace.mdxis excluded by!**/*.mdxweb/e2e/fixtures/__tests__/browser-artifact-session.test.tsis excluded by!**/fixtures/**web/e2e/fixtures/__tests__/selectors.test.tsis excluded by!**/fixtures/**web/e2e/fixtures/selectors.tsis excluded by!**/fixtures/**web/src/generated/agh-openapi.d.tsis excluded by!**/generated/**
📒 Files selected for processing (154)
.gitignoreinternal/acp/handlers_test.gointernal/acp/permission.gointernal/acp/types.gointernal/api/contract/contract.gointernal/api/contract/responses.gointernal/api/core/agent_identity.gointernal/api/core/conversions.gointernal/api/core/errors.gointernal/api/core/handlers.gointernal/api/core/handlers_test.gointernal/api/core/interfaces.gointernal/api/core/memory.gointernal/api/core/memory_workspace_test.gointernal/api/core/session_workspace.gointernal/api/core/settings.gointernal/api/core/settings_test.gointernal/api/core/skills.gointernal/api/core/skills_test.gointernal/api/core/tasks.gointernal/api/core/tasks_internal_test.gointernal/api/core/test_helpers_test.gointernal/api/httpapi/handlers_test.gointernal/api/httpapi/routes.gointernal/api/httpapi/session_events_last_event_test.gointernal/api/spec/spec.gointernal/api/spec/spec_test.gointernal/api/testutil/skills_stub.gointernal/api/udsapi/handlers_test.gointernal/api/udsapi/routes.gointernal/api/udsapi/session_events_last_event_test.gointernal/automation/manager.gointernal/automation/manager_integration_test.gointernal/cli/agent.gointernal/cli/client.gointernal/cli/helpers_test.gointernal/cli/skill.gointernal/cli/skill_commands.gointernal/cli/skill_marketplace.gointernal/cli/task.gointernal/cli/task_as_agent_test.gointernal/config/agent_create.gointernal/config/home.gointernal/daemon/coordinator_runtime.gointernal/daemon/hooks_bridge.gointernal/daemon/hooks_bridge_internal_test.gointernal/daemon/review_router.gointernal/daemon/review_router_test.gointernal/memory/consolidation/runtime.gointernal/memory/contract/types.gointernal/memory/controller/controller.gointernal/memory/controller/controller_test.gointernal/memory/recall/recall.gointernal/memory/recall/recall_test.gointernal/session/manager.gointernal/session/manager_lifecycle.gointernal/session/manager_prompt.gointernal/session/manager_test.gointernal/skills/marketplace/service.gointernal/skills/observe_events.gointernal/skills/registry_agent.gointernal/skills/registry_test.gointernal/store/globaldb/global_db_task_review.gointernal/store/globaldb/global_db_task_review_test.gointernal/task/manager_review_test.gointernal/transcript/transcript.gointernal/transcript/transcript_test.goweb/e2e/__tests__/skills.spec.tsweb/src/hooks/routes/__tests__/use-app-layout.test.tsxweb/src/hooks/routes/__tests__/use-settings-general-page.test.tsxweb/src/hooks/routes/use-app-layout.tsweb/src/hooks/routes/use-automation-page.tsweb/src/hooks/routes/use-settings-general-page.tsweb/src/hooks/routes/use-skills-page.tsweb/src/routes/__tests__/-_app.test.tsxweb/src/routes/_app.tsxweb/src/routes/_app/__tests__/-agents.$name.test.tsxweb/src/routes/_app/__tests__/-jobs-triggers.integration.test.tsxweb/src/routes/_app/__tests__/-skills.test.tsxweb/src/routes/_app/agents.$name.tsxweb/src/routes/_app/settings/__tests__/-automation.test.tsxweb/src/routes/_app/settings/automation.tsxweb/src/routes/_app/skills.tsxweb/src/routes/_app/stories/-agents.$name.stories.tsxweb/src/routes/_app/stories/-skills.stories.tsxweb/src/routes/_app/stories/-tasks.$id.stories.tsxweb/src/systems/agent/adapters/__tests__/agent-api.test.tsweb/src/systems/agent/adapters/agent-api.tsweb/src/systems/agent/components/__tests__/agent-create-dialog.test.tsxweb/src/systems/agent/components/__tests__/agent-sessions-list.test.tsxweb/src/systems/agent/components/agent-create-dialog.tsxweb/src/systems/agent/components/agent-sessions-list.tsxweb/src/systems/agent/components/stories/agent-create-dialog.stories.tsxweb/src/systems/agent/hooks/__tests__/use-agent-create-dialog.test.tsxweb/src/systems/agent/hooks/use-agent-create-dialog-view-state.tsweb/src/systems/agent/hooks/use-agent-create-dialog.tsweb/src/systems/agent/hooks/use-agents.tsweb/src/systems/agent/index.tsweb/src/systems/agent/lib/__tests__/session-view.test.tsweb/src/systems/agent/lib/agent-create-draft.tsweb/src/systems/agent/lib/query-keys.tsweb/src/systems/agent/lib/session-view.tsweb/src/systems/agent/types.tsweb/src/systems/automation/components/automation-operations-page.tsxweb/src/systems/knowledge/mocks/fixtures.tsweb/src/systems/runtime/components/__tests__/app-sidebar.test.tsxweb/src/systems/runtime/components/__tests__/model-command-select.test.tsxweb/src/systems/runtime/components/__tests__/provider-command-select.test.tsxweb/src/systems/runtime/components/__tests__/reasoning-command-select.test.tsxweb/src/systems/runtime/components/app-sidebar.tsxweb/src/systems/runtime/components/model-command-select.tsxweb/src/systems/runtime/components/provider-command-select.tsxweb/src/systems/runtime/components/reasoning-command-select.tsxweb/src/systems/runtime/components/stories/app-sidebar.stories.tsxweb/src/systems/runtime/components/stories/command-selects.stories.tsxweb/src/systems/runtime/index.tsweb/src/systems/runtime/types.tsweb/src/systems/session/components/__tests__/permission-prompt.test.tsxweb/src/systems/session/components/permission-prompt.tsxweb/src/systems/session/components/session-create-dialog.tsxweb/src/systems/session/components/stories/session-command-controls.stories.tsxweb/src/systems/session/lib/message-parts.tsweb/src/systems/session/types.tsweb/src/systems/skill/__tests__/types.test.tsweb/src/systems/skill/adapters/__tests__/skill-api.test.tsweb/src/systems/skill/adapters/skill-api.tsweb/src/systems/skill/components/__tests__/marketplace-view.test.tsxweb/src/systems/skill/components/marketplace-view.tsxweb/src/systems/skill/components/stories/marketplace-view.stories.tsxweb/src/systems/skill/hooks/__tests__/use-skill-actions.test.tsxweb/src/systems/skill/hooks/__tests__/use-skills.test.tsxweb/src/systems/skill/hooks/use-skill-actions.tsweb/src/systems/skill/hooks/use-skills.tsweb/src/systems/skill/index.tsweb/src/systems/skill/lib/__tests__/query-keys.test.tsweb/src/systems/skill/lib/__tests__/query-options.test.tsweb/src/systems/skill/lib/query-keys.tsweb/src/systems/skill/lib/query-options.tsweb/src/systems/skill/mocks/fixtures.tsweb/src/systems/skill/mocks/handlers.tsweb/src/systems/skill/mocks/index.tsweb/src/systems/skill/types.tsweb/src/systems/tasks/components/__tests__/tasks-reviews-card.test.tsxweb/src/systems/tasks/components/tasks-bridge-notifications-card.tsxweb/src/systems/tasks/components/tasks-execution-profile-card.tsxweb/src/systems/tasks/components/tasks-reviews-card.tsxweb/src/systems/tasks/components/tasks-stream-resume-card.tsxweb/src/systems/workspace/components/provider-command-list.tsxweb/src/systems/workspace/components/provider-command-select.tsxweb/src/systems/workspace/components/stories/provider-command-list.stories.tsxweb/src/systems/workspace/components/stories/provider-command-select.stories.tsxweb/src/systems/workspace/hooks/__tests__/use-workspaces.test.tsxweb/src/systems/workspace/index.tsweb/src/systems/workspace/lib/query-options.ts
💤 Files with no reviewable changes (7)
- web/src/systems/workspace/components/stories/provider-command-list.stories.tsx
- web/src/systems/workspace/components/provider-command-list.tsx
- internal/cli/skill.go
- web/src/systems/workspace/components/stories/provider-command-select.stories.tsx
- web/src/systems/workspace/components/provider-command-select.tsx
- web/src/systems/workspace/index.ts
- web/src/systems/tasks/components/tests/tasks-reviews-card.test.tsx
There was a problem hiding this comment.
Actionable comments posted: 2
🧹 Nitpick comments (1)
internal/api/core/handlers_internal_test.go (1)
39-41: ⚡ Quick winGuard
Resolvewhenresolveis unset to avoid panic-prone test stubs.
Resolveis the only method without a nil-function fallback, so reused stubs can panic instead of returning a deterministic test error.Based on learnings: `internal/api/core/*_test.go` stubs are unit-test infrastructure and should provide deterministic handler-level behavior.Suggested patch
func (s workspaceResolveServiceStub) Resolve(ctx context.Context, ref string) (workspacepkg.ResolvedWorkspace, error) { - return s.resolve(ctx, ref) + if s.resolve != nil { + return s.resolve(ctx, ref) + } + return workspacepkg.ResolvedWorkspace{}, workspacepkg.ErrWorkspaceNotFound }🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@internal/api/core/handlers_internal_test.go` around lines 39 - 41, The stub method workspaceResolveServiceStub.Resolve should guard against a nil s.resolve to avoid panics in tests: update workspaceResolveServiceStub.Resolve to check if s.resolve == nil and if so return a deterministic error (e.g. errors.New("workspaceResolveServiceStub: resolve not implemented")) and a zero-value workspacepkg.ResolvedWorkspace; otherwise call and return s.resolve(ctx, ref). Ensure the error is returned consistently so reused stubs fail deterministically.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@internal/skills/marketplace/service_test.go`:
- Around line 26-29: The test currently only checks that PathInsideRoot(root,
filepath.Join(linkPath, "SKILL.md")) returns a non-nil error; change it to
assert the specific escape failure by checking the error value/message from the
PathInsideRoot call (use errors.Is with the sentinel error if one exists, or use
a string check like ErrorContains / strings.Contains on err.Error() for a phrase
such as "escape" or "outside root"). Update the assertion around the
PathInsideRoot invocation in service_test.go so it fails unless the error
matches the expected escape error (reference the PathInsideRoot call and
linkPath/"SKILL.md" used in the diff).
In `@internal/skills/marketplace/service.go`:
- Around line 802-855: PathInsideRoot currently implements a custom resolver
(and helper resolvePathForContainment) that bypasses the repo-required
sanitizePathKey + realpathDeepestExisting pattern; replace the custom logic by
first calling sanitizePathKey on both root and target (to strip null-bytes,
URL-encoded traversal, normalize unicode, etc.), then use
realpathDeepestExisting to resolve the deepest existing realpath for root and
target (instead of resolvePathForContainment), and finally compute filepath.Rel
between the resolvedRoot and resolvedTarget and reject if it escapes (same ".."
checks). Remove resolvePathForContainment and ensure all callers of
PathInsideRoot get the hardened behavior via sanitizePathKey and
realpathDeepestExisting.
---
Nitpick comments:
In `@internal/api/core/handlers_internal_test.go`:
- Around line 39-41: The stub method workspaceResolveServiceStub.Resolve should
guard against a nil s.resolve to avoid panics in tests: update
workspaceResolveServiceStub.Resolve to check if s.resolve == nil and if so
return a deterministic error (e.g. errors.New("workspaceResolveServiceStub:
resolve not implemented")) and a zero-value workspacepkg.ResolvedWorkspace;
otherwise call and return s.resolve(ctx, ref). Ensure the error is returned
consistently so reused stubs fail deterministically.
🪄 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: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: 15cafcb1-41d6-4a88-bb67-9765bfa58dc2
📒 Files selected for processing (26)
internal/acp/handlers_test.gointernal/api/core/handlers.gointernal/api/core/handlers_internal_test.gointernal/api/core/memory.gointernal/api/core/memory_internal_test.gointernal/api/core/session_manager_stub_test.gointernal/api/core/settings.gointernal/api/core/settings_test.gointernal/api/core/skills.gointernal/api/core/skills_test.gointernal/automation/manager.gointernal/automation/manager_integration_test.gointernal/session/manager_test.gointernal/skills/marketplace/service.gointernal/skills/marketplace/service_test.goweb/e2e/__tests__/skills.spec.tsweb/src/systems/agent/components/__tests__/agent-create-dialog.test.tsxweb/src/systems/agent/hooks/__tests__/use-agent-create-dialog.test.tsxweb/src/systems/agent/lib/agent-create-draft.tsweb/src/systems/runtime/components/__tests__/provider-command-select.test.tsxweb/src/systems/runtime/components/provider-command-select.tsxweb/src/systems/session/components/__tests__/permission-prompt.test.tsxweb/src/systems/session/components/permission-prompt.tsxweb/src/systems/skill/hooks/__tests__/use-skills.test.tsxweb/src/systems/skill/lib/__tests__/query-options.test.tsweb/src/systems/skill/lib/query-options.ts
✅ Files skipped from review due to trivial changes (1)
- internal/api/core/memory_internal_test.go
🚧 Files skipped from review as they are similar to previous changes (17)
- internal/automation/manager.go
- web/src/systems/runtime/components/tests/provider-command-select.test.tsx
- internal/acp/handlers_test.go
- web/src/systems/skill/lib/query-options.ts
- internal/api/core/skills.go
- web/e2e/tests/skills.spec.ts
- web/src/systems/skill/hooks/tests/use-skills.test.tsx
- web/src/systems/session/components/permission-prompt.tsx
- web/src/systems/skill/lib/tests/query-options.test.ts
- internal/api/core/settings_test.go
- internal/api/core/handlers.go
- internal/session/manager_test.go
- web/src/systems/agent/components/tests/agent-create-dialog.test.tsx
- internal/api/core/skills_test.go
- web/src/systems/agent/lib/agent-create-draft.ts
- internal/api/core/memory.go
- internal/api/core/settings.go
## 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
New Features
Bug Fixes
Documentation