@rosthq/cli 0.7.83 → 0.7.85
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/cli-version.d.ts +1 -1
- package/dist/cli-version.d.ts.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +68 -29
- package/dist/index.js.map +4 -4
- package/package.json +1 -1
package/dist/cli-version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare function readCliVersion(): Promise<string | null>;
|
|
1
|
+
export declare function readCliVersion(embeddedVersion?: string | undefined): Promise<string | null>;
|
|
2
2
|
//# sourceMappingURL=cli-version.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-version.d.ts","sourceRoot":"","sources":["../src/cli-version.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cli-version.d.ts","sourceRoot":"","sources":["../src/cli-version.ts"],"names":[],"mappings":"AA0BA,wBAAsB,cAAc,CAClC,eAAe,GAAE,MAAM,GAAG,SAAuF,GAChH,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAWxB"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAOA,OAAO,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAC;AACxE,OAAO,EAAoB,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAOA,OAAO,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAC;AACxE,OAAO,EAAoB,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAyBrE,KAAK,KAAK,GAAG;IACX,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC1C,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAK1C,WAAW,CAAC,EAAE,OAAO,CAAC;IAOtB,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAClD,CAAC;AAcF,KAAK,WAAW,GAAG;IACjB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,EAAE,CAAC,EAAE,KAAK,CAAC;IACX,KAAK,CAAC,EAAE,OAAO,gBAAgB,CAAC;IAChC,WAAW,CAAC,EAAE,OAAO,mBAAmB,CAAC;IACzC,cAAc,CAAC,EAAE,OAAO,yBAAyB,CAAC;CACnD,CAAC;AAEF,wBAAsB,IAAI,CAAC,IAAI,WAAwB,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAkSnG;AA0hBD,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAUxF"}
|
package/dist/index.js
CHANGED
|
@@ -37796,10 +37796,30 @@ function windowsClearScript(target) {
|
|
|
37796
37796
|
].join("\n");
|
|
37797
37797
|
}
|
|
37798
37798
|
|
|
37799
|
+
// src/cli-version.ts
|
|
37800
|
+
import { readFile as readFile2 } from "node:fs/promises";
|
|
37801
|
+
import { dirname, resolve } from "node:path";
|
|
37802
|
+
import { fileURLToPath } from "node:url";
|
|
37803
|
+
var packageMetadataSchema = external_exports.object({
|
|
37804
|
+
version: external_exports.string()
|
|
37805
|
+
});
|
|
37806
|
+
async function readCliVersion(embeddedVersion = typeof __ROST_CLI_VERSION__ === "string" ? __ROST_CLI_VERSION__ : void 0) {
|
|
37807
|
+
if (embeddedVersion !== void 0) {
|
|
37808
|
+
return embeddedVersion;
|
|
37809
|
+
}
|
|
37810
|
+
const packageJsonPath = resolve(dirname(fileURLToPath(import.meta.url)), "../package.json");
|
|
37811
|
+
try {
|
|
37812
|
+
const metadata = packageMetadataSchema.parse(JSON.parse(await readFile2(packageJsonPath, "utf8")));
|
|
37813
|
+
return metadata.version;
|
|
37814
|
+
} catch {
|
|
37815
|
+
return null;
|
|
37816
|
+
}
|
|
37817
|
+
}
|
|
37818
|
+
|
|
37799
37819
|
// ../../packages/prompts/src/index.ts
|
|
37800
37820
|
import { readFileSync } from "node:fs";
|
|
37801
|
-
import { dirname, join } from "node:path";
|
|
37802
|
-
import { fileURLToPath } from "node:url";
|
|
37821
|
+
import { dirname as dirname2, join } from "node:path";
|
|
37822
|
+
import { fileURLToPath as fileURLToPath2 } from "node:url";
|
|
37803
37823
|
|
|
37804
37824
|
// ../../packages/protocol/src/cron.ts
|
|
37805
37825
|
var uintPattern = /^\d+$/;
|
|
@@ -44876,6 +44896,30 @@ var softwareTaskSummarySchema = external_exports.object({
|
|
|
44876
44896
|
completed_at: external_exports.string().nullable(),
|
|
44877
44897
|
created_at: external_exports.string()
|
|
44878
44898
|
});
|
|
44899
|
+
var softwarePlanArtifactTaskSummarySchema = external_exports.object({
|
|
44900
|
+
task_key: external_exports.string(),
|
|
44901
|
+
title: external_exports.string(),
|
|
44902
|
+
depends_on: external_exports.array(external_exports.string()).default([]),
|
|
44903
|
+
parallelizable: external_exports.boolean().default(false),
|
|
44904
|
+
est_turns: external_exports.number().int().nullable().default(null),
|
|
44905
|
+
files_likely: external_exports.array(external_exports.string()).default([]),
|
|
44906
|
+
verification: external_exports.array(external_exports.string()).default([])
|
|
44907
|
+
});
|
|
44908
|
+
var softwarePlanArtifactChangesetSummarySchema = external_exports.object({
|
|
44909
|
+
ordinal: external_exports.number().int(),
|
|
44910
|
+
title: external_exports.string(),
|
|
44911
|
+
split_criterion: external_exports.string(),
|
|
44912
|
+
task_keys: external_exports.array(external_exports.string()).default([])
|
|
44913
|
+
});
|
|
44914
|
+
var softwarePlanArtifactSummarySchema = external_exports.object({
|
|
44915
|
+
scope: external_exports.string(),
|
|
44916
|
+
plan_steps: external_exports.array(external_exports.string()).default([]),
|
|
44917
|
+
files_or_systems: external_exports.array(external_exports.string()).default([]),
|
|
44918
|
+
verification: external_exports.array(external_exports.string()).default([]),
|
|
44919
|
+
risks: external_exports.array(external_exports.string()).default([]),
|
|
44920
|
+
tasks: external_exports.array(softwarePlanArtifactTaskSummarySchema).default([]),
|
|
44921
|
+
changesets: external_exports.array(softwarePlanArtifactChangesetSummarySchema).default([])
|
|
44922
|
+
});
|
|
44879
44923
|
var softwarePlanVersionSummarySchema = external_exports.object({
|
|
44880
44924
|
id: uuid11,
|
|
44881
44925
|
build_request_id: uuid11,
|
|
@@ -44888,6 +44932,7 @@ var softwarePlanVersionSummarySchema = external_exports.object({
|
|
|
44888
44932
|
question: external_exports.string(),
|
|
44889
44933
|
answer: external_exports.string()
|
|
44890
44934
|
})).default([]),
|
|
44935
|
+
planning_artifact: softwarePlanArtifactSummarySchema.nullable(),
|
|
44891
44936
|
created_by_seat_id: uuid11.nullable(),
|
|
44892
44937
|
created_at: external_exports.string()
|
|
44893
44938
|
});
|
|
@@ -45682,7 +45727,12 @@ var softwareGithubAutomationPolicyInputSchema = external_exports.object({
|
|
|
45682
45727
|
// are identical to the union (`SoftwareGithubAction | SoftwareAutomationMode`).
|
|
45683
45728
|
requires_human_for: external_exports.array(external_exports.enum([...softwareGithubActionSchema.options, ...softwareAutomationModeSchema.options])).max(20).refine((values) => values.includes("deploy_production"), {
|
|
45684
45729
|
message: "production deploy must remain human-gated"
|
|
45685
|
-
})
|
|
45730
|
+
}),
|
|
45731
|
+
// DER-1266: optional per-policy inferred-risk tolerance. When set and the server-inferred
|
|
45732
|
+
// risk EXCEEDS this level, rule 5 (ADR-0018 §5) downgrades the effective automation mode
|
|
45733
|
+
// to plan_only. Omitted/null = the fixed riskModeCeilingFor table (no change for existing
|
|
45734
|
+
// policies). Conservative-by-default (invariant #10): this can only tighten, never loosen.
|
|
45735
|
+
max_risk: softwareRiskLevelSchema.nullable().optional()
|
|
45686
45736
|
}).strict();
|
|
45687
45737
|
var softwareGithubConnectedRepositoryInputSchema = external_exports.object({
|
|
45688
45738
|
repository_id: external_exports.number().int().positive(),
|
|
@@ -45754,7 +45804,8 @@ var softwareGithubInstallationListOutputSchema = external_exports.object({
|
|
|
45754
45804
|
var softwareGithubAutomationPolicyUpsertOutputSchema = external_exports.object({
|
|
45755
45805
|
policy_id: uuid11,
|
|
45756
45806
|
software_project_id: uuid11,
|
|
45757
|
-
automation_mode_ceiling: softwareAutomationModeSchema
|
|
45807
|
+
automation_mode_ceiling: softwareAutomationModeSchema,
|
|
45808
|
+
max_risk: softwareRiskLevelSchema.nullable()
|
|
45758
45809
|
});
|
|
45759
45810
|
var softwareGithubInstallationTokenCreateInputSchema = external_exports.object({
|
|
45760
45811
|
software_project_id: uuid11,
|
|
@@ -46717,7 +46768,7 @@ var eventEnvelopeReaderSchema = external_exports.discriminatedUnion("type", [
|
|
|
46717
46768
|
]);
|
|
46718
46769
|
|
|
46719
46770
|
// ../../packages/prompts/src/index.ts
|
|
46720
|
-
var promptRoot = join(
|
|
46771
|
+
var promptRoot = join(dirname2(fileURLToPath2(import.meta.url)), "..", "prompts");
|
|
46721
46772
|
function loadPromptBody(filename) {
|
|
46722
46773
|
const raw = readFileSync(join(promptRoot, filename), "utf8");
|
|
46723
46774
|
return raw.replace(/^---\n[\s\S]*?\n---\n?/, "").trim();
|
|
@@ -47078,7 +47129,7 @@ Treat AICOS as a coordinator over the operating system. It can become more usefu
|
|
|
47078
47129
|
order: 20,
|
|
47079
47130
|
title: "Responsibility Graph playbook",
|
|
47080
47131
|
summary: "How to build a functions-first graph with seats, owners, Stewards, vacancies, and clean authority.",
|
|
47081
|
-
version: "2026-07-14.
|
|
47132
|
+
version: "2026-07-14.2",
|
|
47082
47133
|
public: true,
|
|
47083
47134
|
audiences: ["human", "cli", "mcp", "in_app_agent"],
|
|
47084
47135
|
stages: ["graph_design", "staffing"],
|
|
@@ -47126,7 +47177,7 @@ Seats that do not reach the single root through the resolved parent chain are li
|
|
|
47126
47177
|
|
|
47127
47178
|
## Forge Developer Team seats are pinned
|
|
47128
47179
|
|
|
47129
|
-
Seats under \`forge.developer_team\` are resolved by Forge build dispatch using their exact path, so they cannot be reparented or merged from the graph, CLI, or MCP \u2014 moving a seat (or an ancestor whose subtree holds them) would eject them from dispatch, and no command can restore the path. To change who is accountable for one of these seats, update its steward with \`agent_setup.update\`; the reporting path stays fixed. To stand the team down, use the governed Forge team teardown flow, not a merge or decommission.
|
|
47180
|
+
Seats under \`forge.developer_team\` are resolved by Forge build dispatch using their exact path, so they cannot be reparented or merged from the graph, CLI, or MCP \u2014 moving a seat (or an ancestor whose subtree holds them) would eject them from dispatch, and no command can restore the path. To change who is accountable for one of these seats, update its steward with \`agent_setup.update\`; the reporting path stays fixed. To stand the team down, use the governed Forge team teardown flow, not a merge or decommission. The web canvas surfaces this pin visibly: a lock badge on the seat card (Responsibility Chart and Cascade views) and in the seat inspector panel, with a tooltip explaining the seat can't be moved, merged, or reparented \u2014 so the restriction is visible before a user hits the guard, not only as an error after the fact.
|
|
47130
47181
|
|
|
47131
47182
|
## Add an agent from the graph
|
|
47132
47183
|
|
|
@@ -47904,7 +47955,7 @@ External connectors are being rolled out provider by provider, conservatively (r
|
|
|
47904
47955
|
order: 48,
|
|
47905
47956
|
title: "CLI and MCP installation guide",
|
|
47906
47957
|
summary: "Install the public CLI, register remote token-backed MCP clients, and find the full command and tool catalog.",
|
|
47907
|
-
version: "2026-07-15.
|
|
47958
|
+
version: "2026-07-15.5",
|
|
47908
47959
|
public: true,
|
|
47909
47960
|
audiences: ["human", "cli", "mcp", "in_app_agent"],
|
|
47910
47961
|
stages: ["company_setup", "staffing"],
|
|
@@ -48424,6 +48475,7 @@ Skills wrapper help:
|
|
|
48424
48475
|
| \`{{cli}} mcp install --client cursor --scope tenant-admin\` | Mint a tenant-admin MCP token and print Cursor JSON. | Tenant | \`{{cli}} mcp install --client cursor --scope tenant-admin\` |
|
|
48425
48476
|
| \`{{cli}} mcp install --client <client> --scope seat --seat-id <seat-id>\` | Mint a token limited to one seat (the narrowest scope \u2014 prefer for day-to-day). | Seat | \`{{cli}} mcp install --client codex --scope seat --seat-id <seat-id>\` |
|
|
48426
48477
|
| \`{{cli}} --help\` | Print top-level CLI help. | Public help | \`{{cli}} --help\` |
|
|
48478
|
+
| \`{{cli}} --version\` / \`{{cli}} -v\` | Print the installed CLI's own version and exit \u2014 no usage text, no auth. | Public help | \`{{cli}} --version\` |
|
|
48427
48479
|
|
|
48428
48480
|
## MCP tool and resource catalog
|
|
48429
48481
|
|
|
@@ -48675,7 +48727,7 @@ Several rows here are seat-operating commands (\`task.create\`, the \`signal.*\`
|
|
|
48675
48727
|
| \`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"}\`. |
|
|
48676
48728
|
| \`rost_grant_a_forge_secret\` | \`software_factory.secret.grant\` | A human grants a seat scoped access to a project secret by vault ref (Postgres stores only the pointer, never secret material). Owner-only and human-gated. | Tenant-admin | Call with \`{"software_project_id":"<project-id>","environment":"production","seat_id":"<seat-id>","action":"vercel.env.sync","key_name":"OPENAI_API_KEY","vault_ref":"infisical://prod/OPENAI_API_KEY"}\`. |
|
|
48677
48729
|
| \`rost_revoke_a_forge_secret_grant\` | \`software_factory.secret.revoke\` | Revoke a Forge secret grant (teardown \u2014 cut a compromised seat's access immediately). Owner-only and human-gated. | Tenant-admin | Call with \`{"grant_id":"<grant-id>"}\`; non-interactive callers receive a confirmation handoff. |
|
|
48678
|
-
| \`rost_set_a_forge_github_automation_policy\` | \`software_factory.github.policy.upsert\` | Set the server-side GitHub automation policy: allowed actions, automation-mode ceiling, and operations requiring humans. The allowed-actions and human-gated-actions lists are stored server-side as structured JSON arrays. Owner-only and human-gated. Raising the ceiling to a merge-capable mode (merge_after_checks or higher) first verifies the bound repository has required status checks on its default branch and refuses otherwise. | Tenant-admin | Call with \`{"software_project_id":"<project-id>","automation_mode_ceiling":"pr_only","allowed_actions":["webhook_intake","installation_token"],"requires_human_for":["deploy_production"]}\`. |
|
|
48730
|
+
| \`rost_set_a_forge_github_automation_policy\` | \`software_factory.github.policy.upsert\` | Set the server-side GitHub automation policy: allowed actions, automation-mode ceiling, and operations requiring humans. The allowed-actions and human-gated-actions lists are stored server-side as structured JSON arrays. Owner-only and human-gated. Raising the ceiling to a merge-capable mode (merge_after_checks or higher) first verifies the bound repository has required status checks on its default branch and refuses otherwise. Optional \`max_risk\` (\`low\`\\|\`medium\`\\|\`high\`\\|\`critical\`) tightens the fixed inferred-risk\u2192mode-ceiling table per policy \u2014 an inferred risk strictly above \`max_risk\` is capped to \`plan_only\`; unset keeps the existing fixed-table behavior exactly, and \`critical\` inferred risk always stays \`plan_only\` regardless of \`max_risk\` (invariant #10, tighten-only). | Tenant-admin | Call with \`{"software_project_id":"<project-id>","automation_mode_ceiling":"pr_only","allowed_actions":["webhook_intake","installation_token"],"requires_human_for":["deploy_production"],"max_risk":"medium"}\`. |
|
|
48679
48731
|
| \`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"}\`. |
|
|
48680
48732
|
| \`rost_list_forge_github_installations\` | \`software_factory.github.installation.list\` | List connected GitHub App installations and each repository's bind state (connected or active) with the Forge project it maps to. Read-only. | Tenant | Call with \`{}\`; a \`connected\` repository is verified but not yet bound to a project. |
|
|
48681
48733
|
| \`rost_list_forge_vercel_links\` | \`software_factory.vercel.project.list\` | List connected Vercel accounts/teams and linked existing Vercel projects. Read-only; no OAuth tokens or vault refs are returned. | Tenant | Call with \`{}\`; tenant admins connect/link from \`/forge/settings/vercel\`. |
|
|
@@ -51810,25 +51862,6 @@ function helpText() {
|
|
|
51810
51862
|
import { mkdir as mkdir2, readFile as readFile3, writeFile as writeFile2 } from "node:fs/promises";
|
|
51811
51863
|
import { homedir as homedir2 } from "node:os";
|
|
51812
51864
|
import path2 from "node:path";
|
|
51813
|
-
|
|
51814
|
-
// src/cli-version.ts
|
|
51815
|
-
import { readFile as readFile2 } from "node:fs/promises";
|
|
51816
|
-
import { dirname as dirname2, resolve } from "node:path";
|
|
51817
|
-
import { fileURLToPath as fileURLToPath2 } from "node:url";
|
|
51818
|
-
var packageMetadataSchema = external_exports.object({
|
|
51819
|
-
version: external_exports.string()
|
|
51820
|
-
});
|
|
51821
|
-
async function readCliVersion() {
|
|
51822
|
-
const packageJsonPath = resolve(dirname2(fileURLToPath2(import.meta.url)), "../package.json");
|
|
51823
|
-
try {
|
|
51824
|
-
const metadata = packageMetadataSchema.parse(JSON.parse(await readFile2(packageJsonPath, "utf8")));
|
|
51825
|
-
return metadata.version;
|
|
51826
|
-
} catch {
|
|
51827
|
-
return null;
|
|
51828
|
-
}
|
|
51829
|
-
}
|
|
51830
|
-
|
|
51831
|
-
// src/update-check.ts
|
|
51832
51865
|
var latestPackageSchema = external_exports.object({
|
|
51833
51866
|
version: external_exports.string()
|
|
51834
51867
|
});
|
|
@@ -52130,7 +52163,7 @@ var COMMAND_MANIFEST = [
|
|
|
52130
52163
|
{ "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." },
|
|
52131
52164
|
{ "id": "software_factory.github.installation.connect", "namespace": "software_factory", "action": "github.installation.connect", "title": "Connect a Forge GitHub installation", "description": "Record a proven GitHub App installation and its verified repositories as connected (unbound) so they can be bound to Forge projects later. Owner-only and human-gated; starts from the authenticated Forge GitHub settings flow. Idempotent \u2014 re-connecting reconciles metadata and never unbinds an already-bound repository.", "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": "Record a verified GitHub App installation and its repositories as connected (unbound) so they can be bound to Forge projects later. Owner-only and human-gated." },
|
|
52132
52165
|
{ "id": "software_factory.github.installation.list", "namespace": "software_factory", "action": "github.installation.list", "title": "List Forge GitHub installations", "description": "List connected GitHub App installations and their repositories with bind state (connected or active) and the Forge project each bound repository maps to. Read-only; requires the Forge add-on.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "app_slug", "flag": "app-slug", "type": "string", "required": false }], "hasComplexInput": false, "help": "List connected GitHub App installations and each repository's bind state (connected or active) with the Forge project it maps to. Read-only." },
|
|
52133
|
-
{ "id": "software_factory.github.policy.upsert", "namespace": "software_factory", "action": "github.policy.upsert", "title": "Set a Forge GitHub automation policy", "description": "Set the server-side policy for GitHub actions and automation-mode ceilings. Owner-only and human-gated; production deploy remains human-gated. Raising the ceiling to a merge-capable mode (merge_after_checks or higher) first verifies the bound repository has required status checks configured \u2014 it refuses otherwise.", "requiredScope": "tenant_admin", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "software_project_id", "flag": "software-project-id", "type": "string", "required": true }, { "name": "authority_profile_id", "flag": "authority-profile-id", "type": "string", "required": false }, { "name": "automation_mode_ceiling", "flag": "automation-mode-ceiling", "type": "enum", "required": false, "enumValues": ["plan_only", "pr_only", "merge_after_checks", "deploy_preview", "deploy_production"] }, { "name": "allowed_actions", "flag": "allowed-actions", "type": "array", "required": true, "itemType": "string" }, { "name": "requires_human_for", "flag": "requires-human-for", "type": "array", "required": true, "itemType": "string" }], "hasComplexInput": false, "help": "Set Forge's server-side GitHub automation policy for actions, mode ceilings, and human-gated operations." },
|
|
52166
|
+
{ "id": "software_factory.github.policy.upsert", "namespace": "software_factory", "action": "github.policy.upsert", "title": "Set a Forge GitHub automation policy", "description": "Set the server-side policy for GitHub actions and automation-mode ceilings. Owner-only and human-gated; production deploy remains human-gated. Raising the ceiling to a merge-capable mode (merge_after_checks or higher) first verifies the bound repository has required status checks configured \u2014 it refuses otherwise.", "requiredScope": "tenant_admin", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "software_project_id", "flag": "software-project-id", "type": "string", "required": true }, { "name": "authority_profile_id", "flag": "authority-profile-id", "type": "string", "required": false }, { "name": "automation_mode_ceiling", "flag": "automation-mode-ceiling", "type": "enum", "required": false, "enumValues": ["plan_only", "pr_only", "merge_after_checks", "deploy_preview", "deploy_production"] }, { "name": "allowed_actions", "flag": "allowed-actions", "type": "array", "required": true, "itemType": "string" }, { "name": "requires_human_for", "flag": "requires-human-for", "type": "array", "required": true, "itemType": "string" }, { "name": "max_risk", "flag": "max-risk", "type": "enum", "required": false, "enumValues": ["low", "medium", "high", "critical"] }], "hasComplexInput": false, "help": "Set Forge's server-side GitHub automation policy for actions, mode ceilings, and human-gated operations." },
|
|
52134
52167
|
{ "id": "software_factory.github.repository.unbind", "namespace": "software_factory", "action": "github.repository.unbind", "title": "Unbind a Forge GitHub repository", "description": "Remove a GitHub repository's Forge project binding. By default the repository stays connected (unbound) and can be re-bound later; pass disconnect to remove it entirely. Owner-only and human-gated.", "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": "repository_id", "flag": "repository-id", "type": "integer", "required": true }, { "name": "disconnect", "flag": "disconnect", "type": "boolean", "required": false }], "hasComplexInput": false, "help": "Remove a GitHub repository's Forge project binding; the repository stays connected for re-binding unless disconnect is set. Owner-only and human-gated." },
|
|
52135
52168
|
{ "id": "software_factory.phase.advance", "namespace": "software_factory", "action": "phase.advance", "title": "Advance a Forge build request phase", "description": "Advance a build request to the next phase, enforcing the closed phase state machine server-side (an illegal transition is rejected). Writes a phase-run row and updates the current phase. Entitlement-gated.", "requiredScope": "tenant", "confirmation": "none", "exposeOverMcp": true, "fields": [{ "name": "build_request_id", "flag": "build-request-id", "type": "string", "required": true }, { "name": "to_phase", "flag": "to-phase", "type": "enum", "required": true, "enumValues": ["intake", "discovery_scoping", "plan_review", "implementation", "plan_conformance_review", "security_review", "qa_verification", "release_preview", "merge_or_deploy_gate", "closeout"] }, { "name": "owning_seat_id", "flag": "owning-seat-id", "type": "string", "required": false }, { "name": "note", "flag": "note", "type": "string", "required": false }], "hasComplexInput": false, "help": "Advance a build request to its next phase; the server enforces the closed phase state machine and rejects an illegal transition." },
|
|
52136
52169
|
{ "id": "software_factory.plan.approve", "namespace": "software_factory", "action": "plan.approve", "title": "Approve a Forge plan", "description": "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 (invariant #7).", "requiredScope": "tenant_admin", "confirmation": "human_required", "exposeOverMcp": true, "fields": [{ "name": "build_request_id", "flag": "build-request-id", "type": "string", "required": true }, { "name": "rationale", "flag": "rationale", "type": "string", "required": false }], "hasComplexInput": false, "help": "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." },
|
|
@@ -58395,6 +58428,12 @@ async function main(argv = process.argv.slice(2), options = {}) {
|
|
|
58395
58428
|
const deviceLogin = options.deviceLogin ?? loginWithDeviceCode;
|
|
58396
58429
|
const refreshSession = options.refreshSession ?? refreshCliSessionIfNeeded;
|
|
58397
58430
|
const [rawCommand, ...args] = argv;
|
|
58431
|
+
if (rawCommand === "--version" || rawCommand === "-v") {
|
|
58432
|
+
const version4 = await readCliVersion();
|
|
58433
|
+
io.stdout.write(`${version4 ?? "unknown"}
|
|
58434
|
+
`);
|
|
58435
|
+
return 0;
|
|
58436
|
+
}
|
|
58398
58437
|
const command = rawCommand === "--help" || rawCommand === "-h" ? "help" : rawCommand;
|
|
58399
58438
|
if (isSecretBlockedNamespace(command) || isSecretBlockedCommand(args[0] === void 0 ? void 0 : `${command}.${args[0]}`)) {
|
|
58400
58439
|
io.stderr.write(`${SECRET_ARGV_GUIDANCE}
|