aios-core 2.2.2 â 2.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.aios-core/.session/current-session.json +14 -14
- package/.aios-core/cli/commands/migrate/validate.js +1 -1
- package/.aios-core/core/docs/session-update-pattern.md +17 -10
- package/.aios-core/core/elicitation/elicitation-engine.js +11 -6
- package/.aios-core/core/elicitation/session-manager.js +2 -1
- package/.aios-core/core/registry/registry-schema.json +166 -166
- package/.aios-core/core/registry/service-registry.json +6585 -6585
- package/.aios-core/core-config.yaml +12 -1
- package/.aios-core/data/agent-config-requirements.yaml +5 -5
- package/.aios-core/development/agents/devops.md +12 -0
- package/.aios-core/development/scripts/squad/README.md +112 -0
- package/.aios-core/development/scripts/squad/index.js +41 -0
- package/.aios-core/development/scripts/squad/squad-loader.js +359 -0
- package/.aios-core/development/scripts/squad/squad-validator.js +685 -0
- package/.aios-core/development/tasks/add-mcp.md +11 -5
- package/.aios-core/development/tasks/search-mcp.md +309 -0
- package/.aios-core/development/tasks/setup-mcp-docker.md +11 -8
- package/.aios-core/development/tasks/squad-creator-validate.md +151 -0
- package/.aios-core/docs/standards/AGENT-PERSONALIZATION-STANDARD-V1.md +3 -3
- package/.aios-core/index.d.ts +7 -7
- package/.aios-core/index.js +1 -1
- package/.aios-core/infrastructure/scripts/batch-creator.js +1 -1
- package/.aios-core/infrastructure/scripts/component-generator.js +1 -1
- package/.aios-core/infrastructure/templates/coderabbit.yaml.template +279 -279
- package/.aios-core/infrastructure/templates/github-workflows/ci.yml.template +169 -169
- package/.aios-core/infrastructure/templates/github-workflows/pr-automation.yml.template +330 -330
- package/.aios-core/infrastructure/templates/github-workflows/release.yml.template +196 -196
- package/.aios-core/infrastructure/templates/gitignore/gitignore-aios-base.tmpl +63 -63
- package/.aios-core/infrastructure/templates/gitignore/gitignore-brownfield-merge.tmpl +18 -18
- package/.aios-core/infrastructure/templates/gitignore/gitignore-node.tmpl +85 -85
- package/.aios-core/infrastructure/templates/gitignore/gitignore-python.tmpl +145 -145
- package/.aios-core/infrastructure/tests/utilities-audit-results.json +500 -500
- package/.aios-core/infrastructure/tools/README.md +1 -1
- package/.aios-core/install-manifest.yaml +4 -1
- package/.aios-core/manifests/schema/manifest-schema.json +190 -190
- package/.aios-core/manifests/workers.csv +203 -203
- package/.aios-core/package.json +102 -102
- package/.aios-core/product/templates/activation-instructions-template.md +7 -7
- package/.aios-core/product/templates/adr.hbs +125 -125
- package/.aios-core/product/templates/component-react-tmpl.tsx +98 -98
- package/.aios-core/product/templates/dbdr.hbs +241 -241
- package/.aios-core/product/templates/engine/schemas/adr.schema.json +102 -102
- package/.aios-core/product/templates/engine/schemas/dbdr.schema.json +205 -205
- package/.aios-core/product/templates/engine/schemas/epic.schema.json +175 -175
- package/.aios-core/product/templates/engine/schemas/pmdr.schema.json +175 -175
- package/.aios-core/product/templates/engine/schemas/prd-v2.schema.json +300 -300
- package/.aios-core/product/templates/engine/schemas/prd.schema.json +152 -152
- package/.aios-core/product/templates/engine/schemas/story.schema.json +222 -222
- package/.aios-core/product/templates/engine/schemas/task.schema.json +154 -154
- package/.aios-core/product/templates/epic.hbs +212 -212
- package/.aios-core/product/templates/eslintrc-security.json +32 -32
- package/.aios-core/product/templates/github-actions-cd.yml +212 -212
- package/.aios-core/product/templates/github-actions-ci.yml +172 -172
- package/.aios-core/product/templates/pmdr.hbs +186 -186
- package/.aios-core/product/templates/prd-v2.0.hbs +216 -216
- package/.aios-core/product/templates/prd.hbs +201 -201
- package/.aios-core/product/templates/shock-report-tmpl.html +502 -502
- package/.aios-core/product/templates/story.hbs +263 -263
- package/.aios-core/product/templates/task.hbs +170 -170
- package/.aios-core/product/templates/tmpl-comment-on-examples.sql +158 -158
- package/.aios-core/product/templates/tmpl-migration-script.sql +91 -91
- package/.aios-core/product/templates/tmpl-rls-granular-policies.sql +104 -104
- package/.aios-core/product/templates/tmpl-rls-kiss-policy.sql +10 -10
- package/.aios-core/product/templates/tmpl-rls-roles.sql +135 -135
- package/.aios-core/product/templates/tmpl-rls-simple.sql +77 -77
- package/.aios-core/product/templates/tmpl-rls-tenant.sql +152 -152
- package/.aios-core/product/templates/tmpl-rollback-script.sql +77 -77
- package/.aios-core/product/templates/tmpl-seed-data.sql +140 -140
- package/.aios-core/product/templates/tmpl-smoke-test.sql +16 -16
- package/.aios-core/product/templates/tmpl-staging-copy-merge.sql +139 -139
- package/.aios-core/product/templates/tmpl-stored-proc.sql +140 -140
- package/.aios-core/product/templates/tmpl-trigger.sql +152 -152
- package/.aios-core/product/templates/tmpl-view-materialized.sql +133 -133
- package/.aios-core/product/templates/tmpl-view.sql +177 -177
- package/.aios-core/product/templates/token-exports-css-tmpl.css +240 -240
- package/.aios-core/quality/schemas/quality-metrics.schema.json +233 -233
- package/.aios-core/schemas/squad-schema.json +185 -0
- package/.aios-core/scripts/README.md +90 -322
- package/.aios-core/scripts/migrate-framework-docs.sh +300 -300
- package/.claude/rules/mcp-usage.md +116 -100
- package/LICENSE +48 -48
- package/README.md +3 -4
- package/bin/aios.js +2 -1
- package/package.json +1 -3
- package/packages/installer/package.json +39 -39
- package/templates/squad/LICENSE +21 -21
- package/templates/squad/README.md +37 -37
- package/templates/squad/agents/example-agent.yaml +36 -36
- package/templates/squad/package.json +19 -19
- package/templates/squad/squad.yaml +25 -25
- package/templates/squad/tasks/example-task.yaml +46 -46
- package/templates/squad/templates/example-template.md +24 -24
- package/templates/squad/tests/example-agent.test.js +53 -53
- package/templates/squad/workflows/example-workflow.yaml +54 -54
- package/tools/diagnose-npx-issue.ps1 +96 -96
- package/tools/quick-diagnose.cmd +85 -85
- package/tools/quick-diagnose.ps1 +117 -117
- package/.aios-core/core/data/agent-config-requirements.yaml +0 -368
- package/.aios-core/core/data/aios-kb.md +0 -924
- package/.aios-core/core/data/workflow-patterns.yaml +0 -267
- package/.aios-core/product/templates/1mcp-config.yaml +0 -225
- package/.aios-core/scripts/context-detector.js +0 -226
- package/.aios-core/scripts/elicitation-engine.js +0 -385
- package/.aios-core/scripts/elicitation-session-manager.js +0 -300
- package/.claude/CLAUDE.md +0 -221
|
@@ -1,330 +1,330 @@
|
|
|
1
|
-
# =============================================================================
|
|
2
|
-
# AIOS PR Automation Template
|
|
3
|
-
# =============================================================================
|
|
4
|
-
# Template for user projects created with AIOS-FULLSTACK
|
|
5
|
-
# Generated by: *setup-github task (Story 5.10)
|
|
6
|
-
#
|
|
7
|
-
# Features:
|
|
8
|
-
# - Required status checks (blocking)
|
|
9
|
-
# - Coverage report posted as PR comment
|
|
10
|
-
# - Quality gate summary comment
|
|
11
|
-
# - CodeRabbit integration status
|
|
12
|
-
# =============================================================================
|
|
13
|
-
|
|
14
|
-
name: PR Automation
|
|
15
|
-
|
|
16
|
-
on:
|
|
17
|
-
pull_request:
|
|
18
|
-
branches:
|
|
19
|
-
- main
|
|
20
|
-
- develop
|
|
21
|
-
types: [opened, synchronize, reopened]
|
|
22
|
-
|
|
23
|
-
permissions:
|
|
24
|
-
contents: read
|
|
25
|
-
pull-requests: write
|
|
26
|
-
checks: write
|
|
27
|
-
|
|
28
|
-
env:
|
|
29
|
-
NODE_VERSION: '{{NODE_VERSION}}'
|
|
30
|
-
|
|
31
|
-
jobs:
|
|
32
|
-
# ===========================================================================
|
|
33
|
-
# REQUIRED STATUS CHECKS (Blocking)
|
|
34
|
-
# ===========================================================================
|
|
35
|
-
|
|
36
|
-
lint:
|
|
37
|
-
name: Lint
|
|
38
|
-
runs-on: ubuntu-latest
|
|
39
|
-
timeout-minutes: 5
|
|
40
|
-
steps:
|
|
41
|
-
- name: Checkout code
|
|
42
|
-
uses: actions/checkout@v4
|
|
43
|
-
|
|
44
|
-
- name: Setup Node.js
|
|
45
|
-
uses: actions/setup-node@v4
|
|
46
|
-
with:
|
|
47
|
-
node-version: ${{ env.NODE_VERSION }}
|
|
48
|
-
cache: 'npm'
|
|
49
|
-
|
|
50
|
-
- name: Install dependencies
|
|
51
|
-
run: npm ci
|
|
52
|
-
|
|
53
|
-
- name: Run ESLint
|
|
54
|
-
run: {{LINT_COMMAND}}
|
|
55
|
-
|
|
56
|
-
typecheck:
|
|
57
|
-
name: TypeCheck
|
|
58
|
-
runs-on: ubuntu-latest
|
|
59
|
-
timeout-minutes: 5
|
|
60
|
-
steps:
|
|
61
|
-
- name: Checkout code
|
|
62
|
-
uses: actions/checkout@v4
|
|
63
|
-
|
|
64
|
-
- name: Setup Node.js
|
|
65
|
-
uses: actions/setup-node@v4
|
|
66
|
-
with:
|
|
67
|
-
node-version: ${{ env.NODE_VERSION }}
|
|
68
|
-
cache: 'npm'
|
|
69
|
-
|
|
70
|
-
- name: Install dependencies
|
|
71
|
-
run: npm ci
|
|
72
|
-
|
|
73
|
-
- name: Run TypeScript type checking
|
|
74
|
-
run: {{TYPECHECK_COMMAND}}
|
|
75
|
-
|
|
76
|
-
test:
|
|
77
|
-
name: Test
|
|
78
|
-
runs-on: ubuntu-latest
|
|
79
|
-
timeout-minutes: 10
|
|
80
|
-
outputs:
|
|
81
|
-
coverage-summary: ${{ steps.coverage.outputs.summary }}
|
|
82
|
-
steps:
|
|
83
|
-
- name: Checkout code
|
|
84
|
-
uses: actions/checkout@v4
|
|
85
|
-
|
|
86
|
-
- name: Setup Node.js
|
|
87
|
-
uses: actions/setup-node@v4
|
|
88
|
-
with:
|
|
89
|
-
node-version: ${{ env.NODE_VERSION }}
|
|
90
|
-
cache: 'npm'
|
|
91
|
-
|
|
92
|
-
- name: Install dependencies
|
|
93
|
-
run: npm ci
|
|
94
|
-
|
|
95
|
-
- name: Run tests with coverage
|
|
96
|
-
id: test-run
|
|
97
|
-
run: {{TEST_COMMAND}}
|
|
98
|
-
|
|
99
|
-
- name: Upload coverage to Codecov
|
|
100
|
-
uses: codecov/codecov-action@v4
|
|
101
|
-
with:
|
|
102
|
-
files: ./coverage/lcov.info
|
|
103
|
-
flags: unittests
|
|
104
|
-
fail_ci_if_error: false
|
|
105
|
-
|
|
106
|
-
- name: Extract coverage summary
|
|
107
|
-
id: coverage
|
|
108
|
-
run: |
|
|
109
|
-
if [ -f coverage/coverage-summary.json ]; then
|
|
110
|
-
LINES=$(jq '.total.lines.pct' coverage/coverage-summary.json)
|
|
111
|
-
STATEMENTS=$(jq '.total.statements.pct' coverage/coverage-summary.json)
|
|
112
|
-
BRANCHES=$(jq '.total.branches.pct' coverage/coverage-summary.json)
|
|
113
|
-
FUNCTIONS=$(jq '.total.functions.pct' coverage/coverage-summary.json)
|
|
114
|
-
echo "summary=Lines: ${LINES}% | Statements: ${STATEMENTS}% | Branches: ${BRANCHES}% | Functions: ${FUNCTIONS}%" >> $GITHUB_OUTPUT
|
|
115
|
-
else
|
|
116
|
-
echo "summary=Coverage report not available" >> $GITHUB_OUTPUT
|
|
117
|
-
fi
|
|
118
|
-
|
|
119
|
-
- name: Upload coverage artifact
|
|
120
|
-
uses: actions/upload-artifact@v4
|
|
121
|
-
with:
|
|
122
|
-
name: coverage-report
|
|
123
|
-
path: coverage/
|
|
124
|
-
retention-days: 7
|
|
125
|
-
|
|
126
|
-
# ===========================================================================
|
|
127
|
-
# COVERAGE COMMENT
|
|
128
|
-
# ===========================================================================
|
|
129
|
-
|
|
130
|
-
coverage-comment:
|
|
131
|
-
name: Coverage Comment
|
|
132
|
-
runs-on: ubuntu-latest
|
|
133
|
-
needs: [test]
|
|
134
|
-
if: always() && needs.test.result != 'cancelled'
|
|
135
|
-
steps:
|
|
136
|
-
- name: Post coverage comment
|
|
137
|
-
uses: actions/github-script@v7
|
|
138
|
-
with:
|
|
139
|
-
script: |
|
|
140
|
-
const coverageSummary = '${{ needs.test.outputs.coverage-summary }}' || 'Coverage data not available';
|
|
141
|
-
|
|
142
|
-
const body = `## đ Coverage Report
|
|
143
|
-
|
|
144
|
-
${coverageSummary}
|
|
145
|
-
|
|
146
|
-
<details>
|
|
147
|
-
<summary>Coverage Details</summary>
|
|
148
|
-
|
|
149
|
-
| Metric | Coverage |
|
|
150
|
-
|--------|----------|
|
|
151
|
-
| Lines | See Codecov |
|
|
152
|
-
| Branches | See Codecov |
|
|
153
|
-
| Functions | See Codecov |
|
|
154
|
-
| Statements | See Codecov |
|
|
155
|
-
|
|
156
|
-
</details>
|
|
157
|
-
|
|
158
|
-
> đ Full coverage report available in [Codecov](https://codecov.io/gh/${{ github.repository }}/pull/${{ github.event.pull_request.number }})
|
|
159
|
-
`;
|
|
160
|
-
|
|
161
|
-
// Find existing comment
|
|
162
|
-
const { data: comments } = await github.rest.issues.listComments({
|
|
163
|
-
owner: context.repo.owner,
|
|
164
|
-
repo: context.repo.repo,
|
|
165
|
-
issue_number: context.issue.number,
|
|
166
|
-
});
|
|
167
|
-
|
|
168
|
-
const botComment = comments.find(comment =>
|
|
169
|
-
comment.user.type === 'Bot' &&
|
|
170
|
-
comment.body.includes('đ Coverage Report')
|
|
171
|
-
);
|
|
172
|
-
|
|
173
|
-
if (botComment) {
|
|
174
|
-
await github.rest.issues.updateComment({
|
|
175
|
-
owner: context.repo.owner,
|
|
176
|
-
repo: context.repo.repo,
|
|
177
|
-
comment_id: botComment.id,
|
|
178
|
-
body: body
|
|
179
|
-
});
|
|
180
|
-
} else {
|
|
181
|
-
await github.rest.issues.createComment({
|
|
182
|
-
owner: context.repo.owner,
|
|
183
|
-
repo: context.repo.repo,
|
|
184
|
-
issue_number: context.issue.number,
|
|
185
|
-
body: body
|
|
186
|
-
});
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
# ===========================================================================
|
|
190
|
-
# QUALITY SUMMARY
|
|
191
|
-
# ===========================================================================
|
|
192
|
-
|
|
193
|
-
quality-summary:
|
|
194
|
-
name: Quality Summary
|
|
195
|
-
runs-on: ubuntu-latest
|
|
196
|
-
needs: [lint, typecheck, test]
|
|
197
|
-
if: always()
|
|
198
|
-
steps:
|
|
199
|
-
- name: Generate quality summary
|
|
200
|
-
uses: actions/github-script@v7
|
|
201
|
-
with:
|
|
202
|
-
script: |
|
|
203
|
-
const lintResult = '${{ needs.lint.result }}';
|
|
204
|
-
const typecheckResult = '${{ needs.typecheck.result }}';
|
|
205
|
-
const testResult = '${{ needs.test.result }}';
|
|
206
|
-
|
|
207
|
-
const getEmoji = (result) => {
|
|
208
|
-
switch(result) {
|
|
209
|
-
case 'success': return 'â
';
|
|
210
|
-
case 'failure': return 'â';
|
|
211
|
-
case 'cancelled': return 'âšī¸';
|
|
212
|
-
case 'skipped': return 'âī¸';
|
|
213
|
-
default: return 'âŗ';
|
|
214
|
-
}
|
|
215
|
-
};
|
|
216
|
-
|
|
217
|
-
const allPassed = lintResult === 'success' &&
|
|
218
|
-
typecheckResult === 'success' &&
|
|
219
|
-
testResult === 'success';
|
|
220
|
-
|
|
221
|
-
const overallStatus = allPassed ? 'â
All checks passed' : 'â Some checks failed';
|
|
222
|
-
|
|
223
|
-
const body = `## đ Quality Gate Summary
|
|
224
|
-
|
|
225
|
-
**Overall Status:** ${overallStatus}
|
|
226
|
-
|
|
227
|
-
| Check | Status | Result |
|
|
228
|
-
|-------|--------|--------|
|
|
229
|
-
| Lint | ${getEmoji(lintResult)} | ${lintResult} |
|
|
230
|
-
| TypeCheck | ${getEmoji(typecheckResult)} | ${typecheckResult} |
|
|
231
|
-
| Tests | ${getEmoji(testResult)} | ${testResult} |
|
|
232
|
-
|
|
233
|
-
### Required for Merge
|
|
234
|
-
- ${getEmoji(lintResult)} ESLint validation
|
|
235
|
-
- ${getEmoji(typecheckResult)} TypeScript type checking
|
|
236
|
-
- ${getEmoji(testResult)} Test suite passing
|
|
237
|
-
|
|
238
|
-
### CodeRabbit Review
|
|
239
|
-
đ° CodeRabbit will provide automated code review comments separately.
|
|
240
|
-
- **CRITICAL** issues must be resolved before merge
|
|
241
|
-
- **HIGH** issues should be addressed or documented
|
|
242
|
-
|
|
243
|
-
---
|
|
244
|
-
*Generated by AIOS PR Automation*
|
|
245
|
-
`;
|
|
246
|
-
|
|
247
|
-
// Find existing comment
|
|
248
|
-
const { data: comments } = await github.rest.issues.listComments({
|
|
249
|
-
owner: context.repo.owner,
|
|
250
|
-
repo: context.repo.repo,
|
|
251
|
-
issue_number: context.issue.number,
|
|
252
|
-
});
|
|
253
|
-
|
|
254
|
-
const botComment = comments.find(comment =>
|
|
255
|
-
comment.user.type === 'Bot' &&
|
|
256
|
-
comment.body.includes('đ Quality Gate Summary')
|
|
257
|
-
);
|
|
258
|
-
|
|
259
|
-
if (botComment) {
|
|
260
|
-
await github.rest.issues.updateComment({
|
|
261
|
-
owner: context.repo.owner,
|
|
262
|
-
repo: context.repo.repo,
|
|
263
|
-
comment_id: botComment.id,
|
|
264
|
-
body: body
|
|
265
|
-
});
|
|
266
|
-
} else {
|
|
267
|
-
await github.rest.issues.createComment({
|
|
268
|
-
owner: context.repo.owner,
|
|
269
|
-
repo: context.repo.repo,
|
|
270
|
-
issue_number: context.issue.number,
|
|
271
|
-
body: body
|
|
272
|
-
});
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
- name: Set final status
|
|
276
|
-
if: always()
|
|
277
|
-
run: |
|
|
278
|
-
LINT="${{ needs.lint.result }}"
|
|
279
|
-
TYPE="${{ needs.typecheck.result }}"
|
|
280
|
-
TEST="${{ needs.test.result }}"
|
|
281
|
-
|
|
282
|
-
echo "=== PR Quality Gate Summary ==="
|
|
283
|
-
echo "Lint: $LINT"
|
|
284
|
-
echo "TypeCheck: $TYPE"
|
|
285
|
-
echo "Tests: $TEST"
|
|
286
|
-
|
|
287
|
-
if [ "$LINT" != "success" ] || [ "$TYPE" != "success" ] || [ "$TEST" != "success" ]; then
|
|
288
|
-
echo "â Quality gate failed - merge will be blocked"
|
|
289
|
-
exit 1
|
|
290
|
-
fi
|
|
291
|
-
|
|
292
|
-
echo "â
All quality gates passed - ready for review"
|
|
293
|
-
|
|
294
|
-
# ===========================================================================
|
|
295
|
-
# CODERABBIT STATUS CHECK
|
|
296
|
-
# ===========================================================================
|
|
297
|
-
|
|
298
|
-
coderabbit-check:
|
|
299
|
-
name: CodeRabbit Status
|
|
300
|
-
runs-on: ubuntu-latest
|
|
301
|
-
needs: [lint, typecheck, test]
|
|
302
|
-
if: always()
|
|
303
|
-
steps:
|
|
304
|
-
- name: Check CodeRabbit configuration
|
|
305
|
-
run: |
|
|
306
|
-
echo "đ° CodeRabbit Integration Status"
|
|
307
|
-
echo "================================"
|
|
308
|
-
echo ""
|
|
309
|
-
echo "CodeRabbit is configured via .coderabbit.yaml"
|
|
310
|
-
echo "Review will be posted as PR comments automatically"
|
|
311
|
-
echo ""
|
|
312
|
-
echo "Severity Handling:"
|
|
313
|
-
echo " - CRITICAL: Must fix before merge"
|
|
314
|
-
echo " - HIGH: Should address or document"
|
|
315
|
-
echo " - MEDIUM/LOW: Optional"
|
|
316
|
-
|
|
317
|
-
- name: Checkout for config check
|
|
318
|
-
uses: actions/checkout@v4
|
|
319
|
-
with:
|
|
320
|
-
sparse-checkout: .coderabbit.yaml
|
|
321
|
-
sparse-checkout-cone-mode: false
|
|
322
|
-
|
|
323
|
-
- name: Validate config
|
|
324
|
-
run: |
|
|
325
|
-
if [ -f ".coderabbit.yaml" ]; then
|
|
326
|
-
echo "â
CodeRabbit configuration found"
|
|
327
|
-
else
|
|
328
|
-
echo "â ī¸ CodeRabbit configuration not found"
|
|
329
|
-
echo "Create .coderabbit.yaml to customize review behavior"
|
|
330
|
-
fi
|
|
1
|
+
# =============================================================================
|
|
2
|
+
# AIOS PR Automation Template
|
|
3
|
+
# =============================================================================
|
|
4
|
+
# Template for user projects created with AIOS-FULLSTACK
|
|
5
|
+
# Generated by: *setup-github task (Story 5.10)
|
|
6
|
+
#
|
|
7
|
+
# Features:
|
|
8
|
+
# - Required status checks (blocking)
|
|
9
|
+
# - Coverage report posted as PR comment
|
|
10
|
+
# - Quality gate summary comment
|
|
11
|
+
# - CodeRabbit integration status
|
|
12
|
+
# =============================================================================
|
|
13
|
+
|
|
14
|
+
name: PR Automation
|
|
15
|
+
|
|
16
|
+
on:
|
|
17
|
+
pull_request:
|
|
18
|
+
branches:
|
|
19
|
+
- main
|
|
20
|
+
- develop
|
|
21
|
+
types: [opened, synchronize, reopened]
|
|
22
|
+
|
|
23
|
+
permissions:
|
|
24
|
+
contents: read
|
|
25
|
+
pull-requests: write
|
|
26
|
+
checks: write
|
|
27
|
+
|
|
28
|
+
env:
|
|
29
|
+
NODE_VERSION: '{{NODE_VERSION}}'
|
|
30
|
+
|
|
31
|
+
jobs:
|
|
32
|
+
# ===========================================================================
|
|
33
|
+
# REQUIRED STATUS CHECKS (Blocking)
|
|
34
|
+
# ===========================================================================
|
|
35
|
+
|
|
36
|
+
lint:
|
|
37
|
+
name: Lint
|
|
38
|
+
runs-on: ubuntu-latest
|
|
39
|
+
timeout-minutes: 5
|
|
40
|
+
steps:
|
|
41
|
+
- name: Checkout code
|
|
42
|
+
uses: actions/checkout@v4
|
|
43
|
+
|
|
44
|
+
- name: Setup Node.js
|
|
45
|
+
uses: actions/setup-node@v4
|
|
46
|
+
with:
|
|
47
|
+
node-version: ${{ env.NODE_VERSION }}
|
|
48
|
+
cache: 'npm'
|
|
49
|
+
|
|
50
|
+
- name: Install dependencies
|
|
51
|
+
run: npm ci
|
|
52
|
+
|
|
53
|
+
- name: Run ESLint
|
|
54
|
+
run: {{LINT_COMMAND}}
|
|
55
|
+
|
|
56
|
+
typecheck:
|
|
57
|
+
name: TypeCheck
|
|
58
|
+
runs-on: ubuntu-latest
|
|
59
|
+
timeout-minutes: 5
|
|
60
|
+
steps:
|
|
61
|
+
- name: Checkout code
|
|
62
|
+
uses: actions/checkout@v4
|
|
63
|
+
|
|
64
|
+
- name: Setup Node.js
|
|
65
|
+
uses: actions/setup-node@v4
|
|
66
|
+
with:
|
|
67
|
+
node-version: ${{ env.NODE_VERSION }}
|
|
68
|
+
cache: 'npm'
|
|
69
|
+
|
|
70
|
+
- name: Install dependencies
|
|
71
|
+
run: npm ci
|
|
72
|
+
|
|
73
|
+
- name: Run TypeScript type checking
|
|
74
|
+
run: {{TYPECHECK_COMMAND}}
|
|
75
|
+
|
|
76
|
+
test:
|
|
77
|
+
name: Test
|
|
78
|
+
runs-on: ubuntu-latest
|
|
79
|
+
timeout-minutes: 10
|
|
80
|
+
outputs:
|
|
81
|
+
coverage-summary: ${{ steps.coverage.outputs.summary }}
|
|
82
|
+
steps:
|
|
83
|
+
- name: Checkout code
|
|
84
|
+
uses: actions/checkout@v4
|
|
85
|
+
|
|
86
|
+
- name: Setup Node.js
|
|
87
|
+
uses: actions/setup-node@v4
|
|
88
|
+
with:
|
|
89
|
+
node-version: ${{ env.NODE_VERSION }}
|
|
90
|
+
cache: 'npm'
|
|
91
|
+
|
|
92
|
+
- name: Install dependencies
|
|
93
|
+
run: npm ci
|
|
94
|
+
|
|
95
|
+
- name: Run tests with coverage
|
|
96
|
+
id: test-run
|
|
97
|
+
run: {{TEST_COMMAND}}
|
|
98
|
+
|
|
99
|
+
- name: Upload coverage to Codecov
|
|
100
|
+
uses: codecov/codecov-action@v4
|
|
101
|
+
with:
|
|
102
|
+
files: ./coverage/lcov.info
|
|
103
|
+
flags: unittests
|
|
104
|
+
fail_ci_if_error: false
|
|
105
|
+
|
|
106
|
+
- name: Extract coverage summary
|
|
107
|
+
id: coverage
|
|
108
|
+
run: |
|
|
109
|
+
if [ -f coverage/coverage-summary.json ]; then
|
|
110
|
+
LINES=$(jq '.total.lines.pct' coverage/coverage-summary.json)
|
|
111
|
+
STATEMENTS=$(jq '.total.statements.pct' coverage/coverage-summary.json)
|
|
112
|
+
BRANCHES=$(jq '.total.branches.pct' coverage/coverage-summary.json)
|
|
113
|
+
FUNCTIONS=$(jq '.total.functions.pct' coverage/coverage-summary.json)
|
|
114
|
+
echo "summary=Lines: ${LINES}% | Statements: ${STATEMENTS}% | Branches: ${BRANCHES}% | Functions: ${FUNCTIONS}%" >> $GITHUB_OUTPUT
|
|
115
|
+
else
|
|
116
|
+
echo "summary=Coverage report not available" >> $GITHUB_OUTPUT
|
|
117
|
+
fi
|
|
118
|
+
|
|
119
|
+
- name: Upload coverage artifact
|
|
120
|
+
uses: actions/upload-artifact@v4
|
|
121
|
+
with:
|
|
122
|
+
name: coverage-report
|
|
123
|
+
path: coverage/
|
|
124
|
+
retention-days: 7
|
|
125
|
+
|
|
126
|
+
# ===========================================================================
|
|
127
|
+
# COVERAGE COMMENT
|
|
128
|
+
# ===========================================================================
|
|
129
|
+
|
|
130
|
+
coverage-comment:
|
|
131
|
+
name: Coverage Comment
|
|
132
|
+
runs-on: ubuntu-latest
|
|
133
|
+
needs: [test]
|
|
134
|
+
if: always() && needs.test.result != 'cancelled'
|
|
135
|
+
steps:
|
|
136
|
+
- name: Post coverage comment
|
|
137
|
+
uses: actions/github-script@v7
|
|
138
|
+
with:
|
|
139
|
+
script: |
|
|
140
|
+
const coverageSummary = '${{ needs.test.outputs.coverage-summary }}' || 'Coverage data not available';
|
|
141
|
+
|
|
142
|
+
const body = `## đ Coverage Report
|
|
143
|
+
|
|
144
|
+
${coverageSummary}
|
|
145
|
+
|
|
146
|
+
<details>
|
|
147
|
+
<summary>Coverage Details</summary>
|
|
148
|
+
|
|
149
|
+
| Metric | Coverage |
|
|
150
|
+
|--------|----------|
|
|
151
|
+
| Lines | See Codecov |
|
|
152
|
+
| Branches | See Codecov |
|
|
153
|
+
| Functions | See Codecov |
|
|
154
|
+
| Statements | See Codecov |
|
|
155
|
+
|
|
156
|
+
</details>
|
|
157
|
+
|
|
158
|
+
> đ Full coverage report available in [Codecov](https://codecov.io/gh/${{ github.repository }}/pull/${{ github.event.pull_request.number }})
|
|
159
|
+
`;
|
|
160
|
+
|
|
161
|
+
// Find existing comment
|
|
162
|
+
const { data: comments } = await github.rest.issues.listComments({
|
|
163
|
+
owner: context.repo.owner,
|
|
164
|
+
repo: context.repo.repo,
|
|
165
|
+
issue_number: context.issue.number,
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
const botComment = comments.find(comment =>
|
|
169
|
+
comment.user.type === 'Bot' &&
|
|
170
|
+
comment.body.includes('đ Coverage Report')
|
|
171
|
+
);
|
|
172
|
+
|
|
173
|
+
if (botComment) {
|
|
174
|
+
await github.rest.issues.updateComment({
|
|
175
|
+
owner: context.repo.owner,
|
|
176
|
+
repo: context.repo.repo,
|
|
177
|
+
comment_id: botComment.id,
|
|
178
|
+
body: body
|
|
179
|
+
});
|
|
180
|
+
} else {
|
|
181
|
+
await github.rest.issues.createComment({
|
|
182
|
+
owner: context.repo.owner,
|
|
183
|
+
repo: context.repo.repo,
|
|
184
|
+
issue_number: context.issue.number,
|
|
185
|
+
body: body
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
# ===========================================================================
|
|
190
|
+
# QUALITY SUMMARY
|
|
191
|
+
# ===========================================================================
|
|
192
|
+
|
|
193
|
+
quality-summary:
|
|
194
|
+
name: Quality Summary
|
|
195
|
+
runs-on: ubuntu-latest
|
|
196
|
+
needs: [lint, typecheck, test]
|
|
197
|
+
if: always()
|
|
198
|
+
steps:
|
|
199
|
+
- name: Generate quality summary
|
|
200
|
+
uses: actions/github-script@v7
|
|
201
|
+
with:
|
|
202
|
+
script: |
|
|
203
|
+
const lintResult = '${{ needs.lint.result }}';
|
|
204
|
+
const typecheckResult = '${{ needs.typecheck.result }}';
|
|
205
|
+
const testResult = '${{ needs.test.result }}';
|
|
206
|
+
|
|
207
|
+
const getEmoji = (result) => {
|
|
208
|
+
switch(result) {
|
|
209
|
+
case 'success': return 'â
';
|
|
210
|
+
case 'failure': return 'â';
|
|
211
|
+
case 'cancelled': return 'âšī¸';
|
|
212
|
+
case 'skipped': return 'âī¸';
|
|
213
|
+
default: return 'âŗ';
|
|
214
|
+
}
|
|
215
|
+
};
|
|
216
|
+
|
|
217
|
+
const allPassed = lintResult === 'success' &&
|
|
218
|
+
typecheckResult === 'success' &&
|
|
219
|
+
testResult === 'success';
|
|
220
|
+
|
|
221
|
+
const overallStatus = allPassed ? 'â
All checks passed' : 'â Some checks failed';
|
|
222
|
+
|
|
223
|
+
const body = `## đ Quality Gate Summary
|
|
224
|
+
|
|
225
|
+
**Overall Status:** ${overallStatus}
|
|
226
|
+
|
|
227
|
+
| Check | Status | Result |
|
|
228
|
+
|-------|--------|--------|
|
|
229
|
+
| Lint | ${getEmoji(lintResult)} | ${lintResult} |
|
|
230
|
+
| TypeCheck | ${getEmoji(typecheckResult)} | ${typecheckResult} |
|
|
231
|
+
| Tests | ${getEmoji(testResult)} | ${testResult} |
|
|
232
|
+
|
|
233
|
+
### Required for Merge
|
|
234
|
+
- ${getEmoji(lintResult)} ESLint validation
|
|
235
|
+
- ${getEmoji(typecheckResult)} TypeScript type checking
|
|
236
|
+
- ${getEmoji(testResult)} Test suite passing
|
|
237
|
+
|
|
238
|
+
### CodeRabbit Review
|
|
239
|
+
đ° CodeRabbit will provide automated code review comments separately.
|
|
240
|
+
- **CRITICAL** issues must be resolved before merge
|
|
241
|
+
- **HIGH** issues should be addressed or documented
|
|
242
|
+
|
|
243
|
+
---
|
|
244
|
+
*Generated by AIOS PR Automation*
|
|
245
|
+
`;
|
|
246
|
+
|
|
247
|
+
// Find existing comment
|
|
248
|
+
const { data: comments } = await github.rest.issues.listComments({
|
|
249
|
+
owner: context.repo.owner,
|
|
250
|
+
repo: context.repo.repo,
|
|
251
|
+
issue_number: context.issue.number,
|
|
252
|
+
});
|
|
253
|
+
|
|
254
|
+
const botComment = comments.find(comment =>
|
|
255
|
+
comment.user.type === 'Bot' &&
|
|
256
|
+
comment.body.includes('đ Quality Gate Summary')
|
|
257
|
+
);
|
|
258
|
+
|
|
259
|
+
if (botComment) {
|
|
260
|
+
await github.rest.issues.updateComment({
|
|
261
|
+
owner: context.repo.owner,
|
|
262
|
+
repo: context.repo.repo,
|
|
263
|
+
comment_id: botComment.id,
|
|
264
|
+
body: body
|
|
265
|
+
});
|
|
266
|
+
} else {
|
|
267
|
+
await github.rest.issues.createComment({
|
|
268
|
+
owner: context.repo.owner,
|
|
269
|
+
repo: context.repo.repo,
|
|
270
|
+
issue_number: context.issue.number,
|
|
271
|
+
body: body
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
- name: Set final status
|
|
276
|
+
if: always()
|
|
277
|
+
run: |
|
|
278
|
+
LINT="${{ needs.lint.result }}"
|
|
279
|
+
TYPE="${{ needs.typecheck.result }}"
|
|
280
|
+
TEST="${{ needs.test.result }}"
|
|
281
|
+
|
|
282
|
+
echo "=== PR Quality Gate Summary ==="
|
|
283
|
+
echo "Lint: $LINT"
|
|
284
|
+
echo "TypeCheck: $TYPE"
|
|
285
|
+
echo "Tests: $TEST"
|
|
286
|
+
|
|
287
|
+
if [ "$LINT" != "success" ] || [ "$TYPE" != "success" ] || [ "$TEST" != "success" ]; then
|
|
288
|
+
echo "â Quality gate failed - merge will be blocked"
|
|
289
|
+
exit 1
|
|
290
|
+
fi
|
|
291
|
+
|
|
292
|
+
echo "â
All quality gates passed - ready for review"
|
|
293
|
+
|
|
294
|
+
# ===========================================================================
|
|
295
|
+
# CODERABBIT STATUS CHECK
|
|
296
|
+
# ===========================================================================
|
|
297
|
+
|
|
298
|
+
coderabbit-check:
|
|
299
|
+
name: CodeRabbit Status
|
|
300
|
+
runs-on: ubuntu-latest
|
|
301
|
+
needs: [lint, typecheck, test]
|
|
302
|
+
if: always()
|
|
303
|
+
steps:
|
|
304
|
+
- name: Check CodeRabbit configuration
|
|
305
|
+
run: |
|
|
306
|
+
echo "đ° CodeRabbit Integration Status"
|
|
307
|
+
echo "================================"
|
|
308
|
+
echo ""
|
|
309
|
+
echo "CodeRabbit is configured via .coderabbit.yaml"
|
|
310
|
+
echo "Review will be posted as PR comments automatically"
|
|
311
|
+
echo ""
|
|
312
|
+
echo "Severity Handling:"
|
|
313
|
+
echo " - CRITICAL: Must fix before merge"
|
|
314
|
+
echo " - HIGH: Should address or document"
|
|
315
|
+
echo " - MEDIUM/LOW: Optional"
|
|
316
|
+
|
|
317
|
+
- name: Checkout for config check
|
|
318
|
+
uses: actions/checkout@v4
|
|
319
|
+
with:
|
|
320
|
+
sparse-checkout: .coderabbit.yaml
|
|
321
|
+
sparse-checkout-cone-mode: false
|
|
322
|
+
|
|
323
|
+
- name: Validate config
|
|
324
|
+
run: |
|
|
325
|
+
if [ -f ".coderabbit.yaml" ]; then
|
|
326
|
+
echo "â
CodeRabbit configuration found"
|
|
327
|
+
else
|
|
328
|
+
echo "â ī¸ CodeRabbit configuration not found"
|
|
329
|
+
echo "Create .coderabbit.yaml to customize review behavior"
|
|
330
|
+
fi
|