docs(guides): add building custom agents guide#1179
Conversation
Site previewPreview: https://dd2ae088-site.fullsend-ai.workers.dev Commit: |
ReviewFindingsNo findings. Well-structured end-to-end guide for building custom agents on per-repo installations. All 8 internal links verified (files exist, anchors resolve). The guide accurately reflects the layered configuration architecture (ADR 0035), the sandbox/trusted-runner security model, and harness YAML structure documented in The prior medium finding (config.yaml role validation mismatch in Step 1) is resolved — the guide no longer references Previous runReviewFindingsMedium
ReviewFindingsNo findings. Well-structured documentation guide that accurately reflects the codebase. All internal links resolve, the Previous runReviewFindingsMedium
Previous run (2)ReviewFindingsNo findings. Well-structured documentation guide that accurately reflects the codebase. All internal links resolve, the |
c1aba1a to
7d8c761
Compare
deboer-tim
left a comment
There was a problem hiding this comment.
From a 'documenting what works today' perspective, this is a huge step to explaining how the system works and creating a working agent. Prior to this it would be complete guesswork and when things fail you'd have no idea where the problem was or if you were doing something 'unsupported'. I'm currently blocked on install but hope to give this a try soon.
I feel like I need to add that from an end-user perspective this seems extremely cumbersome for minor agents, exposes lots of internal implementation details (overly complex, brittle), and would be hard to share between teams. However, we have to start somewhere so 👍🏼 to documenting what should be possible today.
End-to-end guide for creating new custom agents from scratch on per-repo fullsend installations. Covers agent prompts, harness config, sandbox policies, output schemas, pre/post scripts, GitHub Actions workflows, slash-command dispatch, and troubleshooting. Improvements over the source material: - Fixed nested code block rendering (4-backtick outer fences) - Added post-script security section (treat agent output as untrusted) - Added glossary cross-references and Reference section - Deduplicated with customizing-agents.md via cross-links Addressed review feedback (PR fullsend-ai#1179): - Removed explore/refine agent references (not upstream) - Fixed install command (fullsend admin install <owner/repo>) - Removed WIF secrets from prerequisites (part of installation) - Replaced security model diagram with inline summary + link - Removed Step 1 (config.yaml roles not yet extensible) - Added target-repo checkout step and --target-repo flag - Added MY_VAR to workflow env block - Reduced permissions to least-privilege (contents:read, id-token:write) - Added trigger instructions (UI and CLI) before dispatch workflow - Extracted agent chaining to future guide - Condensed debugging tips into troubleshooting table Co-authored-by: Cursor <cursoragent@cursor.com>
7d8c761 to
fd0dc7f
Compare
| version: 1 | ||
|
|
||
| filesystem_policy: | ||
| include_workdir: true | ||
| read_only: [/usr, /lib, /proc, /dev/urandom, /app, /etc, /var/log] | ||
| read_write: [/sandbox, /tmp, /dev/null] | ||
| landlock: | ||
| compatibility: best_effort | ||
| process: | ||
| run_as_user: sandbox | ||
| run_as_group: sandbox | ||
|
|
||
| network_policies: | ||
| # Required: Vertex AI for model access | ||
| vertex_ai: | ||
| name: vertex-ai | ||
| endpoints: | ||
| - host: "*.googleapis.com" | ||
| port: 443 | ||
| protocol: tcp | ||
| enforcement: enforce | ||
| access: allow | ||
| binaries: | ||
| - path: "**/claude" | ||
| - path: "**/node" | ||
|
|
||
| # Optional: GitHub API access (if agent needs it) | ||
| github_api: | ||
| name: github-api | ||
| endpoints: | ||
| - host: "api.github.com" | ||
| port: 443 | ||
| protocol: tcp | ||
| enforcement: enforce | ||
| access: allow | ||
| binaries: | ||
| - path: "**/gh" | ||
| - path: "**/curl" |
There was a problem hiding this comment.
| version: 1 | |
| filesystem_policy: | |
| include_workdir: true | |
| read_only: [/usr, /lib, /proc, /dev/urandom, /app, /etc, /var/log] | |
| read_write: [/sandbox, /tmp, /dev/null] | |
| landlock: | |
| compatibility: best_effort | |
| process: | |
| run_as_user: sandbox | |
| run_as_group: sandbox | |
| network_policies: | |
| # Required: Vertex AI for model access | |
| vertex_ai: | |
| name: vertex-ai | |
| endpoints: | |
| - host: "*.googleapis.com" | |
| port: 443 | |
| protocol: tcp | |
| enforcement: enforce | |
| access: allow | |
| binaries: | |
| - path: "**/claude" | |
| - path: "**/node" | |
| # Optional: GitHub API access (if agent needs it) | |
| github_api: | |
| name: github-api | |
| endpoints: | |
| - host: "api.github.com" | |
| port: 443 | |
| protocol: tcp | |
| enforcement: enforce | |
| access: allow | |
| binaries: | |
| - path: "**/gh" | |
| - path: "**/curl" | |
| version: 1 | |
| filesystem_policy: | |
| include_workdir: true | |
| read_only: [/usr, /lib, /proc, /dev/urandom, /app, /etc, /var/log] | |
| read_write: [/sandbox, /tmp, /dev/null] | |
| landlock: | |
| compatibility: best_effort | |
| process: | |
| run_as_user: sandbox | |
| run_as_group: sandbox | |
| network_policies: | |
| # Required: Vertex AI for model access | |
| vertex_ai: | |
| name: vertex-ai | |
| endpoints: | |
| - host: "*.googleapis.com" | |
| port: 443 | |
| protocol: rest | |
| enforcement: enforce | |
| access: read-write | |
| - host: "api.anthropic.com" | |
| port: 443 | |
| protocol: rest | |
| enforcement: enforce | |
| access: read-write | |
| binaries: | |
| - path: "**/claude" | |
| - path: "**/node" | |
| # Optional: GitHub API access (if agent needs it) | |
| github_api: | |
| name: github-api | |
| endpoints: | |
| - host: "api.github.com" | |
| port: 443 | |
| protocol: rest | |
| enforcement: enforce | |
| access: read-only | |
| binaries: | |
| - path: "**/gh" | |
| - path: "**/curl" |
With OpenShell 0.0.38 landed, it needs to be this way.
| env: | ||
| ISSUE_KEY: ${{ inputs.issue_key }} | ||
| ISSUE_SOURCE: ${{ inputs.issue_source || 'github' }} | ||
| MY_VAR: ${{ vars.MY_VAR }} |
There was a problem hiding this comment.
This requires them to add it to the variables in their repository, for an example I think it is going too far. Can't we add a simple ABC here as value? Or you want them to add this to their variables (in that case you should mention it somewhere).
Summary
docs/guides/user/building-custom-agents.md— an end-to-end guide for creating new agents from scratch on per-repo fullsend installationsdocs/guides/README.mdindex and cross-links fromdocs/guides/user/customizing-agents.mdReview and security fixes applied
\```escaping with 4-backtick outer fences for correct GitHub renderingdocs/glossary.mdTest plan
make lint-md-linkspasses oncelycheeis available (not installed in local env)Made with Cursor