@rosthq/cli 0.7.92 → 0.7.94

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,EAiR3D,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,EAmR3D,CAAC"}
package/dist/index.js CHANGED
@@ -43561,6 +43561,47 @@ var agentListToolCallsOutputSchema = external_exports.object({
43561
43561
  summary: seatTrustSummarySchema,
43562
43562
  tool_calls: external_exports.array(seatToolCallSchema)
43563
43563
  }).strict();
43564
+ var agentWatchRunInputSchema = external_exports.object({
43565
+ seat_id: uuidSchema14,
43566
+ run_id: uuidSchema14
43567
+ }).strict();
43568
+ var workProgressStateSchema = external_exports.enum(["not_started", "in_progress", "handed_off", "done", "failed"]);
43569
+ var runWatchCurrentStateSchema = external_exports.object({
43570
+ state: workProgressStateSchema,
43571
+ reasons: external_exports.array(external_exports.string()),
43572
+ claimed_state: workProgressStateSchema.nullable(),
43573
+ claim_mismatch: external_exports.boolean(),
43574
+ last_activity_at: isoDateTime4.nullable(),
43575
+ last_durable_activity_at: isoDateTime4.nullable()
43576
+ }).strict();
43577
+ var runWatchHeartbeatSchema = external_exports.object({
43578
+ state: external_exports.enum(["working", "quiet_healthy", "recovered", "stalled"]),
43579
+ stalled: external_exports.boolean(),
43580
+ current_phase: external_exports.string().nullable(),
43581
+ last_progress_at: isoDateTime4.nullable(),
43582
+ expected_next_at: isoDateTime4.nullable(),
43583
+ stall_after_at: isoDateTime4.nullable(),
43584
+ lease_remaining_ms: external_exports.number().nullable(),
43585
+ reasons: external_exports.array(external_exports.string())
43586
+ }).strict();
43587
+ var agentWatchRunOutputSchema = external_exports.object({
43588
+ seat_id: uuidSchema14,
43589
+ run: seatRunSchema,
43590
+ // the lean run row (status/lane/model/counts/timestamps)
43591
+ is_live: external_exports.boolean(),
43592
+ // run.status === "running"
43593
+ // When true, transcript + tool_calls are withheld because the viewer is
43594
+ // authorized on the seat but lacks sensitive-data access (setup-limited
43595
+ // reader). Header state (run, current_state, heartbeat) is always present. The
43596
+ // command surface always returns false (its callers are own-seat/tenant-admin
43597
+ // tokens); the web route sets it from the viewer's sensitivity.
43598
+ redacted: external_exports.boolean(),
43599
+ current_state: runWatchCurrentStateSchema,
43600
+ heartbeat: runWatchHeartbeatSchema.nullable(),
43601
+ transcript: sessionTranscriptReadResultSchema.nullable(),
43602
+ tool_calls: external_exports.array(seatToolCallSchema),
43603
+ fetched_at: isoDateTime4
43604
+ }).strict();
43564
43605
  var deliverableKindSchema = external_exports.enum(["brief", "work_evidence", "artifact", "report", "other"]);
