Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions .agents/skills/mpx2web-workspace/babel.config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
{
"presets": [
[
"@babel/preset-env",
{
"modules": false,
"shippedProposals": true
}
]
],
"plugins": [
[
"@babel/transform-runtime",
{
"corejs": 3,
"version": "^7.10.4"
}
],
"@mpxjs/babel-plugin-inject-page-events"
],
"sourceType": "unambiguous"
}
47 changes: 47 additions & 0 deletions .agents/skills/mpx2web-workspace/check_base.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
const fs = require('fs')
const path = require('path')

function resolveManifest (name, root) {
try {
return require.resolve(name + '/package.json', { paths: [root] })
} catch (error) {
if (error.code !== 'ERR_PACKAGE_PATH_NOT_EXPORTED') throw error
let directory = path.dirname(require.resolve(name, { paths: [root] }))
while (directory !== path.dirname(directory)) {
const manifest = path.join(directory, 'package.json')
if (fs.existsSync(manifest) && JSON.parse(fs.readFileSync(manifest, 'utf8')).name === name) return manifest
directory = path.dirname(directory)
}
throw error
}
}

function inspectBase (webRoot = __dirname, rnRoot = path.resolve(webRoot, '../mpx2rn-workspace')) {
const web = JSON.parse(fs.readFileSync(path.join(webRoot, 'package.json'), 'utf8'))
const rn = JSON.parse(fs.readFileSync(path.join(rnRoot, 'package.json'), 'utf8'))
const errors = []
const packages = []
for (const section of ['dependencies', 'devDependencies']) {
for (const [name, declared] of Object.entries(web[section])) {
if (rn[section][name] && rn[section][name] !== declared) errors.push(name + ': 与 RN 的依赖声明不一致')
try {
const resolved = resolveManifest(name, webRoot)
const installed = JSON.parse(fs.readFileSync(resolved, 'utf8'))
packages.push({ name, declared, installed: installed.version, source: fs.realpathSync(resolved) })
} catch (error) {
errors.push(name + ': 尚未安装/无法解析,不能视为编译环境可用')
}
}
}
const vue = packages.find(item => item.name === 'vue')
const renderer = packages.find(item => item.name === 'vue-server-renderer')
if (vue && renderer && vue.installed !== renderer.installed) errors.push('Vue 与 SSR renderer 必须匹配')
return { status: errors.length ? 'needs_setup' : 'ready', errors, packages, scope: '依赖声明对齐 RN;平台依赖独立安装。该检查不代表编译或运行通过。' }
}

module.exports = { inspectBase }
if (require.main === module) {
const result = inspectBase()
console.log(JSON.stringify(result, null, 2))
process.exitCode = result.errors.length ? 1 : 0
}
6 changes: 6 additions & 0 deletions .agents/skills/mpx2web-workspace/eslint.config.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import { mpxConfig } from '@mpxjs/eslint-config'

export default mpxConfig({
mpx: true,
typescript: true
})
7 changes: 7 additions & 0 deletions .agents/skills/mpx2web-workspace/iteration-12/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
__pycache__/
*.py[cod]
*.log
*.pid
.run.lock
*.tmp
.runtime-cache/
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
#!/usr/bin/env python3
"""Aggregate deterministic Mpx2Web grades with the shared skill-creator schema."""
import argparse
import json
from pathlib import Path
import run_evals as runner


def aggregate(model, effort, samples=1):
config, _ = runner.load_configs()
expected = []
for item in config['evals']:
case = runner.WORKSPACE / f"eval-{item['id']}-{item['name']}"
for group in ('mpx2web', 'no_skill'):
for number in range(1, samples + 1):
target = case / group / f'run-{number}' / 'grading.json'
if not target.is_file():
raise ValueError(f'missing grading: {target}')
grade = json.loads(target.read_text())
ids = [row['id'] for row in item['assertions']]
if [row.get('id') for row in grade.get('expectations', [])] != ids:
raise ValueError(f'stale grading assertions: {target}')
expected.append((item['id'], group, number))
base = runner.load_module('common_aggregate', runner.SKILL_CREATOR / 'scripts/aggregate_benchmark.py')
payload = base.generate_benchmark(runner.WORKSPACE, 'mpx2web', str(runner.PROJECT_ROOT / '.agents/skills/mpx2web'))
actual = [(row['eval_id'], row['configuration'], row['run_number']) for row in payload['runs']]
if set(actual) != set(expected) or len(actual) != len(expected):
raise ValueError('unexpected or mixed grading runs')
payload['metadata'].update(
executor_model=f'{model} ({effort})',
analyzer_model='deterministic Python checks',
suite_revision=config['suite_revision'],
grader_method=config['scoring']['grader_method'],
score_weighting='case mean, matching Mpx2RN iteration-17',
)
payload['notes'] = [
'评分方式与 Mpx2RN iteration-17 对齐:每条断言由 Python 确定性静态检查返回 PASS/FAIL。',
'汇总分对各 Case 的通过率取平均;不使用额外评分模型。',
'本 Benchmark 不执行构建、浏览器、SSR renderer、E2E 或真机验收。',
]
runner.write_json(runner.WORKSPACE / 'benchmark.json', payload)
markdown = base.generate_markdown(payload) + '\n'
(runner.WORKSPACE / 'benchmark.md').write_text(markdown)
(runner.WORKSPACE / 'result.md').write_text(markdown)
viewer = runner.load_module('common_viewer', runner.SKILL_CREATOR / 'eval-viewer/generate_review.py')
runs = viewer.find_runs(runner.WORKSPACE)
(runner.WORKSPACE / 'review.html').write_text(viewer.generate_html(runs, 'Mpx2Web 确定性静态评测', benchmark=payload))
return payload


def main():
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument('--model', required=True)
parser.add_argument('--reasoning-effort', required=True)
parser.add_argument('--samples', type=int, default=1)
args = parser.parse_args()
payload = aggregate(args.model, args.reasoning_effort, args.samples)
print(f"[complete] {runner.WORKSPACE / 'benchmark.md'}")
for group, values in payload['run_summary'].items():
if group != 'delta':
print(f"{group}: {values['pass_rate']['mean']:.2%}")


if __name__ == '__main__':
main()
Loading
Loading