We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/kunwarVivek/mcp-github-project-manager'
If you have feedback or need assistance with the MCP directory API, please join our Discord server
---
phase: 06-sub-issues-status-updates
plan: 01
type: execute
wave: 1
depends_on: []
files_modified:
- src/infrastructure/github/repositories/BaseGitHubRepository.ts
- src/infrastructure/github/repositories/GitHubSubIssueRepository.ts
- src/infrastructure/github/repositories/GitHubStatusUpdateRepository.ts
- src/infrastructure/github/repositories/types.ts
- src/infrastructure/github/GitHubRepositoryFactory.ts
autonomous: true
must_haves:
truths:
- "GraphQL queries with sub_issues preview header work"
- "Sub-issue CRUD mutations (add, remove, reprioritize) are callable"
- "Status update CRUD operations (create, list, get) are callable"
- "Issue number to node ID resolution works"
artifacts:
- path: "src/infrastructure/github/repositories/BaseGitHubRepository.ts"
provides: "graphqlWithFeatures method for preview headers"
contains: "graphqlWithFeatures"
- path: "src/infrastructure/github/repositories/GitHubSubIssueRepository.ts"
provides: "Sub-issue GraphQL operations"
exports: ["GitHubSubIssueRepository"]
- path: "src/infrastructure/github/repositories/GitHubStatusUpdateRepository.ts"
provides: "Status update GraphQL operations"
exports: ["GitHubStatusUpdateRepository"]
key_links:
- from: "GitHubSubIssueRepository"
to: "BaseGitHubRepository.graphqlWithFeatures"
via: "inheritance"
pattern: "graphqlWithFeatures.*sub_issues"
- from: "GitHubRepositoryFactory"
to: "GitHubSubIssueRepository"
via: "create method"
pattern: "createSubIssueRepository"
---
<objective>
Create the repository infrastructure for GitHub sub-issues and status updates.
Purpose: Provide a data access layer for GraphQL mutations and queries that the MCP tools will use.
Output: Two new repositories (GitHubSubIssueRepository, GitHubStatusUpdateRepository) with full CRUD operations.
</objective>
<execution_context>
@/Users/vivek/.claude/get-shit-done/workflows/execute-plan.md
@/Users/vivek/.claude/get-shit-done/templates/summary.md
</execution_context>
<context>
@.planning/PROJECT.md
@.planning/ROADMAP.md
@.planning/STATE.md
@.planning/phases/06-sub-issues-status-updates/06-RESEARCH.md
@src/infrastructure/github/repositories/BaseGitHubRepository.ts
@src/infrastructure/github/repositories/GitHubIssueRepository.ts
@src/infrastructure/github/GitHubRepositoryFactory.ts
</context>
<tasks>
<task type="auto">
<name>Task 1: Extend BaseGitHubRepository with graphqlWithFeatures</name>
<files>src/infrastructure/github/repositories/BaseGitHubRepository.ts, src/infrastructure/github/repositories/types.ts</files>
<action>
Add a new protected method `graphqlWithFeatures` to BaseGitHubRepository that accepts:
- query: string
- variables: Record<string, unknown>
- features: string[] (e.g., ['sub_issues'])
The method should:
1. Include the `GraphQL-Features` header with comma-joined features
2. Use the existing `withRetry` wrapper for retry logic
3. Follow the same pattern as the existing `graphql` method
Also add a helper method `resolveIssueNodeId(issueNumber: number): Promise<string>` that:
1. Queries GitHub for the issue's node ID using issue number
2. Returns the node ID (e.g., `I_kwDO...`)
3. Caches the result if ResourceCache is available (optional)
Add types to types.ts:
- SubIssueListItem interface (id, number, title, state, url, position)
- SubIssueSummary interface (total, completed, percentCompleted)
- StatusUpdateStatus enum (ON_TRACK, AT_RISK, OFF_TRACK, COMPLETE, INACTIVE)
- StatusUpdate interface (id, body, bodyHTML, status, startDate, targetDate, createdAt, creator)
</action>
<verify>TypeScript compiles with `npm run build`. New method signature visible in BaseGitHubRepository.</verify>
<done>BaseGitHubRepository has graphqlWithFeatures and resolveIssueNodeId methods. Types defined in types.ts.</done>
</task>
<task type="auto">
<name>Task 2: Create GitHubSubIssueRepository</name>
<files>src/infrastructure/github/repositories/GitHubSubIssueRepository.ts</files>
<action>
Create GitHubSubIssueRepository extending BaseGitHubRepository with these methods:
1. `addSubIssue(parentIssueId: string, subIssueId: string, replaceParent?: boolean): Promise<SubIssueResult>`
- Uses addSubIssue mutation with sub_issues feature flag
- Returns the created relationship
2. `listSubIssues(issueId: string, first?: number, after?: string): Promise<SubIssueListResult>`
- Queries subIssues connection on Issue
- Returns flat list with pagination info and summary
3. `getParentIssue(issueId: string): Promise<ParentIssueResult | null>`
- Queries parent field on Issue
- Returns null if no parent
4. `reprioritizeSubIssue(parentIssueId: string, subIssueId: string, afterId?: string): Promise<SubIssueResult>`
- Uses reprioritizeSubIssue mutation
- afterId = null means move to beginning
5. `removeSubIssue(parentIssueId: string, subIssueId: string): Promise<void>`
- Uses removeSubIssue mutation
All methods must:
- Use graphqlWithFeatures with ['sub_issues'] feature flag
- Handle GraphQL errors appropriately
- Use proper TypeScript types from types.ts
Reference the GraphQL examples from 06-RESEARCH.md.
</action>
<verify>TypeScript compiles. `grep -r "sub_issues" src/infrastructure/github/repositories/` shows the feature flag in use.</verify>
<done>GitHubSubIssueRepository exists with all 5 methods using GraphQL mutations/queries with preview header.</done>
</task>
<task type="auto">
<name>Task 3: Create GitHubStatusUpdateRepository and wire factory</name>
<files>src/infrastructure/github/repositories/GitHubStatusUpdateRepository.ts, src/infrastructure/github/GitHubRepositoryFactory.ts</files>
<action>
Create GitHubStatusUpdateRepository extending BaseGitHubRepository with these methods:
1. `createStatusUpdate(projectId: string, body: string, options?: StatusUpdateOptions): Promise<StatusUpdate>`
- Uses createProjectV2StatusUpdate mutation
- Options: status (enum), startDate (ISO), targetDate (ISO)
- Returns created status update
2. `listStatusUpdates(projectId: string, first?: number, after?: string): Promise<StatusUpdateListResult>`
- Queries statusUpdates connection on ProjectV2
- Returns with pagination (first, after cursor pattern)
- Order by CREATED_AT DESC
3. `getStatusUpdate(statusUpdateId: string): Promise<StatusUpdate | null>`
- Uses node query by ID
- Returns null if not found
Reference the GraphQL examples from 06-RESEARCH.md.
Then update GitHubRepositoryFactory to add:
- `createSubIssueRepository(): GitHubSubIssueRepository`
- `createStatusUpdateRepository(): GitHubStatusUpdateRepository`
Follow the existing pattern (e.g., createIssueRepository).
</action>
<verify>TypeScript compiles. `grep -r "createSubIssueRepository\|createStatusUpdateRepository" src/` shows factory methods.</verify>
<done>GitHubStatusUpdateRepository exists with all 3 methods. Factory creates both new repositories.</done>
</task>
</tasks>
<verification>
1. `npm run build` succeeds with no TypeScript errors
2. All new repository methods are properly typed
3. `grep -r "graphqlWithFeatures" src/infrastructure/github/repositories/` shows method in use
4. `grep -r "sub_issues" src/` shows feature flag usage
5. GitHubRepositoryFactory exports create methods for both new repositories
</verification>
<success_criteria>
- BaseGitHubRepository has graphqlWithFeatures method supporting preview headers
- GitHubSubIssueRepository implements all 5 sub-issue operations
- GitHubStatusUpdateRepository implements all 3 status update operations
- GitHubRepositoryFactory can create instances of both new repositories
- TypeScript compiles without errors
</success_criteria>
<output>
After completion, create `.planning/phases/06-sub-issues-status-updates/06-01-SUMMARY.md`
</output>