43565
43606
  var deliverableLinkSchema = external_exports.object({
43566
43607
  label: external_exports.string(),
@@ -44989,6 +45030,27 @@ var softwareDispatchPreviewItemSchema = external_exports.object({
44989
45030
  hold_reason: softwareDispatchHoldReasonSchema.nullable(),
44990
45031
  hold_detail: external_exports.string().nullable()
44991
45032
  }).strict();
45033
+ var softwareTouchSetCollisionKindSchema = external_exports.enum([
45034
+ "same_file",
45035
+ "same_package",
45036
+ "same_version_holder"
45037
+ ]);
45038
+ var softwareTouchSetRefSchema = external_exports.object({ id: external_exports.string().min(1), label: external_exports.string() }).strict();
45039
+ var softwareTouchSetCollisionSchema = external_exports.object({
45040
+ a: softwareTouchSetRefSchema,
45041
+ b: softwareTouchSetRefSchema,
45042
+ kind: softwareTouchSetCollisionKindSchema,
45043
+ // The concrete overlap basis: shared file paths (`same_file`), shared package ids
45044
+ // (`same_package`), or the contended version-holder surfaces (`same_version_holder`).
45045
+ // Always non-empty — a collision without an overlap basis is never emitted.
45046
+ overlap: external_exports.array(external_exports.string()).min(1)
45047
+ }).strict();
45048
+ var softwareCrossRequestCollisionGroupSchema = external_exports.object({
45049
+ software_project_id: uuid11,
45050
+ requests: external_exports.array(softwareTouchSetRefSchema),
45051
+ collisions: external_exports.array(softwareTouchSetCollisionSchema),
45052
+ unknown: external_exports.array(softwareTouchSetRefSchema)
45053
+ }).strict();
44992
45054
  var softwareDispatchPreviewSchema = external_exports.object({
44993
45055
  status: external_exports.enum(["ready", "grooming", "held"]),
44994
45056
  digest: external_exports.string().min(1),
@@ -45000,6 +45062,11 @@ var softwareDispatchPreviewSchema = external_exports.object({
45000
45062
  to_task_key: external_exports.string()
45001
45063
  }).strict()).default([]),
45002
45064
  serial_lanes: external_exports.array(external_exports.string()).default([]),
45065
+ // DER-1545: advisory intra-request touch-set collisions derived from the tasks'
45066
+ // declared `files_likely` (validates the planner's `parallelizable` claims), plus the
45067
+ // tasks whose touch-set is undeclared (rendered "unknown", never fabricated).
45068
+ file_collisions: external_exports.array(softwareTouchSetCollisionSchema).default([]),
45069
+ unknown_touch_sets: external_exports.array(softwareTouchSetRefSchema).default([]),
45003
45070
  estimated_turns: external_exports.number().int().nullable(),
45004
45071
  runner_requirements: softwareDispatchPreviewRunnerRequirementSchema,
45005
45072
  authority_budget_envelope: external_exports.object({
@@ -45280,6 +45347,26 @@ var softwareGateDecideOutputSchema = external_exports.object({
45280
45347
  resolved_by_user_id: uuid11,
45281
45348
  decision_id: uuid11.nullable()
45282
45349
  });
45350
+ var softwareDispatchSerializeInputSchema = external_exports.object({
45351
+ build_request_id: uuid11,
45352
+ // The task that must run FIRST (the dependency target).
45353
+ before_task_key: external_exports.string().trim().min(1).max(200),
45354
+ // The task that gains the depends_on edge and runs AFTER `before_task_key`.
45355
+ after_task_key: external_exports.string().trim().min(1).max(200),
45356
+ rationale: external_exports.string().trim().min(1).max(2e3).optional()
45357
+ }).strict().refine((value) => value.before_task_key !== value.after_task_key, {
45358
+ message: "before_task_key and after_task_key must differ.",
45359
+ path: ["after_task_key"]
45360
+ });
45361
+ var softwareDispatchSerializeOutputSchema = external_exports.object({
45362
+ build_request_id: uuid11,
45363
+ before_task_key: external_exports.string(),
45364
+ after_task_key: external_exports.string(),
45365
+ // false when the edge already existed (idempotent no-op) — still a valid, audited call.
45366
+ edge_added: external_exports.boolean(),
45367
+ decision_id: uuid11.nullable(),
45368
+ event_id: uuid11.nullable()
45369
+ }).strict();
45283
45370
  var forgeClarificationAnswer = external_exports.object({
45284
45371
  question: external_exports.string().trim().min(1).max(2e3),
45285
45372
  answer: external_exports.string().trim().min(1).max(4e3)
@@ -48301,7 +48388,7 @@ External connectors are being rolled out provider by provider, conservatively (r
48301
48388
  order: 48,
48302
48389
  title: "CLI and MCP installation guide",
48303
48390
  summary: "Install the public CLI, register remote token-backed MCP clients, and find the full command and tool catalog.",
48304
- version: "2026-07-16.6",
48391
+ version: "2026-07-16.8",
48305
48392
  public: true,
48306
48393
  audiences: ["human", "cli", "mcp", "in_app_agent"],
48307
48394
  stages: ["company_setup", "staffing"],
@@ -48912,6 +48999,7 @@ Several rows here are seat-operating commands (\`task.create\`, the \`signal.*\`
48912
48999
  | \`rost_list_agent_runs\` | \`agent.list_runs\` | Read a seat's agent run history (status, lane, model, cost, per-run Skill activation, tool-call, guard-denied, and guard-held counts) plus the seat's run/tool-call rollup including held-action count. | Seat or tenant-admin | Call with \`{"seat_id":"<seat-id>"}\`; pass \`limit\` for a deeper window. |
48913
49000
  | \`rost_get_agent_run_diagnostics\` | \`agent.get_run\` | Read one run's diagnostic record: transcript reference, token/cost usage, outcome, linked product-visible run errors, and loaded Skill activation file metadata. File hashes/sizes identify the immutable source package, while model prompt text may be bounded or truncated. | Seat or tenant-admin | Call with \`{"seat_id":"<seat-id>","run_id":"<run-id>"}\`. |
48914
49001
  | \`rost_list_agent_tool_calls\` | \`agent.list_tool_calls\` | Read a seat's tool-call ledger (tool name, guard result, manifest clause, outcome) with the held-action count as the hero metric. Never returns argument summaries or secret material. | Seat or tenant-admin | Call with \`{"seat_id":"<seat-id>"}\`; pass \`held_only: true\` for only guard-held calls. |
49002
+ | \`rost_watch_agent_run\` | \`agent.watch_run\` | Read a read-only live snapshot of one seat run: status/lane, derived current work-state, run-heartbeat (quiet-but-healthy vs stalled) with current phase, the persisted session transcript, and the run's tool-call step feed. Never returns secret material. | Seat or tenant-admin | Call with \`{"seat_id":"<seat-id>","run_id":"<run-id>"}\`; read-only and reflects the run's current live state. |
48915
49003
  | \`rost_list_agent_deliverables\` | \`deliverable.list\` | List durable agent deliverables for a seat, including explicit outputs and successful-run summaries. | Seat or tenant-admin | Call with \`{"seat_id":"<seat-id>"}\`. |
48916
49004
  | \`rost_get_agent_deliverable\` | \`deliverable.get\` | Read one durable agent deliverable by id for a seat. | Seat or tenant-admin | Call with \`{"seat_id":"<seat-id>","deliverable_id":"<id>"}\`. |
48917
49005
  | \`rost_accept_deliverable_value\` | \`deliverable.accept\` | Record a human-confirmed accepted value (USD) on a deliverable; owner-only and human-gated. Humans decide \u2014 agents cannot self-accept. Re-accepting records a correction as a new event. | Tenant-admin | Call with \`{"deliverable_id":"<id>","impact_value_usd":<number>}\`; expect human confirmation. |
@@ -49068,6 +49156,7 @@ Several rows here are seat-operating commands (\`task.create\`, the \`signal.*\`
49068
49156
  | \`rost_show_a_forge_build_request\` | \`software_factory.request.show\` | The Forge request detail: the request, current phase, signed dispatch preview, phase-run history, gates, and current \`scheduler_state\` remediation. Read-only; requires the Forge add-on. | Tenant | Call with \`{"build_request_id":"<request-id>"}\`. |
49069
49157
  | \`rost_advance_a_forge_build_request_phase\` | \`software_factory.phase.advance\` | Advance a build request to its next phase; the server enforces the closed phase state machine and rejects an illegal transition. | Tenant | Call with \`{"build_request_id":"<request-id>","to_phase":"discovery_scoping"}\`. |
49070
49158
  | \`rost_decide_a_forge_gate\` | \`software_factory.gate.decide\` | A human approves or rejects a Forge gate; an agent caller routes to \`/approvals\` and can never self-approve. Sensitive gates record a linked human decision. | Tenant | Call with \`{"gate_id":"<gate-id>","decision":"approve"}\`; non-interactive callers receive a confirmation handoff. |
49159
+ | \`rost_serialize_a_forge_dispatch_collision\` | \`software_factory.dispatch.serialize\` | A human appends a tightening depends_on edge to serialize two colliding Forge tasks (advisory-driven; never auto-blocks). Records a human decision. | Tenant-admin | Call with \`{"build_request_id":"<request-id>","before_task_key":"<key>","after_task_key":"<key>"}\`; non-interactive callers receive a confirmation handoff. |
49071
49160
  | \`rost_answer_forge_plan_clarifications\` | \`software_factory.request.answer_clarification\` | Write structured human answers to a draft plan's clarifying questions and optionally mark it ready for plan review; answers append to the versioned planning artifact and never widen authority or automation mode. | Tenant | Call with \`{"build_request_id":"<request-id>","answers":[{"question":"Which database?","answer":"Postgres"}],"mark_ready_for_plan_review":true}\`. |
49072
49161
  | \`rost_approve_a_forge_plan\` | \`software_factory.plan.approve\` | A human approves the current plan at the plan_review gate; records a human decision and advances the request to implementation. Owner-only and human-gated. | Tenant-admin | Call with \`{"build_request_id":"<request-id>"}\`; non-interactive callers receive a confirmation handoff. |
49073
49162
  | \`rost_reject_a_forge_plan\` | \`software_factory.plan.reject\` | A human rejects the current plan (with a required rationale) and routes the request back to discovery/scoping for re-planning. Owner-only and human-gated. | Tenant-admin | Call with \`{"build_request_id":"<request-id>","rationale":"Scope too broad"}\`; non-interactive callers receive a confirmation handoff. |
@@ -52369,6 +52458,7 @@ var COMMAND_MANIFEST = [
52369
52458
  { "id": "agent.trust.revoke", "namespace": "agent", "action": "trust.revoke", "title": "Revoke agent Trusted grant", "description": "Human steward/admin revocation for an active Trusted execution grant. Preserves the historical grant row and appends an event.", "requiredScope": "tenant", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "grant_id", "flag": "grant-id", "type": "string", "required": true }, { "name": "reason", "flag": "reason", "type": "string", "required": false }], "hasComplexInput": false, "help": "Revoke an active Trusted grant while preserving history. Human steward/admin only." },
52370
52459
  { "id": "agent.trust.supersede", "namespace": "agent", "action": "trust.supersede", "title": "Supersede agent Trusted grant", "description": "Human steward/admin replacement for an active Trusted grant. Refuses stale receipt digests and links the new grant to the superseded grant.", "requiredScope": "tenant", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "agent_id", "flag": "agent-id", "type": "string", "required": true }, { "name": "expected_scope_digest", "flag": "expected-scope-digest", "type": "string", "required": true }, { "name": "budget_cents", "flag": "budget-cents", "type": "integer", "required": true }, { "name": "expires_at", "flag": "expires-at", "type": "string", "required": false }, { "name": "reason", "flag": "reason", "type": "string", "required": false }], "hasComplexInput": false, "help": "Replace the active Trusted grant with a fresh digest and budget. Rebuild the receipt first; stale digests are refused." },
52371
52460
  { "id": "agent.update_schedule", "namespace": "agent", "action": "update_schedule", "title": "Update agent schedule", "description": "Set or clear the scheduled execution cron for a draft or live agent on a seat.", "requiredScope": "tenant", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "seat_id", "flag": "seat-id", "type": "string", "required": true }, { "name": "schedule_cron", "flag": "schedule-cron", "type": "string", "required": true }], "hasComplexInput": false, "help": "Set or clear an agent's scheduled execution; a live scheduled agent must keep a steward chain resolving to a human." },
52461
+ { "id": "agent.watch_run", "namespace": "agent", "action": "watch_run", "title": "Watch agent run", "description": "Return a read-only live snapshot of one seat run: run status and lane, the derived current work-state, the run-heartbeat (quiet-but-healthy vs stalled) with current phase, the persisted session transcript, and the run's tool-call step feed (tool name, guard result, outcome). Never returns argument summaries or secret material.", "requiredScope": "seat", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "seat_id", "flag": "seat-id", "type": "string", "required": true }, { "name": "run_id", "flag": "run-id", "type": "string", "required": true }], "hasComplexInput": false, "help": "Watch one run live (read-only): run status, derived work-state, quiet-vs-stalled heartbeat, transcript, and the tool-call step feed." },
52372
52462
  { "id": "aicos.brain_settings.get", "namespace": "aicos", "action": "brain_settings.get", "title": "Get AICOS brain settings", "description": "Read the AICOS run lane and brain selection. Returns labels and enum settings only; no secrets or vault refs.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [], "hasComplexInput": false, "help": "Read the AICOS lane and brain selection labels without returning provider keys, vault refs, or runner secrets." },
52373
52463
  { "id": "aicos.brain_settings.update", "namespace": "aicos", "action": "brain_settings.update", "title": "Update AICOS brain settings", "description": "Update the AICOS lane and cloud/runner brain preferences. Owner-only and audited.", "requiredScope": "tenant_admin", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "lane", "flag": "lane", "type": "enum", "required": false, "enumValues": ["cloud", "runner", "mcp"] }, { "name": "cloud_brain", "flag": "cloud-brain", "type": "enum", "required": false, "enumValues": ["managed", "byok"] }, { "name": "runner_brain", "flag": "runner-brain", "type": "enum", "required": false, "enumValues": ["claude-cli", "codex-cli"] }, { "name": "cloud_model_slug", "flag": "cloud-model-slug", "type": "string", "required": false }], "hasComplexInput": false, "help": "Owner-only update for AICOS cloud managed/BYOK and runner Claude/Codex preferences; BYOK requires an active tenant Anthropic key." },
52374
52464
  { "id": "cascade.import", "namespace": "cascade", "action": "import", "title": "Import Rocks from a ninety Rocks export", "description": "Bulk-import a ninety Rocks export into the Cascade as cycle goals under a company objective in the active cycle. Owners are seat names resolved to seats. Requires an active cycle and a target company objective (auto-selected when exactly one exists, else pass parent_objective_id). Idempotent \u2014 re-importing the same export is a no-op, and an existing cycle goal with the same objective + seat + title is skipped.", "requiredScope": "tenant_admin", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "dry_run", "flag": "dry-run", "type": "boolean", "required": false }, { "name": "parent_objective_id", "flag": "parent-objective-id", "type": "string", "required": false }], "hasComplexInput": true, "help": "Import a ninety Rocks export into the Cascade as cycle goals under a company objective in the active cycle; owners resolve to seats." },
@@ -52537,6 +52627,7 @@ var COMMAND_MANIFEST = [
52537
52627
  { "id": "software_factory.conformance.resolve_finding", "namespace": "software_factory", "action": "conformance.resolve_finding", "title": "Resolve Forge conformance finding", "description": "A Forge review seat marks one or more prior open conformance findings resolved after re-reviewing the changeset and verifying they are fixed. This is reviewer verification, not gap-acceptance (accepting a gap stays a separate human gate). A resolved finding stops routing the request back to implementation, letting the recycle loop converge. 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": "finding_ids", "flag": "finding-ids", "type": "array", "required": true, "itemType": "string" }, { "name": "phase_run_id", "flag": "phase-run-id", "type": "string", "required": false }], "hasComplexInput": false, "help": "Resolve a prior open Forge conformance finding after re-reviewing the changeset and verifying it is fixed (reviewer verification, not human gap-acceptance). A resolved finding stops routing the request back to implementation, letting the recycle loop converge." },
52538
52628
  { "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: 8 seats (1 human lead + 7 agents), first-party skills, authority presets, and a conservative token budget. Approving this ACTIVATES the 7 agents as live occupancies at a pr_only, observe-first posture: they open pull requests but never merge or deploy without a human (the Release Manager auto-merges only after a human raises the automation-mode ceiling). 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." },
52539
52629
  { "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." },
52630
+ { "id": "software_factory.dispatch.serialize", "namespace": "software_factory", "action": "dispatch.serialize", "title": "Serialize a Forge dispatch collision", "description": "A human appends a tightening depends_on edge to serialize two colliding Forge tasks within one build request (advisory-driven; never auto-blocks). Records a human decision. Requires confirmation.", "requiredScope": "tenant_admin", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "build_request_id", "flag": "build-request-id", "type": "string", "required": true }, { "name": "before_task_key", "flag": "before-task-key", "type": "string", "required": true }, { "name": "after_task_key", "flag": "after-task-key", "type": "string", "required": true }, { "name": "rationale", "flag": "rationale", "type": "string", "required": false }], "hasComplexInput": false, "help": "A human appends a tightening depends_on edge to serialize two colliding Forge tasks within one build request (advisory-driven; never auto-blocks). Records a human decision." },
52540
52631
  { "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." },
52541
52632
  { "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." },
52542
52633
  { "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." },