@sideboard-ai/core 0.1.9 → 0.1.15
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/{agents-OAX7XPKX.js → agents-RO3AJ76Q.js} +1 -1
- package/dist/{chunk-2M4OHXYX.js → chunk-3OJG4LP4.js} +2 -2
- package/dist/{chunk-LL7DTZ5B.js → chunk-L44AX7IG.js} +113 -24
- package/dist/{chunk-E4PWXO2C.js → chunk-MAWKQA2Y.js} +52 -23
- package/dist/{chunk-WMCPLDW3.js → chunk-MEI4AXV4.js} +1 -1
- package/dist/{chunk-TLJH3L2C.js → chunk-MGSJQMJA.js} +40 -4
- package/dist/{chunk-2R5VV4BA.js → chunk-TNIAXABV.js} +1 -1
- package/dist/{coordinator-prompt-6R2TX4WQ.js → coordinator-prompt-G6T7ORT3.js} +2 -2
- package/dist/{global-workspace-R44HGBU6.js → global-workspace-H642B5OI.js} +3 -3
- package/dist/index.cjs +205 -38
- package/dist/index.d.cts +70 -3
- package/dist/index.d.ts +70 -3
- package/dist/index.js +18 -6
- package/dist/mcp/run-stdio.cjs +185 -38
- package/dist/mcp/run-stdio.js +6 -6
- package/dist/{workspaces-TCJFYI35.js → workspaces-4EREGLB7.js} +4 -4
- package/dist/{worktree-NGFDN3J4.js → worktree-ZDHZMLSJ.js} +3 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -193,8 +193,20 @@ interface PrDetails {
|
|
|
193
193
|
commits: PrCommitInfo[];
|
|
194
194
|
comments: PrCommentInfo[];
|
|
195
195
|
reviews: PrReviewInfo[];
|
|
196
|
+
/** Prefer `getPrChecks` — kept for callers; often empty to avoid nested GraphQL. */
|
|
196
197
|
checks: PrCheckRun[];
|
|
197
198
|
}
|
|
199
|
+
/** Lightweight PR fields for the sidebar pill (cheap GraphQL). */
|
|
200
|
+
interface PrMeta {
|
|
201
|
+
number: number;
|
|
202
|
+
title: string;
|
|
203
|
+
url: string;
|
|
204
|
+
state: string;
|
|
205
|
+
isDraft: boolean;
|
|
206
|
+
reviewDecision: string | null;
|
|
207
|
+
baseRefName: string;
|
|
208
|
+
headRefName: string;
|
|
209
|
+
}
|
|
198
210
|
interface IssueInfo {
|
|
199
211
|
id: string;
|
|
200
212
|
identifier: string;
|
|
@@ -668,6 +680,29 @@ declare function gh(args: string[], cwd: string, opts?: {
|
|
|
668
680
|
exitCode: number;
|
|
669
681
|
}>;
|
|
670
682
|
|
|
683
|
+
/** Detect GitHub API / GraphQL rate-limit failures in gh CLI output. */
|
|
684
|
+
declare function isGhRateLimitError(text: string): boolean;
|
|
685
|
+
/** Relative wait hint from a Unix epoch reset timestamp (seconds). */
|
|
686
|
+
declare function formatRateLimitResetHint(resetEpochSec: number, nowMs?: number): string;
|
|
687
|
+
/**
|
|
688
|
+
* Prefer the trailing GraphQL/HTTP detail over the full `gh` command line
|
|
689
|
+
* (which can include a huge --body payload).
|
|
690
|
+
*/
|
|
691
|
+
declare function extractGhErrorDetail(text: string): string;
|
|
692
|
+
type FormatGhLandErrorOptions = {
|
|
693
|
+
/** Unix epoch seconds when the GraphQL/core quota resets. */
|
|
694
|
+
resetAt?: number;
|
|
695
|
+
/** Land push already succeeded before PR create failed. Default true for PR-create path. */
|
|
696
|
+
pushed?: boolean;
|
|
697
|
+
nowMs?: number;
|
|
698
|
+
};
|
|
699
|
+
/**
|
|
700
|
+
* Turn noisy `gh pr create` / Execa failures into a short notice for UI/CLI.
|
|
701
|
+
*/
|
|
702
|
+
declare function formatGhLandError(raw: string, opts?: FormatGhLandErrorOptions): string;
|
|
703
|
+
/** Strip Electron's IPC invoke wrapper, then humanize known gh failures. */
|
|
704
|
+
declare function formatIpcInvokeError(err: unknown): string;
|
|
705
|
+
|
|
671
706
|
/**
|
|
672
707
|
* Memorable worktree / thread labels (Conductor-style nicknames).
|
|
673
708
|
* Slug is the directory + `thread/<slug>` branch; `name` is the UI title.
|
|
@@ -768,7 +803,9 @@ declare function detectLocalMergeConflicts(cwd: string, baseRefName: string | nu
|
|
|
768
803
|
* Returns `null` when no PR exists for the selector (so UI can show “link a PR”
|
|
769
804
|
* instead of “no checks yet”). Returns `[]` when a PR exists but has no checks. */
|
|
770
805
|
declare function getPrChecks(cwd: string, selector: string): Promise<PrCheckRun[] | null>;
|
|
771
|
-
/** PR
|
|
806
|
+
/** Lightweight PR fields for the sidebar pill — avoids nested reviews/checks GraphQL. */
|
|
807
|
+
declare function getPrMeta(cwd: string, selector: string): Promise<PrMeta | null>;
|
|
808
|
+
/** PR description / reviews for the Review tab (no nested CI — use getPrChecks). */
|
|
772
809
|
declare function getPrDetails(cwd: string, selector: string): Promise<PrDetails | null>;
|
|
773
810
|
declare function fetchPrHead(repoPath: string, number: number, localBranch: string): Promise<void>;
|
|
774
811
|
interface CreateWorktreeResult {
|
|
@@ -1712,6 +1749,7 @@ declare class Orchestrator {
|
|
|
1712
1749
|
/** Resolve PR selector and optionally persist `prUrl` when found. */
|
|
1713
1750
|
private withPrSelector;
|
|
1714
1751
|
getPrChecks(threadRef: string): Promise<PrCheckRun[] | null>;
|
|
1752
|
+
getPrMeta(threadRef: string): Promise<PrMeta | null>;
|
|
1715
1753
|
getPrDetails(threadRef: string): Promise<PrDetails | null>;
|
|
1716
1754
|
setAutonomy(threadRef: string, autonomy: Autonomy): Thread;
|
|
1717
1755
|
setThreadOptions(threadRef: string, patch: ThreadOptionsPatch): Thread;
|
|
@@ -1967,7 +2005,9 @@ interface IpcApi {
|
|
|
1967
2005
|
initializeGit(threadRef: string): Promise<void>;
|
|
1968
2006
|
/** CI checks for the thread's linked PR (`gh pr checks`). `null` = no PR. */
|
|
1969
2007
|
getPrChecks(threadRef: string): Promise<PrCheckRun[] | null>;
|
|
1970
|
-
/** PR
|
|
2008
|
+
/** Lightweight PR fields for the sidebar pill (cheap GraphQL). */
|
|
2009
|
+
getPrMeta(threadRef: string): Promise<PrMeta | null>;
|
|
2010
|
+
/** PR description / reviews for the Review tab. */
|
|
1971
2011
|
getPrDetails(threadRef: string): Promise<PrDetails | null>;
|
|
1972
2012
|
listFiles(threadRef: string): Promise<string[]>;
|
|
1973
2013
|
readFile(threadRef: string, relativePath: string): Promise<{
|
|
@@ -2112,6 +2152,33 @@ interface IpcApi {
|
|
|
2112
2152
|
exitCode: number | null;
|
|
2113
2153
|
}>;
|
|
2114
2154
|
openExternal(url: string): Promise<void>;
|
|
2155
|
+
/**
|
|
2156
|
+
* In-app URL preview via BrowserView (top-level navigation — works for
|
|
2157
|
+
* sites that block iframes, e.g. GitHub).
|
|
2158
|
+
*/
|
|
2159
|
+
urlPreview: {
|
|
2160
|
+
show(opts: {
|
|
2161
|
+
url: string;
|
|
2162
|
+
bounds: {
|
|
2163
|
+
x: number;
|
|
2164
|
+
y: number;
|
|
2165
|
+
width: number;
|
|
2166
|
+
height: number;
|
|
2167
|
+
};
|
|
2168
|
+
}): Promise<void>;
|
|
2169
|
+
setBounds(bounds: {
|
|
2170
|
+
x: number;
|
|
2171
|
+
y: number;
|
|
2172
|
+
width: number;
|
|
2173
|
+
height: number;
|
|
2174
|
+
}): Promise<void>;
|
|
2175
|
+
navigate(url: string): Promise<void>;
|
|
2176
|
+
reload(): Promise<void>;
|
|
2177
|
+
hide(): Promise<void>;
|
|
2178
|
+
onNavigated(listener: (payload: {
|
|
2179
|
+
url: string;
|
|
2180
|
+
}) => void): () => void;
|
|
2181
|
+
};
|
|
2115
2182
|
/** Main-process tsserver for real import/type diagnostics in the file UI. */
|
|
2116
2183
|
tsserver: {
|
|
2117
2184
|
start(worktreePath?: string): Promise<{
|
|
@@ -2281,4 +2348,4 @@ declare function writeInjectedMcpConfig(opts: {
|
|
|
2281
2348
|
includeBrightsy?: boolean;
|
|
2282
2349
|
}): Promise<string | null>;
|
|
2283
2350
|
|
|
2284
|
-
export { type ActiveRun, type AdoptInput, type AdvancedAppSettings, type AgentAdapter, type AgentEvent, type AgentInstructionFile, type AgentKind, type AgentStatus, type AgentTurnInput, type AnthropicCacheControl, type AppSettings, type ApplyIntoMainResult, type AttachCommand, type Autonomy, BRIGHTSY_MCP_ALLOWED_TOOLS, type BranchInfo, type BrightsyAccount, type BrightsyChatTarget, type BrightsyChatTargets, type BrightsyCloudConnectAgent, type BrightsyHarnessSettings, type BrightsySession, BrightsySideboardApi, type BrightsyTeamTargets, CLOUD_COORDINATOR_BUSY_REPLY, CLOUD_COORDINATOR_STOPPED_REPLY, CLOUD_COORDINATOR_TIMEOUT_REPLY, CLOUD_ORCHESTRATOR_GOAL, CONTEXT_COMPACT_CHARS, CONTEXT_KEEP_RECENT_CHARS, CONTEXT_KEEP_RECENT_MESSAGES, CONTEXT_MIN_MESSAGES, COORDINATOR_TOOL_PLAYBOOK, type ClaudeHarnessSettings, type CleanupOrphansResult, type CloudConnectAgent, type CloudConnectOptions, type CloudConnectStatus, type CompactResult, type CompactThresholds, type ConductorSettings, type ConductorWorkspace, type ConnectedBrightsyTeamInfo, type CreateChatTabInput, type CreateGlobalChatOpts, type CreateThreadInput, type CreateWorktreeResult, type CursorSdkStreamMessage, type CursorTurnRequest, type CursorWorktreesConfig, type DevServerHandle, type DiffCommit, type DiffFile, type DiffResult, type DiffScope, type DiffScopeStat, type ExpandResult, FAMOUS_SOCCER_TEAMS, type ForkChatTabInput, type ForkThreadWorktreeInput, GLOBAL_WORKSPACE_ID, type GetDiffOptions, type GitHubStatus, type GitWorktreeStatus, HARNESS_ENV_KEYS, type HarnessId, type IntegrationsSettings, type IpcApi, type IssueInfo, type IssueSource, type LandPreview, type LandResult, type ListIssuesResult, MAX_ANTHROPIC_CACHE_CONTROL_BLOCKS, type McpServerStatus, type MessagePart, Orchestrator, type OrchestratorEvent, type OrchestratorRuntime, type OrphanWorktree, PLAN_MODE_INSTRUCTION, type PrActor, type PrCheckRun, type PrCommentInfo, type PrCommitInfo, type PrDetails, type PrInfo, type PrReviewInfo, type RepoSettings, type RepoSetupInfo, type RunMode, type RunScript, SIDEBOARD_FORCE_STOP, SIDEBOARD_MCP_ALLOWED_TOOLS, type ScriptHandle, type SkillInfo, type SourceType, type SpawnTurnHandle, type SummarizeResult, type TeamName, type Thread, type ThreadAttachment, type ThreadMessage, type ThreadOptionsPatch, type ThreadStatus, type TokenUsage, type TranscriptToolDetail, type TurnCommand, type Workspace, type WorkspaceInventoryEntry, type WorkspaceScriptEnvOpts, addWorkspace, adoptThread, allAdapters, allocatePort, allocatePortRange, allocateTeamName, allocateTeamSlug, appDataDir, appSettingsPath, appendMessage, applyAgentEvent, applyAppEnvironment, applyCompaction, applyThreadIntoMain, autoCleanupOrphansEnabled, autoRenameBranchEnabled, autoRunAfterSetupEnabled, branchDisplayLabel, brightsyAdapter, brightsyCloudConnectAgent, brightsyCloudConnectEnabled, brightsyConfigPath, brightsyMcpAllowedTools, brightsyMcpServerName, buildCachedUserContent, buildClaudeStreamJsonUserMessage, buildForkTranscriptAttachment, buildSessionSeed, buildWorkspaceScriptEnv, caffeinateWhileCloudConnectEnabled, caffeinateWhileRunningEnabled, captureLoginEnv, captureTurnBaseline, childEnvWithAppSettings, claudeAdapter, claudeChromeEnabled, claudeUserSettingsPath, cleanupOrphanWorktrees, cloneRepoIntoSideboard, codexAdapter, collectTakenTeamSlugs, commitAll, conductorDbPath, confirmLand, connectBrightsyTeam, coordinatorSystemPrompt, coordinatorTurnReminder, copyConfiguredFiles, countCacheControlBlocks, createChatTab, createEmptyThread, createGlobalChat, createOrUpdatePr, createThread, createThreadWorktree, currentBranch, cursorAdapter, cursorSdkMessageToEvents, decodeBrightsyTarget, deleteBranchOnPurgeEnabled, deleteThreadRecord, detectAgents, detectLocalMergeConflicts, disconnectBrightsyTeam, discoverSkills, encodeBrightsyTarget, enrichWorkspacesWithGithub, ensureAgentPath, ensureCloudCoordinator, ensureGlobalCoordinatorCwd, ensureWorkspace, estimateMessageChars, estimateThreadChars, expandComposerPrompt, extractiveSummary, fetchPrHead, finalizeParts, findInvalidCacheControlTtlOrder, findOrphanWorktrees, findThreadByRef, flattenTurnInput, forkChatTab, forkMessageSlice, forkThreadWorktree, formatAgentInstructions, formatBrightsyFetchError, formatMessagesAsTranscript, formatRenameBranchDirective, formatTranscriptMarkdown, formatWorkspaceInventory, formatWorktreeDirective, getAdapter, getBrightsySession, getDefaultRunScript, getDiff, getDiffSummary, getGitHubStatus, getIssueSource, getLinearApiKey, getOrchestrator, getPr, getPrChecks, getPrDetails, getRepoSetupInfo, getRunMode, getRunScript, gh, git, globalAgentCwd, harnessEnvKey, hasConductorHook, hasCursorWorktreeSetup, hasRepoHook, hasWorkspaceHook, healOrchestrationSoccerTitles, importConductorWorkspace, importConductorWorkspaceAsync, initializeGitRepository, inspectGitWorktree, isBrightsyConnected, isBrightsyNdjsonLine, isCloudCoordinatorThread, isDirty, isGlobalRepoPath, isGlobalThread, isLinearConnected, isOrchestratorThread, isPlaceholderBranch, listBranchCommits, listBranches, listBrightsyAccounts, listBrightsyChatTargets, listConductorWorkspaces, listConnectedBrightsyTeams, listGitHubIssues, listGlobalThreads, listIssues, listLinearIssues, listLinearIssuesDirect, listPrs, listRunScripts, listThreads, listWorkspaces, listWorktreeFiles, listWorktrees, loadAgentInstructions, loadAppSettings, loadBrightsyConfig, loadConductorSettings, loadRepoSettings, loadWorkspaceSettings, locksDir, maxConcurrentAgents, maybeCompactContext, mcpAllowTools, mcpAuthWarnings, mergePr, mergeUsage, normalizeParseResult, normalizeThread, normalizeTurnInput, normalizeWorktreePath, opencodeAdapter, orchestrationTitleNeedsSoccerNickname, orchestratorSessionPoisonedByBuiltins, parseCursorRunnerLine, parseForceStopMessage, parseGithubSlugFromRemoteUrl, parseMcpList, partsToAssistantText, permissionMode, previewLand, pushBranch, readSkillBody, readThread, readWorktreeFile, readWorktreeInclude, refreshGitHubAuth, removeWorkspace, removeWorktree, repoSlug, requireAgent, resolveClaudeExecutable, resolveConductorCursorAgentId, resolveDefaultBranch, resolveDiffBaseRef, resolveEffectiveIssueSource, resolveFilesToCopy, resolveGithubRepoSlug, resolvePrSelector, resolveRepoRoot, resolveWorktreeStartPoint, run, runArchiveScript, runCloudConnect, runCursorWorktreeSetup, runSetupScript, sameWorktreePath, sanitizeMcpServerName, saveAppSettings, setStatus, settingsSourceLabel, shouldCompactContext, shouldRunWorktreeCleanup, sideboardHomeDir, sideboardReposDir, sideboardWorkspacesDir, slugify, spawnAgentTurn, splitForCompaction, startDevServer, startMcpServer, startOrchestration, stripBrightsyNdjsonNoise, suggestSlug, summarizeConversation, switchBrightsyAccount, syncWorkspacesFromThreads, takenTeamSlugsForChatTab, takenTeamSlugsForOrchestration, taskMessageText, threadDisplayLabel, threadFilePath, threadLockPath, threadsDir, threadsSharingWorktree, toolDescription, toolDetail, toolFilePath, totalTokens, updateAdvancedSettings, updateAppEnvironment, updateBrightsySettings, updateClaudeSettings, updateIntegrationsSettings, updateThread, validateLinearApiKey, withAgentInstructions, withThreadLock, workspaceSettingsSourceLabel, worktreeCleanupSettings, worktreeDisplayLabel, worktreeDisplayLabelForGroup, worktreeNameFromPath, worktreesRoot, writeInjectedMcpConfig, writeThread, writeWorktreeFile };
|
|
2351
|
+
export { type ActiveRun, type AdoptInput, type AdvancedAppSettings, type AgentAdapter, type AgentEvent, type AgentInstructionFile, type AgentKind, type AgentStatus, type AgentTurnInput, type AnthropicCacheControl, type AppSettings, type ApplyIntoMainResult, type AttachCommand, type Autonomy, BRIGHTSY_MCP_ALLOWED_TOOLS, type BranchInfo, type BrightsyAccount, type BrightsyChatTarget, type BrightsyChatTargets, type BrightsyCloudConnectAgent, type BrightsyHarnessSettings, type BrightsySession, BrightsySideboardApi, type BrightsyTeamTargets, CLOUD_COORDINATOR_BUSY_REPLY, CLOUD_COORDINATOR_STOPPED_REPLY, CLOUD_COORDINATOR_TIMEOUT_REPLY, CLOUD_ORCHESTRATOR_GOAL, CONTEXT_COMPACT_CHARS, CONTEXT_KEEP_RECENT_CHARS, CONTEXT_KEEP_RECENT_MESSAGES, CONTEXT_MIN_MESSAGES, COORDINATOR_TOOL_PLAYBOOK, type ClaudeHarnessSettings, type CleanupOrphansResult, type CloudConnectAgent, type CloudConnectOptions, type CloudConnectStatus, type CompactResult, type CompactThresholds, type ConductorSettings, type ConductorWorkspace, type ConnectedBrightsyTeamInfo, type CreateChatTabInput, type CreateGlobalChatOpts, type CreateThreadInput, type CreateWorktreeResult, type CursorSdkStreamMessage, type CursorTurnRequest, type CursorWorktreesConfig, type DevServerHandle, type DiffCommit, type DiffFile, type DiffResult, type DiffScope, type DiffScopeStat, type ExpandResult, FAMOUS_SOCCER_TEAMS, type ForkChatTabInput, type ForkThreadWorktreeInput, type FormatGhLandErrorOptions, GLOBAL_WORKSPACE_ID, type GetDiffOptions, type GitHubStatus, type GitWorktreeStatus, HARNESS_ENV_KEYS, type HarnessId, type IntegrationsSettings, type IpcApi, type IssueInfo, type IssueSource, type LandPreview, type LandResult, type ListIssuesResult, MAX_ANTHROPIC_CACHE_CONTROL_BLOCKS, type McpServerStatus, type MessagePart, Orchestrator, type OrchestratorEvent, type OrchestratorRuntime, type OrphanWorktree, PLAN_MODE_INSTRUCTION, type PrActor, type PrCheckRun, type PrCommentInfo, type PrCommitInfo, type PrDetails, type PrInfo, type PrMeta, type PrReviewInfo, type RepoSettings, type RepoSetupInfo, type RunMode, type RunScript, SIDEBOARD_FORCE_STOP, SIDEBOARD_MCP_ALLOWED_TOOLS, type ScriptHandle, type SkillInfo, type SourceType, type SpawnTurnHandle, type SummarizeResult, type TeamName, type Thread, type ThreadAttachment, type ThreadMessage, type ThreadOptionsPatch, type ThreadStatus, type TokenUsage, type TranscriptToolDetail, type TurnCommand, type Workspace, type WorkspaceInventoryEntry, type WorkspaceScriptEnvOpts, addWorkspace, adoptThread, allAdapters, allocatePort, allocatePortRange, allocateTeamName, allocateTeamSlug, appDataDir, appSettingsPath, appendMessage, applyAgentEvent, applyAppEnvironment, applyCompaction, applyThreadIntoMain, autoCleanupOrphansEnabled, autoRenameBranchEnabled, autoRunAfterSetupEnabled, branchDisplayLabel, brightsyAdapter, brightsyCloudConnectAgent, brightsyCloudConnectEnabled, brightsyConfigPath, brightsyMcpAllowedTools, brightsyMcpServerName, buildCachedUserContent, buildClaudeStreamJsonUserMessage, buildForkTranscriptAttachment, buildSessionSeed, buildWorkspaceScriptEnv, caffeinateWhileCloudConnectEnabled, caffeinateWhileRunningEnabled, captureLoginEnv, captureTurnBaseline, childEnvWithAppSettings, claudeAdapter, claudeChromeEnabled, claudeUserSettingsPath, cleanupOrphanWorktrees, cloneRepoIntoSideboard, codexAdapter, collectTakenTeamSlugs, commitAll, conductorDbPath, confirmLand, connectBrightsyTeam, coordinatorSystemPrompt, coordinatorTurnReminder, copyConfiguredFiles, countCacheControlBlocks, createChatTab, createEmptyThread, createGlobalChat, createOrUpdatePr, createThread, createThreadWorktree, currentBranch, cursorAdapter, cursorSdkMessageToEvents, decodeBrightsyTarget, deleteBranchOnPurgeEnabled, deleteThreadRecord, detectAgents, detectLocalMergeConflicts, disconnectBrightsyTeam, discoverSkills, encodeBrightsyTarget, enrichWorkspacesWithGithub, ensureAgentPath, ensureCloudCoordinator, ensureGlobalCoordinatorCwd, ensureWorkspace, estimateMessageChars, estimateThreadChars, expandComposerPrompt, extractGhErrorDetail, extractiveSummary, fetchPrHead, finalizeParts, findInvalidCacheControlTtlOrder, findOrphanWorktrees, findThreadByRef, flattenTurnInput, forkChatTab, forkMessageSlice, forkThreadWorktree, formatAgentInstructions, formatBrightsyFetchError, formatGhLandError, formatIpcInvokeError, formatMessagesAsTranscript, formatRateLimitResetHint, formatRenameBranchDirective, formatTranscriptMarkdown, formatWorkspaceInventory, formatWorktreeDirective, getAdapter, getBrightsySession, getDefaultRunScript, getDiff, getDiffSummary, getGitHubStatus, getIssueSource, getLinearApiKey, getOrchestrator, getPr, getPrChecks, getPrDetails, getPrMeta, getRepoSetupInfo, getRunMode, getRunScript, gh, git, globalAgentCwd, harnessEnvKey, hasConductorHook, hasCursorWorktreeSetup, hasRepoHook, hasWorkspaceHook, healOrchestrationSoccerTitles, importConductorWorkspace, importConductorWorkspaceAsync, initializeGitRepository, inspectGitWorktree, isBrightsyConnected, isBrightsyNdjsonLine, isCloudCoordinatorThread, isDirty, isGhRateLimitError, isGlobalRepoPath, isGlobalThread, isLinearConnected, isOrchestratorThread, isPlaceholderBranch, listBranchCommits, listBranches, listBrightsyAccounts, listBrightsyChatTargets, listConductorWorkspaces, listConnectedBrightsyTeams, listGitHubIssues, listGlobalThreads, listIssues, listLinearIssues, listLinearIssuesDirect, listPrs, listRunScripts, listThreads, listWorkspaces, listWorktreeFiles, listWorktrees, loadAgentInstructions, loadAppSettings, loadBrightsyConfig, loadConductorSettings, loadRepoSettings, loadWorkspaceSettings, locksDir, maxConcurrentAgents, maybeCompactContext, mcpAllowTools, mcpAuthWarnings, mergePr, mergeUsage, normalizeParseResult, normalizeThread, normalizeTurnInput, normalizeWorktreePath, opencodeAdapter, orchestrationTitleNeedsSoccerNickname, orchestratorSessionPoisonedByBuiltins, parseCursorRunnerLine, parseForceStopMessage, parseGithubSlugFromRemoteUrl, parseMcpList, partsToAssistantText, permissionMode, previewLand, pushBranch, readSkillBody, readThread, readWorktreeFile, readWorktreeInclude, refreshGitHubAuth, removeWorkspace, removeWorktree, repoSlug, requireAgent, resolveClaudeExecutable, resolveConductorCursorAgentId, resolveDefaultBranch, resolveDiffBaseRef, resolveEffectiveIssueSource, resolveFilesToCopy, resolveGithubRepoSlug, resolvePrSelector, resolveRepoRoot, resolveWorktreeStartPoint, run, runArchiveScript, runCloudConnect, runCursorWorktreeSetup, runSetupScript, sameWorktreePath, sanitizeMcpServerName, saveAppSettings, setStatus, settingsSourceLabel, shouldCompactContext, shouldRunWorktreeCleanup, sideboardHomeDir, sideboardReposDir, sideboardWorkspacesDir, slugify, spawnAgentTurn, splitForCompaction, startDevServer, startMcpServer, startOrchestration, stripBrightsyNdjsonNoise, suggestSlug, summarizeConversation, switchBrightsyAccount, syncWorkspacesFromThreads, takenTeamSlugsForChatTab, takenTeamSlugsForOrchestration, taskMessageText, threadDisplayLabel, threadFilePath, threadLockPath, threadsDir, threadsSharingWorktree, toolDescription, toolDetail, toolFilePath, totalTokens, updateAdvancedSettings, updateAppEnvironment, updateBrightsySettings, updateClaudeSettings, updateIntegrationsSettings, updateThread, validateLinearApiKey, withAgentInstructions, withThreadLock, workspaceSettingsSourceLabel, worktreeCleanupSettings, worktreeDisplayLabel, worktreeDisplayLabelForGroup, worktreeNameFromPath, worktreesRoot, writeInjectedMcpConfig, writeThread, writeWorktreeFile };
|
package/dist/index.js
CHANGED
|
@@ -93,14 +93,14 @@ import {
|
|
|
93
93
|
withAgentInstructions,
|
|
94
94
|
worktreeCleanupSettings,
|
|
95
95
|
writeWorktreeFile
|
|
96
|
-
} from "./chunk-
|
|
96
|
+
} from "./chunk-MAWKQA2Y.js";
|
|
97
97
|
import {
|
|
98
98
|
addWorkspace,
|
|
99
99
|
ensureWorkspace,
|
|
100
100
|
listWorkspaces,
|
|
101
101
|
removeWorkspace,
|
|
102
102
|
syncWorkspacesFromThreads
|
|
103
|
-
} from "./chunk-
|
|
103
|
+
} from "./chunk-MGSJQMJA.js";
|
|
104
104
|
import {
|
|
105
105
|
CLOUD_COORDINATOR_BUSY_REPLY,
|
|
106
106
|
CLOUD_COORDINATOR_STOPPED_REPLY,
|
|
@@ -120,7 +120,7 @@ import {
|
|
|
120
120
|
orchestratorSessionPoisonedByBuiltins,
|
|
121
121
|
parseForceStopMessage,
|
|
122
122
|
takenTeamSlugsForOrchestration
|
|
123
|
-
} from "./chunk-
|
|
123
|
+
} from "./chunk-3OJG4LP4.js";
|
|
124
124
|
import {
|
|
125
125
|
COORDINATOR_TOOL_PLAYBOOK,
|
|
126
126
|
coordinatorSystemPrompt,
|
|
@@ -128,7 +128,7 @@ import {
|
|
|
128
128
|
enrichWorkspacesWithGithub,
|
|
129
129
|
ensureGlobalCoordinatorCwd,
|
|
130
130
|
formatWorkspaceInventory
|
|
131
|
-
} from "./chunk-
|
|
131
|
+
} from "./chunk-TNIAXABV.js";
|
|
132
132
|
import {
|
|
133
133
|
BRIGHTSY_MCP_ALLOWED_TOOLS,
|
|
134
134
|
MAX_ANTHROPIC_CACHE_CONTROL_BLOCKS,
|
|
@@ -158,7 +158,7 @@ import {
|
|
|
158
158
|
permissionMode,
|
|
159
159
|
sanitizeMcpServerName,
|
|
160
160
|
writeInjectedMcpConfig
|
|
161
|
-
} from "./chunk-
|
|
161
|
+
} from "./chunk-MEI4AXV4.js";
|
|
162
162
|
import {
|
|
163
163
|
brightsyConfigPath,
|
|
164
164
|
brightsyMcpServerName,
|
|
@@ -216,11 +216,17 @@ import {
|
|
|
216
216
|
createThreadWorktree,
|
|
217
217
|
currentBranch,
|
|
218
218
|
detectLocalMergeConflicts,
|
|
219
|
+
extractGhErrorDetail,
|
|
219
220
|
fetchPrHead,
|
|
221
|
+
formatGhLandError,
|
|
222
|
+
formatIpcInvokeError,
|
|
223
|
+
formatRateLimitResetHint,
|
|
220
224
|
getPr,
|
|
221
225
|
getPrChecks,
|
|
222
226
|
getPrDetails,
|
|
227
|
+
getPrMeta,
|
|
223
228
|
isDirty,
|
|
229
|
+
isGhRateLimitError,
|
|
224
230
|
isPlaceholderBranch,
|
|
225
231
|
listBranches,
|
|
226
232
|
listPrs,
|
|
@@ -242,7 +248,7 @@ import {
|
|
|
242
248
|
worktreeDisplayLabel,
|
|
243
249
|
worktreeDisplayLabelForGroup,
|
|
244
250
|
worktreeNameFromPath
|
|
245
|
-
} from "./chunk-
|
|
251
|
+
} from "./chunk-L44AX7IG.js";
|
|
246
252
|
import {
|
|
247
253
|
appendMessage,
|
|
248
254
|
createEmptyThread,
|
|
@@ -752,6 +758,7 @@ export {
|
|
|
752
758
|
estimateMessageChars,
|
|
753
759
|
estimateThreadChars,
|
|
754
760
|
expandComposerPrompt,
|
|
761
|
+
extractGhErrorDetail,
|
|
755
762
|
extractiveSummary,
|
|
756
763
|
fetchPrHead,
|
|
757
764
|
finalizeParts,
|
|
@@ -764,7 +771,10 @@ export {
|
|
|
764
771
|
forkThreadWorktree,
|
|
765
772
|
formatAgentInstructions,
|
|
766
773
|
formatBrightsyFetchError,
|
|
774
|
+
formatGhLandError,
|
|
775
|
+
formatIpcInvokeError,
|
|
767
776
|
formatMessagesAsTranscript,
|
|
777
|
+
formatRateLimitResetHint,
|
|
768
778
|
formatRenameBranchDirective,
|
|
769
779
|
formatTranscriptMarkdown,
|
|
770
780
|
formatWorkspaceInventory,
|
|
@@ -781,6 +791,7 @@ export {
|
|
|
781
791
|
getPr,
|
|
782
792
|
getPrChecks,
|
|
783
793
|
getPrDetails,
|
|
794
|
+
getPrMeta,
|
|
784
795
|
getRepoSetupInfo,
|
|
785
796
|
getRunMode,
|
|
786
797
|
getRunScript,
|
|
@@ -801,6 +812,7 @@ export {
|
|
|
801
812
|
isBrightsyNdjsonLine,
|
|
802
813
|
isCloudCoordinatorThread,
|
|
803
814
|
isDirty,
|
|
815
|
+
isGhRateLimitError,
|
|
804
816
|
isGlobalRepoPath,
|
|
805
817
|
isGlobalThread,
|
|
806
818
|
isLinearConnected,
|
package/dist/mcp/run-stdio.cjs
CHANGED
|
@@ -2156,6 +2156,52 @@ var init_worktree_labels = __esm({
|
|
|
2156
2156
|
}
|
|
2157
2157
|
});
|
|
2158
2158
|
|
|
2159
|
+
// src/git/gh-errors.ts
|
|
2160
|
+
function isGhRateLimitError(text) {
|
|
2161
|
+
return /API rate limit (already )?exceeded/i.test(text) || /rate limit exceeded/i.test(text);
|
|
2162
|
+
}
|
|
2163
|
+
function formatRateLimitResetHint(resetEpochSec, nowMs = Date.now()) {
|
|
2164
|
+
const ms = resetEpochSec * 1e3 - nowMs;
|
|
2165
|
+
if (ms <= 0) return "soon";
|
|
2166
|
+
const mins = Math.max(1, Math.ceil(ms / 6e4));
|
|
2167
|
+
if (mins < 60) {
|
|
2168
|
+
return `in about ${mins} minute${mins === 1 ? "" : "s"}`;
|
|
2169
|
+
}
|
|
2170
|
+
const hours = Math.ceil(mins / 60);
|
|
2171
|
+
return `in about ${hours} hour${hours === 1 ? "" : "s"}`;
|
|
2172
|
+
}
|
|
2173
|
+
function extractGhErrorDetail(text) {
|
|
2174
|
+
const trimmed = text.trim();
|
|
2175
|
+
if (!trimmed) return "";
|
|
2176
|
+
const graphql = trimmed.match(/\bGraphQL:\s*(.+)$/im);
|
|
2177
|
+
if (graphql?.[1]) return `GraphQL: ${graphql[1].trim()}`;
|
|
2178
|
+
const http = trimmed.match(/\bHTTP\s+\d{3}:\s*(.+)$/im);
|
|
2179
|
+
if (http?.[1]) return `HTTP: ${http[1].trim()}`;
|
|
2180
|
+
const lines = trimmed.split(/\r?\n/).map((l) => l.trim()).filter(Boolean);
|
|
2181
|
+
if (lines.length > 1 && /^Command failed with exit code/i.test(lines[0])) {
|
|
2182
|
+
return lines.slice(1).join(" ").trim() || lines[0];
|
|
2183
|
+
}
|
|
2184
|
+
return trimmed;
|
|
2185
|
+
}
|
|
2186
|
+
function formatGhLandError(raw, opts) {
|
|
2187
|
+
const trimmed = raw.trim();
|
|
2188
|
+
if (trimmed.startsWith("GitHub API rate limit exceeded.")) {
|
|
2189
|
+
return trimmed;
|
|
2190
|
+
}
|
|
2191
|
+
const detail = extractGhErrorDetail(raw);
|
|
2192
|
+
if (isGhRateLimitError(raw) || isGhRateLimitError(detail)) {
|
|
2193
|
+
const when = opts?.resetAt ? ` Try again ${formatRateLimitResetHint(opts.resetAt, opts.nowMs)}.` : " Wait a few minutes and try again.";
|
|
2194
|
+
const pushNote = opts?.pushed === false ? "" : " Your branch was already pushed.";
|
|
2195
|
+
return `GitHub API rate limit exceeded.${pushNote}${when} Or create the pull request in the browser (Push & open on GitHub).`;
|
|
2196
|
+
}
|
|
2197
|
+
return detail || "Failed to create or update pull request";
|
|
2198
|
+
}
|
|
2199
|
+
var init_gh_errors = __esm({
|
|
2200
|
+
"src/git/gh-errors.ts"() {
|
|
2201
|
+
"use strict";
|
|
2202
|
+
}
|
|
2203
|
+
});
|
|
2204
|
+
|
|
2159
2205
|
// src/git/pr-gates.ts
|
|
2160
2206
|
function buildMergeGateChecks(gate, opts = {}) {
|
|
2161
2207
|
const rows = [];
|
|
@@ -2265,6 +2311,7 @@ __export(worktree_exports, {
|
|
|
2265
2311
|
getPr: () => getPr,
|
|
2266
2312
|
getPrChecks: () => getPrChecks,
|
|
2267
2313
|
getPrDetails: () => getPrDetails,
|
|
2314
|
+
getPrMeta: () => getPrMeta,
|
|
2268
2315
|
isDirty: () => isDirty,
|
|
2269
2316
|
isPlaceholderBranch: () => isPlaceholderBranch,
|
|
2270
2317
|
listBranches: () => listBranches,
|
|
@@ -2288,6 +2335,24 @@ __export(worktree_exports, {
|
|
|
2288
2335
|
worktreeDisplayLabelForGroup: () => worktreeDisplayLabelForGroup,
|
|
2289
2336
|
worktreeNameFromPath: () => worktreeNameFromPath
|
|
2290
2337
|
});
|
|
2338
|
+
async function lookupGithubGraphqlReset(cwd) {
|
|
2339
|
+
const result = await gh(["api", "rate_limit"], cwd, { reject: false });
|
|
2340
|
+
if (result.exitCode !== 0 || !result.stdout.trim()) return void 0;
|
|
2341
|
+
try {
|
|
2342
|
+
const data = JSON.parse(result.stdout);
|
|
2343
|
+
const reset = data.resources?.graphql?.reset;
|
|
2344
|
+
return typeof reset === "number" ? reset : void 0;
|
|
2345
|
+
} catch {
|
|
2346
|
+
return void 0;
|
|
2347
|
+
}
|
|
2348
|
+
}
|
|
2349
|
+
async function formatPrCreateFailure(raw, cwd) {
|
|
2350
|
+
if (!isGhRateLimitError(raw)) {
|
|
2351
|
+
return formatGhLandError(raw);
|
|
2352
|
+
}
|
|
2353
|
+
const resetAt = await lookupGithubGraphqlReset(cwd);
|
|
2354
|
+
return formatGhLandError(raw, { resetAt });
|
|
2355
|
+
}
|
|
2291
2356
|
function slugify(input) {
|
|
2292
2357
|
return input.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 48);
|
|
2293
2358
|
}
|
|
@@ -2602,6 +2667,37 @@ async function getPrChecks(cwd, selector) {
|
|
|
2602
2667
|
});
|
|
2603
2668
|
return [...gateRows, ...ciChecks];
|
|
2604
2669
|
}
|
|
2670
|
+
async function getPrMeta(cwd, selector) {
|
|
2671
|
+
const slug = await resolveGithubRepoSlug(cwd);
|
|
2672
|
+
const viewArgs = [
|
|
2673
|
+
"pr",
|
|
2674
|
+
"view",
|
|
2675
|
+
selector,
|
|
2676
|
+
"--json",
|
|
2677
|
+
"number,title,url,state,isDraft,reviewDecision,baseRefName,headRefName"
|
|
2678
|
+
];
|
|
2679
|
+
if (slug) viewArgs.push("--repo", slug);
|
|
2680
|
+
const { stdout, exitCode, stderr } = await gh(viewArgs, cwd, { reject: false });
|
|
2681
|
+
if (exitCode !== 0 || !stdout.trim()) {
|
|
2682
|
+
if (/no pull requests found/i.test(stderr)) return null;
|
|
2683
|
+
return null;
|
|
2684
|
+
}
|
|
2685
|
+
try {
|
|
2686
|
+
const view = JSON.parse(stdout);
|
|
2687
|
+
return {
|
|
2688
|
+
number: Number(view.number),
|
|
2689
|
+
title: String(view.title ?? ""),
|
|
2690
|
+
url: String(view.url ?? ""),
|
|
2691
|
+
state: String(view.state ?? ""),
|
|
2692
|
+
isDraft: Boolean(view.isDraft),
|
|
2693
|
+
reviewDecision: typeof view.reviewDecision === "string" && view.reviewDecision ? view.reviewDecision : null,
|
|
2694
|
+
baseRefName: String(view.baseRefName ?? ""),
|
|
2695
|
+
headRefName: String(view.headRefName ?? "")
|
|
2696
|
+
};
|
|
2697
|
+
} catch {
|
|
2698
|
+
return null;
|
|
2699
|
+
}
|
|
2700
|
+
}
|
|
2605
2701
|
async function getPrDetails(cwd, selector) {
|
|
2606
2702
|
const slug = await resolveGithubRepoSlug(cwd);
|
|
2607
2703
|
const viewArgs = [
|
|
@@ -2623,7 +2719,6 @@ async function getPrDetails(cwd, selector) {
|
|
|
2623
2719
|
"additions",
|
|
2624
2720
|
"deletions",
|
|
2625
2721
|
"changedFiles",
|
|
2626
|
-
"commits",
|
|
2627
2722
|
"comments",
|
|
2628
2723
|
"reviews"
|
|
2629
2724
|
].join(",")
|
|
@@ -2642,14 +2737,7 @@ async function getPrDetails(cwd, selector) {
|
|
|
2642
2737
|
} catch {
|
|
2643
2738
|
throw new Error(stderr.trim() || "gh pr view returned invalid JSON");
|
|
2644
2739
|
}
|
|
2645
|
-
let checks = [];
|
|
2646
|
-
try {
|
|
2647
|
-
checks = await getPrChecks(cwd, selector) ?? [];
|
|
2648
|
-
} catch {
|
|
2649
|
-
checks = [];
|
|
2650
|
-
}
|
|
2651
2740
|
const author = view.author ?? {};
|
|
2652
|
-
const commits = Array.isArray(view.commits) ? view.commits : [];
|
|
2653
2741
|
const comments = Array.isArray(view.comments) ? view.comments : [];
|
|
2654
2742
|
const reviews = Array.isArray(view.reviews) ? view.reviews : [];
|
|
2655
2743
|
return {
|
|
@@ -2666,19 +2754,8 @@ async function getPrDetails(cwd, selector) {
|
|
|
2666
2754
|
additions: Number(view.additions ?? 0),
|
|
2667
2755
|
deletions: Number(view.deletions ?? 0),
|
|
2668
2756
|
changedFiles: Number(view.changedFiles ?? 0),
|
|
2669
|
-
|
|
2670
|
-
|
|
2671
|
-
const authors = Array.isArray(row.authors) ? row.authors.map((a) => {
|
|
2672
|
-
const actor = a;
|
|
2673
|
-
return { login: actor.login ?? "unknown", name: actor.name ?? null };
|
|
2674
|
-
}) : [];
|
|
2675
|
-
return {
|
|
2676
|
-
oid: String(row.oid ?? ""),
|
|
2677
|
-
messageHeadline: String(row.messageHeadline ?? ""),
|
|
2678
|
-
committedDate: String(row.committedDate ?? ""),
|
|
2679
|
-
authors
|
|
2680
|
-
};
|
|
2681
|
-
}),
|
|
2757
|
+
// Commits live in Changes; omit from GraphQL to save rate-limit points.
|
|
2758
|
+
commits: [],
|
|
2682
2759
|
comments: comments.map((c) => {
|
|
2683
2760
|
const row = c;
|
|
2684
2761
|
const a = row.author ?? {};
|
|
@@ -2698,7 +2775,8 @@ async function getPrDetails(cwd, selector) {
|
|
|
2698
2775
|
submittedAt: normalizeGhTime(row.submittedAt)
|
|
2699
2776
|
};
|
|
2700
2777
|
}),
|
|
2701
|
-
|
|
2778
|
+
// CI lives in Checks tab via getPrChecks — nesting burned GraphQL points.
|
|
2779
|
+
checks: []
|
|
2702
2780
|
};
|
|
2703
2781
|
}
|
|
2704
2782
|
async function fetchPrHead(repoPath, number, localBranch) {
|
|
@@ -2928,8 +3006,12 @@ async function createOrUpdatePr(worktreePath, opts) {
|
|
|
2928
3006
|
opts.head
|
|
2929
3007
|
];
|
|
2930
3008
|
if (opts.draft) args.push("--draft");
|
|
2931
|
-
const
|
|
2932
|
-
|
|
3009
|
+
const created = await gh(args, worktreePath, { reject: false });
|
|
3010
|
+
if (created.exitCode !== 0) {
|
|
3011
|
+
const raw = created.stderr.trim() || created.stdout.trim() || "gh pr create failed";
|
|
3012
|
+
throw new Error(await formatPrCreateFailure(raw, worktreePath));
|
|
3013
|
+
}
|
|
3014
|
+
const url = created.stdout.trim().split("\n").find((l) => l.startsWith("http")) ?? created.stdout.trim();
|
|
2933
3015
|
return url;
|
|
2934
3016
|
}
|
|
2935
3017
|
function suggestSlug(source) {
|
|
@@ -2990,6 +3072,7 @@ var init_worktree = __esm({
|
|
|
2990
3072
|
init_thread_store();
|
|
2991
3073
|
init_teams();
|
|
2992
3074
|
init_worktree_labels();
|
|
3075
|
+
init_gh_errors();
|
|
2993
3076
|
init_run();
|
|
2994
3077
|
init_pr_gates();
|
|
2995
3078
|
init_teams();
|
|
@@ -4258,6 +4341,9 @@ __export(workspaces_exports, {
|
|
|
4258
4341
|
function workspacesFile() {
|
|
4259
4342
|
return (0, import_node_path16.join)(appDataDir(), "workspaces.json");
|
|
4260
4343
|
}
|
|
4344
|
+
function removedWorkspacesFile() {
|
|
4345
|
+
return (0, import_node_path16.join)(appDataDir(), "removed-workspaces.json");
|
|
4346
|
+
}
|
|
4261
4347
|
function readAll() {
|
|
4262
4348
|
const path = workspacesFile();
|
|
4263
4349
|
if (!(0, import_node_fs16.existsSync)(path)) return [];
|
|
@@ -4272,12 +4358,41 @@ function writeAll(list) {
|
|
|
4272
4358
|
(0, import_node_fs16.mkdirSync)(appDataDir(), { recursive: true });
|
|
4273
4359
|
(0, import_node_fs16.writeFileSync)(workspacesFile(), JSON.stringify(list, null, 2), "utf8");
|
|
4274
4360
|
}
|
|
4361
|
+
function readRemoved() {
|
|
4362
|
+
const path = removedWorkspacesFile();
|
|
4363
|
+
if (!(0, import_node_fs16.existsSync)(path)) return /* @__PURE__ */ new Set();
|
|
4364
|
+
try {
|
|
4365
|
+
const raw = JSON.parse((0, import_node_fs16.readFileSync)(path, "utf8"));
|
|
4366
|
+
return new Set(Array.isArray(raw) ? raw.filter((p) => typeof p === "string") : []);
|
|
4367
|
+
} catch {
|
|
4368
|
+
return /* @__PURE__ */ new Set();
|
|
4369
|
+
}
|
|
4370
|
+
}
|
|
4371
|
+
function writeRemoved(paths) {
|
|
4372
|
+
(0, import_node_fs16.mkdirSync)(appDataDir(), { recursive: true });
|
|
4373
|
+
(0, import_node_fs16.writeFileSync)(removedWorkspacesFile(), JSON.stringify([...paths].sort(), null, 2), "utf8");
|
|
4374
|
+
}
|
|
4375
|
+
function rememberRemoved(repoPath) {
|
|
4376
|
+
const next = readRemoved();
|
|
4377
|
+
next.add(repoPath);
|
|
4378
|
+
writeRemoved(next);
|
|
4379
|
+
}
|
|
4380
|
+
function forgetRemoved(repoPath) {
|
|
4381
|
+
const next = readRemoved();
|
|
4382
|
+
if (!next.delete(repoPath)) return;
|
|
4383
|
+
writeRemoved(next);
|
|
4384
|
+
}
|
|
4275
4385
|
function listWorkspaces() {
|
|
4276
|
-
|
|
4386
|
+
const all = readAll();
|
|
4387
|
+
const valid = all.filter((w) => Boolean(w.path) && w.path !== "/" && w.path !== ".");
|
|
4388
|
+
if (valid.length !== all.length) writeAll(valid);
|
|
4389
|
+
return valid.sort((a, b) => a.name.localeCompare(b.name));
|
|
4277
4390
|
}
|
|
4278
4391
|
async function addWorkspace(repoPath) {
|
|
4279
4392
|
const root = await resolveRepoRoot(repoPath);
|
|
4393
|
+
if (!root || root === "/") throw new Error(`Invalid repo path: ${repoPath}`);
|
|
4280
4394
|
if (!(0, import_node_fs16.existsSync)(root)) throw new Error(`Repo not found: ${root}`);
|
|
4395
|
+
forgetRemoved(root);
|
|
4281
4396
|
const current = readAll();
|
|
4282
4397
|
const existing = current.find((w) => w.path === root);
|
|
4283
4398
|
if (existing) return existing;
|
|
@@ -4291,16 +4406,20 @@ async function addWorkspace(repoPath) {
|
|
|
4291
4406
|
}
|
|
4292
4407
|
function removeWorkspace(repoPath) {
|
|
4293
4408
|
writeAll(readAll().filter((w) => w.path !== repoPath));
|
|
4409
|
+
rememberRemoved(repoPath);
|
|
4294
4410
|
}
|
|
4295
4411
|
async function ensureWorkspace(repoPath) {
|
|
4296
4412
|
return addWorkspace(repoPath);
|
|
4297
4413
|
}
|
|
4298
4414
|
function syncWorkspacesFromThreads(repoPaths) {
|
|
4299
4415
|
const current = readAll();
|
|
4416
|
+
const removed = readRemoved();
|
|
4300
4417
|
const byPath = new Map(current.map((w) => [w.path, w]));
|
|
4301
4418
|
let dirty = false;
|
|
4302
4419
|
for (const path of repoPaths) {
|
|
4303
|
-
if (!path || isGlobalRepoPath(path) || byPath.has(path))
|
|
4420
|
+
if (!path || path === "/" || isGlobalRepoPath(path) || byPath.has(path) || removed.has(path)) {
|
|
4421
|
+
continue;
|
|
4422
|
+
}
|
|
4304
4423
|
if (!(0, import_node_fs16.existsSync)(path)) continue;
|
|
4305
4424
|
const ws = {
|
|
4306
4425
|
path,
|
|
@@ -6604,6 +6723,7 @@ async function suggestPrMetadata(worktreePath, opts) {
|
|
|
6604
6723
|
}
|
|
6605
6724
|
|
|
6606
6725
|
// src/land/land.ts
|
|
6726
|
+
init_gh_errors();
|
|
6607
6727
|
async function previewLand(thread) {
|
|
6608
6728
|
if (thread.sourceIsFork) {
|
|
6609
6729
|
return {
|
|
@@ -6667,15 +6787,24 @@ async function confirmLand(thread, opts) {
|
|
|
6667
6787
|
const head = headOut.trim();
|
|
6668
6788
|
const branch = head && head !== "HEAD" ? head : thread.branchName;
|
|
6669
6789
|
await pushBranch(thread.worktreePath, branch);
|
|
6670
|
-
|
|
6671
|
-
|
|
6672
|
-
|
|
6673
|
-
|
|
6674
|
-
|
|
6675
|
-
|
|
6676
|
-
|
|
6677
|
-
|
|
6678
|
-
|
|
6790
|
+
try {
|
|
6791
|
+
const prUrl = await createOrUpdatePr(thread.worktreePath, {
|
|
6792
|
+
title: meta.title,
|
|
6793
|
+
body: meta.body,
|
|
6794
|
+
base: preview.target,
|
|
6795
|
+
head: branch,
|
|
6796
|
+
draft: opts?.draft,
|
|
6797
|
+
web: opts?.web
|
|
6798
|
+
});
|
|
6799
|
+
return { prUrl, pushed: true, committed };
|
|
6800
|
+
} catch (err) {
|
|
6801
|
+
const raw = err instanceof Error ? err.message : String(err);
|
|
6802
|
+
if (raw.startsWith("GitHub API rate limit exceeded.")) throw err;
|
|
6803
|
+
if (/Command failed with exit code|API rate limit/i.test(raw)) {
|
|
6804
|
+
throw new Error(formatGhLandError(raw));
|
|
6805
|
+
}
|
|
6806
|
+
throw err;
|
|
6807
|
+
}
|
|
6679
6808
|
}
|
|
6680
6809
|
|
|
6681
6810
|
// src/skills/discover.ts
|
|
@@ -7175,7 +7304,7 @@ var Orchestrator = class {
|
|
|
7175
7304
|
return thread;
|
|
7176
7305
|
}
|
|
7177
7306
|
listWorkspaces() {
|
|
7178
|
-
const fromThreads = listThreads({ includeArchived:
|
|
7307
|
+
const fromThreads = listThreads({ includeArchived: false }).map((t) => t.repoPath);
|
|
7179
7308
|
return syncWorkspacesFromThreads(fromThreads);
|
|
7180
7309
|
}
|
|
7181
7310
|
async addWorkspace(repoPath) {
|
|
@@ -7792,8 +7921,8 @@ var Orchestrator = class {
|
|
|
7792
7921
|
if (result.prUrl) {
|
|
7793
7922
|
const patch = { prUrl: result.prUrl };
|
|
7794
7923
|
try {
|
|
7795
|
-
const
|
|
7796
|
-
if (
|
|
7924
|
+
const meta = await getPrMeta(thread.worktreePath, result.prUrl);
|
|
7925
|
+
if (meta?.title) patch.prTitle = meta.title;
|
|
7797
7926
|
} catch {
|
|
7798
7927
|
}
|
|
7799
7928
|
updateThread(thread.id, patch);
|
|
@@ -7826,6 +7955,24 @@ var Orchestrator = class {
|
|
|
7826
7955
|
if (!selector) return null;
|
|
7827
7956
|
return getPrChecks(cwd, selector);
|
|
7828
7957
|
}
|
|
7958
|
+
async getPrMeta(threadRef) {
|
|
7959
|
+
const { thread, selector, cwd } = await this.withPrSelector(threadRef);
|
|
7960
|
+
if (!selector) return null;
|
|
7961
|
+
const meta = await getPrMeta(cwd, selector);
|
|
7962
|
+
if (meta) {
|
|
7963
|
+
const patch = {};
|
|
7964
|
+
if (meta.url && meta.url !== thread.prUrl) patch.prUrl = meta.url;
|
|
7965
|
+
if (meta.title && meta.title !== thread.prTitle) patch.prTitle = meta.title;
|
|
7966
|
+
if (Object.keys(patch).length > 0) {
|
|
7967
|
+
updateThread(thread.id, patch);
|
|
7968
|
+
const latest = this.requireThread(thread.id);
|
|
7969
|
+
if (!latest.userSetTitle && meta.title && latest.title !== meta.title) {
|
|
7970
|
+
updateThread(thread.id, { title: meta.title });
|
|
7971
|
+
}
|
|
7972
|
+
}
|
|
7973
|
+
}
|
|
7974
|
+
return meta;
|
|
7975
|
+
}
|
|
7829
7976
|
async getPrDetails(threadRef) {
|
|
7830
7977
|
const { thread, selector, cwd } = await this.withPrSelector(threadRef);
|
|
7831
7978
|
if (!selector) return null;
|
package/dist/mcp/run-stdio.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
startMcpServer
|
|
4
|
-
} from "../chunk-
|
|
5
|
-
import "../chunk-
|
|
6
|
-
import "../chunk-
|
|
7
|
-
import "../chunk-
|
|
8
|
-
import "../chunk-
|
|
4
|
+
} from "../chunk-MAWKQA2Y.js";
|
|
5
|
+
import "../chunk-MGSJQMJA.js";
|
|
6
|
+
import "../chunk-3OJG4LP4.js";
|
|
7
|
+
import "../chunk-TNIAXABV.js";
|
|
8
|
+
import "../chunk-MEI4AXV4.js";
|
|
9
9
|
import "../chunk-ILQK4P5R.js";
|
|
10
10
|
import "../chunk-3DKGI32Q.js";
|
|
11
11
|
import "../chunk-3WF3X46L.js";
|
|
12
|
-
import "../chunk-
|
|
12
|
+
import "../chunk-L44AX7IG.js";
|
|
13
13
|
import "../chunk-HYRHI3QU.js";
|
|
14
14
|
import "../chunk-M37RITA6.js";
|
|
15
15
|
import "../chunk-AJ6ROGD7.js";
|
|
@@ -4,10 +4,10 @@ import {
|
|
|
4
4
|
listWorkspaces,
|
|
5
5
|
removeWorkspace,
|
|
6
6
|
syncWorkspacesFromThreads
|
|
7
|
-
} from "./chunk-
|
|
8
|
-
import "./chunk-
|
|
9
|
-
import "./chunk-
|
|
10
|
-
import "./chunk-
|
|
7
|
+
} from "./chunk-MGSJQMJA.js";
|
|
8
|
+
import "./chunk-3OJG4LP4.js";
|
|
9
|
+
import "./chunk-TNIAXABV.js";
|
|
10
|
+
import "./chunk-L44AX7IG.js";
|
|
11
11
|
import "./chunk-HYRHI3QU.js";
|
|
12
12
|
import "./chunk-M37RITA6.js";
|
|
13
13
|
import "./chunk-AJ6ROGD7.js";
|
|
@@ -13,6 +13,7 @@ import {
|
|
|
13
13
|
getPr,
|
|
14
14
|
getPrChecks,
|
|
15
15
|
getPrDetails,
|
|
16
|
+
getPrMeta,
|
|
16
17
|
isDirty,
|
|
17
18
|
isPlaceholderBranch,
|
|
18
19
|
listBranches,
|
|
@@ -35,7 +36,7 @@ import {
|
|
|
35
36
|
worktreeDisplayLabel,
|
|
36
37
|
worktreeDisplayLabelForGroup,
|
|
37
38
|
worktreeNameFromPath
|
|
38
|
-
} from "./chunk-
|
|
39
|
+
} from "./chunk-L44AX7IG.js";
|
|
39
40
|
import "./chunk-HYRHI3QU.js";
|
|
40
41
|
import "./chunk-M37RITA6.js";
|
|
41
42
|
import "./chunk-AJ6ROGD7.js";
|
|
@@ -54,6 +55,7 @@ export {
|
|
|
54
55
|
getPr,
|
|
55
56
|
getPrChecks,
|
|
56
57
|
getPrDetails,
|
|
58
|
+
getPrMeta,
|
|
57
59
|
isDirty,
|
|
58
60
|
isPlaceholderBranch,
|
|
59
61
|
listBranches,
|