feat: 初始化 SCALE OS 工程框架
- 添加 SCALE Engine 配置 (.scale/) - 添加 OpenClaw Agent 配置 (.openclaw/) - 添加知识文档 (AGENTS.md, TOOLS.md) - 添加质量契约和工作流配置 - 添加 22 个工作流模板 - 添加验证脚本和门控脚本 - 添加 skills-registry 技能注册表
This commit is contained in:
7
.scale/.gitignore
vendored
Normal file
7
.scale/.gitignore
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
*.db
|
||||
*.db-journal
|
||||
events/
|
||||
checkpoints/
|
||||
evidence/
|
||||
state/
|
||||
hooks/*.sh
|
||||
4
.scale/assets.json
Normal file
4
.scale/assets.json
Normal file
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"version": 1,
|
||||
"assets": []
|
||||
}
|
||||
6
.scale/engineering-standards-baseline.json
Normal file
6
.scale/engineering-standards-baseline.json
Normal file
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"version": 1,
|
||||
"generatedAt": "",
|
||||
"scope": "Legacy findings tracked separately. New findings and changed-file findings must still be fixed before completion.",
|
||||
"findings": []
|
||||
}
|
||||
67
.scale/engineering-standards.json
Normal file
67
.scale/engineering-standards.json
Normal file
@@ -0,0 +1,67 @@
|
||||
{
|
||||
"version": 1,
|
||||
"mode": "warn",
|
||||
"sourceDirectories": [
|
||||
"src",
|
||||
"app",
|
||||
"packages",
|
||||
"services",
|
||||
"cmd",
|
||||
"internal",
|
||||
"pkg"
|
||||
],
|
||||
"ignoredDirectories": [
|
||||
".git",
|
||||
".scale",
|
||||
"node_modules",
|
||||
"dist",
|
||||
"build",
|
||||
"coverage",
|
||||
"test-results",
|
||||
"playwright-report",
|
||||
"tmp",
|
||||
"temp",
|
||||
"docs",
|
||||
"tests",
|
||||
"__tests__",
|
||||
"e2e"
|
||||
],
|
||||
"allowedConsoleDirectories": [
|
||||
"src/api",
|
||||
"src/cli",
|
||||
"scripts"
|
||||
],
|
||||
"allowedConsoleFiles": [
|
||||
"src/dashboard/DashboardServer.ts"
|
||||
],
|
||||
"maxFileLines": 500,
|
||||
"logging": {
|
||||
"approvedLoggers": [
|
||||
"pino",
|
||||
"winston",
|
||||
"zap",
|
||||
"zerolog",
|
||||
"logrus",
|
||||
"slog"
|
||||
],
|
||||
"sensitiveFields": [
|
||||
"password",
|
||||
"passwd",
|
||||
"token",
|
||||
"accessToken",
|
||||
"refreshToken",
|
||||
"secret",
|
||||
"authorization",
|
||||
"cookie",
|
||||
"apiKey",
|
||||
"credential",
|
||||
"privateKey"
|
||||
]
|
||||
},
|
||||
"architecture": {
|
||||
"enforceLayering": true
|
||||
},
|
||||
"blockingRules": [],
|
||||
"allowedFindingPatterns": [],
|
||||
"baselineFindings": []
|
||||
}
|
||||
23
.scale/frameworks.json
Normal file
23
.scale/frameworks.json
Normal file
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"version": 1,
|
||||
"lastReviewedAt": "",
|
||||
"reviewIntervalDays": 90,
|
||||
"frameworks": [],
|
||||
"orm": [],
|
||||
"ui": {
|
||||
"designSystem": "",
|
||||
"componentLibrary": "",
|
||||
"visualReviewRequired": true
|
||||
},
|
||||
"architecture": {
|
||||
"layers": [
|
||||
"api",
|
||||
"service",
|
||||
"domain",
|
||||
"repository",
|
||||
"infrastructure"
|
||||
],
|
||||
"dependencyRule": "outer layers depend inward through explicit interfaces"
|
||||
},
|
||||
"bannedImports": []
|
||||
}
|
||||
200
.scale/governance.lock.json
Normal file
200
.scale/governance.lock.json
Normal file
@@ -0,0 +1,200 @@
|
||||
{
|
||||
"version": 1,
|
||||
"scalePackage": "@hongmaple0820/scale-engine",
|
||||
"scaleVersion": "0.0.0-dev",
|
||||
"pack": "standard",
|
||||
"packVersion": 1,
|
||||
"generatedAt": "2026-05-20T06:59:28.689Z",
|
||||
"files": [
|
||||
{
|
||||
"path": "docs/workflow/README.md",
|
||||
"sha256": "95568223be7593850dd117af82c7a983bb361a19651884b7dd8a1240a4a37956",
|
||||
"owned": true
|
||||
},
|
||||
{
|
||||
"path": "docs/workflow/templates/explore.md",
|
||||
"sha256": "e3845d0ecc4d85d11cbd2ac49de2a6fc3fad4debf071c31a4567c76fc44bceea",
|
||||
"owned": true
|
||||
},
|
||||
{
|
||||
"path": "docs/workflow/templates/mini-prd.md",
|
||||
"sha256": "276bec99769152ed90c4ab56e789c4fd8756de4fb1794db260a70a6a5ef032b8",
|
||||
"owned": true
|
||||
},
|
||||
{
|
||||
"path": "docs/workflow/templates/skill-plan.md",
|
||||
"sha256": "60f48a9d780bf0029bb7281a92d3ff9ca702e6cae1c49d9ca17fda790f04439e",
|
||||
"owned": true
|
||||
},
|
||||
{
|
||||
"path": "docs/workflow/templates/skill-evidence.md",
|
||||
"sha256": "fa697a67437bae8b3372d620cfab4e64daff7a693a0603327389da362cf805d7",
|
||||
"owned": true
|
||||
},
|
||||
{
|
||||
"path": "docs/workflow/templates/runtime.md",
|
||||
"sha256": "e1f4c575dec24c95e9b9f72d52d47badbd1bd0e8fb207193b671803a0c59fa9c",
|
||||
"owned": true
|
||||
},
|
||||
{
|
||||
"path": "docs/workflow/templates/reality-check.md",
|
||||
"sha256": "11a9102b87b6f08b118a21edc5fcdda49f27741078e463a44a6e4dd904513d0b",
|
||||
"owned": true
|
||||
},
|
||||
{
|
||||
"path": "docs/workflow/templates/resource-cleanup.md",
|
||||
"sha256": "ba2b343cbee04d3037638f3751f64cb14ad63c528529be364967bb49619cfa25",
|
||||
"owned": true
|
||||
},
|
||||
{
|
||||
"path": "docs/workflow/templates/ui-spec.md",
|
||||
"sha256": "328022424df35d7a221ff18fb5c04840c74f327deabf1d49f7a7e739fe06290c",
|
||||
"owned": true
|
||||
},
|
||||
{
|
||||
"path": "docs/workflow/templates/visual-review.md",
|
||||
"sha256": "7ebf7765969a7cf36b46aeb4d9f1c04f5513cefdd2e57256c1badc83722b00cc",
|
||||
"owned": true
|
||||
},
|
||||
{
|
||||
"path": "docs/workflow/templates/api-contract.md",
|
||||
"sha256": "a9091cc5f6d7b8178589dcff2253afa366d188903b175dd5c69dbc6c955bace0",
|
||||
"owned": true
|
||||
},
|
||||
{
|
||||
"path": "docs/workflow/templates/docs-impact.md",
|
||||
"sha256": "a4ff6c98539b71ff7f6df2cce8253b9073c6c134ee2ee9d1e1fc34b819b961a0",
|
||||
"owned": true
|
||||
},
|
||||
{
|
||||
"path": "docs/workflow/templates/resource-impact.md",
|
||||
"sha256": "af37cb2d4d97cfe46243269225732dfc10180dd6eb1e58b3085abb6ee0e3cc5f",
|
||||
"owned": true
|
||||
},
|
||||
{
|
||||
"path": "docs/workflow/templates/standards-impact.md",
|
||||
"sha256": "eed804359ca45b0b7d4436b305ea44f9872bccaa3c6e4fcf3dfbf0b1f422545f",
|
||||
"owned": true
|
||||
},
|
||||
{
|
||||
"path": "docs/workflow/templates/architecture-review.md",
|
||||
"sha256": "819390550452c3bb65e5eff2fee44d3d5767a3f4e164fd64cdb10420fd3f40aa",
|
||||
"owned": true
|
||||
},
|
||||
{
|
||||
"path": "docs/workflow/templates/security-review.md",
|
||||
"sha256": "542bb035a0e45dc954056d95652952717ec34765debe0de3649246fb6e1290a8",
|
||||
"owned": true
|
||||
},
|
||||
{
|
||||
"path": "docs/workflow/templates/db-change-plan.md",
|
||||
"sha256": "9e76ec7d3efae5374373bc1ad11c94da74ff59927b3778a1fed557dba0c51458",
|
||||
"owned": true
|
||||
},
|
||||
{
|
||||
"path": "docs/workflow/templates/e2e-plan.md",
|
||||
"sha256": "e77779e7f0f61610c9d1ef594a53565599d0777f2c6c12a9c6507f82b6fbfb26",
|
||||
"owned": true
|
||||
},
|
||||
{
|
||||
"path": "docs/workflow/templates/product-smoke.md",
|
||||
"sha256": "5b4be8ecddc47d1b4f890bd83532ed5652a1444a0ab2d30c0c91015a46f648d4",
|
||||
"owned": true
|
||||
},
|
||||
{
|
||||
"path": "docs/workflow/templates/plan.md",
|
||||
"sha256": "08100fe1bb88e801e11c13cd1ad6d26dbebe6117027b93b26c44ad3ef907ff81",
|
||||
"owned": true
|
||||
},
|
||||
{
|
||||
"path": "docs/workflow/templates/verification.md",
|
||||
"sha256": "b9cbe1f287115a15b18b201e8e25e2c40a2dc3aa4b347098c21414c66ea0fb49",
|
||||
"owned": true
|
||||
},
|
||||
{
|
||||
"path": "docs/workflow/templates/review.md",
|
||||
"sha256": "62e3bee211f9e4381bfb3fb7463edb78e74da708bc804c35f4acab9c5f65d010",
|
||||
"owned": true
|
||||
},
|
||||
{
|
||||
"path": "docs/workflow/templates/summary.md",
|
||||
"sha256": "00c99d6236ca749e330eb3769c1c0a55082f64db58362b73944419e7ec7753cf",
|
||||
"owned": true
|
||||
},
|
||||
{
|
||||
"path": "docs/workflow/templates/github-actions-scale-preflight.yml",
|
||||
"sha256": "a218c4a23251e6da42b807ebc490d363d17490abd5e8ec7bcb11377444571f33",
|
||||
"owned": true
|
||||
},
|
||||
{
|
||||
"path": "docs/workflow/templates/pre-push-scale-preflight.sh",
|
||||
"sha256": "3b3a8e45ab3ac8774e54fbcbd5b44cddbf1df06a74aa671f535289b9629a3f7c",
|
||||
"owned": true
|
||||
},
|
||||
{
|
||||
"path": "docs/worklog/metrics.md",
|
||||
"sha256": "66ced9a1d893b142e01d2e4aaf0e3d6509a8166d6274fbacfc4abee52874359b",
|
||||
"owned": true
|
||||
},
|
||||
{
|
||||
"path": "scripts/qa/product-smoke.ps1",
|
||||
"sha256": "e5b0694cbb83dd3e722435b6133c45ea43eab576a3f013dc30e6bc5492f8d6fb",
|
||||
"owned": true
|
||||
},
|
||||
{
|
||||
"path": "scripts/qa/product-smoke.sh",
|
||||
"sha256": "633ec087cc54081ca9aa52f4915274b427b0e2148cf1510a8dac56ce47a71c7e",
|
||||
"owned": true
|
||||
},
|
||||
{
|
||||
"path": ".scale/verification.json",
|
||||
"sha256": "483e73923114628149c7f31a984526cb07bf60a4c237273beb68697078dc1941",
|
||||
"owned": true
|
||||
},
|
||||
{
|
||||
"path": ".scale/skills.json",
|
||||
"sha256": "56228729c0fbb89ee31fee286b47a877002fc0972ea45db7f3153b7ec213d24e",
|
||||
"owned": true
|
||||
},
|
||||
{
|
||||
"path": ".scale/tools.json",
|
||||
"sha256": "f204f9ef206a7b0f25b2064661bd0d5ff25980b36c0f9bda0bb973af206074ad",
|
||||
"owned": true
|
||||
},
|
||||
{
|
||||
"path": ".scale/resource-policy.json",
|
||||
"sha256": "67d1e469d6cef5d68508ac3cc8bb5c9fd1eea33826f9c3f2fdf8e19cff10f6b9",
|
||||
"owned": true
|
||||
},
|
||||
{
|
||||
"path": ".scale/assets.json",
|
||||
"sha256": "a8174f5941573d1acd5d5df5dee4bca235701e21c29685694d143512d3247acf",
|
||||
"owned": true
|
||||
},
|
||||
{
|
||||
"path": ".scale/output-policy.json",
|
||||
"sha256": "c51b6f0b4ecc570f0b8a7738a1a3b0013cc76fb99dfb121c8ee9f51e7fa7c3bb",
|
||||
"owned": true
|
||||
},
|
||||
{
|
||||
"path": ".scale/product-smoke.json",
|
||||
"sha256": "9b07dd0d9dd0d3a1689c497cd1f79b1f72b8324d4059b5172c1b503a9d82585f",
|
||||
"owned": true
|
||||
},
|
||||
{
|
||||
"path": ".scale/engineering-standards.json",
|
||||
"sha256": "dd8a8bc0f0594f31ba9fd71120e73d4c78db84b7603aab50bdaf875401d78ad9",
|
||||
"owned": true
|
||||
},
|
||||
{
|
||||
"path": ".scale/engineering-standards-baseline.json",
|
||||
"sha256": "14b1ebdb505038b5eba18297b4e76ae1185cd60c98a6f131001633498bed2cf7",
|
||||
"owned": true
|
||||
},
|
||||
{
|
||||
"path": ".scale/frameworks.json",
|
||||
"sha256": "78158a49e9c1331e0222e6efa1bb3744c5fe2bdb043da66a5238855f433756cc",
|
||||
"owned": true
|
||||
}
|
||||
]
|
||||
}
|
||||
72
.scale/output-policy.json
Normal file
72
.scale/output-policy.json
Normal file
@@ -0,0 +1,72 @@
|
||||
{
|
||||
"version": 1,
|
||||
"sourceFormat": "markdown",
|
||||
"artifactDirectory": "artifacts",
|
||||
"manifestFile": "artifact-manifest.json",
|
||||
"defaultTheme": "auto",
|
||||
"defaultGitPolicy": "review",
|
||||
"safety": {
|
||||
"allowRemoteScripts": false,
|
||||
"allowRemoteStyles": false,
|
||||
"detectSecrets": true
|
||||
},
|
||||
"templates": {
|
||||
"plan-comparison": {
|
||||
"label": "Plan Comparison",
|
||||
"sources": [
|
||||
"mini-prd.md",
|
||||
"explore.md",
|
||||
"plan.md"
|
||||
],
|
||||
"description": "Compare candidate approaches, tradeoffs, open questions, and decision criteria."
|
||||
},
|
||||
"implementation-plan": {
|
||||
"label": "Implementation Plan",
|
||||
"sources": [
|
||||
"plan.md",
|
||||
"verification.md"
|
||||
],
|
||||
"description": "Convert the implementation plan and verification strategy into a scannable delivery surface."
|
||||
},
|
||||
"code-review": {
|
||||
"label": "Code Review",
|
||||
"sources": [
|
||||
"review.md",
|
||||
"security-review.md",
|
||||
"standards-impact.md"
|
||||
],
|
||||
"description": "Summarize review findings, severity, evidence, and residual risks."
|
||||
},
|
||||
"status-report": {
|
||||
"label": "Status Report",
|
||||
"sources": [
|
||||
"summary.md",
|
||||
"verification.md",
|
||||
"resource-impact.md",
|
||||
"standards-impact.md"
|
||||
],
|
||||
"description": "Show current task status, proof, blockers, resource state, and follow-ups."
|
||||
},
|
||||
"incident-report": {
|
||||
"label": "Incident Report",
|
||||
"sources": [
|
||||
"explore.md",
|
||||
"plan.md",
|
||||
"verification.md",
|
||||
"review.md"
|
||||
],
|
||||
"description": "Explain incident context, diagnosis, fix, validation, and prevention work."
|
||||
},
|
||||
"release-report": {
|
||||
"label": "Release Report",
|
||||
"sources": [
|
||||
"summary.md",
|
||||
"verification.md",
|
||||
"review.md",
|
||||
"resource-impact.md",
|
||||
"standards-impact.md"
|
||||
],
|
||||
"description": "Package final release evidence, risk state, unverified items, and sign-off readiness."
|
||||
}
|
||||
}
|
||||
}
|
||||
33
.scale/product-smoke.json
Normal file
33
.scale/product-smoke.json
Normal file
@@ -0,0 +1,33 @@
|
||||
{
|
||||
"version": 1,
|
||||
"gate": "warn",
|
||||
"requiredForLevels": [
|
||||
"M",
|
||||
"L",
|
||||
"CRITICAL"
|
||||
],
|
||||
"emptyProbeBehavior": "block",
|
||||
"setupGuide": [
|
||||
"Set probes[].enabled=true only after replacing the example command with a real product path.",
|
||||
"Use a command that crosses the real boundary: client/UI -> gateway/router -> service -> persistence or observable result.",
|
||||
"Run: scale preflight --profile productSmoke --json",
|
||||
"Run: scale runtime final-check --level M --json"
|
||||
],
|
||||
"runtimeEvidence": {
|
||||
"requiredKind": "command",
|
||||
"requiredStatus": "passed",
|
||||
"requireArtifacts": true
|
||||
},
|
||||
"probes": [
|
||||
{
|
||||
"id": "example-business-flow",
|
||||
"enabled": false,
|
||||
"description": "Replace with a real user/product path such as UI -> gateway -> service -> database/storage.",
|
||||
"command": "curl -fsS http://127.0.0.1:3000/health",
|
||||
"expected": {
|
||||
"exitCode": 0,
|
||||
"evidenceArtifact": ".agent/logs/product-smoke.json"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
70
.scale/quality-contract.json
Normal file
70
.scale/quality-contract.json
Normal file
@@ -0,0 +1,70 @@
|
||||
{
|
||||
"version": "1.0",
|
||||
"project": "eskin-model-player",
|
||||
"description": "E-Skin 传感器数据可视化工具质量契约",
|
||||
"gates": {
|
||||
"pre_commit": {
|
||||
"enabled": true,
|
||||
"checks": [
|
||||
{
|
||||
"name": "type_check",
|
||||
"command": "cargo check",
|
||||
"required": true,
|
||||
"description": "类型检查"
|
||||
},
|
||||
{
|
||||
"name": "lint",
|
||||
"command": "cargo clippy -- -D warnings",
|
||||
"required": true,
|
||||
"description": "Clippy lint 检查"
|
||||
},
|
||||
{
|
||||
"name": "test",
|
||||
"command": "cargo test",
|
||||
"required": true,
|
||||
"description": "单元测试"
|
||||
}
|
||||
]
|
||||
},
|
||||
"pre_push": {
|
||||
"enabled": true,
|
||||
"checks": [
|
||||
{
|
||||
"name": "build_release",
|
||||
"command": "cargo build --release",
|
||||
"required": true,
|
||||
"description": "Release 构建验证"
|
||||
},
|
||||
{
|
||||
"name": "full_test",
|
||||
"command": "cargo test --all",
|
||||
"required": true,
|
||||
"description": "完整测试套件"
|
||||
}
|
||||
]
|
||||
},
|
||||
"code_review": {
|
||||
"enabled": true,
|
||||
"checks": [
|
||||
{
|
||||
"name": "no_unwrap",
|
||||
"pattern": "\\.unwrap\\(\\)",
|
||||
"severity": "warning",
|
||||
"description": "避免裸 unwrap(),使用 expect() 或 ? 运算符"
|
||||
},
|
||||
{
|
||||
"name": "no_todo",
|
||||
"pattern": "todo!\\(\\)|unimplemented!\\(\\)",
|
||||
"severity": "warning",
|
||||
"description": "生产代码不应包含 todo!/unimplemented!"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"quality_metrics": {
|
||||
"max_complexity": 15,
|
||||
"min_test_coverage": 0,
|
||||
"max_file_lines": 500,
|
||||
"max_function_lines": 80
|
||||
}
|
||||
}
|
||||
39
.scale/resource-policy.json
Normal file
39
.scale/resource-policy.json
Normal file
@@ -0,0 +1,39 @@
|
||||
{
|
||||
"version": 1,
|
||||
"maxGitFileSizeBytes": 5242880,
|
||||
"ignoredDirectories": [
|
||||
".git",
|
||||
"node_modules",
|
||||
"dist",
|
||||
"build",
|
||||
"vendor",
|
||||
".next",
|
||||
".turbo"
|
||||
],
|
||||
"retainedRuntimeDirectories": [
|
||||
".scale/tmp",
|
||||
".scale/evidence",
|
||||
".scale/reports",
|
||||
".scale/resource-reports",
|
||||
"tmp",
|
||||
"temp",
|
||||
"test-results",
|
||||
"playwright-report",
|
||||
"coverage"
|
||||
],
|
||||
"owners": {
|
||||
"docs": "engineering",
|
||||
"docs/standards": "engineering",
|
||||
"docs/workflow": "engineering",
|
||||
"docs/decisions": "architecture",
|
||||
"docs/modules": "module-owner",
|
||||
".planning": "engineering",
|
||||
".scale": "engineering"
|
||||
},
|
||||
"modules": {
|
||||
"example": {
|
||||
"path": "src/example",
|
||||
"owner": "team-or-owner"
|
||||
}
|
||||
}
|
||||
}
|
||||
82
.scale/skills-registry.json
Normal file
82
.scale/skills-registry.json
Normal file
@@ -0,0 +1,82 @@
|
||||
{
|
||||
"version": "1.0",
|
||||
"project": "eskin-model-player",
|
||||
"skills": [
|
||||
{
|
||||
"name": "graphify",
|
||||
"category": "knowledge",
|
||||
"description": "代码知识图谱",
|
||||
"install": "pip install graphifyy && graphify install",
|
||||
"riskLevel": "LOW",
|
||||
"status": "optional"
|
||||
},
|
||||
{
|
||||
"name": "systematic-debugging",
|
||||
"category": "debugging",
|
||||
"description": "系统化调试方法论",
|
||||
"riskLevel": "LOW",
|
||||
"status": "active"
|
||||
},
|
||||
{
|
||||
"name": "freeze-guard",
|
||||
"category": "safety",
|
||||
"description": "防止代码冻结/死锁",
|
||||
"riskLevel": "LOW",
|
||||
"status": "active"
|
||||
},
|
||||
{
|
||||
"name": "tdd",
|
||||
"category": "testing",
|
||||
"description": "测试驱动开发",
|
||||
"riskLevel": "LOW",
|
||||
"status": "active"
|
||||
},
|
||||
{
|
||||
"name": "verification",
|
||||
"category": "quality",
|
||||
"description": "验证检查",
|
||||
"riskLevel": "LOW",
|
||||
"status": "active"
|
||||
},
|
||||
{
|
||||
"name": "review",
|
||||
"category": "quality",
|
||||
"description": "代码审查",
|
||||
"riskLevel": "LOW",
|
||||
"status": "active"
|
||||
},
|
||||
{
|
||||
"name": "ce-compound",
|
||||
"category": "workflow",
|
||||
"description": "复合编辑",
|
||||
"riskLevel": "LOW",
|
||||
"status": "active"
|
||||
},
|
||||
{
|
||||
"name": "ship",
|
||||
"category": "workflow",
|
||||
"description": "发布交付",
|
||||
"riskLevel": "LOW",
|
||||
"status": "active"
|
||||
},
|
||||
{
|
||||
"name": "scale-methodology",
|
||||
"category": "methodology",
|
||||
"description": "SCALE 求是方法论",
|
||||
"riskLevel": "LOW",
|
||||
"status": "active"
|
||||
},
|
||||
{
|
||||
"name": "codegraph",
|
||||
"category": "knowledge",
|
||||
"description": "代码图谱",
|
||||
"riskLevel": "LOW",
|
||||
"status": "active"
|
||||
}
|
||||
],
|
||||
"riskFlags": {
|
||||
"HIGH": "需要人工审查",
|
||||
"MEDIUM": "自动审查",
|
||||
"LOW": "自动信任"
|
||||
}
|
||||
}
|
||||
630
.scale/skills.json
Normal file
630
.scale/skills.json
Normal file
@@ -0,0 +1,630 @@
|
||||
{
|
||||
"version": 1,
|
||||
"policy": {
|
||||
"mode": "warn",
|
||||
"enforceLevels": [
|
||||
"M",
|
||||
"L",
|
||||
"CRITICAL"
|
||||
],
|
||||
"requireSkillPlan": true
|
||||
},
|
||||
"domains": {
|
||||
"ui": {
|
||||
"detect": {
|
||||
"files": [
|
||||
"src/**/*.tsx",
|
||||
"src/**/*.jsx",
|
||||
"app/**/*.tsx",
|
||||
"pages/**/*.tsx",
|
||||
"components/**/*.tsx",
|
||||
"**/*.css",
|
||||
"**/*.scss"
|
||||
],
|
||||
"keywords": [
|
||||
"ui",
|
||||
"ux",
|
||||
"frontend",
|
||||
"component",
|
||||
"page",
|
||||
"layout",
|
||||
"responsive",
|
||||
"visual",
|
||||
"界面",
|
||||
"页面",
|
||||
"交互",
|
||||
"视觉",
|
||||
"前端"
|
||||
]
|
||||
},
|
||||
"requiredSkills": [
|
||||
"frontend-design",
|
||||
"ui-ux-pro-max"
|
||||
],
|
||||
"recommendedSkills": [
|
||||
"awesome-design-md",
|
||||
"webapp-testing",
|
||||
"agent-browser",
|
||||
"mcp-chrome-devtools",
|
||||
"browser-testing-with-devtools",
|
||||
"design-review"
|
||||
],
|
||||
"requiredArtifacts": [
|
||||
"skill-plan.md",
|
||||
"skill-evidence.md",
|
||||
"mini-prd.md",
|
||||
"ui-spec.md",
|
||||
"visual-review.md"
|
||||
],
|
||||
"requiredVerification": [
|
||||
"design-system",
|
||||
"screenshot",
|
||||
"responsive-check",
|
||||
"browser-run",
|
||||
"visual-review"
|
||||
]
|
||||
},
|
||||
"webResearch": {
|
||||
"detect": {
|
||||
"files": [
|
||||
"docs/research/**",
|
||||
"docs/**/research.md",
|
||||
"**/research.md"
|
||||
],
|
||||
"keywords": [
|
||||
"web research",
|
||||
"search online",
|
||||
"online",
|
||||
"latest",
|
||||
"source citation",
|
||||
"source citations",
|
||||
"logged-in",
|
||||
"login",
|
||||
"dynamic web page",
|
||||
"authenticated page",
|
||||
"inspect page",
|
||||
"web-access",
|
||||
"network",
|
||||
"web fetch"
|
||||
]
|
||||
},
|
||||
"requiredSkills": [
|
||||
"web-access"
|
||||
],
|
||||
"recommendedSkills": [
|
||||
"agent-browser",
|
||||
"mcp-chrome-devtools",
|
||||
"source-driven-development",
|
||||
"browser-use"
|
||||
],
|
||||
"requiredArtifacts": [
|
||||
"skill-plan.md",
|
||||
"skill-evidence.md",
|
||||
"verification.md"
|
||||
],
|
||||
"requiredVerification": [
|
||||
"source-citation",
|
||||
"browser-evidence",
|
||||
"network-console-check"
|
||||
]
|
||||
},
|
||||
"browserAutomation": {
|
||||
"detect": {
|
||||
"files": [
|
||||
"tests/e2e/**",
|
||||
"e2e/**",
|
||||
"playwright.config.*",
|
||||
"**/*.spec.ts",
|
||||
"**/*.e2e.ts"
|
||||
],
|
||||
"keywords": [
|
||||
"browser automation",
|
||||
"browser interaction",
|
||||
"browser behavior",
|
||||
"browser",
|
||||
"playwright",
|
||||
"agent-browser",
|
||||
"chrome devtools",
|
||||
"cdp",
|
||||
"screenshot",
|
||||
"console log",
|
||||
"network request",
|
||||
"e2e",
|
||||
"end-to-end"
|
||||
]
|
||||
},
|
||||
"recommendedSkills": [
|
||||
"webapp-testing",
|
||||
"agent-browser",
|
||||
"web-access",
|
||||
"mcp-chrome-devtools",
|
||||
"playwright",
|
||||
"playwright-interactive"
|
||||
],
|
||||
"requiredArtifacts": [
|
||||
"skill-plan.md",
|
||||
"skill-evidence.md",
|
||||
"e2e-plan.md",
|
||||
"verification.md"
|
||||
],
|
||||
"requiredVerification": [
|
||||
"browser-run",
|
||||
"screenshot",
|
||||
"console-log",
|
||||
"network-console-check"
|
||||
]
|
||||
},
|
||||
"e2e": {
|
||||
"detect": {
|
||||
"files": [
|
||||
"tests/e2e/**",
|
||||
"e2e/**",
|
||||
"playwright.config.*"
|
||||
],
|
||||
"keywords": [
|
||||
"e2e",
|
||||
"browser",
|
||||
"playwright",
|
||||
"end-to-end",
|
||||
"端到端",
|
||||
"浏览器"
|
||||
]
|
||||
},
|
||||
"recommendedSkills": [
|
||||
"webapp-testing",
|
||||
"agent-browser",
|
||||
"web-access",
|
||||
"mcp-chrome-devtools",
|
||||
"playwright",
|
||||
"playwright-interactive"
|
||||
],
|
||||
"requiredArtifacts": [
|
||||
"skill-plan.md",
|
||||
"skill-evidence.md",
|
||||
"e2e-plan.md"
|
||||
],
|
||||
"requiredVerification": [
|
||||
"browser-run",
|
||||
"screenshot",
|
||||
"console-log"
|
||||
]
|
||||
},
|
||||
"desktopAutomation": {
|
||||
"detect": {
|
||||
"files": [
|
||||
"tests/desktop/**",
|
||||
"desktop/**",
|
||||
"e2e/desktop/**"
|
||||
],
|
||||
"keywords": [
|
||||
"desktop automation",
|
||||
"desktop app",
|
||||
"computer use",
|
||||
"cua",
|
||||
"gui automation",
|
||||
"operate desktop",
|
||||
"windows desktop",
|
||||
"wps",
|
||||
"wechat",
|
||||
"weixin",
|
||||
"office app"
|
||||
]
|
||||
},
|
||||
"requiredSkills": [
|
||||
"turix-cua"
|
||||
],
|
||||
"recommendedSkills": [
|
||||
"agent-browser",
|
||||
"web-access",
|
||||
"computer-use",
|
||||
"opencli"
|
||||
],
|
||||
"requiredArtifacts": [
|
||||
"skill-plan.md",
|
||||
"skill-evidence.md",
|
||||
"verification.md"
|
||||
],
|
||||
"requiredVerification": [
|
||||
"desktop-screenshot",
|
||||
"operator-safety",
|
||||
"side-effect-boundary"
|
||||
],
|
||||
"blockLevels": [
|
||||
"CRITICAL"
|
||||
]
|
||||
},
|
||||
"externalCli": {
|
||||
"detect": {
|
||||
"files": [
|
||||
"scripts/**",
|
||||
".github/workflows/**"
|
||||
],
|
||||
"keywords": [
|
||||
"external cli",
|
||||
"agent cli",
|
||||
"codex",
|
||||
"codex cli",
|
||||
"claude code",
|
||||
"gemini cli",
|
||||
"opencode",
|
||||
"aider",
|
||||
"cross-agent",
|
||||
"subagent",
|
||||
"wps cli",
|
||||
"wechat automation"
|
||||
]
|
||||
},
|
||||
"recommendedSkills": [
|
||||
"codex-cli",
|
||||
"gemini-cli",
|
||||
"opencode-cli",
|
||||
"git-workflow-and-versioning",
|
||||
"code-reviewer"
|
||||
],
|
||||
"requiredArtifacts": [
|
||||
"skill-plan.md",
|
||||
"skill-evidence.md",
|
||||
"verification.md"
|
||||
],
|
||||
"requiredVerification": [
|
||||
"cli-version-check",
|
||||
"command-output",
|
||||
"dry-run-or-safe-mode",
|
||||
"side-effect-boundary"
|
||||
]
|
||||
},
|
||||
"api": {
|
||||
"detect": {
|
||||
"files": [
|
||||
"**/api/**",
|
||||
"**/routes/**",
|
||||
"**/controller/**",
|
||||
"**/*.api",
|
||||
"**/*.proto"
|
||||
],
|
||||
"keywords": [
|
||||
"api",
|
||||
"endpoint",
|
||||
"route",
|
||||
"handler",
|
||||
"接口",
|
||||
"路由"
|
||||
]
|
||||
},
|
||||
"recommendedSkills": [
|
||||
"tdd-guide",
|
||||
"code-review"
|
||||
],
|
||||
"requiredArtifacts": [
|
||||
"skill-plan.md",
|
||||
"mini-prd.md",
|
||||
"api-contract.md"
|
||||
],
|
||||
"requiredVerification": [
|
||||
"contract-check"
|
||||
]
|
||||
},
|
||||
"db": {
|
||||
"detect": {
|
||||
"files": [
|
||||
"**/migration/**",
|
||||
"**/migrations/**",
|
||||
"**/*.sql",
|
||||
"**/schema.*",
|
||||
"**/model/**"
|
||||
],
|
||||
"keywords": [
|
||||
"database",
|
||||
"db",
|
||||
"migration",
|
||||
"schema",
|
||||
"sql",
|
||||
"数据表",
|
||||
"数据库",
|
||||
"迁移"
|
||||
]
|
||||
},
|
||||
"requiredSkills": [
|
||||
"security-review"
|
||||
],
|
||||
"recommendedSkills": [
|
||||
"systematic-debugging"
|
||||
],
|
||||
"requiredArtifacts": [
|
||||
"skill-plan.md",
|
||||
"db-change-plan.md",
|
||||
"security-review.md"
|
||||
],
|
||||
"requiredVerification": [
|
||||
"rollback-plan",
|
||||
"migration-test"
|
||||
]
|
||||
},
|
||||
"security": {
|
||||
"detect": {
|
||||
"files": [
|
||||
"**/auth/**",
|
||||
"**/permission/**",
|
||||
"**/security/**",
|
||||
"**/middleware/**"
|
||||
],
|
||||
"keywords": [
|
||||
"auth",
|
||||
"permission",
|
||||
"tenant",
|
||||
"token",
|
||||
"credential",
|
||||
"secret",
|
||||
"rbac",
|
||||
"鉴权",
|
||||
"权限",
|
||||
"租户",
|
||||
"密钥"
|
||||
]
|
||||
},
|
||||
"requiredSkills": [
|
||||
"security-review"
|
||||
],
|
||||
"recommendedSkills": [
|
||||
"code-review"
|
||||
],
|
||||
"requiredArtifacts": [
|
||||
"skill-plan.md",
|
||||
"security-review.md"
|
||||
],
|
||||
"requiredVerification": [
|
||||
"threat-model",
|
||||
"rollback-plan"
|
||||
],
|
||||
"blockLevels": [
|
||||
"CRITICAL"
|
||||
]
|
||||
},
|
||||
"docs": {
|
||||
"detect": {
|
||||
"files": [
|
||||
"docs/**",
|
||||
"**/*.md"
|
||||
],
|
||||
"keywords": [
|
||||
"docs",
|
||||
"documentation",
|
||||
"document",
|
||||
"readme",
|
||||
"文档"
|
||||
]
|
||||
},
|
||||
"recommendedSkills": [
|
||||
"update-docs",
|
||||
"workflow-guide"
|
||||
],
|
||||
"requiredArtifacts": [
|
||||
"skill-plan.md",
|
||||
"skill-evidence.md",
|
||||
"docs-impact.md"
|
||||
]
|
||||
},
|
||||
"resourceGovernance": {
|
||||
"detect": {
|
||||
"files": [
|
||||
".scale/resource-policy.json",
|
||||
".scale/assets.json",
|
||||
"docs/modules/**",
|
||||
"docs/decisions/**",
|
||||
"docs/worklog/tasks/**",
|
||||
"test-results/**",
|
||||
"playwright-report/**",
|
||||
"coverage/**",
|
||||
"tmp/**",
|
||||
"scripts/tmp/**",
|
||||
"**/*.png",
|
||||
"**/*.jpg",
|
||||
"**/*.jpeg",
|
||||
"**/*.webp",
|
||||
"**/*.gif",
|
||||
"**/*.mp4",
|
||||
"**/*.webm",
|
||||
"**/*.mov",
|
||||
"**/*.wav",
|
||||
"**/*.mp3"
|
||||
],
|
||||
"keywords": [
|
||||
"asset",
|
||||
"resource",
|
||||
"artifact retention",
|
||||
"lifecycle",
|
||||
"temporary file",
|
||||
"e2e report",
|
||||
"screenshot",
|
||||
"video",
|
||||
"documentation drift",
|
||||
"resource governance"
|
||||
]
|
||||
},
|
||||
"recommendedSkills": [
|
||||
"documentation-and-adrs",
|
||||
"git-workflow-and-versioning",
|
||||
"ai-slop-cleaner"
|
||||
],
|
||||
"requiredArtifacts": [
|
||||
"skill-plan.md",
|
||||
"skill-evidence.md",
|
||||
"docs-impact.md",
|
||||
"resource-impact.md"
|
||||
],
|
||||
"requiredVerification": [
|
||||
"asset-scan",
|
||||
"asset-doctor"
|
||||
]
|
||||
},
|
||||
"engineeringStandards": {
|
||||
"detect": {
|
||||
"files": [
|
||||
".scale/engineering-standards.json",
|
||||
".scale/frameworks.json",
|
||||
"docs/standards/**",
|
||||
"src/**",
|
||||
"app/**",
|
||||
"packages/**",
|
||||
"services/**",
|
||||
"internal/**",
|
||||
"pkg/**"
|
||||
],
|
||||
"keywords": [
|
||||
"coding standard",
|
||||
"engineering standard",
|
||||
"logging",
|
||||
"redaction",
|
||||
"desensitization",
|
||||
"orm",
|
||||
"framework convention",
|
||||
"architecture boundary",
|
||||
"design pattern",
|
||||
"test rigor",
|
||||
"sql injection",
|
||||
"xss",
|
||||
"脱敏",
|
||||
"日志",
|
||||
"架构规范",
|
||||
"编码规范",
|
||||
"框架规范",
|
||||
"联调",
|
||||
"发版"
|
||||
]
|
||||
},
|
||||
"recommendedSkills": [
|
||||
"code-review-and-quality",
|
||||
"security-and-hardening",
|
||||
"documentation-and-adrs"
|
||||
],
|
||||
"requiredArtifacts": [
|
||||
"skill-plan.md",
|
||||
"skill-evidence.md",
|
||||
"standards-impact.md",
|
||||
"architecture-review.md",
|
||||
"security-review.md"
|
||||
],
|
||||
"requiredVerification": [
|
||||
"standards-scan",
|
||||
"standards-doctor"
|
||||
],
|
||||
"blockLevels": [
|
||||
"L",
|
||||
"CRITICAL"
|
||||
]
|
||||
},
|
||||
"review": {
|
||||
"detect": {
|
||||
"files": [
|
||||
".github/PULL_REQUEST_TEMPLATE.md",
|
||||
".github/pull_request_template.md"
|
||||
],
|
||||
"keywords": [
|
||||
"review",
|
||||
"code review",
|
||||
"pull request",
|
||||
"pr",
|
||||
"merge request",
|
||||
"changes reviewed",
|
||||
"审查",
|
||||
"评审"
|
||||
]
|
||||
},
|
||||
"requiredSkills": [
|
||||
"code-reviewer"
|
||||
],
|
||||
"recommendedSkills": [
|
||||
"pr-creator"
|
||||
],
|
||||
"requiredArtifacts": [
|
||||
"skill-plan.md",
|
||||
"skill-evidence.md",
|
||||
"review.md"
|
||||
],
|
||||
"requiredVerification": [
|
||||
"review-evidence"
|
||||
]
|
||||
},
|
||||
"release": {
|
||||
"detect": {
|
||||
"files": [
|
||||
"CHANGELOG.md",
|
||||
"package.json",
|
||||
".github/workflows/**"
|
||||
],
|
||||
"keywords": [
|
||||
"release",
|
||||
"ship",
|
||||
"publish",
|
||||
"deploy",
|
||||
"pull request",
|
||||
"pr",
|
||||
"发版",
|
||||
"发布",
|
||||
"部署"
|
||||
]
|
||||
},
|
||||
"requiredSkills": [
|
||||
"code-reviewer"
|
||||
],
|
||||
"recommendedSkills": [
|
||||
"pr-creator",
|
||||
"fix",
|
||||
"verification",
|
||||
"code-review"
|
||||
],
|
||||
"requiredArtifacts": [
|
||||
"skill-plan.md",
|
||||
"skill-evidence.md",
|
||||
"review.md",
|
||||
"summary.md"
|
||||
],
|
||||
"requiredVerification": [
|
||||
"preflight"
|
||||
]
|
||||
},
|
||||
"skillDiscovery": {
|
||||
"detect": {
|
||||
"keywords": [
|
||||
"skill",
|
||||
"capability",
|
||||
"missing capability",
|
||||
"install skill",
|
||||
"find skill"
|
||||
]
|
||||
},
|
||||
"recommendedSkills": [
|
||||
"find-skills"
|
||||
],
|
||||
"requiredArtifacts": [
|
||||
"skill-plan.md",
|
||||
"skill-evidence.md"
|
||||
]
|
||||
},
|
||||
"fullstackPrototype": {
|
||||
"detect": {
|
||||
"keywords": [
|
||||
"fullstack",
|
||||
"full-stack",
|
||||
"mvp",
|
||||
"prototype",
|
||||
"next.js",
|
||||
"react api",
|
||||
"node api"
|
||||
]
|
||||
},
|
||||
"recommendedSkills": [
|
||||
"fullstack-developer"
|
||||
],
|
||||
"requiredArtifacts": [
|
||||
"skill-plan.md",
|
||||
"skill-evidence.md",
|
||||
"mini-prd.md",
|
||||
"api-contract.md"
|
||||
],
|
||||
"requiredVerification": [
|
||||
"preflight"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
118
.scale/tools.json
Normal file
118
.scale/tools.json
Normal file
@@ -0,0 +1,118 @@
|
||||
{
|
||||
"version": 1,
|
||||
"mode": "evidence-required",
|
||||
"tools": {
|
||||
"web-access": {
|
||||
"enabled": true,
|
||||
"requiredFor": [
|
||||
"webResearch"
|
||||
],
|
||||
"recommendedFor": [
|
||||
"browserAutomation"
|
||||
],
|
||||
"destructiveActions": "block",
|
||||
"evidenceRequired": true
|
||||
},
|
||||
"frontend-design": {
|
||||
"enabled": true,
|
||||
"requiredFor": [
|
||||
"ui"
|
||||
],
|
||||
"destructiveActions": "block",
|
||||
"evidenceRequired": true
|
||||
},
|
||||
"ui-ux-pro-max": {
|
||||
"enabled": true,
|
||||
"requiredFor": [
|
||||
"ui"
|
||||
],
|
||||
"destructiveActions": "block",
|
||||
"evidenceRequired": true
|
||||
},
|
||||
"agent-browser": {
|
||||
"enabled": true,
|
||||
"requiredFor": [
|
||||
"browserAutomation"
|
||||
],
|
||||
"recommendedFor": [
|
||||
"ui",
|
||||
"e2e"
|
||||
],
|
||||
"allowedDomains": [
|
||||
"localhost",
|
||||
"127.0.0.1"
|
||||
],
|
||||
"destructiveActions": "confirm",
|
||||
"command": "agent-browser",
|
||||
"evidenceRequired": true
|
||||
},
|
||||
"playwright": {
|
||||
"enabled": true,
|
||||
"requiredFor": [
|
||||
"e2e"
|
||||
],
|
||||
"recommendedFor": [
|
||||
"browserAutomation",
|
||||
"ui"
|
||||
],
|
||||
"destructiveActions": "confirm",
|
||||
"command": "npx playwright",
|
||||
"evidenceRequired": true
|
||||
},
|
||||
"mcp-chrome-devtools": {
|
||||
"enabled": true,
|
||||
"requiredFor": [
|
||||
"browserAutomation"
|
||||
],
|
||||
"recommendedFor": [
|
||||
"ui",
|
||||
"e2e"
|
||||
],
|
||||
"destructiveActions": "confirm",
|
||||
"mcpToolName": "chrome-devtools",
|
||||
"evidenceRequired": true
|
||||
},
|
||||
"desktop-cua": {
|
||||
"enabled": false,
|
||||
"requiredFor": [
|
||||
"desktopAutomation"
|
||||
],
|
||||
"destructiveActions": "block",
|
||||
"command": "cua",
|
||||
"evidenceRequired": true
|
||||
},
|
||||
"codex-cli": {
|
||||
"enabled": false,
|
||||
"requiredFor": [],
|
||||
"recommendedFor": [
|
||||
"externalCli",
|
||||
"review"
|
||||
],
|
||||
"destructiveActions": "block",
|
||||
"command": "codex",
|
||||
"evidenceRequired": true
|
||||
},
|
||||
"gemini-cli": {
|
||||
"enabled": false,
|
||||
"requiredFor": [],
|
||||
"recommendedFor": [
|
||||
"externalCli",
|
||||
"review"
|
||||
],
|
||||
"destructiveActions": "block",
|
||||
"command": "gemini",
|
||||
"evidenceRequired": true
|
||||
},
|
||||
"opencode-cli": {
|
||||
"enabled": false,
|
||||
"requiredFor": [],
|
||||
"recommendedFor": [
|
||||
"externalCli",
|
||||
"review"
|
||||
],
|
||||
"destructiveActions": "block",
|
||||
"command": "opencode",
|
||||
"evidenceRequired": true
|
||||
}
|
||||
}
|
||||
}
|
||||
35
.scale/verification.json
Normal file
35
.scale/verification.json
Normal file
@@ -0,0 +1,35 @@
|
||||
{
|
||||
"version": 1,
|
||||
"defaultProfile": "default",
|
||||
"profiles": {
|
||||
"default": {
|
||||
"commands": {},
|
||||
"services": []
|
||||
},
|
||||
"productSmoke": {
|
||||
"commands": {
|
||||
"smoke": "powershell -ExecutionPolicy Bypass -File scripts/qa/product-smoke.ps1"
|
||||
},
|
||||
"services": []
|
||||
}
|
||||
},
|
||||
"services": [],
|
||||
"exclude": [
|
||||
"node_modules",
|
||||
"dist",
|
||||
"tmp",
|
||||
"vendor"
|
||||
],
|
||||
"policy": {
|
||||
"mode": "standard",
|
||||
"optionalToolsWarnOnly": true,
|
||||
"artifactGate": "warn",
|
||||
"artifactGateLevels": [
|
||||
"M",
|
||||
"L",
|
||||
"CRITICAL"
|
||||
],
|
||||
"engineeringStandardsGate": "block",
|
||||
"productSmokeGate": "warn"
|
||||
}
|
||||
}
|
||||
51
.scale/workflow.json
Normal file
51
.scale/workflow.json
Normal file
@@ -0,0 +1,51 @@
|
||||
{
|
||||
"version": "1.0",
|
||||
"project": "eskin-model-player",
|
||||
"workflow": {
|
||||
"phases": [
|
||||
{
|
||||
"name": "explore",
|
||||
"description": "理解需求和现有代码",
|
||||
"required": true,
|
||||
"artifacts": ["docs/workflow/templates/explore.md"]
|
||||
},
|
||||
{
|
||||
"name": "plan",
|
||||
"description": "制定实现方案",
|
||||
"required": true,
|
||||
"artifacts": ["docs/workflow/templates/plan.md"]
|
||||
},
|
||||
{
|
||||
"name": "implement",
|
||||
"description": "编码实现",
|
||||
"required": true,
|
||||
"gates": ["type_check", "lint"]
|
||||
},
|
||||
{
|
||||
"name": "test",
|
||||
"description": "测试验证",
|
||||
"required": true,
|
||||
"gates": ["test"]
|
||||
},
|
||||
{
|
||||
"name": "review",
|
||||
"description": "代码审查",
|
||||
"required": true,
|
||||
"artifacts": ["docs/workflow/templates/review.md"]
|
||||
},
|
||||
{
|
||||
"name": "ship",
|
||||
"description": "提交发布",
|
||||
"required": true,
|
||||
"gates": ["build_release", "full_test"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"skills_routing": {
|
||||
"debug": "systematic-debugging",
|
||||
"test": "tdd",
|
||||
"review": "review",
|
||||
"ship": "ship",
|
||||
"graph": "graphify"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user