@rosthq/cli 0.7.33 → 0.7.35

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.
@@ -1 +1 @@
1
- {"version":3,"file":"command-manifest.d.ts","sourceRoot":"","sources":["../../src/generated/command-manifest.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAE3E,eAAO,MAAM,gBAAgB,EAAE,SAAS,oBAAoB,EAmO3D,CAAC"}
1
+ {"version":3,"file":"command-manifest.d.ts","sourceRoot":"","sources":["../../src/generated/command-manifest.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAE3E,eAAO,MAAM,gBAAgB,EAAE,SAAS,oBAAoB,EAqO3D,CAAC"}
package/dist/index.js CHANGED
@@ -38743,6 +38743,35 @@ var agentResumeOutputSchema = external_exports.object({
38743
38743
  agent_id: uuidSchema2,
38744
38744
  status: external_exports.literal("live")
38745
38745
  }).strict();
38746
+ var agentSetupRelaneInputSchema = external_exports.object({
38747
+ seat_id: uuidSchema2,
38748
+ // The target lane. Must differ from the agent's current lane.
38749
+ lane: agentLaneSchema,
38750
+ // Rationale recorded in the append-only event log (required for governance).
38751
+ reason: external_exports.string().trim().min(1).max(500)
38752
+ }).strict();
38753
+ var agentSetupRelaneOutputSchema = external_exports.object({
38754
+ seat_id: uuidSchema2,
38755
+ agent_id: uuidSchema2,
38756
+ from_lane: agentLaneSchema,
38757
+ to_lane: agentLaneSchema,
38758
+ // `live` when the forced rehearsal passed and the agent returned to live on
38759
+ // the new lane; `rehearsal_failed` when the rehearsal failed and the agent is
38760
+ // left paused on the new lane (safe state — it cannot be woken by the
38761
+ // scheduler or an on-demand run until a human intervenes).
38762
+ status: external_exports.enum(["live", "rehearsal_failed"]),
38763
+ // DER-1317: the new lane's substrate readiness. `ready` = claimable now;
38764
+ // `parked` = a runner-lane target with no paired runner — the agent is admitted
38765
+ // live but cannot claim work until a runner pairs (the claim boundary enforces
38766
+ // this independently). mcp_session without a token is a hard gate and refuses
38767
+ // the whole re-lane instead of returning here.
38768
+ substrate: external_exports.enum(["ready", "parked"]),
38769
+ // Queued/claimed work orders expired by the pause step so none can start once
38770
+ // the agent leaves the old lane.
38771
+ cancelled_work_orders: external_exports.number().int().nonnegative(),
38772
+ // The lane-aware rehearsal transcript recorded on the NEW lane.
38773
+ transcript: dryRunTranscriptSchema
38774
+ }).strict();
38746
38775
  var agentCreateCustomInputSchema = external_exports.object({
38747
38776
  seat_id: uuidSchema2,
38748
38777
  // Optional steward placement supplied during the same operational pass; the
@@ -43130,6 +43159,30 @@ var softwareDeveloperTeamInstallOutputSchema = external_exports.object({
43130
43159
  token_budget: softwareDeveloperTeamTokenBudgetSummarySchema,
43131
43160
  github_policy: softwareDeveloperTeamGithubPolicySummarySchema.nullable()
43132
43161
  });
43162
+ var softwareFactoryTeardownTriggerSchema = external_exports.enum(["manual", "entitlement_lapse"]);
43163
+ var softwareDeveloperTeamUninstallInputSchema = external_exports.object({
43164
+ // DER-1241: this command is human-confirmed, so its input round-trips through
43165
+ // `pending_confirmations.input` (JSONB) and is re-parsed on approve replay. Use
43166
+ // `.nullable().optional()` (not a bare `.optional()`) so an omitted reason persists
43167
+ // as JSON `null` and re-parses cleanly, matching the sibling install schema.
43168
+ reason: external_exports.string().max(500).nullable().optional(),
43169
+ trigger: softwareFactoryTeardownTriggerSchema.default("manual")
43170
+ }).strict();
43171
+ var softwareDeveloperTeamDecommissionedAgentSchema = external_exports.object({
43172
+ role: softwareDeveloperTeamRoleSchema.nullable(),
43173
+ seat_id: uuid10,
43174
+ agent_id: uuid10
43175
+ });
43176
+ var softwareDeveloperTeamUninstallOutputSchema = external_exports.object({
43177
+ torn_down: external_exports.boolean(),
43178
+ trigger: softwareFactoryTeardownTriggerSchema,
43179
+ // The count of non-decommissioned team seats found under the ltree prefix (the human
43180
+ // forge_lead seat is included in the scope but is never decommissioned).
43181
+ seats_scoped: external_exports.number().int().nonnegative(),
43182
+ agents_decommissioned: external_exports.array(softwareDeveloperTeamDecommissionedAgentSchema),
43183
+ authority_grants_revoked: external_exports.number().int().nonnegative(),
43184
+ secret_grants_revoked: external_exports.number().int().nonnegative()
43185
+ });
43133
43186
  var forgeArtifactText = external_exports.string().trim().min(1).max(4e3);
43134
43187
  var forgeArtifactList = external_exports.array(forgeArtifactText).max(50).default([]);
43135
43188
  var forgeTaskKey = external_exports.string().trim().min(1).max(200);
@@ -44576,11 +44629,11 @@ Drafting can be assisted by agents. Activation is a human decision. When authori
44576
44629
  order: 40,
44577
44630
  title: "Agent staffing playbook",
44578
44631
  summary: "How to decide whether a seat should be human, agent, or hybrid, and how to go live safely.",
44579
- version: "2026-06-21.2",
44632
+ version: "2026-07-05.1",
44580
44633
  public: true,
44581
44634
  audiences: ["human", "cli", "mcp", "in_app_agent"],
44582
44635
  stages: ["staffing"],
44583
- relatedCommandIds: ["staffing.assign_user", "staffing.assign_agent_dry_run", "agent.go_live", "agent.status", "agent.run_now", "agent.get_run", "agent.list_runs", "agent.list_tool_calls", "mcp_token.create", "agent_template.list", "agent.create_from_template", "agent_setup.start", "agent_setup.get", "agent_setup.update", "agent.update_schedule", "agent.decommission", "agent.create_custom", "agent.configure_tools", "agent.run_dry_run", "confirmation.approve"],
44636
+ relatedCommandIds: ["staffing.assign_user", "staffing.assign_agent_dry_run", "agent.go_live", "agent.status", "agent.run_now", "agent.get_run", "agent.list_runs", "agent.list_tool_calls", "mcp_token.create", "agent_template.list", "agent.create_from_template", "agent_setup.start", "agent_setup.get", "agent_setup.update", "agent.update_schedule", "agent.pause", "agent.resume", "agent_setup.relane", "agent.decommission", "agent.create_custom", "agent.configure_tools", "agent.run_dry_run", "confirmation.approve"],
44584
44637
  legal: {
44585
44638
  publicRisk: "low",
44586
44639
  notes: [
@@ -44643,9 +44696,13 @@ The fleet page and seat page should make readiness inspectable, not implied. A s
44643
44696
 
44644
44697
  After an agent runs, review its completed work as well as its telemetry. Seat pages combine explicit deliverables, work-log evidence, and successful run summaries into a readable output trail with safe evidence links labelled as internal, Linear, GitHub, or external. Held confirmations and escalations remain visible until decided or expired: confirmations can be approved or rejected from the seat page, while escalations link to the Steward queue for the human decision.
44645
44698
 
44699
+ ## Change an agent's lane after go-live
44700
+
44701
+ The lane a live agent runs on \u2014 cloud (the {{brand}}-managed runtime), a paired runner, or an external MCP session \u2014 is otherwise fixed once it goes live. To move a live agent to a different lane, use \`agent_setup.relane\` (owner-only, human-gated, with a required rationale): it pauses the agent, moves it to the new lane, forces a **fresh** dry-run rehearsal on that lane so lane-specific tool executability is honestly re-surfaced, then brings it back live. It honours the same substrate gate as go-live \u2014 a runner target needs a paired runner \u2014 and if the rehearsal fails it leaves the agent paused on the new lane rather than going live, so a failed re-lane never wakes on a schedule. A draft agent's lane is still set directly with \`agent_setup.update\`.
44702
+
44646
44703
  ## When to stop for confirmation
44647
44704
 
44648
- \`agent.create_from_template\`, \`agent.create_custom\`, \`staffing.assign_user\`, \`agent.go_live\`, \`agent.update_schedule\`, and \`mcp_token.create\` are \`human_required\`; \`agent.configure_tools\` and \`credential.ingress\` are \`credential_flow\` (both gate through the vault-backed credential path with human approval; \`agent.configure_tools\` stages the request and only \`credential.ingress\` takes the raw secret, as a vault reference); \`agent.decommission\` is \`dangerous\`. \`agent.run_now\` is not human-gated because it does not expand authority or change the schedule; it only queues an immediate run for an already-live agent. An agent may draft, configure (with vault refs), dry-run, and request an on-demand run; the human approves go-live, credentials, schedule changes, and decommission. \`run_dry_run\` is ungated by human approval, but it is **precondition-gated**: the seat's permission manifest must be signed first (\`charter.sign_manifest\`). Attempting a dry run before sign-off returns a clean \`COMMAND_PRECONDITION_FAILED\` naming \`charter.sign_manifest\`, not a generic failure. Go-live after a passed dry run is \`human_required\`. See the confirmations guide.
44705
+ \`agent.create_from_template\`, \`agent.create_custom\`, \`staffing.assign_user\`, \`agent.go_live\`, \`agent.update_schedule\`, \`agent_setup.relane\`, and \`mcp_token.create\` are \`human_required\`; \`agent.configure_tools\` and \`credential.ingress\` are \`credential_flow\` (both gate through the vault-backed credential path with human approval; \`agent.configure_tools\` stages the request and only \`credential.ingress\` takes the raw secret, as a vault reference); \`agent.decommission\` is \`dangerous\`. \`agent.run_now\` is not human-gated because it does not expand authority or change the schedule; it only queues an immediate run for an already-live agent. An agent may draft, configure (with vault refs), dry-run, and request an on-demand run; the human approves go-live, credentials, schedule changes, and decommission. \`run_dry_run\` is ungated by human approval, but it is **precondition-gated**: the seat's permission manifest must be signed first (\`charter.sign_manifest\`). Attempting a dry run before sign-off returns a clean \`COMMAND_PRECONDITION_FAILED\` naming \`charter.sign_manifest\`, not a generic failure. Go-live after a passed dry run is \`human_required\`. See the confirmations guide.
44649
44706
 
44650
44707
  ## Non-negotiables
44651
44708
 
@@ -45149,7 +45206,7 @@ External connectors are being rolled out provider by provider, conservatively (r
45149
45206
  order: 48,
45150
45207
  title: "CLI and MCP installation guide",
45151
45208
  summary: "Install the public CLI, register remote token-backed MCP clients, and find the full command and tool catalog.",
45152
- version: "2026-07-05.2",
45209
+ version: "2026-07-05.4",
45153
45210
  public: true,
45154
45211
  audiences: ["human", "cli", "mcp", "in_app_agent"],
45155
45212
  stages: ["company_setup", "staffing"],
@@ -45764,6 +45821,7 @@ Several rows here are seat-operating commands (\`task.create\`, the \`signal.*\`
45764
45821
  | \`rost_decommission_agent\` | \`agent.decommission\` | Retire an agent occupancy safely (no-orphan guarded). | Tenant | Call with \`agent_id\`; expect human confirmation. |
45765
45822
  | \`rost_pause_agent\` | \`agent.pause\` | Pause a live agent so it stops scheduled and on-demand runs; reversible. | Tenant | Call with \`seat_id\`; expect human confirmation. |
45766
45823
  | \`rost_resume_agent\` | \`agent.resume\` | Resume a paused agent back to live (no-orphan guarded). | Tenant | Call with \`seat_id\`; expect human confirmation. |
45824
+ | \`rost_re_lane_a_live_agent\` | \`agent_setup.relane\` | Re-lane a live agent (cloud / runner / mcp_session): pause, move to the new lane, force a fresh dry-run rehearsal on that lane, then go live. Owner-only, human-gated, records a rationale; honours the substrate gate (a runner target needs a paired runner); a failed rehearsal leaves the agent paused on the new lane. | Tenant-admin | Call with \`{"seat_id":"<seat-id>","lane":"runner","reason":"Paired a Mac runner"}\`; expect human confirmation. |
45767
45825
  | \`rost_create_custom_agent\` | \`agent.create_custom\` | Create a draft custom agent shell and draft Charter seed from operational answers. | Tenant | Call with \`seat_id\` and operational answers; expect human confirmation. |
45768
45826
  | \`rost_configure_agent_tools\` | \`agent.configure_tools\` | Connect or decline proposed tools and stage credential-ingress requests (vault refs only). | Seat or tenant-admin | Never send raw secrets; expect a credential confirmation. |
45769
45827
  | \`rost_run_agent_dry_run\` | \`agent.run_dry_run\` | Run the sandbox dry run for a draft agent; durable and idempotent per Charter version. | Seat or tenant-admin | Call after the manifest is signed; ungated by human approval, but precondition-gated on a signed manifest. |
@@ -45887,6 +45945,7 @@ Several rows here are seat-operating commands (\`task.create\`, the \`signal.*\`
45887
45945
  | \`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. |
45888
45946
  | \`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. |
45889
45947
  | \`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; the 6 agent seats staff the runner lane and go live in a PARKED state \u2014 they become claimable once a runner pairs and cannot claim work before then; 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. Add \`{"lane_overrides":{"qa_release":"cloud"}}\` to pin a role to the cloud lane instead of the default runner lane. Non-interactive callers receive a confirmation handoff. |
45948
+ | \`rost_uninstall_forge_developer_team\` | \`software_factory.developer_team.uninstall\` | Tear down the governed Forge Developer Team (teardown \u2014 ADR-0018 \xA76): end the auto-staffed agent occupancies in a no-orphan-safe order, decommission the agents, and revoke the team's project authority and secret grants. The human Forge Lead seat is left intact; re-installing re-staffs the team. The entitlement-lapse variant runs the same teardown path without re-checking the Forge paywall. Owner-only and human-gated. | Tenant-admin | Call with \`{}\` (optionally \`{"reason":"offboarding"}\`); non-interactive callers receive a confirmation handoff. |
45890
45949
  | \`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"}\`. |
45891
45950
  | \`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"}\`. |
45892
45951
  | \`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"}\`. |
@@ -48935,6 +48994,7 @@ function parseSemver(value) {
48935
48994
  // src/generated/command-manifest.ts
48936
48995
  var COMMAND_MANIFEST = [
48937
48996
  { "id": "agent_setup.get", "namespace": "agent_setup", "action": "get", "title": "Get agent setup", "description": "Read the resumable agent-setup state: mode, parent, steward, template, lane, schedule, tool decisions, dry run, and next action.", "requiredScope": "seat", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "seat_id", "flag": "seat-id", "type": "string", "required": false }, { "name": "setup_id", "flag": "setup-id", "type": "string", "required": false }], "hasComplexInput": false, "help": "Read the resumable setup state: mode, parent, steward, lane, schedule, tool decisions, dry-run blockers, and the next action." },
48997
+ { "id": "agent_setup.relane", "namespace": "agent_setup", "action": "relane", "title": "Re-lane a live agent", "description": "Governed re-lane of a live agent: pause, move to the new lane, force a fresh dry-run rehearsal on that lane, then go live. Owner-only and human-gated; records a rationale.", "requiredScope": "tenant_admin", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "seat_id", "flag": "seat-id", "type": "string", "required": true }, { "name": "lane", "flag": "lane", "type": "enum", "required": true, "enumValues": ["cloud", "mcp_session", "runner"] }, { "name": "reason", "flag": "reason", "type": "string", "required": true }], "hasComplexInput": false, "help": "Re-lane a live agent (cloud / runner / mcp_session): it pauses, moves to the new lane, forces a fresh dry-run rehearsal on that lane, then goes live \u2014 owner-only, human-gated, with a required rationale. A runner target needs a paired runner; a failed rehearsal leaves the agent paused on the new lane." },
48938
48998
  { "id": "agent_setup.start", "namespace": "agent_setup", "action": "start", "title": "Start agent setup", "description": "Start (or resume) a draft agent setup for a seat in template, custom, or existing mode.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "seat_id", "flag": "seat-id", "type": "string", "required": true }, { "name": "mode", "flag": "mode", "type": "enum", "required": true, "enumValues": ["template", "custom", "existing"] }, { "name": "template_slug", "flag": "template-slug", "type": "string", "required": false }], "hasComplexInput": false, "help": "Start a draft agent setup from a template, custom, or existing mode; the setup resumes from the draft agent and Charter, not a fresh start." },
48939
48999
  { "id": "agent_setup.update", "namespace": "agent_setup", "action": "update", "title": "Update agent setup", "description": "Update the draft agent's parent, steward, lane, schedule, operational answers, and tool decisions.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "seat_id", "flag": "seat-id", "type": "string", "required": true }, { "name": "parent_seat_id", "flag": "parent-seat-id", "type": "string", "required": false }, { "name": "steward_seat_id", "flag": "steward-seat-id", "type": "string", "required": false }, { "name": "lane", "flag": "lane", "type": "enum", "required": false, "enumValues": ["cloud", "mcp_session", "runner"] }, { "name": "schedule_cron", "flag": "schedule-cron", "type": "string", "required": false }, { "name": "answers", "flag": "answers", "type": "array", "required": false, "itemType": "string" }], "hasComplexInput": true, "help": "Update parent, steward, lane, schedule, answers, or tool decisions on the draft; steward and parent changes keep the no-orphan chain explicit." },
48940
49000
  { "id": "agent_template.list", "namespace": "agent_template", "action": "list", "title": "List agent templates", "description": "List stock agent templates and their responsibilities, default tools, and dry-run rehearsal.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [], "hasComplexInput": false, "help": "List stock agent templates and their default tools and safety boundaries before starting a template setup." },
@@ -49101,6 +49161,7 @@ var COMMAND_MANIFEST = [
49101
49161
  { "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." },
49102
49162
  { "id": "software_factory.conformance.record_findings", "namespace": "software_factory", "action": "conformance.record_findings", "title": "Record Forge conformance findings", "description": "The plan-conformance reviewer records one or more findings against a build request; open findings route the request back to implementation. Recording is evidence, not a decision \u2014 accepting a gap is a separate human gate. Requires the Forge add-on.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "build_request_id", "flag": "build-request-id", "type": "string", "required": true }, { "name": "phase_run_id", "flag": "phase-run-id", "type": "string", "required": false }], "hasComplexInput": true, "help": "Record structured Forge plan-conformance findings as reviewer evidence. Open findings route the request back to implementation; accepting a gap remains a separate human gate." },
49103
49163
  { "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": true, "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." },
49164
+ { "id": "software_factory.developer_team.uninstall", "namespace": "software_factory", "action": "developer_team.uninstall", "title": "Uninstall Forge Developer Team", "description": "Tear down the governed Forge Developer Team (ADR-0018 \xA76): end the auto-staffed agent occupancies in a no-orphan-safe order, decommission the agents, and revoke the team's project authority and secret grants. The human Forge Lead seat is left intact; re-installing re-staffs the team. The entitlement-lapse variant runs the same teardown path without re-checking the Forge paywall. Owner-only, human-gated, and audited.", "requiredScope": "tenant_admin", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "reason", "flag": "reason", "type": "string", "required": false }, { "name": "trigger", "flag": "trigger", "type": "enum", "required": false, "enumValues": ["manual", "entitlement_lapse"] }], "hasComplexInput": false, "help": "Tear down the Forge Developer Team (teardown \u2014 ADR-0018 \xA76): end the agent occupancies in a no-orphan-safe order, decommission the agents, and revoke the team's authority and secret grants. The human Forge Lead seat stays. Owner-only and human-gated; the entitlement-lapse variant runs the same teardown path." },
49104
49165
  { "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." },
49105
49166
  { "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." },
49106
49167
  { "id": "software_factory.github.installation.bind", "namespace": "software_factory", "action": "github.installation.bind", "title": "Bind Forge GitHub repositories to projects", "description": "Bind already-connected GitHub repositories to Forge projects. Owner-only and human-gated; operates on repositories already verified and connected in this tenant, so no GitHub re-authorization is required. Available any time, add or re-map bindings.", "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 }], "hasComplexInput": true, "help": "Bind already-connected GitHub repositories to Forge projects from the Forge GitHub settings flow. Owner-only and human-gated; no GitHub re-authorization required." },