91 lines
2.7 KiB
YAML
91 lines
2.7 KiB
YAML
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
|