Skip to main content
TENET projects can manage multiple service repos from a central GTM workspace. Each service registers with the GTM and shares context through produces/consumes scopes.

Registering a Service

# From the GTM workspace
jfl onboard /path/to/my-service --name my-service --type api
This creates:
  • .jfl/config.json in the service (with gtm_parent pointer)
  • CLAUDE.md and AGENTS.md in the service
  • Entry in GTM’s registered_services list

Service Config

Each service has a .jfl/config.json:
{
  "name": "my-api",
  "type": "api",
  "working_branch": "main",
  "gtm_parent": "/Users/you/CascadeProjects/my-gtm",
  "context_scope": {
    "produces": ["api:endpoint-changed", "api:schema-updated"],
    "consumes": ["cli:command-change", "eval:*"]
  }
}

Context Scopes

Services declare what events they produce and consume:
{
  "context_scope": {
    "produces": ["docs:page-updated"],
    "consumes": ["cli:command-change", "cli:api-change"]
  }
}
When cli:command-change fires in jfl-cli, the docs service knows it might need updating.

Cross-Service Flows

The GTM workspace has flows that detect cross-service impact:
# .jfl/flows/cross-service.yaml
- name: detect-cross-service-impact
  trigger:
    pattern: "eval:scored"
    condition: 'data.improved == "true"'
  actions:
    - type: command
      command: "jfl scope impact --service {{data.service}}"

Managing Services

# List registered services
jfl services list

# Check service health
jfl services health

# Sync service journals to GTM
jfl services sync my-service

Registered Services Example

{
  "registered_services": [
    {
      "name": "jfl-cli",
      "path": "/Users/you/CascadeProjects/jfl-cli",
      "type": "cli",
      "status": "active",
      "context_scope": {
        "produces": ["cli:command-executed", "cli:hook-fired"],
        "consumes": ["platform:api-response", "telemetry:insight"]
      }
    },
    {
      "name": "tenet-docs",
      "path": "/Users/you/CascadeProjects/tenet-docs",
      "type": "docs",
      "status": "active",
      "context_scope": {
        "produces": ["docs:page-updated"],
        "consumes": ["cli:command-change", "cli:api-change"]
      }
    }
  ]
}