@rosthq/cli 0.7.20 → 0.7.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -38895,6 +38895,21 @@ var aicosSessionSchema = external_exports.object({
38895
38895
  updatedAt: external_exports.string().datetime({ offset: true }),
38896
38896
  createdAt: external_exports.string().datetime({ offset: true })
38897
38897
  }).strict();
38898
+ var AICOS_ATTACHMENT_CONTENT_TYPES = ["image/png", "image/jpeg", "image/webp", "image/gif"];
38899
+ var AICOS_ATTACHMENT_MAX_BYTES = 10 * 1024 * 1024;
38900
+ var AICOS_MAX_ATTACHMENTS_PER_TURN = 4;
38901
+ var aicosAttachmentContentTypeSchema = external_exports.enum(AICOS_ATTACHMENT_CONTENT_TYPES);
38902
+ var aicosAttachmentSchema = external_exports.object({
38903
+ id: uuidSchema4,
38904
+ contentType: aicosAttachmentContentTypeSchema,
38905
+ sizeBytes: external_exports.number().int().positive(),
38906
+ width: external_exports.number().int().positive().nullable(),
38907
+ height: external_exports.number().int().positive().nullable(),
38908
+ filename: external_exports.string().max(255).nullable()
38909
+ }).strict();
38910
+ var aicosAttachmentUploadResultSchema = external_exports.object({
38911
+ attachment: aicosAttachmentSchema
38912
+ }).strict();
38898
38913
  var aicosMessageSchema = external_exports.object({
38899
38914
  id: uuidSchema4,
38900
38915
  sessionId: uuidSchema4,
@@ -38907,6 +38922,7 @@ var aicosMessageSchema = external_exports.object({
38907
38922
  linkedRunId: uuidSchema4.nullable(),
38908
38923
  linkedWorkOrderId: uuidSchema4.nullable(),
38909
38924
  sourceCount: external_exports.number().int().nonnegative().default(0),
38925
+ attachments: external_exports.array(aicosAttachmentSchema).default([]),
38910
38926
  createdAt: external_exports.string().datetime({ offset: true })
38911
38927
  }).strict();
38912
38928
  var aicosSourceSchema = external_exports.object({
@@ -38922,7 +38938,11 @@ var aicosSourceSchema = external_exports.object({
38922
38938
  var aicosTurnRequestSchema = external_exports.object({
38923
38939
  sessionId: uuidSchema4.nullable().optional(),
38924
38940
  purpose: aicosConversationPurposeSchema.default("general"),
38925
- message: external_exports.string().trim().min(1).max(12e3),
38941
+ // Empty is permitted only when attachments are present (an image-only turn);
38942
+ // runAicosTurn enforces the "message or attachment required" invariant so the
38943
+ // schema stays a plain object for downstream `.shape`/`.extend` consumers.
38944
+ message: external_exports.string().trim().max(12e3).default(""),
38945
+ attachmentIds: external_exports.array(uuidSchema4).max(AICOS_MAX_ATTACHMENTS_PER_TURN).default([]),
38926
38946
  routeContext: aicosRouteContextSchema,
38927
38947
  model: aicosModelRequestSchema.optional()
38928
38948
  }).strict();
@@ -42552,7 +42572,15 @@ var softwareDeveloperTeamInstallInputSchema = external_exports.object({
42552
42572
  // rejects (→ "Command input failed schema validation"). Matches the sibling
42553
42573
  // software-factory schemas that already use `.nullable().optional()`.
42554
42574
  software_project_id: uuid10.nullable().optional(),
42555
- assign_skills: external_exports.boolean().default(true)
42575
+ assign_skills: external_exports.boolean().default(true),
42576
+ // DER-1264: the install auto-staffs live agents at a pr_only, observe-first
42577
+ // posture. If the tenant's company autonomy ceiling (`agent_policy`) is MORE
42578
+ // permissive than this design's envelope (resolved `max_autonomous_risk` >= high,
42579
+ // i.e. `high_autonomy` or a custom high/critical ceiling), the install refuses to
42580
+ // auto-activate unless the owner explicitly acknowledges that posture. Never
42581
+ // silently inherit a more-permissive-than-designed ceiling (invariant #10). A
42582
+ // tenant within the envelope (locked_down/balanced) never needs this.
42583
+ acknowledge_autonomy_ceiling: external_exports.boolean().default(false)
42556
42584
  }).strict();
42557
42585
  var softwareDeveloperTeamSeatSummarySchema = external_exports.object({
42558
42586
  role: softwareDeveloperTeamRoleSchema,
@@ -42580,12 +42608,45 @@ var softwareDeveloperTeamAuthorityGrantSummarySchema = external_exports.object({
42580
42608
  grant_id: uuid10,
42581
42609
  created: external_exports.boolean()
42582
42610
  });
42611
+ var softwareDeveloperTeamOccupancySummarySchema = external_exports.object({
42612
+ role: softwareDeveloperTeamRoleSchema,
42613
+ seat_id: uuid10,
42614
+ agent_id: uuid10,
42615
+ template_slug: external_exports.string(),
42616
+ status: external_exports.literal("live"),
42617
+ // false when a live agent already occupied the seat (idempotent re-install).
42618
+ created: external_exports.boolean()
42619
+ });
42620
+ var softwareDeveloperTeamAgentPolicySummarySchema = external_exports.object({
42621
+ profile: agentPolicyProfileSchema,
42622
+ enforcement: agentPolicyEnforcementSchema,
42623
+ max_autonomous_risk: autonomousRiskLevelSchema,
42624
+ // true when the resolved ceiling is more permissive than this design's envelope
42625
+ // (max_autonomous_risk >= high) and the owner acknowledged it to activate.
42626
+ more_permissive_than_envelope: external_exports.boolean()
42627
+ });
42628
+ var softwareDeveloperTeamTokenBudgetSummarySchema = external_exports.object({
42629
+ hard_cap_usd: external_exports.string().nullable(),
42630
+ soft_cap_usd: external_exports.string().nullable(),
42631
+ set_by_install: external_exports.boolean()
42632
+ });
42633
+ var softwareDeveloperTeamGithubPolicySummarySchema = external_exports.object({
42634
+ software_project_id: uuid10,
42635
+ automation_mode_ceiling: softwareAutomationModeSchema,
42636
+ // false when a pre-existing policy was preserved (not created by this install).
42637
+ created: external_exports.boolean()
42638
+ });
42583
42639
  var softwareDeveloperTeamInstallOutputSchema = external_exports.object({
42584
42640
  installed: external_exports.boolean(),
42585
42641
  seats: external_exports.array(softwareDeveloperTeamSeatSummarySchema),
42586
42642
  skills: external_exports.array(softwareDeveloperTeamSkillSummarySchema),
42587
42643
  authority_profiles: external_exports.array(softwareDeveloperTeamAuthorityProfileSummarySchema),
42588
- authority_grants: external_exports.array(softwareDeveloperTeamAuthorityGrantSummarySchema)
42644
+ authority_grants: external_exports.array(softwareDeveloperTeamAuthorityGrantSummarySchema),
42645
+ // DER-1264 auto-staffing additions.
42646
+ occupancies: external_exports.array(softwareDeveloperTeamOccupancySummarySchema),
42647
+ agent_policy: softwareDeveloperTeamAgentPolicySummarySchema,
42648
+ token_budget: softwareDeveloperTeamTokenBudgetSummarySchema,
42649
+ github_policy: softwareDeveloperTeamGithubPolicySummarySchema.nullable()
42589
42650
  });
42590
42651
  var forgeArtifactText = external_exports.string().trim().min(1).max(4e3);
42591
42652
  var forgeArtifactList = external_exports.array(forgeArtifactText).max(50).default([]);
@@ -43533,7 +43594,7 @@ The Compass is drafted, then activated by a human through supersession.
43533
43594
  order: 15,
43534
43595
  title: "AICOS chat guide",
43535
43596
  summary: "How the AI Chief of Staff chat works in the authenticated app shell and what it can safely do today.",
43536
- version: "2026-07-04.10",
43597
+ version: "2026-07-04.11",
43537
43598
  public: true,
43538
43599
  audiences: ["human", "in_app_agent"],
43539
43600
  stages: ["company_setup", "operating_rhythm"],
@@ -43601,6 +43662,8 @@ Model behavior is now explicit in the AICOS session contract. A thread can run i
43601
43662
 
43602
43663
  Assistant answers render safe Markdown for headings, short lists, emphasis, code, tables, and in-app links. User messages remain plain escaped text. Links only become clickable when they target same-origin app routes such as \`/inbox\` or \`/settings\`; external, protocol, script, API-style, or traversal targets are stripped to plain text before transcript storage. When an answer includes a validated app route, the chat can surface one consent-required navigation suggestion and, if the user has enabled the local preference, open that route automatically. Navigation is never authorization; destination pages still enforce their own tenant, role, and seat checks.
43603
43664
 
43665
+ You can attach images to a message from the composer. {{brand}} accepts PNG, JPEG, WebP, and GIF up to 10 MB each, and up to four per message. Images are held in a tenant-scoped private store, stripped of embedded metadata such as EXIF on upload, and shown as thumbnails in your message; the panel loads each thumbnail through a short-lived signed link rather than a public URL. In the cloud lane the agent can view the image directly. Runner and MCP viewing of attached images is a scoped follow-up; today the agent still reads the accompanying text on those lanes.
43666
+
43604
43667
  AICOS can also retrieve bounded summaries from prior sessions owned by the same tenant user and surface them as session-memory read models. Setup-limited users do not retrieve sensitive historical run or company-memory summaries through this path. This is a practical memory seam for AICOS continuity; it is not yet the future Company Brain, and it does not make unaccepted knowledge authoritative.
43605
43668
 
43606
43669
  Platform allowance and BYOK state are checked before routing; an exhausted included allowance keeps AICOS in guided mode and points the user toward BYOK/manual continuation. Because the DER-1068 implementation still uses the deterministic harness, it does not create fake llm_calls rows or settle fake allowance usage; reservation/settlement belongs to the real provider call path.
@@ -44416,7 +44479,7 @@ External connectors are being rolled out provider by provider, conservatively (r
44416
44479
  order: 48,
44417
44480
  title: "CLI and MCP installation guide",
44418
44481
  summary: "Install the public CLI, register remote token-backed MCP clients, and find the full command and tool catalog.",
44419
- version: "2026-07-04.1",
44482
+ version: "2026-07-04.11",
44420
44483
  public: true,
44421
44484
  audiences: ["human", "cli", "mcp", "in_app_agent"],
44422
44485
  stages: ["company_setup", "staffing"],
@@ -45144,7 +45207,7 @@ Several rows here are seat-operating commands (\`task.create\`, the \`signal.*\`
45144
45207
  | \`rost_create_a_forge_authority_profile\` | \`software_factory.authority_profile.create\` | Define a Forge authority profile (a named seat capability preset). Owner-only; defaults to the read_only preset. | Tenant-admin | Call with \`{"name":"Builder","preset":"contributor"}\`. |
45145
45208
  | \`rost_grant_forge_seat_authority\` | \`software_factory.authority.grant\` | Grant a seat a Forge authority profile on a project (seat \u2192 project \u2192 profile). Owner-only and human-gated; emits a durable authority-change event. | Tenant-admin | Call with \`{"software_project_id":"<project-id>","seat_id":"<seat-id>","authority_profile_id":"<profile-id>"}\`; non-interactive callers receive a confirmation handoff. |
45146
45209
  | \`rost_revoke_forge_seat_authority\` | \`software_factory.authority.revoke\` | Revoke a Forge authority grant (teardown). Owner-only and human-gated. | Tenant-admin | Call with \`{"grant_id":"<grant-id>"}\`; non-interactive callers receive a confirmation handoff. |
45147
- | \`rost_install_forge_developer_team\` | \`software_factory.developer_team.install\` | Install the governed Forge Developer Team template: Forge Lead, Planner, Builder, plan reviewer, security reviewer, QA/release, and Fold/Memory seats with draft Charters, first-party Forge Skills, and authority presets. Entitlement-gated and human-gated; it creates no live agent occupancy by itself. | Tenant-admin | Call with \`{"steward_seat_id":"<human-steward-seat-id>"}\` \u2014 \`software_project_id\` is optional (when supplied it scopes authority grants to that project; the template installs tenant-wide either way). Non-interactive callers receive a confirmation handoff. |
45210
+ | \`rost_install_forge_developer_team\` | \`software_factory.developer_team.install\` | Install AND activate the governed Forge Developer Team: Forge Lead (human) plus Planner, Builder, plan reviewer, security reviewer, QA/release, and Fold/Memory seats with draft Charters, first-party Forge Skills, and authority presets. Approving ALSO auto-staffs the 6 agent seats as live occupancies at a pull-request-only, observe-first posture (open pull requests, never merge/deploy without a human), steward-chained to the human lead, each with a signed manifest + passed sandbox dry-run; it sets a conservative default token budget (only if none) and, for a supplied project, a default pr_only GitHub automation policy (only if none \u2014 never widening a stricter one). Entitlement-gated and human-gated. | Tenant-admin | Call with \`{"steward_seat_id":"<human-steward-seat-id>"}\` \u2014 \`software_project_id\` is optional (when supplied it scopes authority grants to that project; the team installs tenant-wide either way). If the company autonomy ceiling is more permissive than the observe-first envelope, add \`{"acknowledge_autonomy_ceiling":true}\` to activate. Non-interactive callers receive a confirmation handoff. |
45148
45211
  | \`rost_list_forge_config\` | \`software_factory.config.list\` | List active Forge configuration entries. Plain values may be returned only when they passed the non-secret guard; secret refs appear as metadata and never include the ref value. | Tenant | Call with \`{}\` or \`{"software_project_id":"<project-id>","environment":"preview"}\`. |
45149
45212
  | \`rost_set_forge_config\` | \`software_factory.config.set\` | Human-gated config create/rotation for plain values or secret refs. Secret refs store only a vault pointer and raw secret-shaped plain values are rejected. | Tenant-admin | Call with \`{"software_project_id":"<project-id>","environment":"preview","key_name":"PUBLIC_BASE_URL","value_kind":"plain","plain_value":"https://preview.example.com"}\`. |
45150
45213
  | \`rost_list_forge_secret_requests\` | \`software_factory.secret_request.list\` | List missing-secret requests and their approval Task ids/statuses. It returns request metadata only \u2014 no secret values and no vault refs. | Tenant | Call with \`{}\` or \`{"status":"pending"}\`. |
@@ -45154,7 +45217,7 @@ Several rows here are seat-operating commands (\`task.create\`, the \`signal.*\`
45154
45217
  | \`rost_create_a_forge_github_installation_token\` | \`software_factory.github.installation_token.create\` | Mint a short-lived GitHub App installation token for one bound repository after policy evaluation. The token is returned once and never stored. | Tenant | Call with \`{"software_project_id":"<project-id>","repository_id":789,"requested_actions":["read"],"requested_automation_mode":"plan_only"}\`. |
45155
45218
  | \`rost_list_forge_runner_capacity\` | \`software_factory.capacity.list\` | List Forge runner capacity observations (advisory scheduling input only, never an authority input). Read-only; requires the Forge add-on. | Tenant | Call with \`{}\` or \`{"runner_id":"<runner-id>"}\`. |
45156
45219
 
45157
- The web Forge control room at \`/forge\` uses the same command path for project selection, build request creation/list/detail reads, runner capacity, configuration status, and Developer Team template install. The template install button deliberately stages a pending confirmation before durable seats, Skills, or authority grants are applied.
45220
+ The web Forge control room at \`/forge\` uses the same command path for project selection, build request creation/list/detail reads, runner capacity, configuration status, and Developer Team install. The install button deliberately stages a pending confirmation before durable seats, Skills, authority grants, or live agent activation are applied; the install page states plainly that approving activates the 6 agents at a pull-request-only, observe-first posture and surfaces the company autonomy ceiling.
45158
45221
 
45159
45222
  #### Forge GitHub App access
45160
45223
 
@@ -45746,7 +45809,7 @@ Agents can suggest commitments and report progress. They should not create a new
45746
45809
  order: 61,
45747
45810
  title: "Signal guide",
45748
45811
  summary: "How to define and read measurables so the company runs on evidence instead of status theater.",
45749
- version: "2026-07-02.4",
45812
+ version: "2026-07-04.1",
45750
45813
  public: true,
45751
45814
  audiences: ["human", "cli", "mcp", "in_app_agent"],
45752
45815
  stages: ["operating_rhythm"],
@@ -45802,7 +45865,7 @@ Avoid vanity numbers, manual-only status fields, and metrics nobody can act on.
45802
45865
 
45803
45866
  - Read: \`{{cli}} signal list --json\` / \`signal.list\` / \`rost_list_signals\` returns measurables with their latest reading and on/off-track state. \`signal.get\` / \`rost_get_signal\` returns one measurable's full reading history.
45804
45867
  - Add a measurable: \`measurable.create\` (scope: seat) defines a measurable a seat owns \u2014 name, unit, direction, target, cadence. The seat owns it; readings attach to it afterward.
45805
- - Record a reading: \`{{cli}} status record --measurable-id <id> --value <n>\` (\`status.record\`, scope: seat) writes a status event with the reading. This is not gated.
45868
+ - Record a reading: \`{{cli}} status record --measurable-id <id> --value <n>\` (\`status.record\`, scope: seat) writes a status event with the reading. This is not gated. An agent's \`status.record\` never downgrades a human-confirmed reading: a routine agent read that lands on a period a human already confirmed leaves the confirmed value and its confirmation intact (invariants #7/#8 \u2014 agents recommend; humans decide).
45806
45869
  - Confirm a reading: \`{{cli}} signal confirm\` / \`signal.confirm_reading\` / \`rost_confirm_signal_reading\` marks a reading human-verified. \`signal.correct_reading\` / \`rost_correct_signal_reading\` overwrites a reading with a human-confirmed value.
45807
45870
 
45808
45871
  ## Run Signal without an agent
@@ -48334,7 +48397,7 @@ var COMMAND_MANIFEST = [
48334
48397
  { "id": "software_factory.capacity.list", "namespace": "software_factory", "action": "capacity.list", "title": "List Forge runner capacity", "description": "List the tenant's Forge runner capacity observations (OS, CPU, memory, active sessions, usage-limit telemetry). Advisory scheduling input only, never an authority input. Read-only, entitlement-gated.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "runner_id", "flag": "runner-id", "type": "string", "required": false }, { "name": "limit", "flag": "limit", "type": "integer", "required": false }], "hasComplexInput": false, "help": "List Forge runner capacity observations (advisory scheduling input only, never an authority input). Read-only; requires the Forge add-on." },
48335
48398
  { "id": "software_factory.config.list", "namespace": "software_factory", "action": "config.list", "title": "List Forge config", "description": "List active Forge config metadata for project environments. Plain config values may be returned; secret refs are represented only as has_secret_ref.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "software_project_id", "flag": "software-project-id", "type": "string", "required": false }, { "name": "environment", "flag": "environment", "type": "enum", "required": false, "enumValues": ["development", "preview", "production"] }], "hasComplexInput": false, "help": "List active Forge config entries. Plain config may be shown; secret refs are represented only as metadata." },
48336
48399
  { "id": "software_factory.config.set", "namespace": "software_factory", "action": "config.set", "title": "Set Forge config", "description": "Create or rotate a Forge project config entry. Secret config stores only a vault ref pointer; raw values are never accepted for secret_ref entries.", "requiredScope": "tenant_admin", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "software_project_id", "flag": "software-project-id", "type": "string", "required": true }, { "name": "environment", "flag": "environment", "type": "enum", "required": true, "enumValues": ["development", "preview", "production"] }, { "name": "key_name", "flag": "key-name", "type": "string", "required": true }, { "name": "value_kind", "flag": "value-kind", "type": "enum", "required": true, "enumValues": ["plain", "secret_ref"] }, { "name": "plain_value", "flag": "plain-value", "type": "string", "required": false }, { "name": "vault_ref", "flag": "vault-ref", "type": "string", "required": false }], "hasComplexInput": false, "help": "Set or rotate a Forge project config key. Secret entries store only vault refs and are human-gated." },
48337
- { "id": "software_factory.developer_team.install", "namespace": "software_factory", "action": "developer_team.install", "title": "Install Forge Developer Team", "description": "Install the governed Forge Developer Team template: seats, draft Charters, first-party skill assignments, and authority presets. Entitlement-gated and human-confirmed.", "requiredScope": "tenant_admin", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "steward_seat_id", "flag": "steward-seat-id", "type": "string", "required": true }, { "name": "software_project_id", "flag": "software-project-id", "type": "string", "required": false }, { "name": "assign_skills", "flag": "assign-skills", "type": "boolean", "required": false }], "hasComplexInput": false, "help": "Install the governed Forge Developer Team template with seats, draft Charters, skills, project authority grants, and audit records. Tenant-admin and human-gated; creates no live agent occupancy." },
48400
+ { "id": "software_factory.developer_team.install", "namespace": "software_factory", "action": "developer_team.install", "title": "Install Forge Developer Team", "description": "Install AND activate the governed Forge Developer Team: 7 seats (1 human lead + 6 agents), first-party skills, authority presets, and a conservative token budget. Approving this ACTIVATES the 6 agents as live occupancies at a pr_only, observe-first posture: they open pull requests but never merge or deploy without a human. Entitlement-gated and human-confirmed.", "requiredScope": "tenant_admin", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "steward_seat_id", "flag": "steward-seat-id", "type": "string", "required": true }, { "name": "software_project_id", "flag": "software-project-id", "type": "string", "required": false }, { "name": "assign_skills", "flag": "assign-skills", "type": "boolean", "required": false }, { "name": "acknowledge_autonomy_ceiling", "flag": "acknowledge-autonomy-ceiling", "type": "boolean", "required": false }], "hasComplexInput": false, "help": "Install the governed Forge Developer Team template with seats, draft Charters, skills, project authority grants, and audit records. Tenant-admin and human-gated; creates no live agent occupancy." },
48338
48401
  { "id": "software_factory.gate.decide", "namespace": "software_factory", "action": "gate.decide", "title": "Decide a Forge gate", "description": "A human approves or rejects a Forge gate. The resolver is recorded (never an agent \u2014 invariant #7); sensitive gates (security sign-off, merge/deploy, authority change, production deploy) also write a linked human decision. Requires confirmation.", "requiredScope": "tenant_admin", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "gate_id", "flag": "gate-id", "type": "string", "required": true }, { "name": "decision", "flag": "decision", "type": "enum", "required": true, "enumValues": ["approve", "reject"] }, { "name": "rationale", "flag": "rationale", "type": "string", "required": false }], "hasComplexInput": false, "help": "A human approves or rejects a Forge gate; an agent caller routes to /approvals and can never self-approve. Sensitive gates record a human decision." },
48339
48402
  { "id": "software_factory.github.installation_token.create", "namespace": "software_factory", "action": "github.installation_token.create", "title": "Create a Forge GitHub installation token", "description": "Mint a short-lived GitHub App installation token for one bound repository after server-side policy evaluation. The token is returned once and never persisted.", "requiredScope": "tenant", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "software_project_id", "flag": "software-project-id", "type": "string", "required": true }, { "name": "repository_id", "flag": "repository-id", "type": "integer", "required": true }, { "name": "requested_actions", "flag": "requested-actions", "type": "array", "required": true, "itemType": "string" }, { "name": "requested_automation_mode", "flag": "requested-automation-mode", "type": "enum", "required": false, "enumValues": ["plan_only", "pr_only", "merge_after_checks", "deploy_preview", "deploy_production"] }, { "name": "seat_id", "flag": "seat-id", "type": "string", "required": false }], "hasComplexInput": false, "help": "Mint a short-lived GitHub App installation token for one bound repository after policy evaluation; token material is returned once and never stored." },
48340
48403
  { "id": "software_factory.github.installation.bind", "namespace": "software_factory", "action": "github.installation.bind", "title": "Bind a Forge GitHub installation", "description": "Bind a GitHub App installation and selected repositories to Forge projects from the authenticated Forge GitHub settings flow. Owner-only and human-gated; webhook payloads never supply tenant authority.", "requiredScope": "tenant_admin", "confirmation": "human_required", "exposeOverMcp": false, "fields": [{ "name": "app_slug", "flag": "app-slug", "type": "string", "required": false }, { "name": "installation_id", "flag": "installation-id", "type": "integer", "required": true }, { "name": "account_login", "flag": "account-login", "type": "string", "required": true }, { "name": "account_id", "flag": "account-id", "type": "integer", "required": true }, { "name": "account_type", "flag": "account-type", "type": "string", "required": true }], "hasComplexInput": true, "help": "Bind a GitHub App installation and selected repositories to Forge projects from the authenticated Forge GitHub settings flow. Owner-only and human-gated." },