Project links
Let a project's agents install private packages, use another project's code, and reach the services its app calls, without loosening the sandbox by hand.
Projects rarely stand alone. The links: block tells SI Fabrik what a project uses, so its agents can install packages, reach the APIs the app calls, and test against code from other projects. SI Fabrik turns each link into allowlist entries, credentials wiring and notes for the agent.
Packages#
A package link is a dependency the agent needs to install.
links:
packages:
- name: "@your-scope/ui-kit"
from: registry # a published version
registry: https://npm.example.com/
token_env: NPM_REGISTRY_TOKEN # set in Edit Project → Environment
- name: "@your-scope/utils"
from: git # a git dependency (https only)
url: https://gitlab.example.com/team/utils.git
ref: v2.3.0 # optional branch, tag or commit
token_env: GIT_DEP_TOKEN
# username: oauth2 # default; sent with the token
- name: "@your-scope/shared"
from: source # another SI Fabrik project's code, read-only
project: shared-lib
ref: main # default: that project's base branchfrom | Required keys | What SI Fabrik does |
|---|---|---|
registry | registry (http or https URL) | Adds the registry host to the allowlist. With token_env, npm gets a SI Fabrik-only config (NPM_CONFIG_USERCONFIG) containing ${NPM_REGISTRY_TOKEN}, scoped to the package's npm scope. |
git | url (https) | Adds the git host to the allowlist. With token_env, git gets a credential helper that reads the variable when it's needed. |
source | project | Mounts the other project's committed code at the ref, read-only, at /deps/<project> in Docker or ~/deps/<project> in Cloudflare. |
About source links:
- The code is exported with
git archivefrom that project's own repository, so untracked files such as.envaren't included. - The agent is told to build and install it from a copy, without saving the change to
package.jsonor the lockfile. - The linked project's own registries are allowed too, so its code can be built.
- Snapshots are kept under
~/Library/Application Support/Harness/links/<project>/<commit>/.
Token values stay in the environment. They're never written to a file or the repository, and URLs can't carry credentials (use token_env).
Services#
A service link is something the app calls at runtime. The agent and the app get its address in an environment variable.
links:
services:
- name: api
env: API_URL # the agent and the app get the address here
url: https://staging-api.example.com # a hosted environment
- name: auth
env: AUTH_URL
project: auth-service # run that project's app next to the agent
ref: main # optional
# port: 4000 # optional: overrides its preview.portHosted (url:): the host is allowlisted and the URL goes in the variable. The agent is told it's a shared environment.
Run next to the agent (project:, Docker only): the linked project's app starts in its own hardened container at the ref, using that project's preview: command, its own environment (docker.env) and its own allowlist.
- The agent reaches it at
$AUTH_URL, through its allowlist, but can't read its secrets. - Its output goes to
.harness/services/<name>.login the workspace. - It stops with the attempt.
A service that runs next to the agent needs Docker. For projects on Cloudflare sandboxes, use a hosted url: service instead.
Sharing: both sides agree#
A project's code and services are only used by projects it names in share_with. The linked project opts in, in its own WORKFLOW.md:
share_with: [shop-storefront]Edit links in the app#
Open Workflow → Settings → Links:
- Add package: name, Comes from (A package registry, A git repository or Another SI Fabrik project's code), the URL or project, Branch, tag or commit, Username for git, and an optional Token variable.
- Add service: name, Address variable, Runs (Hosted (a URL) or Next to the agent (another SI Fabrik project)), and the URL or project with an optional ref and port.
- Share with: projects allowed to use this one.
- Accept tasks from and Their tasks land in: see Linked tasks.
When you pick a project, the form shows whether it already shares with this one, or what's missing.
Rules and problems#
- Names in
envmust be environment-variable names, used once. Credential and reserved names (ANTHROPIC_API_KEY,HARNESS_GITHUB_TOKEN, and so on) are refused. - Push, tracker and model credentials can't be used as link tokens:
CLICKUP_API_TOKEN,LINEAR_API_KEY,GITHUB_TOKEN,GH_TOKEN,GITLAB_TOKEN, the agent credentials and SI Fabrik's ownHARNESS_*tokens. - Problems block dispatch with a clear reason, and show in the Workflow tab's inspector under Links. For example: a project that doesn't share back, a missing token, an invalid ref, or a service on Cloudflare.