mirror of
https://github.com/stablyai/orca.git
synced 2026-10-25 16:03:53 +00:00
#14397 split `shared/types.ts` into 46 per-domain modules but kept the path as a re-export barrel so the import sites did not have to change. This removes the barrel: every consumer now imports from the module that actually declares the type, and `src/shared/types.ts` is deleted. Barrels hide where a type lives, make every consumer look like it depends on the whole domain, and let an unrelated edit invalidate a module that ~2,000 files transitively import. 2,323 import declarations across 2,321 files. Rewritten mechanically: each specifier was resolved to an absolute path via the TypeScript AST and recomputed, rather than string-substituted, so alias forms (`@/../../shared/ types`) and per-specifier `type` modifiers survive. Four cases the mechanical pass had to handle, each found by a gate rather than by reading the diff: - Modules inside `src/shared` import the barrel as `./types`, not `shared/types`. A pre-filter on the latter string skipped 176 of them and left imports dangling at a deleted file, which surfaced as confusing `Property 'x' is optional in type 'Repo' but required in Pick<Repo, ...>` errors rather than "module not found". - The barrel RENAMED one type on the way through (`WorkspaceSource as WorkspaceCreateTelemetrySource`), so the original name in the owning module has to be re-aliased at each consumer. - Three test files put `;(globalThis as ...)` on the line after the import. TypeScript parses that `;` as the import statement's terminator, so replacing through `statement.getEnd()` deletes it and breaks ASI. The rewrite now stops at the module specifier. - A file that already imported directly from a module got a SECOND import from it, because the barrel re-exported those same names — which trips `import/no-duplicates` under `--deny-warnings`. A post-pass merges declarations sharing a specifier and type-only-ness; the `import type` plus `import` pair from one module is left alone, since that form is allowed. Splitting one barrel import into several genuinely adds lines, which pushed `terminal-layout-pty-ownership.ts` to 301 counted lines: its 107-character import must wrap, and neither local type collapses onto one line (101 and 116 characters). Rather than contort a type declaration to fit a line budget, `collectLeafIds` and `pruneLeaves` move to `terminal-pane-layout-tree.ts` — they are pure structural operations on the layout tree and independent of PTY ownership. `visible-worktrees.ts` similarly loses its own mini-barrel re-export of `isDefaultBranchWorkspace`, with the four real consumers repointed at the declaring module. No `max-lines` bypass added. Verified: cold `tsc --noEmit` green on node, cli, and web (buildinfo deleted first — these projects are `composite: true` and reuse stale caches); the full `pnpm lint` green, not just bare oxlint — the narrower local check is what let the duplicate imports reach CI; max-lines ratchet OK at 344.
169 lines
5.8 KiB
TypeScript
169 lines
5.8 KiB
TypeScript
import type {
|
|
AddIssueCommentBySlugArgs,
|
|
ClearProjectItemFieldArgs,
|
|
DeleteIssueCommentBySlugArgs,
|
|
GetProjectViewTableArgs,
|
|
GetProjectViewTableResult,
|
|
GitHubProjectCommentMutationResult,
|
|
GitHubProjectMutationResult,
|
|
ListAccessibleProjectsArgs,
|
|
ListAccessibleProjectsResult,
|
|
ListAssignableUsersBySlugArgs,
|
|
ListAssignableUsersBySlugResult,
|
|
ListIssueTypesBySlugArgs,
|
|
ListIssueTypesBySlugResult,
|
|
ListLabelsBySlugArgs,
|
|
ListLabelsBySlugResult,
|
|
ListProjectViewsArgs,
|
|
ListProjectViewsResult,
|
|
ProjectWorkItemDetailsBySlugArgs,
|
|
ProjectWorkItemDetailsBySlugResult,
|
|
ResolveProjectRefArgs,
|
|
ResolveProjectRefResult,
|
|
UpdateIssueBySlugArgs,
|
|
UpdateIssueCommentBySlugArgs,
|
|
UpdateIssueTypeBySlugArgs,
|
|
UpdateProjectItemFieldArgs,
|
|
UpdatePullRequestBySlugArgs
|
|
} from '../../shared/github/project-types'
|
|
import type { TaskSourceContext } from '../../shared/task-source-context'
|
|
import type { GitHubCommentResult } from '../../shared/github/comment-types'
|
|
import type {
|
|
GitHubAssignableUser,
|
|
GitHubOwnerRepo,
|
|
IssueInfo
|
|
} from '../../shared/github/pull-request-types'
|
|
import type {
|
|
GitHubWorkItem,
|
|
GitHubWorkItemDetails,
|
|
ListWorkItemsResult
|
|
} from '../../shared/github/work-item-types'
|
|
import type { GitHubCreateIssueResult, GitHubIssueUpdate } from '../../shared/issue-mutation-types'
|
|
|
|
export type GitHubRepoSelectorArgs = {
|
|
repoPath: string
|
|
repoId?: string | null
|
|
sourceContext?: TaskSourceContext | null
|
|
}
|
|
|
|
export type GithubWorkItemApi = {
|
|
issue: (args: {
|
|
repoPath: string
|
|
repoId?: string
|
|
sourceContext?: TaskSourceContext | null
|
|
number: number
|
|
}) => Promise<IssueInfo | null>
|
|
workItem: (args: {
|
|
repoPath: string
|
|
repoId?: string
|
|
sourceContext?: TaskSourceContext | null
|
|
number: number
|
|
type?: 'issue' | 'pr'
|
|
}) => Promise<Omit<GitHubWorkItem, 'repoId'> | null>
|
|
workItemByOwnerRepo: (args: {
|
|
repoPath: string
|
|
repoId?: string
|
|
owner: string
|
|
repo: string
|
|
host?: string
|
|
number: number
|
|
type: 'issue' | 'pr'
|
|
}) => Promise<Omit<GitHubWorkItem, 'repoId'> | null>
|
|
workItemDetails: (
|
|
args: GitHubRepoSelectorArgs & {
|
|
number: number
|
|
type?: 'issue' | 'pr'
|
|
}
|
|
) => Promise<GitHubWorkItemDetails | null>
|
|
notifyWorkItemMutated: (args: {
|
|
repoPath: string
|
|
repoId?: string
|
|
type: 'issue' | 'pr'
|
|
number: number
|
|
}) => Promise<boolean>
|
|
listIssues: (args: { repoPath: string; repoId?: string; limit?: number }) => Promise<IssueInfo[]>
|
|
createIssue: (args: {
|
|
repoPath: string
|
|
repoId?: string
|
|
sourceContext?: TaskSourceContext | null
|
|
title: string
|
|
body: string
|
|
labels?: string[]
|
|
assignees?: string[]
|
|
}) => Promise<GitHubCreateIssueResult>
|
|
countWorkItems: (args: { repoPath: string; repoId?: string; query?: string }) => Promise<number>
|
|
listWorkItems: (args: {
|
|
repoPath: string
|
|
repoId?: string
|
|
limit?: number
|
|
query?: string
|
|
page?: number
|
|
noCache?: boolean
|
|
}) => Promise<ListWorkItemsResult<Omit<GitHubWorkItem, 'repoId'>>>
|
|
updateIssue: (
|
|
args: GitHubRepoSelectorArgs & {
|
|
number: number
|
|
updates: GitHubIssueUpdate
|
|
}
|
|
) => Promise<{ ok: true } | { ok: false; error: string }>
|
|
addIssueComment: (
|
|
args: GitHubRepoSelectorArgs & {
|
|
number: number
|
|
body: string
|
|
/** Why: scopes the cross-window cache invalidation so a PR and issue sharing the same number don't evict each other. */
|
|
type?: 'issue' | 'pr'
|
|
prRepo?: GitHubOwnerRepo | null
|
|
}
|
|
) => Promise<GitHubCommentResult>
|
|
listLabels: (args: {
|
|
repoPath: string
|
|
repoId?: string
|
|
sourceContext?: TaskSourceContext | null
|
|
}) => Promise<string[]>
|
|
listAssignableUsers: (args: {
|
|
repoPath: string
|
|
repoId?: string
|
|
sourceContext?: TaskSourceContext | null
|
|
}) => Promise<GitHubAssignableUser[]>
|
|
/** Subscribe to local-mutation broadcasts so the work-item-drawer cache can invalidate across windows. Returns an unsubscribe. */
|
|
onWorkItemMutated: (
|
|
callback: (payload: {
|
|
repoPath: string
|
|
repoId?: string
|
|
type: 'issue' | 'pr'
|
|
number: number
|
|
}) => void
|
|
) => () => void
|
|
// ── ProjectV2 (GitHub Projects) ─────────────────────────────────
|
|
listAccessibleProjects: (
|
|
args?: ListAccessibleProjectsArgs
|
|
) => Promise<ListAccessibleProjectsResult>
|
|
resolveProjectRef: (args: ResolveProjectRefArgs) => Promise<ResolveProjectRefResult>
|
|
listProjectViews: (args: ListProjectViewsArgs) => Promise<ListProjectViewsResult>
|
|
getProjectViewTable: (args: GetProjectViewTableArgs) => Promise<GetProjectViewTableResult>
|
|
projectWorkItemDetailsBySlug: (
|
|
args: ProjectWorkItemDetailsBySlugArgs
|
|
) => Promise<ProjectWorkItemDetailsBySlugResult>
|
|
updateProjectItemField: (args: UpdateProjectItemFieldArgs) => Promise<GitHubProjectMutationResult>
|
|
clearProjectItemField: (args: ClearProjectItemFieldArgs) => Promise<GitHubProjectMutationResult>
|
|
updateIssueBySlug: (args: UpdateIssueBySlugArgs) => Promise<GitHubProjectMutationResult>
|
|
updatePullRequestBySlug: (
|
|
args: UpdatePullRequestBySlugArgs
|
|
) => Promise<GitHubProjectMutationResult>
|
|
addIssueCommentBySlug: (
|
|
args: AddIssueCommentBySlugArgs
|
|
) => Promise<GitHubProjectCommentMutationResult>
|
|
updateIssueCommentBySlug: (
|
|
args: UpdateIssueCommentBySlugArgs
|
|
) => Promise<GitHubProjectMutationResult>
|
|
deleteIssueCommentBySlug: (
|
|
args: DeleteIssueCommentBySlugArgs
|
|
) => Promise<GitHubProjectMutationResult>
|
|
listLabelsBySlug: (args: ListLabelsBySlugArgs) => Promise<ListLabelsBySlugResult>
|
|
listAssignableUsersBySlug: (
|
|
args: ListAssignableUsersBySlugArgs
|
|
) => Promise<ListAssignableUsersBySlugResult>
|
|
listIssueTypesBySlug: (args: ListIssueTypesBySlugArgs) => Promise<ListIssueTypesBySlugResult>
|
|
updateIssueTypeBySlug: (args: UpdateIssueTypeBySlugArgs) => Promise<GitHubProjectMutationResult>
|
|
}
|