Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions packages/loopover-mcp/lib/local-branch.js
Original file line number Diff line number Diff line change
Expand Up @@ -320,10 +320,10 @@
break;
case "malformed_json":
guidance.push("External scorer must print one JSON object with sourceTokenScore/totalTokenScore fields to stdout.");
if (safeStatus.stderr) guidance.push(`Last scorer stdout snippet: ${truncateText(safeStatus.stderr, 160)}`);

Check warning on line 323 in packages/loopover-mcp/lib/local-branch.js

View check run for this annotation

Loopover ORB / LoopOver Context

Missing test evidence

Code changed without an obvious test file in this PR. Add focused tests or explain why existing coverage is sufficient.

Check warning on line 323 in packages/loopover-mcp/lib/local-branch.js

View check run for this annotation

Loopover ORB / LoopOver Context

Possible duplicate overlap

Titles/paths share 6 meaningful terms.

Check notice on line 323 in packages/loopover-mcp/lib/local-branch.js

View check run for this annotation

Loopover ORB / LoopOver Context

Possible duplicate overlap

Titles/paths share 5 meaningful terms.
break;
case "non_zero_exit":
guidance.push("External scorer exited with a non-zero status; inspect stderr and run gittensory-mcp doctor.");
guidance.push("External scorer exited with a non-zero status; inspect stderr and run loopover-mcp doctor.");
if (safeStatus.stderr) guidance.push(`Scorer stderr: ${truncateText(safeStatus.stderr, 160)}`);
if (typeof safeStatus.exitCode === "number") guidance.push(`Exit code: ${safeStatus.exitCode}`);
break;
Expand All @@ -340,7 +340,7 @@
return sanitizeLocalScorerStatus(
runExternalScorePreview(
{
repoFullName: "JSONbored/gittensory",
repoFullName: "JSONbored/loopover",
branchName: "doctor-probe",
changedFiles: [{ path: "src/example.ts", additions: 12, deletions: 2, status: "modified" }],
repoRoot: process.cwd(),
Expand Down
10 changes: 5 additions & 5 deletions packages/loopover-miner/bin/loopover-miner-mcp.js
Original file line number Diff line number Diff line change
Expand Up @@ -54,15 +54,15 @@
* `options.initEventLedger`, `options.initRunStateStore`, `options.openPlanStore`, `options.initGovernorLedger`,
* `options.collectStatus`, `options.runDoctorChecks`, and `options.nowMs` are injection seams for tests (default
* to the real stores/readers and the wall clock); the ping tool needs none. Each store-backed tool opens its
* store only when invoked and closes any store it opened.

Check warning on line 57 in packages/loopover-miner/bin/loopover-miner-mcp.js

View check run for this annotation

Loopover ORB / LoopOver Context

Missing test evidence

Code changed without an obvious test file in this PR. Add focused tests or explain why existing coverage is sufficient.

Check warning on line 57 in packages/loopover-miner/bin/loopover-miner-mcp.js

View check run for this annotation

Loopover ORB / LoopOver Context

Possible duplicate overlap

Titles/paths share 6 meaningful terms.

Check notice on line 57 in packages/loopover-miner/bin/loopover-miner-mcp.js

View check run for this annotation

Loopover ORB / LoopOver Context

Possible duplicate overlap

Titles/paths share 5 meaningful terms.
*/
export function createMinerMcpServer(options = {}) {
const server = new McpServer({ name: "gittensory-miner", version: ownPackageJson.version });
const server = new McpServer({ name: "loopover-miner", version: ownPackageJson.version });
server.registerTool(
"loopover_miner_ping",
{
description:
"Health check for the gittensory-miner MCP server. Returns a static status object confirming the " +
"Health check for the loopover-miner MCP server. Returns a static status object confirming the " +
"server is reachable. Reads no AMS state and takes no arguments.",
inputSchema: {},
},
Expand All @@ -74,7 +74,7 @@
description:
"Read-only per-repo portfolio-queue backlog dashboard: status counts (queued/in_progress/done), totals, " +
"and the oldest-queued age in ms. Wraps the existing collectPortfolioDashboard aggregator (no new logic) " +
"-- the same data `gittensory-miner queue dashboard --json` prints locally. Takes no arguments; mutates nothing.",
"-- the same data `loopover-miner queue dashboard --json` prints locally. Takes no arguments; mutates nothing.",
inputSchema: {},
},
async () => {
Expand Down Expand Up @@ -119,7 +119,7 @@
description:
"Read-only, metadata-only audit feed from the local append-only event ledger: eventType, repoFullName, " +
"outcome, actor, detail, and createdAt per row. Wraps collectEventLedgerAuditFeed() (no new query logic) — " +
"the same read filters as `gittensory-miner ledger list` (--repo, --since, --type). Never returns " +
"the same read filters as `loopover-miner ledger list` (--repo, --since, --type). Never returns " +
"payload_json or other raw ledger columns; never writes to the ledger.",
inputSchema: auditFeedInputSchema,
},
Expand Down Expand Up @@ -252,7 +252,7 @@
"Read-only miner status + doctor diagnostics. Returns { status, doctor }: status = package/engine versions " +
"(+ skew), node version, state-dir path, config-file path, and the resolved coding-agent driver (provider " +
"name, the model ENV-VAR NAME -- never its value -- and a CLI-present boolean); doctor = the same checks " +
"`gittensory-miner doctor` runs (Docker/CLI presence, config validity, ...) as { name, ok, detail }. Reuses " +
"`loopover-miner doctor` runs (Docker/CLI presence, config validity, ...) as { name, ok, detail }. Reuses " +
"collectStatus/runDoctorChecks so it can never drift from the CLI. Only names / booleans / paths -- never " +
"any env-var value, token, key, or credential. Read-only; no writes or state changes.",
inputSchema: {},
Expand Down
2 changes: 1 addition & 1 deletion packages/loopover-miner/lib/calibration-run.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@
// deterministic replay *scorer* (`computeObjectiveAnchor`, ./replay-objective-anchor.js), but nothing ever called
// one with the other -- #3014's issue claimed "wired" while only the engine side shipped. This module is the
// missing runner: it scores a completed historical-replay run with the objective-anchor scorer, folds the
// resulting composite into the `HistoricalReplayCalibrationInput` shape the engine expects, calls the combine with

Check warning on line 7 in packages/loopover-miner/lib/calibration-run.js

View check run for this annotation

Loopover ORB / LoopOver Context

Missing test evidence

Code changed without an obvious test file in this PR. Add focused tests or explain why existing coverage is sufficient.

Check warning on line 7 in packages/loopover-miner/lib/calibration-run.js

View check run for this annotation

Loopover ORB / LoopOver Context

Possible duplicate overlap

Titles/paths share 6 meaningful terms.

Check notice on line 7 in packages/loopover-miner/lib/calibration-run.js

View check run for this annotation

Loopover ORB / LoopOver Context

Possible duplicate overlap

Titles/paths share 5 meaningful terms.
// the existing pr_outcome signal, and PERSISTS the combined snapshot to the local append-only event ledger (a typed
// event layered on event-ledger.js exactly like pr-outcome.js's MINER_PR_OUTCOME_EVENT), queryable via
// `gittensory-miner ledger list --type calibration_snapshot`.
// `loopover-miner ledger list --type calibration_snapshot`.
//
// SCOPE: this runner is read/measure-only. It produces and persists the tracked calibration metric; it NEVER acts
// on it (no autonomy-level bump, no gate-threshold tune) -- that enforcement is maintainer-only and fail-closed
Expand Down
2 changes: 1 addition & 1 deletion packages/loopover-miner/lib/claim-conflict-resolver.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@
// own just-opened PR (never anyone else's) -- the write action the contributor-vs-maintainer safety framework
// keeps maintainer-only (#4833's own scope note), since it means the autonomous loop acts on a race-resolution
// decision with no human review.
//

Check warning on line 12 in packages/loopover-miner/lib/claim-conflict-resolver.js

View check run for this annotation

Loopover ORB / LoopOver Context

Missing test evidence

Code changed without an obvious test file in this PR. Add focused tests or explain why existing coverage is sufficient.

Check warning on line 12 in packages/loopover-miner/lib/claim-conflict-resolver.js

View check run for this annotation

Loopover ORB / LoopOver Context

Possible duplicate overlap

Titles/paths share 6 meaningful terms.

Check notice on line 12 in packages/loopover-miner/lib/claim-conflict-resolver.js

View check run for this annotation

Loopover ORB / LoopOver Context

Possible duplicate overlap

Titles/paths share 5 meaningful terms.
// CLAIM-TIME ASYMMETRY (documented, not accidental): `self`'s claimedAt is the miner's OWN real local
// claim-ledger timestamp (claim-ledger.js, recorded before work even started). A competing PR's claimedAt uses
// its real GitHub `createdAt` instead -- the maintainer gate's own duplicate-winner election uses gittensory
// its real GitHub `createdAt` instead -- the maintainer gate's own duplicate-winner election uses loopover
// server's "first observed this PR's linked-issue set" timestamp, but that requires a continuous, persistent
// observation history this stateless client-side tool does not have for a PR it doesn't own. `createdAt` is
// the best real, publicly-observable proxy available for someone else's PR -- live-issue-snapshot.js's own
Expand Down
2 changes: 1 addition & 1 deletion packages/loopover-miner/lib/coding-agent-house-rules.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// House-rules-enforced coding-agent construction (#2343 follow-up). buildHouseRulesPreToolUseHook

Check warning on line 1 in packages/loopover-miner/lib/coding-agent-house-rules.js

View check run for this annotation

Loopover ORB / LoopOver Context

Missing test evidence

Code changed without an obvious test file in this PR. Add focused tests or explain why existing coverage is sufficient.

Check warning on line 1 in packages/loopover-miner/lib/coding-agent-house-rules.js

View check run for this annotation

Loopover ORB / LoopOver Context

Possible duplicate overlap

Titles/paths share 6 meaningful terms.
// (pretooluse-hook.js) is the LIVE PreToolUse interception point, but the engine package's
// createCodingAgentDriver / runCodingAgentAttempt (driver-factory.ts) cannot import it directly -- the
// dependency only ever flows gittensory-miner -> @loopover/engine, never the reverse (the engine
// dependency only ever flows loopover-miner -> @loopover/engine, never the reverse (the engine
// package is portable and cannot depend on the miner CLI package). This module is the missing miner-side
// glue: it wraps runCodingAgentAttempt so the `agent-sdk` provider gets house-rule enforcement by DEFAULT --
// a future real call site does not need to remember to attach it itself, closing the exact gap
Expand Down
10 changes: 5 additions & 5 deletions packages/loopover-miner/lib/coding-task-spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,10 @@
// issueQualityStatus/lifecycle is "ready", the same honest-default precedent already established.
//
// Target-repo stack detection (#4786 / #4785 follow-up): `detectRepoStack` already returned a structured
// language/package-manager/command description, but nothing in the attempt path consumed it -- instructions

Check warning on line 30 in packages/loopover-miner/lib/coding-task-spec.js

View check run for this annotation

Loopover ORB / LoopOver Context

Missing test evidence

Code changed without an obvious test file in this PR. Add focused tests or explain why existing coverage is sufficient.

Check warning on line 30 in packages/loopover-miner/lib/coding-task-spec.js

View check run for this annotation

Loopover ORB / LoopOver Context

Possible duplicate overlap

Titles/paths share 6 meaningful terms.
// were issue text + an acceptance-criteria path only. This module now appends that real stack summary (and
// any confidently-inferred validation commands) to the coding-agent prompt so the agent validates against
// THIS repository's tooling rather than assuming LoopOver/gittensory CI, Codecov, or `npm run test:ci`.
// THIS repository's tooling rather than assuming LoopOver/loopover CI, Codecov, or `npm run test:ci`.

function buildTaskBrief(issue) {
const body = (issue.body ?? "").trim();
Expand Down Expand Up @@ -141,7 +141,7 @@
/**
* Prompt guidance derived from a real `detectRepoStack` result (#4786). Lists only commands the detector
* confidently inferred -- a `null` command stays omitted rather than guessed -- and always tells the agent
* not to assume LoopOver/gittensory's own CI/coverage conventions.
* not to assume LoopOver/loopover's own CI/coverage conventions.
*
* @param {import("./stack-detection.js").RepoStackResult} stack
* @returns {string}
Expand All @@ -151,7 +151,7 @@
`Detected target-repo stack: ${renderStackSummary(stack)}`,
"",
"Validate your change with THIS repository's own build/test/lint tooling from the stack summary above.",
"Do not assume LoopOver/gittensory CI conventions, Codecov patch coverage, or `npm run test:ci` unless those commands appear in the detected stack.",
"Do not assume LoopOver/loopover CI conventions, Codecov patch coverage, or `npm run test:ci` unless those commands appear in the detected stack.",
];
if (stack?.detected === true) {
const commands = [
Expand All @@ -176,7 +176,7 @@
* The coding-agent driver's own prompt text (agent-sdk-driver.ts's header: "forwarded verbatim as the
* prompt -- the acceptance-criteria document already lives inside the worktree", so this points to it
* rather than repeating its content). Also carries the target repo's detected stack + validation commands
* (#4786) so the agent does not default to gittensory-specific CI assumptions.
* (#4786) so the agent does not default to loopover-specific CI assumptions.
*
* @param {{ number: number, title: string, body?: string | null }} issue
* @param {string} acceptanceCriteriaPath
Expand Down Expand Up @@ -223,7 +223,7 @@
}

// Real target-repo stack (#4786): detected from the prepared worktree's own manifests, not guessed from
// gittensory conventions. Fail-closed `{ detected: false }` results still reach the prompt (via
// loopover conventions. Fail-closed `{ detected: false }` results still reach the prompt (via
// renderStackSummary) so the agent is told detection failed rather than silently defaulting to npm/Codecov.
const detect = input.detectRepoStack ?? detectRepoStack;
const stack = detect(input.workingDirectory);
Expand Down
6 changes: 3 additions & 3 deletions packages/loopover-miner/lib/cross-repo-evaluation.d.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import type { RepoStackResult } from "./stack-detection.js";

export const CROSS_REPO_FAILURE_CATEGORY: Readonly<{

Check warning on line 3 in packages/loopover-miner/lib/cross-repo-evaluation.d.ts

View check run for this annotation

Loopover ORB / LoopOver Context

Missing test evidence

Code changed without an obvious test file in this PR. Add focused tests or explain why existing coverage is sufficient.

Check warning on line 3 in packages/loopover-miner/lib/cross-repo-evaluation.d.ts

View check run for this annotation

Loopover ORB / LoopOver Context

Possible duplicate overlap

Titles/paths share 6 meaningful terms.
STACK_DETECTION: "stack_detection_gap";
EXECUTION: "execution_gap";
GITTENSOR_ASSUMPTION: "gittensory_assumption";
GITTENSOR_ASSUMPTION: "loopover_assumption";
CLONE_SETUP: "clone_setup";
OTHER: "other";
}>;
Expand Down Expand Up @@ -46,7 +46,7 @@
passed: number;
failed: number;
majorityPassed: boolean;
withoutGittensoryConfig: number;
withoutLoopoverConfig: number;
failuresByCategory: Record<string, number>;
};

Expand All @@ -56,7 +56,7 @@
content: string | null | undefined,
): ParsedCrossRepoEvaluationManifest;

export function scanPositiveGittensoryAssumptions(text: string): Array<{ id: string; line: string }>;
export function scanPositiveLoopoverAssumptions(text: string): Array<{ id: string; line: string }>;

export function evaluateRepoReadiness(
entry: CrossRepoEvaluationManifestRepo,
Expand Down
22 changes: 11 additions & 11 deletions packages/loopover-miner/lib/cross-repo-evaluation.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
// Cross-repo evaluation harness (#4788): a repeatable, offline-first readiness check that asks whether the miner

Check warning on line 1 in packages/loopover-miner/lib/cross-repo-evaluation.js

View check run for this annotation

Loopover ORB / LoopOver Context

Missing test evidence

Code changed without an obvious test file in this PR. Add focused tests or explain why existing coverage is sufficient.

Check warning on line 1 in packages/loopover-miner/lib/cross-repo-evaluation.js

View check run for this annotation

Loopover ORB / LoopOver Context

Possible duplicate overlap

Titles/paths share 6 meaningful terms.
// can approach a diverse benchmark repo set without gittensory-specific target-repo configuration. Each repo is
// can approach a diverse benchmark repo set without loopover-specific target-repo configuration. Each repo is
// evaluated through the same stack-detection + coding-task-spec path a real attempt uses (detectRepoStack,
// resolveMinerGoalSpec, buildCodingTaskSpec) and failures are categorized as stack-detection gaps, execution
// readiness gaps, leaked gittensory assumptions in agent instructions, clone/setup problems, or other.
// readiness gaps, leaked loopover assumptions in agent instructions, clone/setup problems, or other.

import { existsSync } from "node:fs";
import { join } from "node:path";
Expand All @@ -15,12 +15,12 @@
export const CROSS_REPO_FAILURE_CATEGORY = Object.freeze({
STACK_DETECTION: "stack_detection_gap",
EXECUTION: "execution_gap",
GITTENSOR_ASSUMPTION: "gittensory_assumption",
GITTENSOR_ASSUMPTION: "loopover_assumption",
CLONE_SETUP: "clone_setup",
OTHER: "other",
});

/** Instruction substrings that indicate a POSITIVE gittensory/LoopOver CI assumption leaked into the agent prompt.
/** Instruction substrings that indicate a POSITIVE loopover/LoopOver CI assumption leaked into the agent prompt.
* Lines that explicitly tell the agent *not* to assume these are filtered out before scanning. */
export const GITTENSOR_POSITIVE_ASSUMPTION_CHECKS = Object.freeze([
{ id: "test_ci_script", pattern: /npm run test:ci/i },
Expand Down Expand Up @@ -152,13 +152,13 @@
}

/**
* Scan agent instructions for positive gittensory/LoopOver assumptions (#4788). Lines that already tell the agent
* Scan agent instructions for positive loopover/LoopOver assumptions (#4788). Lines that already tell the agent
* *not* to assume LoopOver conventions (the negative guidance from buildValidationGuidance) are skipped.
*
* @param {string} text
* @returns {Array<{ id: string, line: string }>}
*/
export function scanPositiveGittensoryAssumptions(text) {
export function scanPositiveLoopoverAssumptions(text) {
if (typeof text !== "string") return [];
const findings = [];
for (const line of text.split("\n")) {
Expand Down Expand Up @@ -301,12 +301,12 @@
);
}

const assumptionFindings = scanPositiveGittensoryAssumptions(specResult.instructions ?? "");
const assumptionFindings = scanPositiveLoopoverAssumptions(specResult.instructions ?? "");
if (assumptionFindings.length > 0) {
return buildFailure(
repoFullName,
CROSS_REPO_FAILURE_CATEGORY.GITTENSOR_ASSUMPTION,
`Agent instructions leak gittensory-specific assumptions (${assumptionFindings.map((f) => f.id).join(", ")}).`,
`Agent instructions leak loopover-specific assumptions (${assumptionFindings.map((f) => f.id).join(", ")}).`,
{ stackDetected: true, usedDefaultGoalSpec, stack, assumptionFindings },
);
}
Expand Down Expand Up @@ -352,13 +352,13 @@
}
const total = passed + failed;
const majorityPassed = total > 0 ? passed > failed : false;
const withoutGittensoryConfig = list.filter((r) => r?.usedDefaultGoalSpec !== false).length;
const withoutLoopoverConfig = list.filter((r) => r?.usedDefaultGoalSpec !== false).length;
return {
total,
passed,
failed,
majorityPassed,
withoutGittensoryConfig,
withoutLoopoverConfig,
failuresByCategory,
};
}
Expand All @@ -384,7 +384,7 @@
(summary.majorityPassed ? " (majority passed)" : " (majority failed)"),
);
if (summary.total > 0) {
lines.push(`without gittensory-specific target config: ${summary.withoutGittensoryConfig}/${summary.total}`);
lines.push(`without loopover-specific target config: ${summary.withoutLoopoverConfig}/${summary.total}`);
}
const categories = Object.entries(summary.failuresByCategory).sort(([a], [b]) => a.localeCompare(b));
if (categories.length > 0) {
Expand Down
6 changes: 3 additions & 3 deletions packages/loopover-miner/lib/discover-cli.js
Original file line number Diff line number Diff line change
Expand Up @@ -121,11 +121,11 @@
`enqueued: ${result.enqueueSummary.enqueued}`,
renderRateLimitLine(result),
];
if (result.enqueueSummary.skippedBelowMinRank > 0) {

Check warning on line 124 in packages/loopover-miner/lib/discover-cli.js

View check run for this annotation

Loopover ORB / LoopOver Context

Missing test evidence

Code changed without an obvious test file in this PR. Add focused tests or explain why existing coverage is sufficient.

Check warning on line 124 in packages/loopover-miner/lib/discover-cli.js

View check run for this annotation

Loopover ORB / LoopOver Context

Possible duplicate overlap

Titles/paths share 6 meaningful terms.
lines.push(`skipped (below min rank): ${result.enqueueSummary.skippedBelowMinRank}`);
}
// Make the fall-back to gittensory's built-in rubric explicit instead of silent (#4784): when no per-tenant goal
// spec is supplied, lane fit reflects gittensory's defaults, not the target repo's own conventions.
// Make the fall-back to loopover's built-in rubric explicit instead of silent (#4784): when no per-tenant goal
// spec is supplied, lane fit reflects loopover's defaults, not the target repo's own conventions.
if (result.usedDefaultGoalSpec) {
lines.push(
"note: ranked with the built-in default goal spec (no per-tenant .loopover-miner.yml supplied)",
Expand Down Expand Up @@ -266,7 +266,7 @@
: await fetchTargets(parsed.targets, githubToken, fanOutOptions);

// Pass any caller-supplied per-tenant goal specs through to the ranker so lane fit uses the tenant's
// conventions instead of silently falling back to gittensory's defaults (#4784); the fallback is surfaced via
// conventions instead of silently falling back to loopover's defaults (#4784); the fallback is surfaced via
// `usedDefaultGoalSpec` below rather than hidden.
const rankedSummary = rankIssues(fanOut.issues, {
nowMs: options.nowMs,
Expand Down
2 changes: 1 addition & 1 deletion packages/loopover-miner/lib/env-file-indirection.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@
// server-startup resolver. Deliberately diverges from that analogue in one way: an unreadable/missing
// `<NAME>_FILE` here THROWS rather than logging and continuing, so a broken secret mount fails a miner
// container fast and loud (never silently proceeds with an unset/empty credential the next real GitHub call
// would then fail on anyway, with a far less specific error).

Check warning on line 7 in packages/loopover-miner/lib/env-file-indirection.js

View check run for this annotation

Loopover ORB / LoopOver Context

Missing test evidence

Code changed without an obvious test file in this PR. Add focused tests or explain why existing coverage is sufficient.

Check warning on line 7 in packages/loopover-miner/lib/env-file-indirection.js

View check run for this annotation

Loopover ORB / LoopOver Context

Possible duplicate overlap

Titles/paths share 6 meaningful terms.
import { readFileSync } from "node:fs";

// Docker Compose's OWN reserved `_FILE`-suffixed environment variables -- never gittensory's secret-file
// Docker Compose's OWN reserved `_FILE`-suffixed environment variables -- never loopover's secret-file
// convention, so they must never be dereferenced below (mirrors src/selfhost/load-file-secrets.ts's own
// exclusion and rationale: `COMPOSE_FILE` is a colon-delimited list of compose file paths, never a single
// readable file itself, and `COMPOSE_ENV_FILE` points at an operator's own .env file, not a secret).
Expand Down
2 changes: 1 addition & 1 deletion packages/loopover-miner/lib/execute-local-write.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@
// createRealCliSubprocessSpawn pattern (real child_process, resolve-not-reject on error/timeout so a
// killed/errored process's partial output -- e.g. an auth failure line on stderr -- is never lost to an
// unhandled rejection) but for LocalWriteActionSpec.command: a single shell-safe string (built with
// packages/loopover-engine/src/miner/local-write-tools.ts's own single-quote escaping), not the

Check warning on line 5 in packages/loopover-miner/lib/execute-local-write.js

View check run for this annotation

Loopover ORB / LoopOver Context

Missing test evidence

Code changed without an obvious test file in this PR. Add focused tests or explain why existing coverage is sufficient.

Check warning on line 5 in packages/loopover-miner/lib/execute-local-write.js

View check run for this annotation

Loopover ORB / LoopOver Context

Possible duplicate overlap

Titles/paths share 6 meaningful terms.
// cmd/args-array CliSubprocessSpawnFn contract the coding-agent driver itself uses. Runs it via `sh -c` in
// the given working directory. Per local-write-tools.ts's own boundary comment, this always runs with
// whatever `gh`/`git` credentials are already configured in that environment -- gittensory never performs
// whatever `gh`/`git` credentials are already configured in that environment -- loopover never performs
// the write itself.

import { spawn } from "node:child_process";
Expand Down
4 changes: 2 additions & 2 deletions packages/loopover-miner/lib/forge-config.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
/** Per-tenant forge configuration (#4784): the GitHub-specific protocol details that discovery used to hardcode,

Check warning on line 1 in packages/loopover-miner/lib/forge-config.js

View check run for this annotation

Loopover ORB / LoopOver Context

Missing test evidence

Code changed without an obvious test file in this PR. Add focused tests or explain why existing coverage is sufficient.

Check warning on line 1 in packages/loopover-miner/lib/forge-config.js

View check run for this annotation

Loopover ORB / LoopOver Context

Possible duplicate overlap

Titles/paths share 6 meaningful terms.
* gathered behind one resolver so a non-github.com tenant (GitHub Enterprise, or another GitHub-compatible forge)
* can override them. gittensory's own github.com conventions survive only as `DEFAULT_FORGE_CONFIG` — calling
* can override them. loopover's own github.com conventions survive only as `DEFAULT_FORGE_CONFIG` — calling
* `resolveForgeConfig()` with no overrides is byte-identical to the pre-#4784 hardcoded fan-out behavior, which is
* what keeps the existing gittensory discovery path unchanged. Executes the #4780 repo-agnostic-capability-audit
* what keeps the existing loopover discovery path unchanged. Executes the #4780 repo-agnostic-capability-audit
* checklist (forge abstraction, configurable credential env var, configurable user-agent). */

/** The github.com defaults every forge field falls back to. Frozen so a caller can't mutate the shared baseline. */
Expand Down
4 changes: 2 additions & 2 deletions packages/loopover-miner/lib/init-wizard.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@
import { join } from "node:path";
import { CODING_AGENT_DRIVER_CONFIG_ENV, CODING_AGENT_DRIVER_NAMES } from "@loopover/engine";
import { initLaptopState } from "./laptop-init.js";
import { resolveMinerStateDir, runDoctor } from "./status.js";

Check warning on line 6 in packages/loopover-miner/lib/init-wizard.js

View check run for this annotation

Loopover ORB / LoopOver Context

Missing test evidence

Code changed without an obvious test file in this PR. Add focused tests or explain why existing coverage is sufficient.

Check warning on line 6 in packages/loopover-miner/lib/init-wizard.js

View check run for this annotation

Loopover ORB / LoopOver Context

Possible duplicate overlap

Titles/paths share 6 meaningful terms.
import { DeviceFlowError, resolveAmsOauthClientId, runDeviceFlowAuthorization } from "./oauth-device-flow.js";

// First-run onboarding wizard for `gittensory-miner init --interactive` (#5176): prompts for a GITHUB_TOKEN
// First-run onboarding wizard for `loopover-miner init --interactive` (#5176): prompts for a GITHUB_TOKEN
// (masked, never echoed to stdout/logs) and an optional coding-agent provider + its companion vars, writes them
// to a starter .env in the state dir, then reruns the existing offline `doctor` checks against the collected
// values so the operator sees pass/fail immediately. `doctor` itself stays offline by contract (status.js), and
Expand Down Expand Up @@ -42,7 +42,7 @@
}

async function promptAuthMethod(io) {
io.writeLine("How would you like to authorize gittensory-miner?");
io.writeLine("How would you like to authorize loopover-miner?");
io.writeLine(" 1) Authorize with GitHub (recommended -- no token to copy)");
io.writeLine(" 2) Paste a GitHub token (personal access token)");
for (;;) {
Expand Down
Loading