feat: add site#26
Conversation
Extract shared design system into @agh/ui workspace package: - tokens.css with all DESIGN.md CSS custom properties - tailwind-preset.ts with spacing, radius, and font scales - 12 server-safe base components (button, badge, card, input, label, separator, skeleton, spinner, alert, progress, table, kbd) - cn() utility, barrel exports, proper "use client" directives Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace inline design tokens in web/src/styles.css with import from @agh/ui/tokens.css. Update all imports of 12 base components (button, badge, card, input, label, separator, skeleton, spinner, alert, progress, table, kbd) to import from @agh/ui instead of local copies. Delete the 12 local component files. Re-export cn from @agh/ui in web/src/lib/utils.ts. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Create the documentation site shell at packages/site/ with two content
collections (runtime and protocol), DESIGN.md dark theme via @agh/ui tokens,
Orama search with collection badges, and static export configuration.
- Two-source Fumadocs config: source.config.ts with defineDocs for runtime
and protocol collections, lib/source.ts with separate loaders and baseUrls
- Route groups: app/runtime/[[...slug]] and app/protocol/[[...slug]] each
with DocsLayout wrapping their own sidebar
- Root layout with dark class, canvas background, Inter + JetBrains Mono
fonts via @agh/ui/tokens.css, and Fumadocs CSS variable overrides
- Custom search dialog combining both sources with Runtime/Protocol tag
filtering via createSearchAPI('advanced')
- Shared navbar component linking to /, /runtime, /protocol
- Placeholder landing page with approved hero copy
- Static export (output: 'export', trailingSlash: true) producing out/
- Monorepo integration: root workspaces, turbo.json with out/** cache,
Makefile targets site-dev and site-build
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add hidden `doc` subcommand that generates CLI reference documentation using Cobra's GenMarkdownTree. Post-processing in internal/cli/docpost/ transforms raw markdown to Fumadocs-compatible MDX with frontmatter, JSX escaping, and fenced code blocks. Adds `make cli-docs` target. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Implement the custom landing page at packages/site/app/page.tsx with hero, two-pillars, how-it-works, runtime-features, protocol-section, architecture diagram (SVG), comparison table, and final CTA sections. All copy follows TechSpec Appendix A. DESIGN.md flat depth aesthetic applied throughout — no shadows, gradients, or blur effects. Includes snapshot tests (16 passing) via vitest + @testing-library/react and verified build producing 122 static pages. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Three Diataxis Explanation pages introducing AGH to new users: what-is-agh (identity and key concepts), architecture (system diagram, package layout, data flow), and comparison (competitive positioning with feature table). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
… Agent, Web UI) Four Diataxis-style tutorial pages guiding users from installation through running their first custom agent and exploring the web UI. All CLI commands verified against the actual codebase. Build produces 129 static pages. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
Caution Review failedPull request was closed or merged during review WalkthroughAdds a CLI docs generator and postprocessor, a Next.js documentation/site (layouts, routes, search API, styles, many components and logos), Makefile targets, updated Go module requires, extensive doc-postprocessing logic and tests, plus numerous CLI help/example text updates. No CLI runtime control-flow changes beyond help/examples. Changes
Sequence Diagram(s)sequenceDiagram
participant User as CLI User
participant Root as agh (root command)
participant DocCmd as agh doc
participant CobraGen as Cobra doc.GenMarkdownTree
participant FS as File System
participant DocPost as docpost.Process
participant Site as Site output dir
User->>Root: run `agh doc --output-dir <out>`
Root->>DocCmd: dispatch newDocCommand RunE
DocCmd->>FS: create temp dir
DocCmd->>CobraGen: doc.GenMarkdownTree -> write `agh*.md` into temp
CobraGen->>FS: write markdown files
DocCmd->>DocPost: Process(ctx, tempDir, out)
DocPost->>FS: read `agh*.md` files
DocPost->>DocPost: parse filenames → command hierarchy
DocPost->>DocPost: transform markdown (strip boilerplate, escape JSX, rewrite links, add frontmatter)
DocPost->>Site: write MDX files and nested `index.mdx`
DocPost->>Site: generate `meta.json` files per subdir
DocCmd->>User: print success with resolved output path
Estimated code review effort🎯 4 (Complex) | ⏱️ ~50 minutes Possibly related PRs
✨ Finishing Touches📝 Generate docstrings
|
There was a problem hiding this comment.
Actionable comments posted: 17
🧹 Nitpick comments (9)
packages/site/components/docs/mermaid.tsx (1)
34-57: Secure the SVG injection with additional sanitization for defense-in-depth.The code injects Mermaid-rendered SVG via
dangerouslySetInnerHTML(line 56). WhilesecurityLevel: "strict"is configured, it does not fully mitigate XSS risks—security advisories show past vulnerabilities even in strict mode. Although current usage involves static documentation, the component accepts untrusted input structurally. Add DOMPurify sanitization before injection as a defense-in-depth measure:Add DOMPurify sanitization
import { useEffect, useId, useState } from "react"; +import DOMPurify from "dompurify"; let mermaidLoader: Promise<typeof import("mermaid").default> | null = null; function loadMermaid() { if (!mermaidLoader) { mermaidLoader = import("mermaid").then(({ default: mermaid }) => { mermaid.initialize({ startOnLoad: false, securityLevel: "strict", theme: "dark", }); return mermaid; }); } return mermaidLoader; } export function Mermaid({ chart, caption }: { chart: string; caption?: string }) { const reactId = useId(); const diagramId = `agh-mermaid-${reactId.replace(/[^a-zA-Z0-9_-]/g, "")}`; const [svg, setSVG] = useState(""); const [error, setError] = useState(""); useEffect(() => { let active = true; setSVG(""); setError(""); void loadMermaid() .then(async mermaid => { const rendered = await mermaid.render(diagramId, chart); if (!active) return; - setSVG(rendered.svg); + const safeSvg = DOMPurify.sanitize(rendered.svg, { + USE_PROFILES: { svg: true, svgFilters: true }, + }); + setSVG(safeSvg); }) .catch(err => { if (!active) return; setError(err instanceof Error ? err.message : String(err)); }); return () => { active = false; }; }, [chart, diagramId]);🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/site/components/docs/mermaid.tsx` around lines 34 - 57, Sanitize the Mermaid-rendered SVG before injecting it into the DOM: import and use DOMPurify in the component (e.g., call DOMPurify.sanitize) on the output from mermaid.render inside the loadMermaid promise chain (where setSVG(rendered.svg) is currently called) and store/assign the sanitized HTML to state instead of the raw rendered.svg; then continue to use dangerouslySetInnerHTML with the sanitized string to provide defense-in-depth while retaining the existing component flow.packages/site/components/logos/claude.tsx (1)
13-13: Remove redundant empty class token incn().Line 13 can be simplified;
cn("", className)is equivalent tocn(className).Suggested patch
- className={cn("", className)} + className={cn(className)}🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/site/components/logos/claude.tsx` at line 13, The call to the classnames helper includes a redundant empty string token: replace the JSX attribute usage className={cn("", className)} with className={cn(className)} so the helper is invoked only with the actual className value; update the JSX in the Claude logo component where the cn helper is used to remove the empty string argument.packages/site/app/(home)/layout.tsx (1)
10-13: Remove redundant slot spread to reduce coupling.
Line 11spreadsbaseOptions.slots, but the shared options currently don’t define custom slots. Keeping only the explicitheaderoverride is clearer.♻️ Suggested cleanup
<HomeLayout {...baseOptions} slots={{ - ...baseOptions.slots, header: HomeHeader, }} >🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/site/app/`(home)/layout.tsx around lines 10 - 13, Remove the redundant spread of baseOptions.slots in the slots prop: instead of merging ...baseOptions.slots with header, provide only the explicit header override so slots is set to { header: HomeHeader }; update the component using the slots prop (the object currently referencing baseOptions.slots and HomeHeader) to stop spreading baseOptions.slots and pass header: HomeHeader directly.Makefile (1)
50-51: Avoid duplicating the CLI default output path in Make target.Since
agh docalready has a default output dir, consider removing--output-dir ...here (or centralizing this path in one variable) to reduce drift risk.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@Makefile` around lines 50 - 51, The Make target cli-docs currently repeats the CLI default output path by invoking "go run ./cmd/agh doc --output-dir packages/site/content/runtime/cli-reference"; change this to avoid duplication by either removing the "--output-dir ..." flag so the command uses agh's built-in default, or centralize the path into a single Make variable (e.g., DOC_OUTPUT) and reference that variable in the cli-docs recipe; update the cli-docs target to use the chosen approach and ensure any other Make targets use the same DOC_OUTPUT variable if you centralize the path.packages/site/components/landing/primitives/mono-badge.tsx (1)
18-23: Keep the component doc comment in sync with the rendered size.The comment says “11px” while the class on Line 23 is
text-[10px]. Consider aligning one of them to avoid drift.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/site/components/landing/primitives/mono-badge.tsx` around lines 18 - 23, The doc comment on the MonoBadge component is out of sync with its rendered size: the comment says "11px" but the span uses class "text-[10px]". Fix by making them consistent—either update the comment to "10px" to match the existing class, or change the class in MonoBadge from "text-[10px]" to "text-[11px]" so the comment remains accurate; ensure the change is applied to the MonoBadge component's return JSX and its top-line comment.packages/site/components/landing/primitives/code-block.tsx (1)
28-36: Minor: Consider cleaning up the timeout on unmount.If the component unmounts during the 1.5-second feedback window, the
setTimeoutcallback will still fire and attempt to update state on an unmounted component. While React 18+ handles this gracefully without errors, cleaning up is still good practice.♻️ Optional fix with cleanup
async function handleCopy() { + let timeoutId: ReturnType<typeof setTimeout>; try { await navigator.clipboard.writeText(code); setCopied(true); - setTimeout(() => setCopied(false), 1500); + timeoutId = setTimeout(() => setCopied(false), 1500); } catch { // clipboard blocked — drop silently } + return () => clearTimeout(timeoutId); }Alternatively, store the timeout ID in a ref and clear it in a cleanup effect.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/site/components/landing/primitives/code-block.tsx` around lines 28 - 36, The handleCopy function sets a 1.5s timeout that calls setCopied(false) but never clears the timer; store the timeout ID in a ref (e.g., copyTimeoutRef), clear any existing timeout before creating a new one, and add a useEffect cleanup that clears copyTimeoutRef.current on unmount; update handleCopy to assign the timer ID to the ref and clear it when appropriate so setCopied is never called after unmount.packages/site/app/protocol/[[...slug]]/page.tsx (1)
45-54: Consider adding the same empty-slug check ingenerateMetadata.The
Pagecomponent redirects whenslugis empty, butgenerateMetadatais invoked independently by Next.js and might receive an empty slug. IfprotocolDocs.getPage([])returnsundefined,notFound()is called, which works but could be made consistent with the redirect behavior.♻️ Optional: Mirror the redirect check
export async function generateMetadata(props: PageProps): Promise<Metadata> { const params = await props.params; + if (!params.slug || params.slug.length === 0) { + return { title: "Protocol Overview" }; + } const page = protocolDocs.getPage(params.slug); if (!page) notFound();This ensures consistent behavior and avoids the
notFound()path for the base route.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/site/app/protocol/`[[...slug]]/page.tsx around lines 45 - 54, generateMetadata currently calls protocolDocs.getPage(params.slug) and calls notFound() if missing; add the same empty-slug handling used in the Page component so metadata generation mirrors the redirect behavior: detect when params.slug is an empty array (e.g. params.slug?.length === 0) and perform the same redirect to the base protocol route instead of proceeding to protocolDocs.getPage, otherwise continue to fetch page and return title/description; reference generateMetadata, protocolDocs.getPage, notFound, and the Page component's redirect logic to implement the consistent check.internal/cli/docpost/docpost.go (1)
205-268: Wrap meta-generation errors with the failing path.These helpers return several bare filesystem/JSON errors, so a failure eventually surfaces as a generic post-process error without telling you which directory or file broke. Please add path-specific context before returning.
Proposed fix
func writeSubdirMetas(dstDir string) error { return filepath.WalkDir(dstDir, func(p string, d fs.DirEntry, err error) error { if err != nil { - return err + return fmt.Errorf("walk %s: %w", p, err) } if !d.IsDir() { return nil } rel, err := filepath.Rel(dstDir, p) if err != nil { - return err + return fmt.Errorf("rel %s: %w", p, err) } if rel == "." { return nil // root is hand-maintained } - return writeDirMeta(p) + if err := writeDirMeta(p); err != nil { + return fmt.Errorf("write meta for %s: %w", p, err) + } + return nil }) } func writeDirMeta(dir string) error { entries, err := os.ReadDir(dir) if err != nil { - return err + return fmt.Errorf("read dir %s: %w", dir, err) } … data, err := json.MarshalIndent(meta, "", " ") if err != nil { - return err + return fmt.Errorf("marshal meta for %s: %w", dir, err) } - return os.WriteFile(filepath.Join(dir, "meta.json"), append(data, '\n'), 0o600) + dst := filepath.Join(dir, "meta.json") + if err := os.WriteFile(dst, append(data, '\n'), 0o600); err != nil { + return fmt.Errorf("write %s: %w", dst, err) + } + return nil }As per coding guidelines, "Use explicit error returns with wrapped context:
fmt.Errorf(\"context: %w\", err)".🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/cli/docpost/docpost.go` around lines 205 - 268, The code returns bare filesystem/JSON errors making it unclear which directory failed; update writeSubdirMetas and writeDirMeta to wrap errors with path context using fmt.Errorf("... %s: %w", err). In writeSubdirMetas wrap the incoming callback err, the filepath.Rel error (include dstDir and p), and the writeDirMeta(p) error (include p) before returning; in writeDirMeta wrap errors from os.ReadDir(dir) (include dir), json.MarshalIndent(meta) (include dir), and os.WriteFile(..., filepath.Join(dir, "meta.json")) (include the target path) so every returned error indicates the failing path.internal/cli/docpost/docpost_test.go (1)
149-266: Add a regression case for indented blocks with blank lines.The suite exercises fenced snippets and inline code, but it never covers the
fenceIndentedBlocks()case where one indented example contains an empty line. A small fixture for that path would keep the formatter bug above from coming back.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/cli/docpost/docpost_test.go` around lines 149 - 266, Add a regression test that exercises the fenceIndentedBlocks() path where an indented code example contains a blank/empty line; update the test suite (e.g., add a new case in TestTransformMarkdown or a new TestFenceIndentedBlocksRegression) to feed TransformMarkdown() a markdown snippet with an indented code block that includes one or more empty lines and assert the output preserves the block (and that frontmatter/boilerplate stripping and link rewriting still behave). Ensure the test references fenceIndentedBlocks/TransformMarkdown so it fails if that code path regresses.
🤖 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/cli/doc_test.go`:
- Line 114: The test currently ignores the error returned by filepath.Rel (rel,
_ := filepath.Rel(outputDir, p)); update the test to check the error and fail
the test if non-nil (e.g., use t.Fatalf or t.Errorf with context), so replace
the blank identifier with err and handle it; refer to the variables and call
filepath.Rel(outputDir, p) and ensure the error is reported with the path
context (also apply the same fix at the other occurrence around p on the later
line).
- Around line 25-27: The test currently uses strings.Contains(help, "doc") which
can match substrings and produce false positives; update the assertion to check
for the doc command token precisely by examining the help string lines or using
a regex that matches a command entry (e.g., look for a line that starts with
optional whitespace then the literal "doc" followed by whitespace or a
column/description separator) instead of a simple substring check — locate the
test where the variable help is asserted and replace the strings.Contains check
with a line-scan or regex match that ensures "doc" appears as a standalone
command token.
- Around line 11-197: Convert each top-level test (TestNewDocCommand_Hidden,
TestNewDocCommand_NotInHelp, TestNewDocCommand_DefaultOutputDir,
TestNewDocCommand_GeneratesDocs, TestNewDocCommand_CreatesOutputDir,
TestNewDocCommand_GeneratesAllCommands) to use a t.Run("Should ...") subtest
wrapper and call t.Parallel() inside that subtest; keep the same assertions but
moved into the subtest closure. Replace the broad strings.Contains(help, "doc")
check in TestNewDocCommand_NotInHelp with an exact-word check (e.g. use a regexp
like regexp.MustCompile(`\bdoc\b`).MatchString(help) or iterate root.Commands()
and check command.Use == "doc") to avoid matching substrings like
"documentation". Fix the ignored errors from filepath.Rel in the WalkDir
closures in TestNewDocCommand_GeneratesDocs (where rel, _ :=
filepath.Rel(outputDir, p)) and the subsequent WalkDir (where rel, _ :=
filepath.Rel(outputDir, p)) by capturing the error, handling it (t.Fatalf or
returning the error) instead of discarding it, similar to the error handling
used in findMDX.
In `@internal/cli/doc.go`:
- Around line 18-23: The doc command currently swallows positional args because
RunE ignores the args parameter; update the command to reject unexpected
positional args by either setting the command's Args field to cobra.NoArgs or by
changing RunE to accept args (func(cmd *cobra.Command, args []string) error) and
returning an error when len(args) > 0; reference the cmd variable and the
existing RunE/root := cmd.Root() block to locate where to add this validation so
invoking `doc` with extra tokens returns a clear error instead of silently
ignoring them.
- Around line 22-42: The RunE handler should propagate cmd.Context() into the
doc generation pipeline: change the call site in RunE to pass cmd.Context() as
the first argument to docpost.Process and update the docpost.Process signature
to accept context.Context as its first parameter (i.e., func Process(ctx
context.Context, srcDir, outDir string) error). Also update any internal calls
inside the docpost package that call Process (and any helper functions used by
Process) to accept and forward the context, ensuring all filesystem-heavy
operations (in docpost.Process and its helpers) use the provided ctx for
cancellation and deadline checks.
In `@internal/cli/docpost/docpost.go`:
- Around line 354-405: The function fenceIndentedBlocks incorrectly closes an
opened fenced block when encountering an empty line inside an indented code
example, which drops blank lines from code samples; in fenceIndentedBlocks, keep
inIndent true for empty indented-code lines and do not emit the closing "```" on
the first empty line—specifically, in the branch handling "case inIndent &&
isEmpty" remove the lines that set inIndent = false and append the closing fence
and instead append the original line (preserving the blank line) so that only a
non-indented subsequent line or end-of-input closes the fence.
In `@packages/site/app/global.css`:
- Around line 250-255: The global rule that sets "box-shadow: none !important"
on the universal selectors (*, *::before, *::after) is removing Tailwind focus
rings used by keyboard navigation; remove that global box-shadow reset from
global.css (or at minimum narrow its scope to non-interactive decorative
elements only) and eliminate the "!important" so Tailwind's focus:ring-* and
focus-visible:ring-* utilities (used across UI components such as
network-protocol-visual.tsx) can render focus indicators correctly.
- Around line 27-30: The --font-display custom property is self-referential
(--font-display: var(--font-display), "Playfair Display", serif) which creates a
cyclic declaration and invalidates the value; update the declaration inside the
`@theme` inline block to remove the self-reference and instead reference the
correct source variable (e.g., var(--font-playfair)) or use the font name
directly (e.g., "Playfair Display", serif) so that --font-display resolves to a
valid value.
In `@packages/site/components/docs/doc-page-masthead.tsx`:
- Around line 8-17: The toLabel function can produce "undefined" when a slug
contains empty parts; change it to defensively skip or handle empty segments by
filtering out zero-length parts before mapping (or checking part.length and
returning an empty string for that segment) so that only non-empty parts are
transformed with part[0].toUpperCase() + part.slice(1) and then joined; update
the toLabel implementation to use this check/filter to avoid concatenating
"undefined" for malformed slugs.
In `@packages/site/components/docs/mermaid.tsx`:
- Around line 7-20: The dynamic import in loadMermaid currently assigns a
failing promise to the module-level mermaidLoader and never clears it, so any
transient import error blocks future attempts; update loadMermaid to attach a
.catch handler to the import promise (the promise assigned to mermaidLoader in
the import("mermaid").then(...) chain) that sets mermaidLoader = undefined
before rethrowing or returning the error so subsequent calls will retry the
import; reference the loadMermaid function and the mermaidLoader variable when
making this change.
In `@packages/site/components/landing/final-cta.tsx`:
- Line 33: final-cta.tsx currently hardcodes the GitHub href; replace that
literal with the shared GitHub URL constant used elsewhere (import the canonical
symbol, e.g. GITHUB_URL or githubUrl from the site's config/module) and use that
constant in the anchor's href in the FinalCTA component so all outbound GitHub
links come from one source; ensure you import the exact exported name used
across the site and update any imports/exports if needed so TypeScript/ESLint
still pass.
In `@packages/site/components/landing/install-section.tsx`:
- Around line 70-99: The tab pattern is incomplete: finish ARIA semantics by
giving each tab button an id and aria-controls that points to the corresponding
tabpanel, make the CodeBlock wrapper a role="tabpanel" with id matching
aria-controls and aria-labelledby pointing back to the active tab id, and ensure
tab buttons use aria-selected (already used) plus tabIndex (0 for selected, -1
for others); add keyboard handling on the tab buttons (e.g., a handleKeyDown
referenced from INSTALL_TABS mapping) to implement Left/Right/Home/End arrow
navigation that moves focus and calls setTab; update references to INSTALL_TABS,
tab, setTab, active, and CodeBlock to wire these attributes and the keydown
handler so the component implements a complete tab pattern.
In `@packages/site/components/landing/runtime-micro-diagram.tsx`:
- Around line 123-141: The injected animation CSS is only conditional on the
runtime reducedMotion prop (reducedMotion) which can cause a flash before
hydration; add a CSS-level guard using the prefers-reduced-motion media query
inside the style block so the browser immediately disables animations for users
who prefer reduced motion. Specifically, update the style injected by the
component rendering .agh-subsystem and `@keyframes` (in the same template string
around where reducedMotion is checked) to include a top-level `@media`
(prefers-reduced-motion: reduce) { .agh-subsystem { animation: none !important;
} } (and if desired also override animation-iteration-count/animation-name) to
ensure no animation runs before React hydration.
In `@packages/site/components/landing/runtime-section.tsx`:
- Line 54: The sticky utility on the div with className "h-full flex flex-col
justify-between lg:sticky" won't work because no inset (top/bottom) is provided;
update that element (the div in runtime-section.tsx) to include an appropriate
inset utility like lg:top-0 (or lg:top-<spacing> such as lg:top-6/lg:top-8)
alongside lg:sticky so the element actually sticks at the desired offset on
large screens.
In `@packages/site/components/logos/gemini.tsx`:
- Around line 17-145: The SVG uses static IDs (mask "gemini__a" and filters
"gemini__b"..."gemini__h") which will collide when GeminiLogo is rendered
multiple times; update the component (GeminiLogo) to generate a per-instance
unique suffix (e.g., React's useId() or a stable random/uuid) and append it to
every ID and all corresponding references (mask="url(#...)" and
filter="url(#...)") so each instance uses unique IDs like `${base}__a_${uid}`
for the mask and `${base}__b_${uid}` etc.; ensure the same uid is applied
consistently across <mask>, <defs> ids and every mask="url(#...)" /
filter="url(#...)" attribute so references still match.
In `@packages/site/components/logos/linear.tsx`:
- Around line 28-239: The SVG uses fixed IDs (a, b, c, ... and filter refs like
url(`#b`)) in the "icon" branch which causes collisions when multiple LinearLogo
components render; update the component (LinearLogo or the function that returns
the SVG for variant === "icon") to generate a stable unique prefix per instance
(e.g., React's useId() or an idPrefix prop) and prepend it to every id and every
reference (e.g., id={`${prefix}-a`} and fill={`url(#${prefix}-a)`},
filter={`url(#${prefix}-b)`}, etc.) for all gradient/filter/radial/filter ids
(a..n and b,c,e) so each SVG's defs and references remain isolated.
In `@packages/site/components/logos/opencode.tsx`:
- Around line 1-3: The type error is caused by using React.SVGProps without
importing React types; update the component type declarations by importing the
SVG prop types explicitly (e.g., import { SVGProps } from "react") and change
OpenCodeLogoProps to use SVGProps<SVGSVGElement> (and apply the same fix in
claude.tsx and gemini.tsx), ensuring you remove or replace any direct references
to the React namespace so TypeScript with jsx: "react-jsx" resolves the type
correctly.
---
Nitpick comments:
In `@internal/cli/docpost/docpost_test.go`:
- Around line 149-266: Add a regression test that exercises the
fenceIndentedBlocks() path where an indented code example contains a blank/empty
line; update the test suite (e.g., add a new case in TestTransformMarkdown or a
new TestFenceIndentedBlocksRegression) to feed TransformMarkdown() a markdown
snippet with an indented code block that includes one or more empty lines and
assert the output preserves the block (and that frontmatter/boilerplate
stripping and link rewriting still behave). Ensure the test references
fenceIndentedBlocks/TransformMarkdown so it fails if that code path regresses.
In `@internal/cli/docpost/docpost.go`:
- Around line 205-268: The code returns bare filesystem/JSON errors making it
unclear which directory failed; update writeSubdirMetas and writeDirMeta to wrap
errors with path context using fmt.Errorf("... %s: %w", err). In
writeSubdirMetas wrap the incoming callback err, the filepath.Rel error (include
dstDir and p), and the writeDirMeta(p) error (include p) before returning; in
writeDirMeta wrap errors from os.ReadDir(dir) (include dir),
json.MarshalIndent(meta) (include dir), and os.WriteFile(..., filepath.Join(dir,
"meta.json")) (include the target path) so every returned error indicates the
failing path.
In `@Makefile`:
- Around line 50-51: The Make target cli-docs currently repeats the CLI default
output path by invoking "go run ./cmd/agh doc --output-dir
packages/site/content/runtime/cli-reference"; change this to avoid duplication
by either removing the "--output-dir ..." flag so the command uses agh's
built-in default, or centralize the path into a single Make variable (e.g.,
DOC_OUTPUT) and reference that variable in the cli-docs recipe; update the
cli-docs target to use the chosen approach and ensure any other Make targets use
the same DOC_OUTPUT variable if you centralize the path.
In `@packages/site/app/`(home)/layout.tsx:
- Around line 10-13: Remove the redundant spread of baseOptions.slots in the
slots prop: instead of merging ...baseOptions.slots with header, provide only
the explicit header override so slots is set to { header: HomeHeader }; update
the component using the slots prop (the object currently referencing
baseOptions.slots and HomeHeader) to stop spreading baseOptions.slots and pass
header: HomeHeader directly.
In `@packages/site/app/protocol/`[[...slug]]/page.tsx:
- Around line 45-54: generateMetadata currently calls
protocolDocs.getPage(params.slug) and calls notFound() if missing; add the same
empty-slug handling used in the Page component so metadata generation mirrors
the redirect behavior: detect when params.slug is an empty array (e.g.
params.slug?.length === 0) and perform the same redirect to the base protocol
route instead of proceeding to protocolDocs.getPage, otherwise continue to fetch
page and return title/description; reference generateMetadata,
protocolDocs.getPage, notFound, and the Page component's redirect logic to
implement the consistent check.
In `@packages/site/components/docs/mermaid.tsx`:
- Around line 34-57: Sanitize the Mermaid-rendered SVG before injecting it into
the DOM: import and use DOMPurify in the component (e.g., call
DOMPurify.sanitize) on the output from mermaid.render inside the loadMermaid
promise chain (where setSVG(rendered.svg) is currently called) and store/assign
the sanitized HTML to state instead of the raw rendered.svg; then continue to
use dangerouslySetInnerHTML with the sanitized string to provide
defense-in-depth while retaining the existing component flow.
In `@packages/site/components/landing/primitives/code-block.tsx`:
- Around line 28-36: The handleCopy function sets a 1.5s timeout that calls
setCopied(false) but never clears the timer; store the timeout ID in a ref
(e.g., copyTimeoutRef), clear any existing timeout before creating a new one,
and add a useEffect cleanup that clears copyTimeoutRef.current on unmount;
update handleCopy to assign the timer ID to the ref and clear it when
appropriate so setCopied is never called after unmount.
In `@packages/site/components/landing/primitives/mono-badge.tsx`:
- Around line 18-23: The doc comment on the MonoBadge component is out of sync
with its rendered size: the comment says "11px" but the span uses class
"text-[10px]". Fix by making them consistent—either update the comment to "10px"
to match the existing class, or change the class in MonoBadge from "text-[10px]"
to "text-[11px]" so the comment remains accurate; ensure the change is applied
to the MonoBadge component's return JSX and its top-line comment.
In `@packages/site/components/logos/claude.tsx`:
- Line 13: The call to the classnames helper includes a redundant empty string
token: replace the JSX attribute usage className={cn("", className)} with
className={cn(className)} so the helper is invoked only with the actual
className value; update the JSX in the Claude logo component where the cn helper
is used to remove the empty string argument.
🪄 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: d1cf57bc-b384-4c7a-93a4-864f78571fee
⛔ Files ignored due to path filters (228)
.agents/skills/audit/SKILL.mdis excluded by!**/*.md,!.agents/**.agents/skills/bolder/SKILL.mdis excluded by!**/*.md,!.agents/**.agents/skills/colorize/SKILL.mdis excluded by!**/*.md,!.agents/**.agents/skills/critique/SKILL.mdis excluded by!**/*.md,!.agents/**.agents/skills/critique/reference/personas.mdis excluded by!**/*.md,!.agents/**.agents/skills/delight/SKILL.mdis excluded by!**/*.md,!.agents/**.agents/skills/layout/SKILL.mdis excluded by!**/*.md,!.agents/**.agents/skills/optimize/SKILL.mdis excluded by!**/*.md,!.agents/**.agents/skills/polish/SKILL.mdis excluded by!**/*.md,!.agents/**.agents/skills/remotion-best-practices/SKILL.mdis excluded by!**/*.md,!.agents/**.agents/skills/remotion-best-practices/rules/3d.mdis excluded by!**/*.md,!.agents/**.agents/skills/remotion-best-practices/rules/animations.mdis excluded by!**/*.md,!.agents/**.agents/skills/remotion-best-practices/rules/assets.mdis excluded by!**/*.md,!.agents/**.agents/skills/remotion-best-practices/rules/assets/charts-bar-chart.tsxis excluded by!.agents/**.agents/skills/remotion-best-practices/rules/assets/text-animations-typewriter.tsxis excluded by!.agents/**.agents/skills/remotion-best-practices/rules/assets/text-animations-word-highlight.tsxis excluded by!.agents/**.agents/skills/remotion-best-practices/rules/audio-visualization.mdis excluded by!**/*.md,!.agents/**.agents/skills/remotion-best-practices/rules/audio.mdis excluded by!**/*.md,!.agents/**.agents/skills/remotion-best-practices/rules/calculate-metadata.mdis excluded by!**/*.md,!.agents/**.agents/skills/remotion-best-practices/rules/can-decode.mdis excluded by!**/*.md,!.agents/**.agents/skills/remotion-best-practices/rules/charts.mdis excluded by!**/*.md,!.agents/**.agents/skills/remotion-best-practices/rules/compositions.mdis excluded by!**/*.md,!.agents/**.agents/skills/remotion-best-practices/rules/display-captions.mdis excluded by!**/*.md,!.agents/**.agents/skills/remotion-best-practices/rules/extract-frames.mdis excluded by!**/*.md,!.agents/**.agents/skills/remotion-best-practices/rules/ffmpeg.mdis excluded by!**/*.md,!.agents/**.agents/skills/remotion-best-practices/rules/fonts.mdis excluded by!**/*.md,!.agents/**.agents/skills/remotion-best-practices/rules/get-audio-duration.mdis excluded by!**/*.md,!.agents/**.agents/skills/remotion-best-practices/rules/get-video-dimensions.mdis excluded by!**/*.md,!.agents/**.agents/skills/remotion-best-practices/rules/get-video-duration.mdis excluded by!**/*.md,!.agents/**.agents/skills/remotion-best-practices/rules/gifs.mdis excluded by!**/*.md,!.agents/**.agents/skills/remotion-best-practices/rules/images.mdis excluded by!**/*.md,!.agents/**.agents/skills/remotion-best-practices/rules/import-srt-captions.mdis excluded by!**/*.md,!.agents/**.agents/skills/remotion-best-practices/rules/light-leaks.mdis excluded by!**/*.md,!.agents/**.agents/skills/remotion-best-practices/rules/lottie.mdis excluded by!**/*.md,!.agents/**.agents/skills/remotion-best-practices/rules/maps.mdis excluded by!**/*.md,!.agents/**.agents/skills/remotion-best-practices/rules/measuring-dom-nodes.mdis excluded by!**/*.md,!.agents/**.agents/skills/remotion-best-practices/rules/measuring-text.mdis excluded by!**/*.md,!.agents/**.agents/skills/remotion-best-practices/rules/parameters.mdis excluded by!**/*.md,!.agents/**.agents/skills/remotion-best-practices/rules/sequencing.mdis excluded by!**/*.md,!.agents/**.agents/skills/remotion-best-practices/rules/sfx.mdis excluded by!**/*.md,!.agents/**.agents/skills/remotion-best-practices/rules/silence-detection.mdis excluded by!**/*.md,!.agents/**.agents/skills/remotion-best-practices/rules/subtitles.mdis excluded by!**/*.md,!.agents/**.agents/skills/remotion-best-practices/rules/tailwind.mdis excluded by!**/*.md,!.agents/**.agents/skills/remotion-best-practices/rules/text-animations.mdis excluded by!**/*.md,!.agents/**.agents/skills/remotion-best-practices/rules/timing.mdis excluded by!**/*.md,!.agents/**.agents/skills/remotion-best-practices/rules/transcribe-captions.mdis excluded by!**/*.md,!.agents/**.agents/skills/remotion-best-practices/rules/transitions.mdis excluded by!**/*.md,!.agents/**.agents/skills/remotion-best-practices/rules/transparent-videos.mdis excluded by!**/*.md,!.agents/**.agents/skills/remotion-best-practices/rules/trimming.mdis excluded by!**/*.md,!.agents/**.agents/skills/remotion-best-practices/rules/videos.mdis excluded by!**/*.md,!.agents/**.agents/skills/remotion-best-practices/rules/voiceover.mdis excluded by!**/*.md,!.agents/**.agents/skills/tech-logos/SKILL.mdis excluded by!**/*.md,!.agents/**.agents/skills/typeset/SKILL.mdis excluded by!**/*.md,!.agents/**.codex/plans/2026-04-15-site-paper-redesign.mdis excluded by!**/*.md.codex/plans/2026-04-15-site-positioning-rewrite.mdis excluded by!**/*.md.codex/plans/2026-04-16-runtime-nav-reorg.mdis excluded by!**/*.md.compozy/tasks/site/_meta.mdis excluded by!**/*.md.compozy/tasks/site/_tasks.mdis excluded by!**/*.md.compozy/tasks/site/_techspec.mdis excluded by!**/*.md.compozy/tasks/site/memory/MEMORY.mdis excluded by!**/*.md.compozy/tasks/site/memory/task_01.mdis excluded by!**/*.md.compozy/tasks/site/memory/task_02.mdis excluded by!**/*.md.compozy/tasks/site/memory/task_03.mdis excluded by!**/*.md.compozy/tasks/site/memory/task_04.mdis excluded by!**/*.md.compozy/tasks/site/memory/task_05.mdis excluded by!**/*.md.compozy/tasks/site/memory/task_06.mdis excluded by!**/*.md.compozy/tasks/site/memory/task_07.mdis excluded by!**/*.md.compozy/tasks/site/memory/task_08.mdis excluded by!**/*.md.compozy/tasks/site/memory/task_09.mdis excluded by!**/*.md.compozy/tasks/site/memory/task_10.mdis excluded by!**/*.md.compozy/tasks/site/memory/task_11.mdis excluded by!**/*.md.compozy/tasks/site/memory/task_12.mdis excluded by!**/*.md.compozy/tasks/site/memory/task_13.mdis excluded by!**/*.md.compozy/tasks/site/memory/task_14.mdis excluded by!**/*.md.compozy/tasks/site/memory/task_15.mdis excluded by!**/*.md.compozy/tasks/site/memory/task_16.mdis excluded by!**/*.md.compozy/tasks/site/memory/task_17.mdis excluded by!**/*.md.compozy/tasks/site/memory/task_18.mdis excluded by!**/*.md.compozy/tasks/site/memory/task_19.mdis excluded by!**/*.md.compozy/tasks/site/memory/task_20.mdis excluded by!**/*.md.compozy/tasks/site/memory/task_21.mdis excluded by!**/*.md.compozy/tasks/site/task_01.mdis excluded by!**/*.md.compozy/tasks/site/task_02.mdis excluded by!**/*.md.compozy/tasks/site/task_03.mdis excluded by!**/*.md.compozy/tasks/site/task_04.mdis excluded by!**/*.md.compozy/tasks/site/task_05.mdis excluded by!**/*.md.compozy/tasks/site/task_06.mdis excluded by!**/*.md.compozy/tasks/site/task_07.mdis excluded by!**/*.md.compozy/tasks/site/task_08.mdis excluded by!**/*.md.compozy/tasks/site/task_09.mdis excluded by!**/*.md.compozy/tasks/site/task_10.mdis excluded by!**/*.md.compozy/tasks/site/task_11.mdis excluded by!**/*.md.compozy/tasks/site/task_12.mdis excluded by!**/*.md.compozy/tasks/site/task_13.mdis excluded by!**/*.md.compozy/tasks/site/task_14.mdis excluded by!**/*.md.compozy/tasks/site/task_15.mdis excluded by!**/*.md.compozy/tasks/site/task_16.mdis excluded by!**/*.md.compozy/tasks/site/task_17.mdis excluded by!**/*.md.compozy/tasks/site/task_18.mdis excluded by!**/*.md.compozy/tasks/site/task_19.mdis excluded by!**/*.md.compozy/tasks/site/task_20.mdis excluded by!**/*.md.compozy/tasks/site/task_21.mdis excluded by!**/*.mdREADME.mdis excluded by!**/*.mdbun.lockis excluded by!**/*.lockgo.sumis excluded by!**/*.sumpackage.jsonis excluded by!**/*.jsonpackages/site/components.jsonis excluded by!**/*.jsonpackages/site/content/protocol/conformance.mdxis excluded by!**/*.mdxpackages/site/content/protocol/delivery.mdxis excluded by!**/*.mdxpackages/site/content/protocol/ed25519-jcs.mdxis excluded by!**/*.mdxpackages/site/content/protocol/envelope.mdxis excluded by!**/*.mdxpackages/site/content/protocol/examples.mdxis excluded by!**/*.mdxpackages/site/content/protocol/guide/meta.jsonis excluded by!**/*.jsonpackages/site/content/protocol/guide/minimal-sender.mdxis excluded by!**/*.mdxpackages/site/content/protocol/guide/nats-transport.mdxis excluded by!**/*.mdxpackages/site/content/protocol/guide/testing.mdxis excluded by!**/*.mdxpackages/site/content/protocol/guide/trust-verification.mdxis excluded by!**/*.mdxpackages/site/content/protocol/index.mdxis excluded by!**/*.mdxpackages/site/content/protocol/interactions.mdxis excluded by!**/*.mdxpackages/site/content/protocol/message-kinds.mdxis excluded by!**/*.mdxpackages/site/content/protocol/meta.jsonis excluded by!**/*.jsonpackages/site/content/protocol/nats.mdxis excluded by!**/*.mdxpackages/site/content/protocol/overview.mdxis excluded by!**/*.mdxpackages/site/content/protocol/peer-discovery.mdxis excluded by!**/*.mdxpackages/site/content/protocol/recipes.mdxis excluded by!**/*.mdxpackages/site/content/protocol/verification.mdxis excluded by!**/*.mdxpackages/site/content/runtime/api-reference/index.mdxis excluded by!**/*.mdxpackages/site/content/runtime/api-reference/meta.jsonis excluded by!**/*.jsonpackages/site/content/runtime/cli-reference/agent/index.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/agent/info.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/agent/list.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/agent/meta.jsonis excluded by!**/*.jsonpackages/site/content/runtime/cli-reference/agh.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/automation/index.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/automation/jobs/create.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/automation/jobs/delete.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/automation/jobs/get.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/automation/jobs/history.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/automation/jobs/index.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/automation/jobs/meta.jsonis excluded by!**/*.jsonpackages/site/content/runtime/cli-reference/automation/jobs/trigger.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/automation/jobs/update.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/automation/meta.jsonis excluded by!**/*.jsonpackages/site/content/runtime/cli-reference/automation/runs/get.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/automation/runs/index.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/automation/runs/meta.jsonis excluded by!**/*.jsonpackages/site/content/runtime/cli-reference/automation/triggers/create.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/automation/triggers/delete.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/automation/triggers/get.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/automation/triggers/history.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/automation/triggers/index.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/automation/triggers/meta.jsonis excluded by!**/*.jsonpackages/site/content/runtime/cli-reference/automation/triggers/update.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/bridge/create.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/bridge/disable.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/bridge/enable.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/bridge/get.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/bridge/index.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/bridge/list.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/bridge/meta.jsonis excluded by!**/*.jsonpackages/site/content/runtime/cli-reference/bridge/restart.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/bridge/routes.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/bridge/test-delivery.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/bridge/update.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/completion/bash.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/completion/fish.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/completion/index.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/completion/meta.jsonis excluded by!**/*.jsonpackages/site/content/runtime/cli-reference/completion/powershell.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/completion/zsh.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/daemon/index.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/daemon/meta.jsonis excluded by!**/*.jsonpackages/site/content/runtime/cli-reference/daemon/start.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/daemon/status.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/daemon/stop.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/extension/disable.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/extension/enable.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/extension/index.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/extension/install.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/extension/list.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/extension/meta.jsonis excluded by!**/*.jsonpackages/site/content/runtime/cli-reference/extension/remove.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/extension/search.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/extension/status.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/extension/update.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/hooks/events.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/hooks/index.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/hooks/info.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/hooks/list.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/hooks/meta.jsonis excluded by!**/*.jsonpackages/site/content/runtime/cli-reference/hooks/runs.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/index.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/install.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/memory/consolidate.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/memory/delete.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/memory/index.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/memory/list.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/memory/meta.jsonis excluded by!**/*.jsonpackages/site/content/runtime/cli-reference/memory/read.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/memory/write.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/meta.jsonis excluded by!**/*.jsonpackages/site/content/runtime/cli-reference/network/channels.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/network/inbox.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/network/index.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/network/meta.jsonis excluded by!**/*.jsonpackages/site/content/runtime/cli-reference/network/peers.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/network/send.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/network/status.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/observe/events.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/observe/health.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/observe/index.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/observe/meta.jsonis excluded by!**/*.jsonpackages/site/content/runtime/cli-reference/session/events.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/session/history.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/session/index.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/session/list.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/session/meta.jsonis excluded by!**/*.jsonpackages/site/content/runtime/cli-reference/session/new.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/session/prompt.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/session/resume.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/session/status.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/session/stop.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/session/wait.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/skill/create.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/skill/index.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/skill/info.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/skill/install.mdxis excluded by!**/*.mdxpackages/site/content/runtime/cli-reference/skill/list.mdxis excluded by!**/*.mdx
📒 Files selected for processing (72)
.gitignoreMakefilego.modinternal/cli/agent.gointernal/cli/daemon.gointernal/cli/doc.gointernal/cli/doc_test.gointernal/cli/docpost/docpost.gointernal/cli/docpost/docpost_test.gointernal/cli/install.gointernal/cli/memory.gointernal/cli/root.gointernal/cli/session.gointernal/cli/skill_commands.gointernal/cli/workspace.gopackages/site/app/(home)/layout.tsxpackages/site/app/(home)/page.tsxpackages/site/app/api/search/route.tspackages/site/app/global.csspackages/site/app/layout.tsxpackages/site/app/protocol/[[...slug]]/page.tsxpackages/site/app/protocol/layout.tsxpackages/site/app/runtime/[[...slug]]/page.tsxpackages/site/app/runtime/layout.tsxpackages/site/components/docs/doc-page-masthead.test.tsxpackages/site/components/docs/doc-page-masthead.tsxpackages/site/components/docs/mdx-blocks.tsxpackages/site/components/docs/mermaid.tsxpackages/site/components/landing/__tests__/landing.test.tsxpackages/site/components/landing/bridges-section.tsxpackages/site/components/landing/comparison.tsxpackages/site/components/landing/extensibility-section.tsxpackages/site/components/landing/features-section.tsxpackages/site/components/landing/final-cta.tsxpackages/site/components/landing/hero-player.tsxpackages/site/components/landing/hero.tsxpackages/site/components/landing/index.tspackages/site/components/landing/install-section.tsxpackages/site/components/landing/network-protocol-visual.tsxpackages/site/components/landing/network-section.tsxpackages/site/components/landing/primitives/animated-diagram.tsxpackages/site/components/landing/primitives/code-block.tsxpackages/site/components/landing/primitives/cta-button.tsxpackages/site/components/landing/primitives/feature-card.tsxpackages/site/components/landing/primitives/index.tspackages/site/components/landing/primitives/kind-chip.tsxpackages/site/components/landing/primitives/mono-badge.tsxpackages/site/components/landing/primitives/section-frame.tsxpackages/site/components/landing/primitives/section-header.tsxpackages/site/components/landing/primitives/use-reduced-motion.tspackages/site/components/landing/runtime-micro-diagram.tsxpackages/site/components/landing/runtime-section.tsxpackages/site/components/landing/supported-agents.tsxpackages/site/components/logo.tsxpackages/site/components/logos/claude.tsxpackages/site/components/logos/cursor.tsxpackages/site/components/logos/discord.tsxpackages/site/components/logos/gemini.tsxpackages/site/components/logos/github.tsxpackages/site/components/logos/google-chat.tsxpackages/site/components/logos/index.tspackages/site/components/logos/kiro.tsxpackages/site/components/logos/linear.tsxpackages/site/components/logos/microsoft-teams.tsxpackages/site/components/logos/openai.tsxpackages/site/components/logos/opencode.tsxpackages/site/components/logos/pi.tsxpackages/site/components/logos/slack.tsxpackages/site/components/logos/telegram.tsxpackages/site/components/logos/whatsapp.tsxpackages/site/components/protocol/architecture-diagram.tsxpackages/site/components/site/home-header.tsx
There was a problem hiding this comment.
Actionable comments posted: 2
🧹 Nitpick comments (5)
packages/site/components/logos/logos.test.tsx (1)
29-35: Optional: also validate mask references resolve to real mask IDs.Line 35 checks uniqueness, but not reference integrity. A broken
url(#...)target could still pass if unique.🔍 Suggested test hardening
const ids = getIds(container, "mask[id], filter[id]"); + const maskIds = new Set(getIds(container, "mask[id]")); const maskRefs = Array.from(container.querySelectorAll<SVGGElement>("g[mask]"), element => element.getAttribute("mask") ); expect(ids.length).toBeGreaterThan(0); expect(new Set(ids).size).toBe(ids.length); expect(new Set(maskRefs).size).toBe(maskRefs.length); + for (const ref of maskRefs) { + expect(ref).toMatch(/^url\(#.+\)$/); + const referencedId = ref!.slice(5, -1); + expect(maskIds.has(referencedId)).toBe(true); + }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/site/components/logos/logos.test.tsx` around lines 29 - 35, The test currently collects maskRefs from container.querySelectorAll("g[mask]") but only asserts uniqueness; update the test to also resolve each mask reference string (e.g. "url(`#foo`)" or "#foo") to extract the referenced id and assert that an element with that id exists in the rendered container (use container.querySelector(`#${id}`) or container.querySelector(`mask#${id}, [id="${id}"]`) for robustness); keep the existing uniqueness assertions for ids and maskRefs and add the new existence assertion for each entry in maskRefs to ensure references point to real mask elements.internal/cli/docpost/docpost.go (2)
163-176: Remove unused parameter from function signature.The
_ map[string]boolparameter is never used within the function body. This appears to be leftover from a refactor.♻️ Proposed fix
-func buildTargetMap(inputs []input, _ map[string]bool) map[string]string { +func buildTargetMap(inputs []input) map[string]string {Also update the call site in
Process:- targets := buildTargetMap(inputs, hasChildren) + targets := buildTargetMap(inputs)🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/cli/docpost/docpost.go` around lines 163 - 176, Remove the unused parameter from the buildTargetMap signature and update its call site(s): change func buildTargetMap(inputs []input, _ map[string]bool) to func buildTargetMap(inputs []input) and remove the extra argument where buildTargetMap is invoked (e.g., in Process). Ensure any reference to the removed map parameter is eliminated and run tests/compile to confirm no remaining usages.
515-523: Consider whether nil context should be allowed.The function silently accepts
nilcontext and returnsnilerror. While this is defensive, it could mask bugs where context was accidentally not passed. For a documentation generation tool, this pragmatic approach is acceptable, but you may want to document this behavior or consider returningcontext.Background().Err()instead.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@internal/cli/docpost/docpost.go` around lines 515 - 523, The current ensureContext function silently accepts a nil ctx which can hide bugs; change ensureContext to treat a nil context as an error by returning a descriptive error (e.g. fmt.Errorf("docpost: %s: nil context", action)) instead of nil, update the function signature body in ensureContext to check if ctx == nil then return that error, and keep the existing ctx.Err() handling for non-nil contexts.packages/site/components/docs/mermaid.tsx (1)
61-61: Add DOMPurify sanitization before SVG injection.Line 61 injects SVG from
mermaid.render()directly viadangerouslySetInnerHTML. WhilesecurityLevel: "strict"is configured, Mermaid's security documentation confirms this does not fully guarantee safe output—additional sanitization with DOMPurify is recommended as defense in depth.Suggested hardening
import { useEffect, useId, useState } from "react"; +import DOMPurify from "dompurify"; @@ .then(async mermaid => { const rendered = await mermaid.render(diagramId, chart); if (!active) return; - setSVG(rendered.svg); + setSVG( + DOMPurify.sanitize(rendered.svg, { + USE_PROFILES: { svg: true, svgFilters: true }, + }) + ); })🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/site/components/docs/mermaid.tsx` at line 61, The component currently injects raw SVG from mermaid.render() via dangerouslySetInnerHTML (the svg variable); harden this by passing svg through DOMPurify.sanitize before injection. Import and use DOMPurify (e.g., DOMPurify.sanitize(svg, { ADD_ATTR: [...] } if needed) or default options) and replace dangerouslySetInnerHTML={{ __html: svg }} with the sanitized output so the component that calls mermaid.render() and uses dangerouslySetInnerHTML uses DOMPurify.sanitize(svg) instead.packages/site/app/global.css (1)
12-12: Remove unused.stylelintrc.jsonor configure it to handle Tailwind v4 at-rules if Stylelint is planned for use.The
.stylelintrc.jsonconfiguration file exists in the repository, but Stylelint is not installed as a dependency or used in the CI pipeline. However, if this configuration is intended for future use,@source(line 12) and@theme(line 27) are Tailwind v4 directives that would be flagged as unknown by the inheritedscss/at-rule-no-unknownrule. Either remove the unused configuration or addignoreAtRules: ["source", "theme"]to thescss/at-rule-no-unknownrule if Stylelint adoption is planned.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/site/app/global.css` at line 12, The repository contains a .stylelintrc.json that will flag Tailwind v4 at-rules like `@source` and `@theme` (seen in global.css) as unknown under the scss/at-rule-no-unknown rule; either delete the unused .stylelintrc.json if Stylelint isn’t being used, or update that rule in .stylelintrc.json to add ignoreAtRules: ["source","theme"] so Stylelint accepts Tailwind v4 directives (refer to the `@source` and `@theme` tokens and the scss/at-rule-no-unknown rule when making the change).
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@packages/site/app/global.test.ts`:
- Around line 5-6: The test reads fixtures using process.cwd() which breaks when
vitest is run from the repo root; change the path resolution for globalCSS and
layoutSource to be relative to this test file by deriving the test directory
from import.meta.url (use fileURLToPath(import.meta.url) and path.dirname) and
then join that directory with "app/global.css" and "app/layout.tsx" before
calling readFileSync; update references to the variables globalCSS and
layoutSource accordingly so they load the correct files regardless of the
process working directory.
In `@packages/site/components/landing/install-section.tsx`:
- Around line 28-29: The install section currently exposes a piped command via
the "command" property which encourages unsafe curl | sh usage; update the
install entry in packages/site/components/landing/install-section.tsx to replace
that single piped command with explicit steps: provide a safe download URL for
the prebuilt binary, a checksum or signature value, and step-by-step
instructions (e.g., curl -fsSL -o <file>, verify checksum or gpg signature, then
chmod +x and ./install) and update the "note" text accordingly; target the
specific install object by its "command" and "note" properties so the UI shows
download → verify → execute steps instead of a direct pipe-to-shell.
---
Nitpick comments:
In `@internal/cli/docpost/docpost.go`:
- Around line 163-176: Remove the unused parameter from the buildTargetMap
signature and update its call site(s): change func buildTargetMap(inputs
[]input, _ map[string]bool) to func buildTargetMap(inputs []input) and remove
the extra argument where buildTargetMap is invoked (e.g., in Process). Ensure
any reference to the removed map parameter is eliminated and run tests/compile
to confirm no remaining usages.
- Around line 515-523: The current ensureContext function silently accepts a nil
ctx which can hide bugs; change ensureContext to treat a nil context as an error
by returning a descriptive error (e.g. fmt.Errorf("docpost: %s: nil context",
action)) instead of nil, update the function signature body in ensureContext to
check if ctx == nil then return that error, and keep the existing ctx.Err()
handling for non-nil contexts.
In `@packages/site/app/global.css`:
- Line 12: The repository contains a .stylelintrc.json that will flag Tailwind
v4 at-rules like `@source` and `@theme` (seen in global.css) as unknown under the
scss/at-rule-no-unknown rule; either delete the unused .stylelintrc.json if
Stylelint isn’t being used, or update that rule in .stylelintrc.json to add
ignoreAtRules: ["source","theme"] so Stylelint accepts Tailwind v4 directives
(refer to the `@source` and `@theme` tokens and the scss/at-rule-no-unknown rule
when making the change).
In `@packages/site/components/docs/mermaid.tsx`:
- Line 61: The component currently injects raw SVG from mermaid.render() via
dangerouslySetInnerHTML (the svg variable); harden this by passing svg through
DOMPurify.sanitize before injection. Import and use DOMPurify (e.g.,
DOMPurify.sanitize(svg, { ADD_ATTR: [...] } if needed) or default options) and
replace dangerouslySetInnerHTML={{ __html: svg }} with the sanitized output so
the component that calls mermaid.render() and uses dangerouslySetInnerHTML uses
DOMPurify.sanitize(svg) instead.
In `@packages/site/components/logos/logos.test.tsx`:
- Around line 29-35: The test currently collects maskRefs from
container.querySelectorAll("g[mask]") but only asserts uniqueness; update the
test to also resolve each mask reference string (e.g. "url(`#foo`)" or "#foo") to
extract the referenced id and assert that an element with that id exists in the
rendered container (use container.querySelector(`#${id}`) or
container.querySelector(`mask#${id}, [id="${id}"]`) for robustness); keep the
existing uniqueness assertions for ids and maskRefs and add the new existence
assertion for each entry in maskRefs to ensure references point to real mask
elements.
🪄 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: af5fe96c-71c7-41e1-81f7-362851515352
⛔ Files ignored due to path filters (27)
.compozy/tasks/site/reviews-001/_meta.mdis excluded by!**/*.md.compozy/tasks/site/reviews-001/issue_001.mdis excluded by!**/*.md.compozy/tasks/site/reviews-001/issue_002.mdis excluded by!**/*.md.compozy/tasks/site/reviews-001/issue_003.mdis excluded by!**/*.md.compozy/tasks/site/reviews-001/issue_004.mdis excluded by!**/*.md.compozy/tasks/site/reviews-001/issue_005.mdis excluded by!**/*.md.compozy/tasks/site/reviews-001/issue_006.mdis excluded by!**/*.md.compozy/tasks/site/reviews-001/issue_007.mdis excluded by!**/*.md.compozy/tasks/site/reviews-001/issue_008.mdis excluded by!**/*.md.compozy/tasks/site/reviews-001/issue_009.mdis excluded by!**/*.md.compozy/tasks/site/reviews-001/issue_010.mdis excluded by!**/*.md.compozy/tasks/site/reviews-001/issue_011.mdis excluded by!**/*.md.compozy/tasks/site/reviews-001/issue_012.mdis excluded by!**/*.md.compozy/tasks/site/reviews-001/issue_013.mdis excluded by!**/*.md.compozy/tasks/site/reviews-001/issue_014.mdis excluded by!**/*.md.compozy/tasks/site/reviews-001/issue_015.mdis excluded by!**/*.md.compozy/tasks/site/reviews-001/issue_016.mdis excluded by!**/*.md.compozy/tasks/site/reviews-001/issue_017.mdis excluded by!**/*.md.compozy/tasks/site/reviews-001/issue_018.mdis excluded by!**/*.md.compozy/tasks/site/reviews-001/issue_019.mdis excluded by!**/*.md.compozy/tasks/site/reviews-001/issue_020.mdis excluded by!**/*.md.compozy/tasks/site/reviews-001/issue_021.mdis excluded by!**/*.md.compozy/tasks/site/reviews-001/issue_022.mdis excluded by!**/*.md.compozy/tasks/site/reviews-001/issue_023.mdis excluded by!**/*.md.compozy/tasks/site/reviews-001/issue_024.mdis excluded by!**/*.md.compozy/tasks/site/reviews-001/issue_025.mdis excluded by!**/*.md.compozy/tasks/site/reviews-001/issue_026.mdis excluded by!**/*.md
📒 Files selected for processing (20)
internal/cli/doc.gointernal/cli/doc_test.gointernal/cli/docpost/docpost.gointernal/cli/docpost/docpost_test.gopackages/site/app/global.csspackages/site/app/global.test.tspackages/site/app/layout.tsxpackages/site/components/docs/doc-page-masthead.test.tsxpackages/site/components/docs/doc-page-masthead.tsxpackages/site/components/docs/mermaid.test.tsxpackages/site/components/docs/mermaid.tsxpackages/site/components/landing/__tests__/landing.test.tsxpackages/site/components/landing/final-cta.tsxpackages/site/components/landing/install-section.tsxpackages/site/components/landing/runtime-micro-diagram.tsxpackages/site/components/landing/runtime-section.tsxpackages/site/components/logos/claude.tsxpackages/site/components/logos/gemini.tsxpackages/site/components/logos/linear.tsxpackages/site/components/logos/logos.test.tsx
✅ Files skipped from review due to trivial changes (4)
- packages/site/components/landing/runtime-section.tsx
- packages/site/components/logos/linear.tsx
- internal/cli/doc_test.go
- packages/site/components/landing/tests/landing.test.tsx
🚧 Files skipped from review as they are similar to previous changes (8)
- packages/site/components/docs/doc-page-masthead.test.tsx
- packages/site/components/landing/final-cta.tsx
- packages/site/components/landing/runtime-micro-diagram.tsx
- packages/site/app/layout.tsx
- packages/site/components/logos/gemini.tsx
- packages/site/components/logos/claude.tsx
- internal/cli/doc.go
- packages/site/components/docs/doc-page-masthead.tsx
| const globalCSS = readFileSync(path.join(process.cwd(), "app", "global.css"), "utf8"); | ||
| const layoutSource = readFileSync(path.join(process.cwd(), "app", "layout.tsx"), "utf8"); |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "1) Verify cwd-based path resolution in test:"
rg -n 'process\.cwd\(\)' packages/site/app/global.test.ts
echo
echo "2) Verify vitest config has no explicit root:"
rg -n '^\s*root\s*:' packages/site/vitest.config.ts || trueRepository: compozy/agh
Length of output: 327
🏁 Script executed:
# Check if the test file uses ES modules and verify directory structure
echo "1) Test file location and content (first 20 lines):"
head -20 packages/site/app/global.test.ts
echo
echo "2) Verify if referenced CSS/TSX files exist relative to test:"
ls -la packages/site/app/ | grep -E "\.(css|tsx)$"
echo
echo "3) Check package.json type for ES module support:"
jq '.type' packages/site/package.json
echo
echo "4) Full vitest config to understand root behavior:"
cat packages/site/vitest.config.tsRepository: compozy/agh
Length of output: 1980
🏁 Script executed:
# Check how vitest might be invoked - root package.json and monorepo structure
echo "1) Root package.json scripts (test-related):"
jq '.scripts | with_entries(select(.value | contains("test") or contains("vitest")))' package.json || echo "No matching scripts found"
echo
echo "2) Check if vitest config exists at root:"
ls -la vitest.config.* 2>/dev/null || echo "No vitest config at root"
echo
echo "3) Monorepo root structure - check for workspaces:"
jq '.workspaces' package.json 2>/dev/null || echo "No workspaces config"
echo
echo "4) Check if there's a test script or CI config that might run from root:"
head -30 .github/workflows/test.yml 2>/dev/null || echo "No test workflow found"Repository: compozy/agh
Length of output: 516
🏁 Script executed:
# Check the root vitest config to understand workspace handling
echo "Root vitest.config.ts:"
cat vitest.config.tsRepository: compozy/agh
Length of output: 655
Resolve test fixture paths relative to the test file, not process.cwd().
When bunx vitest run executes from the monorepo root, process.cwd() is the repository root, not packages/site. Lines 5–6 attempt to load fixtures using process.cwd() + "app/...", which fails since the files are at packages/site/app/. The packages/site/vitest.config.ts lacks an explicit root configuration, so the project's working directory is not guaranteed when run as part of the monorepo's test suite.
Use import.meta.url to resolve fixture paths relative to the test file itself:
Proposed fix
import { readFileSync } from "node:fs";
import path from "node:path";
+import { fileURLToPath } from "node:url";
import { describe, expect, it } from "vitest";
-const globalCSS = readFileSync(path.join(process.cwd(), "app", "global.css"), "utf8");
-const layoutSource = readFileSync(path.join(process.cwd(), "app", "layout.tsx"), "utf8");
+const testDir = path.dirname(fileURLToPath(import.meta.url));
+const globalCSS = readFileSync(path.join(testDir, "global.css"), "utf8");
+const layoutSource = readFileSync(path.join(testDir, "layout.tsx"), "utf8");🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/site/app/global.test.ts` around lines 5 - 6, The test reads fixtures
using process.cwd() which breaks when vitest is run from the repo root; change
the path resolution for globalCSS and layoutSource to be relative to this test
file by deriving the test directory from import.meta.url (use
fileURLToPath(import.meta.url) and path.dirname) and then join that directory
with "app/global.css" and "app/layout.tsx" before calling readFileSync; update
references to the variables globalCSS and layoutSource accordingly so they load
the correct files regardless of the process working directory.
| command: "curl -fsSL https://get.agh.compozy.com | sh", | ||
| note: "Linux + macOS · prebuilt", |
There was a problem hiding this comment.
Avoid recommending curl | sh for the binary install path.
Line 28 uses a direct pipe-to-shell pattern, which skips integrity verification and increases supply-chain risk for users. Please switch this path to download + checksum/signature verification + explicit execution steps.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/site/components/landing/install-section.tsx` around lines 28 - 29,
The install section currently exposes a piped command via the "command" property
which encourages unsafe curl | sh usage; update the install entry in
packages/site/components/landing/install-section.tsx to replace that single
piped command with explicit steps: provide a safe download URL for the prebuilt
binary, a checksum or signature value, and step-by-step instructions (e.g., curl
-fsSL -o <file>, verify checksum or gpg signature, then chmod +x and ./install)
and update the "note" text accordingly; target the specific install object by
its "command" and "note" properties so the UI shows download → verify → execute
steps instead of a direct pipe-to-shell.
## 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
Documentation
Chores