name: Update Project Status
# Update project status based on PR state
on:
pull_request:
types: [opened, closed, reopened]
issues:
types: [closed, reopened]
jobs:
update-status:
runs-on: ubuntu-latest
name: Update project item status
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install Dependencies
run: npm ci
- name: Update Project Status
env:
GITHUB_TOKEN: ${{ secrets.GH_PROJECT_TOKEN }}
ISSUE_NUMBER: ${{ github.event.issue.number || github.event.pull_request.number }}
EVENT_ACTION: ${{ github.event.action }}
run: |
cat > update-status.ts << 'EOF'
import { ProjectsV2Client } from './agents/github/projects-v2.js';
async function main() {
const token = process.env.GITHUB_TOKEN!;
const issueNumber = parseInt(process.env.ISSUE_NUMBER!);
const action = process.env.EVENT_ACTION!;
const [owner, repo] = process.env.GITHUB_REPOSITORY!.split('/');
const client = new ProjectsV2Client(token, {
owner,
repo,
projectNumber: 1, // Adjust as needed
});
await client.initialize();
// Get issue node ID
const issueNodeId = await client.getIssueNodeId(issueNumber);
// Add to project if not already added
let itemId: string;
try {
itemId = await client.addIssueToProject(issueNodeId);
console.log(`Added issue #${issueNumber} to project`);
} catch (error: any) {
if (error.message.includes('already exists')) {
console.log(`Issue #${issueNumber} already in project`);
// Get existing item ID (simplified - in production, fetch from GraphQL)
return;
}
throw error;
}
// Update status based on action
let status: string;
switch (action) {
case 'opened':
status = 'Todo';
break;
case 'closed':
status = 'Done';
break;
case 'reopened':
status = 'In Progress';
break;
default:
console.log(`Unknown action: ${action}`);
return;
}
await client.updateStatus(itemId, status);
console.log(`Updated issue #${issueNumber} status to: ${status}`);
}
main().catch(console.error);
EOF
npx tsx update-status.ts