Files
metabuilder/.github/workflows/quality/planning.yml
2026-01-03 21:15:21 +00:00

219 lines
10 KiB
YAML

name: Planning & Design
on:
issues:
types: [opened, labeled]
permissions:
contents: read
issues: write
jobs:
architecture-review:
name: Architecture & Design Review
runs-on: ubuntu-latest
if: |
github.event.action == 'labeled' &&
(github.event.label.name == 'enhancement' || github.event.label.name == 'feature-request')
steps:
- name: Checkout code
uses: actions/checkout@v6
- name: Review against architecture principles
uses: actions/github-script@v7
with:
script: |
const issue = context.payload.issue;
const title = issue.title;
const body = issue.body || '';
let suggestions = [];
let questions = [];
// Check if feature aligns with declarative approach
if (body.toLowerCase().includes('component') && !body.toLowerCase().includes('json')) {
suggestions.push('💡 Consider implementing this as a **declarative component** using JSON configuration and Lua scripts instead of a TypeScript file.');
}
// Check if database schema is mentioned
if (!body.toLowerCase().includes('database') && !body.toLowerCase().includes('schema')) {
questions.push('🤔 Will this feature require database schema changes? Consider adding Prisma schema details.');
}
// Check if package structure is considered
if (body.toLowerCase().includes('new') && !body.toLowerCase().includes('package')) {
suggestions.push('📦 This might be a good candidate for a **package-based implementation** with isolated seed data.');
}
// Check for multi-tenant considerations
if (!body.toLowerCase().includes('tenant') && !body.toLowerCase().includes('supergod')) {
questions.push('🏢 How should this feature work across different **tenants**? Should it be tenant-specific or global?');
}
// Check for permission levels
if (!body.toLowerCase().match(/level [1-5]|user|admin|god|supergod/)) {
questions.push('🔐 Which **permission levels** should have access to this feature? (user/admin/god/supergod)');
}
// Check for Lua consideration
if (body.toLowerCase().includes('logic') && !body.toLowerCase().includes('lua')) {
suggestions.push('🌙 Consider implementing business logic in **Lua scripts** for better flexibility and sandboxing.');
}
let comment = `## 🏗️ Architecture Review\n\n`;
comment += `Thank you for proposing this enhancement! Here's an architectural review:\n\n`;
if (suggestions.length > 0) {
comment += `### 💡 Architectural Suggestions\n\n`;
suggestions.forEach(s => comment += `${s}\n\n`);
}
if (questions.length > 0) {
comment += `### 🤔 Questions to Consider\n\n`;
questions.forEach(q => comment += `${q}\n\n`);
}
comment += `### ✅ Design Checklist\n\n`;
comment += `- [ ] Database schema changes identified\n`;
comment += `- [ ] Package structure planned (if applicable)\n`;
comment += `- [ ] Multi-tenant implications considered\n`;
comment += `- [ ] Permission levels defined\n`;
comment += `- [ ] Declarative approach preferred over imperative\n`;
comment += `- [ ] Component size kept under 150 LOC\n`;
comment += `- [ ] Security implications reviewed\n`;
comment += `- [ ] Testing strategy outlined\n\n`;
comment += `---\n`;
comment += `**@copilot** can help implement this feature following these architectural principles.\n\n`;
comment += `📖 See [Copilot Instructions](/.github/copilot-instructions.md) for development guidelines.`;
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issue.number,
body: comment
});
prd-check:
name: Check PRD Alignment
runs-on: ubuntu-latest
if: github.event.action == 'labeled' && github.event.label.name == 'enhancement'
steps:
- name: Checkout code
uses: actions/checkout@v6
- name: Check PRD for similar features
uses: actions/github-script@v7
with:
script: |
const fs = require('fs');
const issue = context.payload.issue;
try {
const prd = fs.readFileSync('docs/getting-started/PRD.md', 'utf8');
// Extract key terms from issue
const issueText = (issue.title + ' ' + issue.body).toLowerCase();
const keywords = ['level', 'god', 'tenant', 'package', 'component', 'workflow', 'lua', 'declarative'];
const foundKeywords = keywords.filter(k => issueText.includes(k));
let comment = `## 📋 PRD Alignment Check\n\n`;
if (foundKeywords.length > 0) {
comment += `This feature relates to the following PRD concepts: **${foundKeywords.join(', ')}**\n\n`;
comment += `Please review [docs/getting-started/PRD.md](/docs/getting-started/PRD.md) to ensure alignment with the project mission and existing features.\n\n`;
}
comment += `### 🎯 Mission Statement\n\n`;
comment += `MetaBuilder aims to be a "fully declarative, procedurally-generated multi-tenant application platform where 95% of functionality is defined through JSON and Lua."\n\n`;
comment += `Does this feature support that mission? If so, how?\n\n`;
comment += `---\n`;
comment += `**@copilot** Review the PRD and suggest implementation approach.`;
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issue.number,
body: comment
});
} catch (e) {
console.log('Could not read PRD.md:', e.message);
}
suggest-implementation:
name: Suggest Implementation Approach
runs-on: ubuntu-latest
if: |
github.event.action == 'labeled' &&
github.event.label.name == 'ready-to-implement'
steps:
- name: Checkout code
uses: actions/checkout@v6
- name: Generate implementation suggestion
uses: actions/github-script@v7
with:
script: |
const issue = context.payload.issue;
let comment = `## 🛠️ Implementation Guidance\n\n`;
comment += `This issue is ready for implementation! Here's a suggested approach:\n\n`;
comment += `### 📝 Step-by-Step Plan\n\n`;
comment += `1. **Planning Phase**\n`;
comment += ` - [ ] Review PRD.md and update if needed\n`;
comment += ` - [ ] Check existing package structure\n`;
comment += ` - [ ] Design database schema changes (if any)\n`;
comment += ` - [ ] Sketch component hierarchy\n\n`;
comment += `2. **Database Phase**\n`;
comment += ` - [ ] Update \`prisma/schema.prisma\`\n`;
comment += ` - [ ] Run \`npm run db:generate\`\n`;
comment += ` - [ ] Create or update seed data\n`;
comment += ` - [ ] Test database operations\n\n`;
comment += `3. **Implementation Phase**\n`;
comment += ` - [ ] Create package structure (if new package)\n`;
comment += ` - [ ] Build generic renderers (prefer over specific components)\n`;
comment += ` - [ ] Add Lua scripts for business logic\n`;
comment += ` - [ ] Wire up UI components\n`;
comment += ` - [ ] Ensure components are <150 LOC\n\n`;
comment += `4. **Testing Phase**\n`;
comment += ` - [ ] Run \`npm run lint\` and fix issues\n`;
comment += ` - [ ] Add E2E tests in \`e2e/\` directory\n`;
comment += ` - [ ] Test at all permission levels\n`;
comment += ` - [ ] Verify multi-tenant isolation\n`;
comment += ` - [ ] Test package import/export\n\n`;
comment += `5. **Documentation Phase**\n`;
comment += ` - [ ] Update PRD.md with feature details\n`;
comment += ` - [ ] Document Lua APIs if new\n`;
comment += ` - [ ] Add usage examples\n`;
comment += ` - [ ] Update workflow docs if needed\n\n`;
comment += `### 🤖 Copilot Assistance\n\n`;
comment += `**@copilot** can help with:\n`;
comment += `- Generating Prisma schema definitions\n`;
comment += `- Creating seed data JSON structures\n`;
comment += `- Writing Lua script templates\n`;
comment += `- Building generic component renderers\n`;
comment += `- Writing E2E tests\n\n`;
comment += `### 🔗 Useful Resources\n\n`;
comment += `- [Copilot Instructions](/.github/copilot-instructions.md)\n`;
comment += `- [PRD](/.github/../PRD.md)\n`;
comment += `- [Workflow Testing](/.github/workflows/README.md)\n`;
comment += `- [Package Structure](/packages/)\n\n`;
comment += `Ready to start? Create a branch: \`feature/issue-${issue.number}\``;
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issue.number,
body: comment
});