feat: add /get/ installation page for CLI installer#413
Conversation
Add synthorg.io/get/ as a branded install entry point with quick install commands, script audit links, direct downloads, manual download instructions, and a pointer to the Docker Compose docs. Extract shared Footer component from index.astro. Update hero and final CTAs to link to /get/. Update install URLs across README, user guide, and install script comments. Add CI step to copy install scripts into the Astro output. Expand user guide with container descriptions, env vars table, and first-run setup. Closes #399
Pre-reviewed by 3 agents, 3 findings addressed
|
All contributors have signed the CLA. Thank you! |
Dependency Review✅ No vulnerabilities or license issues or OpenSSF Scorecard issues found.Scanned FilesNone |
Summary of ChangesHello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed! This pull request significantly enhances the user experience for installing the SynthOrg CLI by introducing a dedicated, branded installation page and standardizing installation URLs. It also improves the Docker Compose setup documentation and includes a critical fix for Git tool environment isolation, ensuring more robust and predictable behavior during development and testing. Highlights
Changelog
Ignored Files
Activity
Using Gemini Code AssistThe full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips. Invoking Gemini You can request assistance from Gemini at any point by creating a comment using either
Customization To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a Limitations & Feedback Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for GitHub and other Google products, sign up here. You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension. Footnotes
|
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
📝 WalkthroughWalkthroughAdds a branded /get/ CLI installation page and Footer component, updates homepage CTAs and docs/README URLs to synthorg.io/get/, copies CLI installer scripts into the Pages build via CI workflow changes, and tightens git env isolation in tests. Changes
Sequence Diagram(s)sequenceDiagram
participant Dev as Developer
participant GH as GitHub Actions
participant Astro as Astro Build
participant Dist as site/dist
participant Pages as GitHub Pages
participant User as Browser/CLI
Dev->>GH: push/PR (includes cli/scripts/install.*)
GH->>Astro: run site build (astro build)
Astro->>Dist: produce site/dist/get/index.html
GH->>Dist: copy cli/scripts/install.sh & install.ps1 -> site/dist/get/
GH->>Pages: deploy site/dist to Pages hosting
User->>Pages: GET /get/ and GET /get/install.sh or /get/install.ps1
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~22 minutes Possibly related PRs
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
✨ Simplify code
📝 Coding Plan
Comment |
There was a problem hiding this comment.
Pull request overview
This PR adds a /get/ CLI installation page to the Astro-based site at synthorg.io, extracts the footer into a shared component, updates install URLs across documentation and scripts, fixes git tool environment isolation for pre-push hook scenarios, and updates CLAUDE.md to reflect the new structure. It also deletes all .claude/hookify.*.md files (not documented in the PR description).
Changes:
- New
/get/Astro page with install commands, script audit links, direct download, and manual download sections; sharedFooter.astrocomponent extracted fromindex.astro - Install URLs updated from
raw.githubusercontent.comtosynthorg.io/get/across README, user guide, and install script comments; CI workflows copy install scripts intosite/dist/get/ - Git tool env isolation: strips
GIT_DIR/GIT_WORK_TREEand related vars from subprocess env in both production code and test fixtures
Reviewed changes
Copilot reviewed 16 out of 16 changed files in this pull request and generated no comments.
Show a summary per file
| File | Description |
|---|---|
| site/src/pages/get.astro | New CLI installation page with 6 sections |
| site/src/components/Footer.astro | Shared footer extracted from index, with new "Get Started" link |
| site/src/pages/index.astro | CTAs updated to /get/, inline footer replaced with <Footer /> |
| .github/workflows/pages.yml | Copies install scripts into site/dist/get/; adds cli/scripts to path triggers |
| .github/workflows/pages-preview.yml | Same CI copy step and path trigger additions |
| README.md | Install URLs updated to synthorg.io/get/ |
| docs/user_guide.md | Install URL updated; expanded Docker Compose manual section |
| cli/scripts/install.sh | Usage comment URL updated |
| cli/scripts/install.ps1 | Usage comment URL updated |
| src/ai_company/tools/_git_base.py | Strips git discovery env vars in _build_git_env() |
| tests/unit/tools/git/conftest.py | Strips git discovery env vars from _GIT_ENV and adds _isolate_git_env fixture |
| CLAUDE.md | Documents /get/ page, site layout, CI install script copy step |
| .claude/hookify.*.md (4 files) | Deleted (undocumented in PR description) |
Comments suppressed due to low confidence (1)
.claude/hookify.pep758-except.md:1
- The deletion of all
.claude/hookify.*.mdfiles (pep758-except, no-future-annotations, missing-logger, function-length-reminder) is not mentioned in the PR description or issue #399. These are unrelated to the/get/installation page feature. If this is intentional, the PR description should document it; if not, these deletions should be reverted.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
There was a problem hiding this comment.
Code Review
This pull request introduces a new /get/ installation page for the CLI, centralizing installation instructions and providing a branded URL. The changes include creating the new Astro page, refactoring the site footer into a shared component, and updating all installation URLs across the documentation and scripts to point to the new page. Additionally, this PR includes an important fix for git tool environment isolation, preventing environment variable leakage from pre-push hooks from affecting tests. The changes are well-structured and the documentation updates are comprehensive. I have one suggestion regarding code duplication in the test fixtures.
tests/unit/tools/git/conftest.py
Outdated
| for key in ( | ||
| "GIT_DIR", | ||
| "GIT_WORK_TREE", | ||
| "GIT_OBJECT_DIRECTORY", | ||
| "GIT_ALTERNATE_OBJECT_DIRECTORIES", | ||
| "GIT_INDEX_FILE", | ||
| "GIT_COMMON_DIR", | ||
| ): | ||
| monkeypatch.delenv(key, raising=False) |
There was a problem hiding this comment.
This list of Git discovery environment variables is duplicated from _GIT_DISCOVERY_VARS in src/ai_company/tools/_git_base.py. To avoid duplication and ensure tests stay in sync with the implementation, consider importing and using the constant here.
# At top of file
from ai_company.tools._git_base import _GIT_DISCOVERY_VARS
# In fixture
for key in _GIT_DISCOVERY_VARS:
monkeypatch.delenv(key, raising=False)This would also apply to the loop at lines 32-40.
Greptile SummaryThis PR adds
Confidence Score: 5/5
Important Files Changed
|
There was a problem hiding this comment.
Actionable comments posted: 3
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@site/src/components/Footer.astro`:
- Around line 37-39: In Footer.astro replace the hard-coded "2026" inside the
copyright div with a dynamic year expression so it always shows the current
year; locate the div in Footer.astro (the element with class "max-w-6xl...
text-xs" containing "© 2026 SynthOrg. Built with Astro.") and render the current
year via a JavaScript Date getFullYear() expression in the Astro template so the
year updates automatically on build/server render.
In `@site/src/pages/get.astro`:
- Around line 234-241: The click handler attached via
document.querySelectorAll('.copy-btn') currently only handles
navigator.clipboard.writeText success; add explicit failure handling to avoid
unhandled promise rejections and give user feedback. Update the event listener
(the anonymous function using const code and el) to catch writeText errors
(either append a .catch() or make the handler async and try/catch) and on
failure set el.textContent to a failure message like "Copy failed" (and
optionally revert to "Copy" after a timeout), and also log or surface the error
for debugging.
In `@tests/unit/tools/git/conftest.py`:
- Around line 30-40: Duplicate hard-coded git discovery key lists cause drift;
define a single module-level constant (e.g., GIT_DISCOVERY_VARS) containing the
tuple/list of keys and replace both the loop that pops from _GIT_ENV and the
other occurrence (lines around where the second list is used) to iterate over
that constant instead; update references to use GIT_DISCOVERY_VARS so both the
fixture cleanup and subprocess env cleanup share the same source of truth
(_GIT_ENV should be popped using GIT_DISCOVERY_VARS).
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: ASSERTIVE
Plan: Pro
Run ID: 0e478dbe-2a4e-4678-ad4c-e6724aa36d42
📒 Files selected for processing (16)
.claude/hookify.function-length.md.claude/hookify.missing-logger.md.claude/hookify.no-future-annotations.md.claude/hookify.pep758-except.md.github/workflows/pages-preview.yml.github/workflows/pages.ymlCLAUDE.mdREADME.mdcli/scripts/install.ps1cli/scripts/install.shdocs/user_guide.mdsite/src/components/Footer.astrosite/src/pages/get.astrosite/src/pages/index.astrosrc/ai_company/tools/_git_base.pytests/unit/tools/git/conftest.py
💤 Files with no reviewable changes (4)
- .claude/hookify.pep758-except.md
- .claude/hookify.function-length.md
- .claude/hookify.no-future-annotations.md
- .claude/hookify.missing-logger.md
📜 Review details
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (7)
- GitHub Check: Upload results
- GitHub Check: CLI Test (windows-latest)
- GitHub Check: Build Backend
- GitHub Check: Build Web
- GitHub Check: Test (Python 3.14)
- GitHub Check: Greptile Review
- GitHub Check: Analyze (python)
🧰 Additional context used
📓 Path-based instructions (7)
.github/workflows/pages-preview.yml
📄 CodeRabbit inference engine (CLAUDE.md)
PR Preview workflow (
.github/workflows/pages-preview.yml): builds site on PRs, injects 'Development Preview' banner, deploys to Cloudflare Pages projectsynthorg-pr-previewfor each PR atpr-<number>.synthorg-pr-preview.pages.dev. RequiresCLOUDFLARE_API_TOKEN+CLOUDFLARE_ACCOUNT_IDsecrets. Cleanup job deletes preview on PR close.
Files:
.github/workflows/pages-preview.yml
docs/**/*.md
📄 CodeRabbit inference engine (CLAUDE.md)
Documentation source in
docs/built with Zensical. Design spec indocs/design/(7 pages). Auto-generate library reference from docstrings via mkdocstrings + Griffe (AST-based, no imports).
Files:
docs/user_guide.md
.github/workflows/pages.yml
📄 CodeRabbit inference engine (CLAUDE.md)
Pages workflow (
.github/workflows/pages.yml): exports OpenAPI schema (scripts/export_openapi.py), builds Astro landing + Zensical docs, merges, deploys to GitHub Pages on push to main. Triggers ondocs/**,site/**,mkdocs.yml,pyproject.toml,uv.lock,src/ai_company/**,scripts/**, workflow file changes, andworkflow_dispatch.
Files:
.github/workflows/pages.yml
**/*.py
📄 CodeRabbit inference engine (CLAUDE.md)
**/*.py: Do NOT usefrom __future__ import annotations— Python 3.14 has PEP 649 native lazy annotations
Useexcept A, B:exception syntax (no parentheses) for Python 3.14 — ruff enforces PEP 758 except syntax
All public functions must have type hints. Enforce with mypy strict mode.
Use Google style docstrings on all public classes and functions — enforced by ruff D rules
Create new objects instead of mutating existing ones. For non-Pydantic internal collections (registries, BaseTool), usecopy.deepcopy()at construction +MappingProxyTypewrapping for read-only enforcement.
Fordict/listfields in frozen Pydantic models, rely onfrozen=Truefor field reassignment prevention andcopy.deepcopy()at system boundaries (tool execution, LLM provider serialization, inter-agent delegation, serializing for persistence).
Use frozen Pydantic models for config/identity; use separate mutable-via-copy models (usingmodel_copy(update=...)) for runtime state that evolves. Never mix static config fields with mutable runtime fields in one model.
Use Pydantic v2 with adopted conventions: use@computed_fieldfor derived values instead of storing + validating redundant fields; useNotBlankStr(fromcore.types) for all identifier/name fields — including optional and tuple variants — instead of manual whitespace validators.
Preferasyncio.TaskGroupfor fan-out/fan-in parallel operations in new code (e.g., multiple tool invocations, parallel agent calls). Prefer structured concurrency over barecreate_task. Existing code is being migrated incrementally.
Functions must be less than 50 lines; files must be less than 800 lines
Handle errors explicitly, never silently swallow them. Validate at system boundaries (user input, external APIs, config files).
Line length: 88 characters (ruff)
Files:
tests/unit/tools/git/conftest.pysrc/ai_company/tools/_git_base.py
tests/**/*.py
📄 CodeRabbit inference engine (CLAUDE.md)
tests/**/*.py: Use pytest markers:@pytest.mark.unit,@pytest.mark.integration,@pytest.mark.e2e,@pytest.mark.slowfor test organization
Setasyncio_mode = "auto"for pytest — no manual@pytest.mark.asyncioneeded. Set test timeout to 30 seconds per test.
Use@pytest.mark.parametrizefor testing similar cases in test files
Tests must use generic vendor names liketest-provider,test-small-001, etc. — never use real vendor names like Claude, GPT, etc.
Files:
tests/unit/tools/git/conftest.py
src/ai_company/**/*.py
📄 CodeRabbit inference engine (CLAUDE.md)
src/ai_company/**/*.py: Every module with business logic MUST have:from ai_company.observability import get_loggerthenlogger = get_logger(__name__). Never useimport logging/logging.getLogger()/print()in application code. Variable name must belogger.
Always use event name constants from the domain-specific module underai_company.observability.eventsfor logging (e.g., PROVIDER_CALL_START from events.provider). Import directly:from ai_company.observability.events.<domain> import EVENT_CONSTANT.
Always log with structured kwargs:logger.info(EVENT, key=value)— neverlogger.info('msg %s', val). All error paths must log at WARNING or ERROR with context before raising. All state transitions must log at INFO. DEBUG for object creation, internal flow, entry/exit of key functions.
Use Google style docstrings in Python source files for mkdocstrings auto-generation. Docstrings are required on all public classes/functions.
Files:
src/ai_company/tools/_git_base.py
src/**/*.py
📄 CodeRabbit inference engine (CLAUDE.md)
Never use real vendor names (Anthropic, OpenAI, Claude, GPT, etc.) in project-owned code, docstrings, comments, tests, or config examples. Use generic names:
example-provider,example-large-001,example-medium-001,example-small-001. Test files must usetest-provider,test-small-001, etc. Vendor names may only appear in: (1) docs/design/operations.md, (2) .claude/ files, (3) third-party import paths.
Files:
src/ai_company/tools/_git_base.py
🧠 Learnings (17)
📚 Learning: 2026-03-14T18:26:05.851Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-14T18:26:05.851Z
Learning: Applies to .github/workflows/pages.yml : Pages workflow (`.github/workflows/pages.yml`): exports OpenAPI schema (`scripts/export_openapi.py`), builds Astro landing + Zensical docs, merges, deploys to GitHub Pages on push to main. Triggers on `docs/**`, `site/**`, `mkdocs.yml`, `pyproject.toml`, `uv.lock`, `src/ai_company/**`, `scripts/**`, workflow file changes, and `workflow_dispatch`.
Applied to files:
.github/workflows/pages-preview.ymlCLAUDE.md.github/workflows/pages.yml
📚 Learning: 2026-03-14T18:26:05.851Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-14T18:26:05.851Z
Learning: Applies to .github/workflows/pages-preview.yml : PR Preview workflow (`.github/workflows/pages-preview.yml`): builds site on PRs, injects 'Development Preview' banner, deploys to Cloudflare Pages project `synthorg-pr-preview` for each PR at `pr-<number>.synthorg-pr-preview.pages.dev`. Requires `CLOUDFLARE_API_TOKEN` + `CLOUDFLARE_ACCOUNT_ID` secrets. Cleanup job deletes preview on PR close.
Applied to files:
.github/workflows/pages-preview.ymlCLAUDE.md
📚 Learning: 2026-03-14T18:26:05.851Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-14T18:26:05.851Z
Learning: Applies to .github/workflows/ci.yml : CI uses `dorny/paths-filter` to detect Python/dashboard/docker changes; jobs only run when their domain is affected. CLI has its own workflow (`cli.yml`).
Applied to files:
.github/workflows/pages-preview.ymlCLAUDE.md.github/workflows/pages.yml
📚 Learning: 2026-03-14T18:26:05.851Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-14T18:26:05.851Z
Learning: Applies to .github/workflows/cli.yml : CLI workflow (`.github/workflows/cli.yml`): Go lint (golangci-lint + go vet) + test (-race -coverprofile) + build (cross-compile matrix: linux/darwin/windows × amd64/arm64) + vulnerability check (govulncheck) on `cli/**` changes. GoReleaser release on `v*` tags (attaches assets to existing Release Please release). Post-release pins checksums in install scripts and appends to GitHub Release notes.
Applied to files:
.github/workflows/pages-preview.ymlCLAUDE.md.github/workflows/pages.yml
📚 Learning: 2026-03-14T18:26:05.851Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-14T18:26:05.851Z
Learning: Applies to .github/workflows/dependency-review.yml : Dependency review: license allow-list (permissive only), PR comment summaries
Applied to files:
.github/workflows/pages-preview.yml
📚 Learning: 2026-03-14T18:26:05.851Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-14T18:26:05.851Z
Learning: Applies to .github/workflows/cla.yml : CLA workflow (`.github/workflows/cla.yml`): Contributor License Agreement signature check on PRs via `contributor-assistant/github-action`. Triggers on `pull_request_target` and `issue_comment`. Skips Dependabot. Signatures stored in `.github/cla-signatures.json` on the `cla-signatures` branch.
Applied to files:
.github/workflows/pages-preview.yml
📚 Learning: 2026-03-14T18:26:05.851Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-14T18:26:05.851Z
Learning: Applies to .github/dependabot.yml : Dependabot: daily uv + github-actions + npm + pre-commit + docker + gomod updates, grouped minor/patch, no auto-merge. Use `/review-dep-pr` to review Dependabot PRs before merging.
Applied to files:
.github/workflows/pages-preview.yml
📚 Learning: 2026-03-14T18:26:05.851Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-14T18:26:05.851Z
Learning: Go CLI build commands: `cd cli && go build -o synthorg ./main.go`, `cd cli && go test ./...`, `cd cli && go vet ./...`, `cd cli && golangci-lint run`
Applied to files:
docs/user_guide.mdCLAUDE.md
📚 Learning: 2026-03-14T18:26:05.851Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-14T18:26:05.851Z
Learning: Applies to docker/** : Docker configuration: all files in `docker/` — Dockerfiles, compose, `.env.example`. Use 3-stage build (builder → setup → distroless runtime), Chainguard Python base, non-root (UID 65532), CIS-hardened. Both images build with `context: .`
Applied to files:
docs/user_guide.md
📚 Learning: 2026-03-14T18:26:05.851Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-14T18:26:05.851Z
Learning: Applies to docs/**/*.md : Documentation source in `docs/` built with Zensical. Design spec in `docs/design/` (7 pages). Auto-generate library reference from docstrings via mkdocstrings + Griffe (AST-based, no imports).
Applied to files:
CLAUDE.md
📚 Learning: 2026-03-14T18:26:05.851Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-14T18:26:05.851Z
Learning: Applies to cli/**/*.go : CLI Go code: Go 1.26+, dependencies in `cli/go.mod`. Commands include: init, start, stop, status, logs, doctor, update, uninstall, version. Build with GoReleaser for cross-compile (linux/darwin/windows × amd64/arm64).
Applied to files:
CLAUDE.md
📚 Learning: 2026-03-14T18:26:05.851Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-14T18:26:05.851Z
Learning: Applies to .github/workflows/ci.yml : CI jobs: lint (ruff) + type-check (mypy) + test (pytest + coverage) + python-audit (pip-audit) + dockerfile-lint (hadolint) + dashboard-lint/type-check/test/build/audit (npm) run in parallel → ci-pass (gate)
Applied to files:
CLAUDE.md
📚 Learning: 2026-03-14T18:26:05.851Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-14T18:26:05.851Z
Learning: Applies to .github/workflows/dast.yml : DAST workflow (`.github/workflows/dast.yml`): ZAP API scan against OpenAPI spec on push to main + weekly schedule. Builds backend image locally, starts container, runs ZAP. Results as workflow artifacts (no SARIF). Not on PRs (too slow).
Applied to files:
CLAUDE.md
📚 Learning: 2026-03-14T18:26:05.851Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-14T18:26:05.851Z
Learning: Applies to .github/workflows/docker.yml : Docker CI workflow (`.github/workflows/docker.yml`): builds backend + web images, pushes to GHCR, signs with cosign. Scans: Trivy (CRITICAL = hard fail, HIGH = warn-only) + Grype (critical cutoff). CVE triage via `.github/.trivyignore.yaml` and `.github/.grype.yaml`. Images only pushed after scans pass. Triggers on push to main and version tags (`v*`).
Applied to files:
CLAUDE.md
📚 Learning: 2026-03-14T18:26:05.851Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-14T18:26:05.851Z
Learning: Applies to .github/workflows/release.yml : Release workflow (`.github/workflows/release.yml`): Release Please auto-creates a release PR on every push to main. Merging the release PR creates a git tag (`vX.Y.Z`) + GitHub Release with changelog. Tag push triggers Docker workflow. Uses `RELEASE_PLEASE_TOKEN` secret so tag creation triggers downstream workflows. Config in `.github/release-please-config.json` and `.github/.release-please-manifest.json`. Auto-updates BSL Change Date in LICENSE to 3 years ahead after creating/updating release PR.
Applied to files:
CLAUDE.md
📚 Learning: 2026-03-14T18:26:05.851Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-14T18:26:05.851Z
Learning: Applies to .github/workflows/scorecard.yml : OSSF Scorecard workflow (`.github/workflows/scorecard.yml`): supply chain maturity scoring on push to main + weekly schedule. SARIF upload to Security tab. Contributes to OpenSSF ecosystem data via `publish_results: true`.
Applied to files:
CLAUDE.md
📚 Learning: 2026-03-14T18:26:05.851Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-14T18:26:05.851Z
Learning: Applies to .github/workflows/gitleaks.yml : Gitleaks workflow on push/PR + weekly schedule for secret scanning. Enforced by pre-commit hook locally.
Applied to files:
CLAUDE.md
🪛 LanguageTool
docs/user_guide.md
[style] ~53-~53: Using four (or more) nouns in a row may decrease readability.
Context: ..._COMPANY_MEMORY_DIR|/data/memory| Agent memory storage directory (inside container). | |BACKEND_PORT` ...
(FOUR_NN)
🪛 PSScriptAnalyzer (1.24.0)
cli/scripts/install.ps1
[warning] Missing BOM encoding for non-ASCII encoded file 'install.ps1'
(PSUseBOMForUnicodeEncodedFile)
🔇 Additional comments (15)
cli/scripts/install.sh (1)
3-3: Canonical installer URL update is correct.Line 3 now points to the stable
/get/endpoint while keeping installer behavior unchanged.cli/scripts/install.ps1 (1)
2-2: PowerShell usage URL update is aligned with the new install flow.Line 2 consistently points users to
https://synthorg.io/get/install.ps1..github/workflows/pages.yml (2)
14-15: Pages trigger coverage for installer scripts looks correct.Adding both installer script paths ensures Pages rebuilds when install artifacts are updated.
72-76: Copy step placement is correct for publishing/get/install.*.This keeps
cli/scripts/as the canonical source while emittingsite/dist/get/install.shandsite/dist/get/install.ps1in the deploy artifact..github/workflows/pages-preview.yml (2)
15-16: Preview trigger expansion for installer scripts is correct.This ensures PR previews are regenerated when
cli/scripts/install.shorcli/scripts/install.ps1changes.
136-140: Preview artifact copy into/get/is implemented cleanly.The step keeps script publication in CI and avoids duplicating files under
site/public/.src/ai_company/tools/_git_base.py (2)
74-87: Git discovery environment isolation is a strong hardening update.Removing inherited discovery variables prevents parent Git context from overriding workspace-based repo detection.
268-275:_build_git_envimplementation and docstring are now well-aligned.The method now clearly documents and performs hardening overrides plus discovery-var stripping.
README.md (1)
77-89: README quick-install snippets are correctly aligned with/get/.Both Linux/macOS and PowerShell commands now consistently use the new public install endpoints.
CLAUDE.md (2)
81-81:site/documentation updates are clear and accurate.The added references to the
/get/page and sharedFootercomponent improve contributor orientation.Also applies to: 157-161
245-245: CI documentation reflects the Pages workflow changes correctly.The updated line captures both new trigger paths and
/get/installer artifact publication.docs/user_guide.md (2)
15-15: CLI install URL update is correct.Line 15 now uses the new canonical installer endpoint.
38-74: Manual Docker Compose guidance is substantially improved.The new container overview, env-var table, and first-run setup steps make the manual path much more actionable.
site/src/pages/index.astro (1)
3-3: Looks good — CTA and install flow are consistently redirected to/get/.Footer extraction and command/copy-text updates are coherent and match the install-page objective.
Also applies to: 37-37, 409-417, 426-426, 437-437
site/src/pages/get.astro (1)
6-230: Great implementation of the/get/installation page requirements.The page structure and links cover the requested install flows, auditability, direct downloads, and optional Docker Compose path.
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #413 +/- ##
=======================================
Coverage 93.65% 93.65%
=======================================
Files 469 469
Lines 22211 22214 +3
Branches 2141 2142 +1
=======================================
+ Hits 20801 20804 +3
Misses 1097 1097
Partials 313 313 ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
4c3be2c to
75791ba
Compare
git push sets GIT_DIR in the environment, which pre-push hooks (running pytest) inherit. This caused all git tool tests to operate on the parent repo instead of test fixtures — 76 errors + 3 failures. Fix: strip git discovery env vars (GIT_DIR, GIT_WORK_TREE, etc.) in both _build_git_env() (production) and the test conftest. Also add GIT_CONFIG_GLOBAL=/dev/null to test fixtures to prevent global hooks from interfering with git commit in fixtures.
- Redesign get.astro: full-width Quick Install at top, 2x2 grid for alternative options (audit, direct download, manual binary, skip CLI) - Add .catch() to clipboard writeText to handle permission/focus errors - Import _GIT_DISCOVERY_VARS in test conftest instead of duplicating keys - Add mkdir -p before cp in CI workflows for robustness - Use dynamic year in Footer.astro instead of hardcoded 2026
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@site/src/pages/get.astro`:
- Around line 217-231: The copy button updates are only visual; add an
accessible aria-live status update so screen readers announce success/failure.
In the script that handles .copy-btn clicks (the navigator.clipboard.writeText
promise handlers), locate or create a hidden status element (e.g., a sibling
<span> with class like "copy-status" and attributes role="status" and
aria-live="polite" or aria-atomic="true") and set its textContent to "Copied!"
or "Copy failed" alongside the visual label changes, then clear it after the
timeout; ensure the status element is present for each .copy-btn (or use a
single global live region) so assistive tech receives the announcements.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: ASSERTIVE
Plan: Pro
Run ID: 074103ab-76db-4050-86b7-bc3eae99b724
📒 Files selected for processing (6)
.github/workflows/pages-preview.yml.github/workflows/pages.ymlsite/src/components/Footer.astrosite/src/pages/get.astrosrc/ai_company/tools/_git_base.pytests/unit/tools/git/conftest.py
📜 Review details
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (6)
- GitHub Check: CLI Test (windows-latest)
- GitHub Check: Test (Python 3.14)
- GitHub Check: Build Backend
- GitHub Check: Build Web
- GitHub Check: Greptile Review
- GitHub Check: Analyze (python)
🧰 Additional context used
📓 Path-based instructions (6)
.github/workflows/pages-preview.yml
📄 CodeRabbit inference engine (CLAUDE.md)
PR Preview workflow (
.github/workflows/pages-preview.yml): builds site on PRs, injects 'Development Preview' banner, deploys to Cloudflare Pages projectsynthorg-pr-previewfor each PR atpr-<number>.synthorg-pr-preview.pages.dev. RequiresCLOUDFLARE_API_TOKEN+CLOUDFLARE_ACCOUNT_IDsecrets. Cleanup job deletes preview on PR close.
Files:
.github/workflows/pages-preview.yml
.github/workflows/pages.yml
📄 CodeRabbit inference engine (CLAUDE.md)
Pages workflow (
.github/workflows/pages.yml): exports OpenAPI schema (scripts/export_openapi.py), builds Astro landing + Zensical docs, merges, deploys to GitHub Pages on push to main. Triggers ondocs/**,site/**,mkdocs.yml,pyproject.toml,uv.lock,src/ai_company/**,scripts/**, workflow file changes, andworkflow_dispatch.
Files:
.github/workflows/pages.yml
**/*.py
📄 CodeRabbit inference engine (CLAUDE.md)
**/*.py: Do NOT usefrom __future__ import annotations— Python 3.14 has PEP 649 native lazy annotations
Useexcept A, B:exception syntax (no parentheses) for Python 3.14 — ruff enforces PEP 758 except syntax
All public functions must have type hints. Enforce with mypy strict mode.
Use Google style docstrings on all public classes and functions — enforced by ruff D rules
Create new objects instead of mutating existing ones. For non-Pydantic internal collections (registries, BaseTool), usecopy.deepcopy()at construction +MappingProxyTypewrapping for read-only enforcement.
Fordict/listfields in frozen Pydantic models, rely onfrozen=Truefor field reassignment prevention andcopy.deepcopy()at system boundaries (tool execution, LLM provider serialization, inter-agent delegation, serializing for persistence).
Use frozen Pydantic models for config/identity; use separate mutable-via-copy models (usingmodel_copy(update=...)) for runtime state that evolves. Never mix static config fields with mutable runtime fields in one model.
Use Pydantic v2 with adopted conventions: use@computed_fieldfor derived values instead of storing + validating redundant fields; useNotBlankStr(fromcore.types) for all identifier/name fields — including optional and tuple variants — instead of manual whitespace validators.
Preferasyncio.TaskGroupfor fan-out/fan-in parallel operations in new code (e.g., multiple tool invocations, parallel agent calls). Prefer structured concurrency over barecreate_task. Existing code is being migrated incrementally.
Functions must be less than 50 lines; files must be less than 800 lines
Handle errors explicitly, never silently swallow them. Validate at system boundaries (user input, external APIs, config files).
Line length: 88 characters (ruff)
Files:
src/ai_company/tools/_git_base.pytests/unit/tools/git/conftest.py
src/ai_company/**/*.py
📄 CodeRabbit inference engine (CLAUDE.md)
src/ai_company/**/*.py: Every module with business logic MUST have:from ai_company.observability import get_loggerthenlogger = get_logger(__name__). Never useimport logging/logging.getLogger()/print()in application code. Variable name must belogger.
Always use event name constants from the domain-specific module underai_company.observability.eventsfor logging (e.g., PROVIDER_CALL_START from events.provider). Import directly:from ai_company.observability.events.<domain> import EVENT_CONSTANT.
Always log with structured kwargs:logger.info(EVENT, key=value)— neverlogger.info('msg %s', val). All error paths must log at WARNING or ERROR with context before raising. All state transitions must log at INFO. DEBUG for object creation, internal flow, entry/exit of key functions.
Use Google style docstrings in Python source files for mkdocstrings auto-generation. Docstrings are required on all public classes/functions.
Files:
src/ai_company/tools/_git_base.py
src/**/*.py
📄 CodeRabbit inference engine (CLAUDE.md)
Never use real vendor names (Anthropic, OpenAI, Claude, GPT, etc.) in project-owned code, docstrings, comments, tests, or config examples. Use generic names:
example-provider,example-large-001,example-medium-001,example-small-001. Test files must usetest-provider,test-small-001, etc. Vendor names may only appear in: (1) docs/design/operations.md, (2) .claude/ files, (3) third-party import paths.
Files:
src/ai_company/tools/_git_base.py
tests/**/*.py
📄 CodeRabbit inference engine (CLAUDE.md)
tests/**/*.py: Use pytest markers:@pytest.mark.unit,@pytest.mark.integration,@pytest.mark.e2e,@pytest.mark.slowfor test organization
Setasyncio_mode = "auto"for pytest — no manual@pytest.mark.asyncioneeded. Set test timeout to 30 seconds per test.
Use@pytest.mark.parametrizefor testing similar cases in test files
Tests must use generic vendor names liketest-provider,test-small-001, etc. — never use real vendor names like Claude, GPT, etc.
Files:
tests/unit/tools/git/conftest.py
🧠 Learnings (6)
📚 Learning: 2026-03-14T18:26:05.851Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-14T18:26:05.851Z
Learning: Applies to .github/workflows/pages-preview.yml : PR Preview workflow (`.github/workflows/pages-preview.yml`): builds site on PRs, injects 'Development Preview' banner, deploys to Cloudflare Pages project `synthorg-pr-preview` for each PR at `pr-<number>.synthorg-pr-preview.pages.dev`. Requires `CLOUDFLARE_API_TOKEN` + `CLOUDFLARE_ACCOUNT_ID` secrets. Cleanup job deletes preview on PR close.
Applied to files:
.github/workflows/pages-preview.yml
📚 Learning: 2026-03-14T18:26:05.851Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-14T18:26:05.851Z
Learning: Applies to .github/workflows/ci.yml : CI uses `dorny/paths-filter` to detect Python/dashboard/docker changes; jobs only run when their domain is affected. CLI has its own workflow (`cli.yml`).
Applied to files:
.github/workflows/pages-preview.yml.github/workflows/pages.yml
📚 Learning: 2026-03-14T18:26:05.851Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-14T18:26:05.851Z
Learning: Applies to .github/workflows/pages.yml : Pages workflow (`.github/workflows/pages.yml`): exports OpenAPI schema (`scripts/export_openapi.py`), builds Astro landing + Zensical docs, merges, deploys to GitHub Pages on push to main. Triggers on `docs/**`, `site/**`, `mkdocs.yml`, `pyproject.toml`, `uv.lock`, `src/ai_company/**`, `scripts/**`, workflow file changes, and `workflow_dispatch`.
Applied to files:
.github/workflows/pages-preview.yml.github/workflows/pages.yml
📚 Learning: 2026-03-14T18:26:05.851Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-14T18:26:05.851Z
Learning: Applies to .github/workflows/dependency-review.yml : Dependency review: license allow-list (permissive only), PR comment summaries
Applied to files:
.github/workflows/pages-preview.yml
📚 Learning: 2026-03-14T18:26:05.851Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-14T18:26:05.851Z
Learning: Applies to .github/dependabot.yml : Dependabot: daily uv + github-actions + npm + pre-commit + docker + gomod updates, grouped minor/patch, no auto-merge. Use `/review-dep-pr` to review Dependabot PRs before merging.
Applied to files:
.github/workflows/pages-preview.yml
📚 Learning: 2026-03-14T18:26:05.851Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-14T18:26:05.851Z
Learning: Applies to .github/workflows/cli.yml : CLI workflow (`.github/workflows/cli.yml`): Go lint (golangci-lint + go vet) + test (-race -coverprofile) + build (cross-compile matrix: linux/darwin/windows × amd64/arm64) + vulnerability check (govulncheck) on `cli/**` changes. GoReleaser release on `v*` tags (attaches assets to existing Release Please release). Post-release pins checksums in install scripts and appends to GitHub Release notes.
Applied to files:
.github/workflows/pages-preview.yml.github/workflows/pages.yml
🔇 Additional comments (13)
.github/workflows/pages.yml (2)
14-15: LGTM!The path triggers are correctly added to ensure the workflow runs when the CLI install scripts are modified. This aligns with the PR objective to copy these scripts into the site output.
72-77: LGTM!The copy step is correctly positioned after the Astro build and before the merge step. Using
mkdir -pensures idempotent directory creation, and the copy commands correctly place the scripts insite/dist/get/where they'll be served at/get/install.shand/get/install.ps1..github/workflows/pages-preview.yml (2)
15-16: LGTM!Path triggers correctly mirror those in
pages.yml, ensuring PR previews are triggered when CLI install scripts are modified.
136-141: LGTM!The copy step is consistent with
pages.ymland correctly positioned in the build pipeline. This ensures PR previews include the CLI install scripts at/get/install.shand/get/install.ps1, allowing contributors to test the full installation page experience before merging.src/ai_company/tools/_git_base.py (2)
74-87: LGTM!Well-defined constant for git discovery environment variables with clear documentation. Using
frozensetensures immutability, and theFinalannotation correctly signals this is a module-level constant.
264-280: LGTM!The docstring accurately describes the updated behavior, and the implementation correctly strips discovery vars using
pop(key, None)for safe removal. This defense-in-depth approach ensures cwd-based repo detection regardless of inherited environment from parent processes.tests/unit/tools/git/conftest.py (3)
10-10: LGTM — past review comment addressed.Importing
_GIT_DISCOVERY_VARSfrom_git_baseconsolidates the single source of truth for these env vars, preventing drift between production code and test fixtures.
28-34: LGTM!Adding
GIT_CONFIG_GLOBALaligns the test environment with production hardening. The import-time loop correctly uses the imported constant to strip discovery vars from_GIT_ENV, ensuring test helper functions (_run_git,_run_git_output) use cwd-based repo detection.
61-70: LGTM!Good complementary isolation: the import-time stripping (lines 31-34) handles
_GIT_ENVfor test helper subprocess calls, while this autouse fixture handlesos.environfor the code under test (_build_git_env). Usingraising=Falsecorrectly avoids errors when vars don't exist.site/src/components/Footer.astro (1)
1-40: LGTM!The footer component is well-structured with semantic HTML and proper navigation groupings. The dynamic copyright year implementation (line 38) correctly addresses the previous review feedback. Tailwind v4 opacity syntax is used correctly throughout.
site/src/pages/get.astro (3)
1-23: LGTM — Hero section is well-structured.Clean, responsive hero with appropriate gradient styling and semantic heading hierarchy.
25-105: LGTM — Quick Install section is well-implemented.Consistent terminal-styled code blocks with appropriate copy functionality. The
HTML entity for newlines indata-code(line 91) will decode correctly when read viagetAttribute().
107-209: LGTM — Options grid provides good installation alternatives.The "Look before you pipe" section appropriately addresses security transparency for users concerned about piping scripts directly. Direct download links with the
downloadattribute are correctly implemented.
- Guard navigator.clipboard against undefined (insecure contexts) - Add aria-live region for screen reader copy status announcements - PowerShell block uses Windows Terminal chrome (─ □ ×) - Generic terminal block uses minimal header (>_ prompt icon) - Fix same clipboard issues in index.astro
75791ba to
2154075
Compare
There was a problem hiding this comment.
Pull request overview
Adds a /get/ CLI installation page to the Astro-based landing site, extracts the footer into a shared component, updates install URLs across documentation and scripts, and fixes git tool test isolation by stripping discovery env vars.
Changes:
- New
get.astropage with install commands, script audit links, download options, and manual setup pointer; sharedFooter.astroextracted fromindex.astrowith a new "Get Started" link - Install URLs updated from
raw.githubusercontent.comtosynthorg.io/get/across README, user guide, and install script comments; CI workflows updated to copy install scripts intosite/dist/get/ - Git tool env isolation fix:
_GIT_DISCOVERY_VARSstripped in both_build_git_env()production code and test fixtures to prevent pre-push hook env leakage
Reviewed changes
Copilot reviewed 12 out of 12 changed files in this pull request and generated no comments.
Show a summary per file
| File | Description |
|---|---|
| site/src/pages/get.astro | New CLI installation page with 6 sections |
| site/src/components/Footer.astro | Extracted shared footer with dynamic year and "Get Started" link |
| site/src/pages/index.astro | CTAs point to /get/, inline footer replaced with <Footer />, improved copy button error handling |
| src/ai_company/tools/_git_base.py | Added _GIT_DISCOVERY_VARS frozenset and stripping in _build_git_env() |
| tests/unit/tools/git/conftest.py | Strip git discovery vars from test env and add autouse fixture |
| .github/workflows/pages.yml | Path triggers for install scripts, copy step after Astro build |
| .github/workflows/pages-preview.yml | Same path triggers and copy step as pages.yml |
| README.md | Updated install URLs to synthorg.io/get/ |
| docs/user_guide.md | Updated install URL, expanded Docker Compose manual section |
| cli/scripts/install.sh | Updated usage comment URL |
| cli/scripts/install.ps1 | Updated usage comment URL |
| CLAUDE.md | Updated docs for /get/ page, site layout, and CI changes |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
…ink fix
- Quick Install: Linux/macOS and PowerShell terminals side-by-side on md+
- Other Options: responsive 1→2→4 column grid (sm/xl breakpoints)
- Audit links point to /get/install.{sh,ps1} (same files users pipe)
- Replace this-based callback with arrow function + closure for type safety
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@site/src/pages/get.astro`:
- Around line 45-51: The copy button elements (the <button> with class
"copy-btn" and attributes data-code and aria-label) lack an explicit type and
thus default to type="submit"; update each copy control found (the instance with
data-code="curl -sSfL https://synthorg.io/get/install.sh" and the other copy
buttons referenced at the other occurrences) to include type="button" to prevent
accidental form submission if nested inside a form.
- Around line 48-49: The three copy buttons currently all use the generic
aria-label "Copy to clipboard"; update each button's aria-label attribute in
site/src/pages/get.astro to be context-specific so screen readers can
differentiate them—for example set the install command button to "Copy
Linux/macOS install command", the PowerShell button to "Copy PowerShell install
command", and the post-install button to "Copy post-install commands" (apply
these changes to the three copy button elements shown in the diff).
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: ASSERTIVE
Plan: Pro
Run ID: 84cbf9b5-7bb7-4b59-b377-9e7535625c62
📒 Files selected for processing (1)
site/src/pages/get.astro
📜 Review details
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (5)
- GitHub Check: Test (Python 3.14)
- GitHub Check: CLI Test (windows-latest)
- GitHub Check: Build Backend
- GitHub Check: Greptile Review
- GitHub Check: Analyze (python)
🔇 Additional comments (1)
site/src/pages/get.astro (1)
219-247: Clipboard UX/error handling is well implemented.Good job covering unsupported clipboard API + promise rejection paths, and announcing status via the live region.
There was a problem hiding this comment.
Pull request overview
This PR adds a branded CLI installation page at synthorg.io/get/, extracts a shared footer component, updates install URLs across documentation and scripts, fixes git tool environment isolation for pre-push hook scenarios, and updates CI to copy install scripts into the Astro output.
Changes:
- New
/get/installation page (get.astro) with install commands, script audit links, direct download, and manual setup options, plus a sharedFooter.astrocomponent extracted fromindex.astro - URL migration from
raw.githubusercontent.comtosynthorg.io/get/across README, user guide, install script comments, and landing page CTAs - Git tool env isolation fix: strips
GIT_DIR/GIT_WORK_TREEand related discovery vars from subprocess environments in production code and test fixtures
Reviewed changes
Copilot reviewed 12 out of 12 changed files in this pull request and generated no comments.
Show a summary per file
| File | Description |
|---|---|
site/src/pages/get.astro |
New CLI installation page with install commands, audit links, download options |
site/src/components/Footer.astro |
Extracted shared footer component with new "Get Started" link; dynamic copyright year |
site/src/pages/index.astro |
Updated CTAs to /get/, replaced inline footer with <Footer />, improved copy button error handling |
src/ai_company/tools/_git_base.py |
Added _GIT_DISCOVERY_VARS frozenset and stripping logic in _build_git_env() |
tests/unit/tools/git/conftest.py |
Added _isolate_git_env autouse fixture and discovery var stripping for _GIT_ENV |
.github/workflows/pages.yml |
Added install script copy step and cli/scripts/ path triggers |
.github/workflows/pages-preview.yml |
Same CI changes as pages.yml for preview builds |
README.md |
Updated install URLs to synthorg.io/get/ |
docs/user_guide.md |
Updated install URL, expanded Docker Compose manual section with containers, env vars, first-run setup |
cli/scripts/install.sh |
Updated usage comment URL |
cli/scripts/install.ps1 |
Updated usage comment URL |
CLAUDE.md |
Updated documentation references for /get/ page, site structure, and CI triggers |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
- Add type="button" to all copy buttons - Use distinct aria-labels per copy button for screen readers - Raise terminal side-by-side breakpoint to lg to prevent scrollbars - Widen sections to max-w-7xl, 4-col grid only at 2xl - Audit links point to hosted /get/ files (view in new tab, not download)
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@site/src/pages/get.astro`:
- Around line 34-105: Extract the repeated terminal UI into a reusable component
(e.g., TerminalBlock) that accepts props like title (displayed above block),
shellLabel (e.g., "bash"/"PowerShell"/"terminal"), code (the command string used
for both the <pre><code> and the copy button data-code), ariaLabel (for the copy
button), and optional footer/annotations; replace each repeated block (the
Linux/macOS block using the "bash" label, the Windows block using "PowerShell",
and the post-install block using "terminal") with TerminalBlock instances,
preserve classes like copy-btn and the copy button behavior, and ensure the
component renders the same header, pre/code content, and accessibility
attributes (aria-label) so existing copy logic continues to work.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: ASSERTIVE
Plan: Pro
Run ID: 523d22e7-b34d-496a-9ee4-b711b98a1c29
📒 Files selected for processing (1)
site/src/pages/get.astro
📜 Review details
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (6)
- GitHub Check: CLI Test (windows-latest)
- GitHub Check: Test (Python 3.14)
- GitHub Check: Build Backend
- GitHub Check: Build Web
- GitHub Check: Greptile Review
- GitHub Check: Analyze (python)
🧰 Additional context used
🧠 Learnings (1)
📓 Common learnings
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-14T18:26:05.851Z
Learning: Go CLI build commands: `cd cli && go build -o synthorg ./main.go`, `cd cli && go test ./...`, `cd cli && go vet ./...`, `cd cli && golangci-lint run`
🔇 Additional comments (2)
site/src/pages/get.astro (2)
45-50: Good accessibility hardening on copy controls.Explicit
type="button"plus command-specificaria-labels are a solid improvement for both form safety and screen-reader clarity.Also applies to: 65-70, 94-99
226-254: Clipboard UX/error-path handling looks correct.The live region announcement plus explicit failure handling avoids silent errors and improves assistive-tech feedback.
| <!-- Linux / macOS --> | ||
| <div> | ||
| <p class="text-sm text-gray-400 mb-2 font-mono">Linux / macOS</p> | ||
| <div class="relative bg-[#0d1117] rounded-xl border border-white/10 overflow-hidden"> | ||
| <div class="flex items-center justify-between px-4 py-2.5 bg-[#161b22] border-b border-white/10"> | ||
| <div class="flex items-center gap-2"> | ||
| <span class="w-3 h-3 rounded-full bg-red-500/80"></span> | ||
| <span class="w-3 h-3 rounded-full bg-yellow-500/80"></span> | ||
| <span class="w-3 h-3 rounded-full bg-green-500/80"></span> | ||
| <span class="ml-2 text-xs text-gray-500 font-mono">bash</span> | ||
| </div> | ||
| <button | ||
| type="button" | ||
| class="copy-btn text-xs text-gray-500 hover:text-gray-300 transition-colors px-2 py-1 rounded hover:bg-white/5" | ||
| data-code="curl -sSfL https://synthorg.io/get/install.sh | bash" | ||
| aria-label="Copy Linux/macOS install command" | ||
| > | ||
| Copy | ||
| </button> | ||
| </div> | ||
| <pre class="p-4 text-sm font-['JetBrains_Mono',monospace] text-gray-300 overflow-x-auto leading-relaxed"><code><span class="text-gray-500">$</span> curl -sSfL https://synthorg.io/get/install.sh | bash</code></pre> | ||
| </div> | ||
| </div> | ||
|
|
||
| <!-- Windows --> | ||
| <div> | ||
| <p class="text-sm text-gray-400 mb-2 font-mono">Windows (PowerShell)</p> | ||
| <div class="relative bg-[#0d1117] rounded-xl border border-white/10 overflow-hidden"> | ||
| <div class="flex items-center justify-between px-4 py-2 bg-[#161b22] border-b border-white/10"> | ||
| <span class="text-xs text-gray-500 font-mono">PowerShell</span> | ||
| <div class="flex items-center gap-3"> | ||
| <button | ||
| type="button" | ||
| class="copy-btn text-xs text-gray-500 hover:text-gray-300 transition-colors px-2 py-1 rounded hover:bg-white/5" | ||
| data-code="irm https://synthorg.io/get/install.ps1 | iex" | ||
| aria-label="Copy PowerShell install command" | ||
| > | ||
| Copy | ||
| </button> | ||
| <div class="flex items-center gap-2.5 text-gray-600 text-xs leading-none"> | ||
| <span>─</span> | ||
| <span>□</span> | ||
| <span>✕</span> | ||
| </div> | ||
| </div> | ||
| </div> | ||
| <pre class="p-4 text-sm font-['JetBrains_Mono',monospace] text-gray-300 overflow-x-auto leading-relaxed"><code><span class="text-gray-500">PS></span> irm https://synthorg.io/get/install.ps1 | iex</code></pre> | ||
| </div> | ||
| </div> | ||
| </div> | ||
|
|
||
| <!-- Post-install (full width below both) --> | ||
| <div class="bg-[#1a1f2e] rounded-xl p-6 border border-violet-500/20"> | ||
| <p class="text-sm text-gray-400 mb-3">Then set up and start your organization:</p> | ||
| <div class="relative bg-[#0d1117] rounded-xl border border-white/10 overflow-hidden"> | ||
| <div class="flex items-center justify-between px-4 py-2 bg-[#161b22] border-b border-white/10"> | ||
| <div class="flex items-center gap-2"> | ||
| <span class="text-gray-600 text-xs font-mono">>_</span> | ||
| <span class="text-xs text-gray-500 font-mono">terminal</span> | ||
| </div> | ||
| <button | ||
| type="button" | ||
| class="copy-btn text-xs text-gray-500 hover:text-gray-300 transition-colors px-2 py-1 rounded hover:bg-white/5" | ||
| data-code="synthorg init synthorg start" | ||
| aria-label="Copy post-install commands" | ||
| > | ||
| Copy | ||
| </button> | ||
| </div> | ||
| <pre class="p-4 text-sm font-['JetBrains_Mono',monospace] text-gray-300 overflow-x-auto leading-relaxed"><code><span class="text-gray-500">$</span> synthorg init <span class="text-gray-600"># interactive setup wizard</span> | ||
| <span class="text-gray-500">$</span> synthorg start <span class="text-gray-600"># pull images + start containers</span></code></pre> | ||
| </div> |
There was a problem hiding this comment.
🧹 Nitpick | 🔵 Trivial
Consider extracting terminal command blocks into a small component.
This section repeats very similar terminal-header/command/copy-button markup. A reusable component would reduce duplication and keep future command updates less error-prone.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@site/src/pages/get.astro` around lines 34 - 105, Extract the repeated
terminal UI into a reusable component (e.g., TerminalBlock) that accepts props
like title (displayed above block), shellLabel (e.g.,
"bash"/"PowerShell"/"terminal"), code (the command string used for both the
<pre><code> and the copy button data-code), ariaLabel (for the copy button), and
optional footer/annotations; replace each repeated block (the Linux/macOS block
using the "bash" label, the Windows block using "PowerShell", and the
post-install block using "terminal") with TerminalBlock instances, preserve
classes like copy-btn and the copy button behavior, and ensure the component
renders the same header, pre/code content, and accessibility attributes
(aria-label) so existing copy logic continues to work.
d30138d to
a85f7b3
Compare
- Create /get/view/install-sh/ and /get/view/install-ps1/ pages that render script source at build time in a styled code block - "View" links open viewer pages, "Direct Download" saves the file - Move get.astro to get/index.astro to support nested routes - Make localhost:3000 link clickable in post-install note
There was a problem hiding this comment.
Pull request overview
This PR adds a /get/ CLI installation page to the existing Astro site, updates install URLs across all docs/scripts to point to the new canonical location, extracts the footer into a shared component, and fixes git tool environment isolation to prevent pre-push hook env leakage.
Changes:
- New
/get/Astro page with install commands, script audit/view pages, direct download links, and manual setup pointers; sharedFooter.astrocomponent extracted fromindex.astro - Install URLs updated from
raw.githubusercontent.comtosynthorg.io/get/across README, user guide, and install script comments; CI workflows copy install scripts into Astro output - Git tool env isolation fix: strip
GIT_DIR/GIT_WORK_TREEand other discovery vars in both production_build_git_envand test fixtures
Reviewed changes
Copilot reviewed 14 out of 14 changed files in this pull request and generated no comments.
Show a summary per file
| File | Description |
|---|---|
site/src/pages/get/index.astro |
New CLI installation page with quick install, audit, download, and manual sections |
site/src/pages/get/view/install-sh.astro |
Script viewer page for install.sh |
site/src/pages/get/view/install-ps1.astro |
Script viewer page for install.ps1 |
site/src/components/Footer.astro |
Shared footer component extracted from index, with new "Get Started" link |
site/src/pages/index.astro |
Updated CTAs to /get/, replaced inline footer with <Footer />, improved copy button error handling |
src/ai_company/tools/_git_base.py |
Added _GIT_DISCOVERY_VARS frozenset and stripping logic in _build_git_env |
tests/unit/tools/git/conftest.py |
Strip discovery vars from _GIT_ENV and add autouse fixture for env isolation |
.github/workflows/pages.yml |
Copy install scripts into site/dist/get/, add script path triggers |
.github/workflows/pages-preview.yml |
Same CI changes as pages.yml for preview builds |
README.md |
Updated install URLs to synthorg.io/get/ |
docs/user_guide.md |
Updated install URL, expanded Docker Compose manual section |
cli/scripts/install.sh |
Updated usage comment URL |
cli/scripts/install.ps1 |
Updated usage comment URL |
CLAUDE.md |
Updated CI and package structure documentation |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
🤖 I have created a release *beep* *boop* --- ## [0.2.0](v0.1.4...v0.2.0) (2026-03-15) ##First probably usable release? Most likely not no and everything will break ### Features * add /get/ installation page for CLI installer ([#413](#413)) ([6a47e4a](6a47e4a)) * add cross-platform Go CLI for container lifecycle management ([#401](#401)) ([0353d9e](0353d9e)), closes [#392](#392) * add explicit ScanOutcome signal to OutputScanResult ([#394](#394)) ([be33414](be33414)), closes [#284](#284) * add meeting scheduler, event-triggered meetings, and Go CLI lint fixes ([#407](#407)) ([5550fa1](5550fa1)) * wire MultiAgentCoordinator into runtime ([#396](#396)) ([7a9e516](7a9e516)) ### Bug Fixes * CLA signatures branch + declutter repo root ([#409](#409)) ([cabe953](cabe953)) * correct Release Please branch name in release workflow ([#410](#410)) ([515d816](515d816)) * replace slsa-github-generator with attest-build-provenance, fix DAST ([#424](#424)) ([eeaadff](eeaadff)) * resolve CodeQL path-injection alerts in Go CLI ([#412](#412)) ([f41bf16](f41bf16)) ### Refactoring * rename package from ai_company to synthorg ([#422](#422)) ([df27c6e](df27c6e)), closes [#398](#398) ### Tests * add fuzz and property-based testing across all layers ([#421](#421)) ([115a742](115a742)) ### CI/CD * add SLSA L3 provenance for CLI binaries and container images ([#423](#423)) ([d3dc75d](d3dc75d)) * bump the major group with 4 updates ([#405](#405)) ([20c7a04](20c7a04)) ### Maintenance * bump github.com/spf13/cobra from 1.9.1 to 1.10.2 in /cli in the minor-and-patch group ([#402](#402)) ([e31edbb](e31edbb)) * narrow BSL Additional Use Grant and add CLA ([#408](#408)) ([5ab15bd](5ab15bd)), closes [#406](#406) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Summary
synthorg.io/get/as a branded CLI installation page — an Astro page on the existing GitHub Pages site with install commands, script audit links, direct download, manual download instructions, and a pointer to the docs for Docker Compose setupindex.astrointo sharedFooter.astrocomponent with new "Get Started" link/get/raw.githubusercontent.comtosynthorg.io/get/cli/scripts/install.shandinstall.ps1intosite/dist/get/in CI (bothpages.ymlandpages-preview.yml) — canonical source stays incli/scripts/, no duplicationGIT_DIR/GIT_WORK_TREEfrom subprocess env in both production code (_build_git_env) and test fixtures, preventing pre-push hook env leakage from breaking 79 git tool tests/get/page mention), Package Structure (addsite/layout)Closes #399
Test plan
site/src/pages/get.astrorenders correctly with all 6 sections (hero, quick install, audit, direct download, manual download, CLI is optional)Footer.astrorenders on both index and get pages with "Get Started" linksite/dist/get/after Astro build (checkpages.ymlandpages-preview.yml)GIT_DIRset)cli.ymlrelease note URLs are NOT changed (version-pinned raw GitHub URLs)Review coverage
Release-As: 0.2.0