@rosthq/cli 0.7.43 → 0.7.45
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,5 +1,5 @@
|
|
|
1
1
|
import { type StepLedger } from "./step-ledger.js";
|
|
2
|
-
export declare const MODEL_SPAWN_ENV_ALLOWLIST: readonly ["PATH", "HOME", "LANG", "LC_ALL", "TMPDIR", "SHELL", "NODE_OPTIONS"];
|
|
2
|
+
export declare const MODEL_SPAWN_ENV_ALLOWLIST: readonly ["PATH", "HOME", "USER", "LANG", "LC_ALL", "TMPDIR", "SHELL", "NODE_OPTIONS"];
|
|
3
3
|
export declare function buildModelSpawnEnv(base: NodeJS.ProcessEnv): NodeJS.ProcessEnv;
|
|
4
4
|
export type ForgeCredential = {
|
|
5
5
|
token: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"forge-workspace.d.ts","sourceRoot":"","sources":["../src/forge-workspace.ts"],"names":[],"mappings":"AA2CA,OAAO,EAAqB,KAAK,UAAU,EAAiB,MAAM,kBAAkB,CAAC;AASrF,eAAO,MAAM,yBAAyB,
|
|
1
|
+
{"version":3,"file":"forge-workspace.d.ts","sourceRoot":"","sources":["../src/forge-workspace.ts"],"names":[],"mappings":"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"}
|
|
@@ -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,
|
|
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,EAsO3D,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -42843,6 +42843,19 @@ var softwareConformanceRecordFindingsOutputSchema = external_exports.object({
|
|
|
42843
42843
|
finding_ids: external_exports.array(uuid10),
|
|
42844
42844
|
open_finding_count: external_exports.number().int()
|
|
42845
42845
|
}).strict();
|
|
42846
|
+
var softwareConformanceResolveFindingInputSchema = external_exports.object({
|
|
42847
|
+
build_request_id: uuid10,
|
|
42848
|
+
finding_ids: external_exports.array(uuid10).min(1).max(50),
|
|
42849
|
+
// The re-review run that verified the fix — provenance only (rides into the append-only audit
|
|
42850
|
+
// event; the finding row's resolution state is the durable transition).
|
|
42851
|
+
phase_run_id: uuid10.optional()
|
|
42852
|
+
}).strict();
|
|
42853
|
+
var softwareConformanceResolveFindingOutputSchema = external_exports.object({
|
|
42854
|
+
build_request_id: uuid10,
|
|
42855
|
+
resolved_count: external_exports.number().int(),
|
|
42856
|
+
resolved_finding_ids: external_exports.array(uuid10),
|
|
42857
|
+
open_finding_count: external_exports.number().int()
|
|
42858
|
+
}).strict();
|
|
42846
42859
|
var softwareAuthorityProfileListInputSchema = external_exports.object({
|
|
42847
42860
|
software_project_id: uuid10.nullable().optional()
|
|
42848
42861
|
}).strict();
|
|
@@ -45270,7 +45283,7 @@ External connectors are being rolled out provider by provider, conservatively (r
|
|
|
45270
45283
|
order: 48,
|
|
45271
45284
|
title: "CLI and MCP installation guide",
|
|
45272
45285
|
summary: "Install the public CLI, register remote token-backed MCP clients, and find the full command and tool catalog.",
|
|
45273
|
-
version: "2026-07-05.
|
|
45286
|
+
version: "2026-07-05.7",
|
|
45274
45287
|
public: true,
|
|
45275
45288
|
audiences: ["human", "cli", "mcp", "in_app_agent"],
|
|
45276
45289
|
stages: ["company_setup", "staffing"],
|
|
@@ -46060,6 +46073,7 @@ Seat-scoped MCP tokens expose the operating protocol below. The server still che
|
|
|
46060
46073
|
| \`rost_request_a_forge_secret_grant\` | \`software_factory.secret.request\` | Request access to a project secret by key. It creates a durable credential request and approval Task, never accepts a secret value, and does not grant access by itself. | Seat | Call with \`{"software_project_id":"<project-id>","environment":"preview","seat_id":"<seat-id>","action":"test.run","key_name":"OPENAI_API_KEY"}\`. |
|
|
46061
46074
|
| \`rost_verify_forge_secret_broker_access\` | \`software_factory.secret.use\` | Verify broker authorization for a Forge secret without opening the vault. Missing grants create or reuse a credential request + approval Task; allowed grants return a redacted authorization summary only. Runtime vault use happens runner-side. | Seat | Call with \`{"software_project_id":"<project-id>","environment":"preview","seat_id":"<seat-id>","action":"test.run","key_name":"OPENAI_API_KEY","operation":"test_execution"}\`. |
|
|
46062
46075
|
| \`rost_record_forge_conformance_findings\` | \`software_factory.conformance.record_findings\` | A Forge review seat (plan conformance, security, or QA) records structured findings as reviewer evidence. Set \`changeset_id\` on a finding that targets a specific changeset. Open findings route the request back to implementation; accepting a gap remains a separate human gate. Requires the seat's signed manifest grant. | Seat | Call with \`{"build_request_id":"<request-id>","findings":[{"severity":"major","category":"scope_gap","summary":"Missing migration verification","changeset_id":"<changeset-id>"}]}\`. |
|
|
46076
|
+
| \`rost_resolve_forge_conformance_finding\` | \`software_factory.conformance.resolve_finding\` | A Forge review seat marks a prior open finding resolved 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, so the recycle loop converges. Requires the seat's signed manifest grant. | Seat | Call with \`{"build_request_id":"<request-id>","finding_ids":["<finding-id>"]}\`. |
|
|
46063
46077
|
|
|
46064
46078
|
### MCP operation resources
|
|
46065
46079
|
|
|
@@ -49232,6 +49246,7 @@ var COMMAND_MANIFEST = [
|
|
|
49232
49246
|
{ "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." },
|
|
49233
49247
|
{ "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." },
|
|
49234
49248
|
{ "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." },
|
|
49249
|
+
{ "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." },
|
|
49235
49250
|
{ "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." },
|
|
49236
49251
|
{ "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." },
|
|
49237
49252
|
{ "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." },
|
|
@@ -51882,6 +51897,12 @@ var execFile3 = promisify3(execFileCallback3);
|
|
|
51882
51897
|
var MODEL_SPAWN_ENV_ALLOWLIST = [
|
|
51883
51898
|
"PATH",
|
|
51884
51899
|
"HOME",
|
|
51900
|
+
// Claude Code resolves its stored login by the `$USER` account name — the macOS
|
|
51901
|
+
// Keychain item is keyed on it (`security find-generic-password -a "$USER" -s
|
|
51902
|
+
// "Claude Code-credentials"`). Without USER a spawned `claude` reports "Not logged in"
|
|
51903
|
+
// even on a host that has `claude` installed and logged in, breaking the "npm install +
|
|
51904
|
+
// login, no terminal steps" runner UX (DER-1311). USER is an identity var, not a secret.
|
|
51905
|
+
"USER",
|
|
51885
51906
|
"LANG",
|
|
51886
51907
|
"LC_ALL",
|
|
51887
51908
|
"TMPDIR",
|
|
@@ -53114,7 +53135,11 @@ async function executeClaimedUnit(fetchImpl, appUrl2, state, config2, io, runtim
|
|
|
53114
53135
|
}
|
|
53115
53136
|
const reported = await post2(fetchImpl, appUrl2, input.resultPath(id), {
|
|
53116
53137
|
status: result.ok ? "succeeded" : "failed",
|
|
53117
|
-
summary
|
|
53138
|
+
// Cap to the result route's summary limit (see capResultSummary / RESULT_SUMMARY_MAX). A
|
|
53139
|
+
// real turn summary can exceed it; without the cap the server's Zod `.max()` 400s the
|
|
53140
|
+
// report, and because the loop treats a throw as "transient (continuing)" the phase
|
|
53141
|
+
// zombies in `running` until its lease grace. Truncating keeps a successful turn a success.
|
|
53142
|
+
summary: capResultSummary(result.summary),
|
|
53118
53143
|
log_ref: input.logRef(id),
|
|
53119
53144
|
model: (turnRuntime ?? runtime) === "codex" ? "codex-cli" : "claude-cli",
|
|
53120
53145
|
// Artifact-bearing result fields (T1.5) — only sent when the harness produced them, so
|
|
@@ -53132,11 +53157,34 @@ async function executeClaimedUnit(fetchImpl, appUrl2, state, config2, io, runtim
|
|
|
53132
53157
|
...input.kind === "work_order" && result.transcript ? { transcript: result.transcript } : {}
|
|
53133
53158
|
}, state.runner_secret);
|
|
53134
53159
|
if (reported.status !== 200) {
|
|
53160
|
+
if (reported.status >= 400 && reported.status < 500) {
|
|
53161
|
+
const fallback = await post2(fetchImpl, appUrl2, input.resultPath(id), {
|
|
53162
|
+
status: "failed",
|
|
53163
|
+
summary: capResultSummary(
|
|
53164
|
+
`Runner result rejected by server (${reported.status}). Original outcome: ${result.ok ? "succeeded" : "failed"}. ${redactForLog(JSON.stringify(reported.json))}`
|
|
53165
|
+
),
|
|
53166
|
+
log_ref: input.logRef(id),
|
|
53167
|
+
model: (turnRuntime ?? runtime) === "codex" ? "codex-cli" : "claude-cli"
|
|
53168
|
+
}, state.runner_secret);
|
|
53169
|
+
if (fallback.status === 200) {
|
|
53170
|
+
io.stdout.write(`${input.idField}=${id} status=failed (result rejected ${reported.status}; reported terminal failure)
|
|
53171
|
+
`);
|
|
53172
|
+
return;
|
|
53173
|
+
}
|
|
53174
|
+
}
|
|
53135
53175
|
throw new Error(`${claimedUnitLabel(input.kind)} result failed ${reported.status}: ${redactForLog(JSON.stringify(reported.json))}`);
|
|
53136
53176
|
}
|
|
53137
53177
|
io.stdout.write(`${input.idField}=${id} status=${result.ok ? "succeeded" : "failed"}
|
|
53138
53178
|
`);
|
|
53139
53179
|
}
|
|
53180
|
+
var RESULT_SUMMARY_MAX = 12e3;
|
|
53181
|
+
function capResultSummary(summary) {
|
|
53182
|
+
const trimmed = summary.trim();
|
|
53183
|
+
if (trimmed.length === 0) {
|
|
53184
|
+
return "(no summary reported)";
|
|
53185
|
+
}
|
|
53186
|
+
return trimmed.length <= RESULT_SUMMARY_MAX ? trimmed : `${trimmed.slice(0, RESULT_SUMMARY_MAX - 1)}\u2026`;
|
|
53187
|
+
}
|
|
53140
53188
|
function claimedUnitLabel(kind) {
|
|
53141
53189
|
return kind === "work_order" ? "work order" : "turn execution";
|
|
53142
53190
|
}
|
|
@@ -53414,6 +53462,7 @@ function buildTurnPrompt(input) {
|
|
|
53414
53462
|
const isForgeReview = execution?.profile === "forge_review";
|
|
53415
53463
|
const isSeatWork = execution?.profile === "seat_work";
|
|
53416
53464
|
const canFileFindings = execution?.allowed_mcp_tools.includes("rost_record_forge_conformance_findings") ?? false;
|
|
53465
|
+
const canResolveFindings = execution?.allowed_mcp_tools.includes("rost_resolve_forge_conformance_finding") ?? false;
|
|
53417
53466
|
return [
|
|
53418
53467
|
hasForgeContext ? `Call rost_get_context first to load your full ${cliBrand.name} charter, then call rost_get_build_context with forge.phase_run_id from the claimed context to load the approved plan, open findings, prior phase summaries, and remaining budgets. Next call rost_list_my_skills and load any assigned Skill you need with rost_get_my_skill_file. Then perform the assigned phase work, address every open finding, report a concise phase status, and stop.` : hasAicosTurnContext ? `Call rost_get_context first to load your full ${cliBrand.name} charter, then call rost_aicos_turn_load_context with turn_execution_id from the claimed context. Answer the AICOS user turn using only that loaded context plus seat-authorized tools. Return only the final concise Markdown answer; no hidden reasoning, tool chatter, raw JSON, secrets, local paths, or unauthorized memory.` : hasAicosContext ? `Call rost_get_context first to load your full ${cliBrand.name} charter, answer the AICOS user turn using only seat-authorized context and tools, return only the final answer as concise Markdown with short paragraphs or real lists, and stop.` : isSeatWork ? `Call rost_get_context first to load your full ${cliBrand.name} charter and current tasks, then carry out the scheduled work your charter authorizes \u2014 accept and complete assigned tasks, record signal readings, file friction, create or attach deliverables, and log your work through your seat tools. Every tool call is re-authorized server-side against your permission manifest, so use only the actions your charter grants and escalate anything beyond your autonomous scope. Report a concise status when done and stop.` : `Call rost_get_context first to load your full ${cliBrand.name} charter, report one read-only status, and stop.`,
|
|
53419
53468
|
// Forge workspace guidance (phase-specific). The harness owns all git network ops; the
|
|
@@ -53423,6 +53472,9 @@ function buildTurnPrompt(input) {
|
|
|
53423
53472
|
// T1.6: the review/QA seats record findings through their manifest-granted writer. Only
|
|
53424
53473
|
// emitted when the seat actually holds the tool (so the builder is never told to file findings).
|
|
53425
53474
|
canFileFindings ? "When you find a plan-conformance, security, or QA gap, record it with rost_record_forge_conformance_findings \u2014 set changeset_id when the finding targets a specific changeset. A finding is reviewer evidence, not a decision (accepting a gap is a separate human gate). If rost_get_build_context returned a `review` block, review ONLY changesets where review.changesets[].needs_review is true; never re-review an unchanged passing changeset or re-file a prior finding listed in review.prior_findings \u2014 verify those are resolved instead." : "",
|
|
53475
|
+
// DER-1355: on a re-review the seat must RESOLVE a prior finding it verified as fixed —
|
|
53476
|
+
// otherwise the still-open finding routes the request back forever and the loop never converges.
|
|
53477
|
+
canResolveFindings ? "For each finding in your build context's open_findings on a changeset you re-review, verify it against the current diff: if the diff now fixes it, RESOLVE it with rost_resolve_forge_conformance_finding (this is reviewer verification, not human gap-acceptance); if it is still not fixed, leave it open. A resolved finding stops routing the request back to implementation, so the build can converge instead of thrashing to a budget block." : "",
|
|
53426
53478
|
input.hasWorkspace ? "Load your assigned Skills with rost_list_my_skills and rost_get_my_skill_file before starting; if none are assigned, proceed with your charter and the loaded build context." : "",
|
|
53427
53479
|
isSeatWork ? "If seat skill tools are available, load your assigned skills before starting; if none are exposed, proceed with your charter and assigned tasks." : "",
|
|
53428
53480
|
hasAicosTurnContext ? "For AICOS turns, the governed load tool returns the authoritative tenant clock, route context, transcript window, session summary, source counts, read models, and output contract. Never substitute local runtime time or model priors for that loaded tenant clock." : "",
